summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstutils_p.h42
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp19
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp18
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatinfo_p.h6
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;