media: verisilicon: Add AV1 entropy helpers

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>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
Benjamin Gaignard 2023-05-03 09:34:34 +01:00 committed by Mauro Carvalho Chehab
parent 1b9ef2744c
commit c0d0e579db
5 changed files with 4719 additions and 0 deletions

View file

@ -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 \

View file

@ -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;
};
};

View file

@ -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
*

File diff suppressed because it is too large Load diff

View file

@ -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_ */