summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation/camera
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/avfoundation/camera')
-rw-r--r--src/plugins/avfoundation/camera/avfmediaassetwriter.h3
-rw-r--r--src/plugins/avfoundation/camera/avfmediaassetwriter.mm4
-rw-r--r--src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h2
-rw-r--r--src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm23
4 files changed, 28 insertions, 4 deletions
diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.h b/src/plugins/avfoundation/camera/avfmediaassetwriter.h
index ff24ad49a..9b2479909 100644
--- a/src/plugins/avfoundation/camera/avfmediaassetwriter.h
+++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.h
@@ -98,7 +98,8 @@ QT_END_NAMESPACE
- (bool)setupWithFileURL:(NSURL *)fileURL
cameraService:(QT_PREPEND_NAMESPACE(AVFCameraService) *)service
audioSettings:(NSDictionary *)audioSettings
- videoSettings:(NSDictionary *)videoSettings;
+ videoSettings:(NSDictionary *)videoSettings
+ transform:(CGAffineTransform)transform;
- (void)start;
- (void)stop;
diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
index 396de8c35..59c1d1aa2 100644
--- a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
+++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm
@@ -108,6 +108,7 @@ bool qt_camera_service_isValid(AVFCameraService *service)
cameraService:(AVFCameraService *)service
audioSettings:(NSDictionary *)audioSettings
videoSettings:(NSDictionary *)videoSettings
+ transform:(CGAffineTransform)transform
{
Q_ASSERT(fileURL);
@@ -157,6 +158,9 @@ bool qt_camera_service_isValid(AVFCameraService *service)
m_assetWriter.reset();
return false;
}
+
+ m_cameraWriterInput.data().transform = transform;
+
// Ready to start ...
return true;
}
diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h
index 66e27004f..33cb08804 100644
--- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h
+++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h
@@ -39,6 +39,7 @@
#include "avfcamerautility.h"
#include <QtMultimedia/qmediarecordercontrol.h>
+#include <private/qvideooutputorientationhandler_p.h>
#include <QtCore/qglobal.h>
#include <QtCore/qurl.h>
@@ -102,6 +103,7 @@ private:
NSDictionary *m_audioSettings;
NSDictionary *m_videoSettings;
+ QVideoOutputOrientationHandler m_orientationHandler;
};
QT_END_NAMESPACE
diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm
index f2c16f675..e65c98257 100644
--- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm
+++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm
@@ -262,9 +262,26 @@ void AVFMediaRecorderControlIOS::setState(QMediaRecorder::State state)
applySettings();
- if ([m_writer setupWithFileURL:nsFileURL cameraService:m_service
- audioSettings:m_audioSettings
- videoSettings:m_videoSettings]) {
+ // Make sure the video is recorded in device orientation.
+ // The top of the video will match the side of the device which is on top
+ // when recording starts (regardless of the UI orientation).
+ AVFCameraInfo cameraInfo = m_service->session()->activeCameraInfo();
+ int screenOrientation = 360 - m_orientationHandler.currentOrientation();
+ float rotation = 0;
+ if (cameraInfo.position == QCamera::FrontFace)
+ rotation = (screenOrientation + cameraInfo.orientation) % 360;
+ else
+ rotation = (screenOrientation + (360 - cameraInfo.orientation)) % 360;
+
+ // convert to radians
+ rotation *= M_PI / 180.f;
+
+ if ([m_writer setupWithFileURL:nsFileURL
+ cameraService:m_service
+ audioSettings:m_audioSettings
+ videoSettings:m_videoSettings
+ transform:CGAffineTransformMakeRotation(rotation)]) {
+
m_state = QMediaRecorder::RecordingState;
m_lastStatus = QMediaRecorder::StartingStatus;