summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2016-02-11 01:47:12 +0100
committerYoann Lopes <yoann.lopes@qt.io>2016-06-09 12:28:18 +0000
commit2303d2fef8987f32b1615710ef8930f8d2854373 (patch)
tree5fbf705a0c83fa7717732f8b3b406895021b2e44 /src/plugins/avfoundation
parente1992d9d1db9e16161a4135d1a525482980c747d (diff)
AVFoundation: implement QMediaContainerControl.
Change-Id: I5097a0450f5836e48a697249619a1822775f3ad8 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
Diffstat (limited to 'src/plugins/avfoundation')
-rw-r--r--src/plugins/avfoundation/camera/avfcameraservice.h3
-rw-r--r--src/plugins/avfoundation/camera/avfcameraservice.mm6
-rw-r--r--src/plugins/avfoundation/camera/avfmediaassetwriter.mm5
-rw-r--r--src/plugins/avfoundation/camera/avfmediacontainercontrol.h63
-rw-r--r--src/plugins/avfoundation/camera/avfmediacontainercontrol.mm106
-rw-r--r--src/plugins/avfoundation/camera/avfmediarecordercontrol.mm5
-rw-r--r--src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm4
-rw-r--r--src/plugins/avfoundation/camera/camera.pro6
8 files changed, 193 insertions, 5 deletions
diff --git a/src/plugins/avfoundation/camera/avfcameraservice.h b/src/plugins/avfoundation/camera/avfcameraservice.h
index 76241d7b2..ae46e49f1 100644
--- a/src/plugins/avfoundation/camera/avfcameraservice.h
+++ b/src/plugins/avfoundation/camera/avfcameraservice.h
@@ -62,6 +62,7 @@ class AVFCameraFlashControl;
class AVFMediaRecorderControl;
class AVFMediaRecorderControlIOS;
class AVFVideoEncoderSettingsControl;
+class AVFMediaContainerControl;
class AVFCameraService : public QMediaService
{
@@ -89,6 +90,7 @@ public:
AVFImageEncoderControl *imageEncoderControl() const {return m_imageEncoderControl; }
AVFCameraFlashControl *flashControl() const {return m_flashControl; }
AVFVideoEncoderSettingsControl *videoEncoderSettingsControl() const {return m_videoEncoderSettingsControl; }
+ AVFMediaContainerControl *mediaContainerControl() const { return m_mediaContainerControl; }
private:
AVFCameraSession *m_session;
@@ -108,6 +110,7 @@ private:
AVFImageEncoderControl *m_imageEncoderControl;
AVFCameraFlashControl *m_flashControl;
AVFVideoEncoderSettingsControl *m_videoEncoderSettingsControl;
+ AVFMediaContainerControl *m_mediaContainerControl;
};
QT_END_NAMESPACE
diff --git a/src/plugins/avfoundation/camera/avfcameraservice.mm b/src/plugins/avfoundation/camera/avfcameraservice.mm
index dc50319d0..5599dfe4a 100644
--- a/src/plugins/avfoundation/camera/avfcameraservice.mm
+++ b/src/plugins/avfoundation/camera/avfcameraservice.mm
@@ -54,6 +54,7 @@
#include "avfimageencodercontrol.h"
#include "avfcameraflashcontrol.h"
#include "avfvideoencodersettingscontrol.h"
+#include "avfmediacontainercontrol.h"
#ifdef Q_OS_IOS
#include "avfcamerazoomcontrol.h"
@@ -101,6 +102,7 @@ AVFCameraService::AVFCameraService(QObject *parent):
m_imageEncoderControl = new AVFImageEncoderControl(this);
m_flashControl = new AVFCameraFlashControl(this);
m_videoEncoderSettingsControl = new AVFVideoEncoderSettingsControl(this);
+ m_mediaContainerControl = new AVFMediaContainerControl(this);
}
AVFCameraService::~AVFCameraService()
@@ -133,6 +135,7 @@ AVFCameraService::~AVFCameraService()
delete m_imageEncoderControl;
delete m_flashControl;
delete m_videoEncoderSettingsControl;
+ delete m_mediaContainerControl;
delete m_session;
}
@@ -182,6 +185,9 @@ QMediaControl *AVFCameraService::requestControl(const char *name)
if (qstrcmp(name, QVideoEncoderSettingsControl_iid) == 0)
return m_videoEncoderSettingsControl;
+ if (qstrcmp(name, QMediaContainerControl_iid) == 0)
+ return m_mediaContainerControl;
+
if (qstrcmp(name,QMediaVideoProbeControl_iid) == 0) {
AVFMediaVideoProbeControl *videoProbe = 0;
videoProbe = new AVFMediaVideoProbeControl(this);
diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
index b5e2bbc94..8e49c7c8f 100644
--- a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
+++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
@@ -38,6 +38,7 @@
#include "avfcameraservice.h"
#include "avfcamerasession.h"
#include "avfcameradebug.h"
+#include "avfmediacontainercontrol.h"
//#include <QtCore/qmutexlocker.h>
#include <QtCore/qmetaobject.h>
@@ -129,7 +130,9 @@ bool qt_camera_service_isValid(AVFCameraService *service)
// But we still can write video!
}
- m_assetWriter.reset([[AVAssetWriter alloc] initWithURL:fileURL fileType:AVFileTypeQuickTimeMovie error:nil]);
+ m_assetWriter.reset([[AVAssetWriter alloc] initWithURL:fileURL
+ fileType:m_service->mediaContainerControl()->fileType()
+ error:nil]);
if (!m_assetWriter) {
qDebugCamera() << Q_FUNC_INFO << "failed to create asset writer";
return false;
diff --git a/src/plugins/avfoundation/camera/avfmediacontainercontrol.h b/src/plugins/avfoundation/camera/avfmediacontainercontrol.h
new file mode 100644
index 000000000..da31d2d13
--- /dev/null
+++ b/src/plugins/avfoundation/camera/avfmediacontainercontrol.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef AVFMEDIACONTAINERCONTROL_H
+#define AVFMEDIACONTAINERCONTROL_H
+
+#include <qmediacontainercontrol.h>
+
+@class NSString;
+
+QT_BEGIN_NAMESPACE
+
+class AVFCameraService;
+
+class AVFMediaContainerControl : public QMediaContainerControl
+{
+public:
+ explicit AVFMediaContainerControl(AVFCameraService *service);
+
+ QStringList supportedContainers() const Q_DECL_OVERRIDE;
+ QString containerFormat() const Q_DECL_OVERRIDE;
+ void setContainerFormat(const QString &format) Q_DECL_OVERRIDE;
+ QString containerDescription(const QString &formatMimeType) const Q_DECL_OVERRIDE;
+
+ NSString *fileType() const;
+
+private:
+ QString m_format;
+};
+
+QT_END_NAMESPACE
+
+#endif // AVFMEDIACONTAINERCONTROL_H
diff --git a/src/plugins/avfoundation/camera/avfmediacontainercontrol.mm b/src/plugins/avfoundation/camera/avfmediacontainercontrol.mm
new file mode 100644
index 000000000..a8dc3c844
--- /dev/null
+++ b/src/plugins/avfoundation/camera/avfmediacontainercontrol.mm
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "avfmediacontainercontrol.h"
+
+#include <AVFoundation/AVMediaFormat.h>
+
+QT_BEGIN_NAMESPACE
+
+struct ContainerInfo
+{
+ QString description;
+ NSString *fileType;
+
+ ContainerInfo() : fileType(nil) { }
+ ContainerInfo(const QString &desc, NSString *type)
+ : description(desc), fileType(type)
+ { }
+};
+
+typedef QMap<QString, ContainerInfo> SupportedContainers;
+Q_GLOBAL_STATIC(SupportedContainers, containers);
+
+AVFMediaContainerControl::AVFMediaContainerControl(AVFCameraService *)
+ : QMediaContainerControl()
+ , m_format(QStringLiteral("mov")) // .mov is the default container format on Apple platforms
+{
+ if (containers->isEmpty()) {
+ containers->insert(QStringLiteral("mov"),
+ ContainerInfo(QStringLiteral("QuickTime movie file format"),
+ AVFileTypeQuickTimeMovie));
+ containers->insert(QStringLiteral("mp4"),
+ ContainerInfo(QStringLiteral("MPEG-4 file format"),
+ AVFileTypeMPEG4));
+ containers->insert(QStringLiteral("m4v"),
+ ContainerInfo(QStringLiteral("iTunes video file format"),
+ AVFileTypeAppleM4V));
+#ifdef Q_OS_IOS
+ containers->insert(QStringLiteral("3gp"),
+ ContainerInfo(QStringLiteral("3GPP file format"),
+ AVFileType3GPP));
+#endif
+ }
+}
+
+QStringList AVFMediaContainerControl::supportedContainers() const
+{
+ return containers->keys();
+}
+
+QString AVFMediaContainerControl::containerFormat() const
+{
+ return m_format;
+}
+
+void AVFMediaContainerControl::setContainerFormat(const QString &format)
+{
+ if (!containers->contains(format)) {
+ qWarning("Unsupported container format: '%s'", format.toLocal8Bit().constData());
+ return;
+ }
+
+ m_format = format;
+}
+
+QString AVFMediaContainerControl::containerDescription(const QString &formatMimeType) const
+{
+ return containers->value(formatMimeType).description;
+}
+
+NSString *AVFMediaContainerControl::fileType() const
+{
+ return containers->value(m_format).fileType;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm
index 4a3091f24..de2b14ef4 100644
--- a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm
+++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm
@@ -38,6 +38,7 @@
#include "avfcameracontrol.h"
#include "avfaudioinputselectorcontrol.h"
#include "avfvideoencodersettingscontrol.h"
+#include "avfmediacontainercontrol.h"
#include <QtCore/qurl.h>
#include <QtCore/qfileinfo.h>
@@ -260,11 +261,13 @@ void AVFMediaRecorderControl::setState(QMediaRecorder::State state)
QString outputLocationPath = m_outputLocation.scheme() == QLatin1String("file") ?
m_outputLocation.path() : m_outputLocation.toString();
+ QString extension = m_service->mediaContainerControl()->containerFormat();
+
QUrl actualLocation = QUrl::fromLocalFile(
m_storageLocation.generateFileName(outputLocationPath,
QCamera::CaptureVideo,
QLatin1String("clip_"),
- QLatin1String("mp4")));
+ extension));
qDebugCamera() << "Video capture location:" << actualLocation.toString();
diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm
index 3cb33ab58..2052afb50 100644
--- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm
+++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm
@@ -39,6 +39,7 @@
#include "avfcameraservice.h"
#include "avfcameradebug.h"
#include "avfvideoencodersettingscontrol.h"
+#include "avfmediacontainercontrol.h"
#include "avfcamerautility.h"
#include <QtCore/qdebug.h>
@@ -215,7 +216,8 @@ void AVFMediaRecorderControlIOS::setState(QMediaRecorder::State state)
const QString path(m_outputLocation.scheme() == QLatin1String("file") ?
m_outputLocation.path() : m_outputLocation.toString());
const QUrl fileURL(QUrl::fromLocalFile(m_storageLocation.generateFileName(path, QCamera::CaptureVideo,
- QLatin1String("clip_"), QLatin1String("mp4"))));
+ QLatin1String("clip_"),
+ m_service->mediaContainerControl()->containerFormat())));
NSURL *nsFileURL = fileURL.toNSURL();
if (!nsFileURL) {
diff --git a/src/plugins/avfoundation/camera/camera.pro b/src/plugins/avfoundation/camera/camera.pro
index bf3f82934..f9782ef8f 100644
--- a/src/plugins/avfoundation/camera/camera.pro
+++ b/src/plugins/avfoundation/camera/camera.pro
@@ -38,7 +38,8 @@ HEADERS += \
avfcameraviewfindersettingscontrol.h \
avfimageencodercontrol.h \
avfcameraflashcontrol.h \
- avfvideoencodersettingscontrol.h
+ avfvideoencodersettingscontrol.h \
+ avfmediacontainercontrol.h
OBJECTIVE_SOURCES += \
avfcameraserviceplugin.mm \
@@ -59,7 +60,8 @@ OBJECTIVE_SOURCES += \
avfcameraviewfindersettingscontrol.mm \
avfimageencodercontrol.mm \
avfcameraflashcontrol.mm \
- avfvideoencodersettingscontrol.mm
+ avfvideoencodersettingscontrol.mm \
+ avfmediacontainercontrol.mm
osx {