summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/multimedia/ffmpeg/qavfcamera.mm21
-rw-r--r--src/plugins/multimedia/ffmpeg/qavfcamera_p.h1
2 files changed, 21 insertions, 1 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qavfcamera.mm b/src/plugins/multimedia/ffmpeg/qavfcamera.mm
index 800825bd9..9801ad4b9 100644
--- a/src/plugins/multimedia/ffmpeg/qavfcamera.mm
+++ b/src/plugins/multimedia/ffmpeg/qavfcamera.mm
@@ -278,7 +278,7 @@ void QAVFCamera::updateCameraFormat()
}
if (hwAccel) {
- hwAccel->createFramesContext(avPixelFormat, m_cameraFormat.resolution());
+ hwAccel->createFramesContext(avPixelFormat, adjustedResolution());
m_hwPixelFormat = hwAccel->hwFormat();
} else {
m_hwPixelFormat = AV_PIX_FMT_NONE;
@@ -340,6 +340,25 @@ uint32_t QAVFCamera::setPixelFormat(QVideoFrameFormat::PixelFormat cameraPixelFo
return [bestFormat unsignedIntValue];
}
+QSize QAVFCamera::adjustedResolution() const
+{
+ // Check, that we have matching dimesnions.
+ QSize resolution = m_cameraFormat.resolution();
+ AVCaptureConnection *connection = [m_videoDataOutput connectionWithMediaType:AVMediaTypeVideo];
+ if (!connection.supportsVideoOrientation)
+ return resolution;
+
+ // Either portrait but actually sizes of landscape, or
+ // landscape with dimensions of portrait - not what
+ // sample delegate will report (it depends on videoOrientation set).
+ const bool isPortraitOrientation = connection.videoOrientation == AVCaptureVideoOrientationPortrait;
+ const bool isPortraitResolution = resolution.height() > resolution.width();
+ if (isPortraitOrientation != isPortraitResolution)
+ resolution.transpose();
+
+ return resolution;
+}
+
void QAVFCamera::syncHandleFrame(const QVideoFrame &frame)
{
Q_EMIT newVideoFrame(frame);
diff --git a/src/plugins/multimedia/ffmpeg/qavfcamera_p.h b/src/plugins/multimedia/ffmpeg/qavfcamera_p.h
index 3f3fc97cd..71aa521bc 100644
--- a/src/plugins/multimedia/ffmpeg/qavfcamera_p.h
+++ b/src/plugins/multimedia/ffmpeg/qavfcamera_p.h
@@ -70,6 +70,7 @@ private:
void updateVideoInput();
void attachVideoInputDevice();
uint32_t setPixelFormat(QVideoFrameFormat::PixelFormat pixelFormat, uint32_t inputCvPixFormat);
+ QSize adjustedResolution() const;
AVCaptureDevice *device() const;