diff options
Diffstat (limited to 'src')
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 |