diff options
author | Tim Blechmann <tim@klingt.org> | 2024-02-27 10:35:14 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-02 02:23:02 +0000 |
commit | a2d7b3b078c77e3b8de1600d755cbc6f6fe7af37 (patch) | |
tree | b71bb850714c70f5d29de6481f5768e9279e387b | |
parent | 438653fd0c5244987437b33cbdc5bfce58118829 (diff) |
GStreamer: QGstreamerVideoSink - add capsfilter for pixel-aspect-ratio
By adding a caps filter to the videoSinkBin and using a
videoconvertscale instead of a videoconvert element, we can obtain a
square pixel scaling on the application-side
Task-number: QTBUG-108754
Pick-to: 6.6 6.5
Change-Id: I9fb95ad1075b34b4dd3dec9bee8b1c254e924a19
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Mikko Hallamaa <mikko.hallamaa@qt.io>
Reviewed-by: Lars Sutterud <lars.sutterud@qt.io>
(cherry picked from commit e7b801361654eedbb844865ef5b4454492ee2323)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
3 files changed, 27 insertions, 6 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamervideooutput.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamervideooutput.cpp index f5318d79a..3825e7f20 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreamervideooutput.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreamervideooutput.cpp @@ -15,9 +15,9 @@ QT_BEGIN_NAMESPACE QMaybe<QGstreamerVideoOutput *> QGstreamerVideoOutput::create(QObject *parent) { - QGstElement videoConvert = QGstElement::createFromFactory("videoconvert", "videoConvert"); + QGstElement videoConvert = QGstElement::createFromFactory("videoconvertscale", "videoConvert"); if (!videoConvert) - return errorMessageCannotFindElement("videoconvert"); + return errorMessageCannotFindElement("videoconvertscale"); QGstElement videoSink = QGstElement::createFromFactory("fakesink", "fakeVideoSink"); if (!videoSink) diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamervideosink.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamervideosink.cpp index 73276bae5..4af96b37d 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreamervideosink.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreamervideosink.cpp @@ -68,8 +68,28 @@ QGstreamerVideoSink::QGstreamerVideoSink(QVideoSink *parent) QGstElement::NeedsRef, }; - sinkBin.add(gstQueue, gstPreprocess); - qLinkGstElements(gstQueue, gstPreprocess); + bool disablePixelAspectRatio = + qEnvironmentVariableIsSet("QT_MULTIMEDIA_GSTREAMER_DISABLE_PIXEL_ASPECT_RATIO"); + if (disablePixelAspectRatio) { + // Enabling the pixel aspect ratio may expose a gstreamer bug on cameras that don't expose a + // pixel-aspect-ratio via `VIDIOC_CROPCAP`. This can cause the caps negotiation to fail. + // Using the QT_MULTIMEDIA_GSTREAMER_DISABLE_PIXEL_ASPECT_RATIO environment variable, on can + // disable pixel-aspect-ratio handling + // + // compare: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6242 + gstCapsFilter = + QGstElement::createFromFactory("identity", "nullPixelAspectRatioCapsFilter"); + } else { + gstCapsFilter = QGstElement::createFromFactory("capsfilter", "pixelAspectRatioCapsFilter"); + QGstCaps capsFilterCaps{ + gst_caps_new_simple("video/x-raw", "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL), + QGstCaps::HasRef, + }; + g_object_set(gstCapsFilter.element(), "caps", capsFilterCaps.release(), NULL); + } + + sinkBin.add(gstQueue, gstPreprocess, gstCapsFilter); + qLinkGstElements(gstQueue, gstPreprocess, gstCapsFilter); sinkBin.addGhostPad(gstQueue, "sink"); gstSubtitleSink = QGstElement(GST_ELEMENT(QGstSubtitleSink::createSink(this))); @@ -141,8 +161,8 @@ void QGstreamerVideoSink::updateSinkElement() gstVideoSink = newSink; sinkBin.add(gstVideoSink); - if (!qLinkGstElements(gstPreprocess, gstVideoSink)) - qCDebug(qLcMediaVideoSink) << "couldn't link preprocess and sink"; + if (!qLinkGstElements(gstCapsFilter, gstVideoSink)) + qCDebug(qLcMediaVideoSink) << "couldn't link caps filter and sink"; gstVideoSink.setState(GST_STATE_PAUSED); gstPipeline.endConfig(); diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamervideosink_p.h b/src/plugins/multimedia/gstreamer/common/qgstreamervideosink_p.h index 76dcffb40..730f692a1 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreamervideosink_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgstreamervideosink_p.h @@ -64,6 +64,7 @@ private: QGstBin sinkBin; QGstElement gstQueue; QGstElement gstPreprocess; + QGstElement gstCapsFilter; QGstElement gstVideoSink; QGstElement gstQtSink; QGstElement gstSubtitleSink; |