gst video surface sink: start surface with correct handle type
The handle type should match one from the currently used buffer pool. Change-Id: I33f7856a742299ce0640f331898c3cbe5cfbdf97 Reviewed-by: Jonas Rabbe <jonas.rabbe@nokia.com>
This commit is contained in:
committed by
Qt by Nokia
parent
942ff7a3c6
commit
8d63785425
@@ -581,7 +581,11 @@ gboolean QVideoSurfaceGstSink::set_caps(GstBaseSink *base, GstCaps *caps)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
} else {
|
} else {
|
||||||
int bytesPerLine = 0;
|
int bytesPerLine = 0;
|
||||||
QVideoSurfaceFormat format = formatForCaps(caps, &bytesPerLine);
|
QGstBufferPoolInterface *pool = sink->delegate->pool();
|
||||||
|
QAbstractVideoBuffer::HandleType handleType =
|
||||||
|
pool ? pool->handleType() : QAbstractVideoBuffer::NoHandle;
|
||||||
|
|
||||||
|
QVideoSurfaceFormat format = formatForCaps(caps, &bytesPerLine, handleType);
|
||||||
|
|
||||||
if (sink->delegate->isActive()) {
|
if (sink->delegate->isActive()) {
|
||||||
QVideoSurfaceFormat surfaceFormst = sink->delegate->surfaceFormat();
|
QVideoSurfaceFormat surfaceFormst = sink->delegate->surfaceFormat();
|
||||||
@@ -612,7 +616,7 @@ gboolean QVideoSurfaceGstSink::set_caps(GstBaseSink *base, GstCaps *caps)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVideoSurfaceFormat QVideoSurfaceGstSink::formatForCaps(GstCaps *caps, int *bytesPerLine)
|
QVideoSurfaceFormat QVideoSurfaceGstSink::formatForCaps(GstCaps *caps, int *bytesPerLine, QAbstractVideoBuffer::HandleType handleType)
|
||||||
{
|
{
|
||||||
const GstStructure *structure = gst_caps_get_structure(caps, 0);
|
const GstStructure *structure = gst_caps_get_structure(caps, 0);
|
||||||
|
|
||||||
@@ -655,7 +659,7 @@ QVideoSurfaceFormat QVideoSurfaceGstSink::formatForCaps(GstCaps *caps, int *byte
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pixelFormat != QVideoFrame::Format_Invalid) {
|
if (pixelFormat != QVideoFrame::Format_Invalid) {
|
||||||
QVideoSurfaceFormat format(size, pixelFormat);
|
QVideoSurfaceFormat format(size, pixelFormat, handleType);
|
||||||
|
|
||||||
QPair<int, int> rate;
|
QPair<int, int> rate;
|
||||||
gst_structure_get_fraction(structure, "framerate", &rate.first, &rate.second);
|
gst_structure_get_fraction(structure, "framerate", &rate.first, &rate.second);
|
||||||
@@ -771,7 +775,11 @@ GstFlowReturn QVideoSurfaceGstSink::buffer_alloc(
|
|||||||
|
|
||||||
if (!sink->delegate->isActive()) {
|
if (!sink->delegate->isActive()) {
|
||||||
int bytesPerLine = 0;
|
int bytesPerLine = 0;
|
||||||
QVideoSurfaceFormat format = formatForCaps(intersection, &bytesPerLine);
|
QGstBufferPoolInterface *pool = sink->delegate->pool();
|
||||||
|
QAbstractVideoBuffer::HandleType handleType =
|
||||||
|
pool ? pool->handleType() : QAbstractVideoBuffer::NoHandle;
|
||||||
|
|
||||||
|
QVideoSurfaceFormat format = formatForCaps(intersection, &bytesPerLine, handleType);
|
||||||
|
|
||||||
if (!sink->delegate->start(format, bytesPerLine)) {
|
if (!sink->delegate->start(format, bytesPerLine)) {
|
||||||
qWarning() << "failed to start video surface";
|
qWarning() << "failed to start video surface";
|
||||||
|
|||||||
@@ -134,7 +134,9 @@ public:
|
|||||||
GstVideoSink parent;
|
GstVideoSink parent;
|
||||||
|
|
||||||
static QVideoSurfaceGstSink *createSink(QAbstractVideoSurface *surface);
|
static QVideoSurfaceGstSink *createSink(QAbstractVideoSurface *surface);
|
||||||
static QVideoSurfaceFormat formatForCaps(GstCaps *caps, int *bytesPerLine = 0);
|
static QVideoSurfaceFormat formatForCaps(GstCaps *caps,
|
||||||
|
int *bytesPerLine = 0,
|
||||||
|
QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle);
|
||||||
static void setFrameTimeStamps(QVideoFrame *frame, GstBuffer *buffer);
|
static void setFrameTimeStamps(QVideoFrame *frame, GstBuffer *buffer);
|
||||||
|
|
||||||
static void handleShowPrerollChange(GObject *o, GParamSpec *p, gpointer d);
|
static void handleShowPrerollChange(GObject *o, GParamSpec *p, gpointer d);
|
||||||
|
|||||||
Reference in New Issue
Block a user