From 8d637854254255860ac40dbe5a96328de99f6f7a Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Wed, 14 Mar 2012 11:52:43 +1000 Subject: [PATCH] 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 --- src/gsttools/qvideosurfacegstsink.cpp | 16 ++++++++++++---- .../gsttools_headers/qvideosurfacegstsink_p.h | 4 +++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/gsttools/qvideosurfacegstsink.cpp b/src/gsttools/qvideosurfacegstsink.cpp index 65aca1fb..c1f2792c 100644 --- a/src/gsttools/qvideosurfacegstsink.cpp +++ b/src/gsttools/qvideosurfacegstsink.cpp @@ -581,7 +581,11 @@ gboolean QVideoSurfaceGstSink::set_caps(GstBaseSink *base, GstCaps *caps) return TRUE; } else { 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()) { QVideoSurfaceFormat surfaceFormst = sink->delegate->surfaceFormat(); @@ -612,7 +616,7 @@ gboolean QVideoSurfaceGstSink::set_caps(GstBaseSink *base, GstCaps *caps) 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); @@ -655,7 +659,7 @@ QVideoSurfaceFormat QVideoSurfaceGstSink::formatForCaps(GstCaps *caps, int *byte } if (pixelFormat != QVideoFrame::Format_Invalid) { - QVideoSurfaceFormat format(size, pixelFormat); + QVideoSurfaceFormat format(size, pixelFormat, handleType); QPair rate; gst_structure_get_fraction(structure, "framerate", &rate.first, &rate.second); @@ -771,7 +775,11 @@ GstFlowReturn QVideoSurfaceGstSink::buffer_alloc( if (!sink->delegate->isActive()) { 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)) { qWarning() << "failed to start video surface"; diff --git a/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h b/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h index 143f65d2..6ee6907a 100644 --- a/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h +++ b/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h @@ -134,7 +134,9 @@ public: GstVideoSink parent; 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 handleShowPrerollChange(GObject *o, GParamSpec *p, gpointer d);