diff options
author | Tim Blechmann <tim@klingt.org> | 2024-02-14 22:15:21 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-01 02:09:47 +0000 |
commit | 61411ea81c0d286d8fd75c43a8aa22cda200cc87 (patch) | |
tree | 1995029c2c362c80fb1f96547a15dcffd2e39067 | |
parent | 1b8861d4862ce3d41d024c1eb7abac25bbdd0502 (diff) |
GStreamer: QGstStructure - add APIs for pixelAspectRatio and nativeSize
Pick-to: 6.6 6.5
Change-Id: If14ea149367a34a59dc6de1c2e119fb2b8f9e302
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Sutterud <lars.sutterud@qt.io>
(cherry picked from commit 055d84815253b723b6c2361dd6c7ee1d6e6c2101)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
3 files changed, 34 insertions, 0 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_p.h b/src/plugins/multimedia/gstreamer/common/qgst_p.h index e1f5b92fc..a5ab3cfc4 100644 --- a/src/plugins/multimedia/gstreamer/common/qgst_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgst_p.h @@ -16,6 +16,7 @@ // #include <private/qtmultimediaglobal_p.h> +#include <private/qmultimediautils_p.h> #include <QtCore/qsemaphore.h> #include <QtCore/qlist.h> @@ -237,6 +238,8 @@ public: Q_MULTIMEDIA_EXPORT QVideoFrameFormat::PixelFormat pixelFormat() const; Q_MULTIMEDIA_EXPORT QGRange<float> frameRateRange() const; Q_MULTIMEDIA_EXPORT QGstreamerMessage getMessage(); + Q_MULTIMEDIA_EXPORT std::optional<Fraction> pixelAspectRatio() const; + Q_MULTIMEDIA_EXPORT QSize nativeSize() const; QGstStructure copy() const { return gst_structure_copy(structure); } }; diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp index 873418ddf..bdd6ef921 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp @@ -869,6 +869,9 @@ void QGstreamerMediaPlayer::parseStreamsAndMetadata() qCDebug(qLcMediaPlayer) << " tags=" << tagList.get(); else qCDebug(qLcMediaPlayer) << " tags=(null)"; + + QSize nativeSize = structure.nativeSize(); + gstVideoOutput->gstreamerVideoSink()->setNativeSize(nativeSize); } diff --git a/src/plugins/multimedia/gstreamer/common/qgstutils.cpp b/src/plugins/multimedia/gstreamer/common/qgstutils.cpp index 524b162ec..dfbe241d4 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstutils.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstutils.cpp @@ -468,6 +468,34 @@ QGstreamerMessage QGstStructure::getMessage() return QGstreamerMessage(message, QGstreamerMessage::HasRef); } +std::optional<Fraction> QGstStructure::pixelAspectRatio() const +{ + gint numerator; + gint denominator; + if (gst_structure_get_fraction(structure, "pixel-aspect-ratio", &numerator, &denominator)) { + return Fraction{ + numerator, + denominator, + }; + } + + return std::nullopt; +} + +QSize QGstStructure::nativeSize() const +{ + QSize size = resolution(); + if (!size.isValid()) { + qWarning() << Q_FUNC_INFO << "invalid resolution when querying nativeSize"; + return size; + } + + std::optional<Fraction> par = pixelAspectRatio(); + if (par) + size = qCalculateFrameSize(size, *par); + return size; +} + GList *qt_gst_video_sinks() { return gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_SINK |