diff options
Diffstat (limited to 'src/gsttools')
-rw-r--r-- | src/gsttools/qgstcodecsinfo.cpp | 44 | ||||
-rw-r--r-- | src/gsttools/qgstcodecsinfo_p.h | 4 |
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); |