summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-02-27 10:35:14 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-02 02:23:02 +0000
commita2d7b3b078c77e3b8de1600d755cbc6f6fe7af37 (patch)
treeb71bb850714c70f5d29de6481f5768e9279e387b
parent438653fd0c5244987437b33cbdc5bfce58118829 (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>
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamervideooutput.cpp4
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamervideosink.cpp28
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamervideosink_p.h1
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;