53- (
void)captureOutput:(AVCaptureOutput *)captureOutput
54 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
55 fromConnection:(AVCaptureConnection *)connection
57 Q_UNUSED(captureOutput);
65 CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
66 if (!imageBuffer || CFGetTypeID(imageBuffer) != CVPixelBufferGetTypeID()) {
67 qWarning() <<
"Cannot get image buffer from sample buffer";
71 auto pixelBuffer = QAVFHelpers::QSharedCVPixelBuffer(
73 QAVFHelpers::QSharedCVPixelBuffer::RefMode::NeedsRef);
75 const CMTime time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
76 const qint64 frameTime = time.timescale ? time.value * 1000000 / time.timescale : 0;
79 startTime = frameTime;
82 QVideoFrameFormat format = QAVFHelpers::videoFormatForImageBuffer(pixelBuffer.get());
83 if (!format.isValid()) {
84 qWarning() <<
"Cannot get get video format for image buffer"
85 << CVPixelBufferGetWidth(pixelBuffer.get()) <<
'x'
86 << CVPixelBufferGetHeight(pixelBuffer.get());
90 std::optional<QFFmpeg::QAVFSampleBufferDelegateTransform> transform;
91 if (transformationProvider) {
92 transform = transformationProvider(connection);
93 const VideoTransformation &surfaceTransform = transform.value().surfaceTransform;
94 format.setRotation(surfaceTransform.rotation);
95 format.setMirrored(surfaceTransform.mirroredHorizontallyAfterRotation);
98 format.setStreamFrameRate(frameRate);
100 Q_ASSERT(self->m_accel);
101 auto frame = QFFmpeg::qVideoFrameFromCvPixelBuffer(
103 startTime - *baseTime,
106 if (!frame.isValid())
107 frame = QVideoFramePrivate::createFrame(
108 std::make_unique<QFFmpeg::CVImageVideoBuffer>(std::move(pixelBuffer)),
111 if (transform.has_value()) {
112 const VideoTransformation &presentationTransform = transform.value().presentationTransform;
113 frame.setRotation(presentationTransform.rotation);
114 frame.setMirrored(presentationTransform.mirroredHorizontallyAfterRotation);
117 frame.setStartTime(startTime - *baseTime);
118 frame.setEndTime(frameTime - *baseTime);
119 startTime = frameTime;