summaryrefslogtreecommitdiffstats
path: root/src/gsttools
diff options
context:
space:
mode:
Diffstat (limited to 'src/gsttools')
-rw-r--r--src/gsttools/qgstcodecsinfo.cpp44
-rw-r--r--src/gsttools/qgstcodecsinfo_p.h4
2 files changed, 48 insertions, 0 deletions
diff --git a/src/gsttools/qgstcodecsinfo.cpp b/src/gsttools/qgstcodecsinfo.cpp
index ca43d489b..512bb828d 100644
--- a/src/gsttools/qgstcodecsinfo.cpp
+++ b/src/gsttools/qgstcodecsinfo.cpp
@@ -43,9 +43,36 @@
#include <gst/pbutils/pbutils.h>
+static QSet<QString> streamTypes(GstElementFactory *factory, GstPadDirection direction)
+{
+ QSet<QString> types;
+ const GList *pads = gst_element_factory_get_static_pad_templates(factory);
+ for (const GList *pad = pads; pad; pad = g_list_next(pad)) {
+ GstStaticPadTemplate *templ = reinterpret_cast<GstStaticPadTemplate *>(pad->data);
+ if (templ->direction == direction) {
+ GstCaps *caps = gst_static_caps_get(&templ->static_caps);
+ for (uint i = 0; i < gst_caps_get_size(caps); ++i) {
+ GstStructure *structure = gst_caps_get_structure(caps, i);
+ types.insert(QString::fromUtf8(gst_structure_get_name(structure)));
+ }
+ gst_caps_unref(caps);
+ }
+ }
+
+ return types;
+}
+
QGstCodecsInfo::QGstCodecsInfo(QGstCodecsInfo::ElementType elementType)
{
updateCodecs(elementType);
+ for (auto &codec : supportedCodecs()) {
+ GstElementFactory *factory = gst_element_factory_find(codecElement(codec).constData());
+ if (factory) {
+ GstPadDirection direction = elementType == Muxer ? GST_PAD_SINK : GST_PAD_SRC;
+ m_streamTypes.insert(codec, streamTypes(factory, direction));
+ gst_object_unref(GST_OBJECT(factory));
+ }
+ }
}
QStringList QGstCodecsInfo::supportedCodecs() const
@@ -245,3 +272,20 @@ GList *QGstCodecsInfo::elementFactories(ElementType elementType) const
return result;
#endif
}
+
+QSet<QString> QGstCodecsInfo::supportedStreamTypes(const QString &codec) const
+{
+ return m_streamTypes.value(codec);
+}
+
+QStringList QGstCodecsInfo::supportedCodecs(const QSet<QString> &types) const
+{
+ QStringList result;
+ for (auto &candidate : supportedCodecs()) {
+ auto candidateTypes = supportedStreamTypes(candidate);
+ if (candidateTypes.intersects(types))
+ result << candidate;
+ }
+
+ return result;
+}
diff --git a/src/gsttools/qgstcodecsinfo_p.h b/src/gsttools/qgstcodecsinfo_p.h
index 33ab3de4b..d7aadef21 100644
--- a/src/gsttools/qgstcodecsinfo_p.h
+++ b/src/gsttools/qgstcodecsinfo_p.h
@@ -54,6 +54,7 @@
#include <private/qgsttools_global_p.h>
#include <QtCore/qmap.h>
#include <QtCore/qstringlist.h>
+#include <QSet>
#include <gst/gst.h>
@@ -76,6 +77,8 @@ public:
QString codecDescription(const QString &codec) const;
QByteArray codecElement(const QString &codec) const;
QStringList codecOptions(const QString &codec) const;
+ QSet<QString> supportedStreamTypes(const QString &codec) const;
+ QStringList supportedCodecs(const QSet<QString> &types) const;
private:
void updateCodecs(ElementType elementType);
@@ -83,6 +86,7 @@ private:
QStringList m_codecs;
QMap<QString, CodecInfo> m_codecInfo;
+ QMap<QString, QSet<QString>> m_streamTypes;
};
Q_DECLARE_TYPEINFO(QGstCodecsInfo::CodecInfo, Q_MOVABLE_TYPE);