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