38 ** $QT_END_LICENSE$ |
38 ** $QT_END_LICENSE$ |
39 ** |
39 ** |
40 ****************************************************************************/ |
40 ****************************************************************************/ |
41 |
41 |
42 #include "qgstreamermediacontainercontrol.h" |
42 #include "qgstreamermediacontainercontrol.h" |
43 #include <gst/gst.h> |
43 |
|
44 |
|
45 #include <QtCore/qdebug.h> |
44 |
46 |
45 QGstreamerMediaContainerControl::QGstreamerMediaContainerControl(QObject *parent) |
47 QGstreamerMediaContainerControl::QGstreamerMediaContainerControl(QObject *parent) |
46 :QMediaContainerControl(parent) |
48 :QMediaContainerControl(parent) |
47 { |
49 { |
48 QList<QByteArray> formatCandidates; |
50 QList<QByteArray> formatCandidates; |
49 formatCandidates << "matroska" << "ogg" << "quicktime" << "mp4" << "avi" << "3gpp"; |
51 formatCandidates << "matroska" << "ogg" << "mp4" << "quicktime" << "avi" << "3gpp"; |
50 formatCandidates << "flv" << "wav" << "amr" << "asf" << "dv" << "gif"; |
52 formatCandidates << "flv" << "wav" << "amr" << "asf" << "dv" << "gif"; |
51 formatCandidates << "mpeg" << "vob" << "mpegts" << "3g2" << "3gp"; |
53 formatCandidates << "mpeg" << "vob" << "mpegts" << "3g2" << "3gp"; |
|
54 formatCandidates << "raw"; |
52 |
55 |
53 m_elementNames["matroska"] = "matroskamux"; |
56 m_elementNames["matroska"] = "matroskamux"; |
54 m_elementNames["ogg"] = "oggmux"; |
57 m_elementNames["ogg"] = "oggmux"; |
55 m_elementNames["quicktime"] = "qtmux"; |
58 m_elementNames["mp4"] = "ffmux_mp4"; |
56 m_elementNames["mp4"] = "mp4mux"; |
59 m_elementNames["quicktime"] = "ffmux_mov"; |
57 m_elementNames["avi"] = "avimux"; |
60 m_elementNames["avi"] = "avimux"; |
58 m_elementNames["3gpp"] = "gppmux"; |
61 m_elementNames["3gpp"] = "gppmux"; |
59 m_elementNames["flv"] = "flvmux"; |
62 m_elementNames["flv"] = "flvmux"; |
60 m_elementNames["wav"] = "wavenc"; |
63 m_elementNames["wav"] = "wavenc"; |
61 m_elementNames["amr"] = "ffmux_amr"; |
64 m_elementNames["amr"] = "ffmux_amr"; |
65 m_elementNames["mpeg"] = "ffmux_mpeg"; |
68 m_elementNames["mpeg"] = "ffmux_mpeg"; |
66 m_elementNames["vob"] = "ffmux_vob"; |
69 m_elementNames["vob"] = "ffmux_vob"; |
67 m_elementNames["mpegts"] = "ffmux_mpegts"; |
70 m_elementNames["mpegts"] = "ffmux_mpegts"; |
68 m_elementNames["3g2"] = "ffmux_3g2"; |
71 m_elementNames["3g2"] = "ffmux_3g2"; |
69 m_elementNames["3gp"] = "ffmux_3gp"; |
72 m_elementNames["3gp"] = "ffmux_3gp"; |
|
73 m_elementNames["raw"] = "identity"; |
70 |
74 |
|
75 QSet<QString> allTypes; |
71 |
76 |
72 foreach( const QByteArray& formatName, formatCandidates ) { |
77 foreach( const QByteArray& formatName, formatCandidates ) { |
73 QByteArray elementName = m_elementNames[formatName]; |
78 QByteArray elementName = m_elementNames[formatName]; |
74 GstElementFactory *factory = gst_element_factory_find(elementName.constData()); |
79 GstElementFactory *factory = gst_element_factory_find(elementName.constData()); |
75 if (factory) { |
80 if (factory) { |
76 m_supportedContainers.append(formatName); |
81 m_supportedContainers.append(formatName); |
77 const gchar *descr = gst_element_factory_get_description(factory); |
82 const gchar *descr = gst_element_factory_get_description(factory); |
78 m_containerDescriptions.insert(formatName, QString::fromUtf8(descr)); |
83 m_containerDescriptions.insert(formatName, QString::fromUtf8(descr)); |
79 |
84 |
|
85 |
|
86 if (formatName == QByteArray("raw")) { |
|
87 m_streamTypes.insert(formatName, allTypes); |
|
88 } else { |
|
89 QSet<QString> types = supportedStreamTypes(factory, GST_PAD_SINK); |
|
90 m_streamTypes.insert(formatName, types); |
|
91 allTypes.unite(types); |
|
92 } |
|
93 |
80 gst_object_unref(GST_OBJECT(factory)); |
94 gst_object_unref(GST_OBJECT(factory)); |
81 } |
95 } |
82 } |
96 } |
83 |
97 |
84 if (!m_supportedContainers.isEmpty()) |
98 //if (!m_supportedContainers.isEmpty()) |
85 setContainerMimeType(m_supportedContainers[0]); |
99 // setContainerMimeType(m_supportedContainers[0]); |
|
100 } |
|
101 |
|
102 QSet<QString> QGstreamerMediaContainerControl::supportedStreamTypes(GstElementFactory *factory, GstPadDirection direction) |
|
103 { |
|
104 QSet<QString> types; |
|
105 const GList *pads = gst_element_factory_get_static_pad_templates(factory); |
|
106 for (const GList *pad = pads; pad; pad = g_list_next(pad)) { |
|
107 GstStaticPadTemplate *templ = (GstStaticPadTemplate*)pad->data; |
|
108 if (templ->direction == direction) { |
|
109 GstCaps *caps = gst_static_caps_get(&templ->static_caps); |
|
110 for (uint i=0; i<gst_caps_get_size(caps); i++) { |
|
111 GstStructure *structure = gst_caps_get_structure(caps, i); |
|
112 types.insert( QString::fromUtf8(gst_structure_get_name(structure)) ); |
|
113 } |
|
114 gst_caps_unref(caps); |
|
115 } |
|
116 } |
|
117 |
|
118 return types; |
86 } |
119 } |
87 |
120 |
88 |
121 |
|
122 QSet<QString> QGstreamerMediaContainerControl::supportedStreamTypes(const QString &container) const |
|
123 { |
|
124 return m_streamTypes.value(container); |
|
125 } |