diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-07-30 03:00:10 +0200 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-07-30 12:21:51 +0200 |
commit | 3f17e216c9c75c667ab501a59bcb96be62e3afa1 (patch) | |
tree | 7e20d31bae96154abd2b10e43fdfbc4f0d284c77 /src/gsttools | |
parent | 3f12e848168f61f986f2809cd7f8dac75408548f (diff) | |
parent | dbdcc1b099dc25ffb707a2441191463de33c51f3 (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Change-Id: I329eeefafed87ff7467d21d5d099cf9897660167
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); |