From patchwork Thu Feb 24 09:53:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ingo_Br=C3=BCckl?= X-Patchwork-Id: 34512 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:d078:0:0:0:0 with SMTP id x24csp1681271nkx; Thu, 24 Feb 2022 02:07:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJwY0rkd0ixfoOYXtuKTYAIel0lVrhtcBI5yCB0mYoG6WjesFu++ybEBsPpMkp3e3TfSnk3Y X-Received: by 2002:a17:906:dfd0:b0:6ce:4226:2672 with SMTP id jt16-20020a170906dfd000b006ce42262672mr1651704ejc.141.1645697222230; Thu, 24 Feb 2022 02:07:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645697222; cv=none; d=google.com; s=arc-20160816; b=fJkqsvh9csW2ciL+yvdgN3g8hF67S8tOk6RavYb7D4F2YAncUnJ1PVGxnVqwFSrR6X jRzRsxhwZyUua+poHxan15mhWZHXpw4o9AZgvGbL8RLMqEekEIx5hqFAT82rzJpFZR1/ I4O6JzlhHsNglMkVNob8nyHc3MR7szKlsC7g6ANRLTfEcIi+fVU8zegI1/Yg+iUZ6HRz jP33kZsmP2FaRiLDmfvCbnk/pcf9zPy/zmQiaP3SGjPVIyRVraTIdia7ls8QdFdbFtH/ X04dPHXSObrrltn8SSgChI+bAN7knwavboWDpDXbhuZ9yzCBieX77D7FYjmdSLxGehLr 6VLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:date:to:from:message-id:delivered-to; bh=nWKShvy+gVYp1SkJMQISdQH0WOigS3GjjO+s1cfbtPM=; b=TXhDaRpKkQ9IUbugqfvzb74UHZTA43bmfpW4WV6UEu74SFCrihbXa7zgQ+boDxN2ou RzZUeS4cDY7MDE9tdA5F7Gf7p4k/Jmj8jcujh+IWYmtMMr5gZqWSSnNDJV4ZYHlmR/T8 E2fAEXtKfWWaGLM1lzrrD7DWm+f1qqBan3jngj1TAbdikIEkzo3HicjPtoZtUcmRfLdx kzZA8wfMDWEwOL91wWy2sgslEOsSAEXiNPbAUm/jMlQPR6ftDntFVhuCrFgQtnGf3OVs 3jFBWUmHy9CdDvQrzyC+pv+peHPcAx4s8r1YD7Z7V02hEQx3XJ4x44LbGsDxinSz0LK5 OO6Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g12si1768859edz.293.2022.02.24.02.07.01; Thu, 24 Feb 2022 02:07:02 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0F8FE68B315; Thu, 24 Feb 2022 12:06:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mob.rho.tal.de (mob.rho.tal.de [195.8.224.241]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F0E1268B2E7 for ; Thu, 24 Feb 2022 12:06:51 +0200 (EET) Received: from point.localnet (dslb-092-072-152-189.092.072.pools.vodafone-ip.de [92.72.152.189]) (Authenticated sender: ib@wtal.de) by smtp.tal.de (Postfix) with ESMTPA id F27CD85347FC; Thu, 24 Feb 2022 11:06:50 +0100 (CET) Received: from ib by point.localnet with local (masqmail 0.2.30) id 1nNB1O-0yk-00; Thu, 24 Feb 2022 11:06:50 +0100 Message-ID: <621758b7.5d043213.bm000@wupperonline.de> From: =?iso-8859-1?q?Ingo_Br=FCckl?= To: ffmpeg-devel@ffmpeg.org Date: Thu, 24 Feb 2022 10:53:35 +0100 MIME-Version: 1.0 X-Mailer: blueMail/Linux 1.5 Subject: [FFmpeg-devel] [PATCH] Re-enable support for libva v1 X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Bas Nieuwenhuizen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: rCCnMa1JYoJh FFmpeg 4.4.1 still supported libva v1, FFmpeg 5.0 does not do that anymore. If dropping support for libva v1 wasn't an intentional decision, it's easy to re-enable it. Ingo Subject: [PATCH] libavutil/hwcontext_vaapi: Re-enable support for libva v1 Commit e050959103f375e6494937fa28ef2c4d2d15c9ef implemented passing in modifiers by using the PRIME_2 memory type, which only exists in v2 of the library. To still support v1 of the library, conditionally compile using VA_CHECK_VERSION() for both the new code and the old code before the commit. --- libavutil/hwcontext_vaapi.c | 57 ++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index 994b744e4d..799490442e 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -1026,7 +1026,12 @@ static void vaapi_unmap_from_drm(AVHWFramesContext *dst_fc, static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst, const AVFrame *src, int flags) { +#if VA_CHECK_VERSION(2, 0, 0) VAAPIFramesContext *src_vafc = src_fc->internal->priv; + int use_prime2; +#else + int k; +#endif AVHWFramesContext *dst_fc = (AVHWFramesContext*)dst->hw_frames_ctx->data; AVVAAPIDeviceContext *dst_dev = dst_fc->device_ctx->hwctx; @@ -1034,10 +1039,28 @@ static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst, const VAAPIFormatDescriptor *format_desc; VASurfaceID surface_id; VAStatus vas = VA_STATUS_SUCCESS; - int use_prime2; uint32_t va_fourcc; int err, i, j; +#if !VA_CHECK_VERSION(2, 0, 0) + unsigned long buffer_handle; + VASurfaceAttribExternalBuffers buffer_desc; + VASurfaceAttrib attrs[2] = { + { + .type = VASurfaceAttribMemoryType, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypeInteger, + .value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME, + }, + { + .type = VASurfaceAttribExternalBufferDescriptor, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypePointer, + .value.value.p = &buffer_desc, + } + }; +#endif + desc = (AVDRMFrameDescriptor*)src->data[0]; if (desc->nb_objects != 1) { @@ -1072,6 +1095,7 @@ static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst, format_desc = vaapi_format_from_fourcc(va_fourcc); av_assert0(format_desc); +#if VA_CHECK_VERSION(2, 0, 0) use_prime2 = !src_vafc->prime_2_import_unsupported && desc->objects[0].format_modifier != DRM_FORMAT_MOD_INVALID; if (use_prime2) { @@ -1183,6 +1207,37 @@ static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst, &surface_id, 1, buffer_attrs, FF_ARRAY_ELEMS(buffer_attrs)); } +#else + buffer_handle = desc->objects[0].fd; + buffer_desc.pixel_format = va_fourcc; + buffer_desc.width = src_fc->width; + buffer_desc.height = src_fc->height; + buffer_desc.data_size = desc->objects[0].size; + buffer_desc.buffers = &buffer_handle; + buffer_desc.num_buffers = 1; + buffer_desc.flags = 0; + + k = 0; + for (i = 0; i < desc->nb_layers; i++) { + for (j = 0; j < desc->layers[i].nb_planes; j++) { + buffer_desc.pitches[k] = desc->layers[i].planes[j].pitch; + buffer_desc.offsets[k] = desc->layers[i].planes[j].offset; + ++k; + } + } + buffer_desc.num_planes = k; + + if (format_desc->chroma_planes_swapped && + buffer_desc.num_planes == 3) { + FFSWAP(uint32_t, buffer_desc.pitches[1], buffer_desc.pitches[2]); + FFSWAP(uint32_t, buffer_desc.offsets[1], buffer_desc.offsets[2]); + } + + vas = vaCreateSurfaces(dst_dev->display, format_desc->rt_format, + src->width, src->height, + &surface_id, 1, + attrs, FF_ARRAY_ELEMS(attrs)); +#endif if (vas != VA_STATUS_SUCCESS) { av_log(dst_fc, AV_LOG_ERROR, "Failed to create surface from DRM " "object: %d (%s).\n", vas, vaErrorStr(vas));