summaryrefslogtreecommitdiffstats
path: root/src/plugins/gstreamer/camerabin/camerabincontainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/gstreamer/camerabin/camerabincontainer.cpp')
-rw-r--r--src/plugins/gstreamer/camerabin/camerabincontainer.cpp137
1 files changed, 72 insertions, 65 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabincontainer.cpp b/src/plugins/gstreamer/camerabin/camerabincontainer.cpp
index 1bbcdec2c..d0d27fbbd 100644
--- a/src/plugins/gstreamer/camerabin/camerabincontainer.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabincontainer.cpp
@@ -40,83 +40,90 @@
****************************************************************************/
#include "camerabincontainer.h"
-
+#include <QtCore/qregexp.h>
#include <QtCore/qdebug.h>
CameraBinContainer::CameraBinContainer(QObject *parent)
- :QMediaContainerControl(parent)
+ :QMediaContainerControl(parent),
+ m_supportedContainers(QGstCodecsInfo::Muxer)
{
- QList<QByteArray> formatCandidates;
- formatCandidates << "mp4" << "ogg" << "wav" << "amr" << "mkv"
- << "avi" << "3gp" << "3gp2" << "webm" << "mjpeg" << "asf" << "mov";
-
- QMap<QString,QByteArray> elementNames;
-
- elementNames.insertMulti("mp4", "ffmux_mp4");
- elementNames.insertMulti("mp4", "hantromp4mux");
- elementNames.insertMulti("mp4", "mp4mux");
- elementNames.insert("ogg", "oggmux");
- elementNames["wav"] = "wavenc";
- elementNames["amr"] = "ffmux_amr";
- elementNames["mkv"] = "matroskamux";
- elementNames["avi"] = "avimux";
- elementNames["3gp"] = "ffmux_3gp";
- elementNames["3gp2"] = "ffmux_3g2";
- elementNames["webm"] = "webmmux";
- elementNames["mjpeg"] = "ffmux_mjpeg";
- elementNames["asf"] = "ffmux_asf";
- elementNames["mov"] = "qtmux";
-
- QSet<QString> allTypes;
-
- foreach(const QByteArray &formatName, formatCandidates) {
- foreach(const QByteArray &elementName, elementNames.values(formatName)) {
- GstElementFactory *factory = gst_element_factory_find(elementName.constData());
- if (factory) {
- m_supportedContainers.append(formatName);
- const gchar *descr = gst_element_factory_get_description(factory);
- m_containerDescriptions.insert(formatName, QString::fromUtf8(descr));
-
-
- if (formatName == QByteArray("raw")) {
- m_streamTypes.insert(formatName, allTypes);
- } else {
- QSet<QString> types = supportedStreamTypes(factory, GST_PAD_SINK);
- m_streamTypes.insert(formatName, types);
- allTypes.unite(types);
- }
-
- gst_object_unref(GST_OBJECT(factory));
-
- m_elementNames.insert(formatName, elementName);
- break;
- }
- }
- }
+ //extension for containers hard to guess from mimetype
+ m_fileExtensions["video/x-matroska"] = "mkv";
+ m_fileExtensions["video/quicktime"] = "mov";
+ m_fileExtensions["video/x-msvideo"] = "avi";
+ m_fileExtensions["video/msvideo"] = "avi";
+ m_fileExtensions["audio/mpeg"] = "mp3";
+ m_fileExtensions["application/x-shockwave-flash"] = "swf";
+ m_fileExtensions["application/x-pn-realmedia"] = "rm";
+}
+
+QStringList CameraBinContainer::supportedContainers() const
+{
+ return m_supportedContainers.supportedCodecs();
+}
+
+QString CameraBinContainer::containerDescription(const QString &formatMimeType) const
+{
+ return m_supportedContainers.codecDescription(formatMimeType);
+}
+
+QString CameraBinContainer::containerMimeType() const
+{
+ return m_format;
}
-QSet<QString> CameraBinContainer::supportedStreamTypes(GstElementFactory *factory, GstPadDirection direction)
+void CameraBinContainer::setContainerMimeType(const QString &formatMimeType)
{
- 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 = (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);
- }
+ m_format = formatMimeType;
+
+ if (m_userFormat != formatMimeType) {
+ m_userFormat = formatMimeType;
+ emit settingsChanged();
}
+}
- return types;
+void CameraBinContainer::setActualContainer(const QString &formatMimeType)
+{
+ m_format = formatMimeType;
}
+void CameraBinContainer::resetActualContainer()
+{
+ m_format = m_userFormat;
+}
-QSet<QString> CameraBinContainer::supportedStreamTypes(const QString &container) const
+GstEncodingContainerProfile *CameraBinContainer::createProfile()
{
- return m_streamTypes.value(container);
+ GstCaps *caps;
+
+ if (m_format.isEmpty())
+ caps = gst_caps_new_any();
+ else
+ caps = gst_caps_from_string(m_format.toLatin1());
+
+ return (GstEncodingContainerProfile *)gst_encoding_container_profile_new(
+ "camerabin2_profile",
+ (gchar *)"custom camera profile",
+ caps,
+ NULL); //preset
+}
+
+/*!
+ Suggest file extension for current container mimetype.
+ */
+QString CameraBinContainer::suggestedFileExtension() const
+{
+ QString format = m_format.left(m_format.indexOf(','));
+ QString extension = m_fileExtensions.value(format);
+
+ if (!extension.isEmpty() || format.isEmpty())
+ return extension;
+
+ QRegExp rx("[-/]([\\w]+)$");
+
+ if (rx.indexIn(format) != -1)
+ extension = rx.cap(1);
+
+ return extension;
}