60 if (frame->format != AV_PIX_FMT_VAAPI || !eglContext.eglDisplay()) {
61 qCDebug(qLHWAccelVAAPI) <<
"format/egl error" << frame->format << eglContext.eglDisplay();
65 if (!frame->hw_frames_ctx)
68 auto *ctx = avFrameDeviceContext(frame);
72 auto *vaCtx = (AVVAAPIDeviceContext *)ctx->hwctx;
73 auto vaDisplay = vaCtx->display;
75 qCDebug(qLHWAccelVAAPI) <<
" no VADisplay, disabling";
79 VASurfaceID vaSurface = (uintptr_t)frame->data[3];
81 VADRMPRIMESurfaceDescriptor prime = {};
82 const auto exportStatus =
83 vaExportSurfaceHandle(vaDisplay, vaSurface, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
84 VA_EXPORT_SURFACE_READ_ONLY
86 : VA_EXPORT_SURFACE_COMPOSED_LAYERS),
88 if (exportStatus != VA_STATUS_SUCCESS) {
89 qWarning() <<
"vaExportSurfaceHandle failed:"
90 << QtMultimediaPrivate::VAStatus(exportStatus);
95 QScopeGuard closeObjectsGuard([&prime]() {
96 for (uint32_t i = 0; i < prime.num_objects; ++i)
97 close(prime.objects[i].fd);
101 vaSyncSurface(vaDisplay, vaSurface);
106 AVPixelFormat fmt = HWAccel::format(frame);
107 bool needsConversion;
108 auto qtFormat = QFFmpegVideoBuffer::toQtPixelFormat(fmt, &needsConversion);
109 QSpan<
const DRMFormat> drm_formats = QtMultimediaPrivate::dmaBufFourccFromPixelFormat(qtFormat);
110 if (drm_formats.empty() || needsConversion) {
111 qWarning() <<
"can't use DMA transfer for pixel format" << fmt << qtFormat;
115 auto *desc = QVideoTextureHelper::textureDescription(qtFormat);
116 int nPlanes =
int(drm_formats.size());
117 Q_ASSERT(nPlanes == desc->nplanes);
118 nPlanes = desc->nplanes;
121 DmaBufPlane planes[4];
122 for (
int i = 0; i < nPlanes; ++i) {
127 if (prime.layers[i].drm_format != quint32(drm_formats[i])) {
128 qWarning() <<
"expected DRM format check failed expected" << Qt::hex
129 << quint32(drm_formats[i]) <<
"got" << prime.layers[i].drm_format;
133 planes[i].fd = prime.objects[prime.layers[layer].object_index[plane]].fd;
134 planes[i].offset = prime.layers[layer].offset[plane];
135 planes[i].pitch = prime.layers[layer].pitch[plane];
136 planes[i].drmFormat = drm_formats[i];
137 planes[i].modifier = QtMultimediaPrivate::DRMModifier(
138 prime.objects[prime.layers[layer].object_index[plane]].drm_format_modifier);
141 auto textureHandles = importDmaBufTextures(*rhi, eglContext, QSpan(planes, nPlanes), qtFormat,
142 frameSize(frame), shared_from_this());
143 if (!textureHandles) {
144 if (textureHandles.error() == FailureSeverity::unrecoverable) {
145 qWarning() <<
"VAAPI driver:" << vaQueryVendorString(vaDisplay);
151 return std::move(*textureHandles);
QVideoFrameTexturesHandlesUPtr createTextureHandles(AVFrame *frame) override
~VAAPITextureConverter() override