diff options
Diffstat (limited to 'src/plugins/avfoundation')
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; |