From patchwork Wed Sep 18 07:10:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51638 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp727704vqb; Wed, 18 Sep 2024 00:08:19 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWeAAGg95XSs1uWARqNG8JchQGoyuvo+ydIpUNk643ctvQcqU8aWsrY1gvCff6fTQVULsGR+nRFGe8ugqg47TQ8@gmail.com X-Google-Smtp-Source: AGHT+IHQgnqa3YKP7SM+oGGfB8Cxb9TS4j/yTFbCahv7IcDTsP4AdrkGRMz5ldREP41kwY2hSbQ0 X-Received: by 2002:a05:6402:35d3:b0:5c4:4fcb:92fc with SMTP id 4fb4d7f45d1cf-5c44fcb9301mr1777499a12.24.1726643299121; Wed, 18 Sep 2024 00:08:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643299; cv=none; d=google.com; s=arc-20240605; b=DVO9pbzjL9Cz+L6P5ESlakxrvUhyi0q/7BrGvoLehveJiZ/EDiFuc7QgOwS4utw3g+ ZB5JET87D34tFh27mEvYMdgaU0ckVAZ95o1FlfS+b5nyLBytNqp9r960nsx1j+h8Zf7m C1rzooVQsLdnBVmwkQli7g7FqmbRGLBebJMJKCWVq/0vlk0SZq23ubvC2HmZwZ7atIcy 6HsD1fkcr22yModxCrdzfK8sF67/1DM1WCZ4PXecLAhwS6G4YolzDvtCwmLjni8UoLEf sM8x2GKiarsWeCty6stegtmBOztgLdcl/9PMnVO14B1DI0KMqmjEnTE0ZO6kxt2+8Oxy TG8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=AduonBz9D2mMGqM1xUrweKECSs02cEuprE1Bd7VOfhM=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=XvlKNH7f2G5LgLemi4C0K2Iojc+sXo8WKb/oErNZBfyowREQF8SdLD9K6Oecg0t13r 30kqDB3gKO8MmD6r94c6W7GqDeqiVvbpnDMC/1dD/z3r2b80yvxRq//A6VfzGVsMBP4P obLoaI6aoo81zY6JZTrwzF59z0E924XjKT6idKmtcqZPHwCXJiLmgU1VAST8G51l4Rvy h2QstMP+q1kSlmqTpr6PZ7T1AktiUfjCW8OW7cI/xGCwfA1AGMClOboImPeK00+ZHxHa Ift2kvmiIBWEOHlddFNAiCGB+iUrLmJHUHrrRAnrMjcM+MqMfn29kLUQio6FlII8Xc+7 x1og==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=KdfVP18h; 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 4fb4d7f45d1cf-5c42bcad981si6320569a12.614.2024.09.18.00.08.18; Wed, 18 Sep 2024 00:08:19 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=KdfVP18h; 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 9ECEE68DCA1; Wed, 18 Sep 2024 10:08:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7AF9568B32F for ; Wed, 18 Sep 2024 10:08:08 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643294; x=1758179294; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=S3iXMPxZJvszjtcI4nKdHBlk69PK9cGh0jaO0+deqrQ=; b=KdfVP18hLlWa6xY5d+kyGPkQZH4FD5keQapb1SfUDSjpWmipz+FVzBSA zYC1CKza8DdSiiRxmaKmt6kjsdJnEyEqUlvUoD/alHlVxCRDq/fNz0fOJ TOSXvRn8nC6YTeD5zd30e2ENZwnB2w8Xmn66H8jbfE307i19cI2aKwtLE OU26kVWs+c05Gyh0bHDoo+Fa5r3z0EiTnzRzflydymcSZWMEICtY6MZx5 L76o0FDdrNd1JwKOrHkDKgf1m5HMo6lvO4CROMXhNMiQYHSoiV5kH+ers EcExxNmOFZ7rt5M8fmmF5yA/ihepQvULwkDEhomPtZXqONYPkFz19ACXT A==; X-CSE-ConnectionGUID: hyH/UMfARGSNQ6YeT9HXBQ== X-CSE-MsgGUID: uYKFnr2fQeC1CiAMAh/l7A== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695715" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695715" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:06 -0700 X-CSE-ConnectionGUID: zLstBEunTbKTWfMKGROSog== X-CSE-MsgGUID: wzxnhNocRYi5L9IupyBbPw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452233" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:05 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:24 +0800 Message-Id: <20240918071031.1377336-1-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/8] lavc/vaapi_dec: Create VA parameters dynamically 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: B+92pqRUSDPF From: Fei Wang Signed-off-by: Fei Wang --- libavcodec/vaapi_decode.c | 34 +++++++++++++++++++++++++--------- libavcodec/vaapi_decode.h | 7 ++----- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c index a59194340f..709699dcaf 100644 --- a/libavcodec/vaapi_decode.c +++ b/libavcodec/vaapi_decode.c @@ -39,12 +39,24 @@ int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx, { VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data; VAStatus vas; - VABufferID buffer; - av_assert0(pic->nb_param_buffers + 1 <= MAX_PARAM_BUFFERS); + av_assert0(pic->nb_param_buffers <= pic->nb_param_buffers_allocated); + if (pic->nb_param_buffers == pic->nb_param_buffers_allocated) { + VABufferID *tmp = + av_realloc_array(pic->param_buffers, + pic->nb_param_buffers_allocated + 16, + sizeof(*pic->param_buffers)); + if (!tmp) + return AVERROR(ENOMEM); + + pic->param_buffers = tmp; + pic->nb_param_buffers_allocated += 16; + } + av_assert0(pic->nb_param_buffers + 1 <= pic->nb_param_buffers_allocated); vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, - type, size, 1, (void*)data, &buffer); + type, size, 1, (void*)data, + &pic->param_buffers[pic->nb_param_buffers]); if (vas != VA_STATUS_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Failed to create parameter " "buffer (type %d): %d (%s).\n", @@ -52,14 +64,14 @@ int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx, return AVERROR(EIO); } - pic->param_buffers[pic->nb_param_buffers++] = buffer; - av_log(avctx, AV_LOG_DEBUG, "Param buffer (type %d, %zu bytes) " - "is %#x.\n", type, size, buffer); + "is %#x.\n", type, size, pic->param_buffers[pic->nb_param_buffers]); + + ++pic->nb_param_buffers; + return 0; } - int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx, VAAPIDecodePicture *pic, const void *params_data, @@ -222,7 +234,9 @@ fail: ff_vaapi_decode_destroy_buffers(avctx, pic); fail_at_end: exit: - pic->nb_param_buffers = 0; + pic->nb_param_buffers = 0; + pic->nb_param_buffers_allocated = 0; + av_freep(&pic->param_buffers); pic->nb_slices = 0; pic->slices_allocated = 0; av_freep(&pic->slice_buffers); @@ -235,7 +249,9 @@ int ff_vaapi_decode_cancel(AVCodecContext *avctx, { ff_vaapi_decode_destroy_buffers(avctx, pic); - pic->nb_param_buffers = 0; + pic->nb_param_buffers = 0; + pic->nb_param_buffers_allocated = 0; + av_freep(&pic->param_buffers); pic->nb_slices = 0; pic->slices_allocated = 0; av_freep(&pic->slice_buffers); diff --git a/libavcodec/vaapi_decode.h b/libavcodec/vaapi_decode.h index 702171e108..a373eb5d6b 100644 --- a/libavcodec/vaapi_decode.h +++ b/libavcodec/vaapi_decode.h @@ -32,15 +32,12 @@ static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic) return (uintptr_t)pic->data[3]; } -enum { - MAX_PARAM_BUFFERS = 16, -}; - typedef struct VAAPIDecodePicture { VASurfaceID output_surface; int nb_param_buffers; - VABufferID param_buffers[MAX_PARAM_BUFFERS]; + VABufferID *param_buffers; + int nb_param_buffers_allocated; int nb_slices; VABufferID *slice_buffers; From patchwork Wed Sep 18 07:10:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51639 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp727773vqb; Wed, 18 Sep 2024 00:08:30 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW/JpPNlTKuTzvMCJvh/71ICDRanZqUwsCOdw3x0QvttcmtYUE0C/vK7wPMyNGlN/WbykuV1yVno+3IYWYaoTNS@gmail.com X-Google-Smtp-Source: AGHT+IENzyp9lsUaF/DWLKZCArZ4krG/OakuvlvOcZ3EMnTD9tGcUmhviNNlvSrEvS4+0NgRvYVC X-Received: by 2002:a05:6000:bd2:b0:374:c512:87ce with SMTP id ffacd0b85a97d-378d61f0beemr14518789f8f.30.1726643310070; Wed, 18 Sep 2024 00:08:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643310; cv=none; d=google.com; s=arc-20240605; b=NbCFXx7dPKORFdgdwexf/RC5xDG4cqZzYjL9zfYzduV4zmg8LjBZwj38ZZdlQtwcl6 GvnKpyh5hbb9CdQR+aeWIhVDvNZBrAoHK3gIIhaAuZ4OznRjQZH6+/hyFxSF4+haqBI0 yaxyatr9wZjA+OCvD7vSWSZ/9HsBnvVP79PAie1MHiPpGQcFdUFyKJ4RyQvsCJJxuuBx D2izrCVzJbQGfY1XpVPJ7vmFKEedBGt1As7VT4v2aeywloheVXOQFyb32E3dsX07cZs3 J/U2KWwVz1fO14UiBf40lNBoe0E36CPnRkFEw45fSKDCG7W1wqgHYKizdwN5pQxoApon zoog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=2MNdDttoKr+JgFokbJdhWR/S2I0kXUO3+qz6DqI3YAY=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=CWLKWk1MJJ5JGCf4cM7S8xhwP09djThpMvvWMp7nzVcmqzhsy97HlCRGU/kKx/p4ES YNNkpQ1Zax2V/VJuEhgZ/4LpLeNpGuCEedneyYgVBLQBYzTPQIhSt+8pZRAua2Y6gydm v4+o61uX3MKFmgQE6Ti7FxbhcSwZ7vnhXrpvDtQYBYs52dAU+2RdyHhw6MXudTfM5n4Q sHukmQsgu84HLeKcU5RXpe2F46qJ3xMZluN4BntFVN0L2YT8GmvImPH1JuK7G1acuqkY fjlsnoeT0Jl17kOT8i9xrcpQaRCY/X0xMvGNsmhOVLfP7iag1Rn54eKaksphVnUe6Qe4 Tbmw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=d5XiK9Ig; 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 a640c23a62f3a-a90612ef5ecsi612439566b.667.2024.09.18.00.08.29; Wed, 18 Sep 2024 00:08:30 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=d5XiK9Ig; 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 D639668DCAD; Wed, 18 Sep 2024 10:08:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E6D4568DCA3 for ; Wed, 18 Sep 2024 10:08:10 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643297; x=1758179297; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IrO3rgiaATFCBMWE8x0XGUgX9cB++vIZ1AeoG4bfn3A=; b=d5XiK9IgQjLuxaZwb29aIeYB246JlJxuST2XIOrXenBkrmK2GxO6WK1A Mq5imRMu+bhRH3X0JAtpFsomPMeWgpPgAHBaw/sYMRUxRamummWbkdrHH gqUpopHZTpmOK4a2oR8fh/ezQotQoXTKy+HZYIj80HLzr4wPj18J5aZzy o/BiW/LZMbAp64Su1BgciH/J/NAnxTbYCiWzBOi3UxKrsyKhkLBOx7lb2 IQ8VBVNeL2w/MzGYIHtx0xDDY1jDakrRK+8VFeLtvFerwMmBbgBs9xZcI mDH3pgzg2tGP++9c7zksCLauP7FqnyExNVGwZDzcQ9k+z4P4IGpfCMfdp g==; X-CSE-ConnectionGUID: iELr4SONS86/c7st1UglGQ== X-CSE-MsgGUID: u/MxUyP/RR6yjvnau6b0Gw== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695716" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695716" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:07 -0700 X-CSE-ConnectionGUID: XHZjl6+qR+q9hH7gGWvRdg== X-CSE-MsgGUID: avPrLEVhS+SnE+MnsGsm7A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452239" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:06 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:25 +0800 Message-Id: <20240918071031.1377336-2-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/8] lavc/vaapi_decode: Use a more meaningful variable name 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5xL4KpcBivvY From: Fei Wang Signed-off-by: Fei Wang --- libavcodec/vaapi_decode.c | 20 ++++++++++---------- libavcodec/vaapi_decode.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c index 709699dcaf..7753f72106 100644 --- a/libavcodec/vaapi_decode.c +++ b/libavcodec/vaapi_decode.c @@ -84,19 +84,19 @@ int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx, VAStatus vas; int index; - av_assert0(pic->nb_slices <= pic->slices_allocated); - if (pic->nb_slices == pic->slices_allocated) { + av_assert0(pic->nb_slices <= pic->nb_slice_buffers_allocated); + if (pic->nb_slices == pic->nb_slice_buffers_allocated) { VABufferID *tmp = av_realloc_array(pic->slice_buffers, - pic->slices_allocated ? pic->slices_allocated * 2 : 64, + pic->nb_slice_buffers_allocated ? pic->nb_slice_buffers_allocated * 2 : 64, 2 * sizeof(*pic->slice_buffers)); if (!tmp) return AVERROR(ENOMEM); - pic->slice_buffers = tmp; - pic->slices_allocated = pic->slices_allocated ? pic->slices_allocated * 2 : 64; + pic->slice_buffers = tmp; + pic->nb_slice_buffers_allocated = pic->nb_slice_buffers_allocated ? pic->nb_slice_buffers_allocated * 2 : 64; } - av_assert0(pic->nb_slices + 1 <= pic->slices_allocated); + av_assert0(pic->nb_slices + 1 <= pic->nb_slice_buffers_allocated); index = 2 * pic->nb_slices; @@ -237,8 +237,8 @@ exit: pic->nb_param_buffers = 0; pic->nb_param_buffers_allocated = 0; av_freep(&pic->param_buffers); - pic->nb_slices = 0; - pic->slices_allocated = 0; + pic->nb_slices = 0; + pic->nb_slice_buffers_allocated = 0; av_freep(&pic->slice_buffers); return err; @@ -252,8 +252,8 @@ int ff_vaapi_decode_cancel(AVCodecContext *avctx, pic->nb_param_buffers = 0; pic->nb_param_buffers_allocated = 0; av_freep(&pic->param_buffers); - pic->nb_slices = 0; - pic->slices_allocated = 0; + pic->nb_slices = 0; + pic->nb_slice_buffers_allocated = 0; av_freep(&pic->slice_buffers); return 0; diff --git a/libavcodec/vaapi_decode.h b/libavcodec/vaapi_decode.h index a373eb5d6b..7813473c98 100644 --- a/libavcodec/vaapi_decode.h +++ b/libavcodec/vaapi_decode.h @@ -41,7 +41,7 @@ typedef struct VAAPIDecodePicture { int nb_slices; VABufferID *slice_buffers; - int slices_allocated; + int nb_slice_buffers_allocated; } VAAPIDecodePicture; typedef struct VAAPIDecodeContext { From patchwork Wed Sep 18 07:10:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51640 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp727872vqb; Wed, 18 Sep 2024 00:08:40 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUloNVSaIzMTWDDo7NiALAaMPNzv9Em4zx9Mq3eL8f8yw+pi7tGd0sTXXQROxaqzpyzasWukenwVz9N5WWYu7Zz@gmail.com X-Google-Smtp-Source: AGHT+IE2toRPPJ8emy83dZj7QLGYRyXeGv+HV7pqlQJ/mipBewjOE73w4kB121QtB1zzkhQy9Cii X-Received: by 2002:a17:906:c151:b0:a86:88f7:679c with SMTP id a640c23a62f3a-a90296182d3mr2330399066b.41.1726643320154; Wed, 18 Sep 2024 00:08:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643320; cv=none; d=google.com; s=arc-20240605; b=kEdRUj/mW6ome8nWnNcD25A6yO831qLBof2OBZBtV20Ajbbt60w6nCqk7hsoztvqJ9 DZCzBTFOkzfMEiq6xaviJGzLOVLkm1cshmy4ObiPKk+XpcPMma2mjaZPREp2TKj/C77w c0WQkpjszb6VcxO3zk8+KWuzcpGr/YoNDccAiw/UNyM0INOVs2uvohlX6wWXTYkytNkJ NyR/QLi+yTvetFCyIsUaf8PweLVzFZFfridaujpkOvcTdV7wRwg1Yn5RS5PDdnKqvrLV YUGhZiuBbvAEC+5/QlbYmHz+7cvcEcTdchrbtYcscMiOZ7pavI2Q4gDOVd3ayp3b6ttQ acKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=a0jPI3rDfP9dZIFcsQqsLfu4jhrERDLI+dsb5OyyhJM=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=LDNW9ilMfSahd+nJ97UHHvA3aw1VWErqPLUtLLaWzHGy06KENw10I0B254Fczln7Ln V/rX5GBpFNp8thXXmDiL2xyfX6RSh/+6ZeUkk4cp9hg70LCfrPzoISgA4L1tW7WybGLf ocaO4opjl7qBUD0cMOJVvtB8AgmaRLU39l1jFgBg742Nl4gR+qmisiqcdEt7BbYx2Np6 Rc29F7/WE380RyceP5RDZVnCsn6614T/QGud/YzTdblr9K5EtEr34vEHtJrXig6TOTcS L4DzCHZkoyqZsecsyMXZhYlZqN7obA6vBcxfJQ4AMETrbnRXzc7ZVJpKdmf+QQH5Y58e SUJw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=EsuE6ttw; 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 a640c23a62f3a-a90612efc0dsi637804766b.573.2024.09.18.00.08.39; Wed, 18 Sep 2024 00:08:40 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=EsuE6ttw; 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 F239268DCC3; Wed, 18 Sep 2024 10:08:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2A3CA68D72C for ; Wed, 18 Sep 2024 10:08:11 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643298; x=1758179298; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=983Vj2YaUC9uNdQJxVsMvXy7MY8xNrifbPBKUGMJvNc=; b=EsuE6ttwjBlr/9fOMJfV7vAyxgklic5EX98Amd1isQsGFpH0B3CJQPH6 Cd00iwBxRfrMTs0zkRCZYSawQhuM4Mx+v0L84FN4BAU9oMFJQrH5+lwUY BbNZTpKwT4kQdOu5fqZoyd6xEB2v397Xqe5lH87yMpg0xRBa4MDAQOlUm 8CAjdgVWONCcb/VM9a4vhS0k9wBzd26Q3gueWuEAgqQSQ+XadINWagwQU CS0+aUf7oelmEfZf1KKV9wupUkuBM+har5nYWxnczHazM0+g6TnwPs75I LTJ+sVDJrbikIT6nAoO1tHiKFlY7eRvYsjRo4hkNRhxERmqeBLqgKqv28 Q==; X-CSE-ConnectionGUID: CQiCLSafR72/AtKvXTa4Bg== X-CSE-MsgGUID: 8nO6Yw5CSAeX2kML4z/Rtw== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695717" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695717" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:08 -0700 X-CSE-ConnectionGUID: dK8Sf20JQJK0Us7YJioMIw== X-CSE-MsgGUID: ar3kMjwTTGaxNY1F4bhERQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452247" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:07 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:26 +0800 Message-Id: <20240918071031.1377336-3-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 3/8] lavc/cbs_h266: Add SliceTopLeftTileIdx to H266RawPPS 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ol+EHQNzYfcR From: Fei Wang Signed-off-by: Fei Wang --- libavcodec/cbs_h266.h | 1 + libavcodec/cbs_h266_syntax_template.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/libavcodec/cbs_h266.h b/libavcodec/cbs_h266.h index d24a8e9313..7f0e537b31 100644 --- a/libavcodec/cbs_h266.h +++ b/libavcodec/cbs_h266.h @@ -593,6 +593,7 @@ typedef struct H266RawPPS { uint16_t sub_pic_id_val[VVC_MAX_SLICES]; ///< SubpicIdVal uint16_t col_width_val[VVC_MAX_TILE_COLUMNS]; ///< ColWidthVal uint16_t row_height_val[VVC_MAX_TILE_ROWS]; ///< RowHeightVal + uint16_t slice_top_left_tile_idx[VVC_MAX_SLICES]; } H266RawPPS; typedef struct H266RawAPS { diff --git a/libavcodec/cbs_h266_syntax_template.c b/libavcodec/cbs_h266_syntax_template.c index a8f5af04d0..2e20119cc6 100644 --- a/libavcodec/cbs_h266_syntax_template.c +++ b/libavcodec/cbs_h266_syntax_template.c @@ -1974,6 +1974,7 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw, else infer(pps_tile_idx_delta_present_flag, 0); for (i = 0; i < current->pps_num_slices_in_pic_minus1; i++) { + current->slice_top_left_tile_idx[i] = tile_idx; tile_x = tile_idx % current->num_tile_columns; tile_y = tile_idx / current->num_tile_columns; if (tile_x != current->num_tile_columns - 1) { @@ -2056,6 +2057,8 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw, } num_slices_in_tile = j; } + for (int k = 0; k < num_slices_in_tile; k++) + current->slice_top_left_tile_idx[i + k] = tile_idx; i += num_slices_in_tile - 1; } else { uint16_t height = 0; @@ -2099,6 +2102,7 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw, if (i == current->pps_num_slices_in_pic_minus1) { uint16_t height = 0; + current->slice_top_left_tile_idx[i] = tile_idx; tile_x = tile_idx % current->num_tile_columns; tile_y = tile_idx / current->num_tile_columns; if (tile_y >= current->num_tile_rows) From patchwork Wed Sep 18 07:10:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51643 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp732210vqb; Wed, 18 Sep 2024 00:19:17 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXUWxi214fcFhysJpw7zYkuBwY3W5nqpcUMekOT+MAOT8Ll5MbkPHrzq7ws3SqUfrumueXZdFd0tunyEApI2GPl@gmail.com X-Google-Smtp-Source: AGHT+IE02rob2ZtG7LgzBRyWMNHhxvanAJRm1AkQwseXr/1AAOl35EHCE6sF7Gt5Rop44DnSNDSn X-Received: by 2002:a05:6512:3d93:b0:52e:7f6b:5786 with SMTP id 2adb3069b0e04-53678ff8a54mr10315425e87.61.1726643956756; Wed, 18 Sep 2024 00:19:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643956; cv=none; d=google.com; s=arc-20240605; b=IbPEoGBN5CllXWzNIq3RN9X2nyJiD+dZ4e+XkQGkVKnc+khhNQWzBUkZulThywJPro 0QfEKNcjtJfGeeGgkasm64jnU51Hkk8lZyFA62573s7izOTdaJkn3Md3yrcQDwqb7V8o GQ+1j/mSQ5KYf/mJq9yMt6JD2OQn1nC++l7nICWe9XPc6+QHQPt+Hl1OYw4YDmKOWTP5 N2UdXiFpWFQ9BqqgLtmSch6Zjg2/X2WR86e7UBdQyqzyKHzd2l7LxiUjW/5PPlZYEcV/ 34I2YsuNn/KecGT4HBUKZ9USiq0H3X4DPfYpUgSkFenxfghEYYpNo4g2DButoe0dFXyX BHWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=ocFap6JnksnlLy6AsLOhuI8nGhrYUIjbPwO496pDgeM=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=BZoOIDXzoKH6Ue8/rIBOQNMCG84d0wo+YTWySbbzSYVh7OeB42lMvvuOLYP/UwYZx0 CXRNy2o2YmZiuV7Lk00YMyqU3lHMk+1cZR+lrWefM+HhfCTspcI9oButqsMWRCmZMwqd FKSj4Dv2jkwxTkl+4N9tLBU4MdrAqH6Xu7hhbVk+rL7oVLv2LDicCIl2g4Jgob4BObal 5pMwb1yqg5PIKz1FwFzk+WJLm6pmBQk0Pki8p5hSwavjrnkjh1E8dUZYrOfhs37r3uZo tGvkZ2uU7lldFc4s33kKcaHderyiQt1m80nItR9mDIl3Of4UI3ljbPk2VHu06rxk15LG 76LA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=LNY7rfS9; 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 4fb4d7f45d1cf-5c42bb50e41si6480441a12.117.2024.09.18.00.19.15; Wed, 18 Sep 2024 00:19:16 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=LNY7rfS9; 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 06A2568DCCE; Wed, 18 Sep 2024 10:08:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 608A468DCCA for ; Wed, 18 Sep 2024 10:08:14 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643300; x=1758179300; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=K0CCWmdMgYENqXSMnfd5a+qp3Ql8qgg/ajiOjgvPxDQ=; b=LNY7rfS9f+PKvmzcHnfmBwwnYxMR2lcuZVFjb2bkLEzz1WCdqJJiEuVn IwuHM7N02ZBRuN4fNBCwse8IBv6IGCNp04lLx59XB/8tA+Pdbz4icKlDd K0+ctJSe6Sdw9QeQqQjvU+IGW6V72iXRyDZqDKterhrN6hp5Nrr8J7w4I 7hqLtoJ6a88tezVg3avVoVfnV0evLskkB6qHE5VeX9BBTv6pMxW6R553B 3WI0pvGE4l1dLZQ5Gd42o540DCxHt+sP9MzFDj9LmmrfjUfszK/KPLdbb NAdIhCx/s7ejwGNB556outUPUTtxM3E3MoFRHalMayMOsTminxRp0ABeR A==; X-CSE-ConnectionGUID: TueDcUM0R6+l0FaY7xcW3g== X-CSE-MsgGUID: FaUbZQRzRTCNBXhr7N2F+A== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695718" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695718" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:10 -0700 X-CSE-ConnectionGUID: +9LpPRfbQmWbtzfYfmp7Rw== X-CSE-MsgGUID: NnscMZbrSXil3kLZFFSL1A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452258" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:08 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:27 +0800 Message-Id: <20240918071031.1377336-4-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 4/8] lavc/cbs_h266: Add NumSlicesInTile to H266RawPPS 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: sZVCPsm8oZ1v From: Fei Wang Signed-off-by: Fei Wang --- libavcodec/cbs_h266.h | 1 + libavcodec/cbs_h266_syntax_template.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/libavcodec/cbs_h266.h b/libavcodec/cbs_h266.h index 7f0e537b31..67a3ff6151 100644 --- a/libavcodec/cbs_h266.h +++ b/libavcodec/cbs_h266.h @@ -594,6 +594,7 @@ typedef struct H266RawPPS { uint16_t col_width_val[VVC_MAX_TILE_COLUMNS]; ///< ColWidthVal uint16_t row_height_val[VVC_MAX_TILE_ROWS]; ///< RowHeightVal uint16_t slice_top_left_tile_idx[VVC_MAX_SLICES]; + uint16_t num_slices_in_tile[VVC_MAX_SLICES]; } H266RawPPS; typedef struct H266RawAPS { diff --git a/libavcodec/cbs_h266_syntax_template.c b/libavcodec/cbs_h266_syntax_template.c index 2e20119cc6..a6d926052d 100644 --- a/libavcodec/cbs_h266_syntax_template.c +++ b/libavcodec/cbs_h266_syntax_template.c @@ -2005,14 +2005,13 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw, if (current->pps_slice_width_in_tiles_minus1[i] == 0 && current->pps_slice_height_in_tiles_minus1[i] == 0 && current->row_height_val[tile_y] > 1) { - int num_slices_in_tile, - uniform_slice_height, remaining_height_in_ctbs_y; + int uniform_slice_height, remaining_height_in_ctbs_y; remaining_height_in_ctbs_y = current->row_height_val[tile_y]; ues(pps_num_exp_slices_in_tile[i], 0, current->row_height_val[tile_y] - 1, 1, i); if (current->pps_num_exp_slices_in_tile[i] == 0) { - num_slices_in_tile = 1; + current->num_slices_in_tile[i] = 1; current->slice_height_in_ctus[i] = current->row_height_val[tile_y]; slice_top_left_ctu_x[i] = ctu_x; slice_top_left_ctu_y[i] = ctu_y; @@ -2055,14 +2054,18 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw, slice_top_left_ctu_y[i + j] = ctu_y; j++; } - num_slices_in_tile = j; + current->num_slices_in_tile[i] = j; } - for (int k = 0; k < num_slices_in_tile; k++) + for (int k = 0; k < current->num_slices_in_tile[i]; k++) current->slice_top_left_tile_idx[i + k] = tile_idx; - i += num_slices_in_tile - 1; + i += current->num_slices_in_tile[i] - 1; } else { uint16_t height = 0; infer(pps_num_exp_slices_in_tile[i], 0); + if (current->pps_slice_width_in_tiles_minus1[i] == 0 && + current->pps_slice_height_in_tiles_minus1[i] == 0) + current->num_slices_in_tile[i] = 1; + for (j = 0; j <= current->pps_slice_height_in_tiles_minus1[i]; j++) { @@ -2103,6 +2106,7 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw, uint16_t height = 0; current->slice_top_left_tile_idx[i] = tile_idx; + current->num_slices_in_tile[i] = 1; tile_x = tile_idx % current->num_tile_columns; tile_y = tile_idx / current->num_tile_columns; if (tile_y >= current->num_tile_rows) From patchwork Wed Sep 18 07:10:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51642 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp732180vqb; Wed, 18 Sep 2024 00:19:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU/2sQEFRUR7DpzMTM1HQ8z0vuLQGjDAkUhOzevhbSELjHJmj3zRT0+rqDI52xlWQ9dLu2ELk0VWNWqC7X5wgiS@gmail.com X-Google-Smtp-Source: AGHT+IHVdWpZIsx9kKOX4iLWIVxKL/HlGRK07YuU7RvDvsqQXJPmi61sVaqHTWtdsvzWwFao6NlK X-Received: by 2002:a17:907:749:b0:a90:b73f:61d1 with SMTP id a640c23a62f3a-a90b73f6409mr85001766b.51.1726643951682; Wed, 18 Sep 2024 00:19:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643951; cv=none; d=google.com; s=arc-20240605; b=jLLELXgyT2sbU90gUhc8vgYLTlrxJJtP5FPkgczuAw8x15/FttSXfQh9PJ1+BD7fIR jn0YgQm/r+u9pvzgaLogxkgPBM2+A7yHeZHJDojnFxho5obSDf05C/Hc87yE7PqnNov8 3Ontxgoo4gqIzMlIr2oKrqsxz9mT5acY14TzL1pA7lb3stUJ+asGVxjN0pb9MmlbvKa1 cb06yBJNmTMG8asuUZ0WB/KqtvEqkj0PPxL2F5Nwb5YzBzJe5125P7OKG2rFAoyZEJ9w q/EMigYaG3omLC8/Ssir5SlnoYdT3p4d/8F+6EiQJHij3ugNr3mjkWxHKs/1a7YzSmg4 KCYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=Wbjp81Hf+TxC/6mZPjibNxt/Vcfdu+tDEc9PKp3IX2o=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=iUj4lcGJcdoWLx659ibZl/l1u4jykO5zbnrg5r8EZT3fgDv86DU5GvO54DUJWY+fM4 B7b0nzNcM9fbKcpZfPjYpWwGdCpuHNZeY0FSZOW4YP5+/k19TjXyBsx57unMeN66MPsz /nZYBvdjx+/+AbBd6Pd33OsX5FWQBG3zo/8f338u6zVEczme84eDTWTxh3229u7D+zJR +dX1001gNc5fPIx+NLiyco6uPNnyApgX9CTGx3wQ14Gn6ZRxL65l/Lm8qNJSdkkTcnqd Kc8r2YPP3NB91+WARFUZtBhoFywAUOMjDOg/8uHSwKm7Ks7kku8pNZF4rkubsERIpwS2 AtLw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=JLW2ptxd; 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 a640c23a62f3a-a90613731f1si597740866b.982.2024.09.18.00.19.11; Wed, 18 Sep 2024 00:19:11 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=JLW2ptxd; 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 2302568DD12; Wed, 18 Sep 2024 10:08:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7962568DCCA for ; Wed, 18 Sep 2024 10:08:16 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643301; x=1758179301; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=nP5IRQpfdWMnRwHlEU4MlIYq0bWJ4KUMQGbvmPFIybA=; b=JLW2ptxdALPvemZmR4SnPQgdhfhz6KPNER46luk7H5zY9h5fNQV+WzNa IpSTFJ1dUMuQIQepUiV9XYFUqMoF88UeEUE0vy7Y4kYDsQG2QZN0/LhlK I3OntpVVKIVWstC5kklYsvgGc+f4l904FvGs6h/REVE+LhrWZl2FuTNJ1 sIokJWqAOxn6Le0cmtUAKOTAxi8Qu0fSocwxD1GNT79UIsso17Eyz53dI 0lcFCoqUuQMpMrOfpQ2IdUy+DbPMoM32B0l1tcEODEZBVQDde+zwJP+R1 x5Lpyp3WaNogBLaDlx+DK03O06BrC+t291+nmEvL6Tl9uMDYwZKt8+UDy A==; X-CSE-ConnectionGUID: zZMPFOduSCi7MSUU+j3uoA== X-CSE-MsgGUID: TwQuEIbLSWm9oMGMgM6HjQ== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695720" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695720" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:11 -0700 X-CSE-ConnectionGUID: qqOLiv45SKqJyDlFYIax9g== X-CSE-MsgGUID: 3Ol10rGiQWitjoAL9qA5cQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452266" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:10 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:28 +0800 Message-Id: <20240918071031.1377336-5-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 5/8] lavc/vvc_refs: Define FF_VVC_FRAME_FLAG* to h header 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: oGqzyoGlzlNP From: Fei Wang So that hardware decoder can use the flags too. Signed-off-by: Fei Wang --- libavcodec/vvc/refs.c | 38 +++++++++++++++++--------------------- libavcodec/vvc/refs.h | 5 +++++ 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c index 133ff9eaba..3e5573df29 100644 --- a/libavcodec/vvc/refs.c +++ b/libavcodec/vvc/refs.c @@ -29,10 +29,6 @@ #include "refs.h" -#define VVC_FRAME_FLAG_OUTPUT (1 << 0) -#define VVC_FRAME_FLAG_SHORT_REF (1 << 1) -#define VVC_FRAME_FLAG_LONG_REF (1 << 2) -#define VVC_FRAME_FLAG_BUMPING (1 << 3) typedef struct FrameProgress { atomic_int progress[VVC_PROGRESS_LAST]; @@ -80,7 +76,7 @@ void ff_vvc_clear_refs(VVCFrameContext *fc) { for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) ff_vvc_unref_frame(fc, &fc->DPB[i], - VVC_FRAME_FLAG_SHORT_REF | VVC_FRAME_FLAG_LONG_REF); + FF_VVC_FRAME_FLAG_SHORT_REF | FF_VVC_FRAME_FLAG_LONG_REF); } void ff_vvc_flush_dpb(VVCFrameContext *fc) @@ -191,12 +187,12 @@ int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext *fc, AVFrame **frame) fc->ref = ref; if (s->no_output_before_recovery_flag && (IS_RASL(s) || !GDR_IS_RECOVERED(s))) - ref->flags = VVC_FRAME_FLAG_SHORT_REF; + ref->flags = FF_VVC_FRAME_FLAG_SHORT_REF; else if (ph->r->ph_pic_output_flag) - ref->flags = VVC_FRAME_FLAG_OUTPUT | VVC_FRAME_FLAG_SHORT_REF; + ref->flags = FF_VVC_FRAME_FLAG_OUTPUT | FF_VVC_FRAME_FLAG_SHORT_REF; if (!ph->r->ph_non_ref_pic_flag) - ref->flags |= VVC_FRAME_FLAG_SHORT_REF; + ref->flags |= FF_VVC_FRAME_FLAG_SHORT_REF; ref->poc = poc; ref->sequence = s->seq_decode; @@ -219,16 +215,16 @@ int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *out, const if (no_output_of_prior_pics_flag) { for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) { VVCFrame *frame = &fc->DPB[i]; - if (!(frame->flags & VVC_FRAME_FLAG_BUMPING) && frame->poc != fc->ps.ph.poc && + if (!(frame->flags & FF_VVC_FRAME_FLAG_BUMPING) && frame->poc != fc->ps.ph.poc && frame->sequence == s->seq_output) { - ff_vvc_unref_frame(fc, frame, VVC_FRAME_FLAG_OUTPUT); + ff_vvc_unref_frame(fc, frame, FF_VVC_FRAME_FLAG_OUTPUT); } } } for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) { VVCFrame *frame = &fc->DPB[i]; - if ((frame->flags & VVC_FRAME_FLAG_OUTPUT) && + if ((frame->flags & FF_VVC_FRAME_FLAG_OUTPUT) && frame->sequence == s->seq_output) { nb_output++; if (frame->poc < min_poc || nb_output == 1) { @@ -247,10 +243,10 @@ int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *out, const VVCFrame *frame = &fc->DPB[min_idx]; ret = av_frame_ref(out, frame->frame); - if (frame->flags & VVC_FRAME_FLAG_BUMPING) - ff_vvc_unref_frame(fc, frame, VVC_FRAME_FLAG_OUTPUT | VVC_FRAME_FLAG_BUMPING); + if (frame->flags & FF_VVC_FRAME_FLAG_BUMPING) + ff_vvc_unref_frame(fc, frame, FF_VVC_FRAME_FLAG_OUTPUT | FF_VVC_FRAME_FLAG_BUMPING); else - ff_vvc_unref_frame(fc, frame, VVC_FRAME_FLAG_OUTPUT); + ff_vvc_unref_frame(fc, frame, FF_VVC_FRAME_FLAG_OUTPUT); if (ret < 0) return ret; @@ -289,7 +285,7 @@ void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc) if ((frame->flags) && frame->sequence == s->seq_output && frame->poc != poc) { - if (frame->flags == VVC_FRAME_FLAG_OUTPUT && frame->poc < min_poc) { + if (frame->flags == FF_VVC_FRAME_FLAG_OUTPUT && frame->poc < min_poc) { min_poc = frame->poc; } } @@ -297,10 +293,10 @@ void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc) for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) { VVCFrame *frame = &fc->DPB[i]; - if (frame->flags & VVC_FRAME_FLAG_OUTPUT && + if (frame->flags & FF_VVC_FRAME_FLAG_OUTPUT && frame->sequence == s->seq_output && frame->poc <= min_poc) { - frame->flags |= VVC_FRAME_FLAG_BUMPING; + frame->flags |= FF_VVC_FRAME_FLAG_BUMPING; } } @@ -324,7 +320,7 @@ static VVCFrame *find_ref_idx(VVCContext *s, VVCFrameContext *fc, int poc, uint8 static void mark_ref(VVCFrame *frame, int flag) { - frame->flags &= ~(VVC_FRAME_FLAG_LONG_REF | VVC_FRAME_FLAG_SHORT_REF); + frame->flags &= ~(FF_VVC_FRAME_FLAG_LONG_REF | FF_VVC_FRAME_FLAG_SHORT_REF); frame->flags |= flag; } @@ -398,7 +394,7 @@ static int add_candidate_ref(VVCContext *s, VVCFrameContext *fc, RefPicList *lis refp->poc = poc; refp->ref = ref; - refp->is_lt = ref_flag & VVC_FRAME_FLAG_LONG_REF; + refp->is_lt = ref_flag & FF_VVC_FRAME_FLAG_LONG_REF; refp->is_scaled = ref->sps->r->sps_num_subpics_minus1 != fc->ref->sps->r->sps_num_subpics_minus1|| memcmp(&ref->scaling_win, &fc->ref->scaling_win, sizeof(ref->scaling_win)) || ref->pps->r->pps_pic_width_in_luma_samples != fc->ref->pps->r->pps_pic_width_in_luma_samples || @@ -489,11 +485,11 @@ int ff_vvc_slice_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc) if (rpls->st_ref_pic_flag[i]) { poc = poc_base + delta_poc_st(rpls, lx, i, sps); poc_base = poc; - ref_flag = VVC_FRAME_FLAG_SHORT_REF; + ref_flag = FF_VVC_FRAME_FLAG_SHORT_REF; } else { use_msb = ref_lists->delta_poc_msb_cycle_present_flag[lx][j]; poc = poc_lt(&prev_delta_poc_msb, ph->poc, ref_lists, lx, j, max_poc_lsb); - ref_flag = VVC_FRAME_FLAG_LONG_REF; + ref_flag = FF_VVC_FRAME_FLAG_LONG_REF; j++; } ret = add_candidate_ref(s, fc, rpl, poc, ref_flag, use_msb); diff --git a/libavcodec/vvc/refs.h b/libavcodec/vvc/refs.h index 8ae33d4a9a..fc8e0aae6d 100644 --- a/libavcodec/vvc/refs.h +++ b/libavcodec/vvc/refs.h @@ -25,6 +25,11 @@ #include "dec.h" +#define FF_VVC_FRAME_FLAG_OUTPUT (1 << 0) +#define FF_VVC_FRAME_FLAG_SHORT_REF (1 << 1) +#define FF_VVC_FRAME_FLAG_LONG_REF (1 << 2) +#define FF_VVC_FRAME_FLAG_BUMPING (1 << 3) + int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, struct AVFrame *out, int no_output_of_prior_pics_flag, int flush); void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc); int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext *fc, struct AVFrame **frame); From patchwork Wed Sep 18 07:10:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51641 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp728020vqb; Wed, 18 Sep 2024 00:09:01 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVU6CTJEIdKogQVtdP8W5kcMQKpeoFuLRPxKvYJdqmmLrxr9BJYR5uzQOjGPB30LWD25YFg3QDAaywyjYpoXaa+@gmail.com X-Google-Smtp-Source: AGHT+IEhkfBMoLUpXeGyyrMf7GHZX7Hu9DAMBBFxzKWn4Vnxy3nrhYfFVvbicECOoNvi6af4RAOj X-Received: by 2002:a05:6512:1384:b0:52c:e17c:3741 with SMTP id 2adb3069b0e04-53678fab507mr11218246e87.5.1726643340900; Wed, 18 Sep 2024 00:09:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643340; cv=none; d=google.com; s=arc-20240605; b=jitRL6MMlqdXTPjhoo+AFuWnRYittakqyvrpr4N8v0KtflNAO/1w3inx4FppqRYy6H ayJyhvMDQZCTsEtRkYZSeeJQHVPq2xevnRDxOAwWVVHGKK2+PrgkFh+vMC2V2Mxch7F4 fyobpL5J0vKrplc6X4zS6RUVZ8oSDrdTDIJW3MRLZ95r2tv0Ml8x4Mk68YuC+JRwhqVx tyk90jhHgHNcV3ou0GFTEA7r8QlLR4Mm03dEYtbzC3bsftR1ilZQd6qd/9IscxwPxH4o uuc6KcFECycphBjjWDbmFTrzcyzeVRbheo4RKXKnKfMQmJGUO0NgiO7tYYd/UtI4KWOP jsIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=y9mrtX53xd7GFYQNIHk5/Yb6TDat2Y+Kqtsq5t9f8Iw=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=EhorGFbhnjmbT49+8lxVak5nr28UHENtLMEMEv1lGKNfFvzz+Ma3uCvGuFHU6qwR4c xoatm8hA8k9Nwuu1cvufJh7LXm0PG1B7BP97XXZlW65h7Pn9Ufmz7ZyCjGpjrwLdgi6e qBZ3dW1XIwn02lewE9LdEwIFPNW50FAY3tR1SQL1mhrAqEXMS774kp30l6WT6VYy2aF9 g3LgG8X/peYE5Y1EhSFs8GTgtne8k/yo8O2uZMtIFlH04eHBSiGASDH9f/knOxp1a56T 0QhnTr6A6tTlYKX9/NLfdWHJMmhCXyWHOT8S2XVXXmll30uq2DFAKY5PU1DlWwlmg1w4 zNoQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="HDZjcm1/"; 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 a640c23a62f3a-a9061372305si624257866b.964.2024.09.18.00.09.00; Wed, 18 Sep 2024 00:09:00 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="HDZjcm1/"; 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 183BE68DD03; Wed, 18 Sep 2024 10:08:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7965B68DCD0 for ; Wed, 18 Sep 2024 10:08:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643301; x=1758179301; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=OpueBZvL9uNLjMhSx9MOQ3o7NNOTIuc4hTlWZeUYt2Q=; b=HDZjcm1/TDbyUPTk9pIkM/RsZizmpYBybNq8TLNn3VTznI5s//3xDMoe zPyfaauXYKEWpETxNvbgbunWaNV2vC9jvdG1BjOhgMFiTD9UpZ5zW0LWg YHjeEUBwAa/vkyzSUEcPg28kDBaOVBdmTEfFTgv4SwKSMVMbSLyb1IAUR D1QP3kbxUbwBNpyou9KPLFh2AqAGRnH+GdSyp0DXUZeZhurLy1Jqpzxpd YKuALzwZZhbEAiQzBZw/ON/vwCwHggu8i62SAkAtRaun82jaeiiiD9GMk Lp8DdSGccsKNQNlBMem1RTPc5RF4E500IaHyAY5RRFMtcH4JKecXSdx3K w==; X-CSE-ConnectionGUID: ETA6QBjLSdux9SmGO7VHAA== X-CSE-MsgGUID: LfnFGRmJQqCt2bXPWQ1qCg== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695728" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695728" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:12 -0700 X-CSE-ConnectionGUID: AUEQB396SlmK1SzgVijaBw== X-CSE-MsgGUID: bQnFhuuFTg+zBxp3QeVr/Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452273" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:11 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:29 +0800 Message-Id: <20240918071031.1377336-6-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 6/8] lavc/vvc_ps: Add alf raw syntax into VVCALF 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: FrxMUimSAXNO From: Fei Wang Signed-off-by: Fei Wang --- libavcodec/vvc/ps.c | 10 +++++++++- libavcodec/vvc/ps.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libavcodec/vvc/ps.c b/libavcodec/vvc/ps.c index ff9a6c7a15..f32f1cc5a1 100644 --- a/libavcodec/vvc/ps.c +++ b/libavcodec/vvc/ps.c @@ -1043,13 +1043,21 @@ static void alf_derive(VVCALF *alf, const H266RawAPS *aps) alf_cc(alf, aps); } +static void alf_free(FFRefStructOpaque unused, void *obj) +{ + VVCALF *alf = obj; + + ff_refstruct_unref(&alf->r); +} + static int aps_decode_alf(const VVCALF **alf, const H266RawAPS *aps) { - VVCALF *a = ff_refstruct_allocz(sizeof(*a)); + VVCALF *a = ff_refstruct_alloc_ext(sizeof(*a), 0, NULL, alf_free); if (!a) return AVERROR(ENOMEM); alf_derive(a, aps); + ff_refstruct_replace(&a->r, aps); ff_refstruct_replace(alf, a); ff_refstruct_unref(&a); diff --git a/libavcodec/vvc/ps.h b/libavcodec/vvc/ps.h index 9203e2c57f..3ec2238c17 100644 --- a/libavcodec/vvc/ps.h +++ b/libavcodec/vvc/ps.h @@ -169,6 +169,7 @@ typedef struct VVCPH { #define ALF_NUM_COEFF_CC 7 typedef struct VVCALF { + const H266RawAPS *r; int16_t luma_coeff [ALF_NUM_FILTERS_LUMA][ALF_NUM_COEFF_LUMA]; uint8_t luma_clip_idx [ALF_NUM_FILTERS_LUMA][ALF_NUM_COEFF_LUMA]; From patchwork Wed Sep 18 07:10:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51644 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp732234vqb; Wed, 18 Sep 2024 00:19:19 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWH6MDgpsoB+nCNyEh/fqKAxQxpHrfDHms9SmUmoLAHUxVbYoiOahkg2gYFxIOOCo2eMZxauaWaE+yKwpKPBlHP@gmail.com X-Google-Smtp-Source: AGHT+IEtwGbSyHAOXsqqzFV41T8RjBtmti5x3u2cSE3MmpZ+/GCaH0hVCbo0wpHxykdEubGo+VAV X-Received: by 2002:a17:907:e28c:b0:a8a:837c:ebd4 with SMTP id a640c23a62f3a-a9029491985mr2135482066b.27.1726643959060; Wed, 18 Sep 2024 00:19:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726643959; cv=none; d=google.com; s=arc-20240605; b=iNjKRzNh7FBKznoThtyi7mXB7xv607ICKy93OC/t6xWPLB7prTssb81r9tTmeHcEaZ +eOhQEpJk4lLLo92vYnvUpPc5NAsFd98CkBRpVzQX/b8KpvFjkTYDvT41cIfaQIQi3+B A3SIWbC5oA6gzhZItt05xSms6quT+Vuoi0C4l4kszL+RCRyqo/el4E03RBeA2v6USjr6 55lk+Q3hEuyKHUJWWZXYMtiPmyOPvTLb739vl0gSgskRKsRkEIzL1TI3exo0l1D3fZGF r4zw+uHrCzTeKiBbSlsPReBKF7zGeoo2xAAULgJYcL2iJHcqidTLXMQ6nCnnoq95rKeq skkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=CFBeE6/l6Xx9qQGkKcMj1d59LYTxBuaBs9UTdL7gYFk=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=Fjdt9VpaggXRBe59qai8A+RsEyr4EhoNTYkXs2fa4wDT1dEYavDQzL0nor88x1PRnF YEq4z57Bk4fKPsQ6Mz3Ht7XPkf01j1enqZT9CNfAsHZGzln1jBEJF+S6zP9dUuOBlb9u Z8PO4bML9CwLRzxJBPFRjS0V5gMvbaQTQo/j/tePx8O7oCAW0jK1tlrGxR4EjE1YQ9Nu VdkxknwDhjYgja9qn8BxVaV7nf45QRqdxA4RuOM1+/3oSvPavm8lmkzZOnfP03KbCXtu QB2JnCEoA6mBWyu6F+GrmK3uRLilZ/GkEDq9b0rNw2+AYMqfzZE8zPJXJN9QTpvEDeI/ 5cyg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=LOYXJrNF; 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 a640c23a62f3a-a90612f00adsi634950066b.598.2024.09.18.00.19.18; Wed, 18 Sep 2024 00:19:19 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=LOYXJrNF; 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 45CF268DD1A; Wed, 18 Sep 2024 10:08:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7E79C68DCD2 for ; Wed, 18 Sep 2024 10:08:20 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643301; x=1758179301; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=+1hiclMckRpFnQetlyQv9FxR5WDfTbp5avUV75QPWFo=; b=LOYXJrNF78MPMPnYGfjddPG555p9K5vhOTwLCumHQzcS8HAKNIwfyAmX FCCtpEreqMIG4xLV1GqPzvGWGxxGXr370uVqzqGioMfH02zbP51M+YLD4 Na83i4JWOAzUco5qqyWHXn7yG5RDAFme7eiKczmM1IXEoaJFfp2QQRaKU mYZcz3uvqvKO7HQ/FIiiz7ItIR6ndzXxij8/yezXcB5DIqZ7XrevH8Egw CEJcdunmtFejK2A0Ld4t0pyBjw4KaQTcNFp/HctGzdxuP+vS9vATv4tiR vw+FpUsBSLortsjzweEC0pNS9uEo68MqghBhqHelOlg1ZL/7kmQAFd1Kn g==; X-CSE-ConnectionGUID: AxUMsjiSRiCtWd9lNLUlXg== X-CSE-MsgGUID: 6o6NMtubSf2Md6RLUp89IA== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695729" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695729" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:13 -0700 X-CSE-ConnectionGUID: fauw/pbXRZSpHdGZNVPD7Q== X-CSE-MsgGUID: i0kv1zjPTKigsOlJ2DSL3g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452282" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:12 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:30 +0800 Message-Id: <20240918071031.1377336-7-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 7/8] lavc/vvc_dec: Add hardware decode API 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VjBDACl4nPRZ From: Fei Wang Signed-off-by: Fei Wang --- libavcodec/vvc/dec.c | 73 +++++++++++++++++++++++++++++++++++++------ libavcodec/vvc/dec.h | 4 +++ libavcodec/vvc/refs.c | 6 ++++ 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/libavcodec/vvc/dec.c b/libavcodec/vvc/dec.c index edf2607f50..c9f0e44889 100644 --- a/libavcodec/vvc/dec.c +++ b/libavcodec/vvc/dec.c @@ -22,6 +22,8 @@ */ #include "libavcodec/codec_internal.h" #include "libavcodec/decode.h" +#include "libavcodec/hwaccel_internal.h" +#include "libavcodec/hwconfig.h" #include "libavcodec/profiles.h" #include "libavcodec/refstruct.h" #include "libavutil/cpu.h" @@ -610,6 +612,8 @@ static int ref_frame(VVCFrame *dst, const VVCFrame *src) ff_refstruct_replace(&dst->rpl_tab, src->rpl_tab); ff_refstruct_replace(&dst->rpl, src->rpl); + ff_refstruct_replace(&dst->hwaccel_picture_private, + src->hwaccel_picture_private); dst->nb_rpl_elems = src->nb_rpl_elems; dst->poc = src->poc; @@ -770,17 +774,41 @@ static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, return 0; } +static enum AVPixelFormat get_format(AVCodecContext *avctx, const VVCSPS *sps) +{ +#define HWACCEL_MAX 0 + + enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts; + + switch (sps->pix_fmt) { + case AV_PIX_FMT_YUV420P: + break; + case AV_PIX_FMT_YUV420P10: + break; + } + + *fmt++ = sps->pix_fmt; + *fmt = AV_PIX_FMT_NONE; + + return ff_get_format(avctx, pix_fmts); +} + static void export_frame_params(VVCContext *s, const VVCFrameContext *fc) { AVCodecContext *c = s->avctx; const VVCSPS *sps = fc->ps.sps; const VVCPPS *pps = fc->ps.pps; - c->pix_fmt = sps->pix_fmt; - c->coded_width = pps->width; - c->coded_height = pps->height; - c->width = pps->width - ((pps->r->pps_conf_win_left_offset + pps->r->pps_conf_win_right_offset) << sps->hshift[CHROMA]); - c->height = pps->height - ((pps->r->pps_conf_win_top_offset + pps->r->pps_conf_win_bottom_offset) << sps->vshift[CHROMA]); + // Reset HW config if pix_fmt/w/h change. + if (s->pix_fmt != sps->pix_fmt || c->coded_width != pps->width || c->coded_height != pps->height) { + c->coded_width = pps->width; + c->coded_height = pps->height; + c->pix_fmt = get_format(c, sps); + s->pix_fmt = sps->pix_fmt; + } + + c->width = pps->width - ((pps->r->pps_conf_win_left_offset + pps->r->pps_conf_win_right_offset) << sps->hshift[CHROMA]); + c->height = pps->height - ((pps->r->pps_conf_win_top_offset + pps->r->pps_conf_win_bottom_offset) << sps->vshift[CHROMA]); c->has_b_frames = sps->r->sps_dpb_params.dpb_max_num_reorder_pics[sps->r->sps_max_sublayers_minus1]; } @@ -824,6 +852,20 @@ static int decode_slice(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, ret = slice_init_entry_points(sc, fc, nal, unit); if (ret < 0) return ret; + + if (s->avctx->hwaccel) { + if (is_first_slice) { + ret = FF_HW_CALL(s->avctx, start_frame, NULL, 0); + if (ret < 0) + return ret; + } + + ret = FF_HW_CALL(s->avctx, decode_slice, + nal->raw_data, nal->raw_size); + if (ret < 0) + return ret; + } + fc->nb_slices++; return 0; @@ -939,17 +981,26 @@ static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output) static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output) { - int ret = ff_vvc_frame_submit(s, fc); + int ret; - if (ret < 0) { - ff_vvc_report_frame_finished(fc->ref); - return ret; + if (s->avctx->hwaccel) { + if (ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame) < 0) { + av_log(s->avctx, AV_LOG_ERROR, + "Hardware accelerator failed to decode picture\n"); + ff_vvc_unref_frame(fc, fc->ref, ~0); + return ret; + } + } else { + if (ret = ff_vvc_frame_submit(s, fc) < 0) { + ff_vvc_report_frame_finished(fc->ref); + return ret; + } } s->nb_frames++; s->nb_delayed++; - if (s->nb_delayed >= s->nb_fcs) { + if (s->nb_delayed >= s->nb_fcs || s->avctx->hwaccel) { if ((ret = wait_delayed_frame(s, output, got_output)) < 0) return ret; } @@ -1095,6 +1146,8 @@ static av_cold int vvc_decode_init(AVCodecContext *avctx) GDR_SET_RECOVERED(s); ff_thread_once(&init_static_once, init_default_scale_m); + s->pix_fmt = AV_PIX_FMT_NONE; + return 0; } diff --git a/libavcodec/vvc/dec.h b/libavcodec/vvc/dec.h index d27cf52ca2..776b38b20f 100644 --- a/libavcodec/vvc/dec.h +++ b/libavcodec/vvc/dec.h @@ -101,6 +101,8 @@ typedef struct VVCFrame { * A combination of VVC_FRAME_FLAG_* */ uint8_t flags; + + void *hwaccel_picture_private; ///< hardware accelerator private data } VVCFrame; typedef struct SliceContext { @@ -243,6 +245,8 @@ typedef struct VVCContext { uint64_t nb_frames; ///< processed frames int nb_delayed; ///< delayed frames + + enum AVPixelFormat pix_fmt; ///< pix format of current frame } VVCContext ; #endif /* AVCODEC_VVC_DEC_H */ diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c index 3e5573df29..a41a83631a 100644 --- a/libavcodec/vvc/refs.c +++ b/libavcodec/vvc/refs.c @@ -26,6 +26,7 @@ #include "libavutil/thread.h" #include "libavcodec/refstruct.h" #include "libavcodec/thread.h" +#include "libavcodec/decode.h" #include "refs.h" @@ -59,6 +60,7 @@ void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags) ff_refstruct_unref(&frame->rpl_tab); frame->collocated_ref = NULL; + ff_refstruct_unref(&frame->hwaccel_picture_private); } } @@ -153,6 +155,10 @@ static VVCFrame *alloc_frame(VVCContext *s, VVCFrameContext *fc) if (!frame->progress) goto fail; + ret = ff_hwaccel_frame_priv_alloc(s->avctx, &frame->hwaccel_picture_private); + if (ret < 0) + goto fail; + return frame; fail: ff_vvc_unref_frame(fc, frame, ~0); From patchwork Wed Sep 18 07:10:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 51645 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d32e:0:b0:48e:c0f8:d0de with SMTP id cf14csp749820vqb; Wed, 18 Sep 2024 01:04:15 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWGwATAjOIBMXyHXd+RWJmLfiE09hjm9UejrMeFar62FUUuebrG8sKizDa9UW0yeLjx0hg4e+gHd3R44jYJQGXe@gmail.com X-Google-Smtp-Source: AGHT+IFe2MnTsGTyhHauwmwPUH7y1cxhHQJA/e5NziTy8yUIcpTT1EWZKqxKKF0VB4N9HTanXK3M X-Received: by 2002:a2e:4601:0:b0:2ef:2cdb:5055 with SMTP id 38308e7fff4ca-2f791a04402mr69986541fa.20.1726646655495; Wed, 18 Sep 2024 01:04:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726646655; cv=none; d=google.com; s=arc-20240605; b=gi0F3KSih/cva9eyR6fSgBWwWRg0KZ9N0oMGRTU64IimXUo+Hah9+1J7P5Ex5Cp8ig LT3DYw4WfI5vJWO1kzhkcXLyTTr3pegCGtmwy9nn9O0+356jJkEotfGK+vzZKHEQRHMn Vi/YyEwWofmzrD4TuQH7f4bSMg7+alMdZZiz8bFEqIDAyC/i52SPT8DfCcfdLCfrOgAj 2vAtkm04NnvmGMrAwmwo9Bq8mp13v6mWknLx9Jl+fe3zkLQDgAN9v++z2CAvEsKXv2SP JfQkQxNTZ1TVCwXhmkQwBT4YSZ2nyEboy97Va7DuY/qvHUXPRECfd60a+Z8uPIyjU+CD zjMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=oFNwaJCsVKJJMi0vyteT6FY8mdXW5/45URoiYoOzNu4=; fh=i4ESP4ZRFDcfYfwXKWpOXjc2YhmIGuOsCfZUnwNO0gc=; b=eO3Ci6MI+fJ4KCbBV5dFaJiSseOGs6dRs0Ue+MV+pZEamOQXpJQoVxc0ovLGdg7Zaq qY7+EfRmJtSJlW1W5UDPU8difoj5K+AIm1JOW6WykLUMFz83lhA3T9QuHU5Afl5K4fnJ IaxfB6anY7yg5R6RSRRVqdoyNW1HxH3jmvUspywwZ+L9tOMB/g4ah37ghXiSH2S+qVEF ly/R73swu2lk7StLKa6k2Tieaxc/xIzeVZgkJCcoQkDVXG8cQ5LNLB9kqdnE4fyhlya2 Wygc42HjaPlZ8Td13eNm6Bxqezk1rBLpZcynNDsM9O1iaMDllp97BaqB+//ousJOgnTq P98g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=IT0v2lUk; 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 38308e7fff4ca-2f79d35e391si26370451fa.306.2024.09.18.01.04.14; Wed, 18 Sep 2024 01:04:15 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=IT0v2lUk; 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 46E7268DD00; Wed, 18 Sep 2024 10:08:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6F14B68DCD0 for ; Wed, 18 Sep 2024 10:08:21 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1726643302; x=1758179302; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=E8N4EktqjUPh9+4W08RLDG56prD0LQ7RmG3lIVR7Hxg=; b=IT0v2lUkEg8t63BjjHQcYh7vDzcb9bLbSGIU4Y1N3HUYJp6wm8rWeO5T Hlr3a5Yd+hFmgVWoyhscPfdDAYHxKqtUUGRe+SfeE7p4IN4NV+BGI+B9M VgRcHG3W9Ykz8s/Afk0xfxSaVxIjMZImN2fz8r0ZKHsSEbprecA+HXU55 czCzDGbxFowviwrrZcza8sYSMRHCqpLhYzNajvBMCFeFXMNCBqKzHQoD5 qmTxuDEfVLZylgMLQZXO3tCvHwk7p8zCA7+Vg7a+jLTWizgYJc5e87V0O 0m2llPae92UM+XiLwB0XnmyYuS7uRpj3L3OEXpYQqivPuamJ2v1UIYCRu A==; X-CSE-ConnectionGUID: OtopAm+vTyqD+oC5cekjbw== X-CSE-MsgGUID: hUAKewKcS7e1OHRRQssW+w== X-IronPort-AV: E=McAfee;i="6700,10204,11198"; a="25695730" X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="25695730" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2024 00:08:15 -0700 X-CSE-ConnectionGUID: iqMoBV+bRQ6Jg3MSZvMFYg== X-CSE-MsgGUID: AejMDXmNRTqJGM4atckqZQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,238,1719903600"; d="scan'208";a="69452291" Received: from feiwan1-desk3.sh.intel.com ([10.238.208.39]) by orviesa009.jf.intel.com with ESMTP; 18 Sep 2024 00:08:13 -0700 From: fei.w.wang-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2024 15:10:31 +0800 Message-Id: <20240918071031.1377336-8-fei.w.wang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240918071031.1377336-1-fei.w.wang@intel.com> References: <20240918071031.1377336-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 8/8] lavc/vaapi_dec: Add VVC decoder 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: fei.w.wang@intel.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: RoBIZt/+SZlU From: Fei Wang Signed-off-by: Fei Wang --- Changelog | 1 + configure | 3 + libavcodec/Makefile | 1 + libavcodec/hwaccels.h | 1 + libavcodec/vaapi_decode.c | 4 + libavcodec/vaapi_vvc.c | 657 ++++++++++++++++++++++++++++++++++++++ libavcodec/version.h | 2 +- libavcodec/vvc/dec.c | 15 +- 8 files changed, 682 insertions(+), 2 deletions(-) create mode 100644 libavcodec/vaapi_vvc.c diff --git a/Changelog b/Changelog index 4c9c2c6878..e7e741bfce 100644 --- a/Changelog +++ b/Changelog @@ -23,6 +23,7 @@ version : YUVJ pixel format - Vulkan H.264 encoder - Vulkan H.265 encoder +- VVC VAAPI decoder version 7.0: diff --git a/configure b/configure index 8fbf3772a8..6eaea8f1b4 100755 --- a/configure +++ b/configure @@ -3283,6 +3283,8 @@ vp9_vdpau_hwaccel_deps="vdpau VdpPictureInfoVP9" vp9_vdpau_hwaccel_select="vp9_decoder" vp9_videotoolbox_hwaccel_deps="videotoolbox" vp9_videotoolbox_hwaccel_select="vp9_decoder" +vvc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferVVC" +vvc_vaapi_hwaccel_select="vvc_decoder" wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel" wmv3_d3d11va2_hwaccel_select="vc1_d3d11va2_hwaccel" wmv3_d3d12va_hwaccel_select="vc1_d3d12va_hwaccel" @@ -7291,6 +7293,7 @@ if enabled vaapi; then check_cpp_condition vaapi_1 "va/va.h" "VA_CHECK_VERSION(1, 0, 0)" check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC" + check_type "va/va.h va/va_dec_vvc.h" "VAPictureParameterBufferVVC" check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth check_struct "va/va.h" "VADecPictureParameterBufferAV1" bit_depth_idx check_type "va/va.h va/va_vpp.h" "VAProcFilterParameterBufferHDRToneMapping" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 936fc3415a..10d28bd8f4 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1061,6 +1061,7 @@ OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o OBJS-$(CONFIG_VP9_VDPAU_HWACCEL) += vdpau_vp9.o OBJS-$(CONFIG_VP9_VIDEOTOOLBOX_HWACCEL) += videotoolbox_vp9.o OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec.o +OBJS-$(CONFIG_VVC_VAAPI_HWACCEL) += vaapi_vvc.o # Objects duplicated from other libraries for shared builds SHLIBOBJS += log2_tab.o reverse.o diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h index 5171e4c7d7..88d6b9a9b5 100644 --- a/libavcodec/hwaccels.h +++ b/libavcodec/hwaccels.h @@ -82,6 +82,7 @@ extern const struct FFHWAccel ff_vp9_nvdec_hwaccel; extern const struct FFHWAccel ff_vp9_vaapi_hwaccel; extern const struct FFHWAccel ff_vp9_vdpau_hwaccel; extern const struct FFHWAccel ff_vp9_videotoolbox_hwaccel; +extern const struct FFHWAccel ff_vvc_vaapi_hwaccel; extern const struct FFHWAccel ff_wmv3_d3d11va_hwaccel; extern const struct FFHWAccel ff_wmv3_d3d11va2_hwaccel; extern const struct FFHWAccel ff_wmv3_d3d12va_hwaccel; diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c index 7753f72106..4ac2df5b43 100644 --- a/libavcodec/vaapi_decode.c +++ b/libavcodec/vaapi_decode.c @@ -464,6 +464,9 @@ static const struct { MAP(AV1, AV1_MAIN, AV1Profile0), MAP(AV1, AV1_HIGH, AV1Profile1), #endif +#if VA_CHECK_VERSION(1, 22, 0) + MAP(H266, VVC_MAIN_10, VVCMain10), +#endif #undef MAP }; @@ -629,6 +632,7 @@ static int vaapi_decode_make_config(AVCodecContext *avctx, // Add per-codec number of surfaces used for storing reference frames. switch (avctx->codec_id) { case AV_CODEC_ID_H264: + case AV_CODEC_ID_H266: case AV_CODEC_ID_HEVC: case AV_CODEC_ID_AV1: frames->initial_pool_size += 16; diff --git a/libavcodec/vaapi_vvc.c b/libavcodec/vaapi_vvc.c new file mode 100644 index 0000000000..9e78ca7b56 --- /dev/null +++ b/libavcodec/vaapi_vvc.c @@ -0,0 +1,657 @@ +/* + * VVC HW decode acceleration through VA API + * + * Copyright (c) 2024 Intel Corporation + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +#include "vvc/dec.h" +#include "vvc/refs.h" +#include "hwaccel_internal.h" +#include "vaapi_decode.h" + +typedef struct VAAPIDecodePictureVVC { + VAAPIDecodePicture pic; + VAPictureParameterBufferVVC pic_param; + VASliceParameterBufferVVC slice_param; + int decode_issued; +} VAAPIDecodePictureVVC; + +static void init_vaapi_pic(VAPictureVVC *va_pic) +{ + va_pic->picture_id = VA_INVALID_ID; + va_pic->flags = VA_PICTURE_VVC_INVALID; + va_pic->pic_order_cnt = 0; +} + +static void fill_vaapi_pic(VAPictureVVC *va_pic, const VVCFrame *pic) +{ + va_pic->picture_id = ff_vaapi_get_surface_id(pic->frame); + va_pic->pic_order_cnt = pic->poc; + va_pic->flags = 0; + + if (pic->flags & FF_VVC_FRAME_FLAG_LONG_REF) + va_pic->flags |= VA_PICTURE_VVC_LONG_TERM_REFERENCE; +} + +static void fill_vaapi_reference_frames(const VVCFrameContext *h, VAPictureParameterBufferVVC *pp) +{ + const VVCFrame *current_picture = h->ref; + int i, j; + + for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->ReferenceFrames); i++) { + const VVCFrame *frame = NULL; + + while (!frame && j < FF_ARRAY_ELEMS(h->DPB)) { + if ((&h->DPB[j] != current_picture ) && + (h->DPB[j].flags & (FF_VVC_FRAME_FLAG_LONG_REF | FF_VVC_FRAME_FLAG_SHORT_REF))) + frame = &h->DPB[j]; + j++; + } + + init_vaapi_pic(&pp->ReferenceFrames[i]); + + if (frame) { + VAAPIDecodePictureVVC *pic; + fill_vaapi_pic(&pp->ReferenceFrames[i], frame); + pic = frame->hwaccel_picture_private; + if (!pic->decode_issued) + pp->ReferenceFrames[i].flags |= VA_PICTURE_VVC_UNAVAILABLE_REFERENCE; + } + } +} + +static int vaapi_vvc_start_frame(AVCodecContext *avctx, + av_unused const uint8_t *buffer, + av_unused uint32_t size) +{ + const VVCContext *h = avctx->priv_data; + VVCFrameContext *fc = &h->fcs[(h->nb_frames + h->nb_fcs) % h->nb_fcs]; + const H266RawSPS *sps = fc->ps.sps->r; + const H266RawPPS *pps = fc->ps.pps->r; + const H266RawPictureHeader *ph = fc->ps.ph.r; + VAAPIDecodePictureVVC *pic = fc->ref->hwaccel_picture_private; + VAPictureParameterBufferVVC *pic_param = &pic->pic_param; + uint16_t tile_dim, exp_slice_height_in_ctus[VVC_MAX_SLICES] = {0}; + int i, j, k, err; + + pic->pic.output_surface = ff_vaapi_get_surface_id(fc->ref->frame); + + *pic_param = (VAPictureParameterBufferVVC) { + .pps_pic_width_in_luma_samples = pps->pps_pic_width_in_luma_samples, + .pps_pic_height_in_luma_samples = pps->pps_pic_height_in_luma_samples, + .sps_num_subpics_minus1 = sps->sps_num_subpics_minus1, + .sps_chroma_format_idc = sps->sps_chroma_format_idc, + .sps_bitdepth_minus8 = sps->sps_bitdepth_minus8, + .sps_log2_ctu_size_minus5 = sps->sps_log2_ctu_size_minus5, + .sps_log2_min_luma_coding_block_size_minus2 = sps->sps_log2_min_luma_coding_block_size_minus2, + .sps_log2_transform_skip_max_size_minus2 = sps->sps_log2_transform_skip_max_size_minus2, + .sps_six_minus_max_num_merge_cand = sps->sps_six_minus_max_num_merge_cand, + .sps_five_minus_max_num_subblock_merge_cand = sps->sps_five_minus_max_num_subblock_merge_cand, + .sps_max_num_merge_cand_minus_max_num_gpm_cand = sps->sps_max_num_merge_cand_minus_max_num_gpm_cand, + .sps_log2_parallel_merge_level_minus2 = sps->sps_log2_parallel_merge_level_minus2, + .sps_min_qp_prime_ts = sps->sps_min_qp_prime_ts, + .sps_six_minus_max_num_ibc_merge_cand = sps->sps_six_minus_max_num_ibc_merge_cand, + .sps_num_ladf_intervals_minus2 = sps->sps_num_ladf_intervals_minus2, + .sps_ladf_lowest_interval_qp_offset = sps->sps_ladf_lowest_interval_qp_offset, + .sps_flags.bits = { + .sps_subpic_info_present_flag = sps->sps_subpic_info_present_flag, + .sps_independent_subpics_flag = sps->sps_independent_subpics_flag, + .sps_subpic_same_size_flag = sps->sps_subpic_same_size_flag, + .sps_entropy_coding_sync_enabled_flag = sps->sps_entropy_coding_sync_enabled_flag, + .sps_qtbtt_dual_tree_intra_flag = sps->sps_qtbtt_dual_tree_intra_flag, + .sps_max_luma_transform_size_64_flag = sps->sps_max_luma_transform_size_64_flag, + .sps_transform_skip_enabled_flag = sps->sps_transform_skip_enabled_flag, + .sps_bdpcm_enabled_flag = sps->sps_bdpcm_enabled_flag, + .sps_mts_enabled_flag = sps->sps_mts_enabled_flag, + .sps_explicit_mts_intra_enabled_flag = sps->sps_explicit_mts_intra_enabled_flag, + .sps_explicit_mts_inter_enabled_flag = sps->sps_explicit_mts_inter_enabled_flag, + .sps_lfnst_enabled_flag = sps->sps_lfnst_enabled_flag, + .sps_joint_cbcr_enabled_flag = sps->sps_joint_cbcr_enabled_flag, + .sps_same_qp_table_for_chroma_flag = sps->sps_same_qp_table_for_chroma_flag, + .sps_sao_enabled_flag = sps->sps_sao_enabled_flag, + .sps_alf_enabled_flag = sps->sps_alf_enabled_flag, + .sps_ccalf_enabled_flag = sps->sps_alf_enabled_flag, + .sps_lmcs_enabled_flag = sps->sps_lmcs_enabled_flag, + .sps_sbtmvp_enabled_flag = sps->sps_sbtmvp_enabled_flag, + .sps_amvr_enabled_flag = sps->sps_amvr_enabled_flag, + .sps_smvd_enabled_flag = sps->sps_smvd_enabled_flag, + .sps_mmvd_enabled_flag = sps->sps_mmvd_enabled_flag, + .sps_sbt_enabled_flag = sps->sps_sbt_enabled_flag, + .sps_affine_enabled_flag = sps->sps_affine_enabled_flag, + .sps_6param_affine_enabled_flag = sps->sps_6param_affine_enabled_flag, + .sps_affine_amvr_enabled_flag = sps->sps_affine_amvr_enabled_flag, + .sps_affine_prof_enabled_flag = sps->sps_affine_prof_enabled_flag, + .sps_bcw_enabled_flag = sps->sps_bcw_enabled_flag, + .sps_ciip_enabled_flag = sps->sps_ciip_enabled_flag, + .sps_gpm_enabled_flag = sps->sps_gpm_enabled_flag, + .sps_isp_enabled_flag = sps->sps_isp_enabled_flag, + .sps_mrl_enabled_flag = sps->sps_mrl_enabled_flag, + .sps_mip_enabled_flag = sps->sps_mip_enabled_flag, + .sps_cclm_enabled_flag = sps->sps_cclm_enabled_flag, + .sps_chroma_horizontal_collocated_flag = sps->sps_chroma_horizontal_collocated_flag, + .sps_chroma_vertical_collocated_flag = sps->sps_chroma_vertical_collocated_flag, + .sps_palette_enabled_flag = sps->sps_palette_enabled_flag, + .sps_act_enabled_flag = sps->sps_act_enabled_flag, + .sps_ibc_enabled_flag = sps->sps_ibc_enabled_flag, + .sps_ladf_enabled_flag = sps->sps_ladf_enabled_flag, + .sps_explicit_scaling_list_enabled_flag = sps->sps_explicit_scaling_list_enabled_flag, + .sps_scaling_matrix_for_lfnst_disabled_flag = sps->sps_scaling_matrix_for_lfnst_disabled_flag, + .sps_scaling_matrix_for_alternative_colour_space_disabled_flag = sps->sps_scaling_matrix_for_alternative_colour_space_disabled_flag, + .sps_scaling_matrix_designated_colour_space_flag = sps->sps_scaling_matrix_designated_colour_space_flag, + .sps_virtual_boundaries_enabled_flag = sps->sps_virtual_boundaries_enabled_flag, + .sps_virtual_boundaries_present_flag = sps->sps_virtual_boundaries_present_flag, + }, + .NumVerVirtualBoundaries = sps->sps_virtual_boundaries_present_flag ? + sps->sps_num_ver_virtual_boundaries : + ph->ph_num_ver_virtual_boundaries, + .NumHorVirtualBoundaries = sps->sps_virtual_boundaries_present_flag ? + sps->sps_num_hor_virtual_boundaries : + ph->ph_num_hor_virtual_boundaries, + .pps_scaling_win_left_offset = pps->pps_scaling_win_left_offset, + .pps_scaling_win_right_offset = pps->pps_scaling_win_right_offset, + .pps_scaling_win_top_offset = pps->pps_scaling_win_top_offset, + .pps_scaling_win_bottom_offset = pps->pps_scaling_win_bottom_offset, + .pps_num_exp_tile_columns_minus1 = pps->pps_num_exp_tile_columns_minus1, + .pps_num_exp_tile_rows_minus1 = pps->pps_num_exp_tile_rows_minus1, + .pps_num_slices_in_pic_minus1 = pps->pps_num_slices_in_pic_minus1, + .pps_pic_width_minus_wraparound_offset = pps->pps_pic_width_minus_wraparound_offset, + .pps_cb_qp_offset = pps->pps_cb_qp_offset, + .pps_cr_qp_offset = pps->pps_cr_qp_offset, + .pps_joint_cbcr_qp_offset_value = pps->pps_joint_cbcr_qp_offset_value, + .pps_chroma_qp_offset_list_len_minus1 = pps->pps_chroma_qp_offset_list_len_minus1, + .pps_flags.bits = { + .pps_loop_filter_across_tiles_enabled_flag = pps->pps_loop_filter_across_tiles_enabled_flag, + .pps_rect_slice_flag = pps->pps_rect_slice_flag, + .pps_single_slice_per_subpic_flag = pps->pps_single_slice_per_subpic_flag, + .pps_loop_filter_across_slices_enabled_flag = pps->pps_loop_filter_across_slices_enabled_flag, + .pps_weighted_pred_flag = pps->pps_weighted_pred_flag, + .pps_weighted_bipred_flag = pps->pps_weighted_bipred_flag, + .pps_ref_wraparound_enabled_flag = pps->pps_ref_wraparound_enabled_flag, + .pps_cu_qp_delta_enabled_flag = pps->pps_cu_qp_delta_enabled_flag, + .pps_cu_chroma_qp_offset_list_enabled_flag = pps->pps_cu_chroma_qp_offset_list_enabled_flag, + .pps_deblocking_filter_override_enabled_flag = pps->pps_deblocking_filter_override_enabled_flag, + .pps_deblocking_filter_disabled_flag = pps->pps_deblocking_filter_disabled_flag, + .pps_dbf_info_in_ph_flag = pps->pps_dbf_info_in_ph_flag, + .pps_sao_info_in_ph_flag = pps->pps_sao_info_in_ph_flag, + .pps_alf_info_in_ph_flag = pps->pps_alf_info_in_ph_flag, + }, + .ph_lmcs_aps_id = ph->ph_lmcs_aps_id, + .ph_scaling_list_aps_id = ph->ph_scaling_list_aps_id, + .ph_log2_diff_min_qt_min_cb_intra_slice_luma = ph->ph_log2_diff_min_qt_min_cb_intra_slice_luma, + .ph_max_mtt_hierarchy_depth_intra_slice_luma = ph->ph_max_mtt_hierarchy_depth_intra_slice_luma, + .ph_log2_diff_max_bt_min_qt_intra_slice_luma = ph->ph_log2_diff_max_bt_min_qt_intra_slice_luma, + .ph_log2_diff_max_tt_min_qt_intra_slice_luma = ph->ph_log2_diff_max_tt_min_qt_intra_slice_luma, + .ph_log2_diff_min_qt_min_cb_intra_slice_chroma = ph->ph_log2_diff_min_qt_min_cb_intra_slice_chroma, + .ph_max_mtt_hierarchy_depth_intra_slice_chroma = ph->ph_max_mtt_hierarchy_depth_intra_slice_chroma, + .ph_log2_diff_max_bt_min_qt_intra_slice_chroma = ph->ph_log2_diff_max_bt_min_qt_intra_slice_chroma, + .ph_log2_diff_max_tt_min_qt_intra_slice_chroma = ph->ph_log2_diff_max_tt_min_qt_intra_slice_chroma, + .ph_cu_qp_delta_subdiv_intra_slice = ph->ph_cu_qp_delta_subdiv_intra_slice, + .ph_cu_chroma_qp_offset_subdiv_intra_slice = ph->ph_cu_chroma_qp_offset_subdiv_intra_slice, + .ph_log2_diff_min_qt_min_cb_inter_slice = ph->ph_log2_diff_min_qt_min_cb_inter_slice, + .ph_max_mtt_hierarchy_depth_inter_slice = ph->ph_max_mtt_hierarchy_depth_inter_slice, + .ph_log2_diff_max_bt_min_qt_inter_slice = ph->ph_log2_diff_max_bt_min_qt_inter_slice, + .ph_log2_diff_max_tt_min_qt_inter_slice = ph->ph_log2_diff_max_tt_min_qt_inter_slice, + .ph_cu_qp_delta_subdiv_inter_slice = ph->ph_cu_qp_delta_subdiv_inter_slice, + .ph_cu_chroma_qp_offset_subdiv_inter_slice = ph->ph_cu_chroma_qp_offset_subdiv_inter_slice, + .ph_flags.bits= { + .ph_non_ref_pic_flag = ph->ph_non_ref_pic_flag, + .ph_alf_enabled_flag = ph->ph_alf_enabled_flag, + .ph_alf_cb_enabled_flag = ph->ph_alf_cb_enabled_flag, + .ph_alf_cr_enabled_flag = ph->ph_alf_cr_enabled_flag, + .ph_alf_cc_cb_enabled_flag = ph->ph_alf_cc_cb_enabled_flag, + .ph_alf_cc_cr_enabled_flag = ph->ph_alf_cc_cr_enabled_flag, + .ph_lmcs_enabled_flag = ph->ph_lmcs_enabled_flag, + .ph_chroma_residual_scale_flag = ph->ph_chroma_residual_scale_flag, + .ph_explicit_scaling_list_enabled_flag = ph->ph_explicit_scaling_list_enabled_flag, + .ph_virtual_boundaries_present_flag = ph->ph_virtual_boundaries_present_flag, + .ph_temporal_mvp_enabled_flag = ph->ph_temporal_mvp_enabled_flag, + .ph_mmvd_fullpel_only_flag = ph->ph_mmvd_fullpel_only_flag, + .ph_mvd_l1_zero_flag = ph->ph_mvd_l1_zero_flag, + .ph_bdof_disabled_flag = ph->ph_bdof_disabled_flag, + .ph_dmvr_disabled_flag = ph->ph_dmvr_disabled_flag, + .ph_prof_disabled_flag = ph->ph_prof_disabled_flag, + .ph_joint_cbcr_sign_flag = ph->ph_joint_cbcr_sign_flag, + .ph_sao_luma_enabled_flag = ph->ph_sao_luma_enabled_flag, + .ph_sao_chroma_enabled_flag = ph->ph_sao_chroma_enabled_flag, + .ph_deblocking_filter_disabled_flag = ph->ph_deblocking_filter_disabled_flag, + }, + .PicMiscFlags.fields = { + .IntraPicFlag = pps->pps_mixed_nalu_types_in_pic_flag ? 0 : IS_IRAP(h) ? 1 : 0, + } + }; + + fill_vaapi_pic(&pic_param->CurrPic, fc->ref); + fill_vaapi_reference_frames(fc, pic_param); + + for (i = 0; i < VVC_MAX_SAMPLE_ARRAYS; i++) + for (j = 0; j < VVC_MAX_POINTS_IN_QP_TABLE; j++) + pic_param->ChromaQpTable[i][j] = fc->ps.sps->chroma_qp_table[i][j]; + for (i = 0; i < 4; i++) { + pic_param->sps_ladf_qp_offset[i] = sps->sps_ladf_qp_offset[i]; + pic_param->sps_ladf_delta_threshold_minus1[i] = sps->sps_ladf_delta_threshold_minus1[i]; + } + + for (i = 0; i < (sps->sps_virtual_boundaries_present_flag ? sps->sps_num_ver_virtual_boundaries : ph->ph_num_ver_virtual_boundaries); i++) { + pic_param->VirtualBoundaryPosX[i] = (sps->sps_virtual_boundaries_present_flag ? + (sps->sps_virtual_boundary_pos_x_minus1[ i ] + 1) : + (ph->ph_virtual_boundary_pos_x_minus1[i] + 1)) * 8; + } + + for (i = 0; i < (sps->sps_virtual_boundaries_present_flag ? sps->sps_num_hor_virtual_boundaries : ph->ph_num_hor_virtual_boundaries); i++) { + pic_param->VirtualBoundaryPosY[i] = (sps->sps_virtual_boundaries_present_flag ? + (sps->sps_virtual_boundary_pos_y_minus1[ i ] + 1) : + (ph->ph_virtual_boundary_pos_y_minus1[i] + 1)) * 8; + } + + for (i = 0; i < 6; i++) { + pic_param->pps_cb_qp_offset_list[i] = pps->pps_cb_qp_offset_list[i]; + pic_param->pps_cr_qp_offset_list[i] = pps->pps_cr_qp_offset_list[i]; + pic_param->pps_joint_cbcr_qp_offset_list[i] = pps->pps_joint_cbcr_qp_offset_list[i]; + } + + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VAPictureParameterBufferType, + &pic->pic_param, sizeof(VAPictureParameterBufferVVC)); + if (err < 0) + goto fail; + + for (i = 0; i <= sps->sps_num_subpics_minus1 && sps->sps_subpic_info_present_flag; i++) { + VASubPicVVC subpic_param = { + .sps_subpic_ctu_top_left_x = sps->sps_subpic_ctu_top_left_x[i], + .sps_subpic_ctu_top_left_y = sps->sps_subpic_ctu_top_left_y[i], + .sps_subpic_width_minus1 = sps->sps_subpic_width_minus1[i], + .sps_subpic_height_minus1 = sps->sps_subpic_height_minus1[i], + .SubpicIdVal = pps->sub_pic_id_val[i], + .subpic_flags.bits = { + .sps_subpic_treated_as_pic_flag = sps->sps_subpic_treated_as_pic_flag[i], + .sps_loop_filter_across_subpic_enabled_flag = sps->sps_loop_filter_across_subpic_enabled_flag[i], + } + }; + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VASubPicBufferType, + &subpic_param, sizeof(VASubPicVVC)); + if (err < 0) + goto fail; + } + + for (i = 0; i < VVC_MAX_ALF_COUNT; i++) { + const VVCALF *alf_list = h->ps.alf_list[i]; + if (alf_list) { + const H266RawAPS *alf = alf_list->r; + VAAlfDataVVC alf_param = { + .aps_adaptation_parameter_set_id = i, + .alf_luma_num_filters_signalled_minus1 = alf->alf_luma_num_filters_signalled_minus1, + .alf_chroma_num_alt_filters_minus1 = alf->alf_chroma_num_alt_filters_minus1, + .alf_cc_cb_filters_signalled_minus1 = alf->alf_cc_cb_filters_signalled_minus1, + .alf_cc_cr_filters_signalled_minus1 = alf->alf_cc_cr_filters_signalled_minus1, + .alf_flags.bits = { + .alf_luma_filter_signal_flag = alf->alf_luma_filter_signal_flag, + .alf_chroma_filter_signal_flag = alf->alf_chroma_filter_signal_flag, + .alf_cc_cb_filter_signal_flag = alf->alf_cc_cb_filter_signal_flag, + .alf_cc_cr_filter_signal_flag = alf->alf_cc_cr_filter_signal_flag, + .alf_luma_clip_flag = alf->alf_luma_clip_flag, + .alf_chroma_clip_flag = alf->alf_chroma_clip_flag, + } + }; + + for (j = 0; j < 25; j++) + alf_param.alf_luma_coeff_delta_idx[j] = alf->alf_luma_coeff_delta_idx[j]; + + for (j = 0; j < 25; j++) { + for (k = 0; k < 12; k++) { + alf_param.filtCoeff[j][k] = alf->alf_luma_coeff_abs[j][k] * (1 - 2 * alf->alf_luma_coeff_sign[j][k]); + alf_param.alf_luma_clip_idx[j][k] = alf->alf_luma_clip_idx[j][k]; + } + } + + for (j = 0; j < 8; j++) { + for (k = 0; k < 6; k++) { + alf_param.AlfCoeffC[j][k] = alf->alf_chroma_coeff_abs[j][k] * (1 - 2 * alf->alf_chroma_coeff_sign[j][k]); + alf_param.alf_chroma_clip_idx[j][k] = alf->alf_chroma_clip_idx[j][k]; + } + } + + for (j = 0; j < 4; j++) { + for (k = 0; k < 7; k++) { + if (alf->alf_cc_cb_mapped_coeff_abs[j][k]) + alf_param.CcAlfApsCoeffCb[j][k] = (1 - 2 * alf->alf_cc_cb_coeff_sign[j][k]) * (1 << (alf->alf_cc_cb_mapped_coeff_abs[j][k] - 1)); + if (alf->alf_cc_cr_mapped_coeff_abs[j][k]) + alf_param.CcAlfApsCoeffCr[j][k] = (1 - 2 * alf->alf_cc_cr_coeff_sign[j][k]) * (1 << (alf->alf_cc_cr_mapped_coeff_abs[j][k] - 1)); + } + } + + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VAAlfBufferType, + &alf_param, sizeof(VAAlfDataVVC)); + if (err < 0) + goto fail; + } + } + + for (i = 0; i < VVC_MAX_LMCS_COUNT; i++) { + const H266RawAPS *lmcs = h->ps.lmcs_list[i]; + if (lmcs) { + VALmcsDataVVC lmcs_param = { + .aps_adaptation_parameter_set_id = i, + .lmcs_min_bin_idx = lmcs->lmcs_min_bin_idx, + .lmcs_delta_max_bin_idx = lmcs->lmcs_delta_max_bin_idx, + .lmcsDeltaCrs = (1 - 2 * lmcs->lmcs_delta_sign_crs_flag) * lmcs->lmcs_delta_abs_crs, + }; + + for (j = lmcs->lmcs_min_bin_idx; j <= 15 - lmcs->lmcs_delta_max_bin_idx; j++) + lmcs_param.lmcsDeltaCW[j] = (1 - 2 * lmcs->lmcs_delta_sign_cw_flag[j]) * lmcs->lmcs_delta_abs_cw[j]; + + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VALmcsBufferType, + &lmcs_param, sizeof(VALmcsDataVVC)); + if (err < 0) + goto fail; + } + } + + for (i = 0; i < VVC_MAX_SL_COUNT; i++) { + const VVCScalingList *sl = h->ps.scaling_list[i]; + if (sl) { + int l; + + VAScalingListVVC sl_param = { + .aps_adaptation_parameter_set_id = i, + }; + + for (j = 0; j < 14; j++) + sl_param.ScalingMatrixDCRec[j] = sl->scaling_matrix_dc_rec[j]; + + for (j = 0; j < 2; j++) + for (k = 0; k < 2; k++) + for (l = 0; l < 2; l++) + sl_param.ScalingMatrixRec2x2[j][k][l] = sl->scaling_matrix_rec[j][l * 2 + k]; + + for (j = 2; j < 8; j++) + for (k = 0; k < 4; k++) + for (l = 0; l < 4; l++) + sl_param.ScalingMatrixRec4x4[j - 2][k][l] = sl->scaling_matrix_rec[j][l * 4 + k]; + + for (j = 8; j < 28; j++) + for (k = 0; k < 8; k++) + for (l = 0; l < 8; l++) + sl_param.ScalingMatrixRec8x8[j - 8][k][l] = sl->scaling_matrix_rec[j][l * 8 + k]; + + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VAIQMatrixBufferType, + &sl_param, sizeof(VAScalingListVVC)); + if (err < 0) + goto fail; + } + } + + for (i = 0; i <= pps->pps_num_exp_tile_columns_minus1; i++) { + tile_dim = pps->pps_tile_column_width_minus1[i]; + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VATileBufferType, + &tile_dim, sizeof(tile_dim)); + if (err < 0) + goto fail; + } + + for (i = 0; i <= pps->pps_num_exp_tile_rows_minus1; i++) { + tile_dim = pps->pps_tile_row_height_minus1[i]; + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VATileBufferType, + &tile_dim, sizeof(tile_dim)); + if (err < 0) + goto fail; + } + + if (!pps->pps_no_pic_partition_flag && pps->pps_rect_slice_flag && !pps->pps_single_slice_per_subpic_flag) { + for (i = 0; i <= pps->pps_num_slices_in_pic_minus1; i++) { + for (j = 0; j < pps->pps_num_exp_slices_in_tile[i]; j++) { + exp_slice_height_in_ctus[i + j] = pps->pps_exp_slice_height_in_ctus_minus1[i][j] + 1; + } + } + for (i = 0; i <= pps->pps_num_slices_in_pic_minus1; i++) { + VASliceStructVVC ss_param = { + .SliceTopLeftTileIdx = pps->slice_top_left_tile_idx[i], + .pps_slice_width_in_tiles_minus1 = pps->pps_slice_width_in_tiles_minus1[i], + .pps_slice_height_in_tiles_minus1 = pps->pps_slice_height_in_tiles_minus1[i], + }; + + if (pps->pps_slice_width_in_tiles_minus1[i] > 0 || pps->pps_slice_height_in_tiles_minus1[i] > 0) + ss_param.pps_exp_slice_height_in_ctus_minus1 = 0; + else { + if (pps->num_slices_in_tile[i] == 1) + ss_param.pps_exp_slice_height_in_ctus_minus1 = pps->row_height_val[pps->slice_top_left_tile_idx[i] / pps->num_tile_columns] - 1; + else if (exp_slice_height_in_ctus[i]) + ss_param.pps_exp_slice_height_in_ctus_minus1 = exp_slice_height_in_ctus[i] - 1; + else + continue; + } + + err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic, + VASliceStructBufferType, + &ss_param, sizeof(VASliceStructVVC)); + if (err < 0) + goto fail; + } + } + + return 0; + +fail: + ff_vaapi_decode_cancel(avctx, &pic->pic); + return err; +} + +static uint8_t get_ref_pic_index(const VVCContext *h, const VVCFrame *frame) +{ + VVCFrameContext *fc = &h->fcs[(h->nb_frames + h->nb_fcs) % h->nb_fcs]; + VAAPIDecodePictureVVC *pic = fc->ref->hwaccel_picture_private; + VAPictureParameterBufferVVC *pp = (VAPictureParameterBufferVVC *)&pic->pic_param; + uint8_t i; + + if (!frame) + return 0xFF; + + for (i = 0; i < FF_ARRAY_ELEMS(pp->ReferenceFrames); i++) { + VASurfaceID pid = pp->ReferenceFrames[i].picture_id; + int poc = pp->ReferenceFrames[i].pic_order_cnt; + if (pid != VA_INVALID_ID && pid == ff_vaapi_get_surface_id(frame->frame) && poc == frame->poc) + return i; + } + + return 0xFF; +} + +static int get_slice_data_offset(const uint8_t *buffer, uint32_t size, const SliceContext* sc) +{ + const H266RawSlice *slice = sc->ref; + int num_identical_bytes = slice->data_size < 32 ? slice->data_size : 32; + + for (int i = 0; i < size; i++) { + int skip_bytes = 0; + if (i >=2 && buffer[i] == 0x03 && !buffer[i - 1] && !buffer[i - 2]) + continue; + + for (int j = 0; j < num_identical_bytes; j++) { + if (i >= 2 && buffer[i + j + skip_bytes] == 0x03 && !buffer[i + j + skip_bytes - 1] && !buffer[i + j + skip_bytes - 2]) + skip_bytes++; + + if (buffer[i + j + skip_bytes] != slice->data[j]) + break; + + if (j + 1 == num_identical_bytes) + return i; + } + } + + return 0; +} + +static int vaapi_vvc_decode_slice(AVCodecContext *avctx, + const uint8_t *buffer, + uint32_t size) +{ + const VVCContext *h = avctx->priv_data; + VVCFrameContext *fc = &h->fcs[(h->nb_frames + h->nb_fcs) % h->nb_fcs]; + const SliceContext *sc = fc->slices[fc->nb_slices]; + const H266RawPPS *pps = fc->ps.pps->r; + const H266RawPictureHeader *ph = fc->ps.ph.r; + const H266RawSliceHeader *sh = sc->sh.r; + VAAPIDecodePictureVVC *pic = fc->ref->hwaccel_picture_private; + VASliceParameterBufferVVC *slice_param = &pic->slice_param; + int nb_list, i, err; + + *slice_param = (VASliceParameterBufferVVC) { + .slice_data_size = size, + .slice_data_offset = 0, + .slice_data_flag = VA_SLICE_DATA_FLAG_ALL, + .slice_data_byte_offset = get_slice_data_offset(buffer, size, sc), + .sh_subpic_id = sh->sh_subpic_id, + .sh_slice_address = sh->sh_slice_address, + .sh_num_tiles_in_slice_minus1 = sh->sh_num_tiles_in_slice_minus1, + .sh_slice_type = sh->sh_slice_type, + .sh_num_alf_aps_ids_luma = sh->sh_num_alf_aps_ids_luma, + .sh_alf_aps_id_chroma = sh->sh_alf_aps_id_chroma, + .sh_alf_cc_cb_aps_id = sh->sh_alf_cc_cb_aps_id, + .sh_alf_cc_cr_aps_id = sh->sh_alf_cc_cr_aps_id, + .NumRefIdxActive[0] = sh->num_ref_idx_active[0], + .NumRefIdxActive[1] = sh->num_ref_idx_active[1], + .sh_collocated_ref_idx = sh->sh_collocated_ref_idx, + .SliceQpY = pps->pps_qp_delta_info_in_ph_flag ? + 26 + pps->pps_init_qp_minus26 + ph->ph_qp_delta : + 26 + pps->pps_init_qp_minus26 + sh->sh_qp_delta, + .sh_cb_qp_offset = sh->sh_cb_qp_offset, + .sh_cr_qp_offset = sh->sh_cr_qp_offset, + .sh_joint_cbcr_qp_offset = sh->sh_joint_cbcr_qp_offset, + .sh_luma_beta_offset_div2 = sh->sh_luma_beta_offset_div2, + .sh_luma_tc_offset_div2 = sh->sh_luma_tc_offset_div2, + .sh_cb_beta_offset_div2 = sh->sh_cb_beta_offset_div2, + .sh_cb_tc_offset_div2 = sh->sh_cb_tc_offset_div2, + .sh_cr_beta_offset_div2 = sh->sh_cr_beta_offset_div2, + .sh_cr_tc_offset_div2 = sh->sh_cr_tc_offset_div2, + .WPInfo = { + .luma_log2_weight_denom = sh->sh_pred_weight_table.luma_log2_weight_denom, + .delta_chroma_log2_weight_denom = sh->sh_pred_weight_table.delta_chroma_log2_weight_denom, + .num_l0_weights = sh->sh_pred_weight_table.num_l0_weights, + .num_l1_weights = sh->sh_pred_weight_table.num_l1_weights, + }, + .sh_flags.bits = { + .sh_alf_enabled_flag = sh->sh_alf_enabled_flag, + .sh_alf_cb_enabled_flag = sh->sh_alf_cb_enabled_flag, + .sh_alf_cr_enabled_flag = sh->sh_alf_cr_enabled_flag, + .sh_alf_cc_cb_enabled_flag = sh->sh_alf_cc_cb_enabled_flag, + .sh_alf_cc_cr_enabled_flag = sh->sh_alf_cc_cr_enabled_flag, + .sh_lmcs_used_flag = sh->sh_lmcs_used_flag, + .sh_explicit_scaling_list_used_flag = sh->sh_explicit_scaling_list_used_flag, + .sh_cabac_init_flag = sh->sh_cabac_init_flag, + .sh_collocated_from_l0_flag = sh->sh_collocated_from_l0_flag, + .sh_cu_chroma_qp_offset_enabled_flag = sh->sh_cu_chroma_qp_offset_enabled_flag, + .sh_sao_luma_used_flag = sh->sh_sao_luma_used_flag, + .sh_sao_chroma_used_flag = sh->sh_sao_chroma_used_flag, + .sh_deblocking_filter_disabled_flag = sh->sh_deblocking_filter_disabled_flag, + .sh_dep_quant_used_flag = sh->sh_dep_quant_used_flag, + .sh_sign_data_hiding_used_flag = sh->sh_sign_data_hiding_used_flag, + .sh_ts_residual_coding_disabled_flag = sh->sh_ts_residual_coding_disabled_flag, + }, + }; + + memset(&slice_param->RefPicList, 0xFF, sizeof(slice_param->RefPicList)); + + nb_list = (sh->sh_slice_type == VVC_SLICE_TYPE_B) ? + 2 : (sh->sh_slice_type == VVC_SLICE_TYPE_I ? 0 : 1); + for (int list_idx = 0; list_idx < nb_list; list_idx++) { + RefPicList *rpl = &sc->rpl[list_idx]; + + for (i = 0; i < rpl->nb_refs; i++) + slice_param->RefPicList[list_idx][i] = get_ref_pic_index(h, rpl->refs[i].ref); + } + + for (i = 0; i < 7; i++) + slice_param->sh_alf_aps_id_luma[i] = sh->sh_alf_aps_id_luma[i]; + + for (i = 0; i < 15; i++) { + slice_param->WPInfo.luma_weight_l0_flag[i] = sh->sh_pred_weight_table.luma_weight_l0_flag[i]; + slice_param->WPInfo.chroma_weight_l0_flag[i] = sh->sh_pred_weight_table.chroma_weight_l0_flag[i]; + slice_param->WPInfo.delta_luma_weight_l0[i] = sh->sh_pred_weight_table.delta_luma_weight_l0[i]; + slice_param->WPInfo.luma_offset_l0[i] = sh->sh_pred_weight_table.luma_offset_l0[i]; + slice_param->WPInfo.luma_weight_l1_flag[i] = sh->sh_pred_weight_table.luma_weight_l1_flag[i]; + slice_param->WPInfo.chroma_weight_l1_flag[i] = sh->sh_pred_weight_table.chroma_weight_l1_flag[i]; + slice_param->WPInfo.delta_luma_weight_l1[i] = sh->sh_pred_weight_table.delta_luma_weight_l1[i]; + slice_param->WPInfo.luma_offset_l1[i] = sh->sh_pred_weight_table.luma_offset_l1[i]; + } + + for (i = 0; i < 15; i++) { + for (int j = 0; j < 2; j++) { + slice_param->WPInfo.delta_chroma_weight_l0[i][j] = sh->sh_pred_weight_table.delta_chroma_weight_l0[i][j]; + slice_param->WPInfo.delta_chroma_offset_l0[i][j] = sh->sh_pred_weight_table.delta_chroma_offset_l0[i][j]; + slice_param->WPInfo.delta_chroma_weight_l1[i][j] = sh->sh_pred_weight_table.delta_chroma_weight_l1[i][j]; + slice_param->WPInfo.delta_chroma_offset_l1[i][j] = sh->sh_pred_weight_table.delta_chroma_offset_l1[i][j]; + } + } + + err = ff_vaapi_decode_make_slice_buffer(avctx, &pic->pic, + &pic->slice_param, 1, + sizeof(VASliceParameterBufferVVC), + buffer, size); + if (err) { + ff_vaapi_decode_cancel(avctx, &pic->pic); + return err; + } + + return 0; +} + +static int vaapi_vvc_end_frame(AVCodecContext *avctx) +{ + + const VVCContext *h = avctx->priv_data; + VVCFrameContext *fc = &h->fcs[(h->nb_frames + h->nb_fcs) % h->nb_fcs]; + VAAPIDecodePictureVVC *pic = fc->ref->hwaccel_picture_private; + int ret; + + ret = ff_vaapi_decode_issue(avctx, &pic->pic); + if (ret < 0) + goto fail; + + pic->decode_issued = 1; + + return 0; + +fail: + ff_vaapi_decode_cancel(avctx, &pic->pic); + return ret; +} + +const FFHWAccel ff_vvc_vaapi_hwaccel = { + .p.name = "vvc_vaapi", + .p.type = AVMEDIA_TYPE_VIDEO, + .p.id = AV_CODEC_ID_VVC, + .p.pix_fmt = AV_PIX_FMT_VAAPI, + .start_frame = &vaapi_vvc_start_frame, + .end_frame = &vaapi_vvc_end_frame, + .decode_slice = &vaapi_vvc_decode_slice, + .frame_priv_data_size = sizeof(VAAPIDecodePictureVVC), + .init = &ff_vaapi_decode_init, + .uninit = &ff_vaapi_decode_uninit, + .frame_params = &ff_vaapi_common_frame_params, + .priv_data_size = sizeof(VAAPIDecodeContext), + .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +}; diff --git a/libavcodec/version.h b/libavcodec/version.h index 9b8c267529..82a86fe9d9 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 15 +#define LIBAVCODEC_VERSION_MINOR 16 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ diff --git a/libavcodec/vvc/dec.c b/libavcodec/vvc/dec.c index c9f0e44889..9e1f0a2e90 100644 --- a/libavcodec/vvc/dec.c +++ b/libavcodec/vvc/dec.c @@ -35,6 +35,7 @@ #include "data.h" #include "refs.h" #include "thread.h" +#include "config_components.h" #define TAB_MAX 32 @@ -776,14 +777,20 @@ static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, static enum AVPixelFormat get_format(AVCodecContext *avctx, const VVCSPS *sps) { -#define HWACCEL_MAX 0 +#define HWACCEL_MAX CONFIG_VVC_VAAPI_HWACCEL enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts; switch (sps->pix_fmt) { case AV_PIX_FMT_YUV420P: +#if CONFIG_VVC_VAAPI_HWACCEL + *fmt++ = AV_PIX_FMT_VAAPI; +#endif break; case AV_PIX_FMT_YUV420P10: +#if CONFIG_VVC_VAAPI_HWACCEL + *fmt++ = AV_PIX_FMT_VAAPI; +#endif break; } @@ -1165,4 +1172,10 @@ const FFCodec ff_vvc_decoder = { .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING | FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_AUTO_THREADS, .p.profiles = NULL_IF_CONFIG_SMALL(ff_vvc_profiles), + .hw_configs = (const AVCodecHWConfigInternal *const []) { +#if CONFIG_VVC_VAAPI_HWACCEL + HWACCEL_VAAPI(vvc), +#endif + NULL + }, };