59 if (frame->format != AV_PIX_FMT_VAAPI || !eglContext.eglDisplay()) {
60 qCDebug(qLHWAccelVAAPI) <<
"format/egl error" << frame->format << eglContext.eglDisplay();
64 if (!frame->hw_frames_ctx)
67 auto *ctx = avFrameDeviceContext(frame);
71 auto *vaCtx = (AVVAAPIDeviceContext *)ctx->hwctx;
72 auto vaDisplay = vaCtx->display;
74 qCDebug(qLHWAccelVAAPI) <<
" no VADisplay, disabling";
78 VASurfaceID vaSurface = (uintptr_t)frame->data[3];
80 VADRMPRIMESurfaceDescriptor prime = {};
81 if (vaExportSurfaceHandle(vaDisplay, vaSurface, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
82 VA_EXPORT_SURFACE_READ_ONLY
84 : VA_EXPORT_SURFACE_COMPOSED_LAYERS),
86 != VA_STATUS_SUCCESS) {
87 qWarning() <<
"vaExportSurfaceHandle failed";
92 QScopeGuard closeObjectsGuard([&prime]() {
93 for (uint32_t i = 0; i < prime.num_objects; ++i)
94 close(prime.objects[i].fd);
98 vaSyncSurface(vaDisplay, vaSurface);
103 AVPixelFormat fmt = HWAccel::format(frame);
104 bool needsConversion;
105 auto qtFormat = QFFmpegVideoBuffer::toQtPixelFormat(fmt, &needsConversion);
106 QSpan<
const DRMFormat> drm_formats = QtMultimediaPrivate::dmaBufFourccFromPixelFormat(qtFormat);
107 if (drm_formats.empty() || needsConversion) {
108 qWarning() <<
"can't use DMA transfer for pixel format" << fmt << qtFormat;
112 auto *desc = QVideoTextureHelper::textureDescription(qtFormat);
113 int nPlanes =
int(drm_formats.size());
114 Q_ASSERT(nPlanes == desc->nplanes);
115 nPlanes = desc->nplanes;
118 DmaBufPlane planes[4];
119 for (
int i = 0; i < nPlanes; ++i) {
124 if (prime.layers[i].drm_format != quint32(drm_formats[i])) {
125 qWarning() <<
"expected DRM format check failed expected" << Qt::hex
126 << quint32(drm_formats[i]) <<
"got" << prime.layers[i].drm_format;
130 planes[i].fd = prime.objects[prime.layers[layer].object_index[plane]].fd;
131 planes[i].offset = prime.layers[layer].offset[plane];
132 planes[i].pitch = prime.layers[layer].pitch[plane];
133 planes[i].drmFormat = drm_formats[i];
135 prime.objects[prime.layers[layer].object_index[plane]].drm_format_modifier;
138 auto textureHandles =
139 importDmaBufTextures(*rhi, eglContext, QSpan(planes, nPlanes), qtFormat,
140 QSize(frame->width, frame->height), shared_from_this());
141 if (!textureHandles) {
142 if (textureHandles.error() == FailureSeverity::unrecoverable) {
143 qWarning() <<
"VAAPI driver:" << vaQueryVendorString(vaDisplay);
149 return std::move(*textureHandles);
~VAAPITextureConverter() override
VAAPITextureConverter(QRhi *rhi)
QVideoFrameTexturesHandlesUPtr createTextureHandles(AVFrame *frame, QVideoFrameTexturesHandlesUPtr oldHandles) override