62 if (frame->format != AV_PIX_FMT_VAAPI || !eglContext.eglDisplay()) {
63 qCDebug(qLHWAccelVAAPI) <<
"format/egl error" << frame->format << eglContext.eglDisplay();
67 if (!frame->hw_frames_ctx)
70 auto *ctx = avFrameDeviceContext(frame);
74 auto *vaCtx = (AVVAAPIDeviceContext *)ctx->hwctx;
75 auto vaDisplay = vaCtx->display;
77 qCDebug(qLHWAccelVAAPI) <<
" no VADisplay, disabling";
81 VASurfaceID vaSurface = (uintptr_t)frame->data[3];
83 VADRMPRIMESurfaceDescriptor prime = {};
84 const auto exportStatus =
85 vaExportSurfaceHandle(vaDisplay, vaSurface, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
86 VA_EXPORT_SURFACE_READ_ONLY
88 : VA_EXPORT_SURFACE_COMPOSED_LAYERS),
90 if (exportStatus != VA_STATUS_SUCCESS) {
91 qWarning() <<
"vaExportSurfaceHandle failed:"
92 << QtMultimediaPrivate::VAStatus(exportStatus);
97 QScopeGuard closeObjectsGuard([&prime]() {
98 for (uint32_t i = 0; i < prime.num_objects; ++i)
99 close(prime.objects[i].fd);
103 vaSyncSurface(vaDisplay, vaSurface);
108 AVPixelFormat fmt = HWAccel::format(frame);
109 bool needsConversion;
110 auto qtFormat = QFFmpegVideoBuffer::toQtPixelFormat(fmt, &needsConversion);
111 QSpan<
const DRMFormat> drm_formats = QtMultimediaPrivate::dmaBufFourccFromPixelFormat(qtFormat);
112 if (drm_formats.empty() || needsConversion) {
113 qWarning() <<
"can't use DMA transfer for pixel format" << fmt << qtFormat;
117 auto *desc = QVideoTextureHelper::textureDescription(qtFormat);
118 int nPlanes =
int(drm_formats.size());
119 Q_ASSERT(nPlanes == desc->nplanes);
120 nPlanes = desc->nplanes;
123 DmaBufPlane planes[4];
124 for (
int i = 0; i < nPlanes; ++i) {
129 if (prime.layers[i].drm_format != quint32(drm_formats[i])) {
130 qWarning() <<
"expected DRM format check failed expected" << Qt::hex
131 << quint32(drm_formats[i]) <<
"got" << prime.layers[i].drm_format;
135 planes[i].fd = prime.objects[prime.layers[layer].object_index[plane]].fd;
136 planes[i].offset = prime.layers[layer].offset[plane];
137 planes[i].pitch = prime.layers[layer].pitch[plane];
138 planes[i].drmFormat = drm_formats[i];
139 planes[i].modifier = QtMultimediaPrivate::DRMModifier(
140 prime.objects[prime.layers[layer].object_index[plane]].drm_format_modifier);
143 auto textureHandles = importDmaBufTextures(*rhi, eglContext, QSpan(planes, nPlanes), qtFormat,
144 frameSize(frame), 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