63- (
void)captureOutput:(AVCaptureOutput *)captureOutput
64 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
65 fromConnection:(AVCaptureConnection *)connection
67 Q_UNUSED(captureOutput);
72 CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
73 if (!imageBuffer || CFGetTypeID(imageBuffer) != CVPixelBufferGetTypeID()) {
74 qWarning() <<
"Cannot get image buffer from sample buffer";
78 auto pixelBuffer = QAVFHelpers::QSharedCVPixelBuffer(
80 QAVFHelpers::QSharedCVPixelBuffer::RefMode::NeedsRef);
82 QSize incomingFrameSize {
83 static_cast<
int>(CVPixelBufferGetWidth(pixelBuffer.get())),
84 static_cast<
int>(CVPixelBufferGetHeight(pixelBuffer.get())) };
85 Q_ASSERT(!incomingFrameSize.isEmpty());
86 CvPixelFormat incomingCvPixelFormat = CVPixelBufferGetPixelFormatType(pixelBuffer.get());
89 m_accel->updateFramesContext(
90 av_map_videotoolbox_format_to_pixfmt(incomingCvPixelFormat),
93 std::chrono::microseconds frameTime =
94 QAVFHelpers::CMTimeToMicroseconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer));
97 startTime = frameTime;
100 QVideoFrameFormat format = QAVFHelpers::videoFormatForImageBuffer(pixelBuffer.get());
101 if (!format.isValid()) {
102 qWarning() <<
"Cannot get get video format for image buffer"
103 << CVPixelBufferGetWidth(pixelBuffer.get()) <<
'x'
104 << CVPixelBufferGetHeight(pixelBuffer.get());
108 std::optional<QFFmpeg::QAVFSampleBufferDelegateTransform> transform;
109 if (transformationProvider) {
110 transform = transformationProvider(connection);
111 const VideoTransformation &surfaceTransform = transform.value().surfaceTransform;
112 format.setRotation(surfaceTransform.rotation);
113 format.setMirrored(surfaceTransform.mirroredHorizontallyAfterRotation);
116 format.setStreamFrameRate(frameRate);
118 QVideoFrame frame = QFFmpeg::qVideoFrameFromCvPixelBuffer(
120 startTime - *baseTime,
123 if (!frame.isValid())
124 frame = QVideoFramePrivate::createFrame(
125 std::make_unique<QFFmpeg::CVImageVideoBuffer>(std::move(pixelBuffer)),
128 if (transform.has_value()) {
129 const VideoTransformation &presentationTransform = transform.value().presentationTransform;
130 frame.setRotation(presentationTransform.rotation);
131 frame.setMirrored(presentationTransform.mirroredHorizontallyAfterRotation);
134 frame.setStartTime((startTime - *baseTime).count());
135 frame.setEndTime((frameTime - *baseTime).count());
136 startTime = frameTime;