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;
|
||||
} 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<int, int> 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";
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user