mbox series

[v5,00/13] AV1 stateless decoder for RK3588

Message ID 20230330154043.1250736-1-benjamin.gaignard@collabora.com
Headers show
Series AV1 stateless decoder for RK3588 | expand

Message

Benjamin Gaignard March 30, 2023, 3:40 p.m. UTC
This series implement AV1 stateless decoder for RK3588 SoC.
The hardware support 8 and 10 bits bitstreams up to 7680x4320.
AV1 feature like film grain or scaling are done by the postprocessor.
The driver can produce NV12_4L4, NV12_10LE40_4L4, NV12 and P010 pixels formats.
Even if Rockchip have named the hardware VPU981 it looks like a VC9000 but 
with a different registers mapping.

The series is based on Hans's br-v6.4f branch + "media: Add AV1 uAPI"
patch v7.
The full branch can be found here:
https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v5

Fluster score is: 200/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0.
The failing tests are:
- the 2 tests with 2 spatial layers: few errors in luma/chroma values
- tests with resolution < hardware limit (64x64)
- 10bits film grain test: bad macroblocks while decoding, the same 8bits
  test is working fine.

Changes in v5:
- Add a patch to initialize bit_depth field of V4L2_CTRL_TYPE_AV1_SEQUENCE
  ioctl.

Changes in v4:
- Squash "Save bit depth for AV1 decoder" and "Check AV1 bitstreams bit
  depth" patches.
- Double motion vectors buffer size.
- Fix the various errors reported by Hans.

Changes in v3:
- Fix arrays loops limites.
- Remove unused field.
- Reset raw pixel formats list when bit depth or film grain feature
  values change.
- Enable post-processor P010 support

Changes in v2:
- Remove useless +1 in sbs computation. 
- Describe NV12_10LE40_4L4 pixels format.
- Post-processor could generate P010.
- Fix comments done on v1.
- The last patch make sure that only post-processed formats are used when film
  grain feature is enabled.

Benjamin

Benjamin Gaignard (12):
  dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible
  media: Add NV12_10LE40_4L4 pixel format
  media: verisilicon: Get bit depth for V4L2_PIX_FMT_NV12_10LE40_4L4
  media: verisilicon: Add AV1 decoder mode and controls
  media: verisilicon: Check AV1 bitstreams bit depth
  media: verisilicon: Compute motion vectors size for AV1 frames
  media: verisilicon: Add AV1 entropy helpers
  media: verisilicon: Add Rockchip AV1 decoder
  media: verisilicon: Add film grain feature to AV1 driver
  media: verisilicon: Enable AV1 decoder on rk3588
  media: verisilicon: Conditionally ignore native formats
  media: AV1: Make sure that bit depth in correctly initialize

Nicolas Dufresne (1):
  v4l2-common: Add support for fractional bpp

 .../bindings/media/rockchip-vpu.yaml          |    1 +
 .../media/v4l/pixfmt-yuv-planar.rst           |    4 +
 drivers/media/platform/verisilicon/Makefile   |    3 +
 drivers/media/platform/verisilicon/hantro.h   |    8 +
 .../media/platform/verisilicon/hantro_drv.c   |   68 +-
 .../media/platform/verisilicon/hantro_hw.h    |  102 +
 .../platform/verisilicon/hantro_postproc.c    |    9 +-
 .../media/platform/verisilicon/hantro_v4l2.c  |   67 +-
 .../media/platform/verisilicon/hantro_v4l2.h  |    5 +-
 .../verisilicon/rockchip_av1_entropymode.c    | 4424 +++++++++++++++++
 .../verisilicon/rockchip_av1_entropymode.h    |  272 +
 .../verisilicon/rockchip_av1_filmgrain.c      |  401 ++
 .../verisilicon/rockchip_av1_filmgrain.h      |   36 +
 .../verisilicon/rockchip_vpu981_hw_av1_dec.c  | 2234 +++++++++
 .../verisilicon/rockchip_vpu981_regs.h        |  477 ++
 .../platform/verisilicon/rockchip_vpu_hw.c    |  134 +
 drivers/media/v4l2-core/v4l2-common.c         |  149 +-
 drivers/media/v4l2-core/v4l2-ctrls-core.c     |    5 +
 drivers/media/v4l2-core/v4l2-ioctl.c          |    1 +
 include/media/v4l2-common.h                   |    2 +
 include/uapi/linux/videodev2.h                |    1 +
 21 files changed, 8306 insertions(+), 97 deletions(-)
 create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c
 create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h
 create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c
 create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h
 create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
 create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h

Comments

Hans Verkuil April 11, 2023, 12:33 p.m. UTC | #1
Hi Benjamin,

On 30/03/2023 17:40, Benjamin Gaignard wrote:
> Implement AV1 stateless decoder for rockchip VPU981.
> It decode 8 and 10 bits AV1 bitstreams.
> AV1 scaling feature is done by the postprocessor.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> ---
>  drivers/media/platform/verisilicon/Makefile   |    1 +
>  .../media/platform/verisilicon/hantro_hw.h    |   64 +-
>  .../verisilicon/rockchip_vpu981_hw_av1_dec.c  | 2024 +++++++++++++++++
>  .../verisilicon/rockchip_vpu981_regs.h        |  477 ++++
>  4 files changed, 2564 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h
> 

<snip>

> +static void rockchip_vpu981_av1_dec_set_tile_info(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	struct v4l2_av1_tile_info tile_info = ctrls->frame->tile_info;

I get this warning:

drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c: In function 'rockchip_vpu981_av1_dec_set_tile_info':
drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c:635:1: warning: the frame size of 1080 bytes is larger than 1024 bytes [-Wframe-larger-than=]
  635 | }
      | ^

The cause is this tile_info struct that is on the stack.

Does this have to be a copy? Or can it be a pointer to ctrls->frame->tile_info?

> +	const struct v4l2_ctrl_av1_tile_group_entry *group_entry =
> +	    ctrls->tile_group_entry;
> +	int context_update_y =
> +	    tile_info.context_update_tile_id / tile_info.tile_cols;
> +	int context_update_x =
> +	    tile_info.context_update_tile_id % tile_info.tile_cols;
> +	int context_update_tile_id =
> +	    context_update_x * tile_info.tile_rows + context_update_y;
> +	u8 *dst = av1_dec->tile_info.cpu;
> +	struct hantro_dev *vpu = ctx->dev;
> +	int tile0, tile1;
> +
> +	memset(dst, 0, av1_dec->tile_info.size);
> +
> +	for (tile0 = 0; tile0 < tile_info.tile_cols; tile0++) {
> +		for (tile1 = 0; tile1 < tile_info.tile_rows; tile1++) {
> +			int tile_id = tile1 * tile_info.tile_cols + tile0;
> +			u32 start, end;
> +			u32 y0 =
> +			    tile_info.height_in_sbs_minus_1[tile1] + 1;
> +			u32 x0 = tile_info.width_in_sbs_minus_1[tile0] + 1;
> +
> +			// tile size in SB units (width,height)
> +			*dst++ = x0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +			*dst++ = y0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +
> +			// tile start position
> +			start = group_entry[tile_id].tile_offset - group_entry[0].tile_offset;
> +			*dst++ = start & 255;
> +			*dst++ = (start >> 8) & 255;
> +			*dst++ = (start >> 16) & 255;
> +			*dst++ = (start >> 24) & 255;
> +
> +			// # of bytes in tile data
> +			end = start + group_entry[tile_id].tile_size;
> +			*dst++ = end & 255;
> +			*dst++ = (end >> 8) & 255;
> +			*dst++ = (end >> 16) & 255;
> +			*dst++ = (end >> 24) & 255;
> +		}
> +	}
> +
> +	hantro_reg_write(vpu, &av1_multicore_expect_context_update,
> +			 !!(context_update_x == 0));
> +	hantro_reg_write(vpu, &av1_tile_enable,
> +			 !!((tile_info.tile_cols > 1) || (tile_info.tile_rows > 1)));
> +	hantro_reg_write(vpu, &av1_num_tile_cols_8k, tile_info.tile_cols);
> +	hantro_reg_write(vpu, &av1_num_tile_rows_8k, tile_info.tile_rows);
> +	hantro_reg_write(vpu, &av1_context_update_tile_id,
> +			 context_update_tile_id);
> +	hantro_reg_write(vpu, &av1_tile_transpose, 1);
> +	if (rockchip_vpu981_av1_tile_log2(tile_info.tile_cols) ||
> +	    rockchip_vpu981_av1_tile_log2(tile_info.tile_rows))
> +		hantro_reg_write(vpu, &av1_dec_tile_size_mag, tile_info.tile_size_bytes - 1);
> +	else
> +		hantro_reg_write(vpu, &av1_dec_tile_size_mag, 3);
> +
> +	hantro_write_addr(vpu, AV1_TILE_BASE, av1_dec->tile_info.dma);
> +}

Regards,

	Hans
Benjamin Gaignard April 11, 2023, 1:39 p.m. UTC | #2
Le 11/04/2023 à 14:33, Hans Verkuil a écrit :
> Hi Benjamin,
>
> On 30/03/2023 17:40, Benjamin Gaignard wrote:
>> Implement AV1 stateless decoder for rockchip VPU981.
>> It decode 8 and 10 bits AV1 bitstreams.
>> AV1 scaling feature is done by the postprocessor.
>>
>> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
>> ---
>>   drivers/media/platform/verisilicon/Makefile   |    1 +
>>   .../media/platform/verisilicon/hantro_hw.h    |   64 +-
>>   .../verisilicon/rockchip_vpu981_hw_av1_dec.c  | 2024 +++++++++++++++++
>>   .../verisilicon/rockchip_vpu981_regs.h        |  477 ++++
>>   4 files changed, 2564 insertions(+), 2 deletions(-)
>>   create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
>>   create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h
>>
> <snip>
>
>> +static void rockchip_vpu981_av1_dec_set_tile_info(struct hantro_ctx *ctx)
>> +{
>> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
>> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
>> +	struct v4l2_av1_tile_info tile_info = ctrls->frame->tile_info;
> I get this warning:
>
> drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c: In function 'rockchip_vpu981_av1_dec_set_tile_info':
> drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c:635:1: warning: the frame size of 1080 bytes is larger than 1024 bytes [-Wframe-larger-than=]
>    635 | }
>        | ^
>
> The cause is this tile_info struct that is on the stack.
>
> Does this have to be a copy? Or can it be a pointer to ctrls->frame->tile_info?

Using a pointer is a good solution.
Thanks for the finding.

I will include that in v6.

Regards,
Benjamin

>
>> +	const struct v4l2_ctrl_av1_tile_group_entry *group_entry =
>> +	    ctrls->tile_group_entry;
>> +	int context_update_y =
>> +	    tile_info.context_update_tile_id / tile_info.tile_cols;
>> +	int context_update_x =
>> +	    tile_info.context_update_tile_id % tile_info.tile_cols;
>> +	int context_update_tile_id =
>> +	    context_update_x * tile_info.tile_rows + context_update_y;
>> +	u8 *dst = av1_dec->tile_info.cpu;
>> +	struct hantro_dev *vpu = ctx->dev;
>> +	int tile0, tile1;
>> +
>> +	memset(dst, 0, av1_dec->tile_info.size);
>> +
>> +	for (tile0 = 0; tile0 < tile_info.tile_cols; tile0++) {
>> +		for (tile1 = 0; tile1 < tile_info.tile_rows; tile1++) {
>> +			int tile_id = tile1 * tile_info.tile_cols + tile0;
>> +			u32 start, end;
>> +			u32 y0 =
>> +			    tile_info.height_in_sbs_minus_1[tile1] + 1;
>> +			u32 x0 = tile_info.width_in_sbs_minus_1[tile0] + 1;
>> +
>> +			// tile size in SB units (width,height)
>> +			*dst++ = x0;
>> +			*dst++ = 0;
>> +			*dst++ = 0;
>> +			*dst++ = 0;
>> +			*dst++ = y0;
>> +			*dst++ = 0;
>> +			*dst++ = 0;
>> +			*dst++ = 0;
>> +
>> +			// tile start position
>> +			start = group_entry[tile_id].tile_offset - group_entry[0].tile_offset;
>> +			*dst++ = start & 255;
>> +			*dst++ = (start >> 8) & 255;
>> +			*dst++ = (start >> 16) & 255;
>> +			*dst++ = (start >> 24) & 255;
>> +
>> +			// # of bytes in tile data
>> +			end = start + group_entry[tile_id].tile_size;
>> +			*dst++ = end & 255;
>> +			*dst++ = (end >> 8) & 255;
>> +			*dst++ = (end >> 16) & 255;
>> +			*dst++ = (end >> 24) & 255;
>> +		}
>> +	}
>> +
>> +	hantro_reg_write(vpu, &av1_multicore_expect_context_update,
>> +			 !!(context_update_x == 0));
>> +	hantro_reg_write(vpu, &av1_tile_enable,
>> +			 !!((tile_info.tile_cols > 1) || (tile_info.tile_rows > 1)));
>> +	hantro_reg_write(vpu, &av1_num_tile_cols_8k, tile_info.tile_cols);
>> +	hantro_reg_write(vpu, &av1_num_tile_rows_8k, tile_info.tile_rows);
>> +	hantro_reg_write(vpu, &av1_context_update_tile_id,
>> +			 context_update_tile_id);
>> +	hantro_reg_write(vpu, &av1_tile_transpose, 1);
>> +	if (rockchip_vpu981_av1_tile_log2(tile_info.tile_cols) ||
>> +	    rockchip_vpu981_av1_tile_log2(tile_info.tile_rows))
>> +		hantro_reg_write(vpu, &av1_dec_tile_size_mag, tile_info.tile_size_bytes - 1);
>> +	else
>> +		hantro_reg_write(vpu, &av1_dec_tile_size_mag, 3);
>> +
>> +	hantro_write_addr(vpu, AV1_TILE_BASE, av1_dec->tile_info.dma);
>> +}
> Regards,
>
> 	Hans
>
Nicolas Dufresne April 11, 2023, 3:07 p.m. UTC | #3
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> NV12_10LE40_4L4 is the 10-bits per component version of
> NV12_4L4 pixel format.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> ---
>  Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst | 4 ++++
>  drivers/media/v4l2-core/v4l2-common.c                       | 1 +
>  drivers/media/v4l2-core/v4l2-ioctl.c                        | 1 +
>  include/uapi/linux/videodev2.h                              | 1 +
>  4 files changed, 7 insertions(+)
> 
> diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst
> index f1d5bb7b806d..8805213a75f8 100644
> --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst
> +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst
> @@ -270,6 +270,7 @@ of the luma plane.
>  .. _V4L2-PIX-FMT-NV12MT:
>  .. _V4L2-PIX-FMT-NV12MT-16X16:
>  .. _V4L2-PIX-FMT-NV12-4L4:
> +.. _V4L2-PIX-FMT-NV12-10LE40-4L4:
>  .. _V4L2-PIX-FMT-NV12-16L16:
>  .. _V4L2-PIX-FMT-NV12-32L32:
>  .. _V4L2-PIX-FMT-NV12M-8L128:
> @@ -306,6 +307,9 @@ tiles linearly in memory. The line stride and image height must be
>  aligned to a multiple of 4. The layouts of the luma and chroma planes are
>  identical.
>  
> +``V4L2_PIX_FMT_NV12_10LE40_4L4`` is similar to ``V4L2_PIX_FMT_NV12_4L4``
> +and stores 10 bits pixels in 4x4 tiles.

I think this is not enough, as it does not describe the NV12_10E40 pixel
packing. We don't have that as a linear format yet in V4L2 (unlike
DRM_FORMAT_NV15 on DRM side). So I'd suggest to drop the usual bit packing table
here for now. Please ping Sebastien Fricke, as he got that for (along with
NV12_10LE40 base format) documented in his RKVDEC HEVC decoder work.

> 
> +
>  ``V4L2_PIX_FMT_NV12_16L16`` stores pixels in 16x16 tiles, and stores
>  tiles linearly in memory. The line stride and image height must be
>  aligned to a multiple of 16. The layouts of the luma and chroma planes are
> diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c
> index 9cb0895dea1c..7f46c45982d6 100644
> --- a/drivers/media/v4l2-core/v4l2-common.c
> +++ b/drivers/media/v4l2-core/v4l2-common.c
> @@ -278,6 +278,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format)
>  
>  		/* Tiled YUV formats */
>  		{ .format = V4L2_PIX_FMT_NV12_4L4, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .bpp_div = { 1, 1, 1, 1 }, .hdiv = 2, .vdiv = 2 },
> +		{ .format = V4L2_PIX_FMT_NV12_10LE40_4L4, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 5, 10, 0, 0 }, .bpp_div = { 4, 4, 1, 1 }, .hdiv = 2, .vdiv = 2 },

As you will be doing v6, can you initiallized the forgotten "block" parameters ?


>  		{ .format = V4L2_PIX_FMT_P010_4L4, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .bpp_div = { 1, 1, 1, 1 }, .hdiv = 2, .vdiv = 2 },
>  
>  		/* YUV planar formats, non contiguous variant */
> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> index d2b905ba5240..5a0c5b3a6b0f 100644
> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> @@ -1351,6 +1351,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
>  	case V4L2_PIX_FMT_NV12_4L4:	descr = "Y/UV 4:2:0 (4x4 Linear)"; break;
>  	case V4L2_PIX_FMT_NV12_16L16:	descr = "Y/UV 4:2:0 (16x16 Linear)"; break;
>  	case V4L2_PIX_FMT_NV12_32L32:   descr = "Y/UV 4:2:0 (32x32 Linear)"; break;
> +	case V4L2_PIX_FMT_NV12_10LE40_4L4: descr = "10-bit YUV 4:2:0 (4x4 Linear)"; break;
>  	case V4L2_PIX_FMT_P010_4L4:	descr = "10-bit Y/UV 4:2:0 (4x4 Linear)"; break;
>  	case V4L2_PIX_FMT_NV12M:	descr = "Y/UV 4:2:0 (N-C)"; break;
>  	case V4L2_PIX_FMT_NV21M:	descr = "Y/VU 4:2:0 (N-C)"; break;
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index 8cdc7967cdea..93e300111ca1 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -664,6 +664,7 @@ struct v4l2_pix_format {
>  #define V4L2_PIX_FMT_NV12_4L4 v4l2_fourcc('V', 'T', '1', '2')   /* 12  Y/CbCr 4:2:0  4x4 tiles */
>  #define V4L2_PIX_FMT_NV12_16L16 v4l2_fourcc('H', 'M', '1', '2') /* 12  Y/CbCr 4:2:0 16x16 tiles */
>  #define V4L2_PIX_FMT_NV12_32L32 v4l2_fourcc('S', 'T', '1', '2') /* 12  Y/CbCr 4:2:0 32x32 tiles */
> +#define V4L2_PIX_FMT_NV12_10LE40_4L4 v4l2_fourcc('V', 'T', '1', '5')
>  #define V4L2_PIX_FMT_P010_4L4 v4l2_fourcc('T', '0', '1', '0') /* 12  Y/CbCr 4:2:0 10-bit 4x4 macroblocks */
>  #define V4L2_PIX_FMT_NV12_8L128       v4l2_fourcc('A', 'T', '1', '2') /* Y/CbCr 4:2:0 8x128 tiles */
>  #define V4L2_PIX_FMT_NV12_10BE_8L128  v4l2_fourcc_be('A', 'X', '1', '2') /* Y/CbCr 4:2:0 10-bit 8x128 tiles */
Nicolas Dufresne April 11, 2023, 3:08 p.m. UTC | #4
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> Let's the driver knows that V4L2_PIX_FMT_NV12_10LE40_4L4 is a 10bits
> pixel format.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  drivers/media/platform/verisilicon/hantro_v4l2.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/media/platform/verisilicon/hantro_v4l2.c
> index d238d407f986..7ed2dfd4aefa 100644
> --- a/drivers/media/platform/verisilicon/hantro_v4l2.c
> +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c
> @@ -71,6 +71,7 @@ int hantro_get_format_depth(u32 fourcc)
>  	switch (fourcc) {
>  	case V4L2_PIX_FMT_P010:
>  	case V4L2_PIX_FMT_P010_4L4:
> +	case V4L2_PIX_FMT_NV12_10LE40_4L4:
>  		return 10;
>  	default:
>  		return 8;
Nicolas Dufresne April 11, 2023, 3:09 p.m. UTC | #5
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> The driver supports 8 and 10 bits bitstreams, make sure to discard
> other cases.
> It could happens that userland test if V4L2_CID_STATELESS_AV1_SEQUENCE
> exists without setting bit_depth field in this case use
> HANTRO_DEFAULT_BIT_DEPTH value.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  .../media/platform/verisilicon/hantro_drv.c   | 36 +++++++++++++++++++
>  .../media/platform/verisilicon/hantro_v4l2.c  |  4 +++
>  2 files changed, 40 insertions(+)
> 
> diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/media/platform/verisilicon/hantro_drv.c
> index 74641c972f1e..71bd68e63859 100644
> --- a/drivers/media/platform/verisilicon/hantro_drv.c
> +++ b/drivers/media/platform/verisilicon/hantro_drv.c
> @@ -275,7 +275,13 @@ static int hantro_try_ctrl(struct v4l2_ctrl *ctrl)
>  		/* We only support profile 0 */
>  		if (dec_params->profile != 0)
>  			return -EINVAL;
> +	} else if (ctrl->id == V4L2_CID_STATELESS_AV1_SEQUENCE) {
> +		const struct v4l2_ctrl_av1_sequence *sequence = ctrl->p_new.p_av1_sequence;
> +
> +		if (sequence->bit_depth != 8 && sequence->bit_depth != 10)
> +			return -EINVAL;
>  	}
> +
>  	return 0;
>  }
>  
> @@ -346,6 +352,30 @@ static int hantro_hevc_s_ctrl(struct v4l2_ctrl *ctrl)
>  	return 0;
>  }
>  
> +static int hantro_av1_s_ctrl(struct v4l2_ctrl *ctrl)
> +{
> +	struct hantro_ctx *ctx;
> +
> +	ctx = container_of(ctrl->handler,
> +			   struct hantro_ctx, ctrl_handler);
> +
> +	switch (ctrl->id) {
> +	case V4L2_CID_STATELESS_AV1_SEQUENCE:
> +	{
> +		int bit_depth = ctrl->p_new.p_av1_sequence->bit_depth;
> +
> +		if (ctx->bit_depth == bit_depth)
> +			return 0;
> +
> +		return hantro_reset_raw_fmt(ctx, bit_depth);
> +	}
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>  static const struct v4l2_ctrl_ops hantro_ctrl_ops = {
>  	.try_ctrl = hantro_try_ctrl,
>  };
> @@ -363,6 +393,11 @@ static const struct v4l2_ctrl_ops hantro_hevc_ctrl_ops = {
>  	.s_ctrl = hantro_hevc_s_ctrl,
>  };
>  
> +static const struct v4l2_ctrl_ops hantro_av1_ctrl_ops = {
> +	.try_ctrl = hantro_try_ctrl,
> +	.s_ctrl = hantro_av1_s_ctrl,
> +};
> +
>  #define HANTRO_JPEG_ACTIVE_MARKERS	(V4L2_JPEG_ACTIVE_MARKER_APP0 | \
>  					 V4L2_JPEG_ACTIVE_MARKER_COM | \
>  					 V4L2_JPEG_ACTIVE_MARKER_DQT | \
> @@ -540,6 +575,7 @@ static const struct hantro_ctrl controls[] = {
>  		.codec = HANTRO_AV1_DECODER,
>  		.cfg = {
>  			.id = V4L2_CID_STATELESS_AV1_SEQUENCE,
> +			.ops = &hantro_av1_ctrl_ops,
>  		},
>  	}, {
>  		.codec = HANTRO_AV1_DECODER,
> diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/media/platform/verisilicon/hantro_v4l2.c
> index 7ed2dfd4aefa..e2a8838f75f0 100644
> --- a/drivers/media/platform/verisilicon/hantro_v4l2.c
> +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c
> @@ -86,6 +86,10 @@ hantro_check_depth_match(const struct hantro_fmt *fmt, int bit_depth)
>  	if (!fmt->match_depth && !fmt->postprocessed)
>  		return true;
>  
> +	/* 0 means default depth, which is 8 */
> +	if (!bit_depth)
> +		bit_depth = HANTRO_DEFAULT_BIT_DEPTH;
> +
>  	fmt_depth = hantro_get_format_depth(fmt->fourcc);
>  
>  	/*
Nicolas Dufresne April 11, 2023, 3:10 p.m. UTC | #6
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> Compute the additional space required to store motion vectors at
> the end of the frames buffers.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  drivers/media/platform/verisilicon/hantro_hw.h      | 13 +++++++++++++
>  .../media/platform/verisilicon/hantro_postproc.c    |  3 +++
>  drivers/media/platform/verisilicon/hantro_v4l2.c    |  5 +++++
>  3 files changed, 21 insertions(+)
> 
> diff --git a/drivers/media/platform/verisilicon/hantro_hw.h b/drivers/media/platform/verisilicon/hantro_hw.h
> index e83f0c523a30..bc61d4e051c7 100644
> --- a/drivers/media/platform/verisilicon/hantro_hw.h
> +++ b/drivers/media/platform/verisilicon/hantro_hw.h
> @@ -417,6 +417,19 @@ hantro_hevc_mv_size(unsigned int width, unsigned int height)
>  	return width * height / 16;
>  }
>  
> +static inline unsigned short hantro_av1_num_sbs(unsigned short dimension)
> +{
> +	return DIV_ROUND_UP(dimension, 64);
> +}
> +
> +static inline size_t
> +hantro_av1_mv_size(unsigned int width, unsigned int height)
> +{
> +	size_t num_sbs = hantro_av1_num_sbs(width) * hantro_av1_num_sbs(height);
> +
> +	return ALIGN(num_sbs * 384, 16) * 2 + 512;
> +}
> +
>  int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx);
>  int rockchip_vpu2_mpeg2_dec_run(struct hantro_ctx *ctx);
>  void hantro_mpeg2_dec_copy_qtable(u8 *qtable,
> diff --git a/drivers/media/platform/verisilicon/hantro_postproc.c b/drivers/media/platform/verisilicon/hantro_postproc.c
> index 6437423ccf3a..bb16af50719d 100644
> --- a/drivers/media/platform/verisilicon/hantro_postproc.c
> +++ b/drivers/media/platform/verisilicon/hantro_postproc.c
> @@ -213,6 +213,9 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
>  	else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE)
>  		buf_size += hantro_hevc_mv_size(pix_mp.width,
>  						pix_mp.height);
> +	else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_AV1_FRAME)
> +		buf_size += hantro_av1_mv_size(pix_mp.width,
> +					       pix_mp.height);
>  
>  	for (i = 0; i < num_buffers; ++i) {
>  		struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i];
> diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/media/platform/verisilicon/hantro_v4l2.c
> index e2a8838f75f0..c218c9781e73 100644
> --- a/drivers/media/platform/verisilicon/hantro_v4l2.c
> +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c
> @@ -337,6 +337,11 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
>  			pix_mp->plane_fmt[0].sizeimage +=
>  				hantro_hevc_mv_size(pix_mp->width,
>  						    pix_mp->height);
> +		else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_AV1_FRAME &&
> +			 !hantro_needs_postproc(ctx, fmt))
> +			pix_mp->plane_fmt[0].sizeimage +=
> +				hantro_av1_mv_size(pix_mp->width,
> +						   pix_mp->height);
>  	} else if (!pix_mp->plane_fmt[0].sizeimage) {
>  		/*
>  		 * For coded formats the application can specify
Nicolas Dufresne April 11, 2023, 3:13 p.m. UTC | #7
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> AV1 hardware decoder needs entropy parameters to decode frames.
> They are computed from various arrays defined in AV1 section
> "9.4. Default CDF tables".
> 
> Add helpers functions to init, store and get these parameters.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  drivers/media/platform/verisilicon/Makefile   |    1 +
>  drivers/media/platform/verisilicon/hantro.h   |    2 +
>  .../media/platform/verisilicon/hantro_hw.h    |   20 +
>  .../verisilicon/rockchip_av1_entropymode.c    | 4424 +++++++++++++++++
>  .../verisilicon/rockchip_av1_entropymode.h    |  272 +
>  5 files changed, 4719 insertions(+)
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h
> 
> diff --git a/drivers/media/platform/verisilicon/Makefile b/drivers/media/platform/verisilicon/Makefile
> index ebd5ede7bef7..d2b2679c00eb 100644
> --- a/drivers/media/platform/verisilicon/Makefile
> +++ b/drivers/media/platform/verisilicon/Makefile
> @@ -18,6 +18,7 @@ hantro-vpu-y += \
>  		rockchip_vpu2_hw_h264_dec.o \
>  		rockchip_vpu2_hw_mpeg2_dec.o \
>  		rockchip_vpu2_hw_vp8_dec.o \
> +		rockchip_av1_entropymode.o \
>  		hantro_jpeg.o \
>  		hantro_h264.o \
>  		hantro_hevc.o \
> diff --git a/drivers/media/platform/verisilicon/hantro.h b/drivers/media/platform/verisilicon/hantro.h
> index 61480825b856..a98cb40a8d3b 100644
> --- a/drivers/media/platform/verisilicon/hantro.h
> +++ b/drivers/media/platform/verisilicon/hantro.h
> @@ -240,6 +240,7 @@ struct hantro_dev {
>   * @vp8_dec:		VP8-decoding context.
>   * @hevc_dec:		HEVC-decoding context.
>   * @vp9_dec:		VP9-decoding context.
> + * @av1_dec:		AV1-decoding context.
>   */
>  struct hantro_ctx {
>  	struct hantro_dev *dev;
> @@ -268,6 +269,7 @@ struct hantro_ctx {
>  		struct hantro_vp8_dec_hw_ctx vp8_dec;
>  		struct hantro_hevc_dec_hw_ctx hevc_dec;
>  		struct hantro_vp9_dec_hw_ctx vp9_dec;
> +		struct hantro_av1_dec_hw_ctx av1_dec;
>  	};
>  };
>  
> diff --git a/drivers/media/platform/verisilicon/hantro_hw.h b/drivers/media/platform/verisilicon/hantro_hw.h
> index bc61d4e051c7..d7641eced32e 100644
> --- a/drivers/media/platform/verisilicon/hantro_hw.h
> +++ b/drivers/media/platform/verisilicon/hantro_hw.h
> @@ -15,6 +15,8 @@
>  #include <media/v4l2-vp9.h>
>  #include <media/videobuf2-core.h>
>  
> +#include "rockchip_av1_entropymode.h"
> +
>  #define DEC_8190_ALIGN_MASK	0x07U
>  
>  #define MB_DIM			16
> @@ -247,6 +249,24 @@ struct hantro_vp9_dec_hw_ctx {
>  	s16 feature_data[8][4];
>  };
>  
> +/**
> + * hantro_av1_dec_hw_ctx
> + * @cdfs:		current probabilities structure
> + * @cdfs_ndvc:		current mv probabilities structure
> + * @default_cdfs:	default probabilities structure
> + * @default_cdfs_ndvc:	default mv probabilties structure
> + * @cdfs_last:		stored probabilities structures
> + * @cdfs_last_ndvc:	stored mv probabilities structures
> + */
> +struct hantro_av1_dec_hw_ctx {
> +	struct av1cdfs *cdfs;
> +	struct mvcdfs  *cdfs_ndvc;
> +	struct av1cdfs default_cdfs;
> +	struct mvcdfs  default_cdfs_ndvc;
> +	struct av1cdfs cdfs_last[NUM_REF_FRAMES];
> +	struct mvcdfs  cdfs_last_ndvc[NUM_REF_FRAMES];
> +};
> +
>  /**
>   * struct hantro_postproc_ctx
>   *
> diff --git a/drivers/media/platform/verisilicon/rockchip_av1_entropymode.c b/drivers/media/platform/verisilicon/rockchip_av1_entropymode.c
> new file mode 100644
> index 000000000000..1c9ce8df267e
> --- /dev/null
> +++ b/drivers/media/platform/verisilicon/rockchip_av1_entropymode.c
> @@ -0,0 +1,4424 @@
> +// SPDX-License-Identifier: BSD-2-Clause
> +/*
> + * Copyright (c) 2016, Alliance for Open Media. All rights reserved
> + *
> + * This source code is subject to the terms of the BSD 2 Clause License and
> + * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
> + * was not distributed with this source code in the LICENSE file, you can
> + * obtain it at www.aomedia.org/license/software. If the Alliance for Open
> + * Media Patent License 1.0 was not distributed with this source code in the
> + * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
> + */
> +
> +#include "hantro.h"
> +#include "rockchip_av1_entropymode.h"
> +
> +#define AOM_ICDF ICDF
> +#define AOM_CDF2(a0) AOM_ICDF(a0)
> +#define AOM_CDF3(a0, a1) \
> +	AOM_ICDF(a0), AOM_ICDF(a1)
> +#define AOM_CDF4(a0, a1, a2) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2)
> +#define AOM_CDF5(a0, a1, a2, a3) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3)
> +#define AOM_CDF6(a0, a1, a2, a3, a4) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4)
> +#define AOM_CDF7(a0, a1, a2, a3, a4, a5) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), \
> +	AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5)
> +#define AOM_CDF8(a0, a1, a2, a3, a4, a5, a6) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), \
> +	AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), AOM_ICDF(a6)
> +#define AOM_CDF9(a0, a1, a2, a3, a4, a5, a6, a7) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), \
> +	AOM_ICDF(a4), AOM_ICDF(a5), AOM_ICDF(a6), AOM_ICDF(a7)
> +#define AOM_CDF10(a0, a1, a2, a3, a4, a5, a6, a7, a8) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), \
> +	AOM_ICDF(a4), AOM_ICDF(a5), AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8)
> +#define AOM_CDF11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \
> +	AOM_ICDF(a5), AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9)
> +#define AOM_CDF12(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
> +	AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10)
> +#define AOM_CDF13(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), AOM_ICDF(a5), \
> +	AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), AOM_ICDF(a10), AOM_ICDF(a11)
> +#define AOM_CDF14(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \
> +	AOM_ICDF(a5), AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), \
> +	AOM_ICDF(a10), AOM_ICDF(a11), AOM_ICDF(a12)
> +#define AOM_CDF15(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \
> +	AOM_ICDF(a5), AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), \
> +	AOM_ICDF(a10), AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13)
> +#define AOM_CDF16(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) \
> +	AOM_ICDF(a0), AOM_ICDF(a1), AOM_ICDF(a2), AOM_ICDF(a3), AOM_ICDF(a4), \
> +	AOM_ICDF(a5), AOM_ICDF(a6), AOM_ICDF(a7), AOM_ICDF(a8), AOM_ICDF(a9), \
> +	AOM_ICDF(a10), AOM_ICDF(a11), AOM_ICDF(a12), AOM_ICDF(a13), AOM_ICDF(a14)
> +
> +static const u16 default_kf_y_mode_cdf
> +	[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][CDF_SIZE(AV1_INTRA_MODES)] = {
> +	{
> +		{
> +			AOM_CDF13(15588, 17027, 19338, 20218, 20682, 21110,
> +				  21825, 23244, 24189, 28165, 29093, 30466)
> +		},
> +		{
> +			AOM_CDF13(12016, 18066, 19516, 20303, 20719, 21444,
> +				  21888, 23032, 24434, 28658, 30172, 31409)
> +		},
> +		{
> +			AOM_CDF13(10052, 10771, 22296, 22788, 23055, 23239,
> +				  24133, 25620, 26160, 29336, 29929, 31567)
> +		},
> +		{
> +			AOM_CDF13(14091, 15406, 16442, 18808, 19136, 19546,
> +				  19998, 22096, 24746, 29585, 30958, 32462)
> +		},
> +		{
> +			AOM_CDF13(12122, 13265, 15603, 16501, 18609, 20033,
> +				  22391, 25583, 26437, 30261, 31073, 32475)
> +		}
> +	},
> +	{
> +		{
> +			AOM_CDF13(10023, 19585, 20848, 21440, 21832, 22760,
> +				  23089, 24023, 25381, 29014, 30482, 31436)
> +		},
> +		{
> +			AOM_CDF13(5983, 24099, 24560, 24886, 25066, 25795,
> +				  25913, 26423, 27610, 29905, 31276, 31794)
> +		},
> +		{
> +			AOM_CDF13(7444, 12781, 20177, 20728, 21077, 21607,
> +				  22170, 23405, 24469, 27915, 29090, 30492)
> +		},
> +		{
> +			AOM_CDF13(8537, 14689, 15432, 17087, 17408, 18172,
> +				  18408, 19825, 24649, 29153, 31096, 32210)
> +		},
> +		{
> +			AOM_CDF13(7543, 14231, 15496, 16195, 17905, 20717,
> +				  21984, 24516, 26001, 29675, 30981, 31994)
> +		}
> +	},
> +	{
> +		{
> +			AOM_CDF13(12613, 13591, 21383, 22004, 22312, 22577,
> +				  23401, 25055, 25729, 29538, 30305, 32077)
> +		},
> +		{
> +			AOM_CDF13(9687, 13470, 18506, 19230, 19604, 20147,
> +				  20695, 22062, 23219, 27743, 29211, 30907)
> +		},
> +		{
> +			AOM_CDF13(6183, 6505, 26024, 26252, 26366, 26434,
> +				  27082, 28354, 28555, 30467, 30794, 32086)
> +		},
> +		{
> +			AOM_CDF13(10718, 11734, 14954, 17224, 17565, 17924,
> +				  18561, 21523, 23878, 28975, 30287, 32252)
> +		},
> +		{
> +			AOM_CDF13(9194, 9858, 16501, 17263, 18424, 19171,
> +				  21563, 25961, 26561, 30072, 30737, 32463)
> +		}
> +	},
> +	{
> +		{
> +			AOM_CDF13(12602, 14399, 15488, 18381, 18778, 19315,
> +				  19724, 21419, 25060, 29696, 30917, 32409)
> +		},
> +		{
> +			AOM_CDF13(8203, 13821, 14524, 17105, 17439, 18131,
> +				  18404, 19468, 25225, 29485, 31158, 32342)
> +		},
> +		{
> +			AOM_CDF13(8451, 9731, 15004, 17643, 18012, 18425,
> +				  19070, 21538, 24605, 29118, 30078, 32018)
> +		},
> +		{
> +			AOM_CDF13(7714, 9048, 9516, 16667, 16817, 16994,
> +				  17153, 18767, 26743, 30389, 31536, 32528)
> +		},
> +		{
> +			AOM_CDF13(8843, 10280, 11496, 15317, 16652, 17943,
> +				  19108, 22718, 25769, 29953, 30983, 32485)
> +		}
> +	},
> +	{
> +		{
> +			AOM_CDF13(12578, 13671, 15979, 16834, 19075, 20913,
> +				  22989, 25449, 26219, 30214, 31150, 32477)
> +		},
> +		{
> +			AOM_CDF13(9563, 13626, 15080, 15892, 17756, 20863,
> +				  22207, 24236, 25380, 29653, 31143, 32277)
> +		},
> +		{
> +			AOM_CDF13(8356, 8901, 17616, 18256, 19350, 20106,
> +				  22598, 25947, 26466, 29900, 30523, 32261)
> +		},
> +		{
> +			AOM_CDF13(10835, 11815, 13124, 16042, 17018, 18039,
> +				  18947, 22753, 24615, 29489, 30883, 32482)
> +		},
> +		{
> +			AOM_CDF13(7618, 8288, 9859, 10509, 15386, 18657,
> +				  22903, 28776, 29180, 31355, 31802, 32593)
> +		}
> +	}
> +};
> +
> +static const u16 default_angle_delta_cdf[DIRECTIONAL_MODES]
> +	[CDF_SIZE(2 * MAX_ANGLE_DELTA + 1)] = {
> +	{ AOM_CDF7(2180, 5032, 7567, 22776, 26989, 30217) },
> +	{ AOM_CDF7(2301, 5608, 8801, 23487, 26974, 30330) },
> +	{ AOM_CDF7(3780, 11018, 13699, 19354, 23083, 31286) },
> +	{ AOM_CDF7(4581, 11226, 15147, 17138, 21834, 28397) },
> +	{ AOM_CDF7(1737, 10927, 14509, 19588, 22745, 28823) },
> +	{ AOM_CDF7(2664, 10176, 12485, 17650, 21600, 30495) },
> +	{ AOM_CDF7(2240, 11096, 15453, 20341, 22561, 28917) },
> +	{ AOM_CDF7(3605, 10428, 12459, 17676, 21244, 30655) }
> +};
> +
> +static const u16 default_if_y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(AV1_INTRA_MODES)] = {
> +	{
> +		AOM_CDF13(22801, 23489, 24293, 24756, 25601, 26123,
> +			  26606, 27418, 27945, 29228, 29685, 30349)
> +	},
> +	{
> +		AOM_CDF13(18673, 19845, 22631, 23318, 23950, 24649,
> +			  25527, 27364, 28152, 29701, 29984, 30852)
> +	},
> +	{
> +		AOM_CDF13(19770, 20979, 23396, 23939, 24241, 24654,
> +			  25136, 27073, 27830, 29360, 29730, 30659)
> +	},
> +	{
> +		AOM_CDF13(20155, 21301, 22838, 23178, 23261, 23533,
> +			  23703, 24804, 25352, 26575, 27016, 28049)
> +	}
> +};
> +
> +static const u16 default_uv_mode_cdf[CFL_ALLOWED_TYPES]
> +	[AV1_INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)] = {
> +	{
> +		{
> +			AOM_CDF13(22631, 24152, 25378, 25661, 25986, 26520,
> +				  27055, 27923, 28244, 30059, 30941, 31961)
> +		},
> +		{
> +			AOM_CDF13(9513, 26881, 26973, 27046, 27118, 27664,
> +				  27739, 27824, 28359, 29505, 29800, 31796)
> +		},
> +		{
> +			AOM_CDF13(9845, 9915, 28663, 28704, 28757, 28780,
> +				  29198, 29822, 29854, 30764, 31777, 32029)
> +		},
> +		{
> +			AOM_CDF13(13639, 13897, 14171, 25331, 25606, 25727,
> +				  25953, 27148, 28577, 30612, 31355, 32493)
> +		},
> +		{
> +			AOM_CDF13(9764, 9835, 9930, 9954, 25386, 27053,
> +				  27958, 28148, 28243, 31101, 31744, 32363)
> +		},
> +		{
> +			AOM_CDF13(11825, 13589, 13677, 13720, 15048, 29213,
> +				  29301, 29458, 29711, 31161, 31441, 32550)
> +		},
> +		{
> +			AOM_CDF13(14175, 14399, 16608, 16821, 17718, 17775,
> +				  28551, 30200, 30245, 31837, 32342, 32667)
> +		},
> +		{
> +			AOM_CDF13(12885, 13038, 14978, 15590, 15673, 15748,
> +				  16176, 29128, 29267, 30643, 31961, 32461)
> +		},
> +		{
> +			AOM_CDF13(12026, 13661, 13874, 15305, 15490, 15726,
> +				  15995, 16273, 28443, 30388, 30767, 32416)
> +		},
> +		{
> +			AOM_CDF13(19052, 19840, 20579, 20916, 21150, 21467,
> +				  21885, 22719, 23174, 28861, 30379, 32175)
> +		},
> +		{
> +			AOM_CDF13(18627, 19649, 20974, 21219, 21492, 21816,
> +				  22199, 23119, 23527, 27053, 31397, 32148)
> +		},
> +		{
> +			AOM_CDF13(17026, 19004, 19997, 20339, 20586, 21103,
> +				  21349, 21907, 22482, 25896, 26541, 31819)
> +		},
> +		{
> +			AOM_CDF13(12124, 13759, 14959, 14992, 15007, 15051,
> +				  15078, 15166, 15255, 15753, 16039, 16606)
> +		}
> +	},
> +	{
> +		{
> +			AOM_CDF14(10407, 11208, 12900, 13181, 13823, 14175,
> +				  14899, 15656, 15986, 20086, 20995, 22455,
> +				  24212)
> +		},
> +		{
> +			AOM_CDF14(4532, 19780, 20057, 20215, 20428, 21071,
> +				  21199, 21451, 22099, 24228, 24693, 27032,
> +				  29472)
> +		},
> +		{
> +			AOM_CDF14(5273, 5379, 20177, 20270, 20385, 20439,
> +				  20949, 21695, 21774, 23138, 24256, 24703,
> +				  26679)
> +		},
> +		{
> +			AOM_CDF14(6740, 7167, 7662, 14152, 14536, 14785,
> +				  15034, 16741, 18371, 21520, 22206, 23389,
> +				  24182)
> +		},
> +		{
> +			AOM_CDF14(4987, 5368, 5928, 6068, 19114, 20315, 21857,
> +				  22253, 22411, 24911, 25380, 26027, 26376)
> +		},
> +		{
> +			AOM_CDF14(5370, 6889, 7247, 7393, 9498, 21114, 21402,
> +				  21753, 21981, 24780, 25386, 26517, 27176)
> +		},
> +		{
> +			AOM_CDF14(4816, 4961, 7204, 7326, 8765, 8930, 20169,
> +				  20682, 20803, 23188, 23763, 24455, 24940)
> +		},
> +		{
> +			AOM_CDF14(6608, 6740, 8529, 9049, 9257, 9356, 9735,
> +				  18827, 19059, 22336, 23204, 23964, 24793)
> +		},
> +		{
> +			AOM_CDF14(5998, 7419, 7781, 8933, 9255, 9549, 9753,
> +				  10417, 18898, 22494, 23139, 24764, 25989)
> +		},
> +		{
> +			AOM_CDF14(10660, 11298, 12550, 12957, 13322, 13624,
> +				  14040, 15004, 15534, 20714, 21789, 23443,
> +				  24861)
> +		},
> +		{
> +			AOM_CDF14(10522, 11530, 12552, 12963, 13378, 13779,
> +				  14245, 15235, 15902, 20102, 22696, 23774,
> +				  25838)
> +		},
> +		{
> +			AOM_CDF14(10099, 10691, 12639, 13049, 13386, 13665,
> +				  14125, 15163, 15636, 19676, 20474, 23519,
> +				  25208)
> +		},
> +		{
> +			AOM_CDF14(3144, 5087, 7382, 7504, 7593, 7690, 7801,
> +				  8064, 8232, 9248, 9875, 10521, 29048)
> +		}
> +	}
> +};
> +
> +static const u16 default_partition_cdf[13][16] = {
> +	{
> +		AOM_CDF4(19132, 25510, 30392), AOM_CDF4(13928, 19855, 28540),
> +		AOM_CDF4(12522, 23679, 28629), AOM_CDF4(9896, 18783, 25853),
> +		AOM_CDF2(11570), AOM_CDF2(16855), AOM_CDF3(9413, 22581)
> +	},
> +	{
> +		AOM_CDF10(15597, 20929, 24571, 26706, 27664, 28821, 29601, 30571, 31902)
> +	},
> +	{
> +		AOM_CDF10(7925, 11043, 16785, 22470, 23971, 25043, 26651, 28701, 29834)
> +	},
> +	{
> +		AOM_CDF10(5414, 13269, 15111, 20488, 22360, 24500, 25537, 26336, 32117)
> +	},
> +	{
> +		AOM_CDF10(2662, 6362, 8614, 20860, 23053, 24778, 26436, 27829, 31171)
> +	},
> +	{
> +		AOM_CDF10(18462, 20920, 23124, 27647, 28227, 29049, 29519, 30178, 31544)
> +	},
> +	{
> +		AOM_CDF10(7689, 9060, 12056, 24992, 25660, 26182, 26951, 28041, 29052)
> +	},
> +	{
> +		AOM_CDF10(6015, 9009, 10062, 24544, 25409, 26545, 27071, 27526, 32047)
> +	},
> +	{
> +		AOM_CDF10(1394, 2208, 2796, 28614, 29061, 29466, 29840, 30185, 31899)
> +	},
> +	{
> +		AOM_CDF10(20137, 21547, 23078, 29566, 29837, 30261, 30524, 30892, 31724),
> +		AOM_CDF8(27899, 28219, 28529, 32484, 32539, 32619, 32639)
> +	},
> +	{
> +		AOM_CDF10(6732, 7490, 9497, 27944, 28250, 28515, 28969, 29630, 30104),
> +		AOM_CDF8(6607, 6990, 8268, 32060, 32219, 32338, 32371)
> +	},
> +	{
> +		AOM_CDF10(5945, 7663, 8348, 28683, 29117, 29749, 30064, 30298, 32238),
> +		AOM_CDF8(5429, 6676, 7122, 32027, 32227, 32531, 32582)
> +	},
> +	{
> +		AOM_CDF10(870, 1212, 1487, 31198, 31394, 31574, 31743, 31881, 32332),
> +		AOM_CDF8(711, 966, 1172, 32448, 32538, 32617, 32664)
> +	},
> +};
> +
> +static const u16 default_intra_ext_tx0_cdf[EXTTX_SIZES][AV1_INTRA_MODES][8] = {
> +	{
> +		{ AOM_CDF7(1535, 8035, 9461, 12751, 23467, 27825)},
> +		{ AOM_CDF7(564, 3335, 9709, 10870, 18143, 28094)},
> +		{ AOM_CDF7(672, 3247, 3676, 11982, 19415, 23127)},
> +		{ AOM_CDF7(5279, 13885, 15487, 18044, 23527, 30252)},
> +		{ AOM_CDF7(4423, 6074, 7985, 10416, 25693, 29298)},
> +		{ AOM_CDF7(1486, 4241, 9460, 10662, 16456, 27694)},
> +		{ AOM_CDF7(439, 2838, 3522, 6737, 18058, 23754)},
> +		{ AOM_CDF7(1190, 4233, 4855, 11670, 20281, 24377)},
> +		{ AOM_CDF7(1045, 4312, 8647, 10159, 18644, 29335)},
> +		{ AOM_CDF7(202, 3734, 4747, 7298, 17127, 24016)},
> +		{ AOM_CDF7(447, 4312, 6819, 8884, 16010, 23858)},
> +		{ AOM_CDF7(277, 4369, 5255, 8905, 16465, 22271)},
> +		{ AOM_CDF7(3409, 5436, 10599, 15599, 19687, 24040)},
> +	},
> +	{
> +		{ AOM_CDF7(1870, 13742, 14530, 16498, 23770, 27698)},
> +		{ AOM_CDF7(326, 8796, 14632, 15079, 19272, 27486)},
> +		{ AOM_CDF7(484, 7576, 7712, 14443, 19159, 22591)},
> +		{ AOM_CDF7(1126, 15340, 15895, 17023, 20896, 30279)},
> +		{ AOM_CDF7(655, 4854, 5249, 5913, 22099, 27138)},
> +		{ AOM_CDF7(1299, 6458, 8885, 9290, 14851, 25497)},
> +		{ AOM_CDF7(311, 5295, 5552, 6885, 16107, 22672)},
> +		{ AOM_CDF7(883, 8059, 8270, 11258, 17289, 21549)},
> +		{ AOM_CDF7(741, 7580, 9318, 10345, 16688, 29046)},
> +		{ AOM_CDF7(110, 7406, 7915, 9195, 16041, 23329)},
> +		{ AOM_CDF7(363, 7974, 9357, 10673, 15629, 24474)},
> +		{ AOM_CDF7(153, 7647, 8112, 9936, 15307, 19996)},
> +		{ AOM_CDF7(3511, 6332, 11165, 15335, 19323, 23594)},
> +	},
> +	{
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +	},
> +	{
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +		{ AOM_CDF7(4681, 9362, 14043, 18725, 23406, 28087)},
> +	},
> +};
> +
> +static const u16 default_intra_ext_tx1_cdf[EXTTX_SIZES][AV1_INTRA_MODES][4] = {
> +	{
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +	},
> +	{
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +	},
> +	{
> +		{ AOM_CDF5(1127, 12814, 22772, 27483)},
> +		{ AOM_CDF5(145, 6761, 11980, 26667)},
> +		{ AOM_CDF5(362, 5887, 11678, 16725)},
> +		{ AOM_CDF5(385, 15213, 18587, 30693)},
> +		{ AOM_CDF5(25, 2914, 23134, 27903)},
> +		{ AOM_CDF5(60, 4470, 11749, 23991)},
> +		{ AOM_CDF5(37, 3332, 14511, 21448)},
> +		{ AOM_CDF5(157, 6320, 13036, 17439)},
> +		{ AOM_CDF5(119, 6719, 12906, 29396)},
> +		{ AOM_CDF5(47, 5537, 12576, 21499)},
> +		{ AOM_CDF5(269, 6076, 11258, 23115)},
> +		{ AOM_CDF5(83, 5615, 12001, 17228)},
> +		{ AOM_CDF5(1968, 5556, 12023, 18547)},
> +	},
> +	{
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +		{ AOM_CDF5(6554, 13107, 19661, 26214)},
> +	},
> +};
> +
> +static const u16 default_inter_ext_tx_cdf[2][EXTTX_SIZES][EXT_TX_TYPES] = {
> +	{
> +		{
> +			AOM_CDF16(4458, 5560, 7695, 9709, 13330, 14789, 17537, 20266,
> +				  21504, 22848, 23934, 25474, 27727, 28915, 30631)
> +		},
> +		{
> +			AOM_CDF16(1645, 2573, 4778, 5711, 7807, 8622, 10522, 15357, 17674,
> +				  20408, 22517, 25010, 27116, 28856, 30749)
> +		},
> +		{
> +			AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384,
> +				  18432, 20480, 22528, 24576, 26624, 28672, 30720)
> +		},
> +		{
> +			AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384,
> +				  18432, 20480, 22528, 24576, 26624, 28672, 30720)
> +		},
> +	},
> +	{
> +		{
> +			AOM_CDF12(2731, 5461, 8192, 10923, 13653, 16384, 19115, 21845,
> +				  24576, 27307, 30037),
> +			AOM_CDF2(16384)
> +		},
> +		{
> +			AOM_CDF12(2731, 5461, 8192, 10923, 13653, 16384, 19115, 21845,
> +				  24576, 27307, 30037),
> +			AOM_CDF2(4167)
> +		},
> +		{
> +			AOM_CDF12(770, 2421, 5225, 12907, 15819, 18927, 21561, 24089,
> +				  26595, 28526, 30529),
> +			AOM_CDF2(1998)
> +		},
> +		{
> +			AOM_CDF12(2731, 5461, 8192, 10923, 13653, 16384, 19115, 21845,
> +				  24576, 27307, 30037),
> +			AOM_CDF2(748)
> +		},
> +	}
> +};
> +
> +static const u16 default_cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)] = {
> +	AOM_CDF8(1418, 2123, 13340, 18405, 26972, 28343, 32294)
> +};
> +
> +static const u16 default_cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)] = {
> +	{
> +		AOM_CDF16(7637, 20719, 31401, 32481, 32657, 32688, 32692, 32696, 32700,
> +			  32704, 32708, 32712, 32716, 32720, 32724)
> +	},
> +	{
> +		AOM_CDF16(14365, 23603, 28135, 31168, 32167, 32395, 32487, 32573,
> +			  32620, 32647, 32668, 32672, 32676, 32680, 32684)
> +	},
> +	{
> +		AOM_CDF16(11532, 22380, 28445, 31360, 32349, 32523, 32584, 32649,
> +			   32673, 32677, 32681, 32685, 32689, 32693, 32697)
> +	},
> +	{
> +		AOM_CDF16(26990, 31402, 32282, 32571, 32692, 32696, 32700, 32704,
> +			  32708, 32712, 32716, 32720, 32724, 32728, 32732)
> +	},
> +	{
> +		AOM_CDF16(17248, 26058, 28904, 30608, 31305, 31877, 32126, 32321,
> +			  32394, 32464, 32516, 32560, 32576, 32593, 32622)
> +	},
> +	{
> +		AOM_CDF16(14738, 21678, 25779, 27901, 29024, 30302, 30980, 31843,
> +			  32144, 32413, 32520, 32594, 32622, 32656, 32660)
> +	}
> +};
> +
> +static const u16 default_switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
> +	[CDF_SIZE(AV1_SWITCHABLE_FILTERS)] = {
> +		{ AOM_CDF3(31935, 32720) }, { AOM_CDF3(5568, 32719) },
> +		{ AOM_CDF3(422, 2938) }, { AOM_CDF3(28244, 32608) },
> +		{ AOM_CDF3(31206, 31953) }, { AOM_CDF3(4862, 32121) },
> +		{ AOM_CDF3(770, 1152) }, { AOM_CDF3(20889, 25637) },
> +		{ AOM_CDF3(31910, 32724) }, { AOM_CDF3(4120, 32712) },
> +		{ AOM_CDF3(305, 2247) }, { AOM_CDF3(27403, 32636) },
> +		{ AOM_CDF3(31022, 32009) }, { AOM_CDF3(2963, 32093) },
> +		{ AOM_CDF3(601, 943) }, { AOM_CDF3(14969, 21398) }
> +};
> +
> +static const u16 default_newmv_cdf[NEWMV_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(24035) }, { AOM_CDF2(16630) }, { AOM_CDF2(15339) },
> +	{ AOM_CDF2(8386) }, { AOM_CDF2(12222) }, { AOM_CDF2(4676) }
> +};
> +
> +static const u16 default_zeromv_cdf[GLOBALMV_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(2175) }, { AOM_CDF2(1054) }
> +};
> +
> +static const u16 default_refmv_cdf[REFMV_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(23974) }, { AOM_CDF2(24188) }, { AOM_CDF2(17848) },
> +	{ AOM_CDF2(28622) }, { AOM_CDF2(24312) }, { AOM_CDF2(19923) }
> +};
> +
> +static const u16 default_drl_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(13104) }, { AOM_CDF2(24560) }, { AOM_CDF2(18945) }
> +};
> +
> +static const u16 default_inter_compound_mode_cdf[AV1_INTER_MODE_CONTEXTS]
> +	[CDF_SIZE(INTER_COMPOUND_MODES)] = {
> +		{ AOM_CDF8(7760, 13823, 15808, 17641, 19156, 20666, 26891) },
> +		{ AOM_CDF8(10730, 19452, 21145, 22749, 24039, 25131, 28724) },
> +		{ AOM_CDF8(10664, 20221, 21588, 22906, 24295, 25387, 28436) },
> +		{ AOM_CDF8(13298, 16984, 20471, 24182, 25067, 25736, 26422) },
> +		{ AOM_CDF8(18904, 23325, 25242, 27432, 27898, 28258, 30758) },
> +		{ AOM_CDF8(10725, 17454, 20124, 22820, 24195, 25168, 26046) },
> +		{ AOM_CDF8(17125, 24273, 25814, 27492, 28214, 28704, 30592) },
> +		{ AOM_CDF8(13046, 23214, 24505, 25942, 27435, 28442, 29330) }
> +};
> +
> +static const u16 default_interintra_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(26887) }, { AOM_CDF2(27597) },
> +	{ AOM_CDF2(30237) }
> +};
> +
> +static const u16 default_interintra_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTERINTRA_MODES)] = {
> +	{ AOM_CDF4(8192, 16384, 24576) },
> +	{ AOM_CDF4(1875, 11082, 27332) },
> +	{ AOM_CDF4(2473, 9996, 26388) },
> +	{ AOM_CDF4(4238, 11537, 25926) }
> +};
> +
> +static const u16 default_wedge_interintra_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(20036) }, { AOM_CDF2(24957) }, { AOM_CDF2(26704) },
> +	{ AOM_CDF2(27530) }, { AOM_CDF2(29564) }, { AOM_CDF2(29444) },
> +	{ AOM_CDF2(26872) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }
> +};
> +
> +static const u16 default_compound_type_cdf[BLOCK_SIZES_ALL][CDF_SIZE(COMPOUND_TYPES - 1)] = {
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(23431) },
> +	{ AOM_CDF2(13171) }, { AOM_CDF2(11470) }, { AOM_CDF2(9770) },
> +	{ AOM_CDF2(9100) },
> +	{ AOM_CDF2(8233) }, { AOM_CDF2(6172) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(11820) },
> +	{ AOM_CDF2(7701) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }
> +};
> +
> +static const u16 default_wedge_idx_cdf[BLOCK_SIZES_ALL][CDF_SIZE(16)] = {
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384,
> +			  18432, 20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384,
> +			  18432, 20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384,
> +			  18432, 20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2438, 4440, 6599, 8663, 11005, 12874, 15751, 18094,
> +			  20359, 22362, 24127, 25702, 27752, 29450, 31171)
> +	},
> +	{
> +		AOM_CDF16(806, 3266, 6005, 6738, 7218, 7367, 7771, 14588, 16323,
> +			  17367, 18452, 19422, 22839, 26127, 29629)
> +	},
> +	{
> +		AOM_CDF16(2779, 3738, 4683, 7213, 7775, 8017, 8655, 14357, 17939,
> +			  21332, 24520, 27470, 29456, 30529, 31656)
> +	},
> +	{
> +		AOM_CDF16(1684, 3625, 5675, 7108, 9302, 11274, 14429, 17144, 19163,
> +			  20961, 22884, 24471, 26719, 28714, 30877)
> +	},
> +	{
> +		AOM_CDF16(1142, 3491, 6277, 7314, 8089, 8355, 9023, 13624, 15369,
> +			  16730, 18114, 19313, 22521, 26012, 29550)
> +	},
> +	{
> +		AOM_CDF16(2742, 4195, 5727, 8035, 8980, 9336, 10146, 14124, 17270,
> +			  20533, 23434, 25972, 27944, 29570, 31416)
> +	},
> +	{
> +		AOM_CDF16(1727, 3948, 6101, 7796, 9841, 12344, 15766, 18944, 20638,
> +			  22038, 23963, 25311, 26988, 28766, 31012)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(154, 987, 1925, 2051, 2088, 2111, 2151, 23033, 23703, 24284,
> +			  24985, 25684, 27259, 28883, 30911)
> +	},
> +	{
> +		AOM_CDF16(1135, 1322, 1493, 2635, 2696, 2737, 2770, 21016, 22935,
> +			  25057, 27251, 29173, 30089, 30960, 31933)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	},
> +	{
> +		AOM_CDF16(2048, 4096, 6144, 8192, 10240, 12288, 14336, 16384, 18432,
> +			  20480, 22528, 24576, 26624, 28672, 30720)
> +	}
> +};
> +
> +static const u16 default_motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)] = {
> +	{ AOM_CDF3(10923, 21845) }, { AOM_CDF3(10923, 21845) },
> +	{ AOM_CDF3(10923, 21845) }, { AOM_CDF3(7651, 24760) },
> +	{ AOM_CDF3(4738, 24765) }, { AOM_CDF3(5391, 25528) },
> +	{ AOM_CDF3(19419, 26810) }, { AOM_CDF3(5123, 23606) },
> +	{ AOM_CDF3(11606, 24308) }, { AOM_CDF3(26260, 29116) },
> +	{ AOM_CDF3(20360, 28062) }, { AOM_CDF3(21679, 26830) },
> +	{ AOM_CDF3(29516, 30701) }, { AOM_CDF3(28898, 30397) },
> +	{ AOM_CDF3(30878, 31335) }, { AOM_CDF3(32507, 32558) },
> +	{ AOM_CDF3(10923, 21845) }, { AOM_CDF3(10923, 21845) },
> +	{ AOM_CDF3(28799, 31390) }, { AOM_CDF3(26431, 30774) },
> +	{ AOM_CDF3(28973, 31594) }, { AOM_CDF3(29742, 31203) }
> +};
> +
> +static const u16 default_obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(10437) },
> +	{ AOM_CDF2(9371) }, { AOM_CDF2(9301) }, { AOM_CDF2(17432) },
> +	{ AOM_CDF2(14423) },
> +	{ AOM_CDF2(15142) }, { AOM_CDF2(25817) }, { AOM_CDF2(22823) },
> +	{ AOM_CDF2(22083) },
> +	{ AOM_CDF2(30128) }, { AOM_CDF2(31014) }, { AOM_CDF2(31560) },
> +	{ AOM_CDF2(32638) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(23664) },
> +	{ AOM_CDF2(20901) },
> +	{ AOM_CDF2(24008) }, { AOM_CDF2(26879) }
> +};
> +
> +static const u16 default_intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(806) },
> +	{ AOM_CDF2(16662) },
> +	{ AOM_CDF2(20186) },
> +	{ AOM_CDF2(26538) }
> +};
> +
> +static const u16 default_comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(26828) },
> +	{ AOM_CDF2(24035) },
> +	{ AOM_CDF2(12031) },
> +	{ AOM_CDF2(10640) },
> +	{ AOM_CDF2(2901) }
> +};
> +
> +static const u16 default_comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(1198) },
> +	{ AOM_CDF2(2070) },
> +	{ AOM_CDF2(9166) },
> +	{ AOM_CDF2(7499) },
> +	{ AOM_CDF2(22475) }
> +};
> +
> +static const u16 default_uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS]
> +	[UNIDIR_COMP_REFS - 1][CDF_SIZE(2)] = {
> +	{ { AOM_CDF2(5284)}, { AOM_CDF2(3865)}, { AOM_CDF2(3128)} },
> +	{ { AOM_CDF2(23152)}, { AOM_CDF2(14173)}, { AOM_CDF2(15270)} },
> +	{ { AOM_CDF2(31774)}, { AOM_CDF2(25120)}, { AOM_CDF2(26710)} }
> +};
> +
> +static const u16 default_single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)] = {
> +	{
> +		{ AOM_CDF2(4897)},
> +		{ AOM_CDF2(1555)},
> +		{ AOM_CDF2(4236)},
> +		{ AOM_CDF2(8650)},
> +		{ AOM_CDF2(904)},
> +		{ AOM_CDF2(1444)}
> +	},
> +	{
> +		{ AOM_CDF2(16973)},
> +		{ AOM_CDF2(16751)},
> +		{ AOM_CDF2(19647)},
> +		{ AOM_CDF2(24773)},
> +		{ AOM_CDF2(11014)},
> +		{ AOM_CDF2(15087)}
> +	},
> +	{
> +		{ AOM_CDF2(29744)},
> +		{ AOM_CDF2(30279)},
> +		{ AOM_CDF2(31194)},
> +		{ AOM_CDF2(31895)},
> +		{ AOM_CDF2(26875)},
> +		{ AOM_CDF2(30304)}
> +	}
> +};
> +
> +static const u16 default_comp_ref_cdf[REF_CONTEXTS][FWD_REFS - 1][CDF_SIZE(2)] = {
> +	{ { AOM_CDF2(4946)}, { AOM_CDF2(9468)}, { AOM_CDF2(1503)} },
> +	{ { AOM_CDF2(19891)}, { AOM_CDF2(22441)}, { AOM_CDF2(15160)} },
> +	{ { AOM_CDF2(30731)}, { AOM_CDF2(31059)}, { AOM_CDF2(27544)} }
> +};
> +
> +static const u16 default_comp_bwdref_cdf[REF_CONTEXTS][BWD_REFS - 1][CDF_SIZE(2)] = {
> +	{ { AOM_CDF2(2235)}, { AOM_CDF2(1423)} },
> +	{ { AOM_CDF2(17182)}, { AOM_CDF2(15175)} },
> +	{ { AOM_CDF2(30606)}, { AOM_CDF2(30489)} }
> +};
> +
> +static const u16 default_palette_y_size_cdf[PALETTE_BLOCK_SIZES][CDF_SIZE(PALETTE_SIZES)] = {
> +	{ AOM_CDF7(7952, 13000, 18149, 21478, 25527, 29241) },
> +	{ AOM_CDF7(7139, 11421, 16195, 19544, 23666, 28073) },
> +	{ AOM_CDF7(7788, 12741, 17325, 20500, 24315, 28530) },
> +	{ AOM_CDF7(8271, 14064, 18246, 21564, 25071, 28533) },
> +	{ AOM_CDF7(12725, 19180, 21863, 24839, 27535, 30120) },
> +	{ AOM_CDF7(9711, 14888, 16923, 21052, 25661, 27875) },
> +	{ AOM_CDF7(14940, 20797, 21678, 24186, 27033, 28999) }
> +};
> +
> +static const u16 default_palette_uv_size_cdf[PALETTE_BLOCK_SIZES][CDF_SIZE(PALETTE_SIZES)] = {
> +	{ AOM_CDF7(8713, 19979, 27128, 29609, 31331, 32272) },
> +	{ AOM_CDF7(5839, 15573, 23581, 26947, 29848, 31700) },
> +	{ AOM_CDF7(4426, 11260, 17999, 21483, 25863, 29430) },
> +	{ AOM_CDF7(3228, 9464, 14993, 18089, 22523, 27420) },
> +	{ AOM_CDF7(3768, 8886, 13091, 17852, 22495, 27207) },
> +	{ AOM_CDF7(2464, 8451, 12861, 21632, 25525, 28555) },
> +	{ AOM_CDF7(1269, 5435, 10433, 18963, 21700, 25865) }
> +};
> +
> +static const u16 default_palette_y_mode_cdf[PALETTE_BLOCK_SIZES]
> +	[PALETTE_Y_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ { AOM_CDF2(31676)}, { AOM_CDF2(3419)}, { AOM_CDF2(1261)} },
> +	{ { AOM_CDF2(31912)}, { AOM_CDF2(2859)}, { AOM_CDF2(980)} },
> +	{ { AOM_CDF2(31823)}, { AOM_CDF2(3400)}, { AOM_CDF2(781)} },
> +	{ { AOM_CDF2(32030)}, { AOM_CDF2(3561)}, { AOM_CDF2(904)} },
> +	{ { AOM_CDF2(32309)}, { AOM_CDF2(7337)}, { AOM_CDF2(1462)} },
> +	{ { AOM_CDF2(32265)}, { AOM_CDF2(4015)}, { AOM_CDF2(1521)} },
> +	{ { AOM_CDF2(32450)}, { AOM_CDF2(7946)}, { AOM_CDF2(129)} }
> +};
> +
> +static const u16 default_palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(32461) }, { AOM_CDF2(21488) }
> +};
> +
> +static const u16 default_palette_y_color_index_cdf[PALETTE_IDX_CONTEXTS][8] = {
> +	// Palette sizes 2 & 8
> +	{
> +		AOM_CDF2(28710),
> +		AOM_CDF8(21689, 23883, 25163, 26352, 27506, 28827, 30195)
> +	},
> +	{
> +		AOM_CDF2(16384),
> +		AOM_CDF8(6892, 15385, 17840, 21606, 24287, 26753, 29204)
> +	},
> +	{
> +		AOM_CDF2(10553),
> +		AOM_CDF8(5651, 23182, 25042, 26518, 27982, 29392, 30900)
> +	},
> +	{
> +		AOM_CDF2(27036),
> +		AOM_CDF8(19349, 22578, 24418, 25994, 27524, 29031, 30448)
> +	},
> +	{
> +		AOM_CDF2(31603),
> +		AOM_CDF8(31028, 31270, 31504, 31705, 31927, 32153, 32392)
> +	},
> +	// Palette sizes 3 & 7
> +	{
> +		AOM_CDF3(27877, 30490),
> +		AOM_CDF7(23105, 25199, 26464, 27684, 28931, 30318)
> +	},
> +	{
> +		AOM_CDF3(11532, 25697),
> +		AOM_CDF7(6950, 15447, 18952, 22681, 25567, 28563)
> +	},
> +	{
> +		AOM_CDF3(6544, 30234),
> +		AOM_CDF7(7560, 23474, 25490, 27203, 28921, 30708)
> +	},
> +	{
> +		AOM_CDF3(23018, 28072),
> +		AOM_CDF7(18544, 22373, 24457, 26195, 28119, 30045)
> +	},
> +	{
> +		AOM_CDF3(31915, 32385),
> +		AOM_CDF7(31198, 31451, 31670, 31882, 32123, 32391)
> +	},
> +	// Palette sizes 4 & 6
> +	{
> +		AOM_CDF4(25572, 28046, 30045),
> +		AOM_CDF6(23132, 25407, 26970, 28435, 30073)
> +	},
> +	{
> +		AOM_CDF4(9478, 21590, 27256),
> +		AOM_CDF6(7443, 17242, 20717, 24762, 27982)
> +	},
> +	{
> +		AOM_CDF4(7248, 26837, 29824),
> +		AOM_CDF6(6300, 24862, 26944, 28784, 30671)
> +	},
> +	{
> +		AOM_CDF4(19167, 24486, 28349),
> +		AOM_CDF6(18916, 22895, 25267, 27435, 29652)
> +	},
> +	{
> +		AOM_CDF4(31400, 31825, 32250),
> +		AOM_CDF6(31270, 31550, 31808, 32059, 32353)
> +	},
> +	// Palette size 5
> +	{
> +		AOM_CDF5(24779, 26955, 28576, 30282),
> +		AOM_CDF5(8669, 20364, 24073, 28093)
> +	},
> +	{
> +		AOM_CDF5(4255, 27565, 29377, 31067),
> +		AOM_CDF5(19864, 23674, 26716, 29530)
> +	},
> +	{
> +		AOM_CDF5(31646, 31893, 32147, 32426),
> +		0, 0, 0, 0
> +	}
> +};
> +
> +static const u16 default_palette_uv_color_index_cdf[PALETTE_IDX_CONTEXTS][8] = {
> +	// Palette sizes 2 & 8
> +	{
> +		AOM_CDF2(29089),
> +		AOM_CDF8(21442, 23288, 24758, 26246, 27649, 28980, 30563)
> +	},
> +	{
> +		AOM_CDF2(16384),
> +		AOM_CDF8(5863, 14933, 17552, 20668, 23683, 26411, 29273)
> +	},
> +	{
> +		AOM_CDF2(8713),
> +		AOM_CDF8(3415, 25810, 26877, 27990, 29223, 30394, 31618)
> +	},
> +	{
> +		AOM_CDF2(29257),
> +		AOM_CDF8(17965, 20084, 22232, 23974, 26274, 28402, 30390)
> +	},
> +	{
> +		AOM_CDF2(31610),
> +		AOM_CDF8(31190, 31329, 31516, 31679, 31825, 32026, 32322)
> +	},
> +	// Palette sizes 3 & 7
> +	{
> +		AOM_CDF3(25257, 29145),
> +		AOM_CDF7(21239, 23168, 25044, 26962, 28705, 30506)
> +	},
> +	{
> +		AOM_CDF3(12287, 27293),
> +		AOM_CDF7(6545, 15012, 18004, 21817, 25503, 28701)
> +	},
> +	{
> +		AOM_CDF3(7033, 27960),
> +		AOM_CDF7(3448, 26295, 27437, 28704, 30126, 31442)
> +	},
> +	{
> +		AOM_CDF3(20145, 25405),
> +		AOM_CDF7(15889, 18323, 21704, 24698, 26976, 29690)
> +	},
> +	{
> +		AOM_CDF3(30608, 31639),
> +		AOM_CDF7(30988, 31204, 31479, 31734, 31983, 32325)
> +	},
> +	// Palette sizes 4 & 6
> +	{
> +		AOM_CDF4(24210, 27175, 29903),
> +		AOM_CDF6(22217, 24567, 26637, 28683, 30548)
> +	},
> +	{
> +		AOM_CDF4(9888, 22386, 27214),
> +		AOM_CDF6(7307, 16406, 19636, 24632, 28424)
> +	},
> +	{
> +		AOM_CDF4(5901, 26053, 29293),
> +		AOM_CDF6(4441, 25064, 26879, 28942, 30919)
> +	},
> +	{
> +		AOM_CDF4(18318, 22152, 28333),
> +		AOM_CDF6(17210, 20528, 23319, 26750, 29582)
> +	},
> +	{
> +		AOM_CDF4(30459, 31136, 31926),
> +		AOM_CDF6(30674, 30953, 31396, 31735, 32207)
> +	},
> +	// Palette size 5
> +	{
> +		AOM_CDF5(22980, 25479, 27781, 29986),
> +		AOM_CDF5(8413, 21408, 24859, 28874)
> +	},
> +	{
> +		AOM_CDF5(2257, 29449, 30594, 31598),
> +		AOM_CDF5(19189, 21202, 25915, 28620)
> +	},
> +	{
> +		AOM_CDF5(31844, 32044, 32281, 32518),
> +		0, 0, 0, 0
> +	}
> +};
> +
> +static const u16 default_txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(28581) }, { AOM_CDF2(23846) }, { AOM_CDF2(20847) },
> +	{ AOM_CDF2(24315) }, { AOM_CDF2(18196) }, { AOM_CDF2(12133) },
> +	{ AOM_CDF2(18791) }, { AOM_CDF2(10887) }, { AOM_CDF2(11005) },
> +	{ AOM_CDF2(27179) }, { AOM_CDF2(20004) }, { AOM_CDF2(11281) },
> +	{ AOM_CDF2(26549) }, { AOM_CDF2(19308) }, { AOM_CDF2(14224) },
> +	{ AOM_CDF2(28015) }, { AOM_CDF2(21546) }, { AOM_CDF2(14400) },
> +	{ AOM_CDF2(28165) }, { AOM_CDF2(22401) }, { AOM_CDF2(16088) }
> +};
> +
> +static const u16 default_skip_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(31671) }, { AOM_CDF2(16515) }, { AOM_CDF2(4576) }
> +};
> +
> +static const u16 default_skip_mode_cdfs[SKIP_MODE_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(32621) }, { AOM_CDF2(20708) }, { AOM_CDF2(8127) }
> +};
> +
> +static const u16 default_compound_idx_cdfs[COMP_INDEX_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(18244) }, { AOM_CDF2(12865) }, { AOM_CDF2(7053) },
> +	{ AOM_CDF2(13259) }, { AOM_CDF2(9334) }, { AOM_CDF2(4644) }
> +};
> +
> +static const u16 default_comp_group_idx_cdfs[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(26607) }, { AOM_CDF2(22891) }, { AOM_CDF2(18840) },
> +	{ AOM_CDF2(24594) }, { AOM_CDF2(19934) }, { AOM_CDF2(22674) }
> +};
> +
> +static const u16 default_intrabc_cdf[CDF_SIZE(2)] = { AOM_CDF2(30531) };
> +
> +static const u16 default_filter_intra_mode_cdf[CDF_SIZE(FILTER_INTRA_MODES)] = {
> +	AOM_CDF5(8949, 12776, 17211, 29558)
> +};
> +
> +static const u16 default_filter_intra_cdfs[BLOCK_SIZES_ALL][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(4621) }, { AOM_CDF2(6743) }, { AOM_CDF2(5893) }, { AOM_CDF2(7866) },
> +	{ AOM_CDF2(12551) }, { AOM_CDF2(9394) }, { AOM_CDF2(12408) }, { AOM_CDF2(14301) },
> +	{ AOM_CDF2(12756) }, { AOM_CDF2(22343) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) }, { AOM_CDF2(16384) },
> +	{ AOM_CDF2(12770) }, { AOM_CDF2(10368) }, { AOM_CDF2(20229) }, { AOM_CDF2(18101) },
> +	{ AOM_CDF2(16384) }, { AOM_CDF2(16384) }
> +};
> +
> +static const u16 default_delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)] = {
> +	AOM_CDF4(28160, 32120, 32677)
> +};
> +
> +static const u16 default_delta_lf_multi_cdf[FRAME_LF_COUNT][CDF_SIZE(DELTA_LF_PROBS + 1)] = {
> +	{ AOM_CDF4(28160, 32120, 32677) },
> +	{ AOM_CDF4(28160, 32120, 32677) },
> +	{ AOM_CDF4(28160, 32120, 32677) },
> +	{ AOM_CDF4(28160, 32120, 32677) }
> +};
> +
> +static const u16 default_delta_lf_cdf[CDF_SIZE(DELTA_LF_PROBS + 1)] = {
> +	AOM_CDF4(28160, 32120, 32677)
> +};
> +
> +static const u16 default_segment_pred_cdf[SEG_TEMPORAL_PRED_CTXS][CDF_SIZE(2)] = {
> +	{ AOM_CDF2(128 * 128) },
> +	{ AOM_CDF2(128 * 128) },
> +	{ AOM_CDF2(128 * 128) }
> +};
> +
> +static const u16 default_spatial_pred_seg_tree_cdf[SPATIAL_PREDICTION_PROBS]
> +	[CDF_SIZE(MAX_SEGMENTS)] = {
> +	{
> +		AOM_CDF8(5622, 7893, 16093, 18233, 27809, 28373, 32533),
> +	},
> +	{
> +		AOM_CDF8(14274, 18230, 22557, 24935, 29980, 30851, 32344),
> +	},
> +	{
> +		AOM_CDF8(27527, 28487, 28723, 28890, 32397, 32647, 32679),
> +	},
> +};
> +
> +static const u16 default_tx_size_cdf[MAX_TX_CATS]
> +	[AV1_TX_SIZE_CONTEXTS][CDF_SIZE(MAX_TX_DEPTH + 1)] = {
> +	{
> +		{ AOM_CDF2(19968)},
> +		{ AOM_CDF2(19968)},
> +		{ AOM_CDF2(24320)}
> +	},
> +	{
> +		{ AOM_CDF3(12272, 30172)},
> +		{ AOM_CDF3(12272, 30172)},
> +		{ AOM_CDF3(18677, 30848)}
> +	},
> +	{
> +		{ AOM_CDF3(12986, 15180)},
> +		{ AOM_CDF3(12986, 15180)},
> +		{ AOM_CDF3(24302, 25602)}
> +	},
> +	{
> +		{ AOM_CDF3(5782, 11475)},
> +		{ AOM_CDF3(5782, 11475)},
> +		{ AOM_CDF3(16803, 22759)}
> +	},
> +};
> +
> +static const u16 av1_default_dc_sign_cdfs[TOKEN_CDF_Q_CTXS]
> +	[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)] = {
> +	{
> +		{
> +			{ AOM_CDF2(128 * 125)},
> +			{ AOM_CDF2(128 * 102)},
> +			{ AOM_CDF2(128 * 147)},
> +		},
> +		{
> +			{ AOM_CDF2(128 * 119)},
> +			{ AOM_CDF2(128 * 101)},
> +			{ AOM_CDF2(128 * 135)},
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF2(128 * 125)},
> +			{ AOM_CDF2(128 * 102)},
> +			{ AOM_CDF2(128 * 147)},
> +		},
> +		{
> +			{ AOM_CDF2(128 * 119)},
> +			{ AOM_CDF2(128 * 101)},
> +			{ AOM_CDF2(128 * 135)},
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF2(128 * 125)},
> +			{ AOM_CDF2(128 * 102)},
> +			{ AOM_CDF2(128 * 147)},
> +		},
> +		{
> +			{ AOM_CDF2(128 * 119)},
> +			{ AOM_CDF2(128 * 101)},
> +			{ AOM_CDF2(128 * 135)},
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF2(128 * 125)},
> +			{ AOM_CDF2(128 * 102)},
> +			{ AOM_CDF2(128 * 147)},
> +		},
> +		{
> +			{ AOM_CDF2(128 * 119)},
> +			{ AOM_CDF2(128 * 101)},
> +			{ AOM_CDF2(128 * 135)},
> +		}
> +	},
> +};
> +
> +static const u16 av1_default_txb_skip_cdfs[TOKEN_CDF_Q_CTXS]
> +	[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)] = {
> +	{
> +		{
> +			{ AOM_CDF2(31849)},
> +			{ AOM_CDF2(5892)},
> +			{ AOM_CDF2(12112)},
> +			{ AOM_CDF2(21935)},
> +			{ AOM_CDF2(20289)},
> +			{ AOM_CDF2(27473)},
> +			{ AOM_CDF2(32487)},
> +			{ AOM_CDF2(7654)},
> +			{ AOM_CDF2(19473)},
> +			{ AOM_CDF2(29984)},
> +			{ AOM_CDF2(9961)},
> +			{ AOM_CDF2(30242)},
> +			{ AOM_CDF2(32117)}
> +		},
> +		{
> +			{ AOM_CDF2(31548)},
> +			{ AOM_CDF2(1549)},
> +			{ AOM_CDF2(10130)},
> +			{ AOM_CDF2(16656)},
> +			{ AOM_CDF2(18591)},
> +			{ AOM_CDF2(26308)},
> +			{ AOM_CDF2(32537)},
> +			{ AOM_CDF2(5403)},
> +			{ AOM_CDF2(18096)},
> +			{ AOM_CDF2(30003)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(29957)},
> +			{ AOM_CDF2(5391)},
> +			{ AOM_CDF2(18039)},
> +			{ AOM_CDF2(23566)},
> +			{ AOM_CDF2(22431)},
> +			{ AOM_CDF2(25822)},
> +			{ AOM_CDF2(32197)},
> +			{ AOM_CDF2(3778)},
> +			{ AOM_CDF2(15336)},
> +			{ AOM_CDF2(28981)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(17920)},
> +			{ AOM_CDF2(1818)},
> +			{ AOM_CDF2(7282)},
> +			{ AOM_CDF2(25273)},
> +			{ AOM_CDF2(10923)},
> +			{ AOM_CDF2(31554)},
> +			{ AOM_CDF2(32624)},
> +			{ AOM_CDF2(1366)},
> +			{ AOM_CDF2(15628)},
> +			{ AOM_CDF2(30462)},
> +			{ AOM_CDF2(146)},
> +			{ AOM_CDF2(5132)},
> +			{ AOM_CDF2(31657)}
> +		},
> +		{
> +			{ AOM_CDF2(6308)},
> +			{ AOM_CDF2(117)},
> +			{ AOM_CDF2(1638)},
> +			{ AOM_CDF2(2161)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(10923)},
> +			{ AOM_CDF2(30247)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF2(30371)},
> +			{ AOM_CDF2(7570)},
> +			{ AOM_CDF2(13155)},
> +			{ AOM_CDF2(20751)},
> +			{ AOM_CDF2(20969)},
> +			{ AOM_CDF2(27067)},
> +			{ AOM_CDF2(32013)},
> +			{ AOM_CDF2(5495)},
> +			{ AOM_CDF2(17942)},
> +			{ AOM_CDF2(28280)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(31782)},
> +			{ AOM_CDF2(1836)},
> +			{ AOM_CDF2(10689)},
> +			{ AOM_CDF2(17604)},
> +			{ AOM_CDF2(21622)},
> +			{ AOM_CDF2(27518)},
> +			{ AOM_CDF2(32399)},
> +			{ AOM_CDF2(4419)},
> +			{ AOM_CDF2(16294)},
> +			{ AOM_CDF2(28345)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(31901)},
> +			{ AOM_CDF2(10311)},
> +			{ AOM_CDF2(18047)},
> +			{ AOM_CDF2(24806)},
> +			{ AOM_CDF2(23288)},
> +			{ AOM_CDF2(27914)},
> +			{ AOM_CDF2(32296)},
> +			{ AOM_CDF2(4215)},
> +			{ AOM_CDF2(15756)},
> +			{ AOM_CDF2(28341)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(26726)},
> +			{ AOM_CDF2(1045)},
> +			{ AOM_CDF2(11703)},
> +			{ AOM_CDF2(20590)},
> +			{ AOM_CDF2(18554)},
> +			{ AOM_CDF2(25970)},
> +			{ AOM_CDF2(31938)},
> +			{ AOM_CDF2(5583)},
> +			{ AOM_CDF2(21313)},
> +			{ AOM_CDF2(29390)},
> +			{ AOM_CDF2(641)},
> +			{ AOM_CDF2(22265)},
> +			{ AOM_CDF2(31452)}
> +		},
> +		{
> +			{ AOM_CDF2(26584)},
> +			{ AOM_CDF2(188)},
> +			{ AOM_CDF2(8847)},
> +			{ AOM_CDF2(24519)},
> +			{ AOM_CDF2(22938)},
> +			{ AOM_CDF2(30583)},
> +			{ AOM_CDF2(32608)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF2(29614)},
> +			{ AOM_CDF2(9068)},
> +			{ AOM_CDF2(12924)},
> +			{ AOM_CDF2(19538)},
> +			{ AOM_CDF2(17737)},
> +			{ AOM_CDF2(24619)},
> +			{ AOM_CDF2(30642)},
> +			{ AOM_CDF2(4119)},
> +			{ AOM_CDF2(16026)},
> +			{ AOM_CDF2(25657)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(31957)},
> +			{ AOM_CDF2(3230)},
> +			{ AOM_CDF2(11153)},
> +			{ AOM_CDF2(18123)},
> +			{ AOM_CDF2(20143)},
> +			{ AOM_CDF2(26536)},
> +			{ AOM_CDF2(31986)},
> +			{ AOM_CDF2(3050)},
> +			{ AOM_CDF2(14603)},
> +			{ AOM_CDF2(25155)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(32363)},
> +			{ AOM_CDF2(10692)},
> +			{ AOM_CDF2(19090)},
> +			{ AOM_CDF2(24357)},
> +			{ AOM_CDF2(24442)},
> +			{ AOM_CDF2(28312)},
> +			{ AOM_CDF2(32169)},
> +			{ AOM_CDF2(3648)},
> +			{ AOM_CDF2(15690)},
> +			{ AOM_CDF2(26815)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(30669)},
> +			{ AOM_CDF2(3832)},
> +			{ AOM_CDF2(11663)},
> +			{ AOM_CDF2(18889)},
> +			{ AOM_CDF2(19782)},
> +			{ AOM_CDF2(23313)},
> +			{ AOM_CDF2(31330)},
> +			{ AOM_CDF2(5124)},
> +			{ AOM_CDF2(18719)},
> +			{ AOM_CDF2(28468)},
> +			{ AOM_CDF2(3082)},
> +			{ AOM_CDF2(20982)},
> +			{ AOM_CDF2(29443)}
> +		},
> +		{
> +			{ AOM_CDF2(28573)},
> +			{ AOM_CDF2(3183)},
> +			{ AOM_CDF2(17802)},
> +			{ AOM_CDF2(25977)},
> +			{ AOM_CDF2(26677)},
> +			{ AOM_CDF2(27832)},
> +			{ AOM_CDF2(32387)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF2(26887)},
> +			{ AOM_CDF2(6729)},
> +			{ AOM_CDF2(10361)},
> +			{ AOM_CDF2(17442)},
> +			{ AOM_CDF2(15045)},
> +			{ AOM_CDF2(22478)},
> +			{ AOM_CDF2(29072)},
> +			{ AOM_CDF2(2713)},
> +			{ AOM_CDF2(11861)},
> +			{ AOM_CDF2(20773)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(31903)},
> +			{ AOM_CDF2(2044)},
> +			{ AOM_CDF2(7528)},
> +			{ AOM_CDF2(14618)},
> +			{ AOM_CDF2(16182)},
> +			{ AOM_CDF2(24168)},
> +			{ AOM_CDF2(31037)},
> +			{ AOM_CDF2(2786)},
> +			{ AOM_CDF2(11194)},
> +			{ AOM_CDF2(20155)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(32510)},
> +			{ AOM_CDF2(8430)},
> +			{ AOM_CDF2(17318)},
> +			{ AOM_CDF2(24154)},
> +			{ AOM_CDF2(23674)},
> +			{ AOM_CDF2(28789)},
> +			{ AOM_CDF2(32139)},
> +			{ AOM_CDF2(3440)},
> +			{ AOM_CDF2(13117)},
> +			{ AOM_CDF2(22702)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		},
> +		{
> +			{ AOM_CDF2(31671)},
> +			{ AOM_CDF2(2056)},
> +			{ AOM_CDF2(11746)},
> +			{ AOM_CDF2(16852)},
> +			{ AOM_CDF2(18635)},
> +			{ AOM_CDF2(24715)},
> +			{ AOM_CDF2(31484)},
> +			{ AOM_CDF2(4656)},
> +			{ AOM_CDF2(16074)},
> +			{ AOM_CDF2(24704)},
> +			{ AOM_CDF2(1806)},
> +			{ AOM_CDF2(14645)},
> +			{ AOM_CDF2(25336)}
> +		},
> +		{
> +			{ AOM_CDF2(31539)},
> +			{ AOM_CDF2(8433)},
> +			{ AOM_CDF2(20576)},
> +			{ AOM_CDF2(27904)},
> +			{ AOM_CDF2(27852)},
> +			{ AOM_CDF2(30026)},
> +			{ AOM_CDF2(32441)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)},
> +			{ AOM_CDF2(16384)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_extra_cdfs[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
> +	[EOB_COEF_CONTEXTS][CDF_SIZE(2)] = {
> +	{
> +		{
> +			{
> +				{ AOM_CDF2(16961)},
> +				{ AOM_CDF2(17223)},
> +				{ AOM_CDF2(7621)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(19069)},
> +				{ AOM_CDF2(22525)},
> +				{ AOM_CDF2(13377)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(20401)},
> +				{ AOM_CDF2(17025)},
> +				{ AOM_CDF2(12845)},
> +				{ AOM_CDF2(12873)},
> +				{ AOM_CDF2(14094)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(20681)},
> +				{ AOM_CDF2(20701)},
> +				{ AOM_CDF2(15250)},
> +				{ AOM_CDF2(15017)},
> +				{ AOM_CDF2(14928)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(23905)},
> +				{ AOM_CDF2(17194)},
> +				{ AOM_CDF2(16170)},
> +				{ AOM_CDF2(17695)},
> +				{ AOM_CDF2(13826)},
> +				{ AOM_CDF2(15810)},
> +				{ AOM_CDF2(12036)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(23959)},
> +				{ AOM_CDF2(20799)},
> +				{ AOM_CDF2(19021)},
> +				{ AOM_CDF2(16203)},
> +				{ AOM_CDF2(17886)},
> +				{ AOM_CDF2(14144)},
> +				{ AOM_CDF2(12010)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(27399)},
> +				{ AOM_CDF2(16327)},
> +				{ AOM_CDF2(18071)},
> +				{ AOM_CDF2(19584)},
> +				{ AOM_CDF2(20721)},
> +				{ AOM_CDF2(18432)},
> +				{ AOM_CDF2(19560)},
> +				{ AOM_CDF2(10150)},
> +				{ AOM_CDF2(8805)},
> +			},
> +			{
> +				{ AOM_CDF2(24932)},
> +				{ AOM_CDF2(20833)},
> +				{ AOM_CDF2(12027)},
> +				{ AOM_CDF2(16670)},
> +				{ AOM_CDF2(19914)},
> +				{ AOM_CDF2(15106)},
> +				{ AOM_CDF2(17662)},
> +				{ AOM_CDF2(13783)},
> +				{ AOM_CDF2(28756)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(23406)},
> +				{ AOM_CDF2(21845)},
> +				{ AOM_CDF2(18432)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(17096)},
> +				{ AOM_CDF2(12561)},
> +				{ AOM_CDF2(17320)},
> +				{ AOM_CDF2(22395)},
> +				{ AOM_CDF2(21370)},
> +			},
> +			{
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF2(17471)},
> +				{ AOM_CDF2(20223)},
> +				{ AOM_CDF2(11357)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(20335)},
> +				{ AOM_CDF2(21667)},
> +				{ AOM_CDF2(14818)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(20430)},
> +				{ AOM_CDF2(20662)},
> +				{ AOM_CDF2(15367)},
> +				{ AOM_CDF2(16970)},
> +				{ AOM_CDF2(14657)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(22117)},
> +				{ AOM_CDF2(22028)},
> +				{ AOM_CDF2(18650)},
> +				{ AOM_CDF2(16042)},
> +				{ AOM_CDF2(15885)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(22409)},
> +				{ AOM_CDF2(21012)},
> +				{ AOM_CDF2(15650)},
> +				{ AOM_CDF2(17395)},
> +				{ AOM_CDF2(15469)},
> +				{ AOM_CDF2(20205)},
> +				{ AOM_CDF2(19511)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(24220)},
> +				{ AOM_CDF2(22480)},
> +				{ AOM_CDF2(17737)},
> +				{ AOM_CDF2(18916)},
> +				{ AOM_CDF2(19268)},
> +				{ AOM_CDF2(18412)},
> +				{ AOM_CDF2(18844)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(25991)},
> +				{ AOM_CDF2(20314)},
> +				{ AOM_CDF2(17731)},
> +				{ AOM_CDF2(19678)},
> +				{ AOM_CDF2(18649)},
> +				{ AOM_CDF2(17307)},
> +				{ AOM_CDF2(21798)},
> +				{ AOM_CDF2(17549)},
> +				{ AOM_CDF2(15630)},
> +			},
> +			{
> +				{ AOM_CDF2(26585)},
> +				{ AOM_CDF2(21469)},
> +				{ AOM_CDF2(20432)},
> +				{ AOM_CDF2(17735)},
> +				{ AOM_CDF2(19280)},
> +				{ AOM_CDF2(15235)},
> +				{ AOM_CDF2(20297)},
> +				{ AOM_CDF2(22471)},
> +				{ AOM_CDF2(28997)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(26605)},
> +				{ AOM_CDF2(11304)},
> +				{ AOM_CDF2(16726)},
> +				{ AOM_CDF2(16560)},
> +				{ AOM_CDF2(20866)},
> +				{ AOM_CDF2(23524)},
> +				{ AOM_CDF2(19878)},
> +				{ AOM_CDF2(13469)},
> +				{ AOM_CDF2(23084)},
> +			},
> +			{
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF2(18983)},
> +				{ AOM_CDF2(20512)},
> +				{ AOM_CDF2(14885)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(20090)},
> +				{ AOM_CDF2(19444)},
> +				{ AOM_CDF2(17286)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(19139)},
> +				{ AOM_CDF2(21487)},
> +				{ AOM_CDF2(18959)},
> +				{ AOM_CDF2(20910)},
> +				{ AOM_CDF2(19089)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(20536)},
> +				{ AOM_CDF2(20664)},
> +				{ AOM_CDF2(20625)},
> +				{ AOM_CDF2(19123)},
> +				{ AOM_CDF2(14862)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(19833)},
> +				{ AOM_CDF2(21502)},
> +				{ AOM_CDF2(17485)},
> +				{ AOM_CDF2(20267)},
> +				{ AOM_CDF2(18353)},
> +				{ AOM_CDF2(23329)},
> +				{ AOM_CDF2(21478)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(22041)},
> +				{ AOM_CDF2(23434)},
> +				{ AOM_CDF2(20001)},
> +				{ AOM_CDF2(20554)},
> +				{ AOM_CDF2(20951)},
> +				{ AOM_CDF2(20145)},
> +				{ AOM_CDF2(15562)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(23312)},
> +				{ AOM_CDF2(21607)},
> +				{ AOM_CDF2(16526)},
> +				{ AOM_CDF2(18957)},
> +				{ AOM_CDF2(18034)},
> +				{ AOM_CDF2(18934)},
> +				{ AOM_CDF2(24247)},
> +				{ AOM_CDF2(16921)},
> +				{ AOM_CDF2(17080)},
> +			},
> +			{
> +				{ AOM_CDF2(26579)},
> +				{ AOM_CDF2(24910)},
> +				{ AOM_CDF2(18637)},
> +				{ AOM_CDF2(19800)},
> +				{ AOM_CDF2(20388)},
> +				{ AOM_CDF2(9887)},
> +				{ AOM_CDF2(15642)},
> +				{ AOM_CDF2(30198)},
> +				{ AOM_CDF2(24721)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(26998)},
> +				{ AOM_CDF2(16737)},
> +				{ AOM_CDF2(17838)},
> +				{ AOM_CDF2(18922)},
> +				{ AOM_CDF2(19515)},
> +				{ AOM_CDF2(18636)},
> +				{ AOM_CDF2(17333)},
> +				{ AOM_CDF2(15776)},
> +				{ AOM_CDF2(22658)},
> +			},
> +			{
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF2(20177)},
> +				{ AOM_CDF2(20789)},
> +				{ AOM_CDF2(20262)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(21416)},
> +				{ AOM_CDF2(20855)},
> +				{ AOM_CDF2(23410)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(20238)},
> +				{ AOM_CDF2(21057)},
> +				{ AOM_CDF2(19159)},
> +				{ AOM_CDF2(22337)},
> +				{ AOM_CDF2(20159)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(20125)},
> +				{ AOM_CDF2(20559)},
> +				{ AOM_CDF2(21707)},
> +				{ AOM_CDF2(22296)},
> +				{ AOM_CDF2(17333)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(19941)},
> +				{ AOM_CDF2(20527)},
> +				{ AOM_CDF2(21470)},
> +				{ AOM_CDF2(22487)},
> +				{ AOM_CDF2(19558)},
> +				{ AOM_CDF2(22354)},
> +				{ AOM_CDF2(20331)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			},
> +			{
> +				{ AOM_CDF2(22752)},
> +				{ AOM_CDF2(25006)},
> +				{ AOM_CDF2(22075)},
> +				{ AOM_CDF2(21576)},
> +				{ AOM_CDF2(17740)},
> +				{ AOM_CDF2(21690)},
> +				{ AOM_CDF2(19211)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(21442)},
> +				{ AOM_CDF2(22358)},
> +				{ AOM_CDF2(18503)},
> +				{ AOM_CDF2(20291)},
> +				{ AOM_CDF2(19945)},
> +				{ AOM_CDF2(21294)},
> +				{ AOM_CDF2(21178)},
> +				{ AOM_CDF2(19400)},
> +				{ AOM_CDF2(10556)},
> +			},
> +			{
> +				{ AOM_CDF2(24648)},
> +				{ AOM_CDF2(24949)},
> +				{ AOM_CDF2(20708)},
> +				{ AOM_CDF2(23905)},
> +				{ AOM_CDF2(20501)},
> +				{ AOM_CDF2(9558)},
> +				{ AOM_CDF2(9423)},
> +				{ AOM_CDF2(30365)},
> +				{ AOM_CDF2(19253)},
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF2(26064)},
> +				{ AOM_CDF2(22098)},
> +				{ AOM_CDF2(19613)},
> +				{ AOM_CDF2(20525)},
> +				{ AOM_CDF2(17595)},
> +				{ AOM_CDF2(16618)},
> +				{ AOM_CDF2(20497)},
> +				{ AOM_CDF2(18989)},
> +				{ AOM_CDF2(15513)},
> +			},
> +			{
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +				{ AOM_CDF2(16384)},
> +			}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi16_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][4] = {
> +	{
> +		{
> +			{ AOM_CDF5(840, 1039, 1980, 4895)},
> +			{ AOM_CDF5(370, 671, 1883, 4471)}
> +		},
> +		{
> +			{ AOM_CDF5(3247, 4950, 9688, 14563)},
> +			{ AOM_CDF5(1904, 3354, 7763, 14647)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF5(2125, 2551, 5165, 8946)},
> +			{ AOM_CDF5(513, 765, 1859, 6339)}
> +		},
> +		{
> +			{ AOM_CDF5(7637, 9498, 14259, 19108)},
> +			{ AOM_CDF5(2497, 4096, 8866, 16993)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF5(4016, 4897, 8881, 14968)},
> +			{ AOM_CDF5(716, 1105, 2646, 10056)}
> +		},
> +		{
> +			{ AOM_CDF5(11139, 13270, 18241, 23566)},
> +			{ AOM_CDF5(3192, 5032, 10297, 19755)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF5(6708, 8958, 14746, 22133)},
> +			{ AOM_CDF5(1222, 2074, 4783, 15410)}
> +		},
> +		{
> +			{ AOM_CDF5(19575, 21766, 26044, 29709)},
> +			{ AOM_CDF5(7297, 10767, 19273, 28194)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi32_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8] = {
> +	{
> +		{
> +			{ AOM_CDF6(400, 520, 977, 2102, 6542)},
> +			{ AOM_CDF6(210, 405, 1315, 3326, 7537)}
> +		},
> +		{
> +			{ AOM_CDF6(2636, 4273, 7588, 11794, 20401)},
> +			{ AOM_CDF6(1786, 3179, 6902, 11357, 19054)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF6(989, 1249, 2019, 4151, 10785)},
> +			{ AOM_CDF6(313, 441, 1099, 2917, 8562)}
> +		},
> +		{
> +			{ AOM_CDF6(8394, 10352, 13932, 18855, 26014)},
> +			{ AOM_CDF6(2578, 4124, 8181, 13670, 24234)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF6(2515, 3003, 4452, 8162, 16041)},
> +			{ AOM_CDF6(574, 821, 1836, 5089, 13128)}
> +		},
> +		{
> +			{ AOM_CDF6(13468, 16303, 20361, 25105, 29281)},
> +			{ AOM_CDF6(3542, 5502, 10415, 16760, 25644)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF6(4617, 5709, 8446, 13584, 23135)},
> +			{ AOM_CDF6(1156, 1702, 3675, 9274, 20539)}
> +		},
> +		{
> +			{ AOM_CDF6(22086, 24282, 27010, 29770, 31743)},
> +			{ AOM_CDF6(7699, 10897, 20891, 26926, 31628)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi64_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8] = {
> +	{
> +		{
> +			{ AOM_CDF7(329, 498, 1101, 1784, 3265, 7758)},
> +			{ AOM_CDF7(335, 730, 1459, 5494, 8755, 12997)}
> +		},
> +		{
> +			{ AOM_CDF7(3505, 5304, 10086, 13814, 17684, 23370)},
> +			{ AOM_CDF7(1563, 2700, 4876, 10911, 14706, 22480)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF7(1260, 1446, 2253, 3712, 6652, 13369)},
> +			{ AOM_CDF7(401, 605, 1029, 2563, 5845, 12626)}
> +		},
> +		{
> +			{ AOM_CDF7(8609, 10612, 14624, 18714, 22614, 29024)},
> +			{ AOM_CDF7(1923, 3127, 5867, 9703, 14277, 27100)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF7(2374, 2772, 4583, 7276, 12288, 19706)},
> +			{ AOM_CDF7(497, 810, 1315, 3000, 7004, 15641)}
> +		},
> +		{
> +			{ AOM_CDF7(15050, 17126, 21410, 24886, 28156, 30726)},
> +			{ AOM_CDF7(4034, 6290, 10235, 14982, 21214, 28491)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF7(6307, 7541, 12060, 16358, 22553, 27865)},
> +			{ AOM_CDF7(1289, 2320, 3971, 7926, 14153, 24291)}
> +		},
> +		{
> +			{ AOM_CDF7(24212, 25708, 28268, 30035, 31307, 32049)},
> +			{ AOM_CDF7(8726, 12378, 19409, 26450, 30038, 32462)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi128_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8] = {
> +	{
> +		{
> +			{ AOM_CDF8(219, 482, 1140, 2091, 3680, 6028, 12586)},
> +			{ AOM_CDF8(371, 699, 1254, 4830, 9479, 12562, 17497)}
> +		},
> +		{
> +			{ AOM_CDF8(5245, 7456, 12880, 15852, 20033, 23932, 27608)},
> +			{ AOM_CDF8(2054, 3472, 5869, 14232, 18242, 20590, 26752)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF8(685, 933, 1488, 2714, 4766, 8562, 19254)},
> +			{ AOM_CDF8(217, 352, 618, 2303, 5261, 9969, 17472)}
> +		},
> +		{
> +			{ AOM_CDF8(8045, 11200, 15497, 19595, 23948, 27408, 30938)},
> +			{ AOM_CDF8(2310, 4160, 7471, 14997, 17931, 20768, 30240)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF8(1366, 1738, 2527, 5016, 9355, 15797, 24643)},
> +			{ AOM_CDF8(354, 558, 944, 2760, 7287, 14037, 21779)}
> +		},
> +		{
> +			{ AOM_CDF8(13627, 16246, 20173, 24429, 27948, 30415, 31863)},
> +			{ AOM_CDF8(6275, 9889, 14769, 23164, 27988, 30493, 32272)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF8(3472, 4885, 7489, 12481, 18517, 24536, 29635)},
> +			{ AOM_CDF8(886, 1731, 3271, 8469, 15569, 22126, 28383)}
> +		},
> +		{
> +			{ AOM_CDF8(24313, 26062, 28385, 30107, 31217, 31898, 32345)},
> +			{ AOM_CDF8(9165, 13282, 21150, 30286, 31894, 32571, 32712)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi256_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8] = {
> +	{
> +		{
> +			{ AOM_CDF9(310, 584, 1887, 3589, 6168, 8611, 11352, 15652)},
> +			{ AOM_CDF9(998, 1850, 2998, 5604, 17341, 19888, 22899, 25583)}
> +		},
> +		{
> +			{ AOM_CDF9(2520, 3240, 5952, 8870, 12577, 17558, 19954, 24168)},
> +			{ AOM_CDF9(2203, 4130, 7435, 10739, 20652, 23681, 25609, 27261)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF9(1448, 2109, 4151, 6263, 9329, 13260, 17944, 23300)},
> +			{ AOM_CDF9(399, 1019, 1749, 3038, 10444, 15546, 22739, 27294)}
> +		},
> +		{
> +			{ AOM_CDF9(6402, 8148, 12623, 15072, 18728, 22847, 26447, 29377)},
> +			{ AOM_CDF9(1674, 3252, 5734, 10159, 22397, 23802, 24821, 30940)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF9(3089, 3920, 6038, 9460, 14266, 19881, 25766, 29176)},
> +			{ AOM_CDF9(1084, 2358, 3488, 5122, 11483, 18103, 26023, 29799)}
> +		},
> +		{
> +			{ AOM_CDF9(11514, 13794, 17480, 20754, 24361, 27378, 29492, 31277)},
> +			{ AOM_CDF9(6571, 9610, 15516, 21826, 29092, 30829, 31842, 32708)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF9(5348, 7113, 11820, 15924, 22106, 26777, 30334, 31757)},
> +			{ AOM_CDF9(2453, 4474, 6307, 8777, 16474, 22975, 29000, 31547)}
> +		},
> +		{
> +			{ AOM_CDF9(23110, 24597, 27140, 28894, 30167, 30927, 31392, 32094)},
> +			{ AOM_CDF9(9998, 17661, 25178, 28097, 31308, 32038, 32403, 32695)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi512_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][16] = {
> +	{
> +		{
> +			{ AOM_CDF10(641, 983, 3707, 5430, 10234, 14958, 18788, 23412, 26061)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		},
> +		{
> +			{ AOM_CDF10(5095, 6446, 9996, 13354, 16017, 17986, 20919, 26129, 29140)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF10(1230, 2278, 5035, 7776, 11871, 15346, 19590, 24584, 28749)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		},
> +		{
> +			{ AOM_CDF10(7265, 9979, 15819, 19250, 21780, 23846, 26478, 28396, 31811)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF10(2624, 3936, 6480, 9686, 13979, 17726, 23267, 28410, 31078)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		},
> +		{
> +			{ AOM_CDF10(12015, 14769, 19588, 22052, 24222, 25812, 27300, 29219, 32114)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF10(5927, 7809, 10923, 14597, 19439, 24135, 28456, 31142, 32060)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		},
> +		{
> +			{ AOM_CDF10(21093, 23043, 25742, 27658, 29097, 29716, 30073, 30820, 31956)},
> +			{ AOM_CDF10(3277, 6554, 9830, 13107, 16384, 19661, 22938, 26214, 29491)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_eob_multi1024_cdfs[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][16] = {
> +	{
> +		{
> +			{ AOM_CDF11(393, 421, 751, 1623, 3160,
> +				    6352, 13345, 18047, 22571, 25830)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		},
> +		{
> +			{ AOM_CDF11(1865, 1988, 2930, 4242, 10533,
> +				    16538, 21354, 27255, 28546, 31784)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF11(696, 948, 3145, 5702, 9706,
> +				    13217, 17851, 21856, 25692, 28034)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		},
> +		{
> +			{ AOM_CDF11(2672, 3591, 9330, 17084, 22725,
> +				    24284, 26527, 28027, 28377, 30876)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF11(2784, 3831, 7041, 10521, 14847,
> +				    18844, 23155, 26682, 29229, 31045)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		},
> +		{
> +			{ AOM_CDF11(9577, 12466, 17739, 20750, 22061,
> +				    23215, 24601, 25483, 25843, 32056)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		}
> +	},
> +	{
> +		{
> +			{ AOM_CDF11(6698, 8334, 11961, 15762, 20186,
> +				    23862, 27434, 29326, 31082, 32050)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		},
> +		{
> +			{ AOM_CDF11(20569, 22426, 25569, 26859, 28053,
> +				    28913, 29486, 29724, 29807, 32570)},
> +			{ AOM_CDF11(2979, 5958, 8937, 11916, 14895,
> +				    17873, 20852, 23831, 26810, 29789)}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_coeff_lps_multi_cdfs[TOKEN_CDF_Q_CTXS]
> +	[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][CDF_SIZE(BR_CDF_SIZE) + 1] = {
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(14298, 20718, 24174)}, { AOM_CDF4(12536, 19601, 23789)},
> +				{ AOM_CDF4(8712, 15051, 19503)}, { AOM_CDF4(6170, 11327, 15434)},
> +				{ AOM_CDF4(4742, 8926, 12538)}, { AOM_CDF4(3803, 7317, 10546)},
> +				{ AOM_CDF4(1696, 3317, 4871)}, { AOM_CDF4(14392, 19951, 22756)},
> +				{ AOM_CDF4(15978, 23218, 26818)}, { AOM_CDF4(12187, 19474, 23889)},
> +				{ AOM_CDF4(9176, 15640, 20259)}, { AOM_CDF4(7068, 12655, 17028)},
> +				{ AOM_CDF4(5656, 10442, 14472)}, { AOM_CDF4(2580, 4992, 7244)},
> +				{ AOM_CDF4(12136, 18049, 21426)}, { AOM_CDF4(13784, 20721, 24481)},
> +				{ AOM_CDF4(10836, 17621, 21900)}, { AOM_CDF4(8372, 14444, 18847)},
> +				{ AOM_CDF4(6523, 11779, 16000)}, { AOM_CDF4(5337, 9898, 13760)},
> +				{ AOM_CDF4(3034, 5860, 8462)}
> +			},
> +			{
> +				{ AOM_CDF4(15967, 22905, 26286)}, { AOM_CDF4(13534, 20654, 24579)},
> +				{ AOM_CDF4(9504, 16092, 20535)}, { AOM_CDF4(6975, 12568, 16903)},
> +				{ AOM_CDF4(5364, 10091, 14020)}, { AOM_CDF4(4357, 8370, 11857)},
> +				{ AOM_CDF4(2506, 4934, 7218)}, { AOM_CDF4(23032, 28815, 30936)},
> +				{ AOM_CDF4(19540, 26704, 29719)}, { AOM_CDF4(15158, 22969, 27097)},
> +				{ AOM_CDF4(11408, 18865, 23650)}, { AOM_CDF4(8885, 15448, 20250)},
> +				{ AOM_CDF4(7108, 12853, 17416)}, { AOM_CDF4(4231, 8041, 11480)},
> +				{ AOM_CDF4(19823, 26490, 29156)}, { AOM_CDF4(18890, 25929, 28932)},
> +				{ AOM_CDF4(15660, 23491, 27433)}, { AOM_CDF4(12147, 19776, 24488)},
> +				{ AOM_CDF4(9728, 16774, 21649)}, { AOM_CDF4(7919, 14277, 19066)},
> +				{ AOM_CDF4(5440, 10170, 14185)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(14406, 20862, 24414)}, { AOM_CDF4(11824, 18907, 23109)},
> +				{ AOM_CDF4(8257, 14393, 18803)}, { AOM_CDF4(5860, 10747, 14778)},
> +				{ AOM_CDF4(4475, 8486, 11984)}, { AOM_CDF4(3606, 6954, 10043)},
> +				{ AOM_CDF4(1736, 3410, 5048)}, { AOM_CDF4(14430, 20046, 22882)},
> +				{ AOM_CDF4(15593, 22899, 26709)}, { AOM_CDF4(12102, 19368, 23811)},
> +				{ AOM_CDF4(9059, 15584, 20262)}, { AOM_CDF4(6999, 12603, 17048)},
> +				{ AOM_CDF4(5684, 10497, 14553)}, { AOM_CDF4(2822, 5438, 7862)},
> +				{ AOM_CDF4(15785, 21585, 24359)}, { AOM_CDF4(18347, 25229, 28266)},
> +				{ AOM_CDF4(14974, 22487, 26389)}, { AOM_CDF4(11423, 18681, 23271)},
> +				{ AOM_CDF4(8863, 15350, 20008)}, { AOM_CDF4(7153, 12852, 17278)},
> +				{ AOM_CDF4(3707, 7036, 9982)}
> +			},
> +			{
> +				{ AOM_CDF4(15460, 21696, 25469)}, { AOM_CDF4(12170, 19249, 23191)},
> +				{ AOM_CDF4(8723, 15027, 19332)}, { AOM_CDF4(6428, 11704, 15874)},
> +				{ AOM_CDF4(4922, 9292, 13052)}, { AOM_CDF4(4139, 7695, 11010)},
> +				{ AOM_CDF4(2291, 4508, 6598)}, { AOM_CDF4(19856, 26920, 29828)},
> +				{ AOM_CDF4(17923, 25289, 28792)}, { AOM_CDF4(14278, 21968, 26297)},
> +				{ AOM_CDF4(10910, 18136, 22950)}, { AOM_CDF4(8423, 14815, 19627)},
> +				{ AOM_CDF4(6771, 12283, 16774)}, { AOM_CDF4(4074, 7750, 11081)},
> +				{ AOM_CDF4(19852, 26074, 28672)}, { AOM_CDF4(19371, 26110, 28989)},
> +				{ AOM_CDF4(16265, 23873, 27663)}, { AOM_CDF4(12758, 20378, 24952)},
> +				{ AOM_CDF4(10095, 17098, 21961)}, { AOM_CDF4(8250, 14628, 19451)},
> +				{ AOM_CDF4(5205, 9745, 13622)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(10563, 16233, 19763)}, { AOM_CDF4(9794, 16022, 19804)},
> +				{ AOM_CDF4(6750, 11945, 15759)}, { AOM_CDF4(4963, 9186, 12752)},
> +				{ AOM_CDF4(3845, 7435, 10627)}, { AOM_CDF4(3051, 6085, 8834)},
> +				{ AOM_CDF4(1311, 2596, 3830)}, { AOM_CDF4(11246, 16404, 19689)},
> +				{ AOM_CDF4(12315, 18911, 22731)}, { AOM_CDF4(10557, 17095, 21289)},
> +				{ AOM_CDF4(8136, 14006, 18249)}, { AOM_CDF4(6348, 11474, 15565)},
> +				{ AOM_CDF4(5196, 9655, 13400)}, { AOM_CDF4(2349, 4526, 6587)},
> +				{ AOM_CDF4(13337, 18730, 21569)}, { AOM_CDF4(19306, 26071, 28882)},
> +				{ AOM_CDF4(15952, 23540, 27254)}, { AOM_CDF4(12409, 19934, 24430)},
> +				{ AOM_CDF4(9760, 16706, 21389)}, { AOM_CDF4(8004, 14220, 18818)},
> +				{ AOM_CDF4(4138, 7794, 10961)}
> +			},
> +			{
> +				{ AOM_CDF4(10870, 16684, 20949)}, { AOM_CDF4(9664, 15230, 18680)},
> +				{ AOM_CDF4(6886, 12109, 15408)}, { AOM_CDF4(4825, 8900, 12305)},
> +				{ AOM_CDF4(3630, 7162, 10314)}, { AOM_CDF4(3036, 6429, 9387)},
> +				{ AOM_CDF4(1671, 3296, 4940)}, { AOM_CDF4(13819, 19159, 23026)},
> +				{ AOM_CDF4(11984, 19108, 23120)}, { AOM_CDF4(10690, 17210, 21663)},
> +				{ AOM_CDF4(7984, 14154, 18333)}, { AOM_CDF4(6868, 12294, 16124)},
> +				{ AOM_CDF4(5274, 8994, 12868)}, { AOM_CDF4(2988, 5771, 8424)},
> +				{ AOM_CDF4(19736, 26647, 29141)}, { AOM_CDF4(18933, 26070, 28984)},
> +				{ AOM_CDF4(15779, 23048, 27200)}, { AOM_CDF4(12638, 20061, 24532)},
> +				{ AOM_CDF4(10692, 17545, 22220)}, { AOM_CDF4(9217, 15251, 20054)},
> +				{ AOM_CDF4(5078, 9284, 12594)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(2331, 3662, 5244)}, { AOM_CDF4(2891, 4771, 6145)},
> +				{ AOM_CDF4(4598, 7623, 9729)}, { AOM_CDF4(3520, 6845, 9199)},
> +				{ AOM_CDF4(3417, 6119, 9324)}, { AOM_CDF4(2601, 5412, 7385)},
> +				{ AOM_CDF4(600, 1173, 1744)}, { AOM_CDF4(7672, 13286, 17469)},
> +				{ AOM_CDF4(4232, 7792, 10793)}, { AOM_CDF4(2915, 5317, 7397)},
> +				{ AOM_CDF4(2318, 4356, 6152)}, { AOM_CDF4(2127, 4000, 5554)},
> +				{ AOM_CDF4(1850, 3478, 5275)}, { AOM_CDF4(977, 1933, 2843)},
> +				{ AOM_CDF4(18280, 24387, 27989)}, { AOM_CDF4(15852, 22671, 26185)},
> +				{ AOM_CDF4(13845, 20951, 24789)}, { AOM_CDF4(11055, 17966, 22129)},
> +				{ AOM_CDF4(9138, 15422, 19801)}, { AOM_CDF4(7454, 13145, 17456)},
> +				{ AOM_CDF4(3370, 6393, 9013)}
> +			},
> +			{
> +				{ AOM_CDF4(5842, 9229, 10838)}, { AOM_CDF4(2313, 3491, 4276)},
> +				{ AOM_CDF4(2998, 6104, 7496)}, { AOM_CDF4(2420, 7447, 9868)},
> +				{ AOM_CDF4(3034, 8495, 10923)}, { AOM_CDF4(4076, 8937, 10975)},
> +				{ AOM_CDF4(1086, 2370, 3299)}, { AOM_CDF4(9714, 17254, 20444)},
> +				{ AOM_CDF4(8543, 13698, 17123)}, { AOM_CDF4(4918, 9007, 11910)},
> +				{ AOM_CDF4(4129, 7532, 10553)}, { AOM_CDF4(2364, 5533, 8058)},
> +				{ AOM_CDF4(1834, 3546, 5563)}, { AOM_CDF4(1473, 2908, 4133)},
> +				{ AOM_CDF4(15405, 21193, 25619)}, { AOM_CDF4(15691, 21952, 26561)},
> +				{ AOM_CDF4(12962, 19194, 24165)}, { AOM_CDF4(10272, 17855, 22129)},
> +				{ AOM_CDF4(8588, 15270, 20718)}, { AOM_CDF4(8682, 14669, 19500)},
> +				{ AOM_CDF4(4870, 9636, 13205)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(14995, 21341, 24749)}, { AOM_CDF4(13158, 20289, 24601)},
> +				{ AOM_CDF4(8941, 15326, 19876)}, { AOM_CDF4(6297, 11541, 15807)},
> +				{ AOM_CDF4(4817, 9029, 12776)}, { AOM_CDF4(3731, 7273, 10627)},
> +				{ AOM_CDF4(1847, 3617, 5354)}, { AOM_CDF4(14472, 19659, 22343)},
> +				{ AOM_CDF4(16806, 24162, 27533)}, { AOM_CDF4(12900, 20404, 24713)},
> +				{ AOM_CDF4(9411, 16112, 20797)}, { AOM_CDF4(7056, 12697, 17148)},
> +				{ AOM_CDF4(5544, 10339, 14460)}, { AOM_CDF4(2954, 5704, 8319)},
> +				{ AOM_CDF4(12464, 18071, 21354)}, { AOM_CDF4(15482, 22528, 26034)},
> +				{ AOM_CDF4(12070, 19269, 23624)}, { AOM_CDF4(8953, 15406, 20106)},
> +				{ AOM_CDF4(7027, 12730, 17220)}, { AOM_CDF4(5887, 10913, 15140)},
> +				{ AOM_CDF4(3793, 7278, 10447)}
> +			},
> +			{
> +				{ AOM_CDF4(15571, 22232, 25749)}, { AOM_CDF4(14506, 21575, 25374)},
> +				{ AOM_CDF4(10189, 17089, 21569)}, { AOM_CDF4(7316, 13301, 17915)},
> +				{ AOM_CDF4(5783, 10912, 15190)}, { AOM_CDF4(4760, 9155, 13088)},
> +				{ AOM_CDF4(2993, 5966, 8774)}, { AOM_CDF4(23424, 28903, 30778)},
> +				{ AOM_CDF4(20775, 27666, 30290)}, { AOM_CDF4(16474, 24410, 28299)},
> +				{ AOM_CDF4(12471, 20180, 24987)}, { AOM_CDF4(9410, 16487, 21439)},
> +				{ AOM_CDF4(7536, 13614, 18529)}, { AOM_CDF4(5048, 9586, 13549)},
> +				{ AOM_CDF4(21090, 27290, 29756)}, { AOM_CDF4(20796, 27402, 30026)},
> +				{ AOM_CDF4(17819, 25485, 28969)}, { AOM_CDF4(13860, 21909, 26462)},
> +				{ AOM_CDF4(11002, 18494, 23529)}, { AOM_CDF4(8953, 15929, 20897)},
> +				{ AOM_CDF4(6448, 11918, 16454)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(15999, 22208, 25449)}, { AOM_CDF4(13050, 19988, 24122)},
> +				{ AOM_CDF4(8594, 14864, 19378)}, { AOM_CDF4(6033, 11079, 15238)},
> +				{ AOM_CDF4(4554, 8683, 12347)}, { AOM_CDF4(3672, 7139, 10337)},
> +				{ AOM_CDF4(1900, 3771, 5576)}, { AOM_CDF4(15788, 21340, 23949)},
> +				{ AOM_CDF4(16825, 24235, 27758)}, { AOM_CDF4(12873, 20402, 24810)},
> +				{ AOM_CDF4(9590, 16363, 21094)}, { AOM_CDF4(7352, 13209, 17733)},
> +				{ AOM_CDF4(5960, 10989, 15184)}, { AOM_CDF4(3232, 6234, 9007)},
> +				{ AOM_CDF4(15761, 20716, 23224)}, { AOM_CDF4(19318, 25989, 28759)},
> +				{ AOM_CDF4(15529, 23094, 26929)}, { AOM_CDF4(11662, 18989, 23641)},
> +				{ AOM_CDF4(8955, 15568, 20366)}, { AOM_CDF4(7281, 13106, 17708)},
> +				{ AOM_CDF4(4248, 8059, 11440)}
> +			},
> +			{
> +				{ AOM_CDF4(14899, 21217, 24503)}, { AOM_CDF4(13519, 20283, 24047)},
> +				{ AOM_CDF4(9429, 15966, 20365)}, { AOM_CDF4(6700, 12355, 16652)},
> +				{ AOM_CDF4(5088, 9704, 13716)}, { AOM_CDF4(4243, 8154, 11731)},
> +				{ AOM_CDF4(2702, 5364, 7861)}, { AOM_CDF4(22745, 28388, 30454)},
> +				{ AOM_CDF4(20235, 27146, 29922)}, { AOM_CDF4(15896, 23715, 27637)},
> +				{ AOM_CDF4(11840, 19350, 24131)}, { AOM_CDF4(9122, 15932, 20880)},
> +				{ AOM_CDF4(7488, 13581, 18362)}, { AOM_CDF4(5114, 9568, 13370)},
> +				{ AOM_CDF4(20845, 26553, 28932)}, { AOM_CDF4(20981, 27372, 29884)},
> +				{ AOM_CDF4(17781, 25335, 28785)}, { AOM_CDF4(13760, 21708, 26297)},
> +				{ AOM_CDF4(10975, 18415, 23365)}, { AOM_CDF4(9045, 15789, 20686)},
> +				{ AOM_CDF4(6130, 11199, 15423)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(13549, 19724, 23158)}, { AOM_CDF4(11844, 18382, 22246)},
> +				{ AOM_CDF4(7919, 13619, 17773)}, { AOM_CDF4(5486, 10143, 13946)},
> +				{ AOM_CDF4(4166, 7983, 11324)}, { AOM_CDF4(3364, 6506, 9427)},
> +				{ AOM_CDF4(1598, 3160, 4674)}, { AOM_CDF4(15281, 20979, 23781)},
> +				{ AOM_CDF4(14939, 22119, 25952)}, { AOM_CDF4(11363, 18407, 22812)},
> +				{ AOM_CDF4(8609, 14857, 19370)}, { AOM_CDF4(6737, 12184, 16480)},
> +				{ AOM_CDF4(5506, 10263, 14262)}, { AOM_CDF4(2990, 5786, 8380)},
> +				{ AOM_CDF4(20249, 25253, 27417)}, { AOM_CDF4(21070, 27518, 30001)},
> +				{ AOM_CDF4(16854, 24469, 28074)}, { AOM_CDF4(12864, 20486, 25000)},
> +				{ AOM_CDF4(9962, 16978, 21778)}, { AOM_CDF4(8074, 14338, 19048)},
> +				{ AOM_CDF4(4494, 8479, 11906)}
> +			},
> +			{
> +				{ AOM_CDF4(13960, 19617, 22829)}, { AOM_CDF4(11150, 17341, 21228)},
> +				{ AOM_CDF4(7150, 12964, 17190)}, { AOM_CDF4(5331, 10002, 13867)},
> +				{ AOM_CDF4(4167, 7744, 11057)}, { AOM_CDF4(3480, 6629, 9646)},
> +				{ AOM_CDF4(1883, 3784, 5686)}, { AOM_CDF4(18752, 25660, 28912)},
> +				{ AOM_CDF4(16968, 24586, 28030)}, { AOM_CDF4(13520, 21055, 25313)},
> +				{ AOM_CDF4(10453, 17626, 22280)}, { AOM_CDF4(8386, 14505, 19116)},
> +				{ AOM_CDF4(6742, 12595, 17008)}, { AOM_CDF4(4273, 8140, 11499)},
> +				{ AOM_CDF4(22120, 27827, 30233)}, { AOM_CDF4(20563, 27358, 29895)},
> +				{ AOM_CDF4(17076, 24644, 28153)}, { AOM_CDF4(13362, 20942, 25309)},
> +				{ AOM_CDF4(10794, 17965, 22695)}, { AOM_CDF4(9014, 15652, 20319)},
> +				{ AOM_CDF4(5708, 10512, 14497)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(5705, 10930, 15725)}, { AOM_CDF4(7946, 12765, 16115)},
> +				{ AOM_CDF4(6801, 12123, 16226)}, { AOM_CDF4(5462, 10135, 14200)},
> +				{ AOM_CDF4(4189, 8011, 11507)}, { AOM_CDF4(3191, 6229, 9408)},
> +				{ AOM_CDF4(1057, 2137, 3212)}, { AOM_CDF4(10018, 17067, 21491)},
> +				{ AOM_CDF4(7380, 12582, 16453)}, { AOM_CDF4(6068, 10845, 14339)},
> +				{ AOM_CDF4(5098, 9198, 12555)}, { AOM_CDF4(4312, 8010, 11119)},
> +				{ AOM_CDF4(3700, 6966, 9781)}, { AOM_CDF4(1693, 3326, 4887)},
> +				{ AOM_CDF4(18757, 24930, 27774)}, { AOM_CDF4(17648, 24596, 27817)},
> +				{ AOM_CDF4(14707, 22052, 26026)}, { AOM_CDF4(11720, 18852, 23292)},
> +				{ AOM_CDF4(9357, 15952, 20525)}, { AOM_CDF4(7810, 13753, 18210)},
> +				{ AOM_CDF4(3879, 7333, 10328)}
> +			},
> +			{
> +				{ AOM_CDF4(8278, 13242, 15922)}, { AOM_CDF4(10547, 15867, 18919)},
> +				{ AOM_CDF4(9106, 15842, 20609)}, { AOM_CDF4(6833, 13007, 17218)},
> +				{ AOM_CDF4(4811, 9712, 13923)}, { AOM_CDF4(3985, 7352, 11128)},
> +				{ AOM_CDF4(1688, 3458, 5262)}, { AOM_CDF4(12951, 21861, 26510)},
> +				{ AOM_CDF4(9788, 16044, 20276)}, { AOM_CDF4(6309, 11244, 14870)},
> +				{ AOM_CDF4(5183, 9349, 12566)}, { AOM_CDF4(4389, 8229, 11492)},
> +				{ AOM_CDF4(3633, 6945, 10620)}, { AOM_CDF4(3600, 6847, 9907)},
> +				{ AOM_CDF4(21748, 28137, 30255)}, { AOM_CDF4(19436, 26581, 29560)},
> +				{ AOM_CDF4(16359, 24201, 27953)}, { AOM_CDF4(13961, 21693, 25871)},
> +				{ AOM_CDF4(11544, 18686, 23322)}, { AOM_CDF4(9372, 16462, 20952)},
> +				{ AOM_CDF4(6138, 11210, 15390)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(16138, 22223, 25509)}, { AOM_CDF4(15347, 22430, 26332)},
> +				{ AOM_CDF4(9614, 16736, 21332)}, { AOM_CDF4(6600, 12275, 16907)},
> +				{ AOM_CDF4(4811, 9424, 13547)}, { AOM_CDF4(3748, 7809, 11420)},
> +				{ AOM_CDF4(2254, 4587, 6890)}, { AOM_CDF4(15196, 20284, 23177)},
> +				{ AOM_CDF4(18317, 25469, 28451)}, { AOM_CDF4(13918, 21651, 25842)},
> +				{ AOM_CDF4(10052, 17150, 21995)}, { AOM_CDF4(7499, 13630, 18587)},
> +				{ AOM_CDF4(6158, 11417, 16003)}, { AOM_CDF4(4014, 7785, 11252)},
> +				{ AOM_CDF4(15048, 21067, 24384)}, { AOM_CDF4(18202, 25346, 28553)},
> +				{ AOM_CDF4(14302, 22019, 26356)}, { AOM_CDF4(10839, 18139, 23166)},
> +				{ AOM_CDF4(8715, 15744, 20806)}, { AOM_CDF4(7536, 13576, 18544)},
> +				{ AOM_CDF4(5413, 10335, 14498)}
> +			},
> +			{
> +				{ AOM_CDF4(17394, 24501, 27895)}, { AOM_CDF4(15889, 23420, 27185)},
> +				{ AOM_CDF4(11561, 19133, 23870)}, { AOM_CDF4(8285, 14812, 19844)},
> +				{ AOM_CDF4(6496, 12043, 16550)}, { AOM_CDF4(4771, 9574, 13677)},
> +				{ AOM_CDF4(3603, 6830, 10144)}, { AOM_CDF4(21656, 27704, 30200)},
> +				{ AOM_CDF4(21324, 27915, 30511)}, { AOM_CDF4(17327, 25336, 28997)},
> +				{ AOM_CDF4(13417, 21381, 26033)}, { AOM_CDF4(10132, 17425, 22338)},
> +				{ AOM_CDF4(8580, 15016, 19633)}, { AOM_CDF4(5694, 11477, 16411)},
> +				{ AOM_CDF4(24116, 29780, 31450)}, { AOM_CDF4(23853, 29695, 31591)},
> +				{ AOM_CDF4(20085, 27614, 30428)}, { AOM_CDF4(15326, 24335, 28575)},
> +				{ AOM_CDF4(11814, 19472, 24810)}, { AOM_CDF4(10221, 18611, 24767)},
> +				{ AOM_CDF4(7689, 14558, 20321)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(16214, 22380, 25770)}, { AOM_CDF4(14213, 21304, 25295)},
> +				{ AOM_CDF4(9213, 15823, 20455)}, { AOM_CDF4(6395, 11758, 16139)},
> +				{ AOM_CDF4(4779, 9187, 13066)}, { AOM_CDF4(3821, 7501, 10953)},
> +				{ AOM_CDF4(2293, 4567, 6795)}, { AOM_CDF4(15859, 21283, 23820)},
> +				{ AOM_CDF4(18404, 25602, 28726)}, { AOM_CDF4(14325, 21980, 26206)},
> +				{ AOM_CDF4(10669, 17937, 22720)}, { AOM_CDF4(8297, 14642, 19447)},
> +				{ AOM_CDF4(6746, 12389, 16893)}, { AOM_CDF4(4324, 8251, 11770)},
> +				{ AOM_CDF4(16532, 21631, 24475)}, { AOM_CDF4(20667, 27150, 29668)},
> +				{ AOM_CDF4(16728, 24510, 28175)}, { AOM_CDF4(12861, 20645, 25332)},
> +				{ AOM_CDF4(10076, 17361, 22417)}, { AOM_CDF4(8395, 14940, 19963)},
> +				{ AOM_CDF4(5731, 10683, 14912)}
> +			},
> +			{
> +				{ AOM_CDF4(14433, 21155, 24938)}, { AOM_CDF4(14658, 21716, 25545)},
> +				{ AOM_CDF4(9923, 16824, 21557)}, { AOM_CDF4(6982, 13052, 17721)},
> +				{ AOM_CDF4(5419, 10503, 15050)}, { AOM_CDF4(4852, 9162, 13014)},
> +				{ AOM_CDF4(3271, 6395, 9630)}, { AOM_CDF4(22210, 27833, 30109)},
> +				{ AOM_CDF4(20750, 27368, 29821)}, { AOM_CDF4(16894, 24828, 28573)},
> +				{ AOM_CDF4(13247, 21276, 25757)}, { AOM_CDF4(10038, 17265, 22563)},
> +				{ AOM_CDF4(8587, 14947, 20327)}, { AOM_CDF4(5645, 11371, 15252)},
> +				{ AOM_CDF4(22027, 27526, 29714)}, { AOM_CDF4(23098, 29146, 31221)},
> +				{ AOM_CDF4(19886, 27341, 30272)}, { AOM_CDF4(15609, 23747, 28046)},
> +				{ AOM_CDF4(11993, 20065, 24939)}, { AOM_CDF4(9637, 18267, 23671)},
> +				{ AOM_CDF4(7625, 13801, 19144)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(14438, 20798, 24089)}, { AOM_CDF4(12621, 19203, 23097)},
> +				{ AOM_CDF4(8177, 14125, 18402)}, { AOM_CDF4(5674, 10501, 14456)},
> +				{ AOM_CDF4(4236, 8239, 11733)}, { AOM_CDF4(3447, 6750, 9806)},
> +				{ AOM_CDF4(1986, 3950, 5864)}, { AOM_CDF4(16208, 22099, 24930)},
> +				{ AOM_CDF4(16537, 24025, 27585)}, { AOM_CDF4(12780, 20381, 24867)},
> +				{ AOM_CDF4(9767, 16612, 21416)}, { AOM_CDF4(7686, 13738, 18398)},
> +				{ AOM_CDF4(6333, 11614, 15964)}, { AOM_CDF4(3941, 7571, 10836)},
> +				{ AOM_CDF4(22819, 27422, 29202)}, { AOM_CDF4(22224, 28514, 30721)},
> +				{ AOM_CDF4(17660, 25433, 28913)}, { AOM_CDF4(13574, 21482, 26002)},
> +				{ AOM_CDF4(10629, 17977, 22938)}, { AOM_CDF4(8612, 15298, 20265)},
> +				{ AOM_CDF4(5607, 10491, 14596)}
> +			},
> +			{
> +				{ AOM_CDF4(13569, 19800, 23206)}, { AOM_CDF4(13128, 19924, 23869)},
> +				{ AOM_CDF4(8329, 14841, 19403)}, { AOM_CDF4(6130, 10976, 15057)},
> +				{ AOM_CDF4(4682, 8839, 12518)}, { AOM_CDF4(3656, 7409, 10588)},
> +				{ AOM_CDF4(2577, 5099, 7412)}, { AOM_CDF4(22427, 28684, 30585)},
> +				{ AOM_CDF4(20913, 27750, 30139)}, { AOM_CDF4(15840, 24109, 27834)},
> +				{ AOM_CDF4(12308, 20029, 24569)}, { AOM_CDF4(10216, 16785, 21458)},
> +				{ AOM_CDF4(8309, 14203, 19113)}, { AOM_CDF4(6043, 11168, 15307)},
> +				{ AOM_CDF4(23166, 28901, 30998)}, { AOM_CDF4(21899, 28405, 30751)},
> +				{ AOM_CDF4(18413, 26091, 29443)}, { AOM_CDF4(15233, 23114, 27352)},
> +				{ AOM_CDF4(12683, 20472, 25288)}, { AOM_CDF4(10702, 18259, 23409)},
> +				{ AOM_CDF4(8125, 14464, 19226)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(9040, 14786, 18360)}, { AOM_CDF4(9979, 15718, 19415)},
> +				{ AOM_CDF4(7913, 13918, 18311)}, { AOM_CDF4(5859, 10889, 15184)},
> +				{ AOM_CDF4(4593, 8677, 12510)}, { AOM_CDF4(3820, 7396, 10791)},
> +				{ AOM_CDF4(1730, 3471, 5192)}, { AOM_CDF4(11803, 18365, 22709)},
> +				{ AOM_CDF4(11419, 18058, 22225)}, { AOM_CDF4(9418, 15774, 20243)},
> +				{ AOM_CDF4(7539, 13325, 17657)}, { AOM_CDF4(6233, 11317, 15384)},
> +				{ AOM_CDF4(5137, 9656, 13545)}, { AOM_CDF4(2977, 5774, 8349)},
> +				{ AOM_CDF4(21207, 27246, 29640)}, { AOM_CDF4(19547, 26578, 29497)},
> +				{ AOM_CDF4(16169, 23871, 27690)}, { AOM_CDF4(12820, 20458, 25018)},
> +				{ AOM_CDF4(10224, 17332, 22214)}, { AOM_CDF4(8526, 15048, 19884)},
> +				{ AOM_CDF4(5037, 9410, 13118)}
> +			},
> +			{
> +				{ AOM_CDF4(12339, 17329, 20140)}, { AOM_CDF4(13505, 19895, 23225)},
> +				{ AOM_CDF4(9847, 16944, 21564)}, { AOM_CDF4(7280, 13256, 18348)},
> +				{ AOM_CDF4(4712, 10009, 14454)}, { AOM_CDF4(4361, 7914, 12477)},
> +				{ AOM_CDF4(2870, 5628, 7995)}, { AOM_CDF4(20061, 25504, 28526)},
> +				{ AOM_CDF4(15235, 22878, 26145)}, { AOM_CDF4(12985, 19958, 24155)},
> +				{ AOM_CDF4(9782, 16641, 21403)}, { AOM_CDF4(9456, 16360, 20760)},
> +				{ AOM_CDF4(6855, 12940, 18557)}, { AOM_CDF4(5661, 10564, 15002)},
> +				{ AOM_CDF4(25656, 30602, 31894)}, { AOM_CDF4(22570, 29107, 31092)},
> +				{ AOM_CDF4(18917, 26423, 29541)}, { AOM_CDF4(15940, 23649, 27754)},
> +				{ AOM_CDF4(12803, 20581, 25219)}, { AOM_CDF4(11082, 18695, 23376)},
> +				{ AOM_CDF4(7939, 14373, 19005)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(18315, 24289, 27551)}, { AOM_CDF4(16854, 24068, 27835)},
> +				{ AOM_CDF4(10140, 17927, 23173)}, { AOM_CDF4(6722, 12982, 18267)},
> +				{ AOM_CDF4(4661, 9826, 14706)}, { AOM_CDF4(3832, 8165, 12294)},
> +				{ AOM_CDF4(2795, 6098, 9245)}, { AOM_CDF4(17145, 23326, 26672)},
> +				{ AOM_CDF4(20733, 27680, 30308)}, { AOM_CDF4(16032, 24461, 28546)},
> +				{ AOM_CDF4(11653, 20093, 25081)}, { AOM_CDF4(9290, 16429, 22086)},
> +				{ AOM_CDF4(7796, 14598, 19982)}, { AOM_CDF4(6502, 12378, 17441)},
> +				{ AOM_CDF4(21681, 27732, 30320)}, { AOM_CDF4(22389, 29044, 31261)},
> +				{ AOM_CDF4(19027, 26731, 30087)}, { AOM_CDF4(14739, 23755, 28624)},
> +				{ AOM_CDF4(11358, 20778, 25511)}, { AOM_CDF4(10995, 18073, 24190)},
> +				{ AOM_CDF4(9162, 14990, 20617)}
> +			},
> +			{
> +				{ AOM_CDF4(21425, 27952, 30388)}, { AOM_CDF4(18062, 25838, 29034)},
> +				{ AOM_CDF4(11956, 19881, 24808)}, { AOM_CDF4(7718, 15000, 20980)},
> +				{ AOM_CDF4(5702, 11254, 16143)}, { AOM_CDF4(4898, 9088, 16864)},
> +				{ AOM_CDF4(3679, 6776, 11907)}, { AOM_CDF4(23294, 30160, 31663)},
> +				{ AOM_CDF4(24397, 29896, 31836)}, { AOM_CDF4(19245, 27128, 30593)},
> +				{ AOM_CDF4(13202, 19825, 26404)}, { AOM_CDF4(11578, 19297, 23957)},
> +				{ AOM_CDF4(8073, 13297, 21370)}, { AOM_CDF4(5461, 10923, 19745)},
> +				{ AOM_CDF4(27367, 30521, 31934)}, { AOM_CDF4(24904, 30671, 31940)},
> +				{ AOM_CDF4(23075, 28460, 31299)}, { AOM_CDF4(14400, 23658, 30417)},
> +				{ AOM_CDF4(13885, 23882, 28325)}, { AOM_CDF4(14746, 22938, 27853)},
> +				{ AOM_CDF4(5461, 16384, 27307)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(18274, 24813, 27890)}, { AOM_CDF4(15537, 23149, 27003)},
> +				{ AOM_CDF4(9449, 16740, 21827)}, { AOM_CDF4(6700, 12498, 17261)},
> +				{ AOM_CDF4(4988, 9866, 14198)}, { AOM_CDF4(4236, 8147, 11902)},
> +				{ AOM_CDF4(2867, 5860, 8654)}, { AOM_CDF4(17124, 23171, 26101)},
> +				{ AOM_CDF4(20396, 27477, 30148)}, { AOM_CDF4(16573, 24629, 28492)},
> +				{ AOM_CDF4(12749, 20846, 25674)}, { AOM_CDF4(10233, 17878, 22818)},
> +				{ AOM_CDF4(8525, 15332, 20363)}, { AOM_CDF4(6283, 11632, 16255)},
> +				{ AOM_CDF4(20466, 26511, 29286)}, { AOM_CDF4(23059, 29174, 31191)},
> +				{ AOM_CDF4(19481, 27263, 30241)}, { AOM_CDF4(15458, 23631, 28137)},
> +				{ AOM_CDF4(12416, 20608, 25693)}, { AOM_CDF4(10261, 18011, 23261)},
> +				{ AOM_CDF4(8016, 14655, 19666)}
> +			},
> +			{
> +				{ AOM_CDF4(17616, 24586, 28112)}, { AOM_CDF4(15809, 23299, 27155)},
> +				{ AOM_CDF4(10767, 18890, 23793)}, { AOM_CDF4(7727, 14255, 18865)},
> +				{ AOM_CDF4(6129, 11926, 16882)}, { AOM_CDF4(4482, 9704, 14861)},
> +				{ AOM_CDF4(3277, 7452, 11522)}, { AOM_CDF4(22956, 28551, 30730)},
> +				{ AOM_CDF4(22724, 28937, 30961)}, { AOM_CDF4(18467, 26324, 29580)},
> +				{ AOM_CDF4(13234, 20713, 25649)}, { AOM_CDF4(11181, 17592, 22481)},
> +				{ AOM_CDF4(8291, 18358, 24576)}, { AOM_CDF4(7568, 11881, 14984)},
> +				{ AOM_CDF4(24948, 29001, 31147)}, { AOM_CDF4(25674, 30619, 32151)},
> +				{ AOM_CDF4(20841, 26793, 29603)}, { AOM_CDF4(14669, 24356, 28666)},
> +				{ AOM_CDF4(11334, 23593, 28219)}, { AOM_CDF4(8922, 14762, 22873)},
> +				{ AOM_CDF4(8301, 13544, 20535)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(17113, 23733, 27081)}, { AOM_CDF4(14139, 21406, 25452)},
> +				{ AOM_CDF4(8552, 15002, 19776)}, { AOM_CDF4(5871, 11120, 15378)},
> +				{ AOM_CDF4(4455, 8616, 12253)}, { AOM_CDF4(3469, 6910, 10386)},
> +				{ AOM_CDF4(2255, 4553, 6782)}, { AOM_CDF4(18224, 24376, 27053)},
> +				{ AOM_CDF4(19290, 26710, 29614)}, { AOM_CDF4(14936, 22991, 27184)},
> +				{ AOM_CDF4(11238, 18951, 23762)}, { AOM_CDF4(8786, 15617, 20588)},
> +				{ AOM_CDF4(7317, 13228, 18003)}, { AOM_CDF4(5101, 9512, 13493)},
> +				{ AOM_CDF4(22639, 28222, 30210)}, { AOM_CDF4(23216, 29331, 31307)},
> +				{ AOM_CDF4(19075, 26762, 29895)}, { AOM_CDF4(15014, 23113, 27457)},
> +				{ AOM_CDF4(11938, 19857, 24752)}, { AOM_CDF4(9942, 17280, 22282)},
> +				{ AOM_CDF4(7167, 13144, 17752)}
> +			},
> +			{
> +				{ AOM_CDF4(15820, 22738, 26488)}, { AOM_CDF4(13530, 20885, 25216)},
> +				{ AOM_CDF4(8395, 15530, 20452)}, { AOM_CDF4(6574, 12321, 16380)},
> +				{ AOM_CDF4(5353, 10419, 14568)}, { AOM_CDF4(4613, 8446, 12381)},
> +				{ AOM_CDF4(3440, 7158, 9903)}, { AOM_CDF4(24247, 29051, 31224)},
> +				{ AOM_CDF4(22118, 28058, 30369)}, { AOM_CDF4(16498, 24768, 28389)},
> +				{ AOM_CDF4(12920, 21175, 26137)}, { AOM_CDF4(10730, 18619, 25352)},
> +				{ AOM_CDF4(10187, 16279, 22791)}, { AOM_CDF4(9310, 14631, 22127)},
> +				{ AOM_CDF4(24970, 30558, 32057)}, { AOM_CDF4(24801, 29942, 31698)},
> +				{ AOM_CDF4(22432, 28453, 30855)}, { AOM_CDF4(19054, 25680, 29580)},
> +				{ AOM_CDF4(14392, 23036, 28109)}, { AOM_CDF4(12495, 20947, 26650)},
> +				{ AOM_CDF4(12442, 20326, 26214)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(12162, 18785, 22648)}, { AOM_CDF4(12749, 19697, 23806)},
> +				{ AOM_CDF4(8580, 15297, 20346)}, { AOM_CDF4(6169, 11749, 16543)},
> +				{ AOM_CDF4(4836, 9391, 13448)}, { AOM_CDF4(3821, 7711, 11613)},
> +				{ AOM_CDF4(2228, 4601, 7070)}, { AOM_CDF4(16319, 24725, 28280)},
> +				{ AOM_CDF4(15698, 23277, 27168)}, { AOM_CDF4(12726, 20368, 25047)},
> +				{ AOM_CDF4(9912, 17015, 21976)}, { AOM_CDF4(7888, 14220, 19179)},
> +				{ AOM_CDF4(6777, 12284, 17018)}, { AOM_CDF4(4492, 8590, 12252)},
> +				{ AOM_CDF4(23249, 28904, 30947)}, { AOM_CDF4(21050, 27908, 30512)},
> +				{ AOM_CDF4(17440, 25340, 28949)}, { AOM_CDF4(14059, 22018, 26541)},
> +				{ AOM_CDF4(11288, 18903, 23898)}, { AOM_CDF4(9411, 16342, 21428)},
> +				{ AOM_CDF4(6278, 11588, 15944)}
> +			},
> +			{
> +				{ AOM_CDF4(13981, 20067, 23226)}, { AOM_CDF4(16922, 23580, 26783)},
> +				{ AOM_CDF4(11005, 19039, 24487)}, { AOM_CDF4(7389, 14218, 19798)},
> +				{ AOM_CDF4(5598, 11505, 17206)}, { AOM_CDF4(6090, 11213, 15659)},
> +				{ AOM_CDF4(3820, 7371, 10119)}, { AOM_CDF4(21082, 26925, 29675)},
> +				{ AOM_CDF4(21262, 28627, 31128)}, { AOM_CDF4(18392, 26454, 30437)},
> +				{ AOM_CDF4(14870, 22910, 27096)}, { AOM_CDF4(12620, 19484, 24908)},
> +				{ AOM_CDF4(9290, 16553, 22802)}, { AOM_CDF4(6668, 14288, 20004)},
> +				{ AOM_CDF4(27704, 31055, 31949)}, { AOM_CDF4(24709, 29978, 31788)},
> +				{ AOM_CDF4(21668, 29264, 31657)}, { AOM_CDF4(18295, 26968, 30074)},
> +				{ AOM_CDF4(16399, 24422, 29313)}, { AOM_CDF4(14347, 23026, 28104)},
> +				{ AOM_CDF4(12370, 19806, 24477)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_coeff_base_multi_cdfs
> +	[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
> +	[SIG_COEF_CONTEXTS][CDF_SIZE(NUM_BASE_LEVELS + 2) + 1] = {
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(4034, 8930, 12727)}, { AOM_CDF4(18082, 29741, 31877)},
> +				{ AOM_CDF4(12596, 26124, 30493)}, { AOM_CDF4(9446, 21118, 27005)},
> +				{ AOM_CDF4(6308, 15141, 21279)}, { AOM_CDF4(2463, 6357, 9783)},
> +				{ AOM_CDF4(20667, 30546, 31929)}, { AOM_CDF4(13043, 26123, 30134)},
> +				{ AOM_CDF4(8151, 18757, 24778)}, { AOM_CDF4(5255, 12839, 18632)},
> +				{ AOM_CDF4(2820, 7206, 11161)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(15736, 27553, 30604)},
> +				{ AOM_CDF4(11210, 23794, 28787)}, { AOM_CDF4(5947, 13874, 19701)},
> +				{ AOM_CDF4(4215, 9323, 13891)}, { AOM_CDF4(2833, 6462, 10059)},
> +				{ AOM_CDF4(19605, 30393, 31582)}, { AOM_CDF4(13523, 26252, 30248)},
> +				{ AOM_CDF4(8446, 18622, 24512)}, { AOM_CDF4(3818, 10343, 15974)},
> +				{ AOM_CDF4(1481, 4117, 6796)}, { AOM_CDF4(22649, 31302, 32190)},
> +				{ AOM_CDF4(14829, 27127, 30449)}, { AOM_CDF4(8313, 17702, 23304)},
> +				{ AOM_CDF4(3022, 8301, 12786)}, { AOM_CDF4(1536, 4412, 7184)},
> +				{ AOM_CDF4(22354, 29774, 31372)}, { AOM_CDF4(14723, 25472, 29214)},
> +				{ AOM_CDF4(6673, 13745, 18662)}, { AOM_CDF4(2068, 5766, 9322)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(6302, 16444, 21761)}, { AOM_CDF4(23040, 31538, 32475)},
> +				{ AOM_CDF4(15196, 28452, 31496)}, { AOM_CDF4(10020, 22946, 28514)},
> +				{ AOM_CDF4(6533, 16862, 23501)}, { AOM_CDF4(3538, 9816, 15076)},
> +				{ AOM_CDF4(24444, 31875, 32525)}, { AOM_CDF4(15881, 28924, 31635)},
> +				{ AOM_CDF4(9922, 22873, 28466)}, { AOM_CDF4(6527, 16966, 23691)},
> +				{ AOM_CDF4(4114, 11303, 17220)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(20201, 30770, 32209)},
> +				{ AOM_CDF4(14754, 28071, 31258)}, { AOM_CDF4(8378, 20186, 26517)},
> +				{ AOM_CDF4(5916, 15299, 21978)}, { AOM_CDF4(4268, 11583, 17901)},
> +				{ AOM_CDF4(24361, 32025, 32581)}, { AOM_CDF4(18673, 30105, 31943)},
> +				{ AOM_CDF4(10196, 22244, 27576)}, { AOM_CDF4(5495, 14349, 20417)},
> +				{ AOM_CDF4(2676, 7415, 11498)}, { AOM_CDF4(24678, 31958, 32585)},
> +				{ AOM_CDF4(18629, 29906, 31831)}, { AOM_CDF4(9364, 20724, 26315)},
> +				{ AOM_CDF4(4641, 12318, 18094)}, { AOM_CDF4(2758, 7387, 11579)},
> +				{ AOM_CDF4(25433, 31842, 32469)}, { AOM_CDF4(18795, 29289, 31411)},
> +				{ AOM_CDF4(7644, 17584, 23592)}, { AOM_CDF4(3408, 9014, 15047)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(4536, 10072, 14001)}, { AOM_CDF4(25459, 31416, 32206)},
> +				{ AOM_CDF4(16605, 28048, 30818)}, { AOM_CDF4(11008, 22857, 27719)},
> +				{ AOM_CDF4(6915, 16268, 22315)}, { AOM_CDF4(2625, 6812, 10537)},
> +				{ AOM_CDF4(24257, 31788, 32499)}, { AOM_CDF4(16880, 29454, 31879)},
> +				{ AOM_CDF4(11958, 25054, 29778)}, { AOM_CDF4(7916, 18718, 25084)},
> +				{ AOM_CDF4(3383, 8777, 13446)}, { AOM_CDF4(22720, 31603, 32393)},
> +				{ AOM_CDF4(14960, 28125, 31335)}, { AOM_CDF4(9731, 22210, 27928)},
> +				{ AOM_CDF4(6304, 15832, 22277)}, { AOM_CDF4(2910, 7818, 12166)},
> +				{ AOM_CDF4(20375, 30627, 32131)}, { AOM_CDF4(13904, 27284, 30887)},
> +				{ AOM_CDF4(9368, 21558, 27144)}, { AOM_CDF4(5937, 14966, 21119)},
> +				{ AOM_CDF4(2667, 7225, 11319)}, { AOM_CDF4(23970, 31470, 32378)},
> +				{ AOM_CDF4(17173, 29734, 32018)}, { AOM_CDF4(12795, 25441, 29965)},
> +				{ AOM_CDF4(8981, 19680, 25893)}, { AOM_CDF4(4728, 11372, 16902)},
> +				{ AOM_CDF4(24287, 31797, 32439)}, { AOM_CDF4(16703, 29145, 31696)},
> +				{ AOM_CDF4(10833, 23554, 28725)}, { AOM_CDF4(6468, 16566, 23057)},
> +				{ AOM_CDF4(2415, 6562, 10278)}, { AOM_CDF4(26610, 32395, 32659)},
> +				{ AOM_CDF4(18590, 30498, 32117)}, { AOM_CDF4(12420, 25756, 29950)},
> +				{ AOM_CDF4(7639, 18746, 24710)}, { AOM_CDF4(3001, 8086, 12347)},
> +				{ AOM_CDF4(25076, 32064, 32580)}, { AOM_CDF4(17946, 30128, 32028)},
> +				{ AOM_CDF4(12024, 24985, 29378)}, { AOM_CDF4(7517, 18390, 24304)},
> +				{ AOM_CDF4(3243, 8781, 13331)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(6037, 16771, 21957)}, { AOM_CDF4(24774, 31704, 32426)},
> +				{ AOM_CDF4(16830, 28589, 31056)}, { AOM_CDF4(10602, 22828, 27760)},
> +				{ AOM_CDF4(6733, 16829, 23071)}, { AOM_CDF4(3250, 8914, 13556)},
> +				{ AOM_CDF4(25582, 32220, 32668)}, { AOM_CDF4(18659, 30342, 32223)},
> +				{ AOM_CDF4(12546, 26149, 30515)}, { AOM_CDF4(8420, 20451, 26801)},
> +				{ AOM_CDF4(4636, 12420, 18344)}, { AOM_CDF4(27581, 32362, 32639)},
> +				{ AOM_CDF4(18987, 30083, 31978)}, { AOM_CDF4(11327, 24248, 29084)},
> +				{ AOM_CDF4(7264, 17719, 24120)}, { AOM_CDF4(3995, 10768, 16169)},
> +				{ AOM_CDF4(25893, 31831, 32487)}, { AOM_CDF4(16577, 28587, 31379)},
> +				{ AOM_CDF4(10189, 22748, 28182)}, { AOM_CDF4(6832, 17094, 23556)},
> +				{ AOM_CDF4(3708, 10110, 15334)}, { AOM_CDF4(25904, 32282, 32656)},
> +				{ AOM_CDF4(19721, 30792, 32276)}, { AOM_CDF4(12819, 26243, 30411)},
> +				{ AOM_CDF4(8572, 20614, 26891)}, { AOM_CDF4(5364, 14059, 20467)},
> +				{ AOM_CDF4(26580, 32438, 32677)}, { AOM_CDF4(20852, 31225, 32340)},
> +				{ AOM_CDF4(12435, 25700, 29967)}, { AOM_CDF4(8691, 20825, 26976)},
> +				{ AOM_CDF4(4446, 12209, 17269)}, { AOM_CDF4(27350, 32429, 32696)},
> +				{ AOM_CDF4(21372, 30977, 32272)}, { AOM_CDF4(12673, 25270, 29853)},
> +				{ AOM_CDF4(9208, 20925, 26640)}, { AOM_CDF4(5018, 13351, 18732)},
> +				{ AOM_CDF4(27351, 32479, 32713)}, { AOM_CDF4(21398, 31209, 32387)},
> +				{ AOM_CDF4(12162, 25047, 29842)}, { AOM_CDF4(7896, 18691, 25319)},
> +				{ AOM_CDF4(4670, 12882, 18881)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(5487, 10460, 13708)}, { AOM_CDF4(21597, 28303, 30674)},
> +				{ AOM_CDF4(11037, 21953, 26476)}, { AOM_CDF4(8147, 17962, 22952)},
> +				{ AOM_CDF4(5242, 13061, 18532)}, { AOM_CDF4(1889, 5208, 8182)},
> +				{ AOM_CDF4(26774, 32133, 32590)}, { AOM_CDF4(17844, 29564, 31767)},
> +				{ AOM_CDF4(11690, 24438, 29171)}, { AOM_CDF4(7542, 18215, 24459)},
> +				{ AOM_CDF4(2993, 8050, 12319)}, { AOM_CDF4(28023, 32328, 32591)},
> +				{ AOM_CDF4(18651, 30126, 31954)}, { AOM_CDF4(12164, 25146, 29589)},
> +				{ AOM_CDF4(7762, 18530, 24771)}, { AOM_CDF4(3492, 9183, 13920)},
> +				{ AOM_CDF4(27591, 32008, 32491)}, { AOM_CDF4(17149, 28853, 31510)},
> +				{ AOM_CDF4(11485, 24003, 28860)}, { AOM_CDF4(7697, 18086, 24210)},
> +				{ AOM_CDF4(3075, 7999, 12218)}, { AOM_CDF4(28268, 32482, 32654)},
> +				{ AOM_CDF4(19631, 31051, 32404)}, { AOM_CDF4(13860, 27260, 31020)},
> +				{ AOM_CDF4(9605, 21613, 27594)}, { AOM_CDF4(4876, 12162, 17908)},
> +				{ AOM_CDF4(27248, 32316, 32576)}, { AOM_CDF4(18955, 30457, 32075)},
> +				{ AOM_CDF4(11824, 23997, 28795)}, { AOM_CDF4(7346, 18196, 24647)},
> +				{ AOM_CDF4(3403, 9247, 14111)}, { AOM_CDF4(29711, 32655, 32735)},
> +				{ AOM_CDF4(21169, 31394, 32417)}, { AOM_CDF4(13487, 27198, 30957)},
> +				{ AOM_CDF4(8828, 21683, 27614)}, { AOM_CDF4(4270, 11451, 17038)},
> +				{ AOM_CDF4(28708, 32578, 32731)}, { AOM_CDF4(20120, 31241, 32482)},
> +				{ AOM_CDF4(13692, 27550, 31321)}, { AOM_CDF4(9418, 22514, 28439)},
> +				{ AOM_CDF4(4999, 13283, 19462)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(5673, 14302, 19711)}, { AOM_CDF4(26251, 30701, 31834)},
> +				{ AOM_CDF4(12782, 23783, 27803)}, { AOM_CDF4(9127, 20657, 25808)},
> +				{ AOM_CDF4(6368, 16208, 21462)}, { AOM_CDF4(2465, 7177, 10822)},
> +				{ AOM_CDF4(29961, 32563, 32719)}, { AOM_CDF4(18318, 29891, 31949)},
> +				{ AOM_CDF4(11361, 24514, 29357)}, { AOM_CDF4(7900, 19603, 25607)},
> +				{ AOM_CDF4(4002, 10590, 15546)}, { AOM_CDF4(29637, 32310, 32595)},
> +				{ AOM_CDF4(18296, 29913, 31809)}, { AOM_CDF4(10144, 21515, 26871)},
> +				{ AOM_CDF4(5358, 14322, 20394)}, { AOM_CDF4(3067, 8362, 13346)},
> +				{ AOM_CDF4(28652, 32470, 32676)}, { AOM_CDF4(17538, 30771, 32209)},
> +				{ AOM_CDF4(13924, 26882, 30494)}, { AOM_CDF4(10496, 22837, 27869)},
> +				{ AOM_CDF4(7236, 16396, 21621)}, { AOM_CDF4(30743, 32687, 32746)},
> +				{ AOM_CDF4(23006, 31676, 32489)}, { AOM_CDF4(14494, 27828, 31120)},
> +				{ AOM_CDF4(10174, 22801, 28352)}, { AOM_CDF4(6242, 15281, 21043)},
> +				{ AOM_CDF4(25817, 32243, 32720)}, { AOM_CDF4(18618, 31367, 32325)},
> +				{ AOM_CDF4(13997, 28318, 31878)}, { AOM_CDF4(12255, 26534, 31383)},
> +				{ AOM_CDF4(9561, 21588, 28450)}, { AOM_CDF4(28188, 32635, 32724)},
> +				{ AOM_CDF4(22060, 32365, 32728)}, { AOM_CDF4(18102, 30690, 32528)},
> +				{ AOM_CDF4(14196, 28864, 31999)}, { AOM_CDF4(12262, 25792, 30865)},
> +				{ AOM_CDF4(24176, 32109, 32628)}, { AOM_CDF4(18280, 29681, 31963)},
> +				{ AOM_CDF4(10205, 23703, 29664)}, { AOM_CDF4(7889, 20025, 27676)},
> +				{ AOM_CDF4(6060, 16743, 23970)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(5141, 7096, 8260)}, { AOM_CDF4(27186, 29022, 29789)},
> +				{ AOM_CDF4(6668, 12568, 15682)}, { AOM_CDF4(2172, 6181, 8638)},
> +				{ AOM_CDF4(1126, 3379, 4531)}, { AOM_CDF4(443, 1361, 2254)},
> +				{ AOM_CDF4(26083, 31153, 32436)}, { AOM_CDF4(13486, 24603, 28483)},
> +				{ AOM_CDF4(6508, 14840, 19910)}, { AOM_CDF4(3386, 8800, 13286)},
> +				{ AOM_CDF4(1530, 4322, 7054)}, { AOM_CDF4(29639, 32080, 32548)},
> +				{ AOM_CDF4(15897, 27552, 30290)}, { AOM_CDF4(8588, 20047, 25383)},
> +				{ AOM_CDF4(4889, 13339, 19269)}, { AOM_CDF4(2240, 6871, 10498)},
> +				{ AOM_CDF4(28165, 32197, 32517)}, { AOM_CDF4(20735, 30427, 31568)},
> +				{ AOM_CDF4(14325, 24671, 27692)}, { AOM_CDF4(5119, 12554, 17805)},
> +				{ AOM_CDF4(1810, 5441, 8261)}, { AOM_CDF4(31212, 32724, 32748)},
> +				{ AOM_CDF4(23352, 31766, 32545)}, { AOM_CDF4(14669, 27570, 31059)},
> +				{ AOM_CDF4(8492, 20894, 27272)}, { AOM_CDF4(3644, 10194, 15204)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(2461, 7013, 9371)}, { AOM_CDF4(24749, 29600, 30986)},
> +				{ AOM_CDF4(9466, 19037, 22417)}, { AOM_CDF4(3584, 9280, 14400)},
> +				{ AOM_CDF4(1505, 3929, 5433)}, { AOM_CDF4(677, 1500, 2736)},
> +				{ AOM_CDF4(23987, 30702, 32117)}, { AOM_CDF4(13554, 24571, 29263)},
> +				{ AOM_CDF4(6211, 14556, 21155)}, { AOM_CDF4(3135, 10972, 15625)},
> +				{ AOM_CDF4(2435, 7127, 11427)}, { AOM_CDF4(31300, 32532, 32550)},
> +				{ AOM_CDF4(14757, 30365, 31954)}, { AOM_CDF4(4405, 11612, 18553)},
> +				{ AOM_CDF4(580, 4132, 7322)}, { AOM_CDF4(1695, 10169, 14124)},
> +				{ AOM_CDF4(30008, 32282, 32591)}, { AOM_CDF4(19244, 30108, 31748)},
> +				{ AOM_CDF4(11180, 24158, 29555)}, { AOM_CDF4(5650, 14972, 19209)},
> +				{ AOM_CDF4(2114, 5109, 8456)}, { AOM_CDF4(31856, 32716, 32748)},
> +				{ AOM_CDF4(23012, 31664, 32572)}, { AOM_CDF4(13694, 26656, 30636)},
> +				{ AOM_CDF4(8142, 19508, 26093)}, { AOM_CDF4(4253, 10955, 16724)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(601, 983, 1311)}, { AOM_CDF4(18725, 23406, 28087)},
> +				{ AOM_CDF4(5461, 8192, 10923)}, { AOM_CDF4(3781, 15124, 21425)},
> +				{ AOM_CDF4(2587, 7761, 12072)}, { AOM_CDF4(106, 458, 810)},
> +				{ AOM_CDF4(22282, 29710, 31894)}, { AOM_CDF4(8508, 20926, 25984)},
> +				{ AOM_CDF4(3726, 12713, 18083)}, { AOM_CDF4(1620, 7112, 10893)},
> +				{ AOM_CDF4(729, 2236, 3495)}, { AOM_CDF4(30163, 32474, 32684)},
> +				{ AOM_CDF4(18304, 30464, 32000)}, { AOM_CDF4(11443, 26526, 29647)},
> +				{ AOM_CDF4(6007, 15292, 21299)}, { AOM_CDF4(2234, 6703, 8937)},
> +				{ AOM_CDF4(30954, 32177, 32571)}, { AOM_CDF4(17363, 29562, 31076)},
> +				{ AOM_CDF4(9686, 22464, 27410)}, { AOM_CDF4(8192, 16384, 21390)},
> +				{ AOM_CDF4(1755, 8046, 11264)}, { AOM_CDF4(31168, 32734, 32748)},
> +				{ AOM_CDF4(22486, 31441, 32471)}, { AOM_CDF4(12833, 25627, 29738)},
> +				{ AOM_CDF4(6980, 17379, 23122)}, { AOM_CDF4(3111, 8887, 13479)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(6041, 11854, 15927)}, { AOM_CDF4(20326, 30905, 32251)},
> +				{ AOM_CDF4(14164, 26831, 30725)}, { AOM_CDF4(9760, 20647, 26585)},
> +				{ AOM_CDF4(6416, 14953, 21219)}, { AOM_CDF4(2966, 7151, 10891)},
> +				{ AOM_CDF4(23567, 31374, 32254)}, { AOM_CDF4(14978, 27416, 30946)},
> +				{ AOM_CDF4(9434, 20225, 26254)}, { AOM_CDF4(6658, 14558, 20535)},
> +				{ AOM_CDF4(3916, 8677, 12989)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(18088, 29545, 31587)},
> +				{ AOM_CDF4(13062, 25843, 30073)}, { AOM_CDF4(8940, 16827, 22251)},
> +				{ AOM_CDF4(7654, 13220, 17973)}, { AOM_CDF4(5733, 10316, 14456)},
> +				{ AOM_CDF4(22879, 31388, 32114)}, { AOM_CDF4(15215, 27993, 30955)},
> +				{ AOM_CDF4(9397, 19445, 24978)}, { AOM_CDF4(3442, 9813, 15344)},
> +				{ AOM_CDF4(1368, 3936, 6532)}, { AOM_CDF4(25494, 32033, 32406)},
> +				{ AOM_CDF4(16772, 27963, 30718)}, { AOM_CDF4(9419, 18165, 23260)},
> +				{ AOM_CDF4(2677, 7501, 11797)}, { AOM_CDF4(1516, 4344, 7170)},
> +				{ AOM_CDF4(26556, 31454, 32101)}, { AOM_CDF4(17128, 27035, 30108)},
> +				{ AOM_CDF4(8324, 15344, 20249)}, { AOM_CDF4(1903, 5696, 9469)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8455, 19003, 24368)}, { AOM_CDF4(23563, 32021, 32604)},
> +				{ AOM_CDF4(16237, 29446, 31935)}, { AOM_CDF4(10724, 23999, 29358)},
> +				{ AOM_CDF4(6725, 17528, 24416)}, { AOM_CDF4(3927, 10927, 16825)},
> +				{ AOM_CDF4(26313, 32288, 32634)}, { AOM_CDF4(17430, 30095, 32095)},
> +				{ AOM_CDF4(11116, 24606, 29679)}, { AOM_CDF4(7195, 18384, 25269)},
> +				{ AOM_CDF4(4726, 12852, 19315)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(22822, 31648, 32483)},
> +				{ AOM_CDF4(16724, 29633, 31929)}, { AOM_CDF4(10261, 23033, 28725)},
> +				{ AOM_CDF4(7029, 17840, 24528)}, { AOM_CDF4(4867, 13886, 21502)},
> +				{ AOM_CDF4(25298, 31892, 32491)}, { AOM_CDF4(17809, 29330, 31512)},
> +				{ AOM_CDF4(9668, 21329, 26579)}, { AOM_CDF4(4774, 12956, 18976)},
> +				{ AOM_CDF4(2322, 7030, 11540)}, { AOM_CDF4(25472, 31920, 32543)},
> +				{ AOM_CDF4(17957, 29387, 31632)}, { AOM_CDF4(9196, 20593, 26400)},
> +				{ AOM_CDF4(4680, 12705, 19202)}, { AOM_CDF4(2917, 8456, 13436)},
> +				{ AOM_CDF4(26471, 32059, 32574)}, { AOM_CDF4(18458, 29783, 31909)},
> +				{ AOM_CDF4(8400, 19464, 25956)}, { AOM_CDF4(3812, 10973, 17206)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(6779, 13743, 17678)}, { AOM_CDF4(24806, 31797, 32457)},
> +				{ AOM_CDF4(17616, 29047, 31372)}, { AOM_CDF4(11063, 23175, 28003)},
> +				{ AOM_CDF4(6521, 16110, 22324)}, { AOM_CDF4(2764, 7504, 11654)},
> +				{ AOM_CDF4(25266, 32367, 32637)}, { AOM_CDF4(19054, 30553, 32175)},
> +				{ AOM_CDF4(12139, 25212, 29807)}, { AOM_CDF4(7311, 18162, 24704)},
> +				{ AOM_CDF4(3397, 9164, 14074)}, { AOM_CDF4(25988, 32208, 32522)},
> +				{ AOM_CDF4(16253, 28912, 31526)}, { AOM_CDF4(9151, 21387, 27372)},
> +				{ AOM_CDF4(5688, 14915, 21496)}, { AOM_CDF4(2717, 7627, 12004)},
> +				{ AOM_CDF4(23144, 31855, 32443)}, { AOM_CDF4(16070, 28491, 31325)},
> +				{ AOM_CDF4(8702, 20467, 26517)}, { AOM_CDF4(5243, 13956, 20367)},
> +				{ AOM_CDF4(2621, 7335, 11567)}, { AOM_CDF4(26636, 32340, 32630)},
> +				{ AOM_CDF4(19990, 31050, 32341)}, { AOM_CDF4(13243, 26105, 30315)},
> +				{ AOM_CDF4(8588, 19521, 25918)}, { AOM_CDF4(4717, 11585, 17304)},
> +				{ AOM_CDF4(25844, 32292, 32582)}, { AOM_CDF4(19090, 30635, 32097)},
> +				{ AOM_CDF4(11963, 24546, 28939)}, { AOM_CDF4(6218, 16087, 22354)},
> +				{ AOM_CDF4(2340, 6608, 10426)}, { AOM_CDF4(28046, 32576, 32694)},
> +				{ AOM_CDF4(21178, 31313, 32296)}, { AOM_CDF4(13486, 26184, 29870)},
> +				{ AOM_CDF4(7149, 17871, 23723)}, { AOM_CDF4(2833, 7958, 12259)},
> +				{ AOM_CDF4(27710, 32528, 32686)}, { AOM_CDF4(20674, 31076, 32268)},
> +				{ AOM_CDF4(12413, 24955, 29243)}, { AOM_CDF4(6676, 16927, 23097)},
> +				{ AOM_CDF4(2966, 8333, 12919)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8639, 19339, 24429)}, { AOM_CDF4(24404, 31837, 32525)},
> +				{ AOM_CDF4(16997, 29425, 31784)}, { AOM_CDF4(11253, 24234, 29149)},
> +				{ AOM_CDF4(6751, 17394, 24028)}, { AOM_CDF4(3490, 9830, 15191)},
> +				{ AOM_CDF4(26283, 32471, 32714)}, { AOM_CDF4(19599, 31168, 32442)},
> +				{ AOM_CDF4(13146, 26954, 30893)}, { AOM_CDF4(8214, 20588, 26890)},
> +				{ AOM_CDF4(4699, 13081, 19300)}, { AOM_CDF4(28212, 32458, 32669)},
> +				{ AOM_CDF4(18594, 30316, 32100)}, { AOM_CDF4(11219, 24408, 29234)},
> +				{ AOM_CDF4(6865, 17656, 24149)}, { AOM_CDF4(3678, 10362, 16006)},
> +				{ AOM_CDF4(25825, 32136, 32616)}, { AOM_CDF4(17313, 29853, 32021)},
> +				{ AOM_CDF4(11197, 24471, 29472)}, { AOM_CDF4(6947, 17781, 24405)},
> +				{ AOM_CDF4(3768, 10660, 16261)}, { AOM_CDF4(27352, 32500, 32706)},
> +				{ AOM_CDF4(20850, 31468, 32469)}, { AOM_CDF4(14021, 27707, 31133)},
> +				{ AOM_CDF4(8964, 21748, 27838)}, { AOM_CDF4(5437, 14665, 21187)},
> +				{ AOM_CDF4(26304, 32492, 32698)}, { AOM_CDF4(20409, 31380, 32385)},
> +				{ AOM_CDF4(13682, 27222, 30632)}, { AOM_CDF4(8974, 21236, 26685)},
> +				{ AOM_CDF4(4234, 11665, 16934)}, { AOM_CDF4(26273, 32357, 32711)},
> +				{ AOM_CDF4(20672, 31242, 32441)}, { AOM_CDF4(14172, 27254, 30902)},
> +				{ AOM_CDF4(9870, 21898, 27275)}, { AOM_CDF4(5164, 13506, 19270)},
> +				{ AOM_CDF4(26725, 32459, 32728)}, { AOM_CDF4(20991, 31442, 32527)},
> +				{ AOM_CDF4(13071, 26434, 30811)}, { AOM_CDF4(8184, 20090, 26742)},
> +				{ AOM_CDF4(4803, 13255, 19895)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(7555, 14942, 18501)}, { AOM_CDF4(24410, 31178, 32287)},
> +				{ AOM_CDF4(14394, 26738, 30253)}, { AOM_CDF4(8413, 19554, 25195)},
> +				{ AOM_CDF4(4766, 12924, 18785)}, { AOM_CDF4(2029, 5806, 9207)},
> +				{ AOM_CDF4(26776, 32364, 32663)}, { AOM_CDF4(18732, 29967, 31931)},
> +				{ AOM_CDF4(11005, 23786, 28852)}, { AOM_CDF4(6466, 16909, 23510)},
> +				{ AOM_CDF4(3044, 8638, 13419)}, { AOM_CDF4(29208, 32582, 32704)},
> +				{ AOM_CDF4(20068, 30857, 32208)}, { AOM_CDF4(12003, 25085, 29595)},
> +				{ AOM_CDF4(6947, 17750, 24189)}, { AOM_CDF4(3245, 9103, 14007)},
> +				{ AOM_CDF4(27359, 32465, 32669)}, { AOM_CDF4(19421, 30614, 32174)},
> +				{ AOM_CDF4(11915, 25010, 29579)}, { AOM_CDF4(6950, 17676, 24074)},
> +				{ AOM_CDF4(3007, 8473, 13096)}, { AOM_CDF4(29002, 32676, 32735)},
> +				{ AOM_CDF4(22102, 31849, 32576)}, { AOM_CDF4(14408, 28009, 31405)},
> +				{ AOM_CDF4(9027, 21679, 27931)}, { AOM_CDF4(4694, 12678, 18748)},
> +				{ AOM_CDF4(28216, 32528, 32682)}, { AOM_CDF4(20849, 31264, 32318)},
> +				{ AOM_CDF4(12756, 25815, 29751)}, { AOM_CDF4(7565, 18801, 24923)},
> +				{ AOM_CDF4(3509, 9533, 14477)}, { AOM_CDF4(30133, 32687, 32739)},
> +				{ AOM_CDF4(23063, 31910, 32515)}, { AOM_CDF4(14588, 28051, 31132)},
> +				{ AOM_CDF4(9085, 21649, 27457)}, { AOM_CDF4(4261, 11654, 17264)},
> +				{ AOM_CDF4(29518, 32691, 32748)}, { AOM_CDF4(22451, 31959, 32613)},
> +				{ AOM_CDF4(14864, 28722, 31700)}, { AOM_CDF4(9695, 22964, 28716)},
> +				{ AOM_CDF4(4932, 13358, 19502)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(6465, 16958, 21688)}, { AOM_CDF4(25199, 31514, 32360)},
> +				{ AOM_CDF4(14774, 27149, 30607)}, { AOM_CDF4(9257, 21438, 26972)},
> +				{ AOM_CDF4(5723, 15183, 21882)}, { AOM_CDF4(3150, 8879, 13731)},
> +				{ AOM_CDF4(26989, 32262, 32682)}, { AOM_CDF4(17396, 29937, 32085)},
> +				{ AOM_CDF4(11387, 24901, 29784)}, { AOM_CDF4(7289, 18821, 25548)},
> +				{ AOM_CDF4(3734, 10577, 16086)}, { AOM_CDF4(29728, 32501, 32695)},
> +				{ AOM_CDF4(17431, 29701, 31903)}, { AOM_CDF4(9921, 22826, 28300)},
> +				{ AOM_CDF4(5896, 15434, 22068)}, { AOM_CDF4(3430, 9646, 14757)},
> +				{ AOM_CDF4(28614, 32511, 32705)}, { AOM_CDF4(19364, 30638, 32263)},
> +				{ AOM_CDF4(13129, 26254, 30402)}, { AOM_CDF4(8754, 20484, 26440)},
> +				{ AOM_CDF4(4378, 11607, 17110)}, { AOM_CDF4(30292, 32671, 32744)},
> +				{ AOM_CDF4(21780, 31603, 32501)}, { AOM_CDF4(14314, 27829, 31291)},
> +				{ AOM_CDF4(9611, 22327, 28263)}, { AOM_CDF4(4890, 13087, 19065)},
> +				{ AOM_CDF4(25862, 32567, 32733)}, { AOM_CDF4(20794, 32050, 32567)},
> +				{ AOM_CDF4(17243, 30625, 32254)}, { AOM_CDF4(13283, 27628, 31474)},
> +				{ AOM_CDF4(9669, 22532, 28918)}, { AOM_CDF4(27435, 32697, 32748)},
> +				{ AOM_CDF4(24922, 32390, 32714)}, { AOM_CDF4(21449, 31504, 32536)},
> +				{ AOM_CDF4(16392, 29729, 31832)}, { AOM_CDF4(11692, 24884, 29076)},
> +				{ AOM_CDF4(24193, 32290, 32735)}, { AOM_CDF4(18909, 31104, 32563)},
> +				{ AOM_CDF4(12236, 26841, 31403)}, { AOM_CDF4(8171, 21840, 29082)},
> +				{ AOM_CDF4(7224, 17280, 25275)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(3078, 6839, 9890)}, { AOM_CDF4(13837, 20450, 24479)},
> +				{ AOM_CDF4(5914, 14222, 19328)}, { AOM_CDF4(3866, 10267, 14762)},
> +				{ AOM_CDF4(2612, 7208, 11042)}, { AOM_CDF4(1067, 2991, 4776)},
> +				{ AOM_CDF4(25817, 31646, 32529)}, { AOM_CDF4(13708, 26338, 30385)},
> +				{ AOM_CDF4(7328, 18585, 24870)}, { AOM_CDF4(4691, 13080, 19276)},
> +				{ AOM_CDF4(1825, 5253, 8352)}, { AOM_CDF4(29386, 32315, 32624)},
> +				{ AOM_CDF4(17160, 29001, 31360)}, { AOM_CDF4(9602, 21862, 27396)},
> +				{ AOM_CDF4(5915, 15772, 22148)}, { AOM_CDF4(2786, 7779, 12047)},
> +				{ AOM_CDF4(29246, 32450, 32663)}, { AOM_CDF4(18696, 29929, 31818)},
> +				{ AOM_CDF4(10510, 23369, 28560)}, { AOM_CDF4(6229, 16499, 23125)},
> +				{ AOM_CDF4(2608, 7448, 11705)}, { AOM_CDF4(30753, 32710, 32748)},
> +				{ AOM_CDF4(21638, 31487, 32503)}, { AOM_CDF4(12937, 26854, 30870)},
> +				{ AOM_CDF4(8182, 20596, 26970)}, { AOM_CDF4(3637, 10269, 15497)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(5244, 12150, 16906)}, { AOM_CDF4(20486, 26858, 29701)},
> +				{ AOM_CDF4(7756, 18317, 23735)}, { AOM_CDF4(3452, 9256, 13146)},
> +				{ AOM_CDF4(2020, 5206, 8229)}, { AOM_CDF4(1801, 4993, 7903)},
> +				{ AOM_CDF4(27051, 31858, 32531)}, { AOM_CDF4(15988, 27531, 30619)},
> +				{ AOM_CDF4(9188, 21484, 26719)}, { AOM_CDF4(6273, 17186, 23800)},
> +				{ AOM_CDF4(3108, 9355, 14764)}, { AOM_CDF4(31076, 32520, 32680)},
> +				{ AOM_CDF4(18119, 30037, 31850)}, { AOM_CDF4(10244, 22969, 27472)},
> +				{ AOM_CDF4(4692, 14077, 19273)}, { AOM_CDF4(3694, 11677, 17556)},
> +				{ AOM_CDF4(30060, 32581, 32720)}, { AOM_CDF4(21011, 30775, 32120)},
> +				{ AOM_CDF4(11931, 24820, 29289)}, { AOM_CDF4(7119, 17662, 24356)},
> +				{ AOM_CDF4(3833, 10706, 16304)}, { AOM_CDF4(31954, 32731, 32748)},
> +				{ AOM_CDF4(23913, 31724, 32489)}, { AOM_CDF4(15520, 28060, 31286)},
> +				{ AOM_CDF4(11517, 23008, 28571)}, { AOM_CDF4(6193, 14508, 20629)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(1035, 2807, 4156)}, { AOM_CDF4(13162, 18138, 20939)},
> +				{ AOM_CDF4(2696, 6633, 8755)}, { AOM_CDF4(1373, 4161, 6853)},
> +				{ AOM_CDF4(1099, 2746, 4716)}, { AOM_CDF4(340, 1021, 1599)},
> +				{ AOM_CDF4(22826, 30419, 32135)}, { AOM_CDF4(10395, 21762, 26942)},
> +				{ AOM_CDF4(4726, 12407, 17361)}, { AOM_CDF4(2447, 7080, 10593)},
> +				{ AOM_CDF4(1227, 3717, 6011)}, { AOM_CDF4(28156, 31424, 31934)},
> +				{ AOM_CDF4(16915, 27754, 30373)}, { AOM_CDF4(9148, 20990, 26431)},
> +				{ AOM_CDF4(5950, 15515, 21148)}, { AOM_CDF4(2492, 7327, 11526)},
> +				{ AOM_CDF4(30602, 32477, 32670)}, { AOM_CDF4(20026, 29955, 31568)},
> +				{ AOM_CDF4(11220, 23628, 28105)}, { AOM_CDF4(6652, 17019, 22973)},
> +				{ AOM_CDF4(3064, 8536, 13043)}, { AOM_CDF4(31769, 32724, 32748)},
> +				{ AOM_CDF4(22230, 30887, 32373)}, { AOM_CDF4(12234, 25079, 29731)},
> +				{ AOM_CDF4(7326, 18816, 25353)}, { AOM_CDF4(3933, 10907, 16616)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(8896, 16227, 20630)}, { AOM_CDF4(23629, 31782, 32527)},
> +				{ AOM_CDF4(15173, 27755, 31321)}, { AOM_CDF4(10158, 21233, 27382)},
> +				{ AOM_CDF4(6420, 14857, 21558)}, { AOM_CDF4(3269, 8155, 12646)},
> +				{ AOM_CDF4(24835, 32009, 32496)}, { AOM_CDF4(16509, 28421, 31579)},
> +				{ AOM_CDF4(10957, 21514, 27418)}, { AOM_CDF4(7881, 15930, 22096)},
> +				{ AOM_CDF4(5388, 10960, 15918)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(20745, 30773, 32093)},
> +				{ AOM_CDF4(15200, 27221, 30861)}, { AOM_CDF4(13032, 20873, 25667)},
> +				{ AOM_CDF4(12285, 18663, 23494)}, { AOM_CDF4(11563, 17481, 21489)},
> +				{ AOM_CDF4(26260, 31982, 32320)}, { AOM_CDF4(15397, 28083, 31100)},
> +				{ AOM_CDF4(9742, 19217, 24824)}, { AOM_CDF4(3261, 9629, 15362)},
> +				{ AOM_CDF4(1480, 4322, 7499)}, { AOM_CDF4(27599, 32256, 32460)},
> +				{ AOM_CDF4(16857, 27659, 30774)}, { AOM_CDF4(9551, 18290, 23748)},
> +				{ AOM_CDF4(3052, 8933, 14103)}, { AOM_CDF4(2021, 5910, 9787)},
> +				{ AOM_CDF4(29005, 32015, 32392)}, { AOM_CDF4(17677, 27694, 30863)},
> +				{ AOM_CDF4(9204, 17356, 23219)}, { AOM_CDF4(2403, 7516, 12814)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(10808, 22056, 26896)}, { AOM_CDF4(25739, 32313, 32676)},
> +				{ AOM_CDF4(17288, 30203, 32221)}, { AOM_CDF4(11359, 24878, 29896)},
> +				{ AOM_CDF4(6949, 17767, 24893)}, { AOM_CDF4(4287, 11796, 18071)},
> +				{ AOM_CDF4(27880, 32521, 32705)}, { AOM_CDF4(19038, 31004, 32414)},
> +				{ AOM_CDF4(12564, 26345, 30768)}, { AOM_CDF4(8269, 19947, 26779)},
> +				{ AOM_CDF4(5674, 14657, 21674)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(25742, 32319, 32671)},
> +				{ AOM_CDF4(19557, 31164, 32454)}, { AOM_CDF4(13381, 26381, 30755)},
> +				{ AOM_CDF4(10101, 21466, 26722)}, { AOM_CDF4(9209, 19650, 26825)},
> +				{ AOM_CDF4(27107, 31917, 32432)}, { AOM_CDF4(18056, 28893, 31203)},
> +				{ AOM_CDF4(10200, 21434, 26764)}, { AOM_CDF4(4660, 12913, 19502)},
> +				{ AOM_CDF4(2368, 6930, 12504)}, { AOM_CDF4(26960, 32158, 32613)},
> +				{ AOM_CDF4(18628, 30005, 32031)}, { AOM_CDF4(10233, 22442, 28232)},
> +				{ AOM_CDF4(5471, 14630, 21516)}, { AOM_CDF4(3235, 10767, 17109)},
> +				{ AOM_CDF4(27696, 32440, 32692)}, { AOM_CDF4(20032, 31167, 32438)},
> +				{ AOM_CDF4(8700, 21341, 28442)}, { AOM_CDF4(5662, 14831, 21795)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(9704, 17294, 21132)}, { AOM_CDF4(26762, 32278, 32633)},
> +				{ AOM_CDF4(18382, 29620, 31819)}, { AOM_CDF4(10891, 23475, 28723)},
> +				{ AOM_CDF4(6358, 16583, 23309)}, { AOM_CDF4(3248, 9118, 14141)},
> +				{ AOM_CDF4(27204, 32573, 32699)}, { AOM_CDF4(19818, 30824, 32329)},
> +				{ AOM_CDF4(11772, 25120, 30041)}, { AOM_CDF4(6995, 18033, 25039)},
> +				{ AOM_CDF4(3752, 10442, 16098)}, { AOM_CDF4(27222, 32256, 32559)},
> +				{ AOM_CDF4(15356, 28399, 31475)}, { AOM_CDF4(8821, 20635, 27057)},
> +				{ AOM_CDF4(5511, 14404, 21239)}, { AOM_CDF4(2935, 8222, 13051)},
> +				{ AOM_CDF4(24875, 32120, 32529)}, { AOM_CDF4(15233, 28265, 31445)},
> +				{ AOM_CDF4(8605, 20570, 26932)}, { AOM_CDF4(5431, 14413, 21196)},
> +				{ AOM_CDF4(2994, 8341, 13223)}, { AOM_CDF4(28201, 32604, 32700)},
> +				{ AOM_CDF4(21041, 31446, 32456)}, { AOM_CDF4(13221, 26213, 30475)},
> +				{ AOM_CDF4(8255, 19385, 26037)}, { AOM_CDF4(4930, 12585, 18830)},
> +				{ AOM_CDF4(28768, 32448, 32627)}, { AOM_CDF4(19705, 30561, 32021)},
> +				{ AOM_CDF4(11572, 23589, 28220)}, { AOM_CDF4(5532, 15034, 21446)},
> +				{ AOM_CDF4(2460, 7150, 11456)}, { AOM_CDF4(29874, 32619, 32699)},
> +				{ AOM_CDF4(21621, 31071, 32201)}, { AOM_CDF4(12511, 24747, 28992)},
> +				{ AOM_CDF4(6281, 16395, 22748)}, { AOM_CDF4(3246, 9278, 14497)},
> +				{ AOM_CDF4(29715, 32625, 32712)}, { AOM_CDF4(20958, 31011, 32283)},
> +				{ AOM_CDF4(11233, 23671, 28806)}, { AOM_CDF4(6012, 16128, 22868)},
> +				{ AOM_CDF4(3427, 9851, 15414)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(11016, 22111, 26794)}, { AOM_CDF4(25946, 32357, 32677)},
> +				{ AOM_CDF4(17890, 30452, 32252)}, { AOM_CDF4(11678, 25142, 29816)},
> +				{ AOM_CDF4(6720, 17534, 24584)}, { AOM_CDF4(4230, 11665, 17820)},
> +				{ AOM_CDF4(28400, 32623, 32747)}, { AOM_CDF4(21164, 31668, 32575)},
> +				{ AOM_CDF4(13572, 27388, 31182)}, { AOM_CDF4(8234, 20750, 27358)},
> +				{ AOM_CDF4(5065, 14055, 20897)}, { AOM_CDF4(28981, 32547, 32705)},
> +				{ AOM_CDF4(18681, 30543, 32239)}, { AOM_CDF4(10919, 24075, 29286)},
> +				{ AOM_CDF4(6431, 17199, 24077)}, { AOM_CDF4(3819, 10464, 16618)},
> +				{ AOM_CDF4(26870, 32467, 32693)}, { AOM_CDF4(19041, 30831, 32347)},
> +				{ AOM_CDF4(11794, 25211, 30016)}, { AOM_CDF4(6888, 18019, 24970)},
> +				{ AOM_CDF4(4370, 12363, 18992)}, { AOM_CDF4(29578, 32670, 32744)},
> +				{ AOM_CDF4(23159, 32007, 32613)}, { AOM_CDF4(15315, 28669, 31676)},
> +				{ AOM_CDF4(9298, 22607, 28782)}, { AOM_CDF4(6144, 15913, 22968)},
> +				{ AOM_CDF4(28110, 32499, 32669)}, { AOM_CDF4(21574, 30937, 32015)},
> +				{ AOM_CDF4(12759, 24818, 28727)}, { AOM_CDF4(6545, 16761, 23042)},
> +				{ AOM_CDF4(3649, 10597, 16833)}, { AOM_CDF4(28163, 32552, 32728)},
> +				{ AOM_CDF4(22101, 31469, 32464)}, { AOM_CDF4(13160, 25472, 30143)},
> +				{ AOM_CDF4(7303, 18684, 25468)}, { AOM_CDF4(5241, 13975, 20955)},
> +				{ AOM_CDF4(28400, 32631, 32744)}, { AOM_CDF4(22104, 31793, 32603)},
> +				{ AOM_CDF4(13557, 26571, 30846)}, { AOM_CDF4(7749, 19861, 26675)},
> +				{ AOM_CDF4(4873, 14030, 21234)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(9800, 17635, 21073)}, { AOM_CDF4(26153, 31885, 32527)},
> +				{ AOM_CDF4(15038, 27852, 31006)}, { AOM_CDF4(8718, 20564, 26486)},
> +				{ AOM_CDF4(5128, 14076, 20514)}, { AOM_CDF4(2636, 7566, 11925)},
> +				{ AOM_CDF4(27551, 32504, 32701)}, { AOM_CDF4(18310, 30054, 32100)},
> +				{ AOM_CDF4(10211, 23420, 29082)}, { AOM_CDF4(6222, 16876, 23916)},
> +				{ AOM_CDF4(3462, 9954, 15498)}, { AOM_CDF4(29991, 32633, 32721)},
> +				{ AOM_CDF4(19883, 30751, 32201)}, { AOM_CDF4(11141, 24184, 29285)},
> +				{ AOM_CDF4(6420, 16940, 23774)}, { AOM_CDF4(3392, 9753, 15118)},
> +				{ AOM_CDF4(28465, 32616, 32712)}, { AOM_CDF4(19850, 30702, 32244)},
> +				{ AOM_CDF4(10983, 24024, 29223)}, { AOM_CDF4(6294, 16770, 23582)},
> +				{ AOM_CDF4(3244, 9283, 14509)}, { AOM_CDF4(30023, 32717, 32748)},
> +				{ AOM_CDF4(22940, 32032, 32626)}, { AOM_CDF4(14282, 27928, 31473)},
> +				{ AOM_CDF4(8562, 21327, 27914)}, { AOM_CDF4(4846, 13393, 19919)},
> +				{ AOM_CDF4(29981, 32590, 32695)}, { AOM_CDF4(20465, 30963, 32166)},
> +				{ AOM_CDF4(11479, 23579, 28195)}, { AOM_CDF4(5916, 15648, 22073)},
> +				{ AOM_CDF4(3031, 8605, 13398)}, { AOM_CDF4(31146, 32691, 32739)},
> +				{ AOM_CDF4(23106, 31724, 32444)}, { AOM_CDF4(13783, 26738, 30439)},
> +				{ AOM_CDF4(7852, 19468, 25807)}, { AOM_CDF4(3860, 11124, 16853)},
> +				{ AOM_CDF4(31014, 32724, 32748)}, { AOM_CDF4(23629, 32109, 32628)},
> +				{ AOM_CDF4(14747, 28115, 31403)}, { AOM_CDF4(8545, 21242, 27478)},
> +				{ AOM_CDF4(4574, 12781, 19067)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(9185, 19694, 24688)}, { AOM_CDF4(26081, 31985, 32621)},
> +				{ AOM_CDF4(16015, 29000, 31787)}, { AOM_CDF4(10542, 23690, 29206)},
> +				{ AOM_CDF4(6732, 17945, 24677)}, { AOM_CDF4(3916, 11039, 16722)},
> +				{ AOM_CDF4(28224, 32566, 32744)}, { AOM_CDF4(19100, 31138, 32485)},
> +				{ AOM_CDF4(12528, 26620, 30879)}, { AOM_CDF4(7741, 20277, 26885)},
> +				{ AOM_CDF4(4566, 12845, 18990)}, { AOM_CDF4(29933, 32593, 32718)},
> +				{ AOM_CDF4(17670, 30333, 32155)}, { AOM_CDF4(10385, 23600, 28909)},
> +				{ AOM_CDF4(6243, 16236, 22407)}, { AOM_CDF4(3976, 10389, 16017)},
> +				{ AOM_CDF4(28377, 32561, 32738)}, { AOM_CDF4(19366, 31175, 32482)},
> +				{ AOM_CDF4(13327, 27175, 31094)}, { AOM_CDF4(8258, 20769, 27143)},
> +				{ AOM_CDF4(4703, 13198, 19527)}, { AOM_CDF4(31086, 32706, 32748)},
> +				{ AOM_CDF4(22853, 31902, 32583)}, { AOM_CDF4(14759, 28186, 31419)},
> +				{ AOM_CDF4(9284, 22382, 28348)}, { AOM_CDF4(5585, 15192, 21868)},
> +				{ AOM_CDF4(28291, 32652, 32746)}, { AOM_CDF4(19849, 32107, 32571)},
> +				{ AOM_CDF4(14834, 26818, 29214)}, { AOM_CDF4(10306, 22594, 28672)},
> +				{ AOM_CDF4(6615, 17384, 23384)}, { AOM_CDF4(28947, 32604, 32745)},
> +				{ AOM_CDF4(25625, 32289, 32646)}, { AOM_CDF4(18758, 28672, 31403)},
> +				{ AOM_CDF4(10017, 23430, 28523)}, { AOM_CDF4(6862, 15269, 22131)},
> +				{ AOM_CDF4(23933, 32509, 32739)}, { AOM_CDF4(19927, 31495, 32631)},
> +				{ AOM_CDF4(11903, 26023, 30621)}, { AOM_CDF4(7026, 20094, 27252)},
> +				{ AOM_CDF4(5998, 18106, 24437)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(4456, 11274, 15533)}, { AOM_CDF4(21219, 29079, 31616)},
> +				{ AOM_CDF4(11173, 23774, 28567)}, { AOM_CDF4(7282, 18293, 24263)},
> +				{ AOM_CDF4(4890, 13286, 19115)}, { AOM_CDF4(1890, 5508, 8659)},
> +				{ AOM_CDF4(26651, 32136, 32647)}, { AOM_CDF4(14630, 28254, 31455)},
> +				{ AOM_CDF4(8716, 21287, 27395)}, { AOM_CDF4(5615, 15331, 22008)},
> +				{ AOM_CDF4(2675, 7700, 12150)}, { AOM_CDF4(29954, 32526, 32690)},
> +				{ AOM_CDF4(16126, 28982, 31633)}, { AOM_CDF4(9030, 21361, 27352)},
> +				{ AOM_CDF4(5411, 14793, 21271)}, { AOM_CDF4(2943, 8422, 13163)},
> +				{ AOM_CDF4(29539, 32601, 32730)}, { AOM_CDF4(18125, 30385, 32201)},
> +				{ AOM_CDF4(10422, 24090, 29468)}, { AOM_CDF4(6468, 17487, 24438)},
> +				{ AOM_CDF4(2970, 8653, 13531)}, { AOM_CDF4(30912, 32715, 32748)},
> +				{ AOM_CDF4(20666, 31373, 32497)}, { AOM_CDF4(12509, 26640, 30917)},
> +				{ AOM_CDF4(8058, 20629, 27290)}, { AOM_CDF4(4231, 12006, 18052)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(10202, 20633, 25484)}, { AOM_CDF4(27336, 31445, 32352)},
> +				{ AOM_CDF4(12420, 24384, 28552)}, { AOM_CDF4(7648, 18115, 23856)},
> +				{ AOM_CDF4(5662, 14341, 19902)}, { AOM_CDF4(3611, 10328, 15390)},
> +				{ AOM_CDF4(30945, 32616, 32736)}, { AOM_CDF4(18682, 30505, 32253)},
> +				{ AOM_CDF4(11513, 25336, 30203)}, { AOM_CDF4(7449, 19452, 26148)},
> +				{ AOM_CDF4(4482, 13051, 18886)}, { AOM_CDF4(32022, 32690, 32747)},
> +				{ AOM_CDF4(18578, 30501, 32146)}, { AOM_CDF4(11249, 23368, 28631)},
> +				{ AOM_CDF4(5645, 16958, 22158)}, { AOM_CDF4(5009, 11444, 16637)},
> +				{ AOM_CDF4(31357, 32710, 32748)}, { AOM_CDF4(21552, 31494, 32504)},
> +				{ AOM_CDF4(13891, 27677, 31340)}, { AOM_CDF4(9051, 22098, 28172)},
> +				{ AOM_CDF4(5190, 13377, 19486)}, { AOM_CDF4(32364, 32740, 32748)},
> +				{ AOM_CDF4(24839, 31907, 32551)}, { AOM_CDF4(17160, 28779, 31696)},
> +				{ AOM_CDF4(12452, 24137, 29602)}, { AOM_CDF4(6165, 15389, 22477)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(2575, 7281, 11077)}, { AOM_CDF4(14002, 20866, 25402)},
> +				{ AOM_CDF4(6343, 15056, 19658)}, { AOM_CDF4(4474, 11858, 17041)},
> +				{ AOM_CDF4(2865, 8299, 12534)}, { AOM_CDF4(1344, 3949, 6391)},
> +				{ AOM_CDF4(24720, 31239, 32459)}, { AOM_CDF4(12585, 25356, 29968)},
> +				{ AOM_CDF4(7181, 18246, 24444)}, { AOM_CDF4(5025, 13667, 19885)},
> +				{ AOM_CDF4(2521, 7304, 11605)}, { AOM_CDF4(29908, 32252, 32584)},
> +				{ AOM_CDF4(17421, 29156, 31575)}, { AOM_CDF4(9889, 22188, 27782)},
> +				{ AOM_CDF4(5878, 15647, 22123)}, { AOM_CDF4(2814, 8665, 13323)},
> +				{ AOM_CDF4(30183, 32568, 32713)}, { AOM_CDF4(18528, 30195, 32049)},
> +				{ AOM_CDF4(10982, 24606, 29657)}, { AOM_CDF4(6957, 18165, 25231)},
> +				{ AOM_CDF4(3508, 10118, 15468)}, { AOM_CDF4(31761, 32736, 32748)},
> +				{ AOM_CDF4(21041, 31328, 32546)}, { AOM_CDF4(12568, 26732, 31166)},
> +				{ AOM_CDF4(8052, 20720, 27733)}, { AOM_CDF4(4336, 12192, 18396)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF4(7062, 16472, 22319)}, { AOM_CDF4(24538, 32261, 32674)},
> +				{ AOM_CDF4(13675, 28041, 31779)}, { AOM_CDF4(8590, 20674, 27631)},
> +				{ AOM_CDF4(5685, 14675, 22013)}, { AOM_CDF4(3655, 9898, 15731)},
> +				{ AOM_CDF4(26493, 32418, 32658)}, { AOM_CDF4(16376, 29342, 32090)},
> +				{ AOM_CDF4(10594, 22649, 28970)}, { AOM_CDF4(8176, 17170, 24303)},
> +				{ AOM_CDF4(5605, 12694, 19139)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(23888, 31902, 32542)},
> +				{ AOM_CDF4(18612, 29687, 31987)}, { AOM_CDF4(16245, 24852, 29249)},
> +				{ AOM_CDF4(15765, 22608, 27559)}, { AOM_CDF4(19895, 24699, 27510)},
> +				{ AOM_CDF4(28401, 32212, 32457)}, { AOM_CDF4(15274, 27825, 30980)},
> +				{ AOM_CDF4(9364, 18128, 24332)}, { AOM_CDF4(2283, 8193, 15082)},
> +				{ AOM_CDF4(1228, 3972, 7881)}, { AOM_CDF4(29455, 32469, 32620)},
> +				{ AOM_CDF4(17981, 28245, 31388)}, { AOM_CDF4(10921, 20098, 26240)},
> +				{ AOM_CDF4(3743, 11829, 18657)}, { AOM_CDF4(2374, 9593, 15715)},
> +				{ AOM_CDF4(31068, 32466, 32635)}, { AOM_CDF4(20321, 29572, 31971)},
> +				{ AOM_CDF4(10771, 20255, 27119)}, { AOM_CDF4(2795, 10410, 17361)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(9320, 22102, 27840)}, { AOM_CDF4(27057, 32464, 32724)},
> +				{ AOM_CDF4(16331, 30268, 32309)}, { AOM_CDF4(10319, 23935, 29720)},
> +				{ AOM_CDF4(6189, 16448, 24106)}, { AOM_CDF4(3589, 10884, 18808)},
> +				{ AOM_CDF4(29026, 32624, 32748)}, { AOM_CDF4(19226, 31507, 32587)},
> +				{ AOM_CDF4(12692, 26921, 31203)}, { AOM_CDF4(7049, 19532, 27635)},
> +				{ AOM_CDF4(7727, 15669, 23252)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(28056, 32625, 32748)},
> +				{ AOM_CDF4(22383, 32075, 32669)}, { AOM_CDF4(15417, 27098, 31749)},
> +				{ AOM_CDF4(18127, 26493, 27190)}, { AOM_CDF4(5461, 16384, 21845)},
> +				{ AOM_CDF4(27982, 32091, 32584)}, { AOM_CDF4(19045, 29868, 31972)},
> +				{ AOM_CDF4(10397, 22266, 27932)}, { AOM_CDF4(5990, 13697, 21500)},
> +				{ AOM_CDF4(1792, 6912, 15104)}, { AOM_CDF4(28198, 32501, 32718)},
> +				{ AOM_CDF4(21534, 31521, 32569)}, { AOM_CDF4(11109, 25217, 30017)},
> +				{ AOM_CDF4(5671, 15124, 26151)}, { AOM_CDF4(4681, 14043, 18725)},
> +				{ AOM_CDF4(28688, 32580, 32741)}, { AOM_CDF4(22576, 32079, 32661)},
> +				{ AOM_CDF4(10627, 22141, 28340)}, { AOM_CDF4(9362, 14043, 28087)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(7754, 16948, 22142)}, { AOM_CDF4(25670, 32330, 32691)},
> +				{ AOM_CDF4(15663, 29225, 31994)}, { AOM_CDF4(9878, 23288, 29158)},
> +				{ AOM_CDF4(6419, 17088, 24336)}, { AOM_CDF4(3859, 11003, 17039)},
> +				{ AOM_CDF4(27562, 32595, 32725)}, { AOM_CDF4(17575, 30588, 32399)},
> +				{ AOM_CDF4(10819, 24838, 30309)}, { AOM_CDF4(7124, 18686, 25916)},
> +				{ AOM_CDF4(4479, 12688, 19340)}, { AOM_CDF4(28385, 32476, 32673)},
> +				{ AOM_CDF4(15306, 29005, 31938)}, { AOM_CDF4(8937, 21615, 28322)},
> +				{ AOM_CDF4(5982, 15603, 22786)}, { AOM_CDF4(3620, 10267, 16136)},
> +				{ AOM_CDF4(27280, 32464, 32667)}, { AOM_CDF4(15607, 29160, 32004)},
> +				{ AOM_CDF4(9091, 22135, 28740)}, { AOM_CDF4(6232, 16632, 24020)},
> +				{ AOM_CDF4(4047, 11377, 17672)}, { AOM_CDF4(29220, 32630, 32718)},
> +				{ AOM_CDF4(19650, 31220, 32462)}, { AOM_CDF4(13050, 26312, 30827)},
> +				{ AOM_CDF4(9228, 20870, 27468)}, { AOM_CDF4(6146, 15149, 21971)},
> +				{ AOM_CDF4(30169, 32481, 32623)}, { AOM_CDF4(17212, 29311, 31554)},
> +				{ AOM_CDF4(9911, 21311, 26882)}, { AOM_CDF4(4487, 13314, 20372)},
> +				{ AOM_CDF4(2570, 7772, 12889)}, { AOM_CDF4(30924, 32613, 32708)},
> +				{ AOM_CDF4(19490, 30206, 32107)}, { AOM_CDF4(11232, 23998, 29276)},
> +				{ AOM_CDF4(6769, 17955, 25035)}, { AOM_CDF4(4398, 12623, 19214)},
> +				{ AOM_CDF4(30609, 32627, 32722)}, { AOM_CDF4(19370, 30582, 32287)},
> +				{ AOM_CDF4(10457, 23619, 29409)}, { AOM_CDF4(6443, 17637, 24834)},
> +				{ AOM_CDF4(4645, 13236, 20106)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8626, 20271, 26216)}, { AOM_CDF4(26707, 32406, 32711)},
> +				{ AOM_CDF4(16999, 30329, 32286)}, { AOM_CDF4(11445, 25123, 30286)},
> +				{ AOM_CDF4(6411, 18828, 25601)}, { AOM_CDF4(6801, 12458, 20248)},
> +				{ AOM_CDF4(29918, 32682, 32748)}, { AOM_CDF4(20649, 31739, 32618)},
> +				{ AOM_CDF4(12879, 27773, 31581)}, { AOM_CDF4(7896, 21751, 28244)},
> +				{ AOM_CDF4(5260, 14870, 23698)}, { AOM_CDF4(29252, 32593, 32731)},
> +				{ AOM_CDF4(17072, 30460, 32294)}, { AOM_CDF4(10653, 24143, 29365)},
> +				{ AOM_CDF4(6536, 17490, 23983)}, { AOM_CDF4(4929, 13170, 20085)},
> +				{ AOM_CDF4(28137, 32518, 32715)}, { AOM_CDF4(18171, 30784, 32407)},
> +				{ AOM_CDF4(11437, 25436, 30459)}, { AOM_CDF4(7252, 18534, 26176)},
> +				{ AOM_CDF4(4126, 13353, 20978)}, { AOM_CDF4(31162, 32726, 32748)},
> +				{ AOM_CDF4(23017, 32222, 32701)}, { AOM_CDF4(15629, 29233, 32046)},
> +				{ AOM_CDF4(9387, 22621, 29480)}, { AOM_CDF4(6922, 17616, 25010)},
> +				{ AOM_CDF4(28838, 32265, 32614)}, { AOM_CDF4(19701, 30206, 31920)},
> +				{ AOM_CDF4(11214, 22410, 27933)}, { AOM_CDF4(5320, 14177, 23034)},
> +				{ AOM_CDF4(5049, 12881, 17827)}, { AOM_CDF4(27484, 32471, 32734)},
> +				{ AOM_CDF4(21076, 31526, 32561)}, { AOM_CDF4(12707, 26303, 31211)},
> +				{ AOM_CDF4(8169, 21722, 28219)}, { AOM_CDF4(6045, 19406, 27042)},
> +				{ AOM_CDF4(27753, 32572, 32745)}, { AOM_CDF4(20832, 31878, 32653)},
> +				{ AOM_CDF4(13250, 27356, 31674)}, { AOM_CDF4(7718, 21508, 29858)},
> +				{ AOM_CDF4(7209, 18350, 25559)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(7876, 16901, 21741)}, { AOM_CDF4(24001, 31898, 32625)},
> +				{ AOM_CDF4(14529, 27959, 31451)}, { AOM_CDF4(8273, 20818, 27258)},
> +				{ AOM_CDF4(5278, 14673, 21510)}, { AOM_CDF4(2983, 8843, 14039)},
> +				{ AOM_CDF4(28016, 32574, 32732)}, { AOM_CDF4(17471, 30306, 32301)},
> +				{ AOM_CDF4(10224, 24063, 29728)}, { AOM_CDF4(6602, 17954, 25052)},
> +				{ AOM_CDF4(4002, 11585, 17759)}, { AOM_CDF4(30190, 32634, 32739)},
> +				{ AOM_CDF4(17497, 30282, 32270)}, { AOM_CDF4(10229, 23729, 29538)},
> +				{ AOM_CDF4(6344, 17211, 24440)}, { AOM_CDF4(3849, 11189, 17108)},
> +				{ AOM_CDF4(28570, 32583, 32726)}, { AOM_CDF4(17521, 30161, 32238)},
> +				{ AOM_CDF4(10153, 23565, 29378)}, { AOM_CDF4(6455, 17341, 24443)},
> +				{ AOM_CDF4(3907, 11042, 17024)}, { AOM_CDF4(30689, 32715, 32748)},
> +				{ AOM_CDF4(21546, 31840, 32610)}, { AOM_CDF4(13547, 27581, 31459)},
> +				{ AOM_CDF4(8912, 21757, 28309)}, { AOM_CDF4(5548, 15080, 22046)},
> +				{ AOM_CDF4(30783, 32540, 32685)}, { AOM_CDF4(17540, 29528, 31668)},
> +				{ AOM_CDF4(10160, 21468, 26783)}, { AOM_CDF4(4724, 13393, 20054)},
> +				{ AOM_CDF4(2702, 8174, 13102)}, { AOM_CDF4(31648, 32686, 32742)},
> +				{ AOM_CDF4(20954, 31094, 32337)}, { AOM_CDF4(12420, 25698, 30179)},
> +				{ AOM_CDF4(7304, 19320, 26248)}, { AOM_CDF4(4366, 12261, 18864)},
> +				{ AOM_CDF4(31581, 32723, 32748)}, { AOM_CDF4(21373, 31586, 32525)},
> +				{ AOM_CDF4(12744, 26625, 30885)}, { AOM_CDF4(7431, 20322, 26950)},
> +				{ AOM_CDF4(4692, 13323, 20111)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(7833, 18369, 24095)}, { AOM_CDF4(26650, 32273, 32702)},
> +				{ AOM_CDF4(16371, 29961, 32191)}, { AOM_CDF4(11055, 24082, 29629)},
> +				{ AOM_CDF4(6892, 18644, 25400)}, { AOM_CDF4(5006, 13057, 19240)},
> +				{ AOM_CDF4(29834, 32666, 32748)}, { AOM_CDF4(19577, 31335, 32570)},
> +				{ AOM_CDF4(12253, 26509, 31122)}, { AOM_CDF4(7991, 20772, 27711)},
> +				{ AOM_CDF4(5677, 15910, 23059)}, { AOM_CDF4(30109, 32532, 32720)},
> +				{ AOM_CDF4(16747, 30166, 32252)}, { AOM_CDF4(10134, 23542, 29184)},
> +				{ AOM_CDF4(5791, 16176, 23556)}, { AOM_CDF4(4362, 10414, 17284)},
> +				{ AOM_CDF4(29492, 32626, 32748)}, { AOM_CDF4(19894, 31402, 32525)},
> +				{ AOM_CDF4(12942, 27071, 30869)}, { AOM_CDF4(8346, 21216, 27405)},
> +				{ AOM_CDF4(6572, 17087, 23859)}, { AOM_CDF4(32035, 32735, 32748)},
> +				{ AOM_CDF4(22957, 31838, 32618)}, { AOM_CDF4(14724, 28572, 31772)},
> +				{ AOM_CDF4(10364, 23999, 29553)}, { AOM_CDF4(7004, 18433, 25655)},
> +				{ AOM_CDF4(27528, 32277, 32681)}, { AOM_CDF4(16959, 31171, 32096)},
> +				{ AOM_CDF4(10486, 23593, 27962)}, { AOM_CDF4(8192, 16384, 23211)},
> +				{ AOM_CDF4(8937, 17873, 20852)}, { AOM_CDF4(27715, 32002, 32615)},
> +				{ AOM_CDF4(15073, 29491, 31676)}, { AOM_CDF4(11264, 24576, 28672)},
> +				{ AOM_CDF4(2341, 18725, 23406)}, { AOM_CDF4(7282, 18204, 25486)},
> +				{ AOM_CDF4(28547, 32213, 32657)}, { AOM_CDF4(20788, 29773, 32239)},
> +				{ AOM_CDF4(6780, 21469, 30508)}, { AOM_CDF4(5958, 14895, 23831)},
> +				{ AOM_CDF4(16384, 21845, 27307)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(5992, 14304, 19765)}, { AOM_CDF4(22612, 31238, 32456)},
> +				{ AOM_CDF4(13456, 27162, 31087)}, { AOM_CDF4(8001, 20062, 26504)},
> +				{ AOM_CDF4(5168, 14105, 20764)}, { AOM_CDF4(2632, 7771, 12385)},
> +				{ AOM_CDF4(27034, 32344, 32709)}, { AOM_CDF4(15850, 29415, 31997)},
> +				{ AOM_CDF4(9494, 22776, 28841)}, { AOM_CDF4(6151, 16830, 23969)},
> +				{ AOM_CDF4(3461, 10039, 15722)}, { AOM_CDF4(30134, 32569, 32731)},
> +				{ AOM_CDF4(15638, 29422, 31945)}, { AOM_CDF4(9150, 21865, 28218)},
> +				{ AOM_CDF4(5647, 15719, 22676)}, { AOM_CDF4(3402, 9772, 15477)},
> +				{ AOM_CDF4(28530, 32586, 32735)}, { AOM_CDF4(17139, 30298, 32292)},
> +				{ AOM_CDF4(10200, 24039, 29685)}, { AOM_CDF4(6419, 17674, 24786)},
> +				{ AOM_CDF4(3544, 10225, 15824)}, { AOM_CDF4(31333, 32726, 32748)},
> +				{ AOM_CDF4(20618, 31487, 32544)}, { AOM_CDF4(12901, 27217, 31232)},
> +				{ AOM_CDF4(8624, 21734, 28171)}, { AOM_CDF4(5104, 14191, 20748)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(11206, 21090, 26561)}, { AOM_CDF4(28759, 32279, 32671)},
> +				{ AOM_CDF4(14171, 27952, 31569)}, { AOM_CDF4(9743, 22907, 29141)},
> +				{ AOM_CDF4(6871, 17886, 24868)}, { AOM_CDF4(4960, 13152, 19315)},
> +				{ AOM_CDF4(31077, 32661, 32748)}, { AOM_CDF4(19400, 31195, 32515)},
> +				{ AOM_CDF4(12752, 26858, 31040)}, { AOM_CDF4(8370, 22098, 28591)},
> +				{ AOM_CDF4(5457, 15373, 22298)}, { AOM_CDF4(31697, 32706, 32748)},
> +				{ AOM_CDF4(17860, 30657, 32333)}, { AOM_CDF4(12510, 24812, 29261)},
> +				{ AOM_CDF4(6180, 19124, 24722)}, { AOM_CDF4(5041, 13548, 17959)},
> +				{ AOM_CDF4(31552, 32716, 32748)}, { AOM_CDF4(21908, 31769, 32623)},
> +				{ AOM_CDF4(14470, 28201, 31565)}, { AOM_CDF4(9493, 22982, 28608)},
> +				{ AOM_CDF4(6858, 17240, 24137)}, { AOM_CDF4(32543, 32752, 32756)},
> +				{ AOM_CDF4(24286, 32097, 32666)}, { AOM_CDF4(15958, 29217, 32024)},
> +				{ AOM_CDF4(10207, 24234, 29958)}, { AOM_CDF4(6929, 18305, 25652)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF4(4137, 10847, 15682)}, { AOM_CDF4(17824, 27001, 30058)},
> +				{ AOM_CDF4(10204, 22796, 28291)}, { AOM_CDF4(6076, 15935, 22125)},
> +				{ AOM_CDF4(3852, 10937, 16816)}, { AOM_CDF4(2252, 6324, 10131)},
> +				{ AOM_CDF4(25840, 32016, 32662)}, { AOM_CDF4(15109, 28268, 31531)},
> +				{ AOM_CDF4(9385, 22231, 28340)}, { AOM_CDF4(6082, 16672, 23479)},
> +				{ AOM_CDF4(3318, 9427, 14681)}, { AOM_CDF4(30594, 32574, 32718)},
> +				{ AOM_CDF4(16836, 29552, 31859)}, { AOM_CDF4(9556, 22542, 28356)},
> +				{ AOM_CDF4(6305, 16725, 23540)}, { AOM_CDF4(3376, 9895, 15184)},
> +				{ AOM_CDF4(29383, 32617, 32745)}, { AOM_CDF4(18891, 30809, 32401)},
> +				{ AOM_CDF4(11688, 25942, 30687)}, { AOM_CDF4(7468, 19469, 26651)},
> +				{ AOM_CDF4(3909, 11358, 17012)}, { AOM_CDF4(31564, 32736, 32748)},
> +				{ AOM_CDF4(20906, 31611, 32600)}, { AOM_CDF4(13191, 27621, 31537)},
> +				{ AOM_CDF4(8768, 22029, 28676)}, { AOM_CDF4(5079, 14109, 20906)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			},
> +			{
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)},
> +				{ AOM_CDF4(8192, 16384, 24576)}, { AOM_CDF4(8192, 16384, 24576)}
> +			}
> +		}
> +	}
> +};
> +
> +static const u16 av1_default_coeff_base_eob_multi_cdfs[TOKEN_CDF_Q_CTXS][TX_SIZES]
> +	[PLANE_TYPES][SIG_COEF_CONTEXTS_EOB][CDF_SIZE(NUM_BASE_LEVELS + 1)] = {
> +	{
> +		{
> +			{
> +				{ AOM_CDF3(17837, 29055)},
> +				{ AOM_CDF3(29600, 31446)},
> +				{ AOM_CDF3(30844, 31878)},
> +				{ AOM_CDF3(24926, 28948)}
> +			},
> +			{
> +				{ AOM_CDF3(21365, 30026)},
> +				{ AOM_CDF3(30512, 32423)},
> +				{ AOM_CDF3(31658, 32621)},
> +				{ AOM_CDF3(29630, 31881)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(5717, 26477)},
> +				{ AOM_CDF3(30491, 31703)},
> +				{ AOM_CDF3(31550, 32158)},
> +				{ AOM_CDF3(29648, 31491)}
> +			},
> +			{
> +				{ AOM_CDF3(12608, 27820)},
> +				{ AOM_CDF3(30680, 32225)},
> +				{ AOM_CDF3(30809, 32335)},
> +				{ AOM_CDF3(31299, 32423)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(1786, 12612)},
> +				{ AOM_CDF3(30663, 31625)},
> +				{ AOM_CDF3(32339, 32468)},
> +				{ AOM_CDF3(31148, 31833)}
> +			},
> +			{
> +				{ AOM_CDF3(18857, 23865)},
> +				{ AOM_CDF3(31428, 32428)},
> +				{ AOM_CDF3(31744, 32373)},
> +				{ AOM_CDF3(31775, 32526)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(1787, 2532)},
> +				{ AOM_CDF3(30832, 31662)},
> +				{ AOM_CDF3(31824, 32682)},
> +				{ AOM_CDF3(32133, 32569)}
> +			},
> +			{
> +				{ AOM_CDF3(13751, 22235)},
> +				{ AOM_CDF3(32089, 32409)},
> +				{ AOM_CDF3(27084, 27920)},
> +				{ AOM_CDF3(29291, 32594)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(1725, 3449)},
> +				{ AOM_CDF3(31102, 31935)},
> +				{ AOM_CDF3(32457, 32613)},
> +				{ AOM_CDF3(32412, 32649)}
> +			},
> +			{
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF3(17560, 29888)},
> +				{ AOM_CDF3(29671, 31549)},
> +				{ AOM_CDF3(31007, 32056)},
> +				{ AOM_CDF3(27286, 30006)}
> +			},
> +			{
> +				{ AOM_CDF3(26594, 31212)},
> +				{ AOM_CDF3(31208, 32582)},
> +				{ AOM_CDF3(31835, 32637)},
> +				{ AOM_CDF3(30595, 32206)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(15239, 29932)},
> +				{ AOM_CDF3(31315, 32095)},
> +				{ AOM_CDF3(32130, 32434)},
> +				{ AOM_CDF3(30864, 31996)}
> +			},
> +			{
> +				{ AOM_CDF3(26279, 30968)},
> +				{ AOM_CDF3(31142, 32495)},
> +				{ AOM_CDF3(31713, 32540)},
> +				{ AOM_CDF3(31929, 32594)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(2644, 25198)},
> +				{ AOM_CDF3(32038, 32451)},
> +				{ AOM_CDF3(32639, 32695)},
> +				{ AOM_CDF3(32166, 32518)}
> +			},
> +			{
> +				{ AOM_CDF3(17187, 27668)},
> +				{ AOM_CDF3(31714, 32550)},
> +				{ AOM_CDF3(32283, 32678)},
> +				{ AOM_CDF3(31930, 32563)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(1044, 2257)},
> +				{ AOM_CDF3(30755, 31923)},
> +				{ AOM_CDF3(32208, 32693)},
> +				{ AOM_CDF3(32244, 32615)}
> +			},
> +			{
> +				{ AOM_CDF3(21317, 26207)},
> +				{ AOM_CDF3(29133, 30868)},
> +				{ AOM_CDF3(29311, 31231)},
> +				{ AOM_CDF3(29657, 31087)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(478, 1834)},
> +				{ AOM_CDF3(31005, 31987)},
> +				{ AOM_CDF3(32317, 32724)},
> +				{ AOM_CDF3(30865, 32648)}
> +			},
> +			{
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF3(20092, 30774)},
> +				{ AOM_CDF3(30695, 32020)},
> +				{ AOM_CDF3(31131, 32103)},
> +				{ AOM_CDF3(28666, 30870)}
> +			},
> +			{
> +				{ AOM_CDF3(27258, 31095)},
> +				{ AOM_CDF3(31804, 32623)},
> +				{ AOM_CDF3(31763, 32528)},
> +				{ AOM_CDF3(31438, 32506)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(18049, 30489)},
> +				{ AOM_CDF3(31706, 32286)},
> +				{ AOM_CDF3(32163, 32473)},
> +				{ AOM_CDF3(31550, 32184)}
> +			},
> +			{
> +				{ AOM_CDF3(27116, 30842)},
> +				{ AOM_CDF3(31971, 32598)},
> +				{ AOM_CDF3(32088, 32576)},
> +				{ AOM_CDF3(32067, 32664)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(12854, 29093)},
> +				{ AOM_CDF3(32272, 32558)},
> +				{ AOM_CDF3(32667, 32729)},
> +				{ AOM_CDF3(32306, 32585)}
> +			},
> +			{
> +				{ AOM_CDF3(25476, 30366)},
> +				{ AOM_CDF3(32169, 32687)},
> +				{ AOM_CDF3(32479, 32689)},
> +				{ AOM_CDF3(31673, 32634)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(2809, 19301)},
> +				{ AOM_CDF3(32205, 32622)},
> +				{ AOM_CDF3(32338, 32730)},
> +				{ AOM_CDF3(31786, 32616)}
> +			},
> +			{
> +				{ AOM_CDF3(22737, 29105)},
> +				{ AOM_CDF3(30810, 32362)},
> +				{ AOM_CDF3(30014, 32627)},
> +				{ AOM_CDF3(30528, 32574)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(935, 3382)},
> +				{ AOM_CDF3(30789, 31909)},
> +				{ AOM_CDF3(32466, 32756)},
> +				{ AOM_CDF3(30860, 32513)}
> +			},
> +			{
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)}
> +			}
> +		}
> +	},
> +	{
> +		{
> +			{
> +				{ AOM_CDF3(22497, 31198)},
> +				{ AOM_CDF3(31715, 32495)},
> +				{ AOM_CDF3(31606, 32337)},
> +				{ AOM_CDF3(30388, 31990)}
> +			},
> +			{
> +				{ AOM_CDF3(27877, 31584)},
> +				{ AOM_CDF3(32170, 32728)},
> +				{ AOM_CDF3(32155, 32688)},
> +				{ AOM_CDF3(32219, 32702)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(21457, 31043)},
> +				{ AOM_CDF3(31951, 32483)},
> +				{ AOM_CDF3(32153, 32562)},
> +				{ AOM_CDF3(31473, 32215)}
> +			},
> +			{
> +				{ AOM_CDF3(27558, 31151)},
> +				{ AOM_CDF3(32020, 32640)},
> +				{ AOM_CDF3(32097, 32575)},
> +				{ AOM_CDF3(32242, 32719)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(19980, 30591)},
> +				{ AOM_CDF3(32219, 32597)},
> +				{ AOM_CDF3(32581, 32706)},
> +				{ AOM_CDF3(31803, 32287)}
> +			},
> +			{
> +				{ AOM_CDF3(26473, 30507)},
> +				{ AOM_CDF3(32431, 32723)},
> +				{ AOM_CDF3(32196, 32611)},
> +				{ AOM_CDF3(31588, 32528)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(24647, 30463)},
> +				{ AOM_CDF3(32412, 32695)},
> +				{ AOM_CDF3(32468, 32720)},
> +				{ AOM_CDF3(31269, 32523)}
> +			},
> +			{
> +				{ AOM_CDF3(28482, 31505)},
> +				{ AOM_CDF3(32152, 32701)},
> +				{ AOM_CDF3(31732, 32598)},
> +				{ AOM_CDF3(31767, 32712)}
> +			}
> +		},
> +		{
> +			{
> +				{ AOM_CDF3(12358, 24977)},
> +				{ AOM_CDF3(31331, 32385)},
> +				{ AOM_CDF3(32634, 32756)},
> +				{ AOM_CDF3(30411, 32548)}
> +			},
> +			{
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)},
> +				{ AOM_CDF3(10923, 21845)}
> +			}
> +		}
> +	}
> +};
> +
> +static const u16 default_joint_cdf[] = { ICDF(4096), ICDF(11264), ICDF(19328)};
> +static const u16 default_clsss_cdf[][10] = {
> +	// Vertical component
> +	{
> +		ICDF(28672), ICDF(30976), ICDF(31858), ICDF(32320), ICDF(32551),
> +		ICDF(32656), ICDF(32740), ICDF(32757), ICDF(32762), ICDF(32767)
> +	},
> +	// Horizontal component
> +	{
> +		ICDF(28672), ICDF(30976), ICDF(31858), ICDF(32320), ICDF(32551),
> +		ICDF(32656), ICDF(32740), ICDF(32757), ICDF(32762), ICDF(32767)
> +	}
> +};
> +
> +static const u16 default_clsss0_fp_cdf[][2][3] = {
> +	// Vertical component
> +	{
> +		{ ICDF(16384), ICDF(24576), ICDF(26624)},
> +		{ ICDF(12288), ICDF(21248), ICDF(24128)}
> +	},
> +	// Horizontal component
> +	{
> +		{ ICDF(16384), ICDF(24576), ICDF(26624)},
> +		{ ICDF(12288), ICDF(21248), ICDF(24128)}
> +	}
> +};
> +
> +static const u16 default_fp_cdf[][3] = {
> +	// Vertical component
> +	{
> +		ICDF(8192), ICDF(17408), ICDF(21248)
> +	},
> +	// Horizontal component
> +	{
> +		ICDF(8192), ICDF(17408), ICDF(21248)
> +	}
> +};
> +
> +static const u16 default_sign_cdf[] = { ICDF(128 * 128), ICDF(128 * 128)};
> +static const u16 default_class0_hp_cdf[] = { ICDF(160 * 128), ICDF(160 * 128)};
> +static const u16 default_hp_cdf[] = { ICDF(128 * 128), ICDF(128 * 128)};
> +static const u16 default_class0_cdf[] = { ICDF(216 * 128), ICDF(216 * 128)};
> +static const u16 default_bits_cdf[][10] = {
> +	{
> +		ICDF(128 * 136), ICDF(128 * 140), ICDF(128 * 148), ICDF(128 * 160),
> +		ICDF(128 * 176), ICDF(128 * 192), ICDF(128 * 224), ICDF(128 * 234),
> +		ICDF(128 * 234), ICDF(128 * 240)
> +	},
> +	{
> +		ICDF(128 * 136), ICDF(128 * 140), ICDF(128 * 148), ICDF(128 * 160),
> +		ICDF(128 * 176), ICDF(128 * 192), ICDF(128 * 224), ICDF(128 * 234),
> +		ICDF(128 * 234), ICDF(128 * 240)
> +	}
> +};
> +
> +static int rockchip_av1_get_q_ctx(int q)
> +{
> +	if (q <= 20)
> +		return 0;
> +	if (q <= 60)
> +		return 1;
> +	if (q <= 120)
> +		return 2;
> +	return 3;
> +}
> +
> +void rockchip_av1_default_coeff_probs(u32 base_qindex, void *ptr)
> +{
> +	struct av1cdfs *cdfs = (struct av1cdfs *)ptr;
> +	const int index = rockchip_av1_get_q_ctx(base_qindex);
> +
> +	memcpy(cdfs->txb_skip_cdf, av1_default_txb_skip_cdfs[index],
> +	       sizeof(av1_default_txb_skip_cdfs[0]));
> +	memcpy(cdfs->eob_extra_cdf, av1_default_eob_extra_cdfs[index],
> +	       sizeof(av1_default_eob_extra_cdfs[0]));
> +	memcpy(cdfs->dc_sign_cdf, av1_default_dc_sign_cdfs[index],
> +	       sizeof(av1_default_dc_sign_cdfs[0]));
> +	memcpy(cdfs->coeff_br_cdf, av1_default_coeff_lps_multi_cdfs[index],
> +	       sizeof(av1_default_coeff_lps_multi_cdfs[0]));
> +	memcpy(cdfs->coeff_base_cdf, av1_default_coeff_base_multi_cdfs[index],
> +	       sizeof(av1_default_coeff_base_multi_cdfs[0]));
> +	memcpy(cdfs->coeff_base_eob_cdf,
> +	       av1_default_coeff_base_eob_multi_cdfs[index],
> +	       sizeof(av1_default_coeff_base_eob_multi_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf16, av1_default_eob_multi16_cdfs[index],
> +	       sizeof(av1_default_eob_multi16_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf32, av1_default_eob_multi32_cdfs[index],
> +	       sizeof(av1_default_eob_multi32_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf64, av1_default_eob_multi64_cdfs[index],
> +	       sizeof(av1_default_eob_multi64_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf128, av1_default_eob_multi128_cdfs[index],
> +	       sizeof(av1_default_eob_multi128_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf256, av1_default_eob_multi256_cdfs[index],
> +	       sizeof(av1_default_eob_multi256_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf512, av1_default_eob_multi512_cdfs[index],
> +	       sizeof(av1_default_eob_multi512_cdfs[0]));
> +	memcpy(cdfs->eob_flag_cdf1024, av1_default_eob_multi1024_cdfs[index],
> +	       sizeof(av1_default_eob_multi1024_cdfs[0]));
> +}
> +
> +void rockchip_av1_set_default_cdfs(struct av1cdfs *cdfs,
> +				   struct mvcdfs *cdfs_ndvc)
> +{
> +	memcpy(cdfs->partition_cdf, default_partition_cdf,
> +	       sizeof(cdfs->partition_cdf));
> +
> +	memcpy(cdfs->tx_type_intra0_cdf, default_intra_ext_tx0_cdf,
> +	       sizeof(cdfs->tx_type_intra0_cdf));
> +	memcpy(cdfs->tx_type_intra1_cdf, default_intra_ext_tx1_cdf,
> +	       sizeof(cdfs->tx_type_intra1_cdf));
> +	memcpy(cdfs->tx_type_inter_cdf, default_inter_ext_tx_cdf,
> +	       sizeof(cdfs->tx_type_inter_cdf));
> +
> +	memcpy(cdfs->vartx_part_cdf, default_txfm_partition_cdf,
> +	       sizeof(cdfs->vartx_part_cdf));
> +	memcpy(cdfs->mbskip_cdf, default_skip_cdfs, sizeof(cdfs->mbskip_cdf));
> +	memcpy(cdfs->delta_q_cdf, default_delta_q_cdf,
> +	       sizeof(cdfs->delta_q_cdf));
> +	memcpy(cdfs->delta_lf_multi_cdf, default_delta_lf_multi_cdf,
> +	       sizeof(cdfs->delta_lf_multi_cdf));
> +	memcpy(cdfs->delta_lf_cdf, default_delta_lf_cdf,
> +	       sizeof(cdfs->delta_lf_cdf));
> +
> +	memcpy(cdfs->segment_pred_cdf, default_segment_pred_cdf,
> +	       sizeof(cdfs->segment_pred_cdf));
> +
> +	memcpy(cdfs->spatial_pred_seg_tree_cdf,
> +	       default_spatial_pred_seg_tree_cdf,
> +	       sizeof(cdfs->spatial_pred_seg_tree_cdf));
> +
> +	memcpy(cdfs->skip_mode_cdf, default_skip_mode_cdfs,
> +	       sizeof(cdfs->skip_mode_cdf));
> +
> +	memcpy(cdfs->tx_size_cdf, default_tx_size_cdf,
> +	       sizeof(cdfs->tx_size_cdf));
> +
> +	memcpy(cdfs->kf_ymode_cdf, default_kf_y_mode_cdf,
> +	       sizeof(cdfs->kf_ymode_cdf));
> +	memcpy(cdfs->uv_mode_cdf, default_uv_mode_cdf,
> +	       sizeof(cdfs->uv_mode_cdf));
> +	memcpy(cdfs->if_ymode_cdf, default_if_y_mode_cdf,
> +	       sizeof(cdfs->if_ymode_cdf));
> +
> +	memcpy(cdfs->intra_inter_cdf, default_intra_inter_cdf,
> +	       sizeof(cdfs->intra_inter_cdf));
> +
> +	memcpy(cdfs->comp_ref_cdf, default_comp_ref_cdf,
> +	       sizeof(cdfs->comp_ref_cdf));
> +	memcpy(cdfs->comp_bwdref_cdf, default_comp_bwdref_cdf,
> +	       sizeof(cdfs->comp_bwdref_cdf));
> +
> +	memcpy(cdfs->comp_inter_cdf, default_comp_inter_cdf,
> +	       sizeof(cdfs->comp_inter_cdf));
> +
> +	memcpy(cdfs->single_ref_cdf, default_single_ref_cdf,
> +	       sizeof(cdfs->single_ref_cdf));
> +	memcpy(cdfs->comp_ref_type_cdf, default_comp_ref_type_cdf,
> +	       sizeof(cdfs->comp_ref_type_cdf));
> +	memcpy(cdfs->uni_comp_ref_cdf, default_uni_comp_ref_cdf,
> +	       sizeof(cdfs->uni_comp_ref_cdf));
> +
> +	memcpy(cdfs->newmv_cdf, default_newmv_cdf, sizeof(cdfs->newmv_cdf));
> +	memcpy(cdfs->zeromv_cdf, default_zeromv_cdf, sizeof(cdfs->zeromv_cdf));
> +	memcpy(cdfs->refmv_cdf, default_refmv_cdf, sizeof(cdfs->refmv_cdf));
> +	memcpy(cdfs->drl_cdf, default_drl_cdf, sizeof(cdfs->drl_cdf));
> +
> +	memcpy(cdfs->interp_filter_cdf, default_switchable_interp_cdf,
> +	       sizeof(cdfs->interp_filter_cdf));
> +
> +	// Regular MV cdfs
> +	memcpy(cdfs->mv_cdf.joint_cdf, default_joint_cdf,
> +	       sizeof(cdfs->mv_cdf.joint_cdf));
> +	memcpy(cdfs->mv_cdf.sign_cdf, default_sign_cdf,
> +	       sizeof(cdfs->mv_cdf.sign_cdf));
> +	memcpy(cdfs->mv_cdf.clsss_cdf, default_clsss_cdf,
> +	       sizeof(cdfs->mv_cdf.clsss_cdf));
> +	memcpy(cdfs->mv_cdf.clsss0_fp_cdf, default_clsss0_fp_cdf,
> +	       sizeof(cdfs->mv_cdf.clsss0_fp_cdf));
> +	memcpy(cdfs->mv_cdf.fp_cdf, default_fp_cdf,
> +	       sizeof(cdfs->mv_cdf.fp_cdf));
> +	memcpy(cdfs->mv_cdf.class0_hp_cdf, default_class0_hp_cdf,
> +	       sizeof(cdfs->mv_cdf.class0_hp_cdf));
> +	memcpy(cdfs->mv_cdf.hp_cdf, default_hp_cdf,
> +	       sizeof(cdfs->mv_cdf.hp_cdf));
> +	memcpy(cdfs->mv_cdf.class0_cdf, default_class0_cdf,
> +	       sizeof(cdfs->mv_cdf.class0_cdf));
> +	memcpy(cdfs->mv_cdf.bits_cdf, default_bits_cdf,
> +	       sizeof(cdfs->mv_cdf.bits_cdf));
> +
> +	// Intrabc cdfs
> +	memcpy(cdfs_ndvc->joint_cdf, default_joint_cdf,
> +	       sizeof(cdfs_ndvc->joint_cdf));
> +	memcpy(cdfs_ndvc->sign_cdf, default_sign_cdf,
> +	       sizeof(cdfs_ndvc->sign_cdf));
> +	memcpy(cdfs_ndvc->clsss_cdf, default_clsss_cdf,
> +	       sizeof(cdfs_ndvc->clsss_cdf));
> +	memcpy(cdfs_ndvc->clsss0_fp_cdf, default_clsss0_fp_cdf,
> +	       sizeof(cdfs_ndvc->clsss0_fp_cdf));
> +	memcpy(cdfs_ndvc->fp_cdf, default_fp_cdf, sizeof(cdfs_ndvc->fp_cdf));
> +	memcpy(cdfs_ndvc->class0_hp_cdf, default_class0_hp_cdf,
> +	       sizeof(cdfs_ndvc->class0_hp_cdf));
> +	memcpy(cdfs_ndvc->hp_cdf, default_hp_cdf, sizeof(cdfs_ndvc->hp_cdf));
> +	memcpy(cdfs_ndvc->class0_cdf, default_class0_cdf,
> +	       sizeof(cdfs_ndvc->class0_cdf));
> +	memcpy(cdfs_ndvc->bits_cdf, default_bits_cdf,
> +	       sizeof(cdfs_ndvc->bits_cdf));
> +
> +	memcpy(cdfs->obmc_cdf, default_obmc_cdf, sizeof(cdfs->obmc_cdf));
> +	memcpy(cdfs->motion_mode_cdf, default_motion_mode_cdf,
> +	       sizeof(cdfs->motion_mode_cdf));
> +
> +	memcpy(cdfs->inter_compound_mode_cdf, default_inter_compound_mode_cdf,
> +	       sizeof(cdfs->inter_compound_mode_cdf));
> +	memcpy(cdfs->compound_type_cdf, default_compound_type_cdf,
> +	       sizeof(cdfs->compound_type_cdf));
> +	memcpy(cdfs->interintra_cdf, default_interintra_cdf,
> +	       sizeof(cdfs->interintra_cdf));
> +	memcpy(cdfs->interintra_mode_cdf, default_interintra_mode_cdf,
> +	       sizeof(cdfs->interintra_mode_cdf));
> +	memcpy(cdfs->wedge_interintra_cdf, default_wedge_interintra_cdf,
> +	       sizeof(cdfs->wedge_interintra_cdf));
> +	memcpy(cdfs->wedge_idx_cdf, default_wedge_idx_cdf,
> +	       sizeof(cdfs->wedge_idx_cdf));
> +
> +	memcpy(cdfs->palette_y_mode_cdf, default_palette_y_mode_cdf,
> +	       sizeof(cdfs->palette_y_mode_cdf));
> +	memcpy(cdfs->palette_uv_mode_cdf, default_palette_uv_mode_cdf,
> +	       sizeof(cdfs->palette_uv_mode_cdf));
> +	memcpy(cdfs->palette_y_size_cdf, default_palette_y_size_cdf,
> +	       sizeof(cdfs->palette_y_size_cdf));
> +	memcpy(cdfs->palette_uv_size_cdf, default_palette_uv_size_cdf,
> +	       sizeof(cdfs->palette_uv_size_cdf));
> +	memcpy(cdfs->palette_y_color_index_cdf,
> +	       default_palette_y_color_index_cdf,
> +	       sizeof(cdfs->palette_y_color_index_cdf));
> +	memcpy(cdfs->palette_uv_color_index_cdf,
> +	       default_palette_uv_color_index_cdf,
> +	       sizeof(cdfs->palette_uv_color_index_cdf));
> +
> +	memcpy(cdfs->cfl_sign_cdf, default_cfl_sign_cdf,
> +	       sizeof(cdfs->cfl_sign_cdf));
> +	memcpy(cdfs->cfl_alpha_cdf, default_cfl_alpha_cdf,
> +	       sizeof(cdfs->cfl_alpha_cdf));
> +
> +	memcpy(cdfs->intrabc_cdf, default_intrabc_cdf,
> +	       sizeof(cdfs->intrabc_cdf));
> +	memcpy(cdfs->angle_delta_cdf, default_angle_delta_cdf,
> +	       sizeof(cdfs->angle_delta_cdf));
> +	memcpy(cdfs->filter_intra_mode_cdf, default_filter_intra_mode_cdf,
> +	       sizeof(cdfs->filter_intra_mode_cdf));
> +	memcpy(cdfs->filter_intra_cdf, default_filter_intra_cdfs,
> +	       sizeof(cdfs->filter_intra_cdf));
> +	memcpy(cdfs->comp_group_idx_cdf, default_comp_group_idx_cdfs,
> +	       sizeof(cdfs->comp_group_idx_cdf));
> +	memcpy(cdfs->compound_idx_cdf, default_compound_idx_cdfs,
> +	       sizeof(cdfs->compound_idx_cdf));
> +}
> +
> +void rockchip_av1_get_cdfs(struct hantro_ctx *ctx, u32 ref_idx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +
> +	av1_dec->cdfs = &av1_dec->cdfs_last[ref_idx];
> +	av1_dec->cdfs_ndvc = &av1_dec->cdfs_last_ndvc[ref_idx];
> +}
> +
> +void rockchip_av1_store_cdfs(struct hantro_ctx *ctx,
> +			     u32 refresh_frame_flags)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	int i;
> +
> +	for (i = 0; i < NUM_REF_FRAMES; i++) {
> +		if (refresh_frame_flags & (1 << i)) {
> +			if (&av1_dec->cdfs_last[i] != av1_dec->cdfs) {
> +				av1_dec->cdfs_last[i] = *av1_dec->cdfs;
> +				av1_dec->cdfs_last_ndvc[i] =
> +				    *av1_dec->cdfs_ndvc;
> +			}
> +		}
> +	}
> +}
> diff --git a/drivers/media/platform/verisilicon/rockchip_av1_entropymode.h b/drivers/media/platform/verisilicon/rockchip_av1_entropymode.h
> new file mode 100644
> index 000000000000..bbf8424c7d2c
> --- /dev/null
> +++ b/drivers/media/platform/verisilicon/rockchip_av1_entropymode.h
> @@ -0,0 +1,272 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#ifndef _ROCKCHIP_AV1_ENTROPYMODE_H_
> +#define _ROCKCHIP_AV1_ENTROPYMODE_H_
> +
> +#include <linux/types.h>
> +
> +struct hantro_ctx;
> +
> +#define AV1_INTER_MODE_CONTEXTS 15
> +#define AV1_INTRA_MODES 13
> +#define AV1_REF_CONTEXTS 3
> +#define AV1_SWITCHABLE_FILTERS 3	/* number of switchable filters */
> +#define AV1_TX_SIZE_CONTEXTS 3
> +#define BLOCK_SIZE_GROUPS 4
> +#define BR_CDF_SIZE 4
> +#define BWD_REFS 3
> +#define CFL_ALLOWED_TYPES 2
> +#define CFL_ALPHA_CONTEXTS 6
> +#define CFL_ALPHABET_SIZE 16
> +#define CFL_JOINT_SIGNS 8
> +#define CDF_SIZE(x) ((x) - 1)
> +#define COMP_GROUP_IDX_CONTEXTS 7
> +#define COMP_INDEX_CONTEXTS 6
> +#define COMP_INTER_CONTEXTS 5
> +#define COMP_REF_TYPE_CONTEXTS 5
> +#define COMPOUND_TYPES 3
> +#define DC_SIGN_CONTEXTS 3
> +#define DELTA_LF_PROBS 3
> +#define DELTA_Q_PROBS 3
> +#define DIRECTIONAL_MODES 8
> +#define DRL_MODE_CONTEXTS 3
> +#define EOB_COEF_CONTEXTS 9
> +#define EXT_TX_SIZES 3
> +#define EXT_TX_TYPES 16
> +#define EXTTX_SIZES 4
> +#define FRAME_LF_COUNT 4
> +#define FWD_REFS 4
> +#define GLOBALMV_MODE_CONTEXTS 2
> +#define ICDF(x) (32768U - (x))
> +#define INTER_COMPOUND_MODES 8
> +#define INTERINTRA_MODES 4
> +#define INTRA_INTER_CONTEXTS 4
> +#define KF_MODE_CONTEXTS 5
> +#define LEVEL_CONTEXTS 21
> +#define MAX_ANGLE_DELTA 3
> +#define MAX_MB_SEGMENTS 8
> +#define MAX_SEGMENTS 8
> +#define MAX_TX_CATS 4
> +#define MAX_TX_DEPTH 2
> +#define MBSKIP_CONTEXTS 3
> +#define MOTION_MODES 3
> +#define MOTION_MODE_CONTEXTS 10
> +#define NEWMV_MODE_CONTEXTS 6
> +#define NUM_BASE_LEVELS 2
> +#define NUM_REF_FRAMES 8
> +#define PALETTE_BLOCK_SIZES 7
> +#define PALETTE_IDX_CONTEXTS 18
> +#define PALETTE_SIZES 7
> +#define PALETTE_UV_MODE_CONTEXTS 2
> +#define PALETTE_Y_MODE_CONTEXTS 3
> +#define PARTITION_PLOFFSET 4
> +#define NUM_PARTITION_CONTEXTS (4 * PARTITION_PLOFFSET)
> +#define PLANE_TYPES 2
> +#define PREDICTION_PROBS 3
> +#define REF_CONTEXTS 5
> +#define REFMV_MODE_CONTEXTS 9
> +#define SEG_TEMPORAL_PRED_CTXS 3
> +#define SIG_COEF_CONTEXTS 42
> +#define SIG_COEF_CONTEXTS_EOB 4
> +#define SINGLE_REFS 7
> +#define SKIP_CONTEXTS 3
> +#define SKIP_MODE_CONTEXTS 3
> +#define SPATIAL_PREDICTION_PROBS 3
> +#define SWITCHABLE_FILTER_CONTEXTS ((AV1_SWITCHABLE_FILTERS + 1) * 4)
> +#define TOKEN_CDF_Q_CTXS 4
> +#define TX_SIZES 5
> +#define TX_SIZE_CONTEXTS 2
> +#define TX_TYPES 4
> +#define TXB_SKIP_CONTEXTS 13
> +#define TXFM_PARTITION_CONTEXTS 22
> +#define UNI_COMP_REF_CONTEXTS 3
> +#define UNIDIR_COMP_REFS 4
> +#define UV_INTRA_MODES 14
> +#define VARTX_PART_CONTEXTS 22
> +#define ZEROMV_MODE_CONTEXTS 2
> +
> +enum blocksizetype {
> +	BLOCK_SIZE_AB4X4,
> +	BLOCK_SIZE_SB4X8,
> +	BLOCK_SIZE_SB8X4,
> +	BLOCK_SIZE_SB8X8,
> +	BLOCK_SIZE_SB8X16,
> +	BLOCK_SIZE_SB16X8,
> +	BLOCK_SIZE_MB16X16,
> +	BLOCK_SIZE_SB16X32,
> +	BLOCK_SIZE_SB32X16,
> +	BLOCK_SIZE_SB32X32,
> +	BLOCK_SIZE_SB32X64,
> +	BLOCK_SIZE_SB64X32,
> +	BLOCK_SIZE_SB64X64,
> +	BLOCK_SIZE_SB64X128,
> +	BLOCK_SIZE_SB128X64,
> +	BLOCK_SIZE_SB128X128,
> +	BLOCK_SIZE_SB4X16,
> +	BLOCK_SIZE_SB16X4,
> +	BLOCK_SIZE_SB8X32,
> +	BLOCK_SIZE_SB32X8,
> +	BLOCK_SIZE_SB16X64,
> +	BLOCK_SIZE_SB64X16,
> +	BLOCK_SIZE_TYPES,
> +	BLOCK_SIZES_ALL = BLOCK_SIZE_TYPES
> +};
> +
> +enum filterintramodetype {
> +	FILTER_DC_PRED,
> +	FILTER_V_PRED,
> +	FILTER_H_PRED,
> +	FILTER_D153_PRED,
> +	FILTER_PAETH_PRED,
> +	FILTER_INTRA_MODES,
> +	FILTER_INTRA_UNUSED = 7
> +};
> +
> +enum frametype {
> +	KEY_FRAME = 0,
> +	INTER_FRAME = 1,
> +	NUM_FRAME_TYPES,
> +};
> +
> +enum txsize {
> +	TX_4X4 = 0,
> +	TX_8X8 = 1,
> +	TX_16X16 = 2,
> +	TX_32X32 = 3,
> +	TX_SIZE_MAX_SB,
> +};
> +
> +enum { SIMPLE_TRANSLATION, OBMC_CAUSAL, MOTION_MODE_COUNT };
> +
> +enum mb_prediction_mode {
> +	DC_PRED,		/* average of above and left pixels */
> +	V_PRED,			/* vertical prediction */
> +	H_PRED,			/* horizontal prediction */
> +	D45_PRED,		/* Directional 45 deg prediction  [anti-clockwise from 0 deg hor] */
> +	D135_PRED,		/* Directional 135 deg prediction [anti-clockwise from 0 deg hor] */
> +	D117_PRED,		/* Directional 112 deg prediction [anti-clockwise from 0 deg hor] */
> +	D153_PRED,		/* Directional 157 deg prediction [anti-clockwise from 0 deg hor] */
> +	D27_PRED,		/* Directional 22 deg prediction  [anti-clockwise from 0 deg hor] */
> +	D63_PRED,		/* Directional 67 deg prediction  [anti-clockwise from 0 deg hor] */
> +	SMOOTH_PRED,
> +	TM_PRED_AV1 = SMOOTH_PRED,
> +	SMOOTH_V_PRED,		// Vertical interpolation
> +	SMOOTH_H_PRED,		// Horizontal interpolation
> +	TM_PRED,		/* Truemotion prediction */
> +	PAETH_PRED = TM_PRED,
> +	NEARESTMV,
> +	NEARMV,
> +	ZEROMV,
> +	NEWMV,
> +	NEAREST_NEARESTMV,
> +	NEAR_NEARMV,
> +	NEAREST_NEWMV,
> +	NEW_NEARESTMV,
> +	NEAR_NEWMV,
> +	NEW_NEARMV,
> +	ZERO_ZEROMV,
> +	NEW_NEWMV,
> +	SPLITMV,
> +	MB_MODE_COUNT
> +};
> +
> +enum partitiontype {
> +	PARTITION_NONE,
> +	PARTITION_HORZ,
> +	PARTITION_VERT,
> +	PARTITION_SPLIT,
> +	PARTITION_TYPES
> +};
> +
> +struct mvcdfs {
> +	u16 joint_cdf[3];
> +	u16 sign_cdf[2];
> +	u16 clsss_cdf[2][10];
> +	u16 clsss0_fp_cdf[2][2][3];
> +	u16 fp_cdf[2][3];
> +	u16 class0_hp_cdf[2];
> +	u16 hp_cdf[2];
> +	u16 class0_cdf[2];
> +	u16 bits_cdf[2][10];
> +};
> +
> +struct av1cdfs {
> +	u16 partition_cdf[13][16];
> +	u16 kf_ymode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][AV1_INTRA_MODES - 1];
> +	u16 segment_pred_cdf[PREDICTION_PROBS];
> +	u16 spatial_pred_seg_tree_cdf[SPATIAL_PREDICTION_PROBS][MAX_MB_SEGMENTS - 1];
> +	u16 mbskip_cdf[MBSKIP_CONTEXTS];
> +	u16 delta_q_cdf[DELTA_Q_PROBS];
> +	u16 delta_lf_multi_cdf[FRAME_LF_COUNT][DELTA_LF_PROBS];
> +	u16 delta_lf_cdf[DELTA_LF_PROBS];
> +	u16 skip_mode_cdf[SKIP_MODE_CONTEXTS];
> +	u16 vartx_part_cdf[VARTX_PART_CONTEXTS][1];
> +	u16 tx_size_cdf[MAX_TX_CATS][AV1_TX_SIZE_CONTEXTS][MAX_TX_DEPTH];
> +	u16 if_ymode_cdf[BLOCK_SIZE_GROUPS][AV1_INTRA_MODES - 1];
> +	u16 uv_mode_cdf[2][AV1_INTRA_MODES][AV1_INTRA_MODES - 1 + 1];
> +	u16 intra_inter_cdf[INTRA_INTER_CONTEXTS];
> +	u16 comp_inter_cdf[COMP_INTER_CONTEXTS];
> +	u16 single_ref_cdf[AV1_REF_CONTEXTS][SINGLE_REFS - 1];
> +	u16 comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][1];
> +	u16 uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][1];
> +	u16 comp_ref_cdf[AV1_REF_CONTEXTS][FWD_REFS - 1];
> +	u16 comp_bwdref_cdf[AV1_REF_CONTEXTS][BWD_REFS - 1];
> +	u16 newmv_cdf[NEWMV_MODE_CONTEXTS];
> +	u16 zeromv_cdf[ZEROMV_MODE_CONTEXTS];
> +	u16 refmv_cdf[REFMV_MODE_CONTEXTS];
> +	u16 drl_cdf[DRL_MODE_CONTEXTS];
> +	u16 interp_filter_cdf[SWITCHABLE_FILTER_CONTEXTS][AV1_SWITCHABLE_FILTERS - 1];
> +	struct mvcdfs mv_cdf;
> +	u16 obmc_cdf[BLOCK_SIZE_TYPES];
> +	u16 motion_mode_cdf[BLOCK_SIZE_TYPES][2];
> +	u16 inter_compound_mode_cdf[AV1_INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES - 1];
> +	u16 compound_type_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(COMPOUND_TYPES - 1)];
> +	u16 interintra_cdf[BLOCK_SIZE_GROUPS];
> +	u16 interintra_mode_cdf[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1];
> +	u16 wedge_interintra_cdf[BLOCK_SIZE_TYPES];
> +	u16 wedge_idx_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(16)];
> +	u16 palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS][1];
> +	u16 palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][1];
> +	u16 palette_y_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1];
> +	u16 palette_uv_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1];
> +	u16 cfl_sign_cdf[CFL_JOINT_SIGNS - 1];
> +	u16 cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE - 1];
> +	u16 intrabc_cdf[1];
> +	u16 angle_delta_cdf[DIRECTIONAL_MODES][6];
> +	u16 filter_intra_mode_cdf[FILTER_INTRA_MODES - 1];
> +	u16 filter_intra_cdf[BLOCK_SIZES_ALL];
> +	u16 comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)];
> +	u16 compound_idx_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)];
> +	u16 dummy0[14];
> +	// Palette index contexts; sizes 1/7, 2/6, 3/5 packed together
> +	u16 palette_y_color_index_cdf[PALETTE_IDX_CONTEXTS][8];
> +	u16 palette_uv_color_index_cdf[PALETTE_IDX_CONTEXTS][8];
> +	u16 tx_type_intra0_cdf[EXTTX_SIZES][AV1_INTRA_MODES][8];
> +	u16 tx_type_intra1_cdf[EXTTX_SIZES][AV1_INTRA_MODES][4];
> +	u16 tx_type_inter_cdf[2][EXTTX_SIZES][EXT_TX_TYPES];
> +	u16 txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
> +	u16 eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][CDF_SIZE(2)];
> +	u16 dummy1[5];
> +	u16 eob_flag_cdf16[PLANE_TYPES][2][4];
> +	u16 eob_flag_cdf32[PLANE_TYPES][2][8];
> +	u16 eob_flag_cdf64[PLANE_TYPES][2][8];
> +	u16 eob_flag_cdf128[PLANE_TYPES][2][8];
> +	u16 eob_flag_cdf256[PLANE_TYPES][2][8];
> +	u16 eob_flag_cdf512[PLANE_TYPES][2][16];
> +	u16 eob_flag_cdf1024[PLANE_TYPES][2][16];
> +	u16 coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB][CDF_SIZE(3)];
> +	u16 coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS][CDF_SIZE(4) + 1];
> +	u16 dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
> +	u16 dummy2[2];
> +	u16 coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][CDF_SIZE(BR_CDF_SIZE) + 1];
> +	u16 dummy3[16];
> +};
> +
> +void rockchip_av1_store_cdfs(struct hantro_ctx *ctx,
> +			     u32 refresh_frame_flags);
> +void rockchip_av1_get_cdfs(struct hantro_ctx *ctx, u32 ref_idx);
> +void rockchip_av1_set_default_cdfs(struct av1cdfs *cdfs,
> +				   struct mvcdfs *cdfs_ndvc);
> +void rockchip_av1_default_coeff_probs(u32 base_qindex, void *ptr);
> +
> +#endif /* _ROCKCHIP_AV1_ENTROPYMODE_H_ */
Nicolas Dufresne April 11, 2023, 3:15 p.m. UTC | #8
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> Implement AV1 stateless decoder for rockchip VPU981.
> It decode 8 and 10 bits AV1 bitstreams.
> AV1 scaling feature is done by the postprocessor.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> 
> 
> (with Hans' requested changes of course)
> 
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>> 
> ---
>  drivers/media/platform/verisilicon/Makefile   |    1 +
>  .../media/platform/verisilicon/hantro_hw.h    |   64 +-
>  .../verisilicon/rockchip_vpu981_hw_av1_dec.c  | 2024 +++++++++++++++++
>  .../verisilicon/rockchip_vpu981_regs.h        |  477 ++++
>  4 files changed, 2564 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h
> 
> diff --git a/drivers/media/platform/verisilicon/Makefile b/drivers/media/platform/verisilicon/Makefile
> index d2b2679c00eb..c9a9806ab8c5 100644
> --- a/drivers/media/platform/verisilicon/Makefile
> +++ b/drivers/media/platform/verisilicon/Makefile
> @@ -18,6 +18,7 @@ hantro-vpu-y += \
>  		rockchip_vpu2_hw_h264_dec.o \
>  		rockchip_vpu2_hw_mpeg2_dec.o \
>  		rockchip_vpu2_hw_vp8_dec.o \
> +		rockchip_vpu981_hw_av1_dec.o \
>  		rockchip_av1_entropymode.o \
>  		hantro_jpeg.o \
>  		hantro_h264.o \
> diff --git a/drivers/media/platform/verisilicon/hantro_hw.h b/drivers/media/platform/verisilicon/hantro_hw.h
> index d7641eced32e..25456fb960c8 100644
> --- a/drivers/media/platform/verisilicon/hantro_hw.h
> +++ b/drivers/media/platform/verisilicon/hantro_hw.h
> @@ -37,6 +37,8 @@
>  
>  #define NUM_REF_PICTURES	(V4L2_HEVC_DPB_ENTRIES_NUM_MAX + 1)
>  
> +#define AV1_MAX_FRAME_BUF_COUNT	(V4L2_AV1_TOTAL_REFS_PER_FRAME + 1)
> +
>  struct hantro_dev;
>  struct hantro_ctx;
>  struct hantro_buf;
> @@ -250,23 +252,81 @@ struct hantro_vp9_dec_hw_ctx {
>  };
>  
>  /**
> - * hantro_av1_dec_hw_ctx
> + * struct hantro_av1_dec_ctrls
> + * @sequence:		AV1 Sequence
> + * @tile_group_entry:	AV1 Tile Group entry
> + * @frame:		AV1 Frame Header OBU
> + * @film_grain:		AV1 Film Grain
> + */
> +struct hantro_av1_dec_ctrls {
> +	const struct v4l2_ctrl_av1_sequence *sequence;
> +	const struct v4l2_ctrl_av1_tile_group_entry *tile_group_entry;
> +	const struct v4l2_ctrl_av1_frame *frame;
> +	const struct v4l2_ctrl_av1_film_grain *film_grain;
> +};
> +
> +struct hantro_av1_frame_ref {
> +	int width;
> +	int height;
> +	int mi_cols;
> +	int mi_rows;
> +	u64 timestamp;
> +	enum v4l2_av1_frame_type frame_type;
> +	bool used;
> +	u32 order_hint;
> +	u32 order_hints[V4L2_AV1_TOTAL_REFS_PER_FRAME];
> +	struct vb2_v4l2_buffer *vb2_ref;
> +};
> +
> +/**
> + * struct hantro_av1_dec_hw_ctx
> + * @db_data_col:	db tile col data buffer
> + * @db_ctrl_col:	db tile col ctrl buffer
> + * @cdef_col:		cdef tile col buffer
> + * @sr_col:		sr tile col buffer
> + * @lr_col:		lr tile col buffer
> + * @global_model:	global model buffer
> + * @tile_info:		tile info buffer
> + * @segment:		segmentation info buffer
> + * @prob_tbl:		probability table
> + * @prob_tbl_out:	probability table output
> + * @tile_buf:		tile buffer
> + * @ctrls:		V4L2 controls attached to a run
> + * @frame_refs:		reference frames info slots
> + * @ref_frame_sign_bias: array of sign bias
> + * @num_tile_cols_allocated: number of allocated tiles
>   * @cdfs:		current probabilities structure
>   * @cdfs_ndvc:		current mv probabilities structure
>   * @default_cdfs:	default probabilities structure
>   * @default_cdfs_ndvc:	default mv probabilties structure
>   * @cdfs_last:		stored probabilities structures
>   * @cdfs_last_ndvc:	stored mv probabilities structures
> + * @current_frame_index: index of the current in frame_refs array
>   */
>  struct hantro_av1_dec_hw_ctx {
> +	struct hantro_aux_buf db_data_col;
> +	struct hantro_aux_buf db_ctrl_col;
> +	struct hantro_aux_buf cdef_col;
> +	struct hantro_aux_buf sr_col;
> +	struct hantro_aux_buf lr_col;
> +	struct hantro_aux_buf global_model;
> +	struct hantro_aux_buf tile_info;
> +	struct hantro_aux_buf segment;
> +	struct hantro_aux_buf prob_tbl;
> +	struct hantro_aux_buf prob_tbl_out;
> +	struct hantro_aux_buf tile_buf;
> +	struct hantro_av1_dec_ctrls ctrls;
> +	struct hantro_av1_frame_ref frame_refs[AV1_MAX_FRAME_BUF_COUNT];
> +	u32 ref_frame_sign_bias[V4L2_AV1_TOTAL_REFS_PER_FRAME];
> +	unsigned int num_tile_cols_allocated;
>  	struct av1cdfs *cdfs;
>  	struct mvcdfs  *cdfs_ndvc;
>  	struct av1cdfs default_cdfs;
>  	struct mvcdfs  default_cdfs_ndvc;
>  	struct av1cdfs cdfs_last[NUM_REF_FRAMES];
>  	struct mvcdfs  cdfs_last_ndvc[NUM_REF_FRAMES];
> +	int current_frame_index;
>  };
> -
>  /**
>   * struct hantro_postproc_ctx
>   *
> diff --git a/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c b/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
> new file mode 100644
> index 000000000000..a2c9bcebd8bb
> --- /dev/null
> +++ b/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
> @@ -0,0 +1,2024 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2021, Collabora
> + *
> + * Author: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> + */
> +
> +#include <media/v4l2-mem2mem.h>
> +#include "hantro.h"
> +#include "hantro_v4l2.h"
> +#include "rockchip_vpu981_regs.h"
> +
> +#define AV1_DEC_MODE		17
> +#define GM_GLOBAL_MODELS_PER_FRAME	7
> +#define GLOBAL_MODEL_TOTAL_SIZE	(6 * 4 + 4 * 2)
> +#define GLOBAL_MODEL_SIZE	ALIGN(GM_GLOBAL_MODELS_PER_FRAME * GLOBAL_MODEL_TOTAL_SIZE, 2048)
> +#define AV1_MAX_TILES		128
> +#define AV1_TILE_INFO_SIZE	(AV1_MAX_TILES * 16)
> +#define AV1DEC_MAX_PIC_BUFFERS	24
> +#define AV1_REF_SCALE_SHIFT	14
> +#define AV1_INVALID_IDX		-1
> +#define MAX_FRAME_DISTANCE	31
> +#define AV1_PRIMARY_REF_NONE	7
> +#define AV1_TILE_SIZE		ALIGN(32 * 128, 4096)
> +/*
> + * These 3 values aren't defined enum v4l2_av1_segment_feature because
> + * they are not part of the specification
> + */
> +#define V4L2_AV1_SEG_LVL_ALT_LF_Y_H	2
> +#define V4L2_AV1_SEG_LVL_ALT_LF_U	3
> +#define V4L2_AV1_SEG_LVL_ALT_LF_V	4
> +
> +#define SUPERRES_SCALE_BITS 3
> +#define SCALE_NUMERATOR 8
> +#define SUPERRES_SCALE_DENOMINATOR_MIN (SCALE_NUMERATOR + 1)
> +
> +#define RS_SUBPEL_BITS 6
> +#define RS_SUBPEL_MASK ((1 << RS_SUBPEL_BITS) - 1)
> +#define RS_SCALE_SUBPEL_BITS 14
> +#define RS_SCALE_SUBPEL_MASK ((1 << RS_SCALE_SUBPEL_BITS) - 1)
> +#define RS_SCALE_EXTRA_BITS (RS_SCALE_SUBPEL_BITS - RS_SUBPEL_BITS)
> +#define RS_SCALE_EXTRA_OFF (1 << (RS_SCALE_EXTRA_BITS - 1))
> +
> +#define IS_INTRA(type) ((type == V4L2_AV1_KEY_FRAME) || (type == V4L2_AV1_INTRA_ONLY_FRAME))
> +
> +#define LST_BUF_IDX (V4L2_AV1_REF_LAST_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +#define LST2_BUF_IDX (V4L2_AV1_REF_LAST2_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +#define LST3_BUF_IDX (V4L2_AV1_REF_LAST3_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +#define GLD_BUF_IDX (V4L2_AV1_REF_GOLDEN_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +#define BWD_BUF_IDX (V4L2_AV1_REF_BWDREF_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +#define ALT2_BUF_IDX (V4L2_AV1_REF_ALTREF2_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +#define ALT_BUF_IDX (V4L2_AV1_REF_ALTREF_FRAME - V4L2_AV1_REF_LAST_FRAME)
> +
> +#define DIV_LUT_PREC_BITS 14
> +#define DIV_LUT_BITS 8
> +#define DIV_LUT_NUM BIT(DIV_LUT_BITS)
> +#define WARP_PARAM_REDUCE_BITS 6
> +#define WARPEDMODEL_PREC_BITS 16
> +
> +#define AV1_DIV_ROUND_UP_POW2(value, n)			\
> +({							\
> +	typeof(n) _n  = n;				\
> +	typeof(value) _value = value;			\
> +	(_value + (BIT(_n) >> 1)) >> _n;		\
> +})
> +
> +#define AV1_DIV_ROUND_UP_POW2_SIGNED(value, n)				\
> +({									\
> +	typeof(n) _n_  = n;						\
> +	typeof(value) _value_ = value;					\
> +	(((_value_) < 0) ? -AV1_DIV_ROUND_UP_POW2(-(_value_), (_n_))	\
> +		: AV1_DIV_ROUND_UP_POW2((_value_), (_n_)));		\
> +})
> +
> +struct rockchip_av1_film_grain {
> +	u8 scaling_lut_y[256];
> +	u8 scaling_lut_cb[256];
> +	u8 scaling_lut_cr[256];
> +	s16 cropped_luma_grain_block[4096];
> +	s16 cropped_chroma_grain_block[1024 * 2];
> +};
> +
> +static const short div_lut[DIV_LUT_NUM + 1] = {
> +	16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
> +	15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,
> +	15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,
> +	14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,
> +	13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,
> +	13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,
> +	13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,
> +	12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,
> +	12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,
> +	11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,
> +	11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,
> +	11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,
> +	10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,
> +	10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,
> +	10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,
> +	9963,  9939,  9916,  9892,  9869,  9846,  9823,  9800,  9777,  9754,  9732,
> +	9709,  9687,  9664,  9642,  9620,  9598,  9576,  9554,  9533,  9511,  9489,
> +	9468,  9447,  9425,  9404,  9383,  9362,  9341,  9321,  9300,  9279,  9259,
> +	9239,  9218,  9198,  9178,  9158,  9138,  9118,  9098,  9079,  9059,  9039,
> +	9020,  9001,  8981,  8962,  8943,  8924,  8905,  8886,  8867,  8849,  8830,
> +	8812,  8793,  8775,  8756,  8738,  8720,  8702,  8684,  8666,  8648,  8630,
> +	8613,  8595,  8577,  8560,  8542,  8525,  8508,  8490,  8473,  8456,  8439,
> +	8422,  8405,  8389,  8372,  8355,  8339,  8322,  8306,  8289,  8273,  8257,
> +	8240,  8224,  8208,  8192,
> +};
> +
> +static int rockchip_vpu981_get_frame_index(struct hantro_ctx *ctx, int ref)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	u64 timestamp;
> +	int i, idx = frame->ref_frame_idx[ref];
> +
> +	if (idx >= V4L2_AV1_TOTAL_REFS_PER_FRAME || idx < 0)
> +		return AV1_INVALID_IDX;
> +
> +	timestamp = frame->reference_frame_ts[idx];
> +	for (i = 0; i < AV1_MAX_FRAME_BUF_COUNT; i++) {
> +		if (!av1_dec->frame_refs[i].used)
> +			continue;
> +		if (av1_dec->frame_refs[i].timestamp == timestamp)
> +			return i;
> +	}
> +
> +	return AV1_INVALID_IDX;
> +}
> +
> +static int rockchip_vpu981_get_order_hint(struct hantro_ctx *ctx, int ref)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	int idx = rockchip_vpu981_get_frame_index(ctx, ref);
> +
> +	if (idx != AV1_INVALID_IDX)
> +		return av1_dec->frame_refs[idx].order_hint;
> +
> +	return 0;
> +}
> +
> +static int rockchip_vpu981_av1_dec_frame_ref(struct hantro_ctx *ctx,
> +					     u64 timestamp)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	int i;
> +
> +	for (i = 0; i < AV1_MAX_FRAME_BUF_COUNT; i++) {
> +		int j;
> +
> +		if (av1_dec->frame_refs[i].used)
> +			continue;
> +
> +		av1_dec->frame_refs[i].width = frame->frame_width_minus_1 + 1;
> +		av1_dec->frame_refs[i].height = frame->frame_height_minus_1 + 1;
> +		av1_dec->frame_refs[i].mi_cols = DIV_ROUND_UP(frame->frame_width_minus_1 + 1, 8);
> +		av1_dec->frame_refs[i].mi_rows = DIV_ROUND_UP(frame->frame_height_minus_1 + 1, 8);
> +		av1_dec->frame_refs[i].timestamp = timestamp;
> +		av1_dec->frame_refs[i].frame_type = frame->frame_type;
> +		av1_dec->frame_refs[i].order_hint = frame->order_hint;
> +		if (!av1_dec->frame_refs[i].vb2_ref)
> +			av1_dec->frame_refs[i].vb2_ref = hantro_get_dst_buf(ctx);
> +
> +		for (j = 0; j < V4L2_AV1_TOTAL_REFS_PER_FRAME; j++)
> +			av1_dec->frame_refs[i].order_hints[j] = frame->order_hints[j];
> +		av1_dec->frame_refs[i].used = true;
> +		av1_dec->current_frame_index = i;
> +
> +		return i;
> +	}
> +
> +	return AV1_INVALID_IDX;
> +}
> +
> +static void rockchip_vpu981_av1_dec_frame_unref(struct hantro_ctx *ctx, int idx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +
> +	if (idx >= 0)
> +		av1_dec->frame_refs[idx].used = false;
> +}
> +
> +static void rockchip_vpu981_av1_dec_clean_refs(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +
> +	int ref, idx;
> +
> +	for (idx = 0; idx < AV1_MAX_FRAME_BUF_COUNT; idx++) {
> +		u64 timestamp = av1_dec->frame_refs[idx].timestamp;
> +		bool used = false;
> +
> +		if (!av1_dec->frame_refs[idx].used)
> +			continue;
> +
> +		for (ref = 0; ref < V4L2_AV1_TOTAL_REFS_PER_FRAME; ref++) {
> +			if (ctrls->frame->reference_frame_ts[ref] == timestamp)
> +				used = true;
> +		}
> +
> +		if (!used)
> +			rockchip_vpu981_av1_dec_frame_unref(ctx, idx);
> +	}
> +}
> +
> +static size_t rockchip_vpu981_av1_dec_luma_size(struct hantro_ctx *ctx)
> +{
> +	return ctx->dst_fmt.width * ctx->dst_fmt.height * ctx->bit_depth / 8;
> +}
> +
> +static size_t rockchip_vpu981_av1_dec_chroma_size(struct hantro_ctx *ctx)
> +{
> +	size_t cr_offset = rockchip_vpu981_av1_dec_luma_size(ctx);
> +
> +	return ALIGN((cr_offset * 3) / 2, 64);
> +}
> +
> +static void rockchip_vpu981_av1_dec_tiles_free(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +
> +	if (av1_dec->db_data_col.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->db_data_col.size,
> +				  av1_dec->db_data_col.cpu,
> +				  av1_dec->db_data_col.dma);
> +	av1_dec->db_data_col.cpu = NULL;
> +
> +	if (av1_dec->db_ctrl_col.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->db_ctrl_col.size,
> +				  av1_dec->db_ctrl_col.cpu,
> +				  av1_dec->db_ctrl_col.dma);
> +	av1_dec->db_ctrl_col.cpu = NULL;
> +
> +	if (av1_dec->cdef_col.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->cdef_col.size,
> +				  av1_dec->cdef_col.cpu, av1_dec->cdef_col.dma);
> +	av1_dec->cdef_col.cpu = NULL;
> +
> +	if (av1_dec->sr_col.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->sr_col.size,
> +				  av1_dec->sr_col.cpu, av1_dec->sr_col.dma);
> +	av1_dec->sr_col.cpu = NULL;
> +
> +	if (av1_dec->lr_col.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->lr_col.size,
> +				  av1_dec->lr_col.cpu, av1_dec->lr_col.dma);
> +	av1_dec->lr_col.cpu = NULL;
> +}
> +
> +static int rockchip_vpu981_av1_dec_tiles_reallocate(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	unsigned int num_tile_cols = 1 << ctrls->tile_group_entry->tile_col;
> +	unsigned int height = ALIGN(ctrls->frame->frame_height_minus_1 + 1, 64);
> +	unsigned int height_in_sb = height / 64;
> +	unsigned int stripe_num = ((height + 8) + 63) / 64;
> +	size_t size;
> +
> +	if (av1_dec->db_data_col.size >=
> +	    ALIGN(height * 12 * ctx->bit_depth / 8, 128) * num_tile_cols)
> +		return 0;
> +
> +	rockchip_vpu981_av1_dec_tiles_free(ctx);
> +
> +	size = ALIGN(height * 12 * ctx->bit_depth / 8, 128) * num_tile_cols;
> +	av1_dec->db_data_col.cpu = dma_alloc_coherent(vpu->dev, size,
> +						      &av1_dec->db_data_col.dma,
> +						      GFP_KERNEL);
> +	if (!av1_dec->db_data_col.cpu)
> +		goto buffer_allocation_error;
> +	av1_dec->db_data_col.size = size;
> +
> +	size = ALIGN(height * 2 * 16 / 4, 128) * num_tile_cols;
> +	av1_dec->db_ctrl_col.cpu = dma_alloc_coherent(vpu->dev, size,
> +						      &av1_dec->db_ctrl_col.dma,
> +						      GFP_KERNEL);
> +	if (!av1_dec->db_ctrl_col.cpu)
> +		goto buffer_allocation_error;
> +	av1_dec->db_ctrl_col.size = size;
> +
> +	size = ALIGN(height_in_sb * 44 * ctx->bit_depth * 16 / 8, 128) * num_tile_cols;
> +	av1_dec->cdef_col.cpu = dma_alloc_coherent(vpu->dev, size,
> +						   &av1_dec->cdef_col.dma,
> +						   GFP_KERNEL);
> +	if (!av1_dec->cdef_col.cpu)
> +		goto buffer_allocation_error;
> +	av1_dec->cdef_col.size = size;
> +
> +	size = ALIGN(height_in_sb * (3040 + 1280), 128) * num_tile_cols;
> +	av1_dec->sr_col.cpu = dma_alloc_coherent(vpu->dev, size,
> +						 &av1_dec->sr_col.dma,
> +						 GFP_KERNEL);
> +	if (!av1_dec->sr_col.cpu)
> +		goto buffer_allocation_error;
> +	av1_dec->sr_col.size = size;
> +
> +	size = ALIGN(stripe_num * 1536 * ctx->bit_depth / 8, 128) * num_tile_cols;
> +	av1_dec->lr_col.cpu = dma_alloc_coherent(vpu->dev, size,
> +						 &av1_dec->lr_col.dma,
> +						 GFP_KERNEL);
> +	if (!av1_dec->lr_col.cpu)
> +		goto buffer_allocation_error;
> +	av1_dec->lr_col.size = size;
> +
> +	av1_dec->num_tile_cols_allocated = num_tile_cols;
> +	return 0;
> +
> +buffer_allocation_error:
> +	rockchip_vpu981_av1_dec_tiles_free(ctx);
> +	return -ENOMEM;
> +}
> +
> +void rockchip_vpu981_av1_dec_exit(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +
> +	if (av1_dec->global_model.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->global_model.size,
> +				  av1_dec->global_model.cpu,
> +				  av1_dec->global_model.dma);
> +	av1_dec->global_model.cpu = NULL;
> +
> +	if (av1_dec->tile_info.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->tile_info.size,
> +				  av1_dec->tile_info.cpu,
> +				  av1_dec->tile_info.dma);
> +	av1_dec->tile_info.cpu = NULL;
> +
> +	if (av1_dec->prob_tbl.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->prob_tbl.size,
> +				  av1_dec->prob_tbl.cpu, av1_dec->prob_tbl.dma);
> +	av1_dec->prob_tbl.cpu = NULL;
> +
> +	if (av1_dec->prob_tbl_out.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->prob_tbl_out.size,
> +				  av1_dec->prob_tbl_out.cpu,
> +				  av1_dec->prob_tbl_out.dma);
> +	av1_dec->prob_tbl_out.cpu = NULL;
> +
> +	if (av1_dec->tile_buf.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->tile_buf.size,
> +				  av1_dec->tile_buf.cpu, av1_dec->tile_buf.dma);
> +	av1_dec->tile_buf.cpu = NULL;
> +
> +	rockchip_vpu981_av1_dec_tiles_free(ctx);
> +}
> +
> +int rockchip_vpu981_av1_dec_init(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +
> +	memset(av1_dec, 0, sizeof(*av1_dec));
> +
> +	av1_dec->global_model.cpu = dma_alloc_coherent(vpu->dev, GLOBAL_MODEL_SIZE,
> +						       &av1_dec->global_model.dma,
> +						       GFP_KERNEL);
> +	if (!av1_dec->global_model.cpu)
> +		return -ENOMEM;
> +	av1_dec->global_model.size = GLOBAL_MODEL_SIZE;
> +
> +	av1_dec->tile_info.cpu = dma_alloc_coherent(vpu->dev, AV1_MAX_TILES,
> +						    &av1_dec->tile_info.dma,
> +						    GFP_KERNEL);
> +	if (!av1_dec->tile_info.cpu)
> +		return -ENOMEM;
> +	av1_dec->tile_info.size = AV1_MAX_TILES;
> +
> +	av1_dec->prob_tbl.cpu = dma_alloc_coherent(vpu->dev,
> +						   ALIGN(sizeof(struct av1cdfs), 2048),
> +						   &av1_dec->prob_tbl.dma,
> +						   GFP_KERNEL);
> +	if (!av1_dec->prob_tbl.cpu)
> +		return -ENOMEM;
> +	av1_dec->prob_tbl.size = ALIGN(sizeof(struct av1cdfs), 2048);
> +
> +	av1_dec->prob_tbl_out.cpu = dma_alloc_coherent(vpu->dev,
> +						       ALIGN(sizeof(struct av1cdfs), 2048),
> +						       &av1_dec->prob_tbl_out.dma,
> +						       GFP_KERNEL);
> +	if (!av1_dec->prob_tbl_out.cpu)
> +		return -ENOMEM;
> +	av1_dec->prob_tbl_out.size = ALIGN(sizeof(struct av1cdfs), 2048);
> +	av1_dec->cdfs = &av1_dec->default_cdfs;
> +	av1_dec->cdfs_ndvc = &av1_dec->default_cdfs_ndvc;
> +
> +	rockchip_av1_set_default_cdfs(av1_dec->cdfs, av1_dec->cdfs_ndvc);
> +
> +	av1_dec->tile_buf.cpu = dma_alloc_coherent(vpu->dev,
> +						   AV1_TILE_SIZE,
> +						   &av1_dec->tile_buf.dma,
> +						   GFP_KERNEL);
> +	if (!av1_dec->tile_buf.cpu)
> +		return -ENOMEM;
> +	av1_dec->tile_buf.size = AV1_TILE_SIZE;
> +
> +	return 0;
> +}
> +
> +static int rockchip_vpu981_av1_dec_prepare_run(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +
> +	ctrls->sequence = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_SEQUENCE);
> +	if (WARN_ON(!ctrls->sequence))
> +		return -EINVAL;
> +
> +	ctrls->tile_group_entry =
> +	    hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY);
> +	if (WARN_ON(!ctrls->tile_group_entry))
> +		return -EINVAL;
> +
> +	ctrls->frame = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_FRAME);
> +	if (WARN_ON(!ctrls->frame))
> +		return -EINVAL;
> +
> +	ctrls->film_grain =
> +	    hantro_get_ctrl(ctx, V4L2_CID_STATELESS_AV1_FILM_GRAIN);
> +
> +	return rockchip_vpu981_av1_dec_tiles_reallocate(ctx);
> +}
> +
> +static inline int rockchip_vpu981_av1_dec_get_msb(u32 n)
> +{
> +	if (n == 0)
> +		return 0;
> +	return 31 ^ __builtin_clz(n);
> +}
> +
> +static short rockchip_vpu981_av1_dec_resolve_divisor_32(u32 d, short *shift)
> +{
> +	int f;
> +	u64 e;
> +
> +	*shift = rockchip_vpu981_av1_dec_get_msb(d);
> +	/* e is obtained from D after resetting the most significant 1 bit. */
> +	e = d - ((u32)1 << *shift);
> +	/* Get the most significant DIV_LUT_BITS (8) bits of e into f */
> +	if (*shift > DIV_LUT_BITS)
> +		f = AV1_DIV_ROUND_UP_POW2(e, *shift - DIV_LUT_BITS);
> +	else
> +		f = e << (DIV_LUT_BITS - *shift);
> +	if (f > DIV_LUT_NUM)
> +		return -1;
> +	*shift += DIV_LUT_PREC_BITS;
> +	/* Use f as lookup into the precomputed table of multipliers */
> +	return div_lut[f];
> +}
> +
> +static void
> +rockchip_vpu981_av1_dec_get_shear_params(const u32 *params, s64 *alpha,
> +					 s64 *beta, s64 *gamma, s64 *delta)
> +{
> +	const int *mat = params;
> +	short shift;
> +	short y;
> +	long long gv, dv;
> +
> +	if (mat[2] <= 0)
> +		return;
> +
> +	*alpha = clamp_val(mat[2] - (1 << WARPEDMODEL_PREC_BITS), S16_MIN, S16_MAX);
> +	*beta = clamp_val(mat[3], S16_MIN, S16_MAX);
> +
> +	y = rockchip_vpu981_av1_dec_resolve_divisor_32(abs(mat[2]), &shift) * (mat[2] < 0 ? -1 : 1);
> +
> +	gv = ((long long)mat[4] * (1 << WARPEDMODEL_PREC_BITS)) * y;
> +
> +	*gamma = clamp_val((int)AV1_DIV_ROUND_UP_POW2_SIGNED(gv, shift), S16_MIN, S16_MAX);
> +
> +	dv = ((long long)mat[3] * mat[4]) * y;
> +	*delta = clamp_val(mat[5] -
> +		(int)AV1_DIV_ROUND_UP_POW2_SIGNED(dv, shift) - (1 << WARPEDMODEL_PREC_BITS),
> +		S16_MIN, S16_MAX);
> +
> +	*alpha = AV1_DIV_ROUND_UP_POW2_SIGNED(*alpha, WARP_PARAM_REDUCE_BITS)
> +		 * (1 << WARP_PARAM_REDUCE_BITS);
> +	*beta = AV1_DIV_ROUND_UP_POW2_SIGNED(*beta, WARP_PARAM_REDUCE_BITS)
> +		* (1 << WARP_PARAM_REDUCE_BITS);
> +	*gamma = AV1_DIV_ROUND_UP_POW2_SIGNED(*gamma, WARP_PARAM_REDUCE_BITS)
> +		 * (1 << WARP_PARAM_REDUCE_BITS);
> +	*delta = AV1_DIV_ROUND_UP_POW2_SIGNED(*delta, WARP_PARAM_REDUCE_BITS)
> +		* (1 << WARP_PARAM_REDUCE_BITS);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_global_model(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_global_motion *gm = &frame->global_motion;
> +	u8 *dst = av1_dec->global_model.cpu;
> +	struct hantro_dev *vpu = ctx->dev;
> +	int ref_frame, i;
> +
> +	memset(dst, 0, GLOBAL_MODEL_SIZE);
> +	for (ref_frame = 0; ref_frame < V4L2_AV1_REFS_PER_FRAME; ++ref_frame) {
> +		s64 alpha = 0, beta = 0, gamma = 0, delta = 0;
> +
> +		for (i = 0; i < 6; ++i) {
> +			if (i == 2)
> +				*(s32 *)dst =
> +					gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][3];
> +			else if (i == 3)
> +				*(s32 *)dst =
> +					gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][2];
> +			else
> +				*(s32 *)dst =
> +					gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][i];
> +			dst += 4;
> +		}
> +
> +		if (gm->type[V4L2_AV1_REF_LAST_FRAME + ref_frame] <= V4L2_AV1_WARP_MODEL_AFFINE)
> +			rockchip_vpu981_av1_dec_get_shear_params(&gm->params[V4L2_AV1_REF_LAST_FRAME + ref_frame][0],
> +								 &alpha, &beta, &gamma, &delta);
> +
> +		*(s16 *)dst = alpha;
> +		dst += 2;
> +		*(s16 *)dst = beta;
> +		dst += 2;
> +		*(s16 *)dst = gamma;
> +		dst += 2;
> +		*(s16 *)dst = delta;
> +		dst += 2;
> +	}
> +
> +	hantro_write_addr(vpu, AV1_GLOBAL_MODEL, av1_dec->global_model.dma);
> +}
> +
> +static int rockchip_vpu981_av1_tile_log2(int target)
> +{
> +	int k;
> +
> +	/*
> +	 * returns the smallest value for k such that 1 << k is greater
> +         * than or equal to target
> +	 */
> +	for (k = 0; (1 << k) < target; k++);
> +
> +	return k;
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_tile_info(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	struct v4l2_av1_tile_info tile_info = ctrls->frame->tile_info;
> +	const struct v4l2_ctrl_av1_tile_group_entry *group_entry =
> +	    ctrls->tile_group_entry;
> +	int context_update_y =
> +	    tile_info.context_update_tile_id / tile_info.tile_cols;
> +	int context_update_x =
> +	    tile_info.context_update_tile_id % tile_info.tile_cols;
> +	int context_update_tile_id =
> +	    context_update_x * tile_info.tile_rows + context_update_y;
> +	u8 *dst = av1_dec->tile_info.cpu;
> +	struct hantro_dev *vpu = ctx->dev;
> +	int tile0, tile1;
> +
> +	memset(dst, 0, av1_dec->tile_info.size);
> +
> +	for (tile0 = 0; tile0 < tile_info.tile_cols; tile0++) {
> +		for (tile1 = 0; tile1 < tile_info.tile_rows; tile1++) {
> +			int tile_id = tile1 * tile_info.tile_cols + tile0;
> +			u32 start, end;
> +			u32 y0 =
> +			    tile_info.height_in_sbs_minus_1[tile1] + 1;
> +			u32 x0 = tile_info.width_in_sbs_minus_1[tile0] + 1;
> +
> +			// tile size in SB units (width,height)
> +			*dst++ = x0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +			*dst++ = y0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +			*dst++ = 0;
> +
> +			// tile start position
> +			start = group_entry[tile_id].tile_offset - group_entry[0].tile_offset;
> +			*dst++ = start & 255;
> +			*dst++ = (start >> 8) & 255;
> +			*dst++ = (start >> 16) & 255;
> +			*dst++ = (start >> 24) & 255;
> +
> +			// # of bytes in tile data
> +			end = start + group_entry[tile_id].tile_size;
> +			*dst++ = end & 255;
> +			*dst++ = (end >> 8) & 255;
> +			*dst++ = (end >> 16) & 255;
> +			*dst++ = (end >> 24) & 255;
> +		}
> +	}
> +
> +	hantro_reg_write(vpu, &av1_multicore_expect_context_update,
> +			 !!(context_update_x == 0));
> +	hantro_reg_write(vpu, &av1_tile_enable,
> +			 !!((tile_info.tile_cols > 1) || (tile_info.tile_rows > 1)));
> +	hantro_reg_write(vpu, &av1_num_tile_cols_8k, tile_info.tile_cols);
> +	hantro_reg_write(vpu, &av1_num_tile_rows_8k, tile_info.tile_rows);
> +	hantro_reg_write(vpu, &av1_context_update_tile_id,
> +			 context_update_tile_id);
> +	hantro_reg_write(vpu, &av1_tile_transpose, 1);
> +	if (rockchip_vpu981_av1_tile_log2(tile_info.tile_cols) ||
> +	    rockchip_vpu981_av1_tile_log2(tile_info.tile_rows))
> +		hantro_reg_write(vpu, &av1_dec_tile_size_mag, tile_info.tile_size_bytes - 1);
> +	else
> +		hantro_reg_write(vpu, &av1_dec_tile_size_mag, 3);
> +
> +	hantro_write_addr(vpu, AV1_TILE_BASE, av1_dec->tile_info.dma);
> +}
> +
> +static int rockchip_vpu981_av1_dec_get_dist(struct hantro_ctx *ctx,
> +					    int a, int b)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	int bits = ctrls->sequence->order_hint_bits - 1;
> +	int diff, m;
> +
> +	if (!ctrls->sequence->order_hint_bits)
> +		return 0;
> +
> +	diff = a - b;
> +	m = 1 << bits;
> +	diff = (diff & (m - 1)) - (diff & m);
> +
> +	return diff;
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_frame_sign_bias(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_ctrl_av1_sequence *sequence = ctrls->sequence;
> +	int i;
> +
> +	if (!sequence->order_hint_bits || IS_INTRA(frame->frame_type)) {
> +		for (i = 0; i < V4L2_AV1_TOTAL_REFS_PER_FRAME; i++)
> +			av1_dec->ref_frame_sign_bias[i] = 0;
> +
> +		return;
> +	}
> +	// Identify the nearest forward and backward references.
> +	for (i = 0; i < V4L2_AV1_TOTAL_REFS_PER_FRAME - 1; i++) {
> +		if (rockchip_vpu981_get_frame_index(ctx, i) >= 0) {
> +			int rel_off =
> +			    rockchip_vpu981_av1_dec_get_dist(ctx,
> +							     rockchip_vpu981_get_order_hint(ctx, i),
> +							     frame->order_hint);
> +			av1_dec->ref_frame_sign_bias[i + 1] = (rel_off <= 0) ? 0 : 1;
> +		}
> +	}
> +}
> +
> +static bool
> +rockchip_vpu981_av1_dec_set_ref(struct hantro_ctx *ctx, int ref, int idx,
> +				int width, int height)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_decoded_buffer *dst;
> +	dma_addr_t luma_addr, chroma_addr, mv_addr = 0;
> +	size_t cr_offset = rockchip_vpu981_av1_dec_luma_size(ctx);
> +	size_t mv_offset = rockchip_vpu981_av1_dec_chroma_size(ctx);
> +	int cur_width = frame->frame_width_minus_1 + 1;
> +	int cur_height = frame->frame_height_minus_1 + 1;
> +	int scale_width =
> +	    ((width << AV1_REF_SCALE_SHIFT) + cur_width / 2) / cur_width;
> +	int scale_height =
> +	    ((height << AV1_REF_SCALE_SHIFT) + cur_height / 2) / cur_height;
> +
> +	switch (ref) {
> +	case 0:
> +		hantro_reg_write(vpu, &av1_ref0_height, height);
> +		hantro_reg_write(vpu, &av1_ref0_width, width);
> +		hantro_reg_write(vpu, &av1_ref0_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref0_hor_scale, scale_height);
> +		break;
> +	case 1:
> +		hantro_reg_write(vpu, &av1_ref1_height, height);
> +		hantro_reg_write(vpu, &av1_ref1_width, width);
> +		hantro_reg_write(vpu, &av1_ref1_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref1_hor_scale, scale_height);
> +		break;
> +	case 2:
> +		hantro_reg_write(vpu, &av1_ref2_height, height);
> +		hantro_reg_write(vpu, &av1_ref2_width, width);
> +		hantro_reg_write(vpu, &av1_ref2_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref2_hor_scale, scale_height);
> +		break;
> +	case 3:
> +		hantro_reg_write(vpu, &av1_ref3_height, height);
> +		hantro_reg_write(vpu, &av1_ref3_width, width);
> +		hantro_reg_write(vpu, &av1_ref3_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref3_hor_scale, scale_height);
> +		break;
> +	case 4:
> +		hantro_reg_write(vpu, &av1_ref4_height, height);
> +		hantro_reg_write(vpu, &av1_ref4_width, width);
> +		hantro_reg_write(vpu, &av1_ref4_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref4_hor_scale, scale_height);
> +		break;
> +	case 5:
> +		hantro_reg_write(vpu, &av1_ref5_height, height);
> +		hantro_reg_write(vpu, &av1_ref5_width, width);
> +		hantro_reg_write(vpu, &av1_ref5_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref5_hor_scale, scale_height);
> +		break;
> +	case 6:
> +		hantro_reg_write(vpu, &av1_ref6_height, height);
> +		hantro_reg_write(vpu, &av1_ref6_width, width);
> +		hantro_reg_write(vpu, &av1_ref6_ver_scale, scale_width);
> +		hantro_reg_write(vpu, &av1_ref6_hor_scale, scale_height);
> +		break;
> +	default:
> +		pr_warn("AV1 invalid reference frame index\n");
> +	}
> +
> +	dst = vb2_to_hantro_decoded_buf(&av1_dec->frame_refs[idx].vb2_ref->vb2_buf);
> +	luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf);
> +	chroma_addr = luma_addr + cr_offset;
> +	mv_addr = luma_addr + mv_offset;
> +
> +	hantro_write_addr(vpu, AV1_REFERENCE_Y(ref), luma_addr);
> +	hantro_write_addr(vpu, AV1_REFERENCE_CB(ref), chroma_addr);
> +	hantro_write_addr(vpu, AV1_REFERENCE_MV(ref), mv_addr);
> +
> +	return (scale_width != (1 << AV1_REF_SCALE_SHIFT)) ||
> +		(scale_height != (1 << AV1_REF_SCALE_SHIFT));
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_sign_bias(struct hantro_ctx *ctx,
> +						  int ref, int val)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +
> +	switch (ref) {
> +	case 0:
> +		hantro_reg_write(vpu, &av1_ref0_sign_bias, val);
> +		break;
> +	case 1:
> +		hantro_reg_write(vpu, &av1_ref1_sign_bias, val);
> +		break;
> +	case 2:
> +		hantro_reg_write(vpu, &av1_ref2_sign_bias, val);
> +		break;
> +	case 3:
> +		hantro_reg_write(vpu, &av1_ref3_sign_bias, val);
> +		break;
> +	case 4:
> +		hantro_reg_write(vpu, &av1_ref4_sign_bias, val);
> +		break;
> +	case 5:
> +		hantro_reg_write(vpu, &av1_ref5_sign_bias, val);
> +		break;
> +	case 6:
> +		hantro_reg_write(vpu, &av1_ref6_sign_bias, val);
> +		break;
> +	default:
> +		pr_warn("AV1 invalid sign bias index\n");
> +		break;
> +	}
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_segmentation(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_segmentation *seg = &frame->segmentation;
> +	u32 segval[V4L2_AV1_MAX_SEGMENTS][V4L2_AV1_SEG_LVL_MAX] = { 0 };
> +	struct hantro_dev *vpu = ctx->dev;
> +	u8 segsign = 0, preskip_segid = 0, last_active_seg = 0, i, j;
> +
> +	if (!!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_ENABLED) &&
> +	    frame->primary_ref_frame < V4L2_AV1_REFS_PER_FRAME) {
> +		int idx = rockchip_vpu981_get_frame_index(ctx, frame->primary_ref_frame);
> +
> +		if (idx >= 0) {
> +			dma_addr_t luma_addr, mv_addr = 0;
> +			struct hantro_decoded_buffer *seg;
> +			size_t mv_offset = rockchip_vpu981_av1_dec_chroma_size(ctx);
> +
> +			seg = vb2_to_hantro_decoded_buf(&av1_dec->frame_refs[idx].vb2_ref->vb2_buf);
> +			luma_addr = hantro_get_dec_buf_addr(ctx, &seg->base.vb.vb2_buf);
> +			mv_addr = luma_addr + mv_offset;
> +
> +			hantro_write_addr(vpu, AV1_SEGMENTATION, mv_addr);
> +			hantro_reg_write(vpu, &av1_use_temporal3_mvs, 1);
> +		}
> +	}
> +
> +	hantro_reg_write(vpu, &av1_segment_temp_upd_e,
> +			 !!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_TEMPORAL_UPDATE));
> +	hantro_reg_write(vpu, &av1_segment_upd_e,
> +			 !!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_UPDATE_MAP));
> +	hantro_reg_write(vpu, &av1_segment_e,
> +			 !!(seg->flags & V4L2_AV1_SEGMENTATION_FLAG_ENABLED));
> +
> +	hantro_reg_write(vpu, &av1_error_resilient,
> +			 !!(frame->flags & V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE));
> +
> +	if (IS_INTRA(frame->frame_type) ||
> +	    !!(frame->flags & V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE)) {
> +		hantro_reg_write(vpu, &av1_use_temporal3_mvs, 0);
> +	}
> +
> +	if (seg->flags & V4L2_AV1_SEGMENTATION_FLAG_ENABLED) {
> +		int s;
> +
> +		for (s = 0; s < V4L2_AV1_MAX_SEGMENTS; s++) {
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_Q)) {
> +				segval[s][V4L2_AV1_SEG_LVL_ALT_Q] =
> +				    clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_Q]),
> +					  0, 255);
> +				segsign |=
> +					(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_Q] < 0) << s;
> +			}
> +
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_Y_V))
> +				segval[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_V] =
> +					clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]),
> +					      -63, 63);
> +
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_Y_H))
> +				segval[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_H] =
> +				    clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]),
> +					  -63, 63);
> +
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_U))
> +				segval[s][V4L2_AV1_SEG_LVL_ALT_LF_U] =
> +				    clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_U]),
> +					  -63, 63);
> +
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_LF_V))
> +				segval[s][V4L2_AV1_SEG_LVL_ALT_LF_V] =
> +				    clamp(abs(seg->feature_data[s][V4L2_AV1_SEG_LVL_ALT_LF_V]),
> +					  -63, 63);
> +
> +			if (frame->frame_type && seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_REF_FRAME))
> +				segval[s][V4L2_AV1_SEG_LVL_REF_FRAME]++;
> +
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_REF_SKIP))
> +				segval[s][V4L2_AV1_SEG_LVL_REF_SKIP] = 1;
> +
> +			if (seg->feature_enabled[s] &
> +			    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_REF_GLOBALMV))
> +				segval[s][V4L2_AV1_SEG_LVL_REF_GLOBALMV] = 1;
> +		}
> +	}
> +
> +	for (i = 0; i < V4L2_AV1_MAX_SEGMENTS; i++) {
> +		for (j = 0; j < V4L2_AV1_SEG_LVL_MAX; j++) {
> +			if (seg->feature_enabled[i]
> +			    & V4L2_AV1_SEGMENT_FEATURE_ENABLED(j)) {
> +				preskip_segid |= (j >= V4L2_AV1_SEG_LVL_REF_FRAME);
> +				last_active_seg = max(i, last_active_seg);
> +			}
> +		}
> +	}
> +
> +	hantro_reg_write(vpu, &av1_last_active_seg, last_active_seg);
> +	hantro_reg_write(vpu, &av1_preskip_segid, preskip_segid);
> +
> +	hantro_reg_write(vpu, &av1_seg_quant_sign, segsign);
> +
> +	/* Write QP, filter level, ref frame and skip for every segment */
> +	hantro_reg_write(vpu, &av1_quant_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg0,
> +			 segval[0][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg1,
> +			 segval[1][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg2,
> +			 segval[2][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg3,
> +			 segval[3][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg4,
> +			 segval[4][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg5,
> +			 segval[5][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg6,
> +			 segval[6][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +
> +	hantro_reg_write(vpu, &av1_quant_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_ALT_Q]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta0_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_Y_V]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta1_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_Y_H]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta2_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_U]);
> +	hantro_reg_write(vpu, &av1_filt_level_delta3_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_ALT_LF_V]);
> +	hantro_reg_write(vpu, &av1_refpic_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_REF_FRAME]);
> +	hantro_reg_write(vpu, &av1_skip_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_REF_SKIP]);
> +	hantro_reg_write(vpu, &av1_global_mv_seg7,
> +			 segval[7][V4L2_AV1_SEG_LVL_REF_GLOBALMV]);
> +}
> +
> +static bool rockchip_vpu981_av1_dec_is_lossless(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_segmentation *segmentation = &frame->segmentation;
> +	const struct v4l2_av1_quantization *quantization = &frame->quantization;
> +	int i;
> +
> +	for (i = 0; i < V4L2_AV1_MAX_SEGMENTS; i++) {
> +		int qindex = quantization->base_q_idx;
> +
> +		if (segmentation->feature_enabled[i] &
> +		    V4L2_AV1_SEGMENT_FEATURE_ENABLED(V4L2_AV1_SEG_LVL_ALT_Q)) {
> +			qindex += segmentation->feature_data[i][V4L2_AV1_SEG_LVL_ALT_Q];
> +		}
> +		qindex = clamp(qindex, 0, 255);
> +
> +		if (qindex ||
> +		    quantization->delta_q_y_dc ||
> +		    quantization->delta_q_u_dc ||
> +		    quantization->delta_q_u_ac ||
> +		    quantization->delta_q_v_dc ||
> +		    quantization->delta_q_v_ac)
> +			return false;
> +	}
> +	return true;
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_loopfilter(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_loop_filter *loop_filter = &frame->loop_filter;
> +	bool filtering_dis = (loop_filter->level[0] == 0) && (loop_filter->level[1] == 0);
> +	struct hantro_dev *vpu = ctx->dev;
> +
> +	hantro_reg_write(vpu, &av1_filtering_dis, filtering_dis);
> +	hantro_reg_write(vpu, &av1_filt_level_base_gt32, loop_filter->level[0] > 32);
> +	hantro_reg_write(vpu, &av1_filt_sharpness, loop_filter->sharpness);
> +
> +	hantro_reg_write(vpu, &av1_filt_level0, loop_filter->level[0]);
> +	hantro_reg_write(vpu, &av1_filt_level1, loop_filter->level[1]);
> +	hantro_reg_write(vpu, &av1_filt_level2, loop_filter->level[2]);
> +	hantro_reg_write(vpu, &av1_filt_level3, loop_filter->level[3]);
> +
> +	if (loop_filter->flags & V4L2_AV1_LOOP_FILTER_FLAG_DELTA_ENABLED &&
> +	    !rockchip_vpu981_av1_dec_is_lossless(ctx) &&
> +	    !(frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC)) {
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_0,
> +				 loop_filter->ref_deltas[0]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_1,
> +				 loop_filter->ref_deltas[1]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_2,
> +				 loop_filter->ref_deltas[2]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_3,
> +				 loop_filter->ref_deltas[3]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_4,
> +				 loop_filter->ref_deltas[4]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_5,
> +				 loop_filter->ref_deltas[5]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_6,
> +				 loop_filter->ref_deltas[6]);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_7,
> +				 loop_filter->ref_deltas[7]);
> +		hantro_reg_write(vpu, &av1_filt_mb_adj_0,
> +				 loop_filter->mode_deltas[0]);
> +		hantro_reg_write(vpu, &av1_filt_mb_adj_1,
> +				 loop_filter->mode_deltas[1]);
> +	} else {
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_0, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_1, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_2, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_3, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_4, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_5, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_6, 0);
> +		hantro_reg_write(vpu, &av1_filt_ref_adj_7, 0);
> +		hantro_reg_write(vpu, &av1_filt_mb_adj_0, 0);
> +		hantro_reg_write(vpu, &av1_filt_mb_adj_1, 0);
> +	}
> +
> +	hantro_write_addr(vpu, AV1_DB_DATA_COL, av1_dec->db_data_col.dma);
> +	hantro_write_addr(vpu, AV1_DB_CTRL_COL, av1_dec->db_ctrl_col.dma);
> +}
> +
> +static void rockchip_vpu981_av1_dec_update_prob(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	bool frame_is_intra = IS_INTRA(frame->frame_type);
> +	struct av1cdfs *out_cdfs = (struct av1cdfs *)av1_dec->prob_tbl_out.cpu;
> +	int i;
> +
> +	if (frame->flags & V4L2_AV1_FRAME_FLAG_DISABLE_FRAME_END_UPDATE_CDF)
> +		return;
> +
> +	for (i = 0; i < NUM_REF_FRAMES; i++) {
> +		if (frame->refresh_frame_flags & (1 << i)) {
> +			struct mvcdfs stored_mv_cdf;
> +
> +			rockchip_av1_get_cdfs(ctx, i);
> +			stored_mv_cdf = av1_dec->cdfs->mv_cdf;
> +			*av1_dec->cdfs = *out_cdfs;
> +			if (frame_is_intra) {
> +				av1_dec->cdfs->mv_cdf = stored_mv_cdf;
> +				*av1_dec->cdfs_ndvc = out_cdfs->mv_cdf;
> +			}
> +			rockchip_av1_store_cdfs(ctx,
> +						frame->refresh_frame_flags);
> +			break;
> +		}
> +	}
> +}
> +
> +void rockchip_vpu981_av1_dec_done(struct hantro_ctx *ctx)
> +{
> +	rockchip_vpu981_av1_dec_update_prob(ctx);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_prob(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_quantization *quantization = &frame->quantization;
> +	struct hantro_dev *vpu = ctx->dev;
> +	bool error_resilient_mode =
> +	    !!(frame->flags & V4L2_AV1_FRAME_FLAG_ERROR_RESILIENT_MODE);
> +	bool frame_is_intra = IS_INTRA(frame->frame_type);
> +
> +	if (error_resilient_mode || frame_is_intra ||
> +	    frame->primary_ref_frame == AV1_PRIMARY_REF_NONE) {
> +		av1_dec->cdfs = &av1_dec->default_cdfs;
> +		av1_dec->cdfs_ndvc = &av1_dec->default_cdfs_ndvc;
> +		rockchip_av1_default_coeff_probs(quantization->base_q_idx,
> +						 av1_dec->cdfs);
> +	} else {
> +		rockchip_av1_get_cdfs(ctx, frame->ref_frame_idx[frame->primary_ref_frame]);
> +	}
> +	rockchip_av1_store_cdfs(ctx, frame->refresh_frame_flags);
> +
> +	memcpy(av1_dec->prob_tbl.cpu, av1_dec->cdfs, sizeof(struct av1cdfs));
> +
> +	if (frame_is_intra) {
> +		int mv_offset = offsetof(struct av1cdfs, mv_cdf);
> +		/* Overwrite MV context area with intrabc MV context */
> +		memcpy(av1_dec->prob_tbl.cpu + mv_offset, av1_dec->cdfs_ndvc,
> +		       sizeof(struct mvcdfs));
> +	}
> +
> +	hantro_write_addr(vpu, AV1_PROP_TABLE_OUT, av1_dec->prob_tbl_out.dma);
> +	hantro_write_addr(vpu, AV1_PROP_TABLE, av1_dec->prob_tbl.dma);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_cdef(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_cdef *cdef = &frame->cdef;
> +	struct hantro_dev *vpu = ctx->dev;
> +	u32 luma_pri_strength = 0;
> +	u16 luma_sec_strength = 0;
> +	u32 chroma_pri_strength = 0;
> +	u16 chroma_sec_strength = 0;
> +	int i;
> +
> +	hantro_reg_write(vpu, &av1_cdef_bits, cdef->bits);
> +	hantro_reg_write(vpu, &av1_cdef_damping, cdef->damping_minus_3);
> +
> +	for (i = 0; i < (1 << cdef->bits); i++) {
> +		luma_pri_strength |= cdef->y_pri_strength[i] << (i * 4);
> +		if (cdef->y_sec_strength[i] == 4)
> +			luma_sec_strength |= 3 << (i * 2);
> +		else
> +			luma_sec_strength |= cdef->y_sec_strength[i] << (i * 2);
> +
> +		chroma_pri_strength |= cdef->uv_pri_strength[i] << (i * 4);
> +		if (cdef->uv_sec_strength[i] == 4)
> +			chroma_sec_strength |= 3 << (i * 2);
> +		else
> +			chroma_sec_strength |= cdef->uv_sec_strength[i] << (i * 2);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_cdef_luma_primary_strength,
> +			 luma_pri_strength);
> +	hantro_reg_write(vpu, &av1_cdef_luma_secondary_strength,
> +			 luma_sec_strength);
> +	hantro_reg_write(vpu, &av1_cdef_chroma_primary_strength,
> +			 chroma_pri_strength);
> +	hantro_reg_write(vpu, &av1_cdef_chroma_secondary_strength,
> +			 chroma_sec_strength);
> +
> +	hantro_write_addr(vpu, AV1_CDEF_COL, av1_dec->cdef_col.dma);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_lr(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	const struct v4l2_av1_loop_restoration *loop_restoration =
> +	    &frame->loop_restoration;
> +	struct hantro_dev *vpu = ctx->dev;
> +	u16 lr_type = 0, lr_unit_size = 0;
> +	u8 restoration_unit_size[V4L2_AV1_NUM_PLANES_MAX] = { 3, 3, 3 };
> +	int i;
> +
> +	if (loop_restoration->flags & V4L2_AV1_LOOP_RESTORATION_FLAG_USES_LR) {
> +		restoration_unit_size[0] = 1 + loop_restoration->lr_unit_shift;
> +		restoration_unit_size[1] =
> +		    1 + loop_restoration->lr_unit_shift - loop_restoration->lr_uv_shift;
> +		restoration_unit_size[2] =
> +		    1 + loop_restoration->lr_unit_shift - loop_restoration->lr_uv_shift;
> +	}
> +
> +	for (i = 0; i < V4L2_AV1_NUM_PLANES_MAX; i++) {
> +		lr_type |=
> +		    loop_restoration->frame_restoration_type[i] << (i * 2);
> +		lr_unit_size |= restoration_unit_size[i] << (i * 2);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_lr_type, lr_type);
> +	hantro_reg_write(vpu, &av1_lr_unit_size, lr_unit_size);
> +	hantro_write_addr(vpu, AV1_LR_COL, av1_dec->lr_col.dma);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_superres_params(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	struct hantro_dev *vpu = ctx->dev;
> +	u8 superres_scale_denominator = SCALE_NUMERATOR;
> +	int superres_luma_step = RS_SCALE_SUBPEL_BITS;
> +	int superres_chroma_step = RS_SCALE_SUBPEL_BITS;
> +	int superres_luma_step_invra = RS_SCALE_SUBPEL_BITS;
> +	int superres_chroma_step_invra = RS_SCALE_SUBPEL_BITS;
> +	int superres_init_luma_subpel_x = 0;
> +	int superres_init_chroma_subpel_x = 0;
> +	int superres_is_scaled = 0;
> +	int min_w = min_t(uint32_t, 16, frame->upscaled_width);
> +	int upscaled_luma, downscaled_luma;
> +	int downscaled_chroma, upscaled_chroma;
> +	int step_luma, step_chroma;
> +	int err_luma, err_chroma;
> +	int initial_luma, initial_chroma;
> +	int width = 0;
> +
> +	if (frame->flags & V4L2_AV1_FRAME_FLAG_USE_SUPERRES)
> +		superres_scale_denominator = frame->superres_denom;
> +
> +	if (superres_scale_denominator <= SCALE_NUMERATOR)
> +		goto set_regs;
> +
> +	width = (frame->upscaled_width * SCALE_NUMERATOR +
> +		(superres_scale_denominator / 2)) / superres_scale_denominator;
> +
> +	if (width < min_w)
> +		width = min_w;
> +
> +	if (width == frame->upscaled_width)
> +		goto set_regs;
> +
> +	superres_is_scaled = 1;
> +	upscaled_luma = frame->upscaled_width;
> +	downscaled_luma = width;
> +	downscaled_chroma = (downscaled_luma + 1) >> 1;
> +	upscaled_chroma = (upscaled_luma + 1) >> 1;
> +	step_luma =
> +		((downscaled_luma << RS_SCALE_SUBPEL_BITS) +
> +		 (upscaled_luma / 2)) / upscaled_luma;
> +	step_chroma =
> +		((downscaled_chroma << RS_SCALE_SUBPEL_BITS) +
> +		 (upscaled_chroma / 2)) / upscaled_chroma;
> +	err_luma =
> +		(upscaled_luma * step_luma)
> +		- (downscaled_luma << RS_SCALE_SUBPEL_BITS);
> +	err_chroma =
> +		(upscaled_chroma * step_chroma)
> +		- (downscaled_chroma << RS_SCALE_SUBPEL_BITS);
> +	initial_luma =
> +		((-((upscaled_luma - downscaled_luma) << (RS_SCALE_SUBPEL_BITS - 1))
> +		  + upscaled_luma / 2)
> +		 / upscaled_luma + (1 << (RS_SCALE_EXTRA_BITS - 1)) - err_luma / 2)
> +		& RS_SCALE_SUBPEL_MASK;
> +	initial_chroma =
> +		((-((upscaled_chroma - downscaled_chroma) << (RS_SCALE_SUBPEL_BITS - 1))
> +		  + upscaled_chroma / 2)
> +		 / upscaled_chroma + (1 << (RS_SCALE_EXTRA_BITS - 1)) - err_chroma / 2)
> +		& RS_SCALE_SUBPEL_MASK;
> +	superres_luma_step = step_luma;
> +	superres_chroma_step = step_chroma;
> +	superres_luma_step_invra =
> +		((upscaled_luma << RS_SCALE_SUBPEL_BITS) + (downscaled_luma / 2))
> +		/ downscaled_luma;
> +	superres_chroma_step_invra =
> +		((upscaled_chroma << RS_SCALE_SUBPEL_BITS) + (downscaled_chroma / 2))
> +		/ downscaled_chroma;
> +	superres_init_luma_subpel_x = initial_luma;
> +	superres_init_chroma_subpel_x = initial_chroma;
> +
> +set_regs:
> +	hantro_reg_write(vpu, &av1_superres_pic_width, frame->upscaled_width);
> +
> +	if (frame->flags & V4L2_AV1_FRAME_FLAG_USE_SUPERRES)
> +		hantro_reg_write(vpu, &av1_scale_denom_minus9,
> +				 frame->superres_denom - SUPERRES_SCALE_DENOMINATOR_MIN);
> +	else
> +		hantro_reg_write(vpu, &av1_scale_denom_minus9, frame->superres_denom);
> +
> +	hantro_reg_write(vpu, &av1_superres_luma_step, superres_luma_step);
> +	hantro_reg_write(vpu, &av1_superres_chroma_step, superres_chroma_step);
> +	hantro_reg_write(vpu, &av1_superres_luma_step_invra,
> +			 superres_luma_step_invra);
> +	hantro_reg_write(vpu, &av1_superres_chroma_step_invra,
> +			 superres_chroma_step_invra);
> +	hantro_reg_write(vpu, &av1_superres_init_luma_subpel_x,
> +			 superres_init_luma_subpel_x);
> +	hantro_reg_write(vpu, &av1_superres_init_chroma_subpel_x,
> +			 superres_init_chroma_subpel_x);
> +	hantro_reg_write(vpu, &av1_superres_is_scaled, superres_is_scaled);
> +
> +	hantro_write_addr(vpu, AV1_SR_COL, av1_dec->sr_col.dma);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_picture_dimensions(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	struct hantro_dev *vpu = ctx->dev;
> +	int pic_width_in_cbs = DIV_ROUND_UP(frame->frame_width_minus_1 + 1, 8);
> +	int pic_height_in_cbs = DIV_ROUND_UP(frame->frame_height_minus_1 + 1, 8);
> +	int pic_width_pad = ALIGN(frame->frame_width_minus_1 + 1, 8)
> +			    - (frame->frame_width_minus_1 + 1);
> +	int pic_height_pad = ALIGN(frame->frame_height_minus_1 + 1, 8)
> +			     - (frame->frame_height_minus_1 + 1);
> +
> +	hantro_reg_write(vpu, &av1_pic_width_in_cbs, pic_width_in_cbs);
> +	hantro_reg_write(vpu, &av1_pic_height_in_cbs, pic_height_in_cbs);
> +	hantro_reg_write(vpu, &av1_pic_width_pad, pic_width_pad);
> +	hantro_reg_write(vpu, &av1_pic_height_pad, pic_height_pad);
> +
> +	rockchip_vpu981_av1_dec_set_superres_params(ctx);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_other_frames(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	struct hantro_dev *vpu = ctx->dev;
> +	bool use_ref_frame_mvs =
> +	    !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS);
> +	int cur_frame_offset = frame->order_hint;
> +	int alt_frame_offset = 0;
> +	int gld_frame_offset = 0;
> +	int bwd_frame_offset = 0;
> +	int alt2_frame_offset = 0;
> +	int refs_selected[3] = { 0, 0, 0 };
> +	int cur_mi_cols = DIV_ROUND_UP(frame->frame_width_minus_1 + 1, 8);
> +	int cur_mi_rows = DIV_ROUND_UP(frame->frame_height_minus_1 + 1, 8);
> +	int cur_offset[V4L2_AV1_TOTAL_REFS_PER_FRAME - 1];
> +	int cur_roffset[V4L2_AV1_TOTAL_REFS_PER_FRAME - 1];
> +	int mf_types[3] = { 0, 0, 0 };
> +	int ref_stamp = 2;
> +	int ref_ind = 0;
> +	int rf, idx;
> +
> +	alt_frame_offset = rockchip_vpu981_get_order_hint(ctx, ALT_BUF_IDX);
> +	gld_frame_offset = rockchip_vpu981_get_order_hint(ctx, GLD_BUF_IDX);
> +	bwd_frame_offset = rockchip_vpu981_get_order_hint(ctx, BWD_BUF_IDX);
> +	alt2_frame_offset = rockchip_vpu981_get_order_hint(ctx, ALT2_BUF_IDX);
> +
> +	idx = rockchip_vpu981_get_frame_index(ctx, LST_BUF_IDX);
> +	if (idx >= 0) {
> +		int alt_frame_offset_in_lst =
> +			av1_dec->frame_refs[idx].order_hints[V4L2_AV1_REF_ALTREF_FRAME];
> +		bool is_lst_overlay =
> +		    (alt_frame_offset_in_lst == gld_frame_offset);
> +
> +		if (!is_lst_overlay) {
> +			int lst_mi_cols = av1_dec->frame_refs[idx].mi_cols;
> +			int lst_mi_rows = av1_dec->frame_refs[idx].mi_rows;
> +			bool lst_intra_only =
> +			    IS_INTRA(av1_dec->frame_refs[idx].frame_type);
> +
> +			if (lst_mi_cols == cur_mi_cols &&
> +			    lst_mi_rows == cur_mi_rows && !lst_intra_only) {
> +				mf_types[ref_ind] = V4L2_AV1_REF_LAST_FRAME;
> +				refs_selected[ref_ind++] = LST_BUF_IDX;
> +			}
> +		}
> +		ref_stamp--;
> +	}
> +
> +	idx = rockchip_vpu981_get_frame_index(ctx, BWD_BUF_IDX);
> +	if (rockchip_vpu981_av1_dec_get_dist(ctx, bwd_frame_offset, cur_frame_offset) > 0) {
> +		int bwd_mi_cols = av1_dec->frame_refs[idx].mi_cols;
> +		int bwd_mi_rows = av1_dec->frame_refs[idx].mi_rows;
> +		bool bwd_intra_only =
> +		    IS_INTRA(av1_dec->frame_refs[idx].frame_type);
> +
> +		if (bwd_mi_cols == cur_mi_cols && bwd_mi_rows == cur_mi_rows &&
> +		    !bwd_intra_only) {
> +			mf_types[ref_ind] = V4L2_AV1_REF_BWDREF_FRAME;
> +			refs_selected[ref_ind++] = BWD_BUF_IDX;
> +			ref_stamp--;
> +		}
> +	}
> +
> +	idx = rockchip_vpu981_get_frame_index(ctx, ALT2_BUF_IDX);
> +	if (rockchip_vpu981_av1_dec_get_dist(ctx, alt2_frame_offset, cur_frame_offset) > 0) {
> +		int alt2_mi_cols = av1_dec->frame_refs[idx].mi_cols;
> +		int alt2_mi_rows = av1_dec->frame_refs[idx].mi_rows;
> +		bool alt2_intra_only =
> +		    IS_INTRA(av1_dec->frame_refs[idx].frame_type);
> +
> +		if (alt2_mi_cols == cur_mi_cols && alt2_mi_rows == cur_mi_rows &&
> +		    !alt2_intra_only) {
> +			mf_types[ref_ind] = V4L2_AV1_REF_ALTREF2_FRAME;
> +			refs_selected[ref_ind++] = ALT2_BUF_IDX;
> +			ref_stamp--;
> +		}
> +	}
> +
> +	idx = rockchip_vpu981_get_frame_index(ctx, ALT_BUF_IDX);
> +	if (rockchip_vpu981_av1_dec_get_dist(ctx, alt_frame_offset, cur_frame_offset) > 0 &&
> +	    ref_stamp >= 0) {
> +		int alt_mi_cols = av1_dec->frame_refs[idx].mi_cols;
> +		int alt_mi_rows = av1_dec->frame_refs[idx].mi_rows;
> +		bool alt_intra_only =
> +		    IS_INTRA(av1_dec->frame_refs[idx].frame_type);
> +
> +		if (alt_mi_cols == cur_mi_cols && alt_mi_rows == cur_mi_rows &&
> +		    !alt_intra_only) {
> +			mf_types[ref_ind] = V4L2_AV1_REF_ALTREF_FRAME;
> +			refs_selected[ref_ind++] = ALT_BUF_IDX;
> +			ref_stamp--;
> +		}
> +	}
> +
> +	idx = rockchip_vpu981_get_frame_index(ctx, LST2_BUF_IDX);
> +	if (idx >= 0 && ref_stamp >= 0) {
> +		int lst2_mi_cols = av1_dec->frame_refs[idx].mi_cols;
> +		int lst2_mi_rows = av1_dec->frame_refs[idx].mi_rows;
> +		bool lst2_intra_only =
> +		    IS_INTRA(av1_dec->frame_refs[idx].frame_type);
> +
> +		if (lst2_mi_cols == cur_mi_cols && lst2_mi_rows == cur_mi_rows &&
> +		    !lst2_intra_only) {
> +			mf_types[ref_ind] = V4L2_AV1_REF_LAST2_FRAME;
> +			refs_selected[ref_ind++] = LST2_BUF_IDX;
> +			ref_stamp--;
> +		}
> +	}
> +
> +	for (rf = 0; rf < V4L2_AV1_TOTAL_REFS_PER_FRAME - 1; ++rf) {
> +		idx = rockchip_vpu981_get_frame_index(ctx, rf);
> +		if (idx >= 0) {
> +			int rf_order_hint = rockchip_vpu981_get_order_hint(ctx, rf);
> +
> +			cur_offset[rf] =
> +			    rockchip_vpu981_av1_dec_get_dist(ctx, cur_frame_offset, rf_order_hint);
> +			cur_roffset[rf] =
> +			    rockchip_vpu981_av1_dec_get_dist(ctx, rf_order_hint, cur_frame_offset);
> +		} else {
> +			cur_offset[rf] = 0;
> +			cur_roffset[rf] = 0;
> +		}
> +	}
> +
> +	hantro_reg_write(vpu, &av1_use_temporal0_mvs, 0);
> +	hantro_reg_write(vpu, &av1_use_temporal1_mvs, 0);
> +	hantro_reg_write(vpu, &av1_use_temporal2_mvs, 0);
> +	hantro_reg_write(vpu, &av1_use_temporal3_mvs, 0);
> +
> +	hantro_reg_write(vpu, &av1_mf1_last_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf1_last2_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf1_last3_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf1_golden_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf1_bwdref_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf1_altref2_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf1_altref_offset, 0);
> +
> +	if (use_ref_frame_mvs && ref_ind > 0 &&
> +	    cur_offset[mf_types[0] - V4L2_AV1_REF_LAST_FRAME] <= MAX_FRAME_DISTANCE &&
> +	    cur_offset[mf_types[0] - V4L2_AV1_REF_LAST_FRAME] >= -MAX_FRAME_DISTANCE) {
> +		int rf = rockchip_vpu981_get_order_hint(ctx, refs_selected[0]);
> +		int idx = rockchip_vpu981_get_frame_index(ctx, refs_selected[0]);
> +		u32 *oh = av1_dec->frame_refs[idx].order_hints;
> +		int val;
> +
> +		hantro_reg_write(vpu, &av1_use_temporal0_mvs, 1);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_last_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST2_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_last2_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST3_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_last3_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_GOLDEN_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_golden_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_BWDREF_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_bwdref_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF2_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_altref2_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf1_altref_offset, val);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_mf2_last_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf2_last2_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf2_last3_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf2_golden_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf2_bwdref_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf2_altref2_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf2_altref_offset, 0);
> +
> +	if (use_ref_frame_mvs && ref_ind > 1 &&
> +	    cur_offset[mf_types[1] - V4L2_AV1_REF_LAST_FRAME] <= MAX_FRAME_DISTANCE &&
> +	    cur_offset[mf_types[1] - V4L2_AV1_REF_LAST_FRAME] >= -MAX_FRAME_DISTANCE) {
> +		int rf = rockchip_vpu981_get_order_hint(ctx, refs_selected[1]);
> +		int idx = rockchip_vpu981_get_frame_index(ctx, refs_selected[1]);
> +		u32 *oh = av1_dec->frame_refs[idx].order_hints;
> +		int val;
> +
> +		hantro_reg_write(vpu, &av1_use_temporal1_mvs, 1);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_last_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST2_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_last2_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST3_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_last3_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_GOLDEN_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_golden_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_BWDREF_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_bwdref_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF2_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_altref2_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf2_altref_offset, val);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_mf3_last_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf3_last2_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf3_last3_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf3_golden_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf3_bwdref_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf3_altref2_offset, 0);
> +	hantro_reg_write(vpu, &av1_mf3_altref_offset, 0);
> +
> +	if (use_ref_frame_mvs && ref_ind > 2 &&
> +	    cur_offset[mf_types[2] - V4L2_AV1_REF_LAST_FRAME] <= MAX_FRAME_DISTANCE &&
> +	    cur_offset[mf_types[2] - V4L2_AV1_REF_LAST_FRAME] >= -MAX_FRAME_DISTANCE) {
> +		int rf = rockchip_vpu981_get_order_hint(ctx, refs_selected[2]);
> +		int idx = rockchip_vpu981_get_frame_index(ctx, refs_selected[2]);
> +		u32 *oh = av1_dec->frame_refs[idx].order_hints;
> +		int val;
> +
> +		hantro_reg_write(vpu, &av1_use_temporal2_mvs, 1);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_last_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST2_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_last2_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_LAST3_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_last3_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_GOLDEN_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_golden_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_BWDREF_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_bwdref_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF2_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_altref2_offset, val);
> +
> +		val = rockchip_vpu981_av1_dec_get_dist(ctx, rf, oh[V4L2_AV1_REF_ALTREF_FRAME]);
> +		hantro_reg_write(vpu, &av1_mf3_altref_offset, val);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_cur_last_offset, cur_offset[0]);
> +	hantro_reg_write(vpu, &av1_cur_last2_offset, cur_offset[1]);
> +	hantro_reg_write(vpu, &av1_cur_last3_offset, cur_offset[2]);
> +	hantro_reg_write(vpu, &av1_cur_golden_offset, cur_offset[3]);
> +	hantro_reg_write(vpu, &av1_cur_bwdref_offset, cur_offset[4]);
> +	hantro_reg_write(vpu, &av1_cur_altref2_offset, cur_offset[5]);
> +	hantro_reg_write(vpu, &av1_cur_altref_offset, cur_offset[6]);
> +
> +	hantro_reg_write(vpu, &av1_cur_last_roffset, cur_roffset[0]);
> +	hantro_reg_write(vpu, &av1_cur_last2_roffset, cur_roffset[1]);
> +	hantro_reg_write(vpu, &av1_cur_last3_roffset, cur_roffset[2]);
> +	hantro_reg_write(vpu, &av1_cur_golden_roffset, cur_roffset[3]);
> +	hantro_reg_write(vpu, &av1_cur_bwdref_roffset, cur_roffset[4]);
> +	hantro_reg_write(vpu, &av1_cur_altref2_roffset, cur_roffset[5]);
> +	hantro_reg_write(vpu, &av1_cur_altref_roffset, cur_roffset[6]);
> +
> +	hantro_reg_write(vpu, &av1_mf1_type, mf_types[0] - V4L2_AV1_REF_LAST_FRAME);
> +	hantro_reg_write(vpu, &av1_mf2_type, mf_types[1] - V4L2_AV1_REF_LAST_FRAME);
> +	hantro_reg_write(vpu, &av1_mf3_type, mf_types[2] - V4L2_AV1_REF_LAST_FRAME);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_reference_frames(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_frame *frame = ctrls->frame;
> +	int frame_type = frame->frame_type;
> +	bool allow_intrabc = !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC);
> +	int ref_count[AV1DEC_MAX_PIC_BUFFERS] = { 0 };
> +	struct hantro_dev *vpu = ctx->dev;
> +	int i, ref_frames = 0;
> +	bool scale_enable = false;
> +
> +	if (IS_INTRA(frame_type) && !allow_intrabc)
> +		return;
> +
> +	if (!allow_intrabc) {
> +		for (i = 0; i < V4L2_AV1_REFS_PER_FRAME; i++) {
> +			int idx = rockchip_vpu981_get_frame_index(ctx, i);
> +
> +			if (idx >= 0)
> +				ref_count[idx]++;
> +		}
> +
> +		for (i = 0; i < AV1DEC_MAX_PIC_BUFFERS; i++) {
> +			if (ref_count[i])
> +				ref_frames++;
> +		}
> +	} else {
> +		ref_frames = 1;
> +	}
> +	hantro_reg_write(vpu, &av1_ref_frames, ref_frames);
> +
> +	rockchip_vpu981_av1_dec_set_frame_sign_bias(ctx);
> +
> +	for (i = V4L2_AV1_REF_LAST_FRAME; i < V4L2_AV1_TOTAL_REFS_PER_FRAME; i++) {
> +		u32 ref = i - 1;
> +		int idx = 0;
> +		int width, height;
> +
> +		if (allow_intrabc) {
> +			idx = av1_dec->current_frame_index;
> +			width = frame->frame_width_minus_1 + 1;
> +			height = frame->frame_height_minus_1 + 1;
> +		} else {
> +			if (rockchip_vpu981_get_frame_index(ctx, ref) > 0)
> +				idx = rockchip_vpu981_get_frame_index(ctx, ref);
> +			width = av1_dec->frame_refs[idx].width;
> +			height = av1_dec->frame_refs[idx].height;
> +		}
> +
> +		scale_enable |=
> +		    rockchip_vpu981_av1_dec_set_ref(ctx, ref, idx, width,
> +						    height);
> +
> +		rockchip_vpu981_av1_dec_set_sign_bias(ctx, ref,
> +						      av1_dec->ref_frame_sign_bias[i]);
> +	}
> +	hantro_reg_write(vpu, &av1_ref_scaling_enable, scale_enable);
> +
> +	hantro_reg_write(vpu, &av1_ref0_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_LAST_FRAME]);
> +	hantro_reg_write(vpu, &av1_ref1_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_LAST2_FRAME]);
> +	hantro_reg_write(vpu, &av1_ref2_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_LAST3_FRAME]);
> +	hantro_reg_write(vpu, &av1_ref3_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_GOLDEN_FRAME]);
> +	hantro_reg_write(vpu, &av1_ref4_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_BWDREF_FRAME]);
> +	hantro_reg_write(vpu, &av1_ref5_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_ALTREF2_FRAME]);
> +	hantro_reg_write(vpu, &av1_ref6_gm_mode,
> +			 frame->global_motion.type[V4L2_AV1_REF_ALTREF_FRAME]);
> +
> +	rockchip_vpu981_av1_dec_set_other_frames(ctx);
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_parameters(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +
> +	hantro_reg_write(vpu, &av1_skip_mode,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_SKIP_MODE_PRESENT));
> +	hantro_reg_write(vpu, &av1_tempor_mvp_e,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_USE_REF_FRAME_MVS));
> +	hantro_reg_write(vpu, &av1_delta_lf_res_log,
> +			 ctrls->frame->loop_filter.delta_lf_res);
> +	hantro_reg_write(vpu, &av1_delta_lf_multi,
> +			 !!(ctrls->frame->loop_filter.flags
> +			    & V4L2_AV1_LOOP_FILTER_FLAG_DELTA_LF_MULTI));
> +	hantro_reg_write(vpu, &av1_delta_lf_present,
> +			 !!(ctrls->frame->loop_filter.flags
> +			    & V4L2_AV1_LOOP_FILTER_FLAG_DELTA_LF_PRESENT));
> +	hantro_reg_write(vpu, &av1_disable_cdf_update,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_DISABLE_CDF_UPDATE));
> +	hantro_reg_write(vpu, &av1_allow_warp,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_WARPED_MOTION));
> +	hantro_reg_write(vpu, &av1_show_frame,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_SHOW_FRAME));
> +	hantro_reg_write(vpu, &av1_switchable_motion_mode,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_IS_MOTION_MODE_SWITCHABLE));
> +	hantro_reg_write(vpu, &av1_enable_cdef,
> +			 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_CDEF));
> +	hantro_reg_write(vpu, &av1_allow_masked_compound,
> +			 !!(ctrls->sequence->flags
> +			    & V4L2_AV1_SEQUENCE_FLAG_ENABLE_MASKED_COMPOUND));
> +	hantro_reg_write(vpu, &av1_allow_interintra,
> +			 !!(ctrls->sequence->flags
> +			    & V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTERINTRA_COMPOUND));
> +	hantro_reg_write(vpu, &av1_enable_intra_edge_filter,
> +			 !!(ctrls->sequence->flags
> +			    & V4L2_AV1_SEQUENCE_FLAG_ENABLE_INTRA_EDGE_FILTER));
> +	hantro_reg_write(vpu, &av1_allow_filter_intra,
> +			 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_FILTER_INTRA));
> +	hantro_reg_write(vpu, &av1_enable_jnt_comp,
> +			 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_JNT_COMP));
> +	hantro_reg_write(vpu, &av1_enable_dual_filter,
> +			 !!(ctrls->sequence->flags & V4L2_AV1_SEQUENCE_FLAG_ENABLE_DUAL_FILTER));
> +	hantro_reg_write(vpu, &av1_reduced_tx_set_used,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_REDUCED_TX_SET));
> +	hantro_reg_write(vpu, &av1_allow_screen_content_tools,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS));
> +	hantro_reg_write(vpu, &av1_allow_intrabc,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_INTRABC));
> +
> +	if (!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_SCREEN_CONTENT_TOOLS))
> +		hantro_reg_write(vpu, &av1_force_interger_mv, 0);
> +	else
> +		hantro_reg_write(vpu, &av1_force_interger_mv,
> +				 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_FORCE_INTEGER_MV));
> +
> +	hantro_reg_write(vpu, &av1_blackwhite_e, 0);
> +	hantro_reg_write(vpu, &av1_delta_q_res_log, ctrls->frame->quantization.delta_q_res);
> +	hantro_reg_write(vpu, &av1_delta_q_present,
> +			 !!(ctrls->frame->quantization.flags
> +			    & V4L2_AV1_QUANTIZATION_FLAG_DELTA_Q_PRESENT));
> +
> +	hantro_reg_write(vpu, &av1_idr_pic_e, !ctrls->frame->frame_type);
> +	hantro_reg_write(vpu, &av1_quant_base_qindex, ctrls->frame->quantization.base_q_idx);
> +	hantro_reg_write(vpu, &av1_bit_depth_y_minus8, ctx->bit_depth - 8);
> +	hantro_reg_write(vpu, &av1_bit_depth_c_minus8, ctx->bit_depth - 8);
> +
> +	hantro_reg_write(vpu, &av1_mcomp_filt_type, ctrls->frame->interpolation_filter);
> +	hantro_reg_write(vpu, &av1_high_prec_mv_e,
> +			 !!(ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_ALLOW_HIGH_PRECISION_MV));
> +	hantro_reg_write(vpu, &av1_comp_pred_mode,
> +			 (ctrls->frame->flags & V4L2_AV1_FRAME_FLAG_REFERENCE_SELECT) ? 2 : 0);
> +	hantro_reg_write(vpu, &av1_transform_mode, (ctrls->frame->tx_mode == 1) ? 3 : 4);
> +	hantro_reg_write(vpu, &av1_max_cb_size,
> +			 (ctrls->sequence->flags
> +			  & V4L2_AV1_SEQUENCE_FLAG_USE_128X128_SUPERBLOCK) ? 7 : 6);
> +	hantro_reg_write(vpu, &av1_min_cb_size, 3);
> +
> +	hantro_reg_write(vpu, &av1_comp_pred_fixed_ref, 0);
> +	hantro_reg_write(vpu, &av1_comp_pred_var_ref0_av1, 0);
> +	hantro_reg_write(vpu, &av1_comp_pred_var_ref1_av1, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg0, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg1, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg2, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg3, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg4, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg5, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg6, 0);
> +	hantro_reg_write(vpu, &av1_filt_level_seg7, 0);
> +
> +	hantro_reg_write(vpu, &av1_qp_delta_y_dc_av1, ctrls->frame->quantization.delta_q_y_dc);
> +	hantro_reg_write(vpu, &av1_qp_delta_ch_dc_av1, ctrls->frame->quantization.delta_q_u_dc);
> +	hantro_reg_write(vpu, &av1_qp_delta_ch_ac_av1, ctrls->frame->quantization.delta_q_u_ac);
> +	if (ctrls->frame->quantization.flags & V4L2_AV1_QUANTIZATION_FLAG_USING_QMATRIX) {
> +		hantro_reg_write(vpu, &av1_qmlevel_y, ctrls->frame->quantization.qm_y);
> +		hantro_reg_write(vpu, &av1_qmlevel_u, ctrls->frame->quantization.qm_u);
> +		hantro_reg_write(vpu, &av1_qmlevel_v, ctrls->frame->quantization.qm_v);
> +	} else {
> +		hantro_reg_write(vpu, &av1_qmlevel_y, 0xff);
> +		hantro_reg_write(vpu, &av1_qmlevel_u, 0xff);
> +		hantro_reg_write(vpu, &av1_qmlevel_v, 0xff);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_lossless_e, rockchip_vpu981_av1_dec_is_lossless(ctx));
> +	hantro_reg_write(vpu, &av1_quant_delta_v_dc, ctrls->frame->quantization.delta_q_v_dc);
> +	hantro_reg_write(vpu, &av1_quant_delta_v_ac, ctrls->frame->quantization.delta_q_v_ac);
> +
> +	hantro_reg_write(vpu, &av1_skip_ref0,
> +			 (ctrls->frame->skip_mode_frame[0]) ? ctrls->frame->skip_mode_frame[0] : 1);
> +	hantro_reg_write(vpu, &av1_skip_ref1,
> +			 (ctrls->frame->skip_mode_frame[1]) ? ctrls->frame->skip_mode_frame[1] : 1);
> +
> +	hantro_write_addr(vpu, AV1_MC_SYNC_CURR, av1_dec->tile_buf.dma);
> +	hantro_write_addr(vpu, AV1_MC_SYNC_LEFT, av1_dec->tile_buf.dma);
> +}
> +
> +static void
> +rockchip_vpu981_av1_dec_set_input_buffer(struct hantro_ctx *ctx,
> +					 struct vb2_v4l2_buffer *vb2_src)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_tile_group_entry *group_entry =
> +	    ctrls->tile_group_entry;
> +	struct hantro_dev *vpu = ctx->dev;
> +	dma_addr_t src_dma;
> +	u32 src_len, src_buf_len;
> +	int start_bit, offset;
> +
> +	src_dma = vb2_dma_contig_plane_dma_addr(&vb2_src->vb2_buf, 0);
> +	src_len = vb2_get_plane_payload(&vb2_src->vb2_buf, 0);
> +	src_buf_len = vb2_plane_size(&vb2_src->vb2_buf, 0);
> +
> +	start_bit = (group_entry[0].tile_offset & 0xf) * 8;
> +	offset = group_entry[0].tile_offset & ~0xf;
> +
> +	hantro_reg_write(vpu, &av1_strm_buffer_len, src_buf_len);
> +	hantro_reg_write(vpu, &av1_strm_start_bit, start_bit);
> +	hantro_reg_write(vpu, &av1_stream_len, src_len);
> +	hantro_reg_write(vpu, &av1_strm_start_offset, 0);
> +	hantro_write_addr(vpu, AV1_INPUT_STREAM, src_dma + offset);
> +}
> +
> +static void
> +rockchip_vpu981_av1_dec_set_output_buffer(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct hantro_decoded_buffer *dst;
> +	struct vb2_v4l2_buffer *vb2_dst;
> +	dma_addr_t luma_addr, chroma_addr, mv_addr = 0;
> +	size_t cr_offset = rockchip_vpu981_av1_dec_luma_size(ctx);
> +	size_t mv_offset = rockchip_vpu981_av1_dec_chroma_size(ctx);
> +
> +	vb2_dst = av1_dec->frame_refs[av1_dec->current_frame_index].vb2_ref;
> +	dst = vb2_to_hantro_decoded_buf(&vb2_dst->vb2_buf);
> +	luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf);
> +	chroma_addr = luma_addr + cr_offset;
> +	mv_addr = luma_addr + mv_offset;
> +
> +	hantro_write_addr(vpu, AV1_TILE_OUT_LU, luma_addr);
> +	hantro_write_addr(vpu, AV1_TILE_OUT_CH, chroma_addr);
> +	hantro_write_addr(vpu, AV1_TILE_OUT_MV, mv_addr);
> +}
> +
> +int rockchip_vpu981_av1_dec_run(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	struct vb2_v4l2_buffer *vb2_src;
> +	int ret;
> +
> +	hantro_start_prepare_run(ctx);
> +
> +	ret = rockchip_vpu981_av1_dec_prepare_run(ctx);
> +	if (ret)
> +		goto prepare_error;
> +
> +	vb2_src = hantro_get_src_buf(ctx);
> +	if (!vb2_src) {
> +		ret = -EINVAL;
> +		goto prepare_error;
> +	}
> +
> +	rockchip_vpu981_av1_dec_clean_refs(ctx);
> +	rockchip_vpu981_av1_dec_frame_ref(ctx, vb2_src->vb2_buf.timestamp);
> +
> +	rockchip_vpu981_av1_dec_set_parameters(ctx);
> +	rockchip_vpu981_av1_dec_set_global_model(ctx);
> +	rockchip_vpu981_av1_dec_set_tile_info(ctx);
> +	rockchip_vpu981_av1_dec_set_reference_frames(ctx);
> +	rockchip_vpu981_av1_dec_set_segmentation(ctx);
> +	rockchip_vpu981_av1_dec_set_loopfilter(ctx);
> +	rockchip_vpu981_av1_dec_set_picture_dimensions(ctx);
> +	rockchip_vpu981_av1_dec_set_cdef(ctx);
> +	rockchip_vpu981_av1_dec_set_lr(ctx);
> +	rockchip_vpu981_av1_dec_set_prob(ctx);
> +
> +	hantro_reg_write(vpu, &av1_dec_mode, AV1_DEC_MODE);
> +	hantro_reg_write(vpu, &av1_dec_out_ec_byte_word, 0);
> +	hantro_reg_write(vpu, &av1_write_mvs_e, 1);
> +	hantro_reg_write(vpu, &av1_dec_out_ec_bypass, 1);
> +	hantro_reg_write(vpu, &av1_dec_clk_gate_e, 1);
> +
> +	hantro_reg_write(vpu, &av1_dec_abort_e, 0);
> +	hantro_reg_write(vpu, &av1_dec_tile_int_e, 0);
> +
> +	hantro_reg_write(vpu, &av1_dec_alignment, 64);
> +	hantro_reg_write(vpu, &av1_apf_disable, 0);
> +	hantro_reg_write(vpu, &av1_apf_threshold, 8);
> +	hantro_reg_write(vpu, &av1_dec_buswidth, 2);
> +	hantro_reg_write(vpu, &av1_dec_max_burst, 16);
> +	hantro_reg_write(vpu, &av1_error_conceal_e, 0);
> +	hantro_reg_write(vpu, &av1_axi_rd_ostd_threshold, 64);
> +	hantro_reg_write(vpu, &av1_axi_wr_ostd_threshold, 64);
> +
> +	hantro_reg_write(vpu, &av1_ext_timeout_cycles, 0xfffffff);
> +	hantro_reg_write(vpu, &av1_ext_timeout_override_e, 1);
> +	hantro_reg_write(vpu, &av1_timeout_cycles, 0xfffffff);
> +	hantro_reg_write(vpu, &av1_timeout_override_e, 1);
> +
> +	rockchip_vpu981_av1_dec_set_output_buffer(ctx);
> +	rockchip_vpu981_av1_dec_set_input_buffer(ctx, vb2_src);
> +
> +	hantro_end_prepare_run(ctx);
> +
> +	hantro_reg_write(vpu, &av1_dec_e, 1);
> +
> +	return 0;
> +
> +prepare_error:
> +	hantro_end_prepare_run(ctx);
> +	hantro_irq_done(vpu, VB2_BUF_STATE_ERROR);
> +	return ret;
> +}
> +
> +static void rockchip_vpu981_postproc_enable(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +	int width = ctx->dst_fmt.width;
> +	int height = ctx->dst_fmt.height;
> +	struct vb2_v4l2_buffer *vb2_dst;
> +	size_t chroma_offset;
> +	dma_addr_t dst_dma;
> +
> +	vb2_dst = hantro_get_dst_buf(ctx);
> +
> +	dst_dma = vb2_dma_contig_plane_dma_addr(&vb2_dst->vb2_buf, 0);
> +	chroma_offset = ctx->dst_fmt.plane_fmt[0].bytesperline *
> +	    ctx->dst_fmt.height;
> +
> +	/* enable post processor */
> +	hantro_reg_write(vpu, &av1_pp_out_e, 1);
> +	hantro_reg_write(vpu, &av1_pp_in_format, 0);
> +	hantro_reg_write(vpu, &av1_pp0_dup_hor, 1);
> +	hantro_reg_write(vpu, &av1_pp0_dup_ver, 1);
> +
> +	hantro_reg_write(vpu, &av1_pp_in_height, height / 2);
> +	hantro_reg_write(vpu, &av1_pp_in_width, width / 2);
> +	hantro_reg_write(vpu, &av1_pp_out_height, height);
> +	hantro_reg_write(vpu, &av1_pp_out_width, width);
> +	hantro_reg_write(vpu, &av1_pp_out_y_stride,
> +			 ctx->dst_fmt.plane_fmt[0].bytesperline);
> +	hantro_reg_write(vpu, &av1_pp_out_c_stride,
> +			 ctx->dst_fmt.plane_fmt[0].bytesperline);
> +	switch (ctx->dst_fmt.pixelformat) {
> +	case V4L2_PIX_FMT_P010:
> +		hantro_reg_write(vpu, &av1_pp_out_format, 1);
> +		break;
> +	case V4L2_PIX_FMT_NV12:
> +		hantro_reg_write(vpu, &av1_pp_out_format, 3);
> +		break;
> +	default:
> +		hantro_reg_write(vpu, &av1_pp_out_format, 0);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_ppd_blend_exist, 0);
> +	hantro_reg_write(vpu, &av1_ppd_dith_exist, 0);
> +	hantro_reg_write(vpu, &av1_ablend_crop_e, 0);
> +	hantro_reg_write(vpu, &av1_pp_format_customer1_e, 0);
> +	hantro_reg_write(vpu, &av1_pp_crop_exist, 0);
> +	hantro_reg_write(vpu, &av1_pp_up_level, 0);
> +	hantro_reg_write(vpu, &av1_pp_down_level, 0);
> +	hantro_reg_write(vpu, &av1_pp_exist, 0);
> +
> +	hantro_write_addr(vpu, AV1_PP_OUT_LU, dst_dma);
> +	hantro_write_addr(vpu, AV1_PP_OUT_CH, dst_dma + chroma_offset);
> +}
> +
> +static void rockchip_vpu981_postproc_disable(struct hantro_ctx *ctx)
> +{
> +	struct hantro_dev *vpu = ctx->dev;
> +
> +	/* disable post processor */
> +	hantro_reg_write(vpu, &av1_pp_out_e, 0);
> +}
> +
> +const struct hantro_postproc_ops rockchip_vpu981_postproc_ops = {
> +	.enable = rockchip_vpu981_postproc_enable,
> +	.disable = rockchip_vpu981_postproc_disable,
> +};
> diff --git a/drivers/media/platform/verisilicon/rockchip_vpu981_regs.h b/drivers/media/platform/verisilicon/rockchip_vpu981_regs.h
> new file mode 100644
> index 000000000000..182e6c830ff6
> --- /dev/null
> +++ b/drivers/media/platform/verisilicon/rockchip_vpu981_regs.h
> @@ -0,0 +1,477 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (c) 2022, Collabora
> + *
> + * Author: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> + */
> +
> +#ifndef _ROCKCHIP_VPU981_REGS_H_
> +#define _ROCKCHIP_VPU981_REGS_H_
> +
> +#include "hantro.h"
> +
> +#define AV1_SWREG(nr)	((nr) * 4)
> +
> +#define AV1_DEC_REG(b, s, m) \
> +	((const struct hantro_reg) { \
> +		.base = AV1_SWREG(b), \
> +		.shift = s, \
> +		.mask = m, \
> +	})
> +
> +#define AV1_REG_INTERRUPT		AV1_SWREG(1)
> +#define AV1_REG_INTERRUPT_DEC_RDY_INT	BIT(12)
> +
> +#define AV1_REG_CONFIG			AV1_SWREG(2)
> +#define AV1_REG_CONFIG_DEC_CLK_GATE_E	BIT(10)
> +
> +#define av1_dec_e			AV1_DEC_REG(1, 0, 0x1)
> +#define av1_dec_abort_e			AV1_DEC_REG(1, 5, 0x1)
> +#define av1_dec_tile_int_e		AV1_DEC_REG(1, 7, 0x1)
> +
> +#define av1_dec_clk_gate_e		AV1_DEC_REG(2, 10, 0x1)
> +
> +#define av1_dec_out_ec_bypass		AV1_DEC_REG(3, 8,  0x1)
> +#define av1_write_mvs_e			AV1_DEC_REG(3, 12, 0x1)
> +#define av1_filtering_dis		AV1_DEC_REG(3, 14, 0x1)
> +#define av1_dec_out_dis			AV1_DEC_REG(3, 15, 0x1)
> +#define av1_dec_out_ec_byte_word	AV1_DEC_REG(3, 16, 0x1)
> +#define av1_skip_mode			AV1_DEC_REG(3, 26, 0x1)
> +#define av1_dec_mode			AV1_DEC_REG(3, 27, 0x1f)
> +
> +#define av1_ref_frames			AV1_DEC_REG(4, 0, 0xf)
> +#define av1_pic_height_in_cbs		AV1_DEC_REG(4, 6, 0x1fff)
> +#define av1_pic_width_in_cbs		AV1_DEC_REG(4, 19, 0x1fff)
> +
> +#define av1_ref_scaling_enable		AV1_DEC_REG(5, 0, 0x1)
> +#define av1_filt_level_base_gt32	AV1_DEC_REG(5, 1, 0x1)
> +#define av1_error_resilient		AV1_DEC_REG(5, 2, 0x1)
> +#define av1_force_interger_mv		AV1_DEC_REG(5, 3, 0x1)
> +#define av1_allow_intrabc		AV1_DEC_REG(5, 4, 0x1)
> +#define av1_allow_screen_content_tools	AV1_DEC_REG(5, 5, 0x1)
> +#define av1_reduced_tx_set_used		AV1_DEC_REG(5, 6, 0x1)
> +#define av1_enable_dual_filter		AV1_DEC_REG(5, 7, 0x1)
> +#define av1_enable_jnt_comp		AV1_DEC_REG(5, 8, 0x1)
> +#define av1_allow_filter_intra		AV1_DEC_REG(5, 9, 0x1)
> +#define av1_enable_intra_edge_filter	AV1_DEC_REG(5, 10, 0x1)
> +#define av1_tempor_mvp_e		AV1_DEC_REG(5, 11, 0x1)
> +#define av1_allow_interintra		AV1_DEC_REG(5, 12, 0x1)
> +#define av1_allow_masked_compound	AV1_DEC_REG(5, 13, 0x1)
> +#define av1_enable_cdef			AV1_DEC_REG(5, 14, 0x1)
> +#define av1_switchable_motion_mode	AV1_DEC_REG(5, 15, 0x1)
> +#define av1_show_frame			AV1_DEC_REG(5, 16, 0x1)
> +#define av1_superres_is_scaled		AV1_DEC_REG(5, 17, 0x1)
> +#define av1_allow_warp			AV1_DEC_REG(5, 18, 0x1)
> +#define av1_disable_cdf_update		AV1_DEC_REG(5, 19, 0x1)
> +#define av1_preskip_segid		AV1_DEC_REG(5, 20, 0x1)
> +#define av1_delta_lf_present		AV1_DEC_REG(5, 21, 0x1)
> +#define av1_delta_lf_multi		AV1_DEC_REG(5, 22, 0x1)
> +#define av1_delta_lf_res_log		AV1_DEC_REG(5, 23, 0x3)
> +#define av1_strm_start_bit		AV1_DEC_REG(5, 25, 0x7f)
> +
> +#define	av1_stream_len			AV1_DEC_REG(6, 0, 0xffffffff)
> +
> +#define av1_delta_q_present		AV1_DEC_REG(7, 0, 0x1)
> +#define av1_delta_q_res_log		AV1_DEC_REG(7, 1, 0x3)
> +#define av1_cdef_damping		AV1_DEC_REG(7, 3, 0x3)
> +#define av1_cdef_bits			AV1_DEC_REG(7, 5, 0x3)
> +#define av1_apply_grain			AV1_DEC_REG(7, 7, 0x1)
> +#define av1_num_y_points_b		AV1_DEC_REG(7, 8, 0x1)
> +#define av1_num_cb_points_b		AV1_DEC_REG(7, 9, 0x1)
> +#define av1_num_cr_points_b		AV1_DEC_REG(7, 10, 0x1)
> +#define av1_overlap_flag		AV1_DEC_REG(7, 11, 0x1)
> +#define av1_clip_to_restricted_range	AV1_DEC_REG(7, 12, 0x1)
> +#define av1_chroma_scaling_from_luma	AV1_DEC_REG(7, 13, 0x1)
> +#define av1_random_seed			AV1_DEC_REG(7, 14, 0xffff)
> +#define av1_blackwhite_e		AV1_DEC_REG(7, 30, 0x1)
> +
> +#define av1_scaling_shift		AV1_DEC_REG(8, 0, 0xf)
> +#define av1_bit_depth_c_minus8		AV1_DEC_REG(8, 4, 0x3)
> +#define av1_bit_depth_y_minus8		AV1_DEC_REG(8, 6, 0x3)
> +#define av1_quant_base_qindex		AV1_DEC_REG(8, 8, 0xff)
> +#define av1_idr_pic_e			AV1_DEC_REG(8, 16, 0x1)
> +#define av1_superres_pic_width		AV1_DEC_REG(8, 17, 0x7fff)
> +
> +#define av1_ref4_sign_bias		AV1_DEC_REG(9, 2, 0x1)
> +#define av1_ref5_sign_bias		AV1_DEC_REG(9, 3, 0x1)
> +#define av1_ref6_sign_bias		AV1_DEC_REG(9, 4, 0x1)
> +#define av1_mf1_type			AV1_DEC_REG(9, 5, 0x7)
> +#define av1_mf2_type			AV1_DEC_REG(9, 8, 0x7)
> +#define av1_mf3_type			AV1_DEC_REG(9, 11, 0x7)
> +#define av1_scale_denom_minus9		AV1_DEC_REG(9, 14, 0x7)
> +#define av1_last_active_seg		AV1_DEC_REG(9, 17, 0x7)
> +#define av1_context_update_tile_id	AV1_DEC_REG(9, 20, 0xfff)
> +
> +#define av1_tile_transpose		AV1_DEC_REG(10, 0, 0x1)
> +#define av1_tile_enable			AV1_DEC_REG(10, 1, 0x1)
> +#define av1_multicore_full_width	AV1_DEC_REG(10,	2, 0xff)
> +#define av1_num_tile_rows_8k		AV1_DEC_REG(10, 10, 0x7f)
> +#define av1_num_tile_cols_8k		AV1_DEC_REG(10, 17, 0x7f)
> +#define av1_multicore_tile_start_x	AV1_DEC_REG(10, 24, 0xff)
> +
> +#define av1_use_temporal3_mvs		AV1_DEC_REG(11, 0, 0x1)
> +#define av1_use_temporal2_mvs		AV1_DEC_REG(11, 1, 0x1)
> +#define av1_use_temporal1_mvs		AV1_DEC_REG(11, 2, 0x1)
> +#define av1_use_temporal0_mvs		AV1_DEC_REG(11, 3, 0x1)
> +#define av1_comp_pred_mode		AV1_DEC_REG(11, 4, 0x3)
> +#define av1_high_prec_mv_e		AV1_DEC_REG(11, 7, 0x1)
> +#define av1_mcomp_filt_type		AV1_DEC_REG(11, 8, 0x7)
> +#define av1_multicore_expect_context_update	AV1_DEC_REG(11, 11, 0x1)
> +#define av1_multicore_sbx_offset	AV1_DEC_REG(11, 12, 0x7f)
> +#define av1_ulticore_tile_col		AV1_DEC_REG(11, 19, 0x7f)
> +#define av1_transform_mode		AV1_DEC_REG(11, 27, 0x7)
> +#define av1_dec_tile_size_mag		AV1_DEC_REG(11, 30, 0x3)
> +
> +#define av1_seg_quant_sign		AV1_DEC_REG(12, 2, 0xff)
> +#define av1_max_cb_size			AV1_DEC_REG(12, 10, 0x7)
> +#define av1_min_cb_size			AV1_DEC_REG(12, 13, 0x7)
> +#define av1_comp_pred_fixed_ref		AV1_DEC_REG(12, 16, 0x7)
> +#define av1_multicore_tile_width	AV1_DEC_REG(12, 19, 0x7f)
> +#define av1_pic_height_pad		AV1_DEC_REG(12, 26, 0x7)
> +#define av1_pic_width_pad		AV1_DEC_REG(12, 29, 0x7)
> +
> +#define av1_segment_e			AV1_DEC_REG(13, 0, 0x1)
> +#define av1_segment_upd_e		AV1_DEC_REG(13, 1, 0x1)
> +#define av1_segment_temp_upd_e		AV1_DEC_REG(13, 2, 0x1)
> +#define av1_comp_pred_var_ref0_av1	AV1_DEC_REG(13, 3, 0x7)
> +#define av1_comp_pred_var_ref1_av1	AV1_DEC_REG(13, 6, 0x7)
> +#define av1_lossless_e			AV1_DEC_REG(13, 9, 0x1)
> +#define av1_qp_delta_ch_ac_av1		AV1_DEC_REG(13, 11, 0x7f)
> +#define av1_qp_delta_ch_dc_av1		AV1_DEC_REG(13, 18, 0x7f)
> +#define av1_qp_delta_y_dc_av1		AV1_DEC_REG(13, 25, 0x7f)
> +
> +#define av1_quant_seg0			AV1_DEC_REG(14, 0, 0xff)
> +#define av1_filt_level_seg0		AV1_DEC_REG(14, 8, 0x3f)
> +#define av1_skip_seg0			AV1_DEC_REG(14, 14, 0x1)
> +#define av1_refpic_seg0			AV1_DEC_REG(14, 15, 0xf)
> +#define av1_filt_level_delta0_seg0	AV1_DEC_REG(14, 19, 0x7f)
> +#define av1_filt_level0			AV1_DEC_REG(14, 26, 0x3f)
> +
> +#define av1_quant_seg1			AV1_DEC_REG(15, 0, 0xff)
> +#define av1_filt_level_seg1		AV1_DEC_REG(15, 8, 0x3f)
> +#define av1_skip_seg1			AV1_DEC_REG(15, 14, 0x1)
> +#define av1_refpic_seg1			AV1_DEC_REG(15, 15, 0xf)
> +#define av1_filt_level_delta0_seg1	AV1_DEC_REG(15, 19, 0x7f)
> +#define av1_filt_level1			AV1_DEC_REG(15, 26, 0x3f)
> +
> +#define av1_quant_seg2			AV1_DEC_REG(16, 0, 0xff)
> +#define av1_filt_level_seg2		AV1_DEC_REG(16, 8, 0x3f)
> +#define av1_skip_seg2			AV1_DEC_REG(16, 14, 0x1)
> +#define av1_refpic_seg2			AV1_DEC_REG(16, 15, 0xf)
> +#define av1_filt_level_delta0_seg2	AV1_DEC_REG(16, 19, 0x7f)
> +#define av1_filt_level2			AV1_DEC_REG(16, 26, 0x3f)
> +
> +#define av1_quant_seg3			AV1_DEC_REG(17, 0, 0xff)
> +#define av1_filt_level_seg3		AV1_DEC_REG(17, 8, 0x3f)
> +#define av1_skip_seg3			AV1_DEC_REG(17, 14, 0x1)
> +#define av1_refpic_seg3			AV1_DEC_REG(17, 15, 0xf)
> +#define av1_filt_level_delta0_seg3	AV1_DEC_REG(17, 19, 0x7f)
> +#define av1_filt_level3			AV1_DEC_REG(17, 26, 0x3f)
> +
> +#define av1_quant_seg4			AV1_DEC_REG(18, 0, 0xff)
> +#define av1_filt_level_seg4		AV1_DEC_REG(18, 8, 0x3f)
> +#define av1_skip_seg4			AV1_DEC_REG(18, 14, 0x1)
> +#define av1_refpic_seg4			AV1_DEC_REG(18, 15, 0xf)
> +#define av1_filt_level_delta0_seg4	AV1_DEC_REG(18, 19, 0x7f)
> +#define av1_lr_type			AV1_DEC_REG(18, 26, 0x3f)
> +
> +#define av1_quant_seg5			AV1_DEC_REG(19, 0, 0xff)
> +#define av1_filt_level_seg5		AV1_DEC_REG(19, 8, 0x3f)
> +#define av1_skip_seg5			AV1_DEC_REG(19, 14, 0x1)
> +#define av1_refpic_seg5			AV1_DEC_REG(19, 15, 0xf)
> +#define av1_filt_level_delta0_seg5	AV1_DEC_REG(19, 19, 0x7f)
> +#define av1_lr_unit_size		AV1_DEC_REG(19, 26, 0x3f)
> +
> +#define av1_filt_level_delta1_seg0	AV1_DEC_REG(20, 0, 0x7f)
> +#define av1_filt_level_delta2_seg0	AV1_DEC_REG(20, 7, 0x7f)
> +#define av1_filt_level_delta3_seg0	AV1_DEC_REG(20, 14, 0x7f)
> +#define av1_global_mv_seg0		AV1_DEC_REG(20, 21, 0x1)
> +#define av1_mf1_last_offset		AV1_DEC_REG(20, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg1	AV1_DEC_REG(21, 0, 0x7f)
> +#define av1_filt_level_delta2_seg1	AV1_DEC_REG(21, 7, 0x7f)
> +#define av1_filt_level_delta3_seg1	AV1_DEC_REG(21, 14, 0x7f)
> +#define av1_global_mv_seg1		AV1_DEC_REG(21, 21, 0x1)
> +#define av1_mf1_last2_offset		AV1_DEC_REG(21, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg2	AV1_DEC_REG(22, 0, 0x7f)
> +#define av1_filt_level_delta2_seg2	AV1_DEC_REG(22, 7, 0x7f)
> +#define av1_filt_level_delta3_seg2	AV1_DEC_REG(22, 14, 0x7f)
> +#define av1_global_mv_seg2		AV1_DEC_REG(22, 21, 0x1)
> +#define av1_mf1_last3_offset		AV1_DEC_REG(22, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg3	AV1_DEC_REG(23, 0, 0x7f)
> +#define av1_filt_level_delta2_seg3	AV1_DEC_REG(23, 7, 0x7f)
> +#define av1_filt_level_delta3_seg3	AV1_DEC_REG(23, 14, 0x7f)
> +#define av1_global_mv_seg3		AV1_DEC_REG(23, 21, 0x1)
> +#define av1_mf1_golden_offset		AV1_DEC_REG(23, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg4	AV1_DEC_REG(24, 0, 0x7f)
> +#define av1_filt_level_delta2_seg4	AV1_DEC_REG(24, 7, 0x7f)
> +#define av1_filt_level_delta3_seg4	AV1_DEC_REG(24, 14, 0x7f)
> +#define av1_global_mv_seg4		AV1_DEC_REG(24, 21, 0x1)
> +#define av1_mf1_bwdref_offset		AV1_DEC_REG(24, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg5	AV1_DEC_REG(25, 0, 0x7f)
> +#define av1_filt_level_delta2_seg5	AV1_DEC_REG(25, 7, 0x7f)
> +#define av1_filt_level_delta3_seg5	AV1_DEC_REG(25, 14, 0x7f)
> +#define av1_global_mv_seg5		AV1_DEC_REG(25, 21, 0x1)
> +#define av1_mf1_altref2_offset		AV1_DEC_REG(25, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg6	AV1_DEC_REG(26, 0, 0x7f)
> +#define av1_filt_level_delta2_seg6	AV1_DEC_REG(26, 7, 0x7f)
> +#define av1_filt_level_delta3_seg6	AV1_DEC_REG(26, 14, 0x7f)
> +#define av1_global_mv_seg6		AV1_DEC_REG(26, 21, 0x1)
> +#define av1_mf1_altref_offset		AV1_DEC_REG(26, 22, 0x1ff)
> +
> +#define av1_filt_level_delta1_seg7	AV1_DEC_REG(27, 0, 0x7f)
> +#define av1_filt_level_delta2_seg7	AV1_DEC_REG(27, 7, 0x7f)
> +#define av1_filt_level_delta3_seg7	AV1_DEC_REG(27, 14, 0x7f)
> +#define av1_global_mv_seg7		AV1_DEC_REG(27, 21, 0x1)
> +#define av1_mf2_last_offset		AV1_DEC_REG(27, 22, 0x1ff)
> +
> +#define av1_cb_offset			AV1_DEC_REG(28, 0, 0x1ff)
> +#define av1_cb_luma_mult		AV1_DEC_REG(28, 9, 0xff)
> +#define av1_cb_mult			AV1_DEC_REG(28, 17, 0xff)
> +#define	av1_quant_delta_v_dc		AV1_DEC_REG(28, 25, 0x7f)
> +
> +#define av1_cr_offset			AV1_DEC_REG(29, 0, 0x1ff)
> +#define av1_cr_luma_mult		AV1_DEC_REG(29, 9, 0xff)
> +#define av1_cr_mult			AV1_DEC_REG(29, 17, 0xff)
> +#define	av1_quant_delta_v_ac		AV1_DEC_REG(29, 25, 0x7f)
> +
> +#define av1_filt_ref_adj_5		AV1_DEC_REG(30, 0, 0x7f)
> +#define av1_filt_ref_adj_4		AV1_DEC_REG(30, 7, 0x7f)
> +#define av1_filt_mb_adj_1		AV1_DEC_REG(30, 14, 0x7f)
> +#define av1_filt_mb_adj_0		AV1_DEC_REG(30, 21, 0x7f)
> +#define av1_filt_sharpness		AV1_DEC_REG(30, 28, 0x7)
> +
> +#define av1_quant_seg6			AV1_DEC_REG(31, 0, 0xff)
> +#define av1_filt_level_seg6		AV1_DEC_REG(31, 8, 0x3f)
> +#define av1_skip_seg6			AV1_DEC_REG(31, 14, 0x1)
> +#define av1_refpic_seg6			AV1_DEC_REG(31, 15, 0xf)
> +#define av1_filt_level_delta0_seg6	AV1_DEC_REG(31, 19, 0x7f)
> +#define av1_skip_ref0			AV1_DEC_REG(31, 26, 0xf)
> +
> +#define av1_quant_seg7			AV1_DEC_REG(32, 0, 0xff)
> +#define av1_filt_level_seg7		AV1_DEC_REG(32, 8, 0x3f)
> +#define av1_skip_seg7			AV1_DEC_REG(32, 14, 0x1)
> +#define av1_refpic_seg7			AV1_DEC_REG(32, 15, 0xf)
> +#define av1_filt_level_delta0_seg7	AV1_DEC_REG(32, 19, 0x7f)
> +#define av1_skip_ref1			AV1_DEC_REG(32, 26, 0xf)
> +
> +#define av1_ref0_height			AV1_DEC_REG(33, 0, 0xffff)
> +#define av1_ref0_width			AV1_DEC_REG(33, 16, 0xffff)
> +
> +#define av1_ref1_height			AV1_DEC_REG(34, 0, 0xffff)
> +#define av1_ref1_width			AV1_DEC_REG(34, 16, 0xffff)
> +
> +#define av1_ref2_height			AV1_DEC_REG(35, 0, 0xffff)
> +#define av1_ref2_width			AV1_DEC_REG(35, 16, 0xffff)
> +
> +#define av1_ref0_ver_scale		AV1_DEC_REG(36, 0, 0xffff)
> +#define av1_ref0_hor_scale		AV1_DEC_REG(36, 16, 0xffff)
> +
> +#define av1_ref1_ver_scale		AV1_DEC_REG(37, 0, 0xffff)
> +#define av1_ref1_hor_scale		AV1_DEC_REG(37, 16, 0xffff)
> +
> +#define av1_ref2_ver_scale		AV1_DEC_REG(38, 0, 0xffff)
> +#define av1_ref2_hor_scale		AV1_DEC_REG(38, 16, 0xffff)
> +
> +#define av1_ref3_ver_scale		AV1_DEC_REG(39, 0, 0xffff)
> +#define av1_ref3_hor_scale		AV1_DEC_REG(39, 16, 0xffff)
> +
> +#define av1_ref4_ver_scale		AV1_DEC_REG(40, 0, 0xffff)
> +#define av1_ref4_hor_scale		AV1_DEC_REG(40, 16, 0xffff)
> +
> +#define av1_ref5_ver_scale		AV1_DEC_REG(41, 0, 0xffff)
> +#define av1_ref5_hor_scale		AV1_DEC_REG(41, 16, 0xffff)
> +
> +#define av1_ref6_ver_scale		AV1_DEC_REG(42, 0, 0xffff)
> +#define av1_ref6_hor_scale		AV1_DEC_REG(42, 16, 0xffff)
> +
> +#define av1_ref3_height			AV1_DEC_REG(43, 0, 0xffff)
> +#define av1_ref3_width			AV1_DEC_REG(43, 16, 0xffff)
> +
> +#define av1_ref4_height			AV1_DEC_REG(44, 0, 0xffff)
> +#define av1_ref4_width			AV1_DEC_REG(44, 16, 0xffff)
> +
> +#define av1_ref5_height			AV1_DEC_REG(45, 0, 0xffff)
> +#define av1_ref5_width			AV1_DEC_REG(45, 16, 0xffff)
> +
> +#define av1_ref6_height			AV1_DEC_REG(46, 0, 0xffff)
> +#define av1_ref6_width			AV1_DEC_REG(46, 16, 0xffff)
> +
> +#define av1_mf2_last2_offset		AV1_DEC_REG(47, 0, 0x1ff)
> +#define av1_mf2_last3_offset		AV1_DEC_REG(47, 9, 0x1ff)
> +#define av1_mf2_golden_offset		AV1_DEC_REG(47, 18, 0x1ff)
> +#define av1_qmlevel_y			AV1_DEC_REG(47, 27, 0xf)
> +
> +#define av1_mf2_bwdref_offset		AV1_DEC_REG(48, 0, 0x1ff)
> +#define av1_mf2_altref2_offset		AV1_DEC_REG(48, 9, 0x1ff)
> +#define av1_mf2_altref_offset		AV1_DEC_REG(48, 18, 0x1ff)
> +#define av1_qmlevel_u			AV1_DEC_REG(48, 27, 0xf)
> +
> +#define av1_filt_ref_adj_6		AV1_DEC_REG(49, 0, 0x7f)
> +#define av1_filt_ref_adj_7		AV1_DEC_REG(49, 7, 0x7f)
> +#define av1_qmlevel_v			AV1_DEC_REG(49, 14, 0xf)
> +
> +#define av1_superres_chroma_step	AV1_DEC_REG(51, 0, 0x3fff)
> +#define av1_superres_luma_step		AV1_DEC_REG(51, 14, 0x3fff)
> +
> +#define av1_superres_init_chroma_subpel_x	AV1_DEC_REG(52, 0, 0x3fff)
> +#define av1_superres_init_luma_subpel_x		AV1_DEC_REG(52, 14, 0x3fff)
> +
> +#define av1_cdef_chroma_secondary_strength	AV1_DEC_REG(53, 0, 0xffff)
> +#define av1_cdef_luma_secondary_strength	AV1_DEC_REG(53, 16, 0xffff)
> +
> +#define av1_apf_threshold		AV1_DEC_REG(55, 0, 0xffff)
> +#define av1_apf_single_pu_mode		AV1_DEC_REG(55, 30, 0x1)
> +#define av1_apf_disable			AV1_DEC_REG(55, 30, 0x1)
> +
> +#define av1_dec_max_burst		AV1_DEC_REG(58, 0, 0xff)
> +#define av1_dec_buswidth		AV1_DEC_REG(58, 8, 0x7)
> +#define av1_dec_multicore_mode		AV1_DEC_REG(58, 11, 0x3)
> +#define av1_dec_axi_wd_id_e		AV1_DEC_REG(58,	13, 0x1)
> +#define av1_dec_axi_rd_id_e		AV1_DEC_REG(58, 14, 0x1)
> +#define av1_dec_mc_polltime		AV1_DEC_REG(58, 17, 0x3ff)
> +#define av1_dec_mc_pollmode		AV1_DEC_REG(58,	27, 0x3)
> +
> +#define av1_filt_ref_adj_3		AV1_DEC_REG(59, 0, 0x3f)
> +#define av1_filt_ref_adj_2		AV1_DEC_REG(59, 7, 0x3f)
> +#define av1_filt_ref_adj_1		AV1_DEC_REG(59, 14, 0x3f)
> +#define av1_filt_ref_adj_0		AV1_DEC_REG(59, 21, 0x3f)
> +#define av1_ref0_sign_bias		AV1_DEC_REG(59, 28, 0x1)
> +#define av1_ref1_sign_bias		AV1_DEC_REG(59, 29, 0x1)
> +#define av1_ref2_sign_bias		AV1_DEC_REG(59, 30, 0x1)
> +#define av1_ref3_sign_bias		AV1_DEC_REG(59, 31, 0x1)
> +
> +#define av1_cur_last_roffset		AV1_DEC_REG(184, 0, 0x1ff)
> +#define av1_cur_last_offset		AV1_DEC_REG(184, 9, 0x1ff)
> +#define av1_mf3_last_offset		AV1_DEC_REG(184, 18, 0x1ff)
> +#define av1_ref0_gm_mode		AV1_DEC_REG(184, 27, 0x3)
> +
> +#define av1_cur_last2_roffset		AV1_DEC_REG(185, 0, 0x1ff)
> +#define av1_cur_last2_offset		AV1_DEC_REG(185, 9, 0x1ff)
> +#define av1_mf3_last2_offset		AV1_DEC_REG(185, 18, 0x1ff)
> +#define av1_ref1_gm_mode		AV1_DEC_REG(185, 27, 0x3)
> +
> +#define av1_cur_last3_roffset		AV1_DEC_REG(186, 0, 0x1ff)
> +#define av1_cur_last3_offset		AV1_DEC_REG(186, 9, 0x1ff)
> +#define av1_mf3_last3_offset		AV1_DEC_REG(186, 18, 0x1ff)
> +#define av1_ref2_gm_mode		AV1_DEC_REG(186, 27, 0x3)
> +
> +#define av1_cur_golden_roffset		AV1_DEC_REG(187, 0, 0x1ff)
> +#define av1_cur_golden_offset		AV1_DEC_REG(187, 9, 0x1ff)
> +#define av1_mf3_golden_offset		AV1_DEC_REG(187, 18, 0x1ff)
> +#define av1_ref3_gm_mode		AV1_DEC_REG(187, 27, 0x3)
> +
> +#define av1_cur_bwdref_roffset		AV1_DEC_REG(188, 0, 0x1ff)
> +#define av1_cur_bwdref_offset		AV1_DEC_REG(188, 9, 0x1ff)
> +#define av1_mf3_bwdref_offset		AV1_DEC_REG(188, 18, 0x1ff)
> +#define av1_ref4_gm_mode		AV1_DEC_REG(188, 27, 0x3)
> +
> +#define av1_cur_altref2_roffset		AV1_DEC_REG(257, 0, 0x1ff)
> +#define av1_cur_altref2_offset		AV1_DEC_REG(257, 9, 0x1ff)
> +#define av1_mf3_altref2_offset		AV1_DEC_REG(257, 18, 0x1ff)
> +#define av1_ref5_gm_mode		AV1_DEC_REG(257, 27, 0x3)
> +
> +#define av1_strm_buffer_len		AV1_DEC_REG(258, 0, 0xffffffff)
> +
> +#define av1_strm_start_offset		AV1_DEC_REG(259, 0, 0xffffffff)
> +
> +#define av1_ppd_blend_exist		AV1_DEC_REG(260, 21, 0x1)
> +#define av1_ppd_dith_exist		AV1_DEC_REG(260, 23, 0x1)
> +#define av1_ablend_crop_e		AV1_DEC_REG(260, 24, 0x1)
> +#define av1_pp_format_p010_e		AV1_DEC_REG(260, 25, 0x1)
> +#define av1_pp_format_customer1_e	AV1_DEC_REG(260, 26, 0x1)
> +#define av1_pp_crop_exist		AV1_DEC_REG(260, 27, 0x1)
> +#define av1_pp_up_level			AV1_DEC_REG(260, 28, 0x1)
> +#define av1_pp_down_level		AV1_DEC_REG(260, 29, 0x3)
> +#define av1_pp_exist			AV1_DEC_REG(260, 31, 0x1)
> +
> +#define av1_cur_altref_roffset		AV1_DEC_REG(262, 0, 0x1ff)
> +#define av1_cur_altref_offset		AV1_DEC_REG(262, 9, 0x1ff)
> +#define av1_mf3_altref_offset		AV1_DEC_REG(262, 18, 0x1ff)
> +#define av1_ref6_gm_mode		AV1_DEC_REG(262, 27, 0x3)
> +
> +#define av1_cdef_luma_primary_strength	AV1_DEC_REG(263, 0, 0xffffffff)
> +
> +#define av1_cdef_chroma_primary_strength AV1_DEC_REG(264, 0, 0xffffffff)
> +
> +#define av1_axi_arqos			AV1_DEC_REG(265, 0, 0xf)
> +#define av1_axi_awqos			AV1_DEC_REG(265, 4, 0xf)
> +#define av1_axi_wr_ostd_threshold	AV1_DEC_REG(265, 8, 0x3ff)
> +#define av1_axi_rd_ostd_threshold	AV1_DEC_REG(265, 18, 0x3ff)
> +#define av1_axi_wr_4k_dis		AV1_DEC_REG(265, 31, 0x1)
> +
> +#define av1_128bit_mode			AV1_DEC_REG(266, 5, 0x1)
> +#define av1_wr_shaper_bypass		AV1_DEC_REG(266, 10, 0x1)
> +#define av1_error_conceal_e		AV1_DEC_REG(266, 30, 0x1)
> +
> +#define av1_superres_chroma_step_invra	AV1_DEC_REG(298, 0, 0xffff)
> +#define av1_superres_luma_step_invra	AV1_DEC_REG(298, 16, 0xffff)
> +
> +#define av1_dec_alignment		AV1_DEC_REG(314, 0, 0xffff)
> +
> +#define av1_ext_timeout_cycles		AV1_DEC_REG(318, 0, 0x7fffffff)
> +#define av1_ext_timeout_override_e	AV1_DEC_REG(318, 31, 0x1)
> +
> +#define av1_timeout_cycles		AV1_DEC_REG(319, 0, 0x7fffffff)
> +#define av1_timeout_override_e		AV1_DEC_REG(319, 31, 0x1)
> +
> +#define av1_pp_out_e			AV1_DEC_REG(320, 0, 0x1)
> +#define av1_pp_cr_first			AV1_DEC_REG(320, 1, 0x1)
> +#define av1_pp_out_mode			AV1_DEC_REG(320, 2, 0x1)
> +#define av1_pp_out_tile_e		AV1_DEC_REG(320, 3, 0x1)
> +#define av1_pp_status			AV1_DEC_REG(320, 4, 0xf)
> +#define av1_pp_in_blk_size		AV1_DEC_REG(320, 8, 0x7)
> +#define av1_pp_out_p010_fmt		AV1_DEC_REG(320, 11, 0x3)
> +#define av1_pp_out_rgb_fmt		AV1_DEC_REG(320, 13, 0x1f)
> +#define av1_rgb_range_max		AV1_DEC_REG(320, 18, 0xfff)
> +#define av1_pp_rgb_planar		AV1_DEC_REG(320, 30, 0x1)
> +
> +#define av1_scale_hratio		AV1_DEC_REG(322, 0, 0x3ffff)
> +#define av1_pp_out_format		AV1_DEC_REG(322, 18, 0x1f)
> +#define av1_ver_scale_mode		AV1_DEC_REG(322, 23, 0x3)
> +#define av1_hor_scale_mode		AV1_DEC_REG(322, 25, 0x3)
> +#define av1_pp_in_format		AV1_DEC_REG(322, 27, 0x1f)
> +
> +#define av1_pp_out_c_stride		AV1_DEC_REG(329, 0, 0xffff)
> +#define av1_pp_out_y_stride		AV1_DEC_REG(329, 16, 0xffff)
> +
> +#define av1_pp_in_height		AV1_DEC_REG(331, 0, 0xffff)
> +#define av1_pp_in_width			AV1_DEC_REG(331, 16, 0xffff)
> +
> +#define av1_pp_out_height		AV1_DEC_REG(332, 0, 0xffff)
> +#define av1_pp_out_width		AV1_DEC_REG(332, 16, 0xffff)
> +
> +#define av1_pp1_dup_ver			AV1_DEC_REG(394, 0, 0xff)
> +#define av1_pp1_dup_hor			AV1_DEC_REG(394, 8, 0xff)
> +#define av1_pp0_dup_ver			AV1_DEC_REG(394, 16, 0xff)
> +#define av1_pp0_dup_hor			AV1_DEC_REG(394, 24, 0xff)
> +
> +#define AV1_TILE_OUT_LU			(AV1_SWREG(65))
> +#define AV1_REFERENCE_Y(i)		(AV1_SWREG(67) + ((i) * 0x8))
> +#define AV1_SEGMENTATION		(AV1_SWREG(81))
> +#define AV1_GLOBAL_MODEL		(AV1_SWREG(83))
> +#define AV1_CDEF_COL			(AV1_SWREG(85))
> +#define AV1_SR_COL			(AV1_SWREG(89))
> +#define AV1_LR_COL			(AV1_SWREG(91))
> +#define AV1_FILM_GRAIN			(AV1_SWREG(95))
> +#define AV1_TILE_OUT_CH			(AV1_SWREG(99))
> +#define AV1_REFERENCE_CB(i)		(AV1_SWREG(101) + ((i) * 0x8))
> +#define AV1_TILE_OUT_MV			(AV1_SWREG(133))
> +#define AV1_REFERENCE_MV(i)		(AV1_SWREG(135) + ((i) * 0x8))
> +#define AV1_TILE_BASE			(AV1_SWREG(167))
> +#define AV1_INPUT_STREAM		(AV1_SWREG(169))
> +#define AV1_PROP_TABLE_OUT		(AV1_SWREG(171))
> +#define AV1_PROP_TABLE			(AV1_SWREG(173))
> +#define AV1_MC_SYNC_CURR		(AV1_SWREG(175))
> +#define AV1_MC_SYNC_LEFT		(AV1_SWREG(177))
> +#define AV1_DB_DATA_COL			(AV1_SWREG(179))
> +#define AV1_DB_CTRL_COL			(AV1_SWREG(183))
> +#define AV1_PP_OUT_LU			(AV1_SWREG(326))
> +#define AV1_PP_OUT_CH			(AV1_SWREG(328))
> +
> +#endif /* _ROCKCHIP_VPU981_REGS_H_ */
Nicolas Dufresne April 11, 2023, 3:17 p.m. UTC | #9
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> Film grain feature add "old style" grain noise on decoded streams.
> Grain noise is applied after decoding by the postprocessor.
> The level of grain is based on gaussian sequence.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> 
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  drivers/media/platform/verisilicon/Makefile   |   1 +
>  .../media/platform/verisilicon/hantro_hw.h    |   3 +
>  .../verisilicon/rockchip_av1_filmgrain.c      | 401 ++++++++++++++++++
>  .../verisilicon/rockchip_av1_filmgrain.h      |  36 ++
>  .../verisilicon/rockchip_vpu981_hw_av1_dec.c  | 210 +++++++++
>  5 files changed, 651 insertions(+)
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c
>  create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h
> 
> diff --git a/drivers/media/platform/verisilicon/Makefile b/drivers/media/platform/verisilicon/Makefile
> index c9a9806ab8c5..6ad2ef885920 100644
> --- a/drivers/media/platform/verisilicon/Makefile
> +++ b/drivers/media/platform/verisilicon/Makefile
> @@ -19,6 +19,7 @@ hantro-vpu-y += \
>  		rockchip_vpu2_hw_mpeg2_dec.o \
>  		rockchip_vpu2_hw_vp8_dec.o \
>  		rockchip_vpu981_hw_av1_dec.o \
> +		rockchip_av1_filmgrain.o \
>  		rockchip_av1_entropymode.o \
>  		hantro_jpeg.o \
>  		hantro_h264.o \
> diff --git a/drivers/media/platform/verisilicon/hantro_hw.h b/drivers/media/platform/verisilicon/hantro_hw.h
> index 25456fb960c8..e3d303cea7f6 100644
> --- a/drivers/media/platform/verisilicon/hantro_hw.h
> +++ b/drivers/media/platform/verisilicon/hantro_hw.h
> @@ -16,6 +16,7 @@
>  #include <media/videobuf2-core.h>
>  
>  #include "rockchip_av1_entropymode.h"
> +#include "rockchip_av1_filmgrain.h"
>  
>  #define DEC_8190_ALIGN_MASK	0x07U
>  
> @@ -288,6 +289,7 @@ struct hantro_av1_frame_ref {
>   * @global_model:	global model buffer
>   * @tile_info:		tile info buffer
>   * @segment:		segmentation info buffer
> + * @film_grain:		film grain buffer
>   * @prob_tbl:		probability table
>   * @prob_tbl_out:	probability table output
>   * @tile_buf:		tile buffer
> @@ -312,6 +314,7 @@ struct hantro_av1_dec_hw_ctx {
>  	struct hantro_aux_buf global_model;
>  	struct hantro_aux_buf tile_info;
>  	struct hantro_aux_buf segment;
> +	struct hantro_aux_buf film_grain;
>  	struct hantro_aux_buf prob_tbl;
>  	struct hantro_aux_buf prob_tbl_out;
>  	struct hantro_aux_buf tile_buf;
> diff --git a/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c b/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c
> new file mode 100644
> index 000000000000..f2ae84f0b436
> --- /dev/null
> +++ b/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c
> @@ -0,0 +1,401 @@
> +// SPDX-License-Identifier: GPL-2.0-only or Apache-2.0
> +
> +#include "rockchip_av1_filmgrain.h"
> +
> +static const s32 gaussian_sequence[2048] = {
> +	56, 568, -180, 172, 124, -84, 172, -64, -900, 24, 820,
> +	224, 1248, 996, 272, -8, -916, -388, -732, -104, -188, 800,
> +	112, -652, -320, -376, 140, -252, 492, -168, 44, -788, 588,
> +	-584, 500, -228, 12, 680, 272, -476, 972, -100, 652, 368,
> +	432, -196, -720, -192, 1000, -332, 652, -136, -552, -604, -4,
> +	192, -220, -136, 1000, -52, 372, -96, -624, 124, -24, 396,
> +	540, -12, -104, 640, 464, 244, -208, -84, 368, -528, -740,
> +	248, -968, -848, 608, 376, -60, -292, -40, -156, 252, -292,
> +	248, 224, -280, 400, -244, 244, -60, 76, -80, 212, 532,
> +	340, 128, -36, 824, -352, -60, -264, -96, -612, 416, -704,
> +	220, -204, 640, -160, 1220, -408, 900, 336, 20, -336, -96,
> +	-792, 304, 48, -28, -1232, -1172, -448, 104, -292, -520, 244,
> +	60, -948, 0, -708, 268, 108, 356, -548, 488, -344, -136,
> +	488, -196, -224, 656, -236, -1128, 60, 4, 140, 276, -676,
> +	-376, 168, -108, 464, 8, 564, 64, 240, 308, -300, -400,
> +	-456, -136, 56, 120, -408, -116, 436, 504, -232, 328, 844,
> +	-164, -84, 784, -168, 232, -224, 348, -376, 128, 568, 96,
> +	-1244, -288, 276, 848, 832, -360, 656, 464, -384, -332, -356,
> +	728, -388, 160, -192, 468, 296, 224, 140, -776, -100, 280,
> +	4, 196, 44, -36, -648, 932, 16, 1428, 28, 528, 808,
> +	772, 20, 268, 88, -332, -284, 124, -384, -448, 208, -228,
> +	-1044, -328, 660, 380, -148, -300, 588, 240, 540, 28, 136,
> +	-88, -436, 256, 296, -1000, 1400, 0, -48, 1056, -136, 264,
> +	-528, -1108, 632, -484, -592, -344, 796, 124, -668, -768, 388,
> +	1296, -232, -188, -200, -288, -4, 308, 100, -168, 256, -500,
> +	204, -508, 648, -136, 372, -272, -120, -1004, -552, -548, -384,
> +	548, -296, 428, -108, -8, -912, -324, -224, -88, -112, -220,
> +	-100, 996, -796, 548, 360, -216, 180, 428, -200, -212, 148,
> +	96, 148, 284, 216, -412, -320, 120, -300, -384, -604, -572,
> +	-332, -8, -180, -176, 696, 116, -88, 628, 76, 44, -516,
> +	240, -208, -40, 100, -592, 344, -308, -452, -228, 20, 916,
> +	-1752, -136, -340, -804, 140, 40, 512, 340, 248, 184, -492,
> +	896, -156, 932, -628, 328, -688, -448, -616, -752, -100, 560,
> +	-1020, 180, -800, -64, 76, 576, 1068, 396, 660, 552, -108,
> +	-28, 320, -628, 312, -92, -92, -472, 268, 16, 560, 516,
> +	-672, -52, 492, -100, 260, 384, 284, 292, 304, -148, 88,
> +	-152, 1012, 1064, -228, 164, -376, -684, 592, -392, 156, 196,
> +	-524, -64, -884, 160, -176, 636, 648, 404, -396, -436, 864,
> +	424, -728, 988, -604, 904, -592, 296, -224, 536, -176, -920,
> +	436, -48, 1176, -884, 416, -776, -824, -884, 524, -548, -564,
> +	-68, -164, -96, 692, 364, -692, -1012, -68, 260, -480, 876,
> +	-1116, 452, -332, -352, 892, -1088, 1220, -676, 12, -292, 244,
> +	496, 372, -32, 280, 200, 112, -440, -96, 24, -644, -184,
> +	56, -432, 224, -980, 272, -260, 144, -436, 420, 356, 364,
> +	-528, 76, 172, -744, -368, 404, -752, -416, 684, -688, 72,
> +	540, 416, 92, 444, 480, -72, -1416, 164, -1172, -68, 24,
> +	424, 264, 1040, 128, -912, -524, -356, 64, 876, -12, 4,
> +	-88, 532, 272, -524, 320, 276, -508, 940, 24, -400, -120,
> +	756, 60, 236, -412, 100, 376, -484, 400, -100, -740, -108,
> +	-260, 328, -268, 224, -200, -416, 184, -604, -564, -20, 296,
> +	60, 892, -888, 60, 164, 68, -760, 216, -296, 904, -336,
> +	-28, 404, -356, -568, -208, -1480, -512, 296, 328, -360, -164,
> +	-1560, -776, 1156, -428, 164, -504, -112, 120, -216, -148, -264,
> +	308, 32, 64, -72, 72, 116, 176, -64, -272, 460, -536,
> +	-784, -280, 348, 108, -752, -132, 524, -540, -776, 116, -296,
> +	-1196, -288, -560, 1040, -472, 116, -848, -1116, 116, 636, 696,
> +	284, -176, 1016, 204, -864, -648, -248, 356, 972, -584, -204,
> +	264, 880, 528, -24, -184, 116, 448, -144, 828, 524, 212,
> +	-212, 52, 12, 200, 268, -488, -404, -880, 824, -672, -40,
> +	908, -248, 500, 716, -576, 492, -576, 16, 720, -108, 384,
> +	124, 344, 280, 576, -500, 252, 104, -308, 196, -188, -8,
> +	1268, 296, 1032, -1196, 436, 316, 372, -432, -200, -660, 704,
> +	-224, 596, -132, 268, 32, -452, 884, 104, -1008, 424, -1348,
> +	-280, 4, -1168, 368, 476, 696, 300, -8, 24, 180, -592,
> +	-196, 388, 304, 500, 724, -160, 244, -84, 272, -256, -420,
> +	320, 208, -144, -156, 156, 364, 452, 28, 540, 316, 220,
> +	-644, -248, 464, 72, 360, 32, -388, 496, -680, -48, 208,
> +	-116, -408, 60, -604, -392, 548, -840, 784, -460, 656, -544,
> +	-388, -264, 908, -800, -628, -612, -568, 572, -220, 164, 288,
> +	-16, -308, 308, -112, -636, -760, 280, -668, 432, 364, 240,
> +	-196, 604, 340, 384, 196, 592, -44, -500, 432, -580, -132,
> +	636, -76, 392, 4, -412, 540, 508, 328, -356, -36, 16,
> +	-220, -64, -248, -60, 24, -192, 368, 1040, 92, -24, -1044,
> +	-32, 40, 104, 148, 192, -136, -520, 56, -816, -224, 732,
> +	392, 356, 212, -80, -424, -1008, -324, 588, -1496, 576, 460,
> +	-816, -848, 56, -580, -92, -1372, -112, -496, 200, 364, 52,
> +	-140, 48, -48, -60, 84, 72, 40, 132, -356, -268, -104,
> +	-284, -404, 732, -520, 164, -304, -540, 120, 328, -76, -460,
> +	756, 388, 588, 236, -436, -72, -176, -404, -316, -148, 716,
> +	-604, 404, -72, -88, -888, -68, 944, 88, -220, -344, 960,
> +	472, 460, -232, 704, 120, 832, -228, 692, -508, 132, -476,
> +	844, -748, -364, -44, 1116, -1104, -1056, 76, 428, 552, -692,
> +	60, 356, 96, -384, -188, -612, -576, 736, 508, 892, 352,
> +	-1132, 504, -24, -352, 324, 332, -600, -312, 292, 508, -144,
> +	-8, 484, 48, 284, -260, -240, 256, -100, -292, -204, -44,
> +	472, -204, 908, -188, -1000, -256, 92, 1164, -392, 564, 356,
> +	652, -28, -884, 256, 484, -192, 760, -176, 376, -524, -452,
> +	-436, 860, -736, 212, 124, 504, -476, 468, 76, -472, 552,
> +	-692, -944, -620, 740, -240, 400, 132, 20, 192, -196, 264,
> +	-668, -1012, -60, 296, -316, -828, 76, -156, 284, -768, -448,
> +	-832, 148, 248, 652, 616, 1236, 288, -328, -400, -124, 588,
> +	220, 520, -696, 1032, 768, -740, -92, -272, 296, 448, -464,
> +	412, -200, 392, 440, -200, 264, -152, -260, 320, 1032, 216,
> +	320, -8, -64, 156, -1016, 1084, 1172, 536, 484, -432, 132,
> +	372, -52, -256, 84, 116, -352, 48, 116, 304, -384, 412,
> +	924, -300, 528, 628, 180, 648, 44, -980, -220, 1320, 48,
> +	332, 748, 524, -268, -720, 540, -276, 564, -344, -208, -196,
> +	436, 896, 88, -392, 132, 80, -964, -288, 568, 56, -48,
> +	-456, 888, 8, 552, -156, -292, 948, 288, 128, -716, -292,
> +	1192, -152, 876, 352, -600, -260, -812, -468, -28, -120, -32,
> +	-44, 1284, 496, 192, 464, 312, -76, -516, -380, -456, -1012,
> +	-48, 308, -156, 36, 492, -156, -808, 188, 1652, 68, -120,
> +	-116, 316, 160, -140, 352, 808, -416, 592, 316, -480, 56,
> +	528, -204, -568, 372, -232, 752, -344, 744, -4, 324, -416,
> +	-600, 768, 268, -248, -88, -132, -420, -432, 80, -288, 404,
> +	-316, -1216, -588, 520, -108, 92, -320, 368, -480, -216, -92,
> +	1688, -300, 180, 1020, -176, 820, -68, -228, -260, 436, -904,
> +	20, 40, -508, 440, -736, 312, 332, 204, 760, -372, 728,
> +	96, -20, -632, -520, -560, 336, 1076, -64, -532, 776, 584,
> +	192, 396, -728, -520, 276, -188, 80, -52, -612, -252, -48,
> +	648, 212, -688, 228, -52, -260, 428, -412, -272, -404, 180,
> +	816, -796, 48, 152, 484, -88, -216, 988, 696, 188, -528,
> +	648, -116, -180, 316, 476, 12, -564, 96, 476, -252, -364,
> +	-376, -392, 556, -256, -576, 260, -352, 120, -16, -136, -260,
> +	-492, 72, 556, 660, 580, 616, 772, 436, 424, -32, -324,
> +	-1268, 416, -324, -80, 920, 160, 228, 724, 32, -516, 64,
> +	384, 68, -128, 136, 240, 248, -204, -68, 252, -932, -120,
> +	-480, -628, -84, 192, 852, -404, -288, -132, 204, 100, 168,
> +	-68, -196, -868, 460, 1080, 380, -80, 244, 0, 484, -888,
> +	64, 184, 352, 600, 460, 164, 604, -196, 320, -64, 588,
> +	-184, 228, 12, 372, 48, -848, -344, 224, 208, -200, 484,
> +	128, -20, 272, -468, -840, 384, 256, -720, -520, -464, -580,
> +	112, -120, 644, -356, -208, -608, -528, 704, 560, -424, 392,
> +	828, 40, 84, 200, -152, 0, -144, 584, 280, -120, 80,
> +	-556, -972, -196, -472, 724, 80, 168, -32, 88, 160, -688,
> +	0, 160, 356, 372, -776, 740, -128, 676, -248, -480, 4,
> +	-364, 96, 544, 232, -1032, 956, 236, 356, 20, -40, 300,
> +	24, -676, -596, 132, 1120, -104, 532, -1096, 568, 648, 444,
> +	508, 380, 188, -376, -604, 1488, 424, 24, 756, -220, -192,
> +	716, 120, 920, 688, 168, 44, -460, 568, 284, 1144, 1160,
> +	600, 424, 888, 656, -356, -320, 220, 316, -176, -724, -188,
> +	-816, -628, -348, -228, -380, 1012, -452, -660, 736, 928, 404,
> +	-696, -72, -268, -892, 128, 184, -344, -780, 360, 336, 400,
> +	344, 428, 548, -112, 136, -228, -216, -820, -516, 340, 92,
> +	-136, 116, -300, 376, -244, 100, -316, -520, -284, -12, 824,
> +	164, -548, -180, -128, 116, -924, -828, 268, -368, -580, 620,
> +	192, 160, 0, -1676, 1068, 424, -56, -360, 468, -156, 720,
> +	288, -528, 556, -364, 548, -148, 504, 316, 152, -648, -620,
> +	-684, -24, -376, -384, -108, -920, -1032, 768, 180, -264, -508,
> +	-1268, -260, -60, 300, -240, 988, 724, -376, -576, -212, -736,
> +	556, 192, 1092, -620, -880, 376, -56, -4, -216, -32, 836,
> +	268, 396, 1332, 864, -600, 100, 56, -412, -92, 356, 180,
> +	884, -468, -436, 292, -388, -804, -704, -840, 368, -348, 140,
> +	-724, 1536, 940, 372, 112, -372, 436, -480, 1136, 296, -32,
> +	-228, 132, -48, -220, 868, -1016, -60, -1044, -464, 328, 916,
> +	244, 12, -736, -296, 360, 468, -376, -108, -92, 788, 368,
> +	-56, 544, 400, -672, -420, 728, 16, 320, 44, -284, -380,
> +	-796, 488, 132, 204, -596, -372, 88, -152, -908, -636, -572,
> +	-624, -116, -692, -200, -56, 276, -88, 484, -324, 948, 864,
> +	1000, -456, -184, -276, 292, -296, 156, 676, 320, 160, 908,
> +	-84, -1236, -288, -116, 260, -372, -644, 732, -756, -96, 84,
> +	344, -520, 348, -688, 240, -84, 216, -1044, -136, -676, -396,
> +	-1500, 960, -40, 176, 168, 1516, 420, -504, -344, -364, -360,
> +	1216, -940, -380, -212, 252, -660, -708, 484, -444, -152, 928,
> +	-120, 1112, 476, -260, 560, -148, -344, 108, -196, 228, -288,
> +	504, 560, -328, -88, 288, -1008, 460, -228, 468, -836, -196,
> +	76, 388, 232, 412, -1168, -716, -644, 756, -172, -356, -504,
> +	116, 432, 528, 48, 476, -168, -608, 448, 160, -532, -272,
> +	28, -676, -12, 828, 980, 456, 520, 104, -104, 256, -344,
> +	-4, -28, -368, -52, -524, -572, -556, -200, 768, 1124, -208,
> +	-512, 176, 232, 248, -148, -888, 604, -600, -304, 804, -156,
> +	-212, 488, -192, -804, -256, 368, -360, -916, -328, 228, -240,
> +	-448, -472, 856, -556, -364, 572, -12, -156, -368, -340, 432,
> +	252, -752, -152, 288, 268, -580, -848, -592, 108, -76, 244,
> +	312, -716, 592, -80, 436, 360, 4, -248, 160, 516, 584,
> +	732, 44, -468, -280, -292, -156, -588, 28, 308, 912, 24,
> +	124, 156, 180, -252, 944, -924, -772, -520, -428, -624, 300,
> +	-212, -1144, 32, -724, 800, -1128, -212, -1288, -848, 180, -416,
> +	440, 192, -576, -792, -76, -1080, 80, -532, -352, -132, 380,
> +	-820, 148, 1112, 128, 164, 456, 700, -924, 144, -668, -384,
> +	648, -832, 508, 552, -52, -100, -656, 208, -568, 748, -88,
> +	680, 232, 300, 192, -408, -1012, -152, -252, -268, 272, -876,
> +	-664, -648, -332, -136, 16, 12, 1152, -28, 332, -536, 320,
> +	-672, -460, -316, 532, -260, 228, -40, 1052, -816, 180, 88,
> +	-496, -556, -672, -368, 428, 92, 356, 404, -408, 252, 196,
> +	-176, -556, 792, 268, 32, 372, 40, 96, -332, 328, 120,
> +	372, -900, -40, 472, -264, -592, 952, 128, 656, 112, 664,
> +	-232, 420, 4, -344, -464, 556, 244, -416, -32, 252, 0,
> +	-412, 188, -696, 508, -476, 324, -1096, 656, -312, 560, 264,
> +	-136, 304, 160, -64, -580, 248, 336, -720, 560, -348, -288,
> +	-276, -196, -500, 852, -544, -236, -1128, -992, -776, 116, 56,
> +	52, 860, 884, 212, -12, 168, 1020, 512, -552, 924, -148,
> +	716, 188, 164, -340, -520, -184, 880, -152, -680, -208, -1156,
> +	-300, -528, -472, 364, 100, -744, -1056, -32, 540, 280, 144,
> +	-676, -32, -232, -280, -224, 96, 568, -76, 172, 148, 148,
> +	104, 32, -296, -32, 788, -80, 32, -16, 280, 288, 944,
> +	428, -484
> +};
> +
> +static inline s32 clamp(s32 value, s32 low, s32 high)
> +{
> +	return value < low ? low : (value > high ? high : value);
> +}
> +
> +static inline s32 round_power_of_two(const s32 val, s32 n)
> +{
> +	const s32 a = (s32)1 << (n - 1);
> +
> +	return (val + a) >> n;
> +}
> +
> +static void rockchip_av1_init_random_generator(u8 luma_num, u16 seed,
> +					       u16 *random_register)
> +{
> +	u16 random_reg = seed;
> +
> +	random_reg ^= ((luma_num * 37 + 178) & 255) << 8;
> +	random_reg ^= ((luma_num * 173 + 105) & 255);
> +	*random_register = random_reg;
> +}
> +
> +static inline void rockchip_av1_update_random_register(u16 *random_register)
> +{
> +	u16 bit;
> +	u16 random_reg = *random_register;
> +
> +	bit = ((random_reg >> 0) ^ (random_reg >> 1) ^ (random_reg >> 3) ^
> +	       (random_reg >> 12)) & 1;
> +	*random_register = (random_reg >> 1) | (bit << 15);
> +}
> +
> +static inline s32 rockchip_av1_get_random_number(u16 random_register)
> +{
> +	return (random_register >> 5) & ((1 << 11) - 1);
> +}
> +
> +void rockchip_av1_generate_luma_grain_block(s32 (*luma_grain_block)[73][82],
> +					    s32 bitdepth,
> +					    u8 num_y_points,
> +					    s32 grain_scale_shift,
> +					    s32 ar_coeff_lag,
> +					    s32 (*ar_coeffs_y)[24],
> +					    s32 ar_coeff_shift,
> +					    s32 grain_min,
> +					    s32 grain_max,
> +					    u16 random_seed)
> +{
> +	s32 gauss_sec_shift = 12 - bitdepth + grain_scale_shift;
> +	u16 grain_random_register = random_seed;
> +	s32 i, j;
> +
> +	for (i = 0; i < 73; i++) {
> +		for (j = 0; j < 82; j++) {
> +			if (num_y_points > 0) {
> +				rockchip_av1_update_random_register
> +				    (&grain_random_register);
> +				(*luma_grain_block)[i][j] =
> +				    round_power_of_two(gaussian_sequence
> +					     [rockchip_av1_get_random_number
> +					      (grain_random_register)],
> +					     gauss_sec_shift);
> +			} else {
> +				(*luma_grain_block)[i][j] = 0;
> +			}
> +		}
> +	}
> +
> +	for (i = 3; i < 73; i++)
> +		for (j = 3; j < 82 - 3; j++) {
> +			s32 pos = 0;
> +			s32 wsum = 0;
> +			s32 deltarow, deltacol;
> +
> +			for (deltarow = -ar_coeff_lag; deltarow <= 0;
> +			     deltarow++) {
> +				for (deltacol = -ar_coeff_lag;
> +				     deltacol <= ar_coeff_lag; deltacol++) {
> +					if (deltarow == 0 && deltacol == 0)
> +						break;
> +					wsum = wsum + (*ar_coeffs_y)[pos] *
> +					    (*luma_grain_block)[i + deltarow][j + deltacol];
> +					++pos;
> +				}
> +			}
> +			(*luma_grain_block)[i][j] =
> +				clamp((*luma_grain_block)[i][j] +
> +				      round_power_of_two(wsum, ar_coeff_shift),
> +				      grain_min, grain_max);
> +		}
> +}
> +
> +// Calculate chroma grain noise once per frame
> +void rockchip_av1_generate_chroma_grain_block(s32 (*luma_grain_block)[73][82],
> +					      s32 (*cb_grain_block)[38][44],
> +					      s32 (*cr_grain_block)[38][44],
> +					      s32 bitdepth,
> +					      u8 num_y_points,
> +					      u8 num_cb_points,
> +					      u8 num_cr_points,
> +					      s32 grain_scale_shift,
> +					      s32 ar_coeff_lag,
> +					      s32 (*ar_coeffs_cb)[25],
> +					      s32 (*ar_coeffs_cr)[25],
> +					      s32 ar_coeff_shift,
> +					      s32 grain_min,
> +					      s32 grain_max,
> +					      u8 chroma_scaling_from_luma,
> +					      u16 random_seed)
> +{
> +	s32 gauss_sec_shift = 12 - bitdepth + grain_scale_shift;
> +	u16 grain_random_register = 0;
> +	s32 i, j;
> +
> +	rockchip_av1_init_random_generator(7, random_seed,
> +					   &grain_random_register);
> +	for (i = 0; i < 38; i++) {
> +		for (j = 0; j < 44; j++) {
> +			if (num_cb_points || chroma_scaling_from_luma) {
> +				rockchip_av1_update_random_register
> +				    (&grain_random_register);
> +				(*cb_grain_block)[i][j] =
> +				    round_power_of_two(gaussian_sequence
> +					     [rockchip_av1_get_random_number
> +					      (grain_random_register)],
> +					     gauss_sec_shift);
> +			} else {
> +				(*cb_grain_block)[i][j] = 0;
> +			}
> +		}
> +	}
> +
> +	rockchip_av1_init_random_generator(11, random_seed,
> +					   &grain_random_register);
> +	for (i = 0; i < 38; i++) {
> +		for (j = 0; j < 44; j++) {
> +			if (num_cr_points || chroma_scaling_from_luma) {
> +				rockchip_av1_update_random_register
> +				    (&grain_random_register);
> +				(*cr_grain_block)[i][j] =
> +				    round_power_of_two(gaussian_sequence
> +					     [rockchip_av1_get_random_number
> +					      (grain_random_register)],
> +					     gauss_sec_shift);
> +			} else {
> +				(*cr_grain_block)[i][j] = 0;
> +			}
> +		}
> +	}
> +
> +	for (i = 3; i < 38; i++) {
> +		for (j = 3; j < 44 - 3; j++) {
> +			s32 wsum_cb = 0;
> +			s32 wsum_cr = 0;
> +			s32 pos = 0;
> +			s32 deltarow, deltacol;
> +
> +			for (deltarow = -ar_coeff_lag; deltarow <= 0;
> +			     deltarow++) {
> +				for (deltacol = -ar_coeff_lag;
> +				     deltacol <= ar_coeff_lag; deltacol++) {
> +					if (deltarow == 0 && deltacol == 0)
> +						break;
> +					wsum_cb = wsum_cb + (*ar_coeffs_cb)[pos] *
> +					    (*cb_grain_block)[i + deltarow][j + deltacol];
> +					wsum_cr =
> +					    wsum_cr +
> +					    (*ar_coeffs_cr)[pos] *
> +					    (*cr_grain_block)[i + deltarow][j + deltacol];
> +					++pos;
> +				}
> +			}
> +
> +			if (num_y_points > 0) {
> +				s32 av_luma = 0;
> +				s32 luma_coord_y = (i << 1) - 3;
> +				s32 luma_coord_x = (j << 1) - 3;
> +
> +				av_luma +=
> +				    (*luma_grain_block)[luma_coord_y][luma_coord_x];
> +				av_luma +=
> +				    (*luma_grain_block)[luma_coord_y][luma_coord_x + 1];
> +				av_luma +=
> +				    (*luma_grain_block)[luma_coord_y + 1][luma_coord_x];
> +				av_luma +=
> +				    (*luma_grain_block)[(luma_coord_y + 1)][luma_coord_x + 1];
> +				av_luma = round_power_of_two(av_luma, 2);
> +
> +				wsum_cb = wsum_cb + (*ar_coeffs_cb)[pos] * av_luma;
> +				wsum_cr = wsum_cr + (*ar_coeffs_cr)[pos] * av_luma;
> +			}
> +
> +			if (num_cb_points || chroma_scaling_from_luma) {
> +				(*cb_grain_block)[i][j] =
> +				    clamp((*cb_grain_block)[i][j] +
> +					  round_power_of_two(wsum_cb, ar_coeff_shift),
> +					  grain_min, grain_max);
> +			}
> +			if (num_cr_points || chroma_scaling_from_luma) {
> +				(*cr_grain_block)[i][j] =
> +				    clamp((*cr_grain_block)[i][j] +
> +					  round_power_of_two(wsum_cr, ar_coeff_shift),
> +					  grain_min, grain_max);
> +			}
> +		}
> +	}
> +}
> diff --git a/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h b/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h
> new file mode 100644
> index 000000000000..31a8b7920c31
> --- /dev/null
> +++ b/drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h
> @@ -0,0 +1,36 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#ifndef _ROCKCHIP_AV1_FILMGRAIN_H_
> +#define _ROCKCHIP_AV1_FILMGRAIN_H_
> +
> +#include <linux/types.h>
> +
> +void rockchip_av1_generate_luma_grain_block(s32 (*luma_grain_block)[73][82],
> +					    s32 bitdepth,
> +					    u8 num_y_points,
> +					    s32 grain_scale_shift,
> +					    s32 ar_coeff_lag,
> +					    s32 (*ar_coeffs_y)[24],
> +					    s32 ar_coeff_shift,
> +					    s32 grain_min,
> +					    s32 grain_max,
> +					    u16 random_seed);
> +
> +void rockchip_av1_generate_chroma_grain_block(s32 (*luma_grain_block)[73][82],
> +					      s32 (*cb_grain_block)[38][44],
> +					      s32 (*cr_grain_block)[38][44],
> +					      s32 bitdepth,
> +					      u8 num_y_points,
> +					      u8 num_cb_points,
> +					      u8 num_cr_points,
> +					      s32 grain_scale_shift,
> +					      s32 ar_coeff_lag,
> +					      s32 (*ar_coeffs_cb)[25],
> +					      s32 (*ar_coeffs_cr)[25],
> +					      s32 ar_coeff_shift,
> +					      s32 grain_min,
> +					      s32 grain_max,
> +					      u8 chroma_scaling_from_luma,
> +					      u16 random_seed);
> +
> +#endif
> diff --git a/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c b/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
> index a2c9bcebd8bb..d535b0e78f15 100644
> --- a/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
> +++ b/drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c
> @@ -334,6 +334,12 @@ void rockchip_vpu981_av1_dec_exit(struct hantro_ctx *ctx)
>  				  av1_dec->tile_info.dma);
>  	av1_dec->tile_info.cpu = NULL;
>  
> +	if (av1_dec->film_grain.cpu)
> +		dma_free_coherent(vpu->dev, av1_dec->film_grain.size,
> +				  av1_dec->film_grain.cpu,
> +				  av1_dec->film_grain.dma);
> +	av1_dec->film_grain.cpu = NULL;
> +
>  	if (av1_dec->prob_tbl.cpu)
>  		dma_free_coherent(vpu->dev, av1_dec->prob_tbl.size,
>  				  av1_dec->prob_tbl.cpu, av1_dec->prob_tbl.dma);
> @@ -374,6 +380,14 @@ int rockchip_vpu981_av1_dec_init(struct hantro_ctx *ctx)
>  		return -ENOMEM;
>  	av1_dec->tile_info.size = AV1_MAX_TILES;
>  
> +	av1_dec->film_grain.cpu = dma_alloc_coherent(vpu->dev,
> +						     ALIGN(sizeof(struct rockchip_av1_film_grain), 2048),
> +						     &av1_dec->film_grain.dma,
> +						     GFP_KERNEL);
> +	if (!av1_dec->film_grain.cpu)
> +		return -ENOMEM;
> +	av1_dec->film_grain.size = ALIGN(sizeof(struct rockchip_av1_film_grain), 2048);
> +
>  	av1_dec->prob_tbl.cpu = dma_alloc_coherent(vpu->dev,
>  						   ALIGN(sizeof(struct av1cdfs), 2048),
>  						   &av1_dec->prob_tbl.dma,
> @@ -1180,6 +1194,201 @@ static void rockchip_vpu981_av1_dec_set_prob(struct hantro_ctx *ctx)
>  	hantro_write_addr(vpu, AV1_PROP_TABLE, av1_dec->prob_tbl.dma);
>  }
>  
> +static void
> +rockchip_vpu981_av1_dec_init_scaling_function(const u8 *values, const u8 *scaling,
> +					      u8 num_points, u8 *scaling_lut)
> +{
> +	int i, point;
> +
> +	if (num_points == 0) {
> +		memset(scaling_lut, 0, 256);
> +		return;
> +	}
> +
> +	for (point = 0; point < num_points - 1; point++) {
> +		int x;
> +		s32 delta_y = scaling[point + 1] - scaling[point];
> +		s32 delta_x = values[point + 1] - values[point];
> +		s64 delta =
> +		    delta_x ? delta_y * ((65536 + (delta_x >> 1)) /
> +					 delta_x) : 0;
> +
> +		for (x = 0; x < delta_x; x++) {
> +			scaling_lut[values[point] + x] =
> +			    scaling[point] +
> +			    (s32)((x * delta + 32768) >> 16);
> +		}
> +	}
> +
> +	for (i = values[num_points - 1]; i < 256; i++)
> +		scaling_lut[i] = scaling[num_points - 1];
> +}
> +
> +static void rockchip_vpu981_av1_dec_set_fgs(struct hantro_ctx *ctx)
> +{
> +	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> +	struct hantro_av1_dec_ctrls *ctrls = &av1_dec->ctrls;
> +	const struct v4l2_ctrl_av1_film_grain *film_grain = ctrls->film_grain;
> +	struct rockchip_av1_film_grain *fgmem = av1_dec->film_grain.cpu;
> +	struct hantro_dev *vpu = ctx->dev;
> +	bool scaling_from_luma =
> +		!!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_CHROMA_SCALING_FROM_LUMA);
> +	s32 (*ar_coeffs_y)[24];
> +	s32 (*ar_coeffs_cb)[25];
> +	s32 (*ar_coeffs_cr)[25];
> +	s32 (*luma_grain_block)[73][82];
> +	s32 (*cb_grain_block)[38][44];
> +	s32 (*cr_grain_block)[38][44];
> +	s32 ar_coeff_lag, ar_coeff_shift;
> +	s32 grain_scale_shift, bitdepth;
> +	s32 grain_center, grain_min, grain_max;
> +	int i, j;
> +
> +	hantro_reg_write(vpu, &av1_apply_grain, 0);
> +
> +	if (!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_APPLY_GRAIN)) {
> +		hantro_reg_write(vpu, &av1_num_y_points_b, 0);
> +		hantro_reg_write(vpu, &av1_num_cb_points_b, 0);
> +		hantro_reg_write(vpu, &av1_num_cr_points_b, 0);
> +		hantro_reg_write(vpu, &av1_scaling_shift, 0);
> +		hantro_reg_write(vpu, &av1_cb_mult, 0);
> +		hantro_reg_write(vpu, &av1_cb_luma_mult, 0);
> +		hantro_reg_write(vpu, &av1_cb_offset, 0);
> +		hantro_reg_write(vpu, &av1_cr_mult, 0);
> +		hantro_reg_write(vpu, &av1_cr_luma_mult, 0);
> +		hantro_reg_write(vpu, &av1_cr_offset, 0);
> +		hantro_reg_write(vpu, &av1_overlap_flag, 0);
> +		hantro_reg_write(vpu, &av1_clip_to_restricted_range, 0);
> +		hantro_reg_write(vpu, &av1_chroma_scaling_from_luma, 0);
> +		hantro_reg_write(vpu, &av1_random_seed, 0);
> +		hantro_write_addr(vpu, AV1_FILM_GRAIN, 0);
> +		return;
> +	}
> +
> +	ar_coeffs_y = kzalloc(sizeof(int32_t) * 24, GFP_KERNEL);
> +	ar_coeffs_cb = kzalloc(sizeof(int32_t) * 25, GFP_KERNEL);
> +	ar_coeffs_cr = kzalloc(sizeof(int32_t) * 25, GFP_KERNEL);
> +	luma_grain_block = kzalloc(sizeof(int32_t) * 73 * 82, GFP_KERNEL);
> +	cb_grain_block = kzalloc(sizeof(int32_t) * 38 * 44, GFP_KERNEL);
> +	cr_grain_block = kzalloc(sizeof(int32_t) * 38 * 44, GFP_KERNEL);
> +
> +	if (!ar_coeffs_y || !ar_coeffs_cb || !ar_coeffs_cr ||
> +	    !luma_grain_block || !cb_grain_block || !cr_grain_block) {
> +		pr_warn("Fail allocating memory for film grain parameters\n");
> +		goto alloc_fail;
> +	}
> +
> +	hantro_reg_write(vpu, &av1_apply_grain, 1);
> +
> +	hantro_reg_write(vpu, &av1_num_y_points_b,
> +			 film_grain->num_y_points > 0);
> +	hantro_reg_write(vpu, &av1_num_cb_points_b,
> +			 film_grain->num_cb_points > 0);
> +	hantro_reg_write(vpu, &av1_num_cr_points_b,
> +			 film_grain->num_cr_points > 0);
> +	hantro_reg_write(vpu, &av1_scaling_shift,
> +			 film_grain->grain_scaling_minus_8 + 8);
> +
> +	if (!scaling_from_luma) {
> +		hantro_reg_write(vpu, &av1_cb_mult, film_grain->cb_mult - 128);
> +		hantro_reg_write(vpu, &av1_cb_luma_mult, film_grain->cb_luma_mult - 128);
> +		hantro_reg_write(vpu, &av1_cb_offset, film_grain->cb_offset - 256);
> +		hantro_reg_write(vpu, &av1_cr_mult, film_grain->cr_mult - 128);
> +		hantro_reg_write(vpu, &av1_cr_luma_mult, film_grain->cr_luma_mult - 128);
> +		hantro_reg_write(vpu, &av1_cr_offset, film_grain->cr_offset - 256);
> +	} else {
> +		hantro_reg_write(vpu, &av1_cb_mult, 0);
> +		hantro_reg_write(vpu, &av1_cb_luma_mult, 0);
> +		hantro_reg_write(vpu, &av1_cb_offset, 0);
> +		hantro_reg_write(vpu, &av1_cr_mult, 0);
> +		hantro_reg_write(vpu, &av1_cr_luma_mult, 0);
> +		hantro_reg_write(vpu, &av1_cr_offset, 0);
> +	}
> +
> +	hantro_reg_write(vpu, &av1_overlap_flag,
> +			 !!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_OVERLAP));
> +	hantro_reg_write(vpu, &av1_clip_to_restricted_range,
> +			 !!(film_grain->flags & V4L2_AV1_FILM_GRAIN_FLAG_CLIP_TO_RESTRICTED_RANGE));
> +	hantro_reg_write(vpu, &av1_chroma_scaling_from_luma, scaling_from_luma);
> +	hantro_reg_write(vpu, &av1_random_seed, film_grain->grain_seed);
> +
> +	rockchip_vpu981_av1_dec_init_scaling_function(film_grain->point_y_value,
> +						      film_grain->point_y_scaling,
> +						      film_grain->num_y_points,
> +						      fgmem->scaling_lut_y);
> +
> +	if (film_grain->flags &
> +	    V4L2_AV1_FILM_GRAIN_FLAG_CHROMA_SCALING_FROM_LUMA) {
> +		memcpy(fgmem->scaling_lut_cb, fgmem->scaling_lut_y,
> +		       sizeof(*fgmem->scaling_lut_y) * 256);
> +		memcpy(fgmem->scaling_lut_cr, fgmem->scaling_lut_y,
> +		       sizeof(*fgmem->scaling_lut_y) * 256);
> +	} else {
> +		rockchip_vpu981_av1_dec_init_scaling_function
> +		    (film_grain->point_cb_value, film_grain->point_cb_scaling,
> +		     film_grain->num_cb_points, fgmem->scaling_lut_cb);
> +		rockchip_vpu981_av1_dec_init_scaling_function
> +		    (film_grain->point_cr_value, film_grain->point_cr_scaling,
> +		     film_grain->num_cr_points, fgmem->scaling_lut_cr);
> +	}
> +
> +	for (i = 0; i < V4L2_AV1_AR_COEFFS_SIZE; i++) {
> +		if (i < 24)
> +			(*ar_coeffs_y)[i] = film_grain->ar_coeffs_y_plus_128[i] - 128;
> +		(*ar_coeffs_cb)[i] = film_grain->ar_coeffs_cb_plus_128[i] - 128;
> +		(*ar_coeffs_cr)[i] = film_grain->ar_coeffs_cr_plus_128[i] - 128;
> +	}
> +
> +	ar_coeff_lag = film_grain->ar_coeff_lag;
> +	ar_coeff_shift = film_grain->ar_coeff_shift_minus_6 + 6;
> +	grain_scale_shift = film_grain->grain_scale_shift;
> +	bitdepth = ctx->bit_depth;
> +	grain_center = 128 << (bitdepth - 8);
> +	grain_min = 0 - grain_center;
> +	grain_max = (256 << (bitdepth - 8)) - 1 - grain_center;
> +
> +	rockchip_av1_generate_luma_grain_block(luma_grain_block, bitdepth,
> +					       film_grain->num_y_points, grain_scale_shift,
> +					       ar_coeff_lag, ar_coeffs_y, ar_coeff_shift,
> +					       grain_min, grain_max, film_grain->grain_seed);
> +
> +	rockchip_av1_generate_chroma_grain_block(luma_grain_block, cb_grain_block,
> +						 cr_grain_block, bitdepth,
> +						 film_grain->num_y_points,
> +						 film_grain->num_cb_points,
> +						 film_grain->num_cr_points,
> +						 grain_scale_shift, ar_coeff_lag, ar_coeffs_cb,
> +						 ar_coeffs_cr, ar_coeff_shift, grain_min,
> +						 grain_max,
> +						 scaling_from_luma,
> +						 film_grain->grain_seed);
> +
> +	for (i = 0; i < 64; i++) {
> +		for (j = 0; j < 64; j++)
> +			fgmem->cropped_luma_grain_block[i * 64 + j] =
> +				(*luma_grain_block)[i + 9][j + 9];
> +	}
> +
> +	for (i = 0; i < 32; i++) {
> +		for (j = 0; j < 32; j++) {
> +			fgmem->cropped_chroma_grain_block[i * 64 + 2 * j] =
> +				(*cb_grain_block)[i + 6][j + 6];
> +			fgmem->cropped_chroma_grain_block[i * 64 + 2 * j + 1] =
> +				(*cr_grain_block)[i + 6][j + 6];
> +		}
> +	}
> +
> +	hantro_write_addr(vpu, AV1_FILM_GRAIN, av1_dec->film_grain.dma);
> +
> +alloc_fail:
> +	kfree(ar_coeffs_y);
> +	kfree(ar_coeffs_cb);
> +	kfree(ar_coeffs_cr);
> +	kfree(luma_grain_block);
> +	kfree(cb_grain_block);
> +	kfree(cr_grain_block);
> +}
> +
>  static void rockchip_vpu981_av1_dec_set_cdef(struct hantro_ctx *ctx)
>  {
>  	struct hantro_av1_dec_hw_ctx *av1_dec = &ctx->av1_dec;
> @@ -1917,6 +2126,7 @@ int rockchip_vpu981_av1_dec_run(struct hantro_ctx *ctx)
>  	rockchip_vpu981_av1_dec_set_picture_dimensions(ctx);
>  	rockchip_vpu981_av1_dec_set_cdef(ctx);
>  	rockchip_vpu981_av1_dec_set_lr(ctx);
> +	rockchip_vpu981_av1_dec_set_fgs(ctx);
>  	rockchip_vpu981_av1_dec_set_prob(ctx);
>  
>  	hantro_reg_write(vpu, &av1_dec_mode, AV1_DEC_MODE);
Nicolas Dufresne April 11, 2023, 3:18 p.m. UTC | #10
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> Add rk3588 AV1 decoder to Hantro variant.
> The hardware support image from 64x64 up to 7680x4320
> by steps of 16 pixels.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  .../media/platform/verisilicon/hantro_drv.c   |   1 +
>  .../media/platform/verisilicon/hantro_hw.h    |   6 +
>  .../platform/verisilicon/rockchip_vpu_hw.c    | 134 ++++++++++++++++++
>  3 files changed, 141 insertions(+)
> 
> diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/media/platform/verisilicon/hantro_drv.c
> index 71bd68e63859..aef1de20fc5e 100644
> --- a/drivers/media/platform/verisilicon/hantro_drv.c
> +++ b/drivers/media/platform/verisilicon/hantro_drv.c
> @@ -713,6 +713,7 @@ static const struct of_device_id of_hantro_match[] = {
>  	{ .compatible = "rockchip,rk3399-vpu", .data = &rk3399_vpu_variant, },
>  	{ .compatible = "rockchip,rk3568-vepu", .data = &rk3568_vepu_variant, },
>  	{ .compatible = "rockchip,rk3568-vpu", .data = &rk3568_vpu_variant, },
> +	{ .compatible = "rockchip,rk3588-av1-vpu", .data = &rk3588_vpu981_variant, },
>  #endif
>  #ifdef CONFIG_VIDEO_HANTRO_IMX8M
>  	{ .compatible = "nxp,imx8mm-vpu-g1", .data = &imx8mm_vpu_g1_variant, },
> diff --git a/drivers/media/platform/verisilicon/hantro_hw.h b/drivers/media/platform/verisilicon/hantro_hw.h
> index e3d303cea7f6..7f33f7b07ce4 100644
> --- a/drivers/media/platform/verisilicon/hantro_hw.h
> +++ b/drivers/media/platform/verisilicon/hantro_hw.h
> @@ -403,11 +403,13 @@ extern const struct hantro_variant rk3328_vpu_variant;
>  extern const struct hantro_variant rk3399_vpu_variant;
>  extern const struct hantro_variant rk3568_vepu_variant;
>  extern const struct hantro_variant rk3568_vpu_variant;
> +extern const struct hantro_variant rk3588_vpu981_variant;
>  extern const struct hantro_variant sama5d4_vdec_variant;
>  extern const struct hantro_variant sunxi_vpu_variant;
>  
>  extern const struct hantro_postproc_ops hantro_g1_postproc_ops;
>  extern const struct hantro_postproc_ops hantro_g2_postproc_ops;
> +extern const struct hantro_postproc_ops rockchip_vpu981_postproc_ops;
>  
>  extern const u32 hantro_vp8_dec_mc_filter[8][6];
>  
> @@ -444,6 +446,10 @@ void hantro_hevc_ref_init(struct hantro_ctx *ctx);
>  dma_addr_t hantro_hevc_get_ref_buf(struct hantro_ctx *ctx, s32 poc);
>  int hantro_hevc_add_ref_buf(struct hantro_ctx *ctx, int poc, dma_addr_t addr);
>  
> +int rockchip_vpu981_av1_dec_init(struct hantro_ctx *ctx);
> +void rockchip_vpu981_av1_dec_exit(struct hantro_ctx *ctx);
> +int rockchip_vpu981_av1_dec_run(struct hantro_ctx *ctx);
> +void rockchip_vpu981_av1_dec_done(struct hantro_ctx *ctx);
>  
>  static inline unsigned short hantro_vp9_num_sbs(unsigned short dimension)
>  {
> diff --git a/drivers/media/platform/verisilicon/rockchip_vpu_hw.c b/drivers/media/platform/verisilicon/rockchip_vpu_hw.c
> index 8de6fd2e8eef..fd05e3e2080e 100644
> --- a/drivers/media/platform/verisilicon/rockchip_vpu_hw.c
> +++ b/drivers/media/platform/verisilicon/rockchip_vpu_hw.c
> @@ -13,9 +13,13 @@
>  #include "hantro_g1_regs.h"
>  #include "hantro_h1_regs.h"
>  #include "rockchip_vpu2_regs.h"
> +#include "rockchip_vpu981_regs.h"
>  
>  #define RK3066_ACLK_MAX_FREQ (300 * 1000 * 1000)
>  #define RK3288_ACLK_MAX_FREQ (400 * 1000 * 1000)
> +#define RK3588_ACLK_MAX_FREQ (300 * 1000 * 1000)
> +
> +#define ROCKCHIP_VPU981_MIN_SIZE 64
>  
>  /*
>   * Supported formats.
> @@ -74,6 +78,37 @@ static const struct hantro_fmt rockchip_vpu1_postproc_fmts[] = {
>  	},
>  };
>  
> +static const struct hantro_fmt rockchip_vpu981_postproc_fmts[] = {
> +	{
> +		.fourcc = V4L2_PIX_FMT_NV12,
> +		.codec_mode = HANTRO_MODE_NONE,
> +		.match_depth = true,
> +		.postprocessed = true,
> +		.frmsize = {
> +			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_width = FMT_UHD_WIDTH,
> +			.step_width = MB_DIM,
> +			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_height = FMT_UHD_HEIGHT,
> +			.step_height = MB_DIM,
> +		},
> +	},
> +	{
> +		.fourcc = V4L2_PIX_FMT_P010,
> +		.codec_mode = HANTRO_MODE_NONE,
> +		.match_depth = true,
> +		.postprocessed = true,
> +		.frmsize = {
> +			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_width = FMT_UHD_WIDTH,
> +			.step_width = MB_DIM,
> +			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_height = FMT_UHD_HEIGHT,
> +			.step_height = MB_DIM,
> +		},
> +	},
> +};
> +
>  static const struct hantro_fmt rk3066_vpu_dec_fmts[] = {
>  	{
>  		.fourcc = V4L2_PIX_FMT_NV12,
> @@ -277,6 +312,48 @@ static const struct hantro_fmt rk3399_vpu_dec_fmts[] = {
>  	},
>  };
>  
> +static const struct hantro_fmt rockchip_vpu981_dec_fmts[] = {
> +	{
> +		.fourcc = V4L2_PIX_FMT_NV12_4L4,
> +		.codec_mode = HANTRO_MODE_NONE,
> +		.match_depth = true,
> +		.frmsize = {
> +			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_width = FMT_UHD_WIDTH,
> +			.step_width = MB_DIM,
> +			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_height = FMT_UHD_HEIGHT,
> +			.step_height = MB_DIM,
> +		},
> +	},
> +	{
> +		.fourcc = V4L2_PIX_FMT_NV12_10LE40_4L4,
> +		.codec_mode = HANTRO_MODE_NONE,
> +		.match_depth = true,
> +		.frmsize = {
> +			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_width = FMT_UHD_WIDTH,
> +			.step_width = MB_DIM,
> +			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_height = FMT_UHD_HEIGHT,
> +			.step_height = MB_DIM,
> +		},
> +	},
> +	{
> +		.fourcc = V4L2_PIX_FMT_AV1_FRAME,
> +		.codec_mode = HANTRO_MODE_AV1_DEC,
> +		.max_depth = 2,
> +		.frmsize = {
> +			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_width = FMT_UHD_WIDTH,
> +			.step_width = MB_DIM,
> +			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
> +			.max_height = FMT_UHD_HEIGHT,
> +			.step_height = MB_DIM,
> +		},
> +	},
> +};
> +
>  static irqreturn_t rockchip_vpu1_vepu_irq(int irq, void *dev_id)
>  {
>  	struct hantro_dev *vpu = dev_id;
> @@ -331,6 +408,24 @@ static irqreturn_t rockchip_vpu2_vepu_irq(int irq, void *dev_id)
>  	return IRQ_HANDLED;
>  }
>  
> +static irqreturn_t rk3588_vpu981_irq(int irq, void *dev_id)
> +{
> +	struct hantro_dev *vpu = dev_id;
> +	enum vb2_buffer_state state;
> +	u32 status;
> +
> +	status = vdpu_read(vpu, AV1_REG_INTERRUPT);
> +	state = (status & AV1_REG_INTERRUPT_DEC_RDY_INT) ?
> +		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
> +
> +	vdpu_write(vpu, 0, AV1_REG_INTERRUPT);
> +	vdpu_write(vpu, AV1_REG_CONFIG_DEC_CLK_GATE_E, AV1_REG_CONFIG);
> +
> +	hantro_irq_done(vpu, state);
> +
> +	return IRQ_HANDLED;
> +}
> +
>  static int rk3036_vpu_hw_init(struct hantro_dev *vpu)
>  {
>  	/* Bump ACLK to max. possible freq. to improve performance. */
> @@ -346,6 +441,13 @@ static int rk3066_vpu_hw_init(struct hantro_dev *vpu)
>  	return 0;
>  }
>  
> +static int rk3588_vpu981_hw_init(struct hantro_dev *vpu)
> +{
> +	/* Bump ACLKs to max. possible freq. to improve performance. */
> +	clk_set_rate(vpu->clocks[0].clk, RK3588_ACLK_MAX_FREQ);
> +	return 0;
> +}
> +
>  static int rockchip_vpu_hw_init(struct hantro_dev *vpu)
>  {
>  	/* Bump ACLK to max. possible freq. to improve performance. */
> @@ -498,6 +600,14 @@ static const struct hantro_codec_ops rk3568_vepu_codec_ops[] = {
>  	},
>  };
>  
> +static const struct hantro_codec_ops rk3588_vpu981_codec_ops[] = {
> +	[HANTRO_MODE_AV1_DEC] = {
> +		.run = rockchip_vpu981_av1_dec_run,
> +		.init = rockchip_vpu981_av1_dec_init,
> +		.exit = rockchip_vpu981_av1_dec_exit,
> +		.done = rockchip_vpu981_av1_dec_done,
> +	},
> +};
>  /*
>   * VPU variant.
>   */
> @@ -529,10 +639,18 @@ static const char * const rk3066_vpu_clk_names[] = {
>  	"aclk_vepu", "hclk_vepu"
>  };
>  
> +static const struct hantro_irq rk3588_vpu981_irqs[] = {
> +	{ "vdpu", rk3588_vpu981_irq },
> +};
> +
>  static const char * const rockchip_vpu_clk_names[] = {
>  	"aclk", "hclk"
>  };
>  
> +static const char * const rk3588_vpu981_vpu_clk_names[] = {
> +	"aclk", "hclk", "aclk_vdpu_root", "hclk_vdpu_root"
> +};
> +
>  /* VDPU1/VEPU1 */
>  
>  const struct hantro_variant rk3036_vpu_variant = {
> @@ -678,3 +796,19 @@ const struct hantro_variant px30_vpu_variant = {
>  	.clk_names = rockchip_vpu_clk_names,
>  	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
>  };
> +
> +const struct hantro_variant rk3588_vpu981_variant = {
> +	.dec_offset = 0x0,
> +	.dec_fmts = rockchip_vpu981_dec_fmts,
> +	.num_dec_fmts = ARRAY_SIZE(rockchip_vpu981_dec_fmts),
> +	.postproc_fmts = rockchip_vpu981_postproc_fmts,
> +	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu981_postproc_fmts),
> +	.postproc_ops = &rockchip_vpu981_postproc_ops,
> +	.codec = HANTRO_AV1_DECODER,
> +	.codec_ops = rk3588_vpu981_codec_ops,
> +	.irqs = rk3588_vpu981_irqs,
> +	.num_irqs = ARRAY_SIZE(rk3588_vpu981_irqs),
> +	.init = rk3588_vpu981_hw_init,
> +	.clk_names = rk3588_vpu981_vpu_clk_names,
> +	.num_clocks = ARRAY_SIZE(rk3588_vpu981_vpu_clk_names)
> +};
Nicolas Dufresne April 11, 2023, 3:25 p.m. UTC | #11
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> AV1 film grain feature requires to use the postprocessor to produce
> valid frames. In such case the driver shouldn't propose native pixels
> format but only post-processed pixels format.
> Additionally if when setting a control a value could change capture
> queue pixels formats it is needed to call hantro_reset_raw_fmt().
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> ---
>  drivers/media/platform/verisilicon/hantro.h   |  3 +
>  .../media/platform/verisilicon/hantro_drv.c   | 14 +++--
>  .../platform/verisilicon/hantro_postproc.c    |  6 +-
>  .../media/platform/verisilicon/hantro_v4l2.c  | 57 +++++++++++++------
>  .../media/platform/verisilicon/hantro_v4l2.h  |  5 +-
>  5 files changed, 60 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/media/platform/verisilicon/hantro.h b/drivers/media/platform/verisilicon/hantro.h
> index a98cb40a8d3b..6523ffb74881 100644
> --- a/drivers/media/platform/verisilicon/hantro.h
> +++ b/drivers/media/platform/verisilicon/hantro.h
> @@ -231,6 +231,8 @@ struct hantro_dev {
>   * @ctrl_handler:	Control handler used to register controls.
>   * @jpeg_quality:	User-specified JPEG compression quality.
>   * @bit_depth:		Bit depth of current frame
> + * @need_postproc:	Set to true if the bitstream features require to
> + *			use the post-processor.
>   *
>   * @codec_ops:		Set of operations related to codec mode.
>   * @postproc:		Post-processing context.
> @@ -261,6 +263,7 @@ struct hantro_ctx {
>  
>  	const struct hantro_codec_ops *codec_ops;
>  	struct hantro_postproc_ctx postproc;
> +	bool need_postproc;
>  
>  	/* Specific for particular codec modes. */
>  	union {
> diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/media/platform/verisilicon/hantro_drv.c
> index aef1de20fc5e..7dc9e71186b4 100644
> --- a/drivers/media/platform/verisilicon/hantro_drv.c
> +++ b/drivers/media/platform/verisilicon/hantro_drv.c
> @@ -319,7 +319,7 @@ static int hantro_vp9_s_ctrl(struct v4l2_ctrl *ctrl)
>  		if (ctx->bit_depth == bit_depth)
>  			return 0;
>  
> -		return hantro_reset_raw_fmt(ctx, bit_depth);
> +		return hantro_reset_raw_fmt(ctx, bit_depth, false);

nit: My personal reference is to never add a boolean parameter (unless there is
only 1 parameter) to a function, as a reader will need to refer to the
definition to understand what the parameter is about. There is two easy fix:

1. Wrap the function with boolean into a wrapper:

/* The automatic postproc */
hantro_reset_raw_fmt()

/* The one that forces postproc */
hantro_reset_raw_fmt_forcing_postproc()

2. Use alias to true/false that gives it a readable meaning

#define HANTRO_FORCE_POSTPROC true
#define HANTRO_AUTO_POSTPROC false

One can also use an enum.

With or without this change (though I'd really like if it get cleanup later as
follow up patches).

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

>  	}
>  	default:
>  		return -EINVAL;
> @@ -343,7 +343,7 @@ static int hantro_hevc_s_ctrl(struct v4l2_ctrl *ctrl)
>  		if (ctx->bit_depth == bit_depth)
>  			return 0;
>  
> -		return hantro_reset_raw_fmt(ctx, bit_depth);
> +		return hantro_reset_raw_fmt(ctx, bit_depth, false);
>  	}
>  	default:
>  		return -EINVAL;
> @@ -363,11 +363,17 @@ static int hantro_av1_s_ctrl(struct v4l2_ctrl *ctrl)
>  	case V4L2_CID_STATELESS_AV1_SEQUENCE:
>  	{
>  		int bit_depth = ctrl->p_new.p_av1_sequence->bit_depth;
> +		bool need_postproc = false;
>  
> -		if (ctx->bit_depth == bit_depth)
> +		if (ctrl->p_new.p_av1_sequence->flags
> +		    & V4L2_AV1_SEQUENCE_FLAG_FILM_GRAIN_PARAMS_PRESENT)
> +			need_postproc = true;
> +
> +		if (ctx->bit_depth == bit_depth &&
> +		    ctx->need_postproc == need_postproc)
>  			return 0;
>  
> -		return hantro_reset_raw_fmt(ctx, bit_depth);
> +		return hantro_reset_raw_fmt(ctx, bit_depth, need_postproc);
>  	}
>  	default:
>  		return -EINVAL;
> diff --git a/drivers/media/platform/verisilicon/hantro_postproc.c b/drivers/media/platform/verisilicon/hantro_postproc.c
> index bb16af50719d..22efa0347090 100644
> --- a/drivers/media/platform/verisilicon/hantro_postproc.c
> +++ b/drivers/media/platform/verisilicon/hantro_postproc.c
> @@ -57,6 +57,10 @@ bool hantro_needs_postproc(const struct hantro_ctx *ctx,
>  {
>  	if (ctx->is_encoder)
>  		return false;
> +
> +	if (ctx->need_postproc)
> +		return true;
> +
>  	return fmt->postprocessed;
>  }
>  
> @@ -197,7 +201,7 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
>  	unsigned int i, buf_size;
>  
>  	/* this should always pick native format */
> -	fmt = hantro_get_default_fmt(ctx, false, ctx->bit_depth);
> +	fmt = hantro_get_default_fmt(ctx, false, ctx->bit_depth, false);
>  	if (!fmt)
>  		return -EINVAL;
>  	v4l2_fill_pixfmt_mp(&pix_mp, fmt->fourcc, ctx->src_fmt.width,
> diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.c b/drivers/media/platform/verisilicon/hantro_v4l2.c
> index c218c9781e73..48b37b60c19b 100644
> --- a/drivers/media/platform/verisilicon/hantro_v4l2.c
> +++ b/drivers/media/platform/verisilicon/hantro_v4l2.c
> @@ -31,15 +31,21 @@
>  #define  HANTRO_DEFAULT_BIT_DEPTH 8
>  
>  static int hantro_set_fmt_out(struct hantro_ctx *ctx,
> -			      struct v4l2_pix_format_mplane *pix_mp);
> +			      struct v4l2_pix_format_mplane *pix_mp,
> +			      bool need_postproc);
>  static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
>  			      struct v4l2_pix_format_mplane *pix_mp);
>  
>  static const struct hantro_fmt *
> -hantro_get_formats(const struct hantro_ctx *ctx, unsigned int *num_fmts)
> +hantro_get_formats(const struct hantro_ctx *ctx, unsigned int *num_fmts, bool need_postproc)
>  {
>  	const struct hantro_fmt *formats;
>  
> +	if (need_postproc) {
> +		*num_fmts = 0;
> +		return NULL;
> +	}
> +
>  	if (ctx->is_encoder) {
>  		formats = ctx->dev->variant->enc_fmts;
>  		*num_fmts = ctx->dev->variant->num_enc_fmts;
> @@ -108,7 +114,7 @@ hantro_find_format(const struct hantro_ctx *ctx, u32 fourcc)
>  	const struct hantro_fmt *formats;
>  	unsigned int i, num_fmts;
>  
> -	formats = hantro_get_formats(ctx, &num_fmts);
> +	formats = hantro_get_formats(ctx, &num_fmts, false);
>  	for (i = 0; i < num_fmts; i++)
>  		if (formats[i].fourcc == fourcc)
>  			return &formats[i];
> @@ -121,18 +127,28 @@ hantro_find_format(const struct hantro_ctx *ctx, u32 fourcc)
>  }
>  
>  const struct hantro_fmt *
> -hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream, int bit_depth)
> +hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream,
> +		       int bit_depth, bool need_postproc)
>  {
>  	const struct hantro_fmt *formats;
>  	unsigned int i, num_fmts;
>  
> -	formats = hantro_get_formats(ctx, &num_fmts);
> +	formats = hantro_get_formats(ctx, &num_fmts, need_postproc);
> +	for (i = 0; i < num_fmts; i++) {
> +		if (bitstream == (formats[i].codec_mode !=
> +				  HANTRO_MODE_NONE) &&
> +		    hantro_check_depth_match(&formats[i], bit_depth))
> +			return &formats[i];
> +	}
> +
> +	formats = hantro_get_postproc_formats(ctx, &num_fmts);
>  	for (i = 0; i < num_fmts; i++) {
>  		if (bitstream == (formats[i].codec_mode !=
>  				  HANTRO_MODE_NONE) &&
>  		    hantro_check_depth_match(&formats[i], bit_depth))
>  			return &formats[i];
>  	}
> +
>  	return NULL;
>  }
>  
> @@ -199,7 +215,7 @@ static int vidioc_enum_fmt(struct file *file, void *priv,
>  	 */
>  	skip_mode_none = capture == ctx->is_encoder;
>  
> -	formats = hantro_get_formats(ctx, &num_fmts);
> +	formats = hantro_get_formats(ctx, &num_fmts, false);
>  	for (i = 0; i < num_fmts; i++) {
>  		bool mode_none = formats[i].codec_mode == HANTRO_MODE_NONE;
>  		fmt = &formats[i];
> @@ -294,7 +310,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
>  
>  	fmt = hantro_find_format(ctx, pix_mp->pixelformat);
>  	if (!fmt) {
> -		fmt = hantro_get_default_fmt(ctx, coded, HANTRO_DEFAULT_BIT_DEPTH);
> +		fmt = hantro_get_default_fmt(ctx, coded, HANTRO_DEFAULT_BIT_DEPTH, false);
>  		pix_mp->pixelformat = fmt->fourcc;
>  	}
>  
> @@ -387,7 +403,7 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx)
>  	const struct hantro_fmt *vpu_fmt;
>  	struct v4l2_pix_format_mplane fmt;
>  
> -	vpu_fmt = hantro_get_default_fmt(ctx, true, HANTRO_DEFAULT_BIT_DEPTH);
> +	vpu_fmt = hantro_get_default_fmt(ctx, true, HANTRO_DEFAULT_BIT_DEPTH, false);
>  	if (!vpu_fmt)
>  		return;
>  
> @@ -397,17 +413,17 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx)
>  	if (ctx->is_encoder)
>  		hantro_set_fmt_cap(ctx, &fmt);
>  	else
> -		hantro_set_fmt_out(ctx, &fmt);
> +		hantro_set_fmt_out(ctx, &fmt, false);
>  }
>  
>  int
> -hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth)
> +hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth, bool need_postproc)
>  {
>  	const struct hantro_fmt *raw_vpu_fmt;
>  	struct v4l2_pix_format_mplane raw_fmt, *encoded_fmt;
>  	int ret;
>  
> -	raw_vpu_fmt = hantro_get_default_fmt(ctx, false, bit_depth);
> +	raw_vpu_fmt = hantro_get_default_fmt(ctx, false, bit_depth, need_postproc);
>  	if (!raw_vpu_fmt)
>  		return -EINVAL;
>  
> @@ -420,12 +436,14 @@ hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth)
>  	raw_fmt.width = encoded_fmt->width;
>  	raw_fmt.height = encoded_fmt->height;
>  	if (ctx->is_encoder)
> -		ret = hantro_set_fmt_out(ctx, &raw_fmt);
> +		ret = hantro_set_fmt_out(ctx, &raw_fmt, need_postproc);
>  	else
>  		ret = hantro_set_fmt_cap(ctx, &raw_fmt);
>  
> -	if (!ret)
> +	if (!ret) {
>  		ctx->bit_depth = bit_depth;
> +		ctx->need_postproc = need_postproc;
> +	}
>  
>  	return ret;
>  }
> @@ -433,7 +451,7 @@ hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth)
>  void hantro_reset_fmts(struct hantro_ctx *ctx)
>  {
>  	hantro_reset_encoded_fmt(ctx);
> -	hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH);
> +	hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH, false);
>  }
>  
>  static void
> @@ -480,7 +498,8 @@ hantro_update_requires_hold_capture_buf(struct hantro_ctx *ctx, u32 fourcc)
>  }
>  
>  static int hantro_set_fmt_out(struct hantro_ctx *ctx,
> -			      struct v4l2_pix_format_mplane *pix_mp)
> +			      struct v4l2_pix_format_mplane *pix_mp,
> +			      bool need_postproc)
>  {
>  	struct vb2_queue *vq;
>  	int ret;
> @@ -533,7 +552,9 @@ static int hantro_set_fmt_out(struct hantro_ctx *ctx,
>  	 * changes to the raw format.
>  	 */
>  	if (!ctx->is_encoder)
> -		hantro_reset_raw_fmt(ctx, hantro_get_format_depth(pix_mp->pixelformat));
> +		hantro_reset_raw_fmt(ctx,
> +				     hantro_get_format_depth(pix_mp->pixelformat),
> +				     need_postproc);
>  
>  	/* Colorimetry information are always propagated. */
>  	ctx->dst_fmt.colorspace = pix_mp->colorspace;
> @@ -596,7 +617,7 @@ static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
>  	 * changes to the raw format.
>  	 */
>  	if (ctx->is_encoder)
> -		hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH);
> +		hantro_reset_raw_fmt(ctx, HANTRO_DEFAULT_BIT_DEPTH, false);
>  
>  	/* Colorimetry information are always propagated. */
>  	ctx->src_fmt.colorspace = pix_mp->colorspace;
> @@ -616,7 +637,7 @@ static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
>  static int
>  vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f)
>  {
> -	return hantro_set_fmt_out(fh_to_ctx(priv), &f->fmt.pix_mp);
> +	return hantro_set_fmt_out(fh_to_ctx(priv), &f->fmt.pix_mp, false);
>  }
>  
>  static int
> diff --git a/drivers/media/platform/verisilicon/hantro_v4l2.h b/drivers/media/platform/verisilicon/hantro_v4l2.h
> index 9ea2fef57dcd..db0ee971e4af 100644
> --- a/drivers/media/platform/verisilicon/hantro_v4l2.h
> +++ b/drivers/media/platform/verisilicon/hantro_v4l2.h
> @@ -21,10 +21,11 @@
>  extern const struct v4l2_ioctl_ops hantro_ioctl_ops;
>  extern const struct vb2_ops hantro_queue_ops;
>  
> -int hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth);
> +int hantro_reset_raw_fmt(struct hantro_ctx *ctx, int bit_depth, bool need_postproc);
>  void hantro_reset_fmts(struct hantro_ctx *ctx);
>  int hantro_get_format_depth(u32 fourcc);
>  const struct hantro_fmt *
> -hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream, int bit_depth);
> +hantro_get_default_fmt(const struct hantro_ctx *ctx, bool bitstream,
> +		       int bit_depth, bool need_postproc);
>  
>  #endif /* HANTRO_V4L2_H_ */
Nicolas Dufresne April 11, 2023, 3:26 p.m. UTC | #12
Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> Make sure that bit_depth field of V4L2_CTRL_TYPE_AV1_SEQUENCE
> is initialized correctly before using it.
> 
> Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> 
In v6, can you move this patch earlier ? I'm having bisection in mind. With that
being said:

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> 
> ---
>  drivers/media/v4l2-core/v4l2-ctrls-core.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> index 9fd37e94db17..a662fb60f73f 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> @@ -111,6 +111,7 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
>  	struct v4l2_ctrl_vp9_frame *p_vp9_frame;
>  	struct v4l2_ctrl_fwht_params *p_fwht_params;
>  	struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;
> +	struct v4l2_ctrl_av1_sequence *p_av1_sequence;
>  	void *p = ptr.p + idx * ctrl->elem_size;
>  
>  	if (ctrl->p_def.p_const)
> @@ -157,6 +158,10 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
>  		p_vp9_frame->flags |= V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING |
>  			V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING;
>  		break;
> +	case V4L2_CTRL_TYPE_AV1_SEQUENCE:
> +		p_av1_sequence = p;
> +		p_av1_sequence->bit_depth = 8;
> +		break;
>  	case V4L2_CTRL_TYPE_FWHT_PARAMS:
>  		p_fwht_params = p;
>  		p_fwht_params->version = V4L2_FWHT_VERSION;
Nicolas Dufresne April 11, 2023, 4:01 p.m. UTC | #13
As we discussed in person:

Le mardi 11 avril 2023 à 11:07 -0400, Nicolas Dufresne a écrit :
> Le jeudi 30 mars 2023 à 17:40 +0200, Benjamin Gaignard a écrit :
> > NV12_10LE40_4L4 is the 10-bits per component version of
> > NV12_4L4 pixel format.

NV12_10LE40 is a name I made up for GStreamer, but this is originally named NV15
by Rockchip, and was accepted under this name as DRM_FORMAT_NV15 in the graphic
subsystem. So we agreed that for Linux, it will be more consistant to use the
NV15 naming, renaming this one to NV15_4L4, with the plus side that its shorter.
The linear form of this format was already proposed a while back along with the
pending RK HEVC driver. We will include the base format doc in here, and re-
factor it in later branches.

> > 
> > 
> > 
> > 
> > Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
> > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> > ---
> >  Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst | 4 ++++
> >  drivers/media/v4l2-core/v4l2-common.c                       | 1 +
> >  drivers/media/v4l2-core/v4l2-ioctl.c                        | 1 +
> >  include/uapi/linux/videodev2.h                              | 1 +
> >  4 files changed, 7 insertions(+)
> > 
> > diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst
> > index f1d5bb7b806d..8805213a75f8 100644
> > --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst
> > +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst
> > @@ -270,6 +270,7 @@ of the luma plane.
> >  .. _V4L2-PIX-FMT-NV12MT:
> >  .. _V4L2-PIX-FMT-NV12MT-16X16:
> >  .. _V4L2-PIX-FMT-NV12-4L4:
> > +.. _V4L2-PIX-FMT-NV12-10LE40-4L4:
> >  .. _V4L2-PIX-FMT-NV12-16L16:
> >  .. _V4L2-PIX-FMT-NV12-32L32:
> >  .. _V4L2-PIX-FMT-NV12M-8L128:
> > @@ -306,6 +307,9 @@ tiles linearly in memory. The line stride and image height must be
> >  aligned to a multiple of 4. The layouts of the luma and chroma planes are
> >  identical.
> >  
> > +``V4L2_PIX_FMT_NV12_10LE40_4L4`` is similar to ``V4L2_PIX_FMT_NV12_4L4``
> > +and stores 10 bits pixels in 4x4 tiles.
> 
> I think this is not enough, as it does not describe the NV12_10E40 pixel
> packing. We don't have that as a linear format yet in V4L2 (unlike
> DRM_FORMAT_NV15 on DRM side). So I'd suggest to drop the usual bit packing table
> here for now. Please ping Sebastien Fricke, as he got that for (along with
> NV12_10LE40 base format) documented in his RKVDEC HEVC decoder work.
> 
> > 
> > +
> >  ``V4L2_PIX_FMT_NV12_16L16`` stores pixels in 16x16 tiles, and stores
> >  tiles linearly in memory. The line stride and image height must be
> >  aligned to a multiple of 16. The layouts of the luma and chroma planes are
> > diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c
> > index 9cb0895dea1c..7f46c45982d6 100644
> > --- a/drivers/media/v4l2-core/v4l2-common.c
> > +++ b/drivers/media/v4l2-core/v4l2-common.c
> > @@ -278,6 +278,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format)
> >  
> >  		/* Tiled YUV formats */
> >  		{ .format = V4L2_PIX_FMT_NV12_4L4, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .bpp_div = { 1, 1, 1, 1 }, .hdiv = 2, .vdiv = 2 },
> > +		{ .format = V4L2_PIX_FMT_NV12_10LE40_4L4, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 5, 10, 0, 0 }, .bpp_div = { 4, 4, 1, 1 }, .hdiv = 2, .vdiv = 2 },
> 
> As you will be doing v6, can you initiallized the forgotten "block" parameters ?
> 
> 
> >  		{ .format = V4L2_PIX_FMT_P010_4L4, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .bpp_div = { 1, 1, 1, 1 }, .hdiv = 2, .vdiv = 2 },
> >  
> >  		/* YUV planar formats, non contiguous variant */
> > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> > index d2b905ba5240..5a0c5b3a6b0f 100644
> > --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> > @@ -1351,6 +1351,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
> >  	case V4L2_PIX_FMT_NV12_4L4:	descr = "Y/UV 4:2:0 (4x4 Linear)"; break;
> >  	case V4L2_PIX_FMT_NV12_16L16:	descr = "Y/UV 4:2:0 (16x16 Linear)"; break;
> >  	case V4L2_PIX_FMT_NV12_32L32:   descr = "Y/UV 4:2:0 (32x32 Linear)"; break;
> > +	case V4L2_PIX_FMT_NV12_10LE40_4L4: descr = "10-bit YUV 4:2:0 (4x4 Linear)"; break;
> >  	case V4L2_PIX_FMT_P010_4L4:	descr = "10-bit Y/UV 4:2:0 (4x4 Linear)"; break;
> >  	case V4L2_PIX_FMT_NV12M:	descr = "Y/UV 4:2:0 (N-C)"; break;
> >  	case V4L2_PIX_FMT_NV21M:	descr = "Y/VU 4:2:0 (N-C)"; break;
> > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> > index 8cdc7967cdea..93e300111ca1 100644
> > --- a/include/uapi/linux/videodev2.h
> > +++ b/include/uapi/linux/videodev2.h
> > @@ -664,6 +664,7 @@ struct v4l2_pix_format {
> >  #define V4L2_PIX_FMT_NV12_4L4 v4l2_fourcc('V', 'T', '1', '2')   /* 12  Y/CbCr 4:2:0  4x4 tiles */
> >  #define V4L2_PIX_FMT_NV12_16L16 v4l2_fourcc('H', 'M', '1', '2') /* 12  Y/CbCr 4:2:0 16x16 tiles */
> >  #define V4L2_PIX_FMT_NV12_32L32 v4l2_fourcc('S', 'T', '1', '2') /* 12  Y/CbCr 4:2:0 32x32 tiles */
> > +#define V4L2_PIX_FMT_NV12_10LE40_4L4 v4l2_fourcc('V', 'T', '1', '5')
> >  #define V4L2_PIX_FMT_P010_4L4 v4l2_fourcc('T', '0', '1', '0') /* 12  Y/CbCr 4:2:0 10-bit 4x4 macroblocks */
> >  #define V4L2_PIX_FMT_NV12_8L128       v4l2_fourcc('A', 'T', '1', '2') /* Y/CbCr 4:2:0 8x128 tiles */
> >  #define V4L2_PIX_FMT_NV12_10BE_8L128  v4l2_fourcc_be('A', 'X', '1', '2') /* Y/CbCr 4:2:0 10-bit 8x128 tiles */
>