diff options
Diffstat (limited to 'src/plugins/gstreamer')
3 files changed, 36 insertions, 41 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp b/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp index 6ae41de0e..afda2346d 100644 --- a/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp @@ -43,45 +43,12 @@ #include <gst/gst.h> #include <gst/gstversion.h> +#include <private/qgstutils_p.h> #include <QDebug> QT_BEGIN_NAMESPACE -#if GST_CHECK_VERSION(0,10,30) - -static QVariant fromGStreamerOrientation(const QVariant &value) -{ - // Note gstreamer tokens either describe the counter clockwise rotation of the - // image or the clockwise transform to apply to correct the image. The orientation - // value returned is the clockwise rotation of the image. - const QString token = value.toString(); - if (token == QStringLiteral("rotate-90")) - return 270; - else if (token == QStringLiteral("rotate-180")) - return 180; - else if (token == QStringLiteral("rotate-270")) - return 90; - else - return 0; -} - -#endif - -static QVariant toGStreamerOrientation(const QVariant &value) -{ - switch (value.toInt()) { - case 90: - return QStringLiteral("rotate-270"); - case 180: - return QStringLiteral("rotate-180"); - case 270: - return QStringLiteral("rotate-90"); - default: - return QStringLiteral("rotate-0"); - } -} - namespace { struct QGStreamerMetaDataKey { @@ -196,7 +163,7 @@ QVariant CameraBinMetaData::metaData(const QString &key) const { #if GST_CHECK_VERSION(0,10,30) if (key == QMediaMetaData::Orientation) { - return fromGStreamerOrientation(m_values.value(QByteArray(GST_TAG_IMAGE_ORIENTATION))); + return QGstUtils::fromGStreamerOrientation(m_values.value(QByteArray(GST_TAG_IMAGE_ORIENTATION))); } else if (key == QMediaMetaData::GPSSpeed) { const double metersPerSec = m_values.value(QByteArray(GST_TAG_GEO_LOCATION_MOVEMENT_SPEED)).toDouble(); return (metersPerSec * 3600) / 1000; @@ -214,14 +181,16 @@ QVariant CameraBinMetaData::metaData(const QString &key) const void CameraBinMetaData::setMetaData(const QString &key, const QVariant &value) { QVariant correctedValue = value; +#if GST_CHECK_VERSION(0,10,30) if (value.isValid()) { if (key == QMediaMetaData::Orientation) { - correctedValue = toGStreamerOrientation(value); + correctedValue = QGstUtils::toGStreamerOrientation(value); } else if (key == QMediaMetaData::GPSSpeed) { // kilometers per hour to meters per second. correctedValue = (value.toDouble() * 1000) / 3600; } } +#endif const auto keys = *qt_gstreamerMetaDataKeys(); for (const QGStreamerMetaDataKey &metadataKey : keys) { diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 23cbd6082..f064c7c92 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -541,13 +541,26 @@ GstElement *CameraBinSession::buildCameraSource() if (!m_videoSrc) m_videoSrc = gst_element_factory_make("v4l2src", "camera_source"); + if (!m_videoSrc) + m_videoSrc = gst_element_factory_make("ksvideosrc", "camera_source"); + + if (!m_videoSrc) + m_videoSrc = gst_element_factory_make("avfvideosrc", "camera_source"); + if (m_videoSrc) g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL); } - if (m_videoSrc) - g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL); + if (m_videoSrc) { + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device")) + g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL); + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-path")) + g_object_set(G_OBJECT(m_videoSrc), "device-path", m_inputDevice.toUtf8().constData(), NULL); + + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-index")) + g_object_set(G_OBJECT(m_videoSrc), "device-index", m_inputDevice.toInt(), NULL); + } } else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) { if (m_inputDevice == QLatin1String("secondary")) { g_object_set(G_OBJECT(m_cameraSrc), "camera-device", 1, NULL); @@ -1177,11 +1190,16 @@ void CameraBinSession::recordVideo() if (format.isEmpty()) format = m_mediaContainerControl->actualContainerFormat(); - const QString actualFileName = m_mediaStorageLocation.generateFileName(m_sink.isLocalFile() ? m_sink.toLocalFile() - : m_sink.toString(), + const QString fileName = m_sink.isLocalFile() ? m_sink.toLocalFile() : m_sink.toString(); + const QFileInfo fileInfo(fileName); + const QString extension = fileInfo.suffix().isEmpty() + ? QGstUtils::fileExtensionForMimeType(format) + : fileInfo.suffix(); + + const QString actualFileName = m_mediaStorageLocation.generateFileName(fileName, QMediaStorageLocation::Movies, QLatin1String("clip_"), - QGstUtils::fileExtensionForMimeType(format)); + extension); m_recordingActive = true; m_actualSink = QUrl::fromLocalFile(actualFileName); diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp index 50ab0256b..8f2f6643c 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp @@ -43,6 +43,7 @@ #include <QtMultimedia/qmediametadata.h> #include <gst/gstversion.h> +#include <private/qgstutils_p.h> QT_BEGIN_NAMESPACE @@ -99,6 +100,9 @@ static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys() // Image/Video metadataKeys->insert("resolution", QMediaMetaData::Resolution); metadataKeys->insert("pixel-aspect-ratio", QMediaMetaData::PixelAspectRatio); +#if GST_CHECK_VERSION(0,10,30) + metadataKeys->insert(GST_TAG_IMAGE_ORIENTATION, QMediaMetaData::Orientation); +#endif // Video //metadataKeys->insert(0, QMediaMetaData::VideoFrameRate); @@ -145,6 +149,10 @@ bool QGstreamerMetaDataProvider::isWritable() const QVariant QGstreamerMetaDataProvider::metaData(const QString &key) const { +#if GST_CHECK_VERSION(0,10,30) + if (key == QMediaMetaData::Orientation) + return QGstUtils::fromGStreamerOrientation(m_tags.value(key)); +#endif return m_tags.value(key); } |