xref: /aosp_15_r20/external/mesa3d/src/amd/common/ac_vcn_dec.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /**************************************************************************
2  *
3  * Copyright 2017 Advanced Micro Devices, Inc.
4  *
5  * SPDX-License-Identifier: MIT
6  *
7  **************************************************************************/
8 
9 #include <stdint.h>
10 #include "util/u_math.h"
11 
12 #include "ac_vcn_dec.h"
13 #include "ac_vcn_av1_default.h"
14 
15 static unsigned
ac_vcn_dec_frame_ctx_size_av1(unsigned av1_version)16 ac_vcn_dec_frame_ctx_size_av1(unsigned av1_version)
17 {
18    return av1_version == RDECODE_AV1_VER_0
19       ? align(sizeof(rvcn_av1_frame_context_t), 2048)
20       : align(sizeof(rvcn_av1_vcn4_frame_context_t), 2048);
21 }
22 
23 unsigned
ac_vcn_dec_calc_ctx_size_av1(unsigned av1_version)24 ac_vcn_dec_calc_ctx_size_av1(unsigned av1_version)
25 {
26    unsigned frame_ctxt_size = ac_vcn_dec_frame_ctx_size_av1(av1_version);
27    unsigned ctx_size = (9 + 4) * frame_ctxt_size + 9 * 64 * 34 * 512 + 9 * 64 * 34 * 256 * 5;
28 
29    int num_64x64_CTB_8k = 68;
30    int num_128x128_CTB_8k = 34;
31    int sdb_pitch_64x64 = align(32 * num_64x64_CTB_8k, 256) * 2;
32    int sdb_pitch_128x128 = align(32 * num_128x128_CTB_8k, 256) * 2;
33    int sdb_lf_size_ctb_64x64 = sdb_pitch_64x64 * (align(1728, 64) / 64);
34    int sdb_lf_size_ctb_128x128 = sdb_pitch_128x128 * (align(3008, 64) / 64);
35    int sdb_superres_size_ctb_64x64 = sdb_pitch_64x64 * (align(3232, 64) / 64);
36    int sdb_superres_size_ctb_128x128 = sdb_pitch_128x128 * (align(6208, 64) / 64);
37    int sdb_output_size_ctb_64x64 = sdb_pitch_64x64 * (align(1312, 64) / 64);
38    int sdb_output_size_ctb_128x128 = sdb_pitch_128x128 * (align(2336, 64) / 64);
39    int sdb_fg_avg_luma_size_ctb_64x64 = sdb_pitch_64x64 * (align(384, 64) / 64);
40    int sdb_fg_avg_luma_size_ctb_128x128 = sdb_pitch_128x128 * (align(640, 64) / 64);
41 
42    ctx_size += (MAX2(sdb_lf_size_ctb_64x64, sdb_lf_size_ctb_128x128) +
43                 MAX2(sdb_superres_size_ctb_64x64, sdb_superres_size_ctb_128x128) +
44                 MAX2(sdb_output_size_ctb_64x64, sdb_output_size_ctb_128x128) +
45                 MAX2(sdb_fg_avg_luma_size_ctb_64x64, sdb_fg_avg_luma_size_ctb_128x128)) *
46                   2 +
47                68 * 512;
48 
49    return ctx_size;
50 }
51 
52 static void
ac_vcn_av1_init_mode_probs(void * prob)53 ac_vcn_av1_init_mode_probs(void *prob)
54 {
55    rvcn_av1_frame_context_t *fc = (rvcn_av1_frame_context_t *)prob;
56    int i;
57 
58    memcpy(fc->palette_y_size_cdf, default_palette_y_size_cdf, sizeof(default_palette_y_size_cdf));
59    memcpy(fc->palette_uv_size_cdf, default_palette_uv_size_cdf, sizeof(default_palette_uv_size_cdf));
60    memcpy(fc->palette_y_color_index_cdf, default_palette_y_color_index_cdf, sizeof(default_palette_y_color_index_cdf));
61    memcpy(fc->palette_uv_color_index_cdf, default_palette_uv_color_index_cdf,
62           sizeof(default_palette_uv_color_index_cdf));
63    memcpy(fc->kf_y_cdf, default_kf_y_mode_cdf, sizeof(default_kf_y_mode_cdf));
64    memcpy(fc->angle_delta_cdf, default_angle_delta_cdf, sizeof(default_angle_delta_cdf));
65    memcpy(fc->comp_inter_cdf, default_comp_inter_cdf, sizeof(default_comp_inter_cdf));
66    memcpy(fc->comp_ref_type_cdf, default_comp_ref_type_cdf, sizeof(default_comp_ref_type_cdf));
67    memcpy(fc->uni_comp_ref_cdf, default_uni_comp_ref_cdf, sizeof(default_uni_comp_ref_cdf));
68    memcpy(fc->palette_y_mode_cdf, default_palette_y_mode_cdf, sizeof(default_palette_y_mode_cdf));
69    memcpy(fc->palette_uv_mode_cdf, default_palette_uv_mode_cdf, sizeof(default_palette_uv_mode_cdf));
70    memcpy(fc->comp_ref_cdf, default_comp_ref_cdf, sizeof(default_comp_ref_cdf));
71    memcpy(fc->comp_bwdref_cdf, default_comp_bwdref_cdf, sizeof(default_comp_bwdref_cdf));
72    memcpy(fc->single_ref_cdf, default_single_ref_cdf, sizeof(default_single_ref_cdf));
73    memcpy(fc->txfm_partition_cdf, default_txfm_partition_cdf, sizeof(default_txfm_partition_cdf));
74    memcpy(fc->compound_index_cdf, default_compound_idx_cdfs, sizeof(default_compound_idx_cdfs));
75    memcpy(fc->comp_group_idx_cdf, default_comp_group_idx_cdfs, sizeof(default_comp_group_idx_cdfs));
76    memcpy(fc->newmv_cdf, default_newmv_cdf, sizeof(default_newmv_cdf));
77    memcpy(fc->zeromv_cdf, default_zeromv_cdf, sizeof(default_zeromv_cdf));
78    memcpy(fc->refmv_cdf, default_refmv_cdf, sizeof(default_refmv_cdf));
79    memcpy(fc->drl_cdf, default_drl_cdf, sizeof(default_drl_cdf));
80    memcpy(fc->motion_mode_cdf, default_motion_mode_cdf, sizeof(default_motion_mode_cdf));
81    memcpy(fc->obmc_cdf, default_obmc_cdf, sizeof(default_obmc_cdf));
82    memcpy(fc->inter_compound_mode_cdf, default_inter_compound_mode_cdf, sizeof(default_inter_compound_mode_cdf));
83    memcpy(fc->compound_type_cdf, default_compound_type_cdf, sizeof(default_compound_type_cdf));
84    memcpy(fc->wedge_idx_cdf, default_wedge_idx_cdf, sizeof(default_wedge_idx_cdf));
85    memcpy(fc->interintra_cdf, default_interintra_cdf, sizeof(default_interintra_cdf));
86    memcpy(fc->wedge_interintra_cdf, default_wedge_interintra_cdf, sizeof(default_wedge_interintra_cdf));
87    memcpy(fc->interintra_mode_cdf, default_interintra_mode_cdf, sizeof(default_interintra_mode_cdf));
88    memcpy(fc->pred_cdf, default_segment_pred_cdf, sizeof(default_segment_pred_cdf));
89    memcpy(fc->switchable_restore_cdf, default_switchable_restore_cdf, sizeof(default_switchable_restore_cdf));
90    memcpy(fc->wiener_restore_cdf, default_wiener_restore_cdf, sizeof(default_wiener_restore_cdf));
91    memcpy(fc->sgrproj_restore_cdf, default_sgrproj_restore_cdf, sizeof(default_sgrproj_restore_cdf));
92    memcpy(fc->y_mode_cdf, default_if_y_mode_cdf, sizeof(default_if_y_mode_cdf));
93    memcpy(fc->uv_mode_cdf, default_uv_mode_cdf, sizeof(default_uv_mode_cdf));
94    memcpy(fc->switchable_interp_cdf, default_switchable_interp_cdf, sizeof(default_switchable_interp_cdf));
95    memcpy(fc->partition_cdf, default_partition_cdf, sizeof(default_partition_cdf));
96    memcpy(fc->intra_ext_tx_cdf, default_intra_ext_tx_cdf, sizeof(default_intra_ext_tx_cdf));
97    memcpy(fc->inter_ext_tx_cdf, default_inter_ext_tx_cdf, sizeof(default_inter_ext_tx_cdf));
98    memcpy(fc->skip_cdfs, default_skip_cdfs, sizeof(default_skip_cdfs));
99    memcpy(fc->intra_inter_cdf, default_intra_inter_cdf, sizeof(default_intra_inter_cdf));
100    memcpy(fc->tree_cdf, default_seg_tree_cdf, sizeof(default_seg_tree_cdf));
101    for (i = 0; i < SPATIAL_PREDICTION_PROBS; ++i)
102       memcpy(fc->spatial_pred_seg_cdf[i], default_spatial_pred_seg_tree_cdf[i],
103              sizeof(default_spatial_pred_seg_tree_cdf[i]));
104    memcpy(fc->tx_size_cdf, default_tx_size_cdf, sizeof(default_tx_size_cdf));
105    memcpy(fc->delta_q_cdf, default_delta_q_cdf, sizeof(default_delta_q_cdf));
106    memcpy(fc->skip_mode_cdfs, default_skip_mode_cdfs, sizeof(default_skip_mode_cdfs));
107    memcpy(fc->delta_lf_cdf, default_delta_lf_cdf, sizeof(default_delta_lf_cdf));
108    memcpy(fc->delta_lf_multi_cdf, default_delta_lf_multi_cdf, sizeof(default_delta_lf_multi_cdf));
109    memcpy(fc->cfl_sign_cdf, default_cfl_sign_cdf, sizeof(default_cfl_sign_cdf));
110    memcpy(fc->cfl_alpha_cdf, default_cfl_alpha_cdf, sizeof(default_cfl_alpha_cdf));
111    memcpy(fc->filter_intra_cdfs, default_filter_intra_cdfs, sizeof(default_filter_intra_cdfs));
112    memcpy(fc->filter_intra_mode_cdf, default_filter_intra_mode_cdf, sizeof(default_filter_intra_mode_cdf));
113    memcpy(fc->intrabc_cdf, default_intrabc_cdf, sizeof(default_intrabc_cdf));
114 }
115 
116 static void
ac_vcn_av1_init_mv_probs(void * prob)117 ac_vcn_av1_init_mv_probs(void *prob)
118 {
119    rvcn_av1_frame_context_t *fc = (rvcn_av1_frame_context_t *)prob;
120 
121    memcpy(fc->nmvc_joints_cdf, default_nmv_context.joints_cdf, sizeof(default_nmv_context.joints_cdf));
122    memcpy(fc->nmvc_0_bits_cdf, default_nmv_context.comps[0].bits_cdf, sizeof(default_nmv_context.comps[0].bits_cdf));
123    memcpy(fc->nmvc_0_class0_cdf, default_nmv_context.comps[0].class0_cdf,
124           sizeof(default_nmv_context.comps[0].class0_cdf));
125    memcpy(fc->nmvc_0_class0_fp_cdf, default_nmv_context.comps[0].class0_fp_cdf,
126           sizeof(default_nmv_context.comps[0].class0_fp_cdf));
127    memcpy(fc->nmvc_0_class0_hp_cdf, default_nmv_context.comps[0].class0_hp_cdf,
128           sizeof(default_nmv_context.comps[0].class0_hp_cdf));
129    memcpy(fc->nmvc_0_classes_cdf, default_nmv_context.comps[0].classes_cdf,
130           sizeof(default_nmv_context.comps[0].classes_cdf));
131    memcpy(fc->nmvc_0_fp_cdf, default_nmv_context.comps[0].fp_cdf, sizeof(default_nmv_context.comps[0].fp_cdf));
132    memcpy(fc->nmvc_0_hp_cdf, default_nmv_context.comps[0].hp_cdf, sizeof(default_nmv_context.comps[0].hp_cdf));
133    memcpy(fc->nmvc_0_sign_cdf, default_nmv_context.comps[0].sign_cdf, sizeof(default_nmv_context.comps[0].sign_cdf));
134    memcpy(fc->nmvc_1_bits_cdf, default_nmv_context.comps[1].bits_cdf, sizeof(default_nmv_context.comps[1].bits_cdf));
135    memcpy(fc->nmvc_1_class0_cdf, default_nmv_context.comps[1].class0_cdf,
136           sizeof(default_nmv_context.comps[1].class0_cdf));
137    memcpy(fc->nmvc_1_class0_fp_cdf, default_nmv_context.comps[1].class0_fp_cdf,
138           sizeof(default_nmv_context.comps[1].class0_fp_cdf));
139    memcpy(fc->nmvc_1_class0_hp_cdf, default_nmv_context.comps[1].class0_hp_cdf,
140           sizeof(default_nmv_context.comps[1].class0_hp_cdf));
141    memcpy(fc->nmvc_1_classes_cdf, default_nmv_context.comps[1].classes_cdf,
142           sizeof(default_nmv_context.comps[1].classes_cdf));
143    memcpy(fc->nmvc_1_fp_cdf, default_nmv_context.comps[1].fp_cdf, sizeof(default_nmv_context.comps[1].fp_cdf));
144    memcpy(fc->nmvc_1_hp_cdf, default_nmv_context.comps[1].hp_cdf, sizeof(default_nmv_context.comps[1].hp_cdf));
145    memcpy(fc->nmvc_1_sign_cdf, default_nmv_context.comps[1].sign_cdf, sizeof(default_nmv_context.comps[1].sign_cdf));
146    memcpy(fc->ndvc_joints_cdf, default_nmv_context.joints_cdf, sizeof(default_nmv_context.joints_cdf));
147    memcpy(fc->ndvc_0_bits_cdf, default_nmv_context.comps[0].bits_cdf, sizeof(default_nmv_context.comps[0].bits_cdf));
148    memcpy(fc->ndvc_0_class0_cdf, default_nmv_context.comps[0].class0_cdf,
149           sizeof(default_nmv_context.comps[0].class0_cdf));
150    memcpy(fc->ndvc_0_class0_fp_cdf, default_nmv_context.comps[0].class0_fp_cdf,
151           sizeof(default_nmv_context.comps[0].class0_fp_cdf));
152    memcpy(fc->ndvc_0_class0_hp_cdf, default_nmv_context.comps[0].class0_hp_cdf,
153           sizeof(default_nmv_context.comps[0].class0_hp_cdf));
154    memcpy(fc->ndvc_0_classes_cdf, default_nmv_context.comps[0].classes_cdf,
155           sizeof(default_nmv_context.comps[0].classes_cdf));
156    memcpy(fc->ndvc_0_fp_cdf, default_nmv_context.comps[0].fp_cdf, sizeof(default_nmv_context.comps[0].fp_cdf));
157    memcpy(fc->ndvc_0_hp_cdf, default_nmv_context.comps[0].hp_cdf, sizeof(default_nmv_context.comps[0].hp_cdf));
158    memcpy(fc->ndvc_0_sign_cdf, default_nmv_context.comps[0].sign_cdf, sizeof(default_nmv_context.comps[0].sign_cdf));
159    memcpy(fc->ndvc_1_bits_cdf, default_nmv_context.comps[1].bits_cdf, sizeof(default_nmv_context.comps[1].bits_cdf));
160    memcpy(fc->ndvc_1_class0_cdf, default_nmv_context.comps[1].class0_cdf,
161           sizeof(default_nmv_context.comps[1].class0_cdf));
162    memcpy(fc->ndvc_1_class0_fp_cdf, default_nmv_context.comps[1].class0_fp_cdf,
163           sizeof(default_nmv_context.comps[1].class0_fp_cdf));
164    memcpy(fc->ndvc_1_class0_hp_cdf, default_nmv_context.comps[1].class0_hp_cdf,
165           sizeof(default_nmv_context.comps[1].class0_hp_cdf));
166    memcpy(fc->ndvc_1_classes_cdf, default_nmv_context.comps[1].classes_cdf,
167           sizeof(default_nmv_context.comps[1].classes_cdf));
168    memcpy(fc->ndvc_1_fp_cdf, default_nmv_context.comps[1].fp_cdf, sizeof(default_nmv_context.comps[1].fp_cdf));
169    memcpy(fc->ndvc_1_hp_cdf, default_nmv_context.comps[1].hp_cdf, sizeof(default_nmv_context.comps[1].hp_cdf));
170    memcpy(fc->ndvc_1_sign_cdf, default_nmv_context.comps[1].sign_cdf, sizeof(default_nmv_context.comps[1].sign_cdf));
171 }
172 
173 static void
ac_vcn_av1_default_coef_probs(void * prob,int index)174 ac_vcn_av1_default_coef_probs(void *prob, int index)
175 {
176    rvcn_av1_frame_context_t *fc = (rvcn_av1_frame_context_t *)prob;
177 
178    memcpy(fc->txb_skip_cdf, av1_default_txb_skip_cdfs[index], sizeof(av1_default_txb_skip_cdfs[index]));
179    memcpy(fc->eob_extra_cdf, av1_default_eob_extra_cdfs[index], sizeof(av1_default_eob_extra_cdfs[index]));
180    memcpy(fc->dc_sign_cdf, av1_default_dc_sign_cdfs[index], sizeof(av1_default_dc_sign_cdfs[index]));
181    memcpy(fc->coeff_br_cdf, av1_default_coeff_lps_multi_cdfs[index], sizeof(av1_default_coeff_lps_multi_cdfs[index]));
182    memcpy(fc->coeff_base_cdf, av1_default_coeff_base_multi_cdfs[index],
183           sizeof(av1_default_coeff_base_multi_cdfs[index]));
184    memcpy(fc->coeff_base_eob_cdf, av1_default_coeff_base_eob_multi_cdfs[index],
185           sizeof(av1_default_coeff_base_eob_multi_cdfs[index]));
186    memcpy(fc->eob_flag_cdf16, av1_default_eob_multi16_cdfs[index], sizeof(av1_default_eob_multi16_cdfs[index]));
187    memcpy(fc->eob_flag_cdf32, av1_default_eob_multi32_cdfs[index], sizeof(av1_default_eob_multi32_cdfs[index]));
188    memcpy(fc->eob_flag_cdf64, av1_default_eob_multi64_cdfs[index], sizeof(av1_default_eob_multi64_cdfs[index]));
189    memcpy(fc->eob_flag_cdf128, av1_default_eob_multi128_cdfs[index], sizeof(av1_default_eob_multi128_cdfs[index]));
190    memcpy(fc->eob_flag_cdf256, av1_default_eob_multi256_cdfs[index], sizeof(av1_default_eob_multi256_cdfs[index]));
191    memcpy(fc->eob_flag_cdf512, av1_default_eob_multi512_cdfs[index], sizeof(av1_default_eob_multi512_cdfs[index]));
192    memcpy(fc->eob_flag_cdf1024, av1_default_eob_multi1024_cdfs[index], sizeof(av1_default_eob_multi1024_cdfs[index]));
193 }
194 
195 static void
ac_vcn_vcn4_av1_init_mode_probs(void * prob)196 ac_vcn_vcn4_av1_init_mode_probs(void *prob)
197 {
198    rvcn_av1_vcn4_frame_context_t *fc = (rvcn_av1_vcn4_frame_context_t *)prob;
199    int i;
200 
201    memcpy(fc->palette_y_size_cdf, default_palette_y_size_cdf, sizeof(default_palette_y_size_cdf));
202    memcpy(fc->palette_uv_size_cdf, default_palette_uv_size_cdf, sizeof(default_palette_uv_size_cdf));
203    memcpy(fc->palette_y_color_index_cdf, default_palette_y_color_index_cdf, sizeof(default_palette_y_color_index_cdf));
204    memcpy(fc->palette_uv_color_index_cdf, default_palette_uv_color_index_cdf,
205           sizeof(default_palette_uv_color_index_cdf));
206    memcpy(fc->kf_y_cdf, default_kf_y_mode_cdf, sizeof(default_kf_y_mode_cdf));
207    memcpy(fc->angle_delta_cdf, default_angle_delta_cdf, sizeof(default_angle_delta_cdf));
208    memcpy(fc->comp_inter_cdf, default_comp_inter_cdf, sizeof(default_comp_inter_cdf));
209    memcpy(fc->comp_ref_type_cdf, default_comp_ref_type_cdf, sizeof(default_comp_ref_type_cdf));
210    memcpy(fc->uni_comp_ref_cdf, default_uni_comp_ref_cdf, sizeof(default_uni_comp_ref_cdf));
211    memcpy(fc->palette_y_mode_cdf, default_palette_y_mode_cdf, sizeof(default_palette_y_mode_cdf));
212    memcpy(fc->palette_uv_mode_cdf, default_palette_uv_mode_cdf, sizeof(default_palette_uv_mode_cdf));
213    memcpy(fc->comp_ref_cdf, default_comp_ref_cdf, sizeof(default_comp_ref_cdf));
214    memcpy(fc->comp_bwdref_cdf, default_comp_bwdref_cdf, sizeof(default_comp_bwdref_cdf));
215    memcpy(fc->single_ref_cdf, default_single_ref_cdf, sizeof(default_single_ref_cdf));
216    memcpy(fc->txfm_partition_cdf, default_txfm_partition_cdf, sizeof(default_txfm_partition_cdf));
217    memcpy(fc->compound_index_cdf, default_compound_idx_cdfs, sizeof(default_compound_idx_cdfs));
218    memcpy(fc->comp_group_idx_cdf, default_comp_group_idx_cdfs, sizeof(default_comp_group_idx_cdfs));
219    memcpy(fc->newmv_cdf, default_newmv_cdf, sizeof(default_newmv_cdf));
220    memcpy(fc->zeromv_cdf, default_zeromv_cdf, sizeof(default_zeromv_cdf));
221    memcpy(fc->refmv_cdf, default_refmv_cdf, sizeof(default_refmv_cdf));
222    memcpy(fc->drl_cdf, default_drl_cdf, sizeof(default_drl_cdf));
223    memcpy(fc->motion_mode_cdf, default_motion_mode_cdf, sizeof(default_motion_mode_cdf));
224    memcpy(fc->obmc_cdf, default_obmc_cdf, sizeof(default_obmc_cdf));
225    memcpy(fc->inter_compound_mode_cdf, default_inter_compound_mode_cdf, sizeof(default_inter_compound_mode_cdf));
226    memcpy(fc->compound_type_cdf, default_compound_type_cdf, sizeof(default_compound_type_cdf));
227    memcpy(fc->wedge_idx_cdf, default_wedge_idx_cdf, sizeof(default_wedge_idx_cdf));
228    memcpy(fc->interintra_cdf, default_interintra_cdf, sizeof(default_interintra_cdf));
229    memcpy(fc->wedge_interintra_cdf, default_wedge_interintra_cdf, sizeof(default_wedge_interintra_cdf));
230    memcpy(fc->interintra_mode_cdf, default_interintra_mode_cdf, sizeof(default_interintra_mode_cdf));
231    memcpy(fc->pred_cdf, default_segment_pred_cdf, sizeof(default_segment_pred_cdf));
232    memcpy(fc->switchable_restore_cdf, default_switchable_restore_cdf, sizeof(default_switchable_restore_cdf));
233    memcpy(fc->wiener_restore_cdf, default_wiener_restore_cdf, sizeof(default_wiener_restore_cdf));
234    memcpy(fc->sgrproj_restore_cdf, default_sgrproj_restore_cdf, sizeof(default_sgrproj_restore_cdf));
235    memcpy(fc->y_mode_cdf, default_if_y_mode_cdf, sizeof(default_if_y_mode_cdf));
236    memcpy(fc->uv_mode_cdf, default_uv_mode_cdf, sizeof(default_uv_mode_cdf));
237    memcpy(fc->switchable_interp_cdf, default_switchable_interp_cdf, sizeof(default_switchable_interp_cdf));
238    memcpy(fc->partition_cdf, default_partition_cdf, sizeof(default_partition_cdf));
239    memcpy(fc->intra_ext_tx_cdf, &default_intra_ext_tx_cdf[1], sizeof(default_intra_ext_tx_cdf[1]) * 2);
240    memcpy(fc->inter_ext_tx_cdf, &default_inter_ext_tx_cdf[1], sizeof(default_inter_ext_tx_cdf[1]) * 3);
241    memcpy(fc->skip_cdfs, default_skip_cdfs, sizeof(default_skip_cdfs));
242    memcpy(fc->intra_inter_cdf, default_intra_inter_cdf, sizeof(default_intra_inter_cdf));
243    memcpy(fc->tree_cdf, default_seg_tree_cdf, sizeof(default_seg_tree_cdf));
244    for (i = 0; i < SPATIAL_PREDICTION_PROBS; ++i)
245       memcpy(fc->spatial_pred_seg_cdf[i], default_spatial_pred_seg_tree_cdf[i],
246              sizeof(default_spatial_pred_seg_tree_cdf[i]));
247    memcpy(fc->tx_size_cdf, default_tx_size_cdf, sizeof(default_tx_size_cdf));
248    memcpy(fc->delta_q_cdf, default_delta_q_cdf, sizeof(default_delta_q_cdf));
249    memcpy(fc->skip_mode_cdfs, default_skip_mode_cdfs, sizeof(default_skip_mode_cdfs));
250    memcpy(fc->delta_lf_cdf, default_delta_lf_cdf, sizeof(default_delta_lf_cdf));
251    memcpy(fc->delta_lf_multi_cdf, default_delta_lf_multi_cdf, sizeof(default_delta_lf_multi_cdf));
252    memcpy(fc->cfl_sign_cdf, default_cfl_sign_cdf, sizeof(default_cfl_sign_cdf));
253    memcpy(fc->cfl_alpha_cdf, default_cfl_alpha_cdf, sizeof(default_cfl_alpha_cdf));
254    memcpy(fc->filter_intra_cdfs, default_filter_intra_cdfs, sizeof(default_filter_intra_cdfs));
255    memcpy(fc->filter_intra_mode_cdf, default_filter_intra_mode_cdf, sizeof(default_filter_intra_mode_cdf));
256    memcpy(fc->intrabc_cdf, default_intrabc_cdf, sizeof(default_intrabc_cdf));
257 }
258 
259 static void
ac_vcn_vcn4_av1_init_mv_probs(void * prob)260 ac_vcn_vcn4_av1_init_mv_probs(void *prob)
261 {
262    rvcn_av1_vcn4_frame_context_t *fc = (rvcn_av1_vcn4_frame_context_t *)prob;
263 
264    memcpy(fc->nmvc_joints_cdf, default_nmv_context.joints_cdf, sizeof(default_nmv_context.joints_cdf));
265    memcpy(fc->nmvc_0_bits_cdf, default_nmv_context.comps[0].bits_cdf, sizeof(default_nmv_context.comps[0].bits_cdf));
266    memcpy(fc->nmvc_0_class0_cdf, default_nmv_context.comps[0].class0_cdf,
267           sizeof(default_nmv_context.comps[0].class0_cdf));
268    memcpy(fc->nmvc_0_class0_fp_cdf, default_nmv_context.comps[0].class0_fp_cdf,
269           sizeof(default_nmv_context.comps[0].class0_fp_cdf));
270    memcpy(fc->nmvc_0_class0_hp_cdf, default_nmv_context.comps[0].class0_hp_cdf,
271           sizeof(default_nmv_context.comps[0].class0_hp_cdf));
272    memcpy(fc->nmvc_0_classes_cdf, default_nmv_context.comps[0].classes_cdf,
273           sizeof(default_nmv_context.comps[0].classes_cdf));
274    memcpy(fc->nmvc_0_fp_cdf, default_nmv_context.comps[0].fp_cdf, sizeof(default_nmv_context.comps[0].fp_cdf));
275    memcpy(fc->nmvc_0_hp_cdf, default_nmv_context.comps[0].hp_cdf, sizeof(default_nmv_context.comps[0].hp_cdf));
276    memcpy(fc->nmvc_0_sign_cdf, default_nmv_context.comps[0].sign_cdf, sizeof(default_nmv_context.comps[0].sign_cdf));
277    memcpy(fc->nmvc_1_bits_cdf, default_nmv_context.comps[1].bits_cdf, sizeof(default_nmv_context.comps[1].bits_cdf));
278    memcpy(fc->nmvc_1_class0_cdf, default_nmv_context.comps[1].class0_cdf,
279           sizeof(default_nmv_context.comps[1].class0_cdf));
280    memcpy(fc->nmvc_1_class0_fp_cdf, default_nmv_context.comps[1].class0_fp_cdf,
281           sizeof(default_nmv_context.comps[1].class0_fp_cdf));
282    memcpy(fc->nmvc_1_class0_hp_cdf, default_nmv_context.comps[1].class0_hp_cdf,
283           sizeof(default_nmv_context.comps[1].class0_hp_cdf));
284    memcpy(fc->nmvc_1_classes_cdf, default_nmv_context.comps[1].classes_cdf,
285           sizeof(default_nmv_context.comps[1].classes_cdf));
286    memcpy(fc->nmvc_1_fp_cdf, default_nmv_context.comps[1].fp_cdf, sizeof(default_nmv_context.comps[1].fp_cdf));
287    memcpy(fc->nmvc_1_hp_cdf, default_nmv_context.comps[1].hp_cdf, sizeof(default_nmv_context.comps[1].hp_cdf));
288    memcpy(fc->nmvc_1_sign_cdf, default_nmv_context.comps[1].sign_cdf, sizeof(default_nmv_context.comps[1].sign_cdf));
289    memcpy(fc->ndvc_joints_cdf, default_nmv_context.joints_cdf, sizeof(default_nmv_context.joints_cdf));
290    memcpy(fc->ndvc_0_bits_cdf, default_nmv_context.comps[0].bits_cdf, sizeof(default_nmv_context.comps[0].bits_cdf));
291    memcpy(fc->ndvc_0_class0_cdf, default_nmv_context.comps[0].class0_cdf,
292           sizeof(default_nmv_context.comps[0].class0_cdf));
293    memcpy(fc->ndvc_0_class0_fp_cdf, default_nmv_context.comps[0].class0_fp_cdf,
294           sizeof(default_nmv_context.comps[0].class0_fp_cdf));
295    memcpy(fc->ndvc_0_class0_hp_cdf, default_nmv_context.comps[0].class0_hp_cdf,
296           sizeof(default_nmv_context.comps[0].class0_hp_cdf));
297    memcpy(fc->ndvc_0_classes_cdf, default_nmv_context.comps[0].classes_cdf,
298           sizeof(default_nmv_context.comps[0].classes_cdf));
299    memcpy(fc->ndvc_0_fp_cdf, default_nmv_context.comps[0].fp_cdf, sizeof(default_nmv_context.comps[0].fp_cdf));
300    memcpy(fc->ndvc_0_hp_cdf, default_nmv_context.comps[0].hp_cdf, sizeof(default_nmv_context.comps[0].hp_cdf));
301    memcpy(fc->ndvc_0_sign_cdf, default_nmv_context.comps[0].sign_cdf, sizeof(default_nmv_context.comps[0].sign_cdf));
302    memcpy(fc->ndvc_1_bits_cdf, default_nmv_context.comps[1].bits_cdf, sizeof(default_nmv_context.comps[1].bits_cdf));
303    memcpy(fc->ndvc_1_class0_cdf, default_nmv_context.comps[1].class0_cdf,
304           sizeof(default_nmv_context.comps[1].class0_cdf));
305    memcpy(fc->ndvc_1_class0_fp_cdf, default_nmv_context.comps[1].class0_fp_cdf,
306           sizeof(default_nmv_context.comps[1].class0_fp_cdf));
307    memcpy(fc->ndvc_1_class0_hp_cdf, default_nmv_context.comps[1].class0_hp_cdf,
308           sizeof(default_nmv_context.comps[1].class0_hp_cdf));
309    memcpy(fc->ndvc_1_classes_cdf, default_nmv_context.comps[1].classes_cdf,
310           sizeof(default_nmv_context.comps[1].classes_cdf));
311    memcpy(fc->ndvc_1_fp_cdf, default_nmv_context.comps[1].fp_cdf, sizeof(default_nmv_context.comps[1].fp_cdf));
312    memcpy(fc->ndvc_1_hp_cdf, default_nmv_context.comps[1].hp_cdf, sizeof(default_nmv_context.comps[1].hp_cdf));
313    memcpy(fc->ndvc_1_sign_cdf, default_nmv_context.comps[1].sign_cdf, sizeof(default_nmv_context.comps[1].sign_cdf));
314 }
315 
316 static void
ac_vcn_vcn4_av1_default_coef_probs(void * prob,int index)317 ac_vcn_vcn4_av1_default_coef_probs(void *prob, int index)
318 {
319    rvcn_av1_vcn4_frame_context_t *fc = (rvcn_av1_vcn4_frame_context_t *)prob;
320    char *p;
321    int i, j;
322    unsigned size;
323 
324    memcpy(fc->txb_skip_cdf, av1_default_txb_skip_cdfs[index], sizeof(av1_default_txb_skip_cdfs[index]));
325 
326    p = (char *)fc->eob_extra_cdf;
327    size = sizeof(av1_default_eob_extra_cdfs[0][0][0][0]) * EOB_COEF_CONTEXTS_VCN4;
328    for (i = 0; i < AV1_TX_SIZES; i++) {
329       for (j = 0; j < AV1_PLANE_TYPES; j++) {
330          memcpy(p, &av1_default_eob_extra_cdfs[index][i][j][3], size);
331          p += size;
332       }
333    }
334 
335    memcpy(fc->dc_sign_cdf, av1_default_dc_sign_cdfs[index], sizeof(av1_default_dc_sign_cdfs[index]));
336    memcpy(fc->coeff_br_cdf, av1_default_coeff_lps_multi_cdfs[index], sizeof(av1_default_coeff_lps_multi_cdfs[index]));
337    memcpy(fc->coeff_base_cdf, av1_default_coeff_base_multi_cdfs[index],
338           sizeof(av1_default_coeff_base_multi_cdfs[index]));
339    memcpy(fc->coeff_base_eob_cdf, av1_default_coeff_base_eob_multi_cdfs[index],
340           sizeof(av1_default_coeff_base_eob_multi_cdfs[index]));
341    memcpy(fc->eob_flag_cdf16, av1_default_eob_multi16_cdfs[index], sizeof(av1_default_eob_multi16_cdfs[index]));
342    memcpy(fc->eob_flag_cdf32, av1_default_eob_multi32_cdfs[index], sizeof(av1_default_eob_multi32_cdfs[index]));
343    memcpy(fc->eob_flag_cdf64, av1_default_eob_multi64_cdfs[index], sizeof(av1_default_eob_multi64_cdfs[index]));
344    memcpy(fc->eob_flag_cdf128, av1_default_eob_multi128_cdfs[index], sizeof(av1_default_eob_multi128_cdfs[index]));
345    memcpy(fc->eob_flag_cdf256, av1_default_eob_multi256_cdfs[index], sizeof(av1_default_eob_multi256_cdfs[index]));
346    memcpy(fc->eob_flag_cdf512, av1_default_eob_multi512_cdfs[index], sizeof(av1_default_eob_multi512_cdfs[index]));
347    memcpy(fc->eob_flag_cdf1024, av1_default_eob_multi1024_cdfs[index], sizeof(av1_default_eob_multi1024_cdfs[index]));
348 }
349 
350 void
ac_vcn_av1_init_probs(unsigned av1_version,uint8_t * prob)351 ac_vcn_av1_init_probs(unsigned av1_version, uint8_t *prob)
352 {
353    unsigned frame_ctxt_size = ac_vcn_dec_frame_ctx_size_av1(av1_version);
354    if (av1_version == RDECODE_AV1_VER_0) {
355       for (unsigned i = 0; i < 4; ++i) {
356          ac_vcn_av1_init_mode_probs((void *)(prob + i * frame_ctxt_size));
357          ac_vcn_av1_init_mv_probs((void *)(prob + i * frame_ctxt_size));
358          ac_vcn_av1_default_coef_probs((void *)(prob + i * frame_ctxt_size), i);
359       }
360    } else {
361       for (unsigned i = 0; i < 4; ++i) {
362          ac_vcn_vcn4_av1_init_mode_probs((void *)(prob + i * frame_ctxt_size));
363          ac_vcn_vcn4_av1_init_mv_probs((void *)(prob + i * frame_ctxt_size));
364          ac_vcn_vcn4_av1_default_coef_probs((void *)(prob + i * frame_ctxt_size), i);
365       }
366    }
367 
368 }
369 
370 #define LUMA_BLOCK_SIZE_Y   73
371 #define LUMA_BLOCK_SIZE_X   82
372 #define CHROMA_BLOCK_SIZE_Y 38
373 #define CHROMA_BLOCK_SIZE_X 44
374 
375 static int32_t
radv_vcn_av1_film_grain_random_number(unsigned short * seed,int32_t bits)376 radv_vcn_av1_film_grain_random_number(unsigned short *seed, int32_t bits)
377 {
378    unsigned short bit;
379    unsigned short value = *seed;
380 
381    bit = ((value >> 0) ^ (value >> 1) ^ (value >> 3) ^ (value >> 12)) & 1;
382    value = (value >> 1) | (bit << 15);
383    *seed = value;
384 
385    return (value >> (16 - bits)) & ((1 << bits) - 1);
386 }
387 
388 static void
radv_vcn_av1_film_grain_init_scaling(uint8_t scaling_points[][2],uint8_t num,short scaling_lut[])389 radv_vcn_av1_film_grain_init_scaling(uint8_t scaling_points[][2], uint8_t num, short scaling_lut[])
390 {
391    int32_t i, x, delta_x, delta_y;
392    int64_t delta;
393 
394    if (num == 0)
395       return;
396 
397    for (i = 0; i < scaling_points[0][0]; i++)
398       scaling_lut[i] = scaling_points[0][1];
399 
400    for (i = 0; i < num - 1; i++) {
401       delta_y = scaling_points[i + 1][1] - scaling_points[i][1];
402       delta_x = scaling_points[i + 1][0] - scaling_points[i][0];
403 
404       delta = delta_y * ((65536 + (delta_x >> 1)) / delta_x);
405 
406       for (x = 0; x < delta_x; x++)
407          scaling_lut[scaling_points[i][0] + x] = (short)(scaling_points[i][1] + (int32_t)((x * delta + 32768) >> 16));
408    }
409 
410    for (i = scaling_points[num - 1][0]; i < 256; i++)
411       scaling_lut[i] = scaling_points[num - 1][1];
412 }
413 
414 void
ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t * fg_params,rvcn_dec_av1_fg_init_buf_t * fg_buf)415 ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf)
416 {
417    const int32_t luma_block_size_y = LUMA_BLOCK_SIZE_Y;
418    const int32_t luma_block_size_x = LUMA_BLOCK_SIZE_X;
419    const int32_t chroma_block_size_y = CHROMA_BLOCK_SIZE_Y;
420    const int32_t chroma_block_size_x = CHROMA_BLOCK_SIZE_X;
421    const int32_t gauss_bits = 11;
422    int32_t filt_luma_grain_block[LUMA_BLOCK_SIZE_Y][LUMA_BLOCK_SIZE_X];
423    int32_t filt_cb_grain_block[CHROMA_BLOCK_SIZE_Y][CHROMA_BLOCK_SIZE_X];
424    int32_t filt_cr_grain_block[CHROMA_BLOCK_SIZE_Y][CHROMA_BLOCK_SIZE_X];
425    int32_t chroma_subsamp_y = 1;
426    int32_t chroma_subsamp_x = 1;
427    unsigned short seed = fg_params->random_seed;
428    int32_t ar_coeff_lag = fg_params->ar_coeff_lag;
429    int32_t bit_depth = fg_params->bit_depth_minus_8 + 8;
430    short grain_center = 128 << (bit_depth - 8);
431    short grain_min = 0 - grain_center;
432    short grain_max = (256 << (bit_depth - 8)) - 1 - grain_center;
433    int32_t shift = 12 - bit_depth + fg_params->grain_scale_shift;
434    short luma_grain_block_tmp[64][80];
435    short cb_grain_block_tmp[32][40];
436    short cr_grain_block_tmp[32][40];
437    short *align_ptr, *align_ptr0, *align_ptr1;
438    int32_t x, y, g, i, j, c, c0, c1, delta_row, delta_col;
439    int32_t s, s0, s1, pos, r;
440 
441    /* generate luma grain block */
442    memset(filt_luma_grain_block, 0, sizeof(filt_luma_grain_block));
443    for (y = 0; y < luma_block_size_y; y++) {
444       for (x = 0; x < luma_block_size_x; x++) {
445          g = 0;
446          if (fg_params->num_y_points > 0) {
447             r = radv_vcn_av1_film_grain_random_number(&seed, gauss_bits);
448             g = gaussian_sequence[CLAMP(r, 0, 2048 - 1)];
449          }
450          filt_luma_grain_block[y][x] = ROUND_POWER_OF_TWO(g, shift);
451       }
452    }
453 
454    for (y = 3; y < luma_block_size_y; y++) {
455       for (x = 3; x < luma_block_size_x - 3; x++) {
456          s = 0;
457          pos = 0;
458          for (delta_row = -ar_coeff_lag; delta_row <= 0; delta_row++) {
459             for (delta_col = -ar_coeff_lag; delta_col <= ar_coeff_lag; delta_col++) {
460                if (delta_row == 0 && delta_col == 0)
461                   break;
462                c = fg_params->ar_coeffs_y[pos];
463                s += filt_luma_grain_block[y + delta_row][x + delta_col] * c;
464                pos++;
465             }
466          }
467          filt_luma_grain_block[y][x] = AV1_CLAMP(
468             filt_luma_grain_block[y][x] + ROUND_POWER_OF_TWO(s, fg_params->ar_coeff_shift), grain_min, grain_max);
469       }
470    }
471 
472    /* generate chroma grain block */
473    memset(filt_cb_grain_block, 0, sizeof(filt_cb_grain_block));
474    shift = 12 - bit_depth + fg_params->grain_scale_shift;
475    seed = fg_params->random_seed ^ 0xb524;
476    for (y = 0; y < chroma_block_size_y; y++) {
477       for (x = 0; x < chroma_block_size_x; x++) {
478          g = 0;
479          if (fg_params->num_cb_points || fg_params->chroma_scaling_from_luma) {
480             r = radv_vcn_av1_film_grain_random_number(&seed, gauss_bits);
481             g = gaussian_sequence[CLAMP(r, 0, 2048 - 1)];
482          }
483          filt_cb_grain_block[y][x] = ROUND_POWER_OF_TWO(g, shift);
484       }
485    }
486 
487    memset(filt_cr_grain_block, 0, sizeof(filt_cr_grain_block));
488    seed = fg_params->random_seed ^ 0x49d8;
489    for (y = 0; y < chroma_block_size_y; y++) {
490       for (x = 0; x < chroma_block_size_x; x++) {
491          g = 0;
492          if (fg_params->num_cr_points || fg_params->chroma_scaling_from_luma) {
493             r = radv_vcn_av1_film_grain_random_number(&seed, gauss_bits);
494             g = gaussian_sequence[CLAMP(r, 0, 2048 - 1)];
495          }
496          filt_cr_grain_block[y][x] = ROUND_POWER_OF_TWO(g, shift);
497       }
498    }
499 
500    for (y = 3; y < chroma_block_size_y; y++) {
501       for (x = 3; x < chroma_block_size_x - 3; x++) {
502          s0 = 0, s1 = 0, pos = 0;
503          for (delta_row = -ar_coeff_lag; delta_row <= 0; delta_row++) {
504             for (delta_col = -ar_coeff_lag; delta_col <= ar_coeff_lag; delta_col++) {
505                c0 = fg_params->ar_coeffs_cb[pos];
506                c1 = fg_params->ar_coeffs_cr[pos];
507                if (delta_row == 0 && delta_col == 0) {
508                   if (fg_params->num_y_points > 0) {
509                      int luma = 0;
510                      int luma_x = ((x - 3) << chroma_subsamp_x) + 3;
511                      int luma_y = ((y - 3) << chroma_subsamp_y) + 3;
512                      for (i = 0; i <= chroma_subsamp_y; i++)
513                         for (j = 0; j <= chroma_subsamp_x; j++)
514                            luma += filt_luma_grain_block[luma_y + i][luma_x + j];
515 
516                      luma = ROUND_POWER_OF_TWO(luma, chroma_subsamp_x + chroma_subsamp_y);
517                      s0 += luma * c0;
518                      s1 += luma * c1;
519                   }
520                   break;
521                }
522                s0 += filt_cb_grain_block[y + delta_row][x + delta_col] * c0;
523                s1 += filt_cr_grain_block[y + delta_row][x + delta_col] * c1;
524                pos++;
525             }
526          }
527          filt_cb_grain_block[y][x] = AV1_CLAMP(
528             filt_cb_grain_block[y][x] + ROUND_POWER_OF_TWO(s0, fg_params->ar_coeff_shift), grain_min, grain_max);
529          filt_cr_grain_block[y][x] = AV1_CLAMP(
530             filt_cr_grain_block[y][x] + ROUND_POWER_OF_TWO(s1, fg_params->ar_coeff_shift), grain_min, grain_max);
531       }
532    }
533 
534    for (i = 9; i < luma_block_size_y; i++)
535       for (j = 9; j < luma_block_size_x; j++)
536          luma_grain_block_tmp[i - 9][j - 9] = filt_luma_grain_block[i][j];
537 
538    for (i = 6; i < chroma_block_size_y; i++)
539       for (j = 6; j < chroma_block_size_x; j++) {
540          cb_grain_block_tmp[i - 6][j - 6] = filt_cb_grain_block[i][j];
541          cr_grain_block_tmp[i - 6][j - 6] = filt_cr_grain_block[i][j];
542       }
543 
544    align_ptr = &fg_buf->luma_grain_block[0][0];
545    for (i = 0; i < 64; i++) {
546       for (j = 0; j < 80; j++)
547          *align_ptr++ = luma_grain_block_tmp[i][j];
548 
549       if (((i + 1) % 4) == 0)
550          align_ptr += 64;
551    }
552 
553    align_ptr0 = &fg_buf->cb_grain_block[0][0];
554    align_ptr1 = &fg_buf->cr_grain_block[0][0];
555    for (i = 0; i < 32; i++) {
556       for (j = 0; j < 40; j++) {
557          *align_ptr0++ = cb_grain_block_tmp[i][j];
558          *align_ptr1++ = cr_grain_block_tmp[i][j];
559       }
560       if (((i + 1) % 8) == 0) {
561          align_ptr0 += 64;
562          align_ptr1 += 64;
563       }
564    }
565 
566    memset(fg_buf->scaling_lut_y, 0, sizeof(fg_buf->scaling_lut_y));
567    radv_vcn_av1_film_grain_init_scaling(fg_params->scaling_points_y, fg_params->num_y_points, fg_buf->scaling_lut_y);
568    if (fg_params->chroma_scaling_from_luma) {
569       memcpy(fg_buf->scaling_lut_cb, fg_buf->scaling_lut_y, sizeof(fg_buf->scaling_lut_y));
570       memcpy(fg_buf->scaling_lut_cr, fg_buf->scaling_lut_y, sizeof(fg_buf->scaling_lut_y));
571    } else {
572       memset(fg_buf->scaling_lut_cb, 0, sizeof(fg_buf->scaling_lut_cb));
573       memset(fg_buf->scaling_lut_cr, 0, sizeof(fg_buf->scaling_lut_cr));
574       radv_vcn_av1_film_grain_init_scaling(fg_params->scaling_points_cb, fg_params->num_cb_points,
575                                            fg_buf->scaling_lut_cb);
576       radv_vcn_av1_film_grain_init_scaling(fg_params->scaling_points_cr, fg_params->num_cr_points,
577                                            fg_buf->scaling_lut_cr);
578    }
579 }
580