diff options
Diffstat (limited to 'src/multimedia/platform/gstreamer')
4 files changed, 54 insertions, 31 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstutils_p.h b/src/multimedia/platform/gstreamer/common/qgstutils_p.h index 36de4d0e8..d22734e43 100644 --- a/src/multimedia/platform/gstreamer/common/qgstutils_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstutils_p.h @@ -176,18 +176,52 @@ public: }; class QGstCaps { + const GstCaps *caps; public: QGstCaps(const GstCaps *c) : caps(c) {} - const GstCaps *caps; - void unref() { - gst_caps_unref(const_cast<GstCaps *>(caps)); - caps = nullptr; + + bool isNull() const { return !caps; } + + int size() const { return gst_caps_get_size(caps); } + QGstStructure at(int index) { return gst_caps_get_structure(caps, index); } + const GstCaps *get() const { return caps; } +}; + +class QGstMutableCaps { + GstCaps *caps; +public: + enum RefMode { HasRef, NeedsRef }; + QGstMutableCaps(GstCaps *c, RefMode mode = HasRef) + : caps(c) + { + if (mode == NeedsRef) + gst_caps_ref(caps); + } + QGstMutableCaps(const QGstMutableCaps &other) + : caps(other.caps) + { + if (caps) + gst_caps_ref(caps); + } + QGstMutableCaps &operator=(const QGstMutableCaps &other) + { + if (other.caps) + gst_caps_ref(other.caps); + if (caps) + gst_caps_unref(const_cast<GstCaps *>(caps)); + caps = other.caps; + return *this; + } + ~QGstMutableCaps() { + if (caps) + gst_caps_unref(const_cast<GstCaps *>(caps)); } bool isNull() const { return !caps; } int size() const { return gst_caps_get_size(caps); } QGstStructure at(int index) { return gst_caps_get_structure(caps, index); } + GstCaps *get() { return caps; } }; Q_MULTIMEDIA_EXPORT const gchar *qt_gst_element_get_factory_name(GstElement *element); diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp index 8fe889f22..f7ef94165 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp @@ -129,16 +129,13 @@ static GstEncodingContainerProfile *createContainerProfile(const QMediaEncoderSe { auto *formatInfo = QGstreamerIntegration::instance()->m_formatsInfo; - QGstCaps caps = formatInfo->formatCaps(settings.format()); + QGstMutableCaps caps = formatInfo->formatCaps(settings.format()); GstEncodingContainerProfile *profile = (GstEncodingContainerProfile *)gst_encoding_container_profile_new( "container_profile", (gchar *)"custom container profile", - const_cast<GstCaps *>(caps.caps), + const_cast<GstCaps *>(caps.get()), NULL); //preset - - caps.unref(); - return profile; } @@ -146,18 +143,16 @@ static GstEncodingProfile *createVideoProfile(const QMediaEncoderSettings &setti { auto *formatInfo = QGstreamerIntegration::instance()->m_formatsInfo; - QGstCaps caps = formatInfo->videoCaps(settings); + QGstMutableCaps caps = formatInfo->videoCaps(settings); if (caps.isNull()) return nullptr; GstEncodingVideoProfile *profile = gst_encoding_video_profile_new( - const_cast<GstCaps *>(caps.caps), + const_cast<GstCaps *>(caps.get()), nullptr, NULL, //restriction 0); //presence - caps.unref(); - gst_encoding_video_profile_set_pass(profile, 0); gst_encoding_video_profile_set_variableframerate(profile, TRUE); @@ -168,18 +163,16 @@ static GstEncodingProfile *createAudioProfile(const QMediaEncoderSettings &setti { auto *formatInfo = QGstreamerIntegration::instance()->m_formatsInfo; - QGstCaps caps = formatInfo->audioCaps(settings); + auto caps = formatInfo->audioCaps(settings); if (caps.isNull()) return nullptr; GstEncodingProfile *profile = (GstEncodingProfile *)gst_encoding_audio_profile_new( - const_cast<GstCaps *>(caps.caps), + const_cast<GstCaps *>(caps.get()), nullptr, //preset NULL, //restriction 0); //presence - caps.unref(); - return profile; } diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp index 44e846d27..6a5cd9824 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp +++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp @@ -179,7 +179,7 @@ static QPair<QList<QMediaFormat::AudioCodec>, QList<QMediaFormat::VideoCodec>> g padTemplates = padTemplates->next; if (padTemplate->direction == padDirection) { - QGstCaps caps = gst_static_caps_get(&padTemplate->static_caps); + QGstMutableCaps caps = gst_static_caps_get(&padTemplate->static_caps); for (int i = 0; i < caps.size(); i++) { QGstStructure structure = caps.at(i); @@ -190,7 +190,6 @@ static QPair<QList<QMediaFormat::AudioCodec>, QList<QMediaFormat::VideoCodec>> g if (v != QMediaFormat::VideoCodec::Unspecified) video.append(v); } - caps.unref(); } } } @@ -222,7 +221,7 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de padTemplates = padTemplates->next; if (padTemplate->direction == padDirection) { - QGstCaps caps = gst_static_caps_get(&padTemplate->static_caps); + QGstMutableCaps caps = gst_static_caps_get(&padTemplate->static_caps); for (int i = 0; i < caps.size(); i++) { QGstStructure structure = caps.at(i); @@ -230,7 +229,6 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de if (fmt != QMediaFormat::UnspecifiedFormat) fileFormats.append(fmt); } - caps.unref(); } } if (fileFormats.isEmpty()) @@ -246,7 +244,7 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de // check the other side for supported inputs/outputs if (padTemplate->direction != padDirection) { - QGstCaps caps = gst_static_caps_get(&padTemplate->static_caps); + QGstMutableCaps caps = gst_static_caps_get(&padTemplate->static_caps); for (int i = 0; i < caps.size(); i++) { QGstStructure structure = caps.at(i); @@ -257,7 +255,6 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de if (video != QMediaFormat::VideoCodec::Unspecified && supportedVideoCodecs.contains(video)) videoCodecs.append(video); } - caps.unref(); } } if (!audioCodecs.isEmpty() || !videoCodecs.isEmpty()) { @@ -287,7 +284,7 @@ static QList<QImageEncoderSettings::FileFormat> getImageFormatList() padTemplates = padTemplates->next; if (padTemplate->direction == GST_PAD_SRC) { - QGstCaps caps = gst_static_caps_get(&padTemplate->static_caps); + QGstMutableCaps caps = gst_static_caps_get(&padTemplate->static_caps); for (int i = 0; i < caps.size(); i++) { QGstStructure structure = caps.at(i); @@ -297,7 +294,6 @@ static QList<QImageEncoderSettings::FileFormat> getImageFormatList() formats.insert(f); } } - caps.unref(); } } } @@ -337,7 +333,7 @@ QGstreamerFormatInfo::~QGstreamerFormatInfo() { } -QGstCaps QGstreamerFormatInfo::formatCaps(const QMediaFormat &f) const +QGstMutableCaps QGstreamerFormatInfo::formatCaps(const QMediaFormat &f) const { auto format = f.format(); Q_ASSERT(format != QMediaFormat::UnspecifiedFormat); @@ -361,7 +357,7 @@ QGstCaps QGstreamerFormatInfo::formatCaps(const QMediaFormat &f) const return gst_caps_from_string(capsForFormat[format]); } -QGstCaps QGstreamerFormatInfo::audioCaps(const QMediaFormat &f) const +QGstMutableCaps QGstreamerFormatInfo::audioCaps(const QMediaFormat &f) const { auto codec = f.audioCodec(); if (codec == QMediaFormat::AudioCodec::Unspecified) @@ -382,7 +378,7 @@ QGstCaps QGstreamerFormatInfo::audioCaps(const QMediaFormat &f) const return gst_caps_from_string(capsForCodec[(int)codec]); } -QGstCaps QGstreamerFormatInfo::videoCaps(const QMediaFormat &f) const +QGstMutableCaps QGstreamerFormatInfo::videoCaps(const QMediaFormat &f) const { auto codec = f.videoCodec(); if (codec == QMediaFormat::VideoCodec::Unspecified) diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h b/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h index cbc26d7d9..754bce203 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h +++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h @@ -64,9 +64,9 @@ public: QGstreamerFormatInfo(); ~QGstreamerFormatInfo(); - QGstCaps formatCaps(const QMediaFormat &f) const; - QGstCaps audioCaps(const QMediaFormat &f) const; - QGstCaps videoCaps(const QMediaFormat &f) const; + QGstMutableCaps formatCaps(const QMediaFormat &f) const; + QGstMutableCaps audioCaps(const QMediaFormat &f) const; + QGstMutableCaps videoCaps(const QMediaFormat &f) const; // ### // QGstCaps audioEncoderCaps(const QMediaEncoderSettings &f) const; // QGstCaps videoEncoderCaps(const QMediaEncoderSettings &f) const; |