summaryrefslogtreecommitdiffstats
path: root/src/plugins/multimedia/ffmpeg/qavfcamera.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/multimedia/ffmpeg/qavfcamera.mm')
-rw-r--r--src/plugins/multimedia/ffmpeg/qavfcamera.mm39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qavfcamera.mm b/src/plugins/multimedia/ffmpeg/qavfcamera.mm
index d6ec94a0e..9cdb84dc7 100644
--- a/src/plugins/multimedia/ffmpeg/qavfcamera.mm
+++ b/src/plugins/multimedia/ffmpeg/qavfcamera.mm
@@ -361,17 +361,29 @@ void QAVFCamera::updateCameraFormat()
if (!captureDevice)
return;
- uint avPixelFormat = 0;
+ std::uint32_t cvPixelFormat = 0;
AVCaptureDeviceFormat *newFormat = qt_convert_to_capture_device_format(captureDevice, m_cameraFormat);
if (newFormat) {
qt_set_active_format(captureDevice, newFormat, false);
- avPixelFormat = setPixelFormat(m_cameraFormat.pixelFormat());
+ cvPixelFormat = setPixelFormat(m_cameraFormat.pixelFormat());
+ }
+
+ const AVPixelFormat avPixelFormat = av_map_videotoolbox_format_to_pixfmt(cvPixelFormat);
+
+ std::unique_ptr<QFFmpeg::HWAccel> hwAccel;
+
+ if (avPixelFormat == AV_PIX_FMT_NONE) {
+ auto formatDescIt =
+ std::make_reverse_iterator(reinterpret_cast<const char *>(&cvPixelFormat));
+ qWarning() << "Videotoolbox desn't support cvPixelFormat:" << cvPixelFormat
+ << std::string(formatDescIt - 4, formatDescIt)
+ << " Camera pix format:" << m_cameraFormat.pixelFormat();
+ } else {
+ hwAccel = QFFmpeg::HWAccel::create(AV_HWDEVICE_TYPE_VIDEOTOOLBOX);
}
- auto hwAccel = QFFmpeg::HWAccel::create(AV_HWDEVICE_TYPE_VIDEOTOOLBOX);
if (hwAccel) {
- hwAccel->createFramesContext(av_map_videotoolbox_format_to_pixfmt(avPixelFormat),
- m_cameraFormat.resolution());
+ hwAccel->createFramesContext(avPixelFormat, m_cameraFormat.resolution());
hwPixelFormat = hwAccel->hwFormat();
} else {
hwPixelFormat = AV_PIX_FMT_NONE;
@@ -379,35 +391,36 @@ void QAVFCamera::updateCameraFormat()
[m_sampleBufferDelegate setHWAccel:std::move(hwAccel)];
}
-uint QAVFCamera::setPixelFormat(const QVideoFrameFormat::PixelFormat pixelFormat)
+std::uint32_t QAVFCamera::setPixelFormat(const QVideoFrameFormat::PixelFormat pixelFormat)
{
// Default to 32BGRA pixel formats on the viewfinder, in case the requested
// format can't be used (shouldn't happen unless the developers sets a wrong camera
// format on the camera).
- unsigned avPixelFormat = kCVPixelFormatType_32BGRA;
- if (!QAVFHelpers::toCVPixelFormat(pixelFormat, avPixelFormat))
+ std::uint32_t cvPixelFormat = kCVPixelFormatType_32BGRA;
+ if (!QAVFHelpers::toCVPixelFormat(pixelFormat, cvPixelFormat))
qWarning() << "QCamera::setCameraFormat: couldn't convert requested pixel format, using ARGB32";
bool isSupported = false;
NSArray *supportedPixelFormats = m_videoDataOutput.availableVideoCVPixelFormatTypes;
for (NSNumber *currentPixelFormat in supportedPixelFormats)
{
- if ([currentPixelFormat unsignedIntValue] == avPixelFormat) {
+ if ([currentPixelFormat unsignedIntValue] == cvPixelFormat) {
isSupported = true;
break;
}
}
if (isSupported) {
- NSDictionary* outputSettings = @{
- (NSString *)kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithUnsignedInt:avPixelFormat],
- (NSString *)kCVPixelBufferMetalCompatibilityKey: @true
+ NSDictionary *outputSettings = @{
+ (NSString *)
+ kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:cvPixelFormat],
+ (NSString *)kCVPixelBufferMetalCompatibilityKey : @true
};
m_videoDataOutput.videoSettings = outputSettings;
} else {
qWarning() << "QCamera::setCameraFormat: requested pixel format not supported. Did you use a camera format from another camera?";
}
- return avPixelFormat;
+ return cvPixelFormat;
}
void QAVFCamera::syncHandleFrame(const QVideoFrame &frame)