From patchwork Fri Jul 28 01:20:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Cheng X-Patchwork-Id: 43011 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7927:b0:130:ccc6:6c4b with SMTP id b39csp360482pzg; Thu, 27 Jul 2023 18:21:20 -0700 (PDT) X-Google-Smtp-Source: APBJJlEdUISzpbWG3TBUltgol/mnH9oK/kj7d6qoHVD97/1GLGQbhlD443jNuHr53kEjGOLwef9O X-Received: by 2002:a2e:8197:0:b0:2b6:c8e8:915f with SMTP id e23-20020a2e8197000000b002b6c8e8915fmr625217ljg.22.1690507279980; Thu, 27 Jul 2023 18:21:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690507279; cv=none; d=google.com; s=arc-20160816; b=qZVgHeYBOOXLpraZdQOFNiRcFdYX/UBw+akrIPnMjiP1GDNfIfWk+pEdvUPkoyx3Xf AL20sH5QXs/VWh+iqABZW/RHp/nryw6NYHrOjRnvbJApEX8Ee+6GWhxA5kuirDOpFBr5 WvCFYOhThmLKE3J/4PL5VKEtNtXuZLrojUH3gipUhqir+ns41w4kX5P6CDqFstB1Sz/D tnPOO9+Me5j6ALxQbiqANJF1fU7Bwjnn2wbvBUJ6VUg63sYMJui3/ROG3kz8AKot1e5b vgz1jTT/ZImd56LgOoFFQX4/9mcezh7MyfrhrK2VyQsZ/v/CEOc5htNhFaEKu0bsC8IF kRCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; 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=JBWAHWIHCzv4e/CQzZLwLWZ5XBxTLCTPO5SmKuvg68o=; fh=nIiBA5N5VLEOhrD4Hg6puXpJPA/uiw+r2g9MqSStBWs=; b=JR2Ieyc5Mfk+WZhtzpSX+PmnXw/eBUq1gDLZ7sqYutpagBslckcbnitc9UT1v4RX25 oG7jiSKOmCRg2YsU1ySHUcoZbkhbdEG6mnaEMEc6IDkxBjgdxnf70rIl8Wtn8hy0CEYj EiFpsrUmhwSM+2yVenvq8vYfGLPqimk7lFwQSLYz+TJq/iZepQuRV4tUHoKyA/uWbGzm Rcqx3R6rI80/ykpt4rnP/byG8Ylz7CR2xTiSsVsL/N8s6cAMQkROPeuzOrU08w4dvd3Y TGtB+/ow8YPZwrzul1PJxSG58KfvkPz+X6hV/QIcvt87wo+wZ7AmCjKvTUKSmVo6Coem xdtw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@bcheng.me header.s=key1 header.b=KoSOnXDj; 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; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=bcheng.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j13-20020a17090686cd00b0098dafe075ccsi1828986ejy.97.2023.07.27.18.21.19; Thu, 27 Jul 2023 18:21: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=@bcheng.me header.s=key1 header.b=KoSOnXDj; 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; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=bcheng.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5397D68CA6F; Fri, 28 Jul 2023 04:21:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out-118.mta1.migadu.com (out-118.mta1.migadu.com [95.215.58.118]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 304D068C613 for ; Fri, 28 Jul 2023 04:21:09 +0300 (EEST) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bcheng.me; s=key1; t=1690507268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=yQp2EtKUDvcUzBmbXRJEieTrVolDUj751ftIUjws6Mk=; b=KoSOnXDjiEqudwf9vyC6zjVvqnS0MhawG4g2iLlNFJi/LI1TN7RTXM2EF/CkJBcT4qwNKK uG6Kh+8d/T6hErcczbuQhNCcM9ygDqKtEbZdA1x99/sERSwITzq66pRdLZLMgleHBOdJWt Ib8D2M8ocnORf2kF0cCbQNKOX1EYRlASUG0TwFDX19DN8+pzYF6qw61tEFnSsYA6tvGDFJ cBeoBJfM1m+0Ul5FGX4R/Ubs3QmuHm/ZuT9ui3nA5m7GKf7HBM2qMjy7Z6pKAOzsTc5Ab5 eTKLwS/kSBglpzGbA3bW6v0tzIcyJ9zqcs2YD6eXixg7nxGeWdLpjD3C4XeXAw== From: Benjamin Cheng To: ffmpeg-devel@ffmpeg.org Date: Thu, 27 Jul 2023 21:20:49 -0400 Message-ID: <20230728012049.37515-1-ben@bcheng.me> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT Subject: [FFmpeg-devel] [PATCH v2] vulkan_hevc: use diagonal scan order for scaling lists 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: Benjamin Cheng Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Fo5X0LUHiJd8 The hevc parser parses the diagonal scan order in bitstream into raster scan order. However, the Vulkan spec wants it as specified in H265 spec, which is diagonal scan order. Tested on RADV. v2: fix copy-paste typo with PPS. --- libavcodec/vulkan_hevc.c | 83 ++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/libavcodec/vulkan_hevc.c b/libavcodec/vulkan_hevc.c index ab0f6b96d0..1f157faf87 100644 --- a/libavcodec/vulkan_hevc.c +++ b/libavcodec/vulkan_hevc.c @@ -17,6 +17,7 @@ */ #include "hevcdec.h" +#include "hevc_data.h" #include "hevc_ps.h" #include "vulkan_decode.h" @@ -205,6 +206,44 @@ static StdVideoH265LevelIdc convert_to_vk_level_idc(int level_idc) } } +static void copy_scaling_list(const ScalingList *sl, + StdVideoH265ScalingLists *vksl) +{ + for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS; i++) { + for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS; j++) { + uint8_t pos = 4 * ff_hevc_diag_scan4x4_y[j] + ff_hevc_diag_scan4x4_x[j]; + vksl->ScalingList4x4[i][j] = sl->sl[0][i][pos]; + } + } + + for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS; i++) { + for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS; j++) { + uint8_t pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j]; + vksl->ScalingList8x8[i][j] = sl->sl[1][i][pos]; + } + } + + for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS; i++) { + for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS; j++) { + uint8_t pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j]; + vksl->ScalingList16x16[i][j] = sl->sl[2][i][pos]; + } + } + + for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) { + for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS; j++) { + uint8_t pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j]; + vksl->ScalingList32x32[i][j] = sl->sl[3][i * 3][pos]; + } + } + + memcpy(vksl->ScalingListDCCoef16x16, sl->sl_dc[0], + STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS * sizeof(*vksl->ScalingListDCCoef16x16)); + + for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) + vksl->ScalingListDCCoef32x32[i] = sl->sl_dc[1][i * 3]; +} + static void set_sps(const HEVCSPS *sps, int sps_idx, StdVideoH265ScalingLists *vksps_scaling, StdVideoH265HrdParameters *vksps_vui_header, @@ -218,27 +257,7 @@ static void set_sps(const HEVCSPS *sps, int sps_idx, StdVideoH265ShortTermRefPicSet *str, StdVideoH265LongTermRefPicsSps *ltr) { - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS; i++) - memcpy(vksps_scaling->ScalingList4x4[i], sps->scaling_list.sl[0][i], - STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS * sizeof(**vksps_scaling->ScalingList4x4)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS; i++) - memcpy(vksps_scaling->ScalingList8x8[i], sps->scaling_list.sl[1][i], - STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS * sizeof(**vksps_scaling->ScalingList8x8)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS; i++) - memcpy(vksps_scaling->ScalingList16x16[i], sps->scaling_list.sl[2][i], - STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS * sizeof(**vksps_scaling->ScalingList16x16)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) - memcpy(vksps_scaling->ScalingList32x32[i], sps->scaling_list.sl[3][i * 3], - STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS * sizeof(**vksps_scaling->ScalingList32x32)); - - memcpy(vksps_scaling->ScalingListDCCoef16x16, sps->scaling_list.sl_dc[0], - STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS * sizeof(*vksps_scaling->ScalingListDCCoef16x16)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) - vksps_scaling->ScalingListDCCoef32x32[i] = sps->scaling_list.sl_dc[1][i * 3]; + copy_scaling_list(&sps->scaling_list, vksps_scaling); *vksps_vui_header = (StdVideoH265HrdParameters) { .flags = (StdVideoH265HrdFlags) { @@ -464,27 +483,7 @@ static void set_pps(const HEVCPPS *pps, const HEVCSPS *sps, StdVideoH265PictureParameterSet *vkpps, StdVideoH265PredictorPaletteEntries *pal) { - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS; i++) - memcpy(vkpps_scaling->ScalingList4x4[i], pps->scaling_list.sl[0][i], - STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS * sizeof(**vkpps_scaling->ScalingList4x4)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS; i++) - memcpy(vkpps_scaling->ScalingList8x8[i], pps->scaling_list.sl[1][i], - STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS * sizeof(**vkpps_scaling->ScalingList8x8)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS; i++) - memcpy(vkpps_scaling->ScalingList16x16[i], pps->scaling_list.sl[2][i], - STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS * sizeof(**vkpps_scaling->ScalingList16x16)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) - memcpy(vkpps_scaling->ScalingList32x32[i], pps->scaling_list.sl[3][i * 3], - STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS * sizeof(**vkpps_scaling->ScalingList32x32)); - - memcpy(vkpps_scaling->ScalingListDCCoef16x16, pps->scaling_list.sl_dc[0], - STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS * sizeof(*vkpps_scaling->ScalingListDCCoef16x16)); - - for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) - vkpps_scaling->ScalingListDCCoef32x32[i] = sps->scaling_list.sl_dc[1][i * 3]; + copy_scaling_list(&pps->scaling_list, vkpps_scaling); *vkpps = (StdVideoH265PictureParameterSet) { .flags = (StdVideoH265PpsFlags) {