4#include <QtFFmpegMediaPluginImpl/private/qffmpegdarwinhwframehelpers_p.h>
6#include <QtMultimedia/private/qvideoframe_p.h>
8#define AVMediaType XAVMediaType
9#include <QtFFmpegMediaPluginImpl/private/qffmpegvideobuffer_p.h>
10#include <QtFFmpegMediaPluginImpl/private/qffmpeghwaccel_p.h>
20[[nodiscard]] AVFrameUPtr allocHWFrame(
21 AVBufferRef *hwContext,
22 QAVFHelpers::QSharedCVPixelBuffer sharedPixBuf)
24 Q_ASSERT(sharedPixBuf);
26 AVHWFramesContext *ctx = (AVHWFramesContext *)hwContext->data;
27 auto frame = QFFmpeg::makeAVFrame();
28 frame->hw_frames_ctx = av_buffer_ref(hwContext);
29 frame->extended_data = frame->data;
31 CVPixelBufferRef pixbuf = sharedPixBuf.release();
32 auto releasePixBufFn = [](
void* opaquePtr, uint8_t *) {
33 CVPixelBufferRelease(
static_cast<CVPixelBufferRef>(opaquePtr));
35 frame->buf[0] = av_buffer_create(
nullptr, 0, releasePixBufFn, pixbuf, 0);
38 frame->data[3] = (uint8_t *)pixbuf;
39 frame->width = ctx->width;
40 frame->height = ctx->height;
41 frame->format = AV_PIX_FMT_VIDEOTOOLBOX;
42 if (frame->width != (
int)CVPixelBufferGetWidth(pixbuf)
43 || frame->height != (
int)CVPixelBufferGetHeight(pixbuf)) {
54 const QFFmpeg::HWAccel &hwAccel,
55 qint64 presentationTimeStamp,
56 const QAVFHelpers::QSharedCVPixelBuffer &imageBuffer,
57 QVideoFrameFormat format)
59 AVFrameUPtr avFrame = allocHWFrame(
60 hwAccel.hwFramesContextAsBuffer(),
67 auto swFrame = QFFmpeg::makeAVFrame();
69 const int ret = av_hwframe_transfer_data(swFrame.get(), avFrame.get(), 0);
71 qWarning() <<
"Error transferring the data to system memory:" << ret;
73 avFrame = std::move(swFrame);
78 avFrame->pts = presentationTimeStamp;
80 return QVideoFramePrivate::createFrame(
81 std::make_unique<QFFmpegVideoBuffer>(std::move(avFrame)),
QVideoFrame qVideoFrameFromCvPixelBuffer(const QFFmpeg::HWAccel &hwAccel, qint64 presentationTimeStamp, const QAVFHelpers::QSharedCVPixelBuffer &imageBuffer, QVideoFrameFormat format)
std::conditional_t< QT_FFMPEG_AVIO_WRITE_CONST, const uint8_t *, uint8_t * > AvioWriteBufferType