1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * HEVC CABAC decoding
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * Copyright (C) 2012 - 2013 Guillaume Martres
5cabdff1aSopenharmony_ci * Copyright (C) 2012 - 2013 Gildas Cocherel
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * This file is part of FFmpeg.
8cabdff1aSopenharmony_ci *
9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
13cabdff1aSopenharmony_ci *
14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17cabdff1aSopenharmony_ci * Lesser General Public License for more details.
18cabdff1aSopenharmony_ci *
19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22cabdff1aSopenharmony_ci */
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include "libavutil/attributes.h"
25cabdff1aSopenharmony_ci#include "libavutil/common.h"
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "cabac_functions.h"
28cabdff1aSopenharmony_ci#include "hevc_data.h"
29cabdff1aSopenharmony_ci#include "hevc.h"
30cabdff1aSopenharmony_ci#include "hevcdec.h"
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#define CABAC_MAX_BIN 31
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci/**
35cabdff1aSopenharmony_ci * number of bin by SyntaxElement.
36cabdff1aSopenharmony_ci */
37cabdff1aSopenharmony_cistatic const int8_t num_bins_in_se[] = {
38cabdff1aSopenharmony_ci     1, // sao_merge_flag
39cabdff1aSopenharmony_ci     1, // sao_type_idx
40cabdff1aSopenharmony_ci     0, // sao_eo_class
41cabdff1aSopenharmony_ci     0, // sao_band_position
42cabdff1aSopenharmony_ci     0, // sao_offset_abs
43cabdff1aSopenharmony_ci     0, // sao_offset_sign
44cabdff1aSopenharmony_ci     0, // end_of_slice_flag
45cabdff1aSopenharmony_ci     3, // split_coding_unit_flag
46cabdff1aSopenharmony_ci     1, // cu_transquant_bypass_flag
47cabdff1aSopenharmony_ci     3, // skip_flag
48cabdff1aSopenharmony_ci     3, // cu_qp_delta
49cabdff1aSopenharmony_ci     1, // pred_mode
50cabdff1aSopenharmony_ci     4, // part_mode
51cabdff1aSopenharmony_ci     0, // pcm_flag
52cabdff1aSopenharmony_ci     1, // prev_intra_luma_pred_mode
53cabdff1aSopenharmony_ci     0, // mpm_idx
54cabdff1aSopenharmony_ci     0, // rem_intra_luma_pred_mode
55cabdff1aSopenharmony_ci     2, // intra_chroma_pred_mode
56cabdff1aSopenharmony_ci     1, // merge_flag
57cabdff1aSopenharmony_ci     1, // merge_idx
58cabdff1aSopenharmony_ci     5, // inter_pred_idc
59cabdff1aSopenharmony_ci     2, // ref_idx_l0
60cabdff1aSopenharmony_ci     2, // ref_idx_l1
61cabdff1aSopenharmony_ci     2, // abs_mvd_greater0_flag
62cabdff1aSopenharmony_ci     2, // abs_mvd_greater1_flag
63cabdff1aSopenharmony_ci     0, // abs_mvd_minus2
64cabdff1aSopenharmony_ci     0, // mvd_sign_flag
65cabdff1aSopenharmony_ci     1, // mvp_lx_flag
66cabdff1aSopenharmony_ci     1, // no_residual_data_flag
67cabdff1aSopenharmony_ci     3, // split_transform_flag
68cabdff1aSopenharmony_ci     2, // cbf_luma
69cabdff1aSopenharmony_ci     5, // cbf_cb, cbf_cr
70cabdff1aSopenharmony_ci     2, // transform_skip_flag[][]
71cabdff1aSopenharmony_ci     2, // explicit_rdpcm_flag[][]
72cabdff1aSopenharmony_ci     2, // explicit_rdpcm_dir_flag[][]
73cabdff1aSopenharmony_ci    18, // last_significant_coeff_x_prefix
74cabdff1aSopenharmony_ci    18, // last_significant_coeff_y_prefix
75cabdff1aSopenharmony_ci     0, // last_significant_coeff_x_suffix
76cabdff1aSopenharmony_ci     0, // last_significant_coeff_y_suffix
77cabdff1aSopenharmony_ci     4, // significant_coeff_group_flag
78cabdff1aSopenharmony_ci    44, // significant_coeff_flag
79cabdff1aSopenharmony_ci    24, // coeff_abs_level_greater1_flag
80cabdff1aSopenharmony_ci     6, // coeff_abs_level_greater2_flag
81cabdff1aSopenharmony_ci     0, // coeff_abs_level_remaining
82cabdff1aSopenharmony_ci     0, // coeff_sign_flag
83cabdff1aSopenharmony_ci     8, // log2_res_scale_abs
84cabdff1aSopenharmony_ci     2, // res_scale_sign_flag
85cabdff1aSopenharmony_ci     1, // cu_chroma_qp_offset_flag
86cabdff1aSopenharmony_ci     1, // cu_chroma_qp_offset_idx
87cabdff1aSopenharmony_ci};
88cabdff1aSopenharmony_ci
89cabdff1aSopenharmony_ci/**
90cabdff1aSopenharmony_ci * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement.
91cabdff1aSopenharmony_ci */
92cabdff1aSopenharmony_cistatic const int elem_offset[sizeof(num_bins_in_se)] = {
93cabdff1aSopenharmony_ci    0, // sao_merge_flag
94cabdff1aSopenharmony_ci    1, // sao_type_idx
95cabdff1aSopenharmony_ci    2, // sao_eo_class
96cabdff1aSopenharmony_ci    2, // sao_band_position
97cabdff1aSopenharmony_ci    2, // sao_offset_abs
98cabdff1aSopenharmony_ci    2, // sao_offset_sign
99cabdff1aSopenharmony_ci    2, // end_of_slice_flag
100cabdff1aSopenharmony_ci    2, // split_coding_unit_flag
101cabdff1aSopenharmony_ci    5, // cu_transquant_bypass_flag
102cabdff1aSopenharmony_ci    6, // skip_flag
103cabdff1aSopenharmony_ci    9, // cu_qp_delta
104cabdff1aSopenharmony_ci    12, // pred_mode
105cabdff1aSopenharmony_ci    13, // part_mode
106cabdff1aSopenharmony_ci    17, // pcm_flag
107cabdff1aSopenharmony_ci    17, // prev_intra_luma_pred_mode
108cabdff1aSopenharmony_ci    18, // mpm_idx
109cabdff1aSopenharmony_ci    18, // rem_intra_luma_pred_mode
110cabdff1aSopenharmony_ci    18, // intra_chroma_pred_mode
111cabdff1aSopenharmony_ci    20, // merge_flag
112cabdff1aSopenharmony_ci    21, // merge_idx
113cabdff1aSopenharmony_ci    22, // inter_pred_idc
114cabdff1aSopenharmony_ci    27, // ref_idx_l0
115cabdff1aSopenharmony_ci    29, // ref_idx_l1
116cabdff1aSopenharmony_ci    31, // abs_mvd_greater0_flag
117cabdff1aSopenharmony_ci    33, // abs_mvd_greater1_flag
118cabdff1aSopenharmony_ci    35, // abs_mvd_minus2
119cabdff1aSopenharmony_ci    35, // mvd_sign_flag
120cabdff1aSopenharmony_ci    35, // mvp_lx_flag
121cabdff1aSopenharmony_ci    36, // no_residual_data_flag
122cabdff1aSopenharmony_ci    37, // split_transform_flag
123cabdff1aSopenharmony_ci    40, // cbf_luma
124cabdff1aSopenharmony_ci    42, // cbf_cb, cbf_cr
125cabdff1aSopenharmony_ci    47, // transform_skip_flag[][]
126cabdff1aSopenharmony_ci    49, // explicit_rdpcm_flag[][]
127cabdff1aSopenharmony_ci    51, // explicit_rdpcm_dir_flag[][]
128cabdff1aSopenharmony_ci    53, // last_significant_coeff_x_prefix
129cabdff1aSopenharmony_ci    71, // last_significant_coeff_y_prefix
130cabdff1aSopenharmony_ci    89, // last_significant_coeff_x_suffix
131cabdff1aSopenharmony_ci    89, // last_significant_coeff_y_suffix
132cabdff1aSopenharmony_ci    89, // significant_coeff_group_flag
133cabdff1aSopenharmony_ci    93, // significant_coeff_flag
134cabdff1aSopenharmony_ci    137, // coeff_abs_level_greater1_flag
135cabdff1aSopenharmony_ci    161, // coeff_abs_level_greater2_flag
136cabdff1aSopenharmony_ci    167, // coeff_abs_level_remaining
137cabdff1aSopenharmony_ci    167, // coeff_sign_flag
138cabdff1aSopenharmony_ci    167, // log2_res_scale_abs
139cabdff1aSopenharmony_ci    175, // res_scale_sign_flag
140cabdff1aSopenharmony_ci    177, // cu_chroma_qp_offset_flag
141cabdff1aSopenharmony_ci    178, // cu_chroma_qp_offset_idx
142cabdff1aSopenharmony_ci};
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_ci#define CNU 154
145cabdff1aSopenharmony_ci/**
146cabdff1aSopenharmony_ci * Indexed by init_type
147cabdff1aSopenharmony_ci */
148cabdff1aSopenharmony_cistatic const uint8_t init_values[3][HEVC_CONTEXTS] = {
149cabdff1aSopenharmony_ci    { // sao_merge_flag
150cabdff1aSopenharmony_ci      153,
151cabdff1aSopenharmony_ci      // sao_type_idx
152cabdff1aSopenharmony_ci      200,
153cabdff1aSopenharmony_ci      // split_coding_unit_flag
154cabdff1aSopenharmony_ci      139, 141, 157,
155cabdff1aSopenharmony_ci      // cu_transquant_bypass_flag
156cabdff1aSopenharmony_ci      154,
157cabdff1aSopenharmony_ci      // skip_flag
158cabdff1aSopenharmony_ci      CNU, CNU, CNU,
159cabdff1aSopenharmony_ci      // cu_qp_delta
160cabdff1aSopenharmony_ci      154, 154, 154,
161cabdff1aSopenharmony_ci      // pred_mode
162cabdff1aSopenharmony_ci      CNU,
163cabdff1aSopenharmony_ci      // part_mode
164cabdff1aSopenharmony_ci      184, CNU, CNU, CNU,
165cabdff1aSopenharmony_ci      // prev_intra_luma_pred_mode
166cabdff1aSopenharmony_ci      184,
167cabdff1aSopenharmony_ci      // intra_chroma_pred_mode
168cabdff1aSopenharmony_ci      63, 139,
169cabdff1aSopenharmony_ci      // merge_flag
170cabdff1aSopenharmony_ci      CNU,
171cabdff1aSopenharmony_ci      // merge_idx
172cabdff1aSopenharmony_ci      CNU,
173cabdff1aSopenharmony_ci      // inter_pred_idc
174cabdff1aSopenharmony_ci      CNU, CNU, CNU, CNU, CNU,
175cabdff1aSopenharmony_ci      // ref_idx_l0
176cabdff1aSopenharmony_ci      CNU, CNU,
177cabdff1aSopenharmony_ci      // ref_idx_l1
178cabdff1aSopenharmony_ci      CNU, CNU,
179cabdff1aSopenharmony_ci      // abs_mvd_greater1_flag
180cabdff1aSopenharmony_ci      CNU, CNU,
181cabdff1aSopenharmony_ci      // abs_mvd_greater1_flag
182cabdff1aSopenharmony_ci      CNU, CNU,
183cabdff1aSopenharmony_ci      // mvp_lx_flag
184cabdff1aSopenharmony_ci      CNU,
185cabdff1aSopenharmony_ci      // no_residual_data_flag
186cabdff1aSopenharmony_ci      CNU,
187cabdff1aSopenharmony_ci      // split_transform_flag
188cabdff1aSopenharmony_ci      153, 138, 138,
189cabdff1aSopenharmony_ci      // cbf_luma
190cabdff1aSopenharmony_ci      111, 141,
191cabdff1aSopenharmony_ci      // cbf_cb, cbf_cr
192cabdff1aSopenharmony_ci      94, 138, 182, 154, 154,
193cabdff1aSopenharmony_ci      // transform_skip_flag
194cabdff1aSopenharmony_ci      139, 139,
195cabdff1aSopenharmony_ci      // explicit_rdpcm_flag
196cabdff1aSopenharmony_ci      139, 139,
197cabdff1aSopenharmony_ci      // explicit_rdpcm_dir_flag
198cabdff1aSopenharmony_ci      139, 139,
199cabdff1aSopenharmony_ci      // last_significant_coeff_x_prefix
200cabdff1aSopenharmony_ci      110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
201cabdff1aSopenharmony_ci       79, 108, 123,  63,
202cabdff1aSopenharmony_ci      // last_significant_coeff_y_prefix
203cabdff1aSopenharmony_ci      110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
204cabdff1aSopenharmony_ci       79, 108, 123,  63,
205cabdff1aSopenharmony_ci      // significant_coeff_group_flag
206cabdff1aSopenharmony_ci      91, 171, 134, 141,
207cabdff1aSopenharmony_ci      // significant_coeff_flag
208cabdff1aSopenharmony_ci      111, 111, 125, 110, 110,  94, 124, 108, 124, 107, 125, 141, 179, 153,
209cabdff1aSopenharmony_ci      125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
210cabdff1aSopenharmony_ci      139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
211cabdff1aSopenharmony_ci      141, 111,
212cabdff1aSopenharmony_ci      // coeff_abs_level_greater1_flag
213cabdff1aSopenharmony_ci      140,  92, 137, 138, 140, 152, 138, 139, 153,  74, 149,  92, 139, 107,
214cabdff1aSopenharmony_ci      122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
215cabdff1aSopenharmony_ci      // coeff_abs_level_greater2_flag
216cabdff1aSopenharmony_ci      138, 153, 136, 167, 152, 152,
217cabdff1aSopenharmony_ci      // log2_res_scale_abs
218cabdff1aSopenharmony_ci      154, 154, 154, 154, 154, 154, 154, 154,
219cabdff1aSopenharmony_ci      // res_scale_sign_flag
220cabdff1aSopenharmony_ci      154, 154,
221cabdff1aSopenharmony_ci      // cu_chroma_qp_offset_flag
222cabdff1aSopenharmony_ci      154,
223cabdff1aSopenharmony_ci      // cu_chroma_qp_offset_idx
224cabdff1aSopenharmony_ci      154,
225cabdff1aSopenharmony_ci    },
226cabdff1aSopenharmony_ci    { // sao_merge_flag
227cabdff1aSopenharmony_ci      153,
228cabdff1aSopenharmony_ci      // sao_type_idx
229cabdff1aSopenharmony_ci      185,
230cabdff1aSopenharmony_ci      // split_coding_unit_flag
231cabdff1aSopenharmony_ci      107, 139, 126,
232cabdff1aSopenharmony_ci      // cu_transquant_bypass_flag
233cabdff1aSopenharmony_ci      154,
234cabdff1aSopenharmony_ci      // skip_flag
235cabdff1aSopenharmony_ci      197, 185, 201,
236cabdff1aSopenharmony_ci      // cu_qp_delta
237cabdff1aSopenharmony_ci      154, 154, 154,
238cabdff1aSopenharmony_ci      // pred_mode
239cabdff1aSopenharmony_ci      149,
240cabdff1aSopenharmony_ci      // part_mode
241cabdff1aSopenharmony_ci      154, 139, 154, 154,
242cabdff1aSopenharmony_ci      // prev_intra_luma_pred_mode
243cabdff1aSopenharmony_ci      154,
244cabdff1aSopenharmony_ci      // intra_chroma_pred_mode
245cabdff1aSopenharmony_ci      152, 139,
246cabdff1aSopenharmony_ci      // merge_flag
247cabdff1aSopenharmony_ci      110,
248cabdff1aSopenharmony_ci      // merge_idx
249cabdff1aSopenharmony_ci      122,
250cabdff1aSopenharmony_ci      // inter_pred_idc
251cabdff1aSopenharmony_ci      95, 79, 63, 31, 31,
252cabdff1aSopenharmony_ci      // ref_idx_l0
253cabdff1aSopenharmony_ci      153, 153,
254cabdff1aSopenharmony_ci      // ref_idx_l1
255cabdff1aSopenharmony_ci      153, 153,
256cabdff1aSopenharmony_ci      // abs_mvd_greater1_flag
257cabdff1aSopenharmony_ci      140, 198,
258cabdff1aSopenharmony_ci      // abs_mvd_greater1_flag
259cabdff1aSopenharmony_ci      140, 198,
260cabdff1aSopenharmony_ci      // mvp_lx_flag
261cabdff1aSopenharmony_ci      168,
262cabdff1aSopenharmony_ci      // no_residual_data_flag
263cabdff1aSopenharmony_ci      79,
264cabdff1aSopenharmony_ci      // split_transform_flag
265cabdff1aSopenharmony_ci      124, 138, 94,
266cabdff1aSopenharmony_ci      // cbf_luma
267cabdff1aSopenharmony_ci      153, 111,
268cabdff1aSopenharmony_ci      // cbf_cb, cbf_cr
269cabdff1aSopenharmony_ci      149, 107, 167, 154, 154,
270cabdff1aSopenharmony_ci      // transform_skip_flag
271cabdff1aSopenharmony_ci      139, 139,
272cabdff1aSopenharmony_ci      // explicit_rdpcm_flag
273cabdff1aSopenharmony_ci      139, 139,
274cabdff1aSopenharmony_ci      // explicit_rdpcm_dir_flag
275cabdff1aSopenharmony_ci      139, 139,
276cabdff1aSopenharmony_ci      // last_significant_coeff_x_prefix
277cabdff1aSopenharmony_ci      125, 110,  94, 110,  95,  79, 125, 111, 110,  78, 110, 111, 111,  95,
278cabdff1aSopenharmony_ci       94, 108, 123, 108,
279cabdff1aSopenharmony_ci      // last_significant_coeff_y_prefix
280cabdff1aSopenharmony_ci      125, 110,  94, 110,  95,  79, 125, 111, 110,  78, 110, 111, 111,  95,
281cabdff1aSopenharmony_ci       94, 108, 123, 108,
282cabdff1aSopenharmony_ci      // significant_coeff_group_flag
283cabdff1aSopenharmony_ci      121, 140, 61, 154,
284cabdff1aSopenharmony_ci      // significant_coeff_flag
285cabdff1aSopenharmony_ci      155, 154, 139, 153, 139, 123, 123,  63, 153, 166, 183, 140, 136, 153,
286cabdff1aSopenharmony_ci      154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
287cabdff1aSopenharmony_ci      153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
288cabdff1aSopenharmony_ci      140, 140,
289cabdff1aSopenharmony_ci      // coeff_abs_level_greater1_flag
290cabdff1aSopenharmony_ci      154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
291cabdff1aSopenharmony_ci      136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
292cabdff1aSopenharmony_ci      // coeff_abs_level_greater2_flag
293cabdff1aSopenharmony_ci      107, 167, 91, 122, 107, 167,
294cabdff1aSopenharmony_ci      // log2_res_scale_abs
295cabdff1aSopenharmony_ci      154, 154, 154, 154, 154, 154, 154, 154,
296cabdff1aSopenharmony_ci      // res_scale_sign_flag
297cabdff1aSopenharmony_ci      154, 154,
298cabdff1aSopenharmony_ci      // cu_chroma_qp_offset_flag
299cabdff1aSopenharmony_ci      154,
300cabdff1aSopenharmony_ci      // cu_chroma_qp_offset_idx
301cabdff1aSopenharmony_ci      154,
302cabdff1aSopenharmony_ci    },
303cabdff1aSopenharmony_ci    { // sao_merge_flag
304cabdff1aSopenharmony_ci      153,
305cabdff1aSopenharmony_ci      // sao_type_idx
306cabdff1aSopenharmony_ci      160,
307cabdff1aSopenharmony_ci      // split_coding_unit_flag
308cabdff1aSopenharmony_ci      107, 139, 126,
309cabdff1aSopenharmony_ci      // cu_transquant_bypass_flag
310cabdff1aSopenharmony_ci      154,
311cabdff1aSopenharmony_ci      // skip_flag
312cabdff1aSopenharmony_ci      197, 185, 201,
313cabdff1aSopenharmony_ci      // cu_qp_delta
314cabdff1aSopenharmony_ci      154, 154, 154,
315cabdff1aSopenharmony_ci      // pred_mode
316cabdff1aSopenharmony_ci      134,
317cabdff1aSopenharmony_ci      // part_mode
318cabdff1aSopenharmony_ci      154, 139, 154, 154,
319cabdff1aSopenharmony_ci      // prev_intra_luma_pred_mode
320cabdff1aSopenharmony_ci      183,
321cabdff1aSopenharmony_ci      // intra_chroma_pred_mode
322cabdff1aSopenharmony_ci      152, 139,
323cabdff1aSopenharmony_ci      // merge_flag
324cabdff1aSopenharmony_ci      154,
325cabdff1aSopenharmony_ci      // merge_idx
326cabdff1aSopenharmony_ci      137,
327cabdff1aSopenharmony_ci      // inter_pred_idc
328cabdff1aSopenharmony_ci      95, 79, 63, 31, 31,
329cabdff1aSopenharmony_ci      // ref_idx_l0
330cabdff1aSopenharmony_ci      153, 153,
331cabdff1aSopenharmony_ci      // ref_idx_l1
332cabdff1aSopenharmony_ci      153, 153,
333cabdff1aSopenharmony_ci      // abs_mvd_greater1_flag
334cabdff1aSopenharmony_ci      169, 198,
335cabdff1aSopenharmony_ci      // abs_mvd_greater1_flag
336cabdff1aSopenharmony_ci      169, 198,
337cabdff1aSopenharmony_ci      // mvp_lx_flag
338cabdff1aSopenharmony_ci      168,
339cabdff1aSopenharmony_ci      // no_residual_data_flag
340cabdff1aSopenharmony_ci      79,
341cabdff1aSopenharmony_ci      // split_transform_flag
342cabdff1aSopenharmony_ci      224, 167, 122,
343cabdff1aSopenharmony_ci      // cbf_luma
344cabdff1aSopenharmony_ci      153, 111,
345cabdff1aSopenharmony_ci      // cbf_cb, cbf_cr
346cabdff1aSopenharmony_ci      149, 92, 167, 154, 154,
347cabdff1aSopenharmony_ci      // transform_skip_flag
348cabdff1aSopenharmony_ci      139, 139,
349cabdff1aSopenharmony_ci      // explicit_rdpcm_flag
350cabdff1aSopenharmony_ci      139, 139,
351cabdff1aSopenharmony_ci      // explicit_rdpcm_dir_flag
352cabdff1aSopenharmony_ci      139, 139,
353cabdff1aSopenharmony_ci      // last_significant_coeff_x_prefix
354cabdff1aSopenharmony_ci      125, 110, 124, 110,  95,  94, 125, 111, 111,  79, 125, 126, 111, 111,
355cabdff1aSopenharmony_ci       79, 108, 123,  93,
356cabdff1aSopenharmony_ci      // last_significant_coeff_y_prefix
357cabdff1aSopenharmony_ci      125, 110, 124, 110,  95,  94, 125, 111, 111,  79, 125, 126, 111, 111,
358cabdff1aSopenharmony_ci       79, 108, 123,  93,
359cabdff1aSopenharmony_ci      // significant_coeff_group_flag
360cabdff1aSopenharmony_ci      121, 140, 61, 154,
361cabdff1aSopenharmony_ci      // significant_coeff_flag
362cabdff1aSopenharmony_ci      170, 154, 139, 153, 139, 123, 123,  63, 124, 166, 183, 140, 136, 153,
363cabdff1aSopenharmony_ci      154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
364cabdff1aSopenharmony_ci      153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
365cabdff1aSopenharmony_ci      140, 140,
366cabdff1aSopenharmony_ci      // coeff_abs_level_greater1_flag
367cabdff1aSopenharmony_ci      154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
368cabdff1aSopenharmony_ci      136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
369cabdff1aSopenharmony_ci      // coeff_abs_level_greater2_flag
370cabdff1aSopenharmony_ci      107, 167, 91, 107, 107, 167,
371cabdff1aSopenharmony_ci      // log2_res_scale_abs
372cabdff1aSopenharmony_ci      154, 154, 154, 154, 154, 154, 154, 154,
373cabdff1aSopenharmony_ci      // res_scale_sign_flag
374cabdff1aSopenharmony_ci      154, 154,
375cabdff1aSopenharmony_ci      // cu_chroma_qp_offset_flag
376cabdff1aSopenharmony_ci      154,
377cabdff1aSopenharmony_ci      // cu_chroma_qp_offset_idx
378cabdff1aSopenharmony_ci      154,
379cabdff1aSopenharmony_ci    },
380cabdff1aSopenharmony_ci};
381cabdff1aSopenharmony_ci
382cabdff1aSopenharmony_cistatic const uint8_t scan_1x1[1] = {
383cabdff1aSopenharmony_ci    0,
384cabdff1aSopenharmony_ci};
385cabdff1aSopenharmony_ci
386cabdff1aSopenharmony_cistatic const uint8_t horiz_scan2x2_x[4] = {
387cabdff1aSopenharmony_ci    0, 1, 0, 1,
388cabdff1aSopenharmony_ci};
389cabdff1aSopenharmony_ci
390cabdff1aSopenharmony_cistatic const uint8_t horiz_scan2x2_y[4] = {
391cabdff1aSopenharmony_ci    0, 0, 1, 1
392cabdff1aSopenharmony_ci};
393cabdff1aSopenharmony_ci
394cabdff1aSopenharmony_cistatic const uint8_t horiz_scan4x4_x[16] = {
395cabdff1aSopenharmony_ci    0, 1, 2, 3,
396cabdff1aSopenharmony_ci    0, 1, 2, 3,
397cabdff1aSopenharmony_ci    0, 1, 2, 3,
398cabdff1aSopenharmony_ci    0, 1, 2, 3,
399cabdff1aSopenharmony_ci};
400cabdff1aSopenharmony_ci
401cabdff1aSopenharmony_cistatic const uint8_t horiz_scan4x4_y[16] = {
402cabdff1aSopenharmony_ci    0, 0, 0, 0,
403cabdff1aSopenharmony_ci    1, 1, 1, 1,
404cabdff1aSopenharmony_ci    2, 2, 2, 2,
405cabdff1aSopenharmony_ci    3, 3, 3, 3,
406cabdff1aSopenharmony_ci};
407cabdff1aSopenharmony_ci
408cabdff1aSopenharmony_cistatic const uint8_t horiz_scan8x8_inv[8][8] = {
409cabdff1aSopenharmony_ci    {  0,  1,  2,  3, 16, 17, 18, 19, },
410cabdff1aSopenharmony_ci    {  4,  5,  6,  7, 20, 21, 22, 23, },
411cabdff1aSopenharmony_ci    {  8,  9, 10, 11, 24, 25, 26, 27, },
412cabdff1aSopenharmony_ci    { 12, 13, 14, 15, 28, 29, 30, 31, },
413cabdff1aSopenharmony_ci    { 32, 33, 34, 35, 48, 49, 50, 51, },
414cabdff1aSopenharmony_ci    { 36, 37, 38, 39, 52, 53, 54, 55, },
415cabdff1aSopenharmony_ci    { 40, 41, 42, 43, 56, 57, 58, 59, },
416cabdff1aSopenharmony_ci    { 44, 45, 46, 47, 60, 61, 62, 63, },
417cabdff1aSopenharmony_ci};
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_cistatic const uint8_t diag_scan2x2_x[4] = {
420cabdff1aSopenharmony_ci    0, 0, 1, 1,
421cabdff1aSopenharmony_ci};
422cabdff1aSopenharmony_ci
423cabdff1aSopenharmony_cistatic const uint8_t diag_scan2x2_y[4] = {
424cabdff1aSopenharmony_ci    0, 1, 0, 1,
425cabdff1aSopenharmony_ci};
426cabdff1aSopenharmony_ci
427cabdff1aSopenharmony_cistatic const uint8_t diag_scan2x2_inv[2][2] = {
428cabdff1aSopenharmony_ci    { 0, 2, },
429cabdff1aSopenharmony_ci    { 1, 3, },
430cabdff1aSopenharmony_ci};
431cabdff1aSopenharmony_ci
432cabdff1aSopenharmony_cistatic const uint8_t diag_scan4x4_inv[4][4] = {
433cabdff1aSopenharmony_ci    { 0,  2,  5,  9, },
434cabdff1aSopenharmony_ci    { 1,  4,  8, 12, },
435cabdff1aSopenharmony_ci    { 3,  7, 11, 14, },
436cabdff1aSopenharmony_ci    { 6, 10, 13, 15, },
437cabdff1aSopenharmony_ci};
438cabdff1aSopenharmony_ci
439cabdff1aSopenharmony_cistatic const uint8_t diag_scan8x8_inv[8][8] = {
440cabdff1aSopenharmony_ci    {  0,  2,  5,  9, 14, 20, 27, 35, },
441cabdff1aSopenharmony_ci    {  1,  4,  8, 13, 19, 26, 34, 42, },
442cabdff1aSopenharmony_ci    {  3,  7, 12, 18, 25, 33, 41, 48, },
443cabdff1aSopenharmony_ci    {  6, 11, 17, 24, 32, 40, 47, 53, },
444cabdff1aSopenharmony_ci    { 10, 16, 23, 31, 39, 46, 52, 57, },
445cabdff1aSopenharmony_ci    { 15, 22, 30, 38, 45, 51, 56, 60, },
446cabdff1aSopenharmony_ci    { 21, 29, 37, 44, 50, 55, 59, 62, },
447cabdff1aSopenharmony_ci    { 28, 36, 43, 49, 54, 58, 61, 63, },
448cabdff1aSopenharmony_ci};
449cabdff1aSopenharmony_ci
450cabdff1aSopenharmony_civoid ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts)
451cabdff1aSopenharmony_ci{
452cabdff1aSopenharmony_ci    if (s->ps.pps->entropy_coding_sync_enabled_flag &&
453cabdff1aSopenharmony_ci        (ctb_addr_ts % s->ps.sps->ctb_width == 2 ||
454cabdff1aSopenharmony_ci         (s->ps.sps->ctb_width == 2 &&
455cabdff1aSopenharmony_ci          ctb_addr_ts % s->ps.sps->ctb_width == 0))) {
456cabdff1aSopenharmony_ci        memcpy(s->cabac_state, s->HEVClc->cabac_state, HEVC_CONTEXTS);
457cabdff1aSopenharmony_ci        if (s->ps.sps->persistent_rice_adaptation_enabled_flag) {
458cabdff1aSopenharmony_ci            memcpy(s->stat_coeff, s->HEVClc->stat_coeff, HEVC_STAT_COEFFS);
459cabdff1aSopenharmony_ci        }
460cabdff1aSopenharmony_ci    }
461cabdff1aSopenharmony_ci}
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_cistatic void load_states(HEVCContext *s, int thread)
464cabdff1aSopenharmony_ci{
465cabdff1aSopenharmony_ci    memcpy(s->HEVClc->cabac_state, s->cabac_state, HEVC_CONTEXTS);
466cabdff1aSopenharmony_ci    if (s->ps.sps->persistent_rice_adaptation_enabled_flag) {
467cabdff1aSopenharmony_ci        const HEVCContext *prev = s->sList[(thread + s->threads_number - 1) % s->threads_number];
468cabdff1aSopenharmony_ci        memcpy(s->HEVClc->stat_coeff, prev->stat_coeff, HEVC_STAT_COEFFS);
469cabdff1aSopenharmony_ci    }
470cabdff1aSopenharmony_ci}
471cabdff1aSopenharmony_ci
472cabdff1aSopenharmony_cistatic int cabac_reinit(HEVCLocalContext *lc)
473cabdff1aSopenharmony_ci{
474cabdff1aSopenharmony_ci    return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
475cabdff1aSopenharmony_ci}
476cabdff1aSopenharmony_ci
477cabdff1aSopenharmony_cistatic int cabac_init_decoder(HEVCContext *s)
478cabdff1aSopenharmony_ci{
479cabdff1aSopenharmony_ci    GetBitContext *gb = &s->HEVClc->gb;
480cabdff1aSopenharmony_ci    skip_bits(gb, 1);
481cabdff1aSopenharmony_ci    align_get_bits(gb);
482cabdff1aSopenharmony_ci    return ff_init_cabac_decoder(&s->HEVClc->cc,
483cabdff1aSopenharmony_ci                          gb->buffer + get_bits_count(gb) / 8,
484cabdff1aSopenharmony_ci                          (get_bits_left(gb) + 7) / 8);
485cabdff1aSopenharmony_ci}
486cabdff1aSopenharmony_ci
487cabdff1aSopenharmony_cistatic void cabac_init_state(HEVCContext *s)
488cabdff1aSopenharmony_ci{
489cabdff1aSopenharmony_ci    int init_type = 2 - s->sh.slice_type;
490cabdff1aSopenharmony_ci    int i;
491cabdff1aSopenharmony_ci
492cabdff1aSopenharmony_ci    if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I)
493cabdff1aSopenharmony_ci        init_type ^= 3;
494cabdff1aSopenharmony_ci
495cabdff1aSopenharmony_ci    for (i = 0; i < HEVC_CONTEXTS; i++) {
496cabdff1aSopenharmony_ci        int init_value = init_values[init_type][i];
497cabdff1aSopenharmony_ci        int m = (init_value >> 4) * 5 - 45;
498cabdff1aSopenharmony_ci        int n = ((init_value & 15) << 3) - 16;
499cabdff1aSopenharmony_ci        int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
500cabdff1aSopenharmony_ci
501cabdff1aSopenharmony_ci        pre ^= pre >> 31;
502cabdff1aSopenharmony_ci        if (pre > 124)
503cabdff1aSopenharmony_ci            pre = 124 + (pre & 1);
504cabdff1aSopenharmony_ci        s->HEVClc->cabac_state[i] = pre;
505cabdff1aSopenharmony_ci    }
506cabdff1aSopenharmony_ci
507cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++)
508cabdff1aSopenharmony_ci        s->HEVClc->stat_coeff[i] = 0;
509cabdff1aSopenharmony_ci}
510cabdff1aSopenharmony_ci
511cabdff1aSopenharmony_ciint ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts, int thread)
512cabdff1aSopenharmony_ci{
513cabdff1aSopenharmony_ci    if (ctb_addr_ts == s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
514cabdff1aSopenharmony_ci        int ret = cabac_init_decoder(s);
515cabdff1aSopenharmony_ci        if (ret < 0)
516cabdff1aSopenharmony_ci            return ret;
517cabdff1aSopenharmony_ci        if (s->sh.dependent_slice_segment_flag == 0 ||
518cabdff1aSopenharmony_ci            (s->ps.pps->tiles_enabled_flag &&
519cabdff1aSopenharmony_ci             s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]))
520cabdff1aSopenharmony_ci            cabac_init_state(s);
521cabdff1aSopenharmony_ci
522cabdff1aSopenharmony_ci        if (!s->sh.first_slice_in_pic_flag &&
523cabdff1aSopenharmony_ci            s->ps.pps->entropy_coding_sync_enabled_flag) {
524cabdff1aSopenharmony_ci            if (ctb_addr_ts % s->ps.sps->ctb_width == 0) {
525cabdff1aSopenharmony_ci                if (s->ps.sps->ctb_width == 1)
526cabdff1aSopenharmony_ci                    cabac_init_state(s);
527cabdff1aSopenharmony_ci                else if (s->sh.dependent_slice_segment_flag == 1)
528cabdff1aSopenharmony_ci                    load_states(s, thread);
529cabdff1aSopenharmony_ci            }
530cabdff1aSopenharmony_ci        }
531cabdff1aSopenharmony_ci    } else {
532cabdff1aSopenharmony_ci        if (s->ps.pps->tiles_enabled_flag &&
533cabdff1aSopenharmony_ci            s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) {
534cabdff1aSopenharmony_ci            int ret;
535cabdff1aSopenharmony_ci            if (s->threads_number == 1)
536cabdff1aSopenharmony_ci                ret = cabac_reinit(s->HEVClc);
537cabdff1aSopenharmony_ci            else {
538cabdff1aSopenharmony_ci                ret = cabac_init_decoder(s);
539cabdff1aSopenharmony_ci            }
540cabdff1aSopenharmony_ci            if (ret < 0)
541cabdff1aSopenharmony_ci                return ret;
542cabdff1aSopenharmony_ci            cabac_init_state(s);
543cabdff1aSopenharmony_ci        }
544cabdff1aSopenharmony_ci        if (s->ps.pps->entropy_coding_sync_enabled_flag) {
545cabdff1aSopenharmony_ci            if (ctb_addr_ts % s->ps.sps->ctb_width == 0) {
546cabdff1aSopenharmony_ci                int ret;
547cabdff1aSopenharmony_ci                get_cabac_terminate(&s->HEVClc->cc);
548cabdff1aSopenharmony_ci                if (s->threads_number == 1)
549cabdff1aSopenharmony_ci                    ret = cabac_reinit(s->HEVClc);
550cabdff1aSopenharmony_ci                else {
551cabdff1aSopenharmony_ci                    ret = cabac_init_decoder(s);
552cabdff1aSopenharmony_ci                }
553cabdff1aSopenharmony_ci                if (ret < 0)
554cabdff1aSopenharmony_ci                    return ret;
555cabdff1aSopenharmony_ci
556cabdff1aSopenharmony_ci                if (s->ps.sps->ctb_width == 1)
557cabdff1aSopenharmony_ci                    cabac_init_state(s);
558cabdff1aSopenharmony_ci                else
559cabdff1aSopenharmony_ci                    load_states(s, thread);
560cabdff1aSopenharmony_ci            }
561cabdff1aSopenharmony_ci        }
562cabdff1aSopenharmony_ci    }
563cabdff1aSopenharmony_ci    return 0;
564cabdff1aSopenharmony_ci}
565cabdff1aSopenharmony_ci
566cabdff1aSopenharmony_ci#define GET_CABAC(ctx) get_cabac(&s->HEVClc->cc, &s->HEVClc->cabac_state[ctx])
567cabdff1aSopenharmony_ci
568cabdff1aSopenharmony_ciint ff_hevc_sao_merge_flag_decode(HEVCContext *s)
569cabdff1aSopenharmony_ci{
570cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SAO_MERGE_FLAG]);
571cabdff1aSopenharmony_ci}
572cabdff1aSopenharmony_ci
573cabdff1aSopenharmony_ciint ff_hevc_sao_type_idx_decode(HEVCContext *s)
574cabdff1aSopenharmony_ci{
575cabdff1aSopenharmony_ci    if (!GET_CABAC(elem_offset[SAO_TYPE_IDX]))
576cabdff1aSopenharmony_ci        return 0;
577cabdff1aSopenharmony_ci
578cabdff1aSopenharmony_ci    if (!get_cabac_bypass(&s->HEVClc->cc))
579cabdff1aSopenharmony_ci        return SAO_BAND;
580cabdff1aSopenharmony_ci    return SAO_EDGE;
581cabdff1aSopenharmony_ci}
582cabdff1aSopenharmony_ci
583cabdff1aSopenharmony_ciint ff_hevc_sao_band_position_decode(HEVCContext *s)
584cabdff1aSopenharmony_ci{
585cabdff1aSopenharmony_ci    int i;
586cabdff1aSopenharmony_ci    int value = get_cabac_bypass(&s->HEVClc->cc);
587cabdff1aSopenharmony_ci
588cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++)
589cabdff1aSopenharmony_ci        value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
590cabdff1aSopenharmony_ci    return value;
591cabdff1aSopenharmony_ci}
592cabdff1aSopenharmony_ci
593cabdff1aSopenharmony_ciint ff_hevc_sao_offset_abs_decode(HEVCContext *s)
594cabdff1aSopenharmony_ci{
595cabdff1aSopenharmony_ci    int i = 0;
596cabdff1aSopenharmony_ci    int length = (1 << (FFMIN(s->ps.sps->bit_depth, 10) - 5)) - 1;
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ci    while (i < length && get_cabac_bypass(&s->HEVClc->cc))
599cabdff1aSopenharmony_ci        i++;
600cabdff1aSopenharmony_ci    return i;
601cabdff1aSopenharmony_ci}
602cabdff1aSopenharmony_ci
603cabdff1aSopenharmony_ciint ff_hevc_sao_offset_sign_decode(HEVCContext *s)
604cabdff1aSopenharmony_ci{
605cabdff1aSopenharmony_ci    return get_cabac_bypass(&s->HEVClc->cc);
606cabdff1aSopenharmony_ci}
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ciint ff_hevc_sao_eo_class_decode(HEVCContext *s)
609cabdff1aSopenharmony_ci{
610cabdff1aSopenharmony_ci    int ret = get_cabac_bypass(&s->HEVClc->cc) << 1;
611cabdff1aSopenharmony_ci    ret    |= get_cabac_bypass(&s->HEVClc->cc);
612cabdff1aSopenharmony_ci    return ret;
613cabdff1aSopenharmony_ci}
614cabdff1aSopenharmony_ci
615cabdff1aSopenharmony_ciint ff_hevc_end_of_slice_flag_decode(HEVCContext *s)
616cabdff1aSopenharmony_ci{
617cabdff1aSopenharmony_ci    return get_cabac_terminate(&s->HEVClc->cc);
618cabdff1aSopenharmony_ci}
619cabdff1aSopenharmony_ci
620cabdff1aSopenharmony_ciint ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
621cabdff1aSopenharmony_ci{
622cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[CU_TRANSQUANT_BYPASS_FLAG]);
623cabdff1aSopenharmony_ci}
624cabdff1aSopenharmony_ci
625cabdff1aSopenharmony_ciint ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb)
626cabdff1aSopenharmony_ci{
627cabdff1aSopenharmony_ci    int min_cb_width = s->ps.sps->min_cb_width;
628cabdff1aSopenharmony_ci    int inc = 0;
629cabdff1aSopenharmony_ci    int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
630cabdff1aSopenharmony_ci    int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
631cabdff1aSopenharmony_ci
632cabdff1aSopenharmony_ci    if (s->HEVClc->ctb_left_flag || x0b)
633cabdff1aSopenharmony_ci        inc = !!SAMPLE_CTB(s->skip_flag, x_cb - 1, y_cb);
634cabdff1aSopenharmony_ci    if (s->HEVClc->ctb_up_flag || y0b)
635cabdff1aSopenharmony_ci        inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1);
636cabdff1aSopenharmony_ci
637cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SKIP_FLAG] + inc);
638cabdff1aSopenharmony_ci}
639cabdff1aSopenharmony_ci
640cabdff1aSopenharmony_ciint ff_hevc_cu_qp_delta_abs(HEVCContext *s)
641cabdff1aSopenharmony_ci{
642cabdff1aSopenharmony_ci    int prefix_val = 0;
643cabdff1aSopenharmony_ci    int suffix_val = 0;
644cabdff1aSopenharmony_ci    int inc = 0;
645cabdff1aSopenharmony_ci
646cabdff1aSopenharmony_ci    while (prefix_val < 5 && GET_CABAC(elem_offset[CU_QP_DELTA] + inc)) {
647cabdff1aSopenharmony_ci        prefix_val++;
648cabdff1aSopenharmony_ci        inc = 1;
649cabdff1aSopenharmony_ci    }
650cabdff1aSopenharmony_ci    if (prefix_val >= 5) {
651cabdff1aSopenharmony_ci        int k = 0;
652cabdff1aSopenharmony_ci        while (k < 7 && get_cabac_bypass(&s->HEVClc->cc)) {
653cabdff1aSopenharmony_ci            suffix_val += 1 << k;
654cabdff1aSopenharmony_ci            k++;
655cabdff1aSopenharmony_ci        }
656cabdff1aSopenharmony_ci        if (k == 7) {
657cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
658cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
659cabdff1aSopenharmony_ci        }
660cabdff1aSopenharmony_ci
661cabdff1aSopenharmony_ci        while (k--)
662cabdff1aSopenharmony_ci            suffix_val += get_cabac_bypass(&s->HEVClc->cc) << k;
663cabdff1aSopenharmony_ci    }
664cabdff1aSopenharmony_ci    return prefix_val + suffix_val;
665cabdff1aSopenharmony_ci}
666cabdff1aSopenharmony_ci
667cabdff1aSopenharmony_ciint ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s)
668cabdff1aSopenharmony_ci{
669cabdff1aSopenharmony_ci    return get_cabac_bypass(&s->HEVClc->cc);
670cabdff1aSopenharmony_ci}
671cabdff1aSopenharmony_ci
672cabdff1aSopenharmony_ciint ff_hevc_cu_chroma_qp_offset_flag(HEVCContext *s)
673cabdff1aSopenharmony_ci{
674cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_FLAG]);
675cabdff1aSopenharmony_ci}
676cabdff1aSopenharmony_ci
677cabdff1aSopenharmony_ciint ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s)
678cabdff1aSopenharmony_ci{
679cabdff1aSopenharmony_ci    int c_max= FFMAX(5, s->ps.pps->chroma_qp_offset_list_len_minus1);
680cabdff1aSopenharmony_ci    int i = 0;
681cabdff1aSopenharmony_ci
682cabdff1aSopenharmony_ci    while (i < c_max && GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_IDX]))
683cabdff1aSopenharmony_ci        i++;
684cabdff1aSopenharmony_ci
685cabdff1aSopenharmony_ci    return i;
686cabdff1aSopenharmony_ci}
687cabdff1aSopenharmony_ci
688cabdff1aSopenharmony_ciint ff_hevc_pred_mode_decode(HEVCContext *s)
689cabdff1aSopenharmony_ci{
690cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[PRED_MODE_FLAG]);
691cabdff1aSopenharmony_ci}
692cabdff1aSopenharmony_ci
693cabdff1aSopenharmony_ciint ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0)
694cabdff1aSopenharmony_ci{
695cabdff1aSopenharmony_ci    int inc = 0, depth_left = 0, depth_top = 0;
696cabdff1aSopenharmony_ci    int x0b  = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
697cabdff1aSopenharmony_ci    int y0b  = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
698cabdff1aSopenharmony_ci    int x_cb = x0 >> s->ps.sps->log2_min_cb_size;
699cabdff1aSopenharmony_ci    int y_cb = y0 >> s->ps.sps->log2_min_cb_size;
700cabdff1aSopenharmony_ci
701cabdff1aSopenharmony_ci    if (s->HEVClc->ctb_left_flag || x0b)
702cabdff1aSopenharmony_ci        depth_left = s->tab_ct_depth[(y_cb) * s->ps.sps->min_cb_width + x_cb - 1];
703cabdff1aSopenharmony_ci    if (s->HEVClc->ctb_up_flag || y0b)
704cabdff1aSopenharmony_ci        depth_top = s->tab_ct_depth[(y_cb - 1) * s->ps.sps->min_cb_width + x_cb];
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_ci    inc += (depth_left > ct_depth);
707cabdff1aSopenharmony_ci    inc += (depth_top  > ct_depth);
708cabdff1aSopenharmony_ci
709cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SPLIT_CODING_UNIT_FLAG] + inc);
710cabdff1aSopenharmony_ci}
711cabdff1aSopenharmony_ci
712cabdff1aSopenharmony_ciint ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
713cabdff1aSopenharmony_ci{
714cabdff1aSopenharmony_ci    if (GET_CABAC(elem_offset[PART_MODE])) // 1
715cabdff1aSopenharmony_ci        return PART_2Nx2N;
716cabdff1aSopenharmony_ci    if (log2_cb_size == s->ps.sps->log2_min_cb_size) {
717cabdff1aSopenharmony_ci        if (s->HEVClc->cu.pred_mode == MODE_INTRA) // 0
718cabdff1aSopenharmony_ci            return PART_NxN;
719cabdff1aSopenharmony_ci        if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
720cabdff1aSopenharmony_ci            return PART_2NxN;
721cabdff1aSopenharmony_ci        if (log2_cb_size == 3) // 00
722cabdff1aSopenharmony_ci            return PART_Nx2N;
723cabdff1aSopenharmony_ci        if (GET_CABAC(elem_offset[PART_MODE] + 2)) // 001
724cabdff1aSopenharmony_ci            return PART_Nx2N;
725cabdff1aSopenharmony_ci        return PART_NxN; // 000
726cabdff1aSopenharmony_ci    }
727cabdff1aSopenharmony_ci
728cabdff1aSopenharmony_ci    if (!s->ps.sps->amp_enabled_flag) {
729cabdff1aSopenharmony_ci        if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
730cabdff1aSopenharmony_ci            return PART_2NxN;
731cabdff1aSopenharmony_ci        return PART_Nx2N;
732cabdff1aSopenharmony_ci    }
733cabdff1aSopenharmony_ci
734cabdff1aSopenharmony_ci    if (GET_CABAC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX
735cabdff1aSopenharmony_ci        if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 011
736cabdff1aSopenharmony_ci            return PART_2NxN;
737cabdff1aSopenharmony_ci        if (get_cabac_bypass(&s->HEVClc->cc)) // 0101
738cabdff1aSopenharmony_ci            return PART_2NxnD;
739cabdff1aSopenharmony_ci        return PART_2NxnU; // 0100
740cabdff1aSopenharmony_ci    }
741cabdff1aSopenharmony_ci
742cabdff1aSopenharmony_ci    if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 001
743cabdff1aSopenharmony_ci        return PART_Nx2N;
744cabdff1aSopenharmony_ci    if (get_cabac_bypass(&s->HEVClc->cc)) // 0001
745cabdff1aSopenharmony_ci        return PART_nRx2N;
746cabdff1aSopenharmony_ci    return PART_nLx2N;  // 0000
747cabdff1aSopenharmony_ci}
748cabdff1aSopenharmony_ci
749cabdff1aSopenharmony_ciint ff_hevc_pcm_flag_decode(HEVCContext *s)
750cabdff1aSopenharmony_ci{
751cabdff1aSopenharmony_ci    return get_cabac_terminate(&s->HEVClc->cc);
752cabdff1aSopenharmony_ci}
753cabdff1aSopenharmony_ci
754cabdff1aSopenharmony_ciint ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
755cabdff1aSopenharmony_ci{
756cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[PREV_INTRA_LUMA_PRED_FLAG]);
757cabdff1aSopenharmony_ci}
758cabdff1aSopenharmony_ci
759cabdff1aSopenharmony_ciint ff_hevc_mpm_idx_decode(HEVCContext *s)
760cabdff1aSopenharmony_ci{
761cabdff1aSopenharmony_ci    int i = 0;
762cabdff1aSopenharmony_ci    while (i < 2 && get_cabac_bypass(&s->HEVClc->cc))
763cabdff1aSopenharmony_ci        i++;
764cabdff1aSopenharmony_ci    return i;
765cabdff1aSopenharmony_ci}
766cabdff1aSopenharmony_ci
767cabdff1aSopenharmony_ciint ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s)
768cabdff1aSopenharmony_ci{
769cabdff1aSopenharmony_ci    int i;
770cabdff1aSopenharmony_ci    int value = get_cabac_bypass(&s->HEVClc->cc);
771cabdff1aSopenharmony_ci
772cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++)
773cabdff1aSopenharmony_ci        value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
774cabdff1aSopenharmony_ci    return value;
775cabdff1aSopenharmony_ci}
776cabdff1aSopenharmony_ci
777cabdff1aSopenharmony_ciint ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s)
778cabdff1aSopenharmony_ci{
779cabdff1aSopenharmony_ci    int ret;
780cabdff1aSopenharmony_ci    if (!GET_CABAC(elem_offset[INTRA_CHROMA_PRED_MODE]))
781cabdff1aSopenharmony_ci        return 4;
782cabdff1aSopenharmony_ci
783cabdff1aSopenharmony_ci    ret  = get_cabac_bypass(&s->HEVClc->cc) << 1;
784cabdff1aSopenharmony_ci    ret |= get_cabac_bypass(&s->HEVClc->cc);
785cabdff1aSopenharmony_ci    return ret;
786cabdff1aSopenharmony_ci}
787cabdff1aSopenharmony_ci
788cabdff1aSopenharmony_ciint ff_hevc_merge_idx_decode(HEVCContext *s)
789cabdff1aSopenharmony_ci{
790cabdff1aSopenharmony_ci    int i = GET_CABAC(elem_offset[MERGE_IDX]);
791cabdff1aSopenharmony_ci
792cabdff1aSopenharmony_ci    if (i != 0) {
793cabdff1aSopenharmony_ci        while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&s->HEVClc->cc))
794cabdff1aSopenharmony_ci            i++;
795cabdff1aSopenharmony_ci    }
796cabdff1aSopenharmony_ci    return i;
797cabdff1aSopenharmony_ci}
798cabdff1aSopenharmony_ci
799cabdff1aSopenharmony_ciint ff_hevc_merge_flag_decode(HEVCContext *s)
800cabdff1aSopenharmony_ci{
801cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[MERGE_FLAG]);
802cabdff1aSopenharmony_ci}
803cabdff1aSopenharmony_ci
804cabdff1aSopenharmony_ciint ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH)
805cabdff1aSopenharmony_ci{
806cabdff1aSopenharmony_ci    if (nPbW + nPbH == 12)
807cabdff1aSopenharmony_ci        return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
808cabdff1aSopenharmony_ci    if (GET_CABAC(elem_offset[INTER_PRED_IDC] + s->HEVClc->ct_depth))
809cabdff1aSopenharmony_ci        return PRED_BI;
810cabdff1aSopenharmony_ci
811cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
812cabdff1aSopenharmony_ci}
813cabdff1aSopenharmony_ci
814cabdff1aSopenharmony_ciint ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx)
815cabdff1aSopenharmony_ci{
816cabdff1aSopenharmony_ci    int i = 0;
817cabdff1aSopenharmony_ci    int max = num_ref_idx_lx - 1;
818cabdff1aSopenharmony_ci    int max_ctx = FFMIN(max, 2);
819cabdff1aSopenharmony_ci
820cabdff1aSopenharmony_ci    while (i < max_ctx && GET_CABAC(elem_offset[REF_IDX_L0] + i))
821cabdff1aSopenharmony_ci        i++;
822cabdff1aSopenharmony_ci    if (i == 2) {
823cabdff1aSopenharmony_ci        while (i < max && get_cabac_bypass(&s->HEVClc->cc))
824cabdff1aSopenharmony_ci            i++;
825cabdff1aSopenharmony_ci    }
826cabdff1aSopenharmony_ci
827cabdff1aSopenharmony_ci    return i;
828cabdff1aSopenharmony_ci}
829cabdff1aSopenharmony_ci
830cabdff1aSopenharmony_ciint ff_hevc_mvp_lx_flag_decode(HEVCContext *s)
831cabdff1aSopenharmony_ci{
832cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[MVP_LX_FLAG]);
833cabdff1aSopenharmony_ci}
834cabdff1aSopenharmony_ci
835cabdff1aSopenharmony_ciint ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s)
836cabdff1aSopenharmony_ci{
837cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[NO_RESIDUAL_DATA_FLAG]);
838cabdff1aSopenharmony_ci}
839cabdff1aSopenharmony_ci
840cabdff1aSopenharmony_cistatic av_always_inline int abs_mvd_greater0_flag_decode(HEVCContext *s)
841cabdff1aSopenharmony_ci{
842cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[ABS_MVD_GREATER0_FLAG]);
843cabdff1aSopenharmony_ci}
844cabdff1aSopenharmony_ci
845cabdff1aSopenharmony_cistatic av_always_inline int abs_mvd_greater1_flag_decode(HEVCContext *s)
846cabdff1aSopenharmony_ci{
847cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[ABS_MVD_GREATER1_FLAG] + 1);
848cabdff1aSopenharmony_ci}
849cabdff1aSopenharmony_ci
850cabdff1aSopenharmony_cistatic av_always_inline int mvd_decode(HEVCContext *s)
851cabdff1aSopenharmony_ci{
852cabdff1aSopenharmony_ci    int ret = 2;
853cabdff1aSopenharmony_ci    int k = 1;
854cabdff1aSopenharmony_ci
855cabdff1aSopenharmony_ci    while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
856cabdff1aSopenharmony_ci        ret += 1U << k;
857cabdff1aSopenharmony_ci        k++;
858cabdff1aSopenharmony_ci    }
859cabdff1aSopenharmony_ci    if (k == CABAC_MAX_BIN) {
860cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
861cabdff1aSopenharmony_ci        return 0;
862cabdff1aSopenharmony_ci    }
863cabdff1aSopenharmony_ci    while (k--)
864cabdff1aSopenharmony_ci        ret += get_cabac_bypass(&s->HEVClc->cc) << k;
865cabdff1aSopenharmony_ci    return get_cabac_bypass_sign(&s->HEVClc->cc, -ret);
866cabdff1aSopenharmony_ci}
867cabdff1aSopenharmony_ci
868cabdff1aSopenharmony_cistatic av_always_inline int mvd_sign_flag_decode(HEVCContext *s)
869cabdff1aSopenharmony_ci{
870cabdff1aSopenharmony_ci    return get_cabac_bypass_sign(&s->HEVClc->cc, -1);
871cabdff1aSopenharmony_ci}
872cabdff1aSopenharmony_ci
873cabdff1aSopenharmony_ciint ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size)
874cabdff1aSopenharmony_ci{
875cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SPLIT_TRANSFORM_FLAG] + 5 - log2_trafo_size);
876cabdff1aSopenharmony_ci}
877cabdff1aSopenharmony_ci
878cabdff1aSopenharmony_ciint ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth)
879cabdff1aSopenharmony_ci{
880cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[CBF_CB_CR] + trafo_depth);
881cabdff1aSopenharmony_ci}
882cabdff1aSopenharmony_ci
883cabdff1aSopenharmony_ciint ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth)
884cabdff1aSopenharmony_ci{
885cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[CBF_LUMA] + !trafo_depth);
886cabdff1aSopenharmony_ci}
887cabdff1aSopenharmony_ci
888cabdff1aSopenharmony_cistatic int hevc_transform_skip_flag_decode(HEVCContext *s, int c_idx)
889cabdff1aSopenharmony_ci{
890cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[TRANSFORM_SKIP_FLAG] + !!c_idx);
891cabdff1aSopenharmony_ci}
892cabdff1aSopenharmony_ci
893cabdff1aSopenharmony_cistatic int explicit_rdpcm_flag_decode(HEVCContext *s, int c_idx)
894cabdff1aSopenharmony_ci{
895cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[EXPLICIT_RDPCM_FLAG] + !!c_idx);
896cabdff1aSopenharmony_ci}
897cabdff1aSopenharmony_ci
898cabdff1aSopenharmony_cistatic int explicit_rdpcm_dir_flag_decode(HEVCContext *s, int c_idx)
899cabdff1aSopenharmony_ci{
900cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[EXPLICIT_RDPCM_DIR_FLAG] + !!c_idx);
901cabdff1aSopenharmony_ci}
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_ciint ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx) {
904cabdff1aSopenharmony_ci    int i =0;
905cabdff1aSopenharmony_ci
906cabdff1aSopenharmony_ci    while (i < 4 && GET_CABAC(elem_offset[LOG2_RES_SCALE_ABS] + 4 * idx + i))
907cabdff1aSopenharmony_ci        i++;
908cabdff1aSopenharmony_ci
909cabdff1aSopenharmony_ci    return i;
910cabdff1aSopenharmony_ci}
911cabdff1aSopenharmony_ci
912cabdff1aSopenharmony_ciint ff_hevc_res_scale_sign_flag(HEVCContext *s, int idx) {
913cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[RES_SCALE_SIGN_FLAG] + idx);
914cabdff1aSopenharmony_ci}
915cabdff1aSopenharmony_ci
916cabdff1aSopenharmony_cistatic av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCContext *s, int c_idx,
917cabdff1aSopenharmony_ci                                                   int log2_size, int *last_scx_prefix, int *last_scy_prefix)
918cabdff1aSopenharmony_ci{
919cabdff1aSopenharmony_ci    int i = 0;
920cabdff1aSopenharmony_ci    int max = (log2_size << 1) - 1;
921cabdff1aSopenharmony_ci    int ctx_offset, ctx_shift;
922cabdff1aSopenharmony_ci
923cabdff1aSopenharmony_ci    if (!c_idx) {
924cabdff1aSopenharmony_ci        ctx_offset = 3 * (log2_size - 2)  + ((log2_size - 1) >> 2);
925cabdff1aSopenharmony_ci        ctx_shift = (log2_size + 1) >> 2;
926cabdff1aSopenharmony_ci    } else {
927cabdff1aSopenharmony_ci        ctx_offset = 15;
928cabdff1aSopenharmony_ci        ctx_shift = log2_size - 2;
929cabdff1aSopenharmony_ci    }
930cabdff1aSopenharmony_ci    while (i < max &&
931cabdff1aSopenharmony_ci           GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_X_PREFIX] + (i >> ctx_shift) + ctx_offset))
932cabdff1aSopenharmony_ci        i++;
933cabdff1aSopenharmony_ci    *last_scx_prefix = i;
934cabdff1aSopenharmony_ci
935cabdff1aSopenharmony_ci    i = 0;
936cabdff1aSopenharmony_ci    while (i < max &&
937cabdff1aSopenharmony_ci           GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_Y_PREFIX] + (i >> ctx_shift) + ctx_offset))
938cabdff1aSopenharmony_ci        i++;
939cabdff1aSopenharmony_ci    *last_scy_prefix = i;
940cabdff1aSopenharmony_ci}
941cabdff1aSopenharmony_ci
942cabdff1aSopenharmony_cistatic av_always_inline int last_significant_coeff_suffix_decode(HEVCContext *s,
943cabdff1aSopenharmony_ci                                                 int last_significant_coeff_prefix)
944cabdff1aSopenharmony_ci{
945cabdff1aSopenharmony_ci    int i;
946cabdff1aSopenharmony_ci    int length = (last_significant_coeff_prefix >> 1) - 1;
947cabdff1aSopenharmony_ci    int value = get_cabac_bypass(&s->HEVClc->cc);
948cabdff1aSopenharmony_ci
949cabdff1aSopenharmony_ci    for (i = 1; i < length; i++)
950cabdff1aSopenharmony_ci        value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
951cabdff1aSopenharmony_ci    return value;
952cabdff1aSopenharmony_ci}
953cabdff1aSopenharmony_ci
954cabdff1aSopenharmony_cistatic av_always_inline int significant_coeff_group_flag_decode(HEVCContext *s, int c_idx, int ctx_cg)
955cabdff1aSopenharmony_ci{
956cabdff1aSopenharmony_ci    int inc;
957cabdff1aSopenharmony_ci
958cabdff1aSopenharmony_ci    inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
959cabdff1aSopenharmony_ci
960cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_GROUP_FLAG] + inc);
961cabdff1aSopenharmony_ci}
962cabdff1aSopenharmony_cistatic av_always_inline int significant_coeff_flag_decode(HEVCContext *s, int x_c, int y_c,
963cabdff1aSopenharmony_ci                                           int offset, const uint8_t *ctx_idx_map)
964cabdff1aSopenharmony_ci{
965cabdff1aSopenharmony_ci    int inc = ctx_idx_map[(y_c << 2) + x_c] + offset;
966cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + inc);
967cabdff1aSopenharmony_ci}
968cabdff1aSopenharmony_ci
969cabdff1aSopenharmony_cistatic av_always_inline int significant_coeff_flag_decode_0(HEVCContext *s, int c_idx, int offset)
970cabdff1aSopenharmony_ci{
971cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + offset);
972cabdff1aSopenharmony_ci}
973cabdff1aSopenharmony_ci
974cabdff1aSopenharmony_cistatic av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCContext *s, int c_idx, int inc)
975cabdff1aSopenharmony_ci{
976cabdff1aSopenharmony_ci
977cabdff1aSopenharmony_ci    if (c_idx > 0)
978cabdff1aSopenharmony_ci        inc += 16;
979cabdff1aSopenharmony_ci
980cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER1_FLAG] + inc);
981cabdff1aSopenharmony_ci}
982cabdff1aSopenharmony_ci
983cabdff1aSopenharmony_cistatic av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCContext *s, int c_idx, int inc)
984cabdff1aSopenharmony_ci{
985cabdff1aSopenharmony_ci    if (c_idx > 0)
986cabdff1aSopenharmony_ci        inc += 4;
987cabdff1aSopenharmony_ci
988cabdff1aSopenharmony_ci    return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER2_FLAG] + inc);
989cabdff1aSopenharmony_ci}
990cabdff1aSopenharmony_ci
991cabdff1aSopenharmony_cistatic av_always_inline int coeff_abs_level_remaining_decode(HEVCContext *s, int rc_rice_param)
992cabdff1aSopenharmony_ci{
993cabdff1aSopenharmony_ci    int prefix = 0;
994cabdff1aSopenharmony_ci    int suffix = 0;
995cabdff1aSopenharmony_ci    int last_coeff_abs_level_remaining;
996cabdff1aSopenharmony_ci    int i;
997cabdff1aSopenharmony_ci
998cabdff1aSopenharmony_ci    while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc))
999cabdff1aSopenharmony_ci        prefix++;
1000cabdff1aSopenharmony_ci
1001cabdff1aSopenharmony_ci    if (prefix < 3) {
1002cabdff1aSopenharmony_ci        for (i = 0; i < rc_rice_param; i++)
1003cabdff1aSopenharmony_ci            suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
1004cabdff1aSopenharmony_ci        last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
1005cabdff1aSopenharmony_ci    } else {
1006cabdff1aSopenharmony_ci        int prefix_minus3 = prefix - 3;
1007cabdff1aSopenharmony_ci
1008cabdff1aSopenharmony_ci        if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
1009cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
1010cabdff1aSopenharmony_ci            return 0;
1011cabdff1aSopenharmony_ci        }
1012cabdff1aSopenharmony_ci
1013cabdff1aSopenharmony_ci        for (i = 0; i < prefix_minus3 + rc_rice_param; i++)
1014cabdff1aSopenharmony_ci            suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
1015cabdff1aSopenharmony_ci        last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1016cabdff1aSopenharmony_ci                                              << rc_rice_param) + suffix;
1017cabdff1aSopenharmony_ci    }
1018cabdff1aSopenharmony_ci    return last_coeff_abs_level_remaining;
1019cabdff1aSopenharmony_ci}
1020cabdff1aSopenharmony_ci
1021cabdff1aSopenharmony_cistatic av_always_inline int coeff_sign_flag_decode(HEVCContext *s, uint8_t nb)
1022cabdff1aSopenharmony_ci{
1023cabdff1aSopenharmony_ci    int i;
1024cabdff1aSopenharmony_ci    int ret = 0;
1025cabdff1aSopenharmony_ci
1026cabdff1aSopenharmony_ci    for (i = 0; i < nb; i++)
1027cabdff1aSopenharmony_ci        ret = (ret << 1) | get_cabac_bypass(&s->HEVClc->cc);
1028cabdff1aSopenharmony_ci    return ret;
1029cabdff1aSopenharmony_ci}
1030cabdff1aSopenharmony_ci
1031cabdff1aSopenharmony_civoid ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
1032cabdff1aSopenharmony_ci                                int log2_trafo_size, enum ScanType scan_idx,
1033cabdff1aSopenharmony_ci                                int c_idx)
1034cabdff1aSopenharmony_ci{
1035cabdff1aSopenharmony_ci#define GET_COORD(offset, n)                                    \
1036cabdff1aSopenharmony_ci    do {                                                        \
1037cabdff1aSopenharmony_ci        x_c = (x_cg << 2) + scan_x_off[n];                      \
1038cabdff1aSopenharmony_ci        y_c = (y_cg << 2) + scan_y_off[n];                      \
1039cabdff1aSopenharmony_ci    } while (0)
1040cabdff1aSopenharmony_ci    HEVCLocalContext *lc = s->HEVClc;
1041cabdff1aSopenharmony_ci    int transform_skip_flag = 0;
1042cabdff1aSopenharmony_ci
1043cabdff1aSopenharmony_ci    int last_significant_coeff_x, last_significant_coeff_y;
1044cabdff1aSopenharmony_ci    int last_scan_pos;
1045cabdff1aSopenharmony_ci    int n_end;
1046cabdff1aSopenharmony_ci    int num_coeff = 0;
1047cabdff1aSopenharmony_ci    int greater1_ctx = 1;
1048cabdff1aSopenharmony_ci
1049cabdff1aSopenharmony_ci    int num_last_subset;
1050cabdff1aSopenharmony_ci    int x_cg_last_sig, y_cg_last_sig;
1051cabdff1aSopenharmony_ci
1052cabdff1aSopenharmony_ci    const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1053cabdff1aSopenharmony_ci
1054cabdff1aSopenharmony_ci    ptrdiff_t stride = s->frame->linesize[c_idx];
1055cabdff1aSopenharmony_ci    int hshift = s->ps.sps->hshift[c_idx];
1056cabdff1aSopenharmony_ci    int vshift = s->ps.sps->vshift[c_idx];
1057cabdff1aSopenharmony_ci    uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
1058cabdff1aSopenharmony_ci                                          ((x0 >> hshift) << s->ps.sps->pixel_shift)];
1059cabdff1aSopenharmony_ci    int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1060cabdff1aSopenharmony_ci    uint8_t significant_coeff_group_flag[8][8] = {{0}};
1061cabdff1aSopenharmony_ci    int explicit_rdpcm_flag = 0;
1062cabdff1aSopenharmony_ci    int explicit_rdpcm_dir_flag;
1063cabdff1aSopenharmony_ci
1064cabdff1aSopenharmony_ci    int trafo_size = 1 << log2_trafo_size;
1065cabdff1aSopenharmony_ci    int i;
1066cabdff1aSopenharmony_ci    int qp,shift,add,scale,scale_m;
1067cabdff1aSopenharmony_ci    static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1068cabdff1aSopenharmony_ci    const uint8_t *scale_matrix = NULL;
1069cabdff1aSopenharmony_ci    uint8_t dc_scale;
1070cabdff1aSopenharmony_ci    int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1071cabdff1aSopenharmony_ci                                         lc->tu.intra_pred_mode_c;
1072cabdff1aSopenharmony_ci
1073cabdff1aSopenharmony_ci    memset(coeffs, 0, trafo_size * trafo_size * sizeof(int16_t));
1074cabdff1aSopenharmony_ci
1075cabdff1aSopenharmony_ci    // Derive QP for dequant
1076cabdff1aSopenharmony_ci    if (!lc->cu.cu_transquant_bypass_flag) {
1077cabdff1aSopenharmony_ci        static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1078cabdff1aSopenharmony_ci        static const uint8_t rem6[51 + 4 * 6 + 1] = {
1079cabdff1aSopenharmony_ci            0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1080cabdff1aSopenharmony_ci            3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1081cabdff1aSopenharmony_ci            0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1082cabdff1aSopenharmony_ci            4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1083cabdff1aSopenharmony_ci        };
1084cabdff1aSopenharmony_ci
1085cabdff1aSopenharmony_ci        static const uint8_t div6[51 + 4 * 6 + 1] = {
1086cabdff1aSopenharmony_ci            0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3,  3,  3,
1087cabdff1aSopenharmony_ci            3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,  6,  6,
1088cabdff1aSopenharmony_ci            7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1089cabdff1aSopenharmony_ci            10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1090cabdff1aSopenharmony_ci        };
1091cabdff1aSopenharmony_ci        int qp_y = lc->qp_y;
1092cabdff1aSopenharmony_ci
1093cabdff1aSopenharmony_ci        if (s->ps.pps->transform_skip_enabled_flag &&
1094cabdff1aSopenharmony_ci            log2_trafo_size <= s->ps.pps->log2_max_transform_skip_block_size) {
1095cabdff1aSopenharmony_ci            transform_skip_flag = hevc_transform_skip_flag_decode(s, c_idx);
1096cabdff1aSopenharmony_ci        }
1097cabdff1aSopenharmony_ci
1098cabdff1aSopenharmony_ci        if (c_idx == 0) {
1099cabdff1aSopenharmony_ci            qp = qp_y + s->ps.sps->qp_bd_offset;
1100cabdff1aSopenharmony_ci        } else {
1101cabdff1aSopenharmony_ci            int qp_i, offset;
1102cabdff1aSopenharmony_ci
1103cabdff1aSopenharmony_ci            if (c_idx == 1)
1104cabdff1aSopenharmony_ci                offset = s->ps.pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1105cabdff1aSopenharmony_ci                         lc->tu.cu_qp_offset_cb;
1106cabdff1aSopenharmony_ci            else
1107cabdff1aSopenharmony_ci                offset = s->ps.pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1108cabdff1aSopenharmony_ci                         lc->tu.cu_qp_offset_cr;
1109cabdff1aSopenharmony_ci
1110cabdff1aSopenharmony_ci            qp_i = av_clip(qp_y + offset, - s->ps.sps->qp_bd_offset, 57);
1111cabdff1aSopenharmony_ci            if (s->ps.sps->chroma_format_idc == 1) {
1112cabdff1aSopenharmony_ci                if (qp_i < 30)
1113cabdff1aSopenharmony_ci                    qp = qp_i;
1114cabdff1aSopenharmony_ci                else if (qp_i > 43)
1115cabdff1aSopenharmony_ci                    qp = qp_i - 6;
1116cabdff1aSopenharmony_ci                else
1117cabdff1aSopenharmony_ci                    qp = qp_c[qp_i - 30];
1118cabdff1aSopenharmony_ci            } else {
1119cabdff1aSopenharmony_ci                if (qp_i > 51)
1120cabdff1aSopenharmony_ci                    qp = 51;
1121cabdff1aSopenharmony_ci                else
1122cabdff1aSopenharmony_ci                    qp = qp_i;
1123cabdff1aSopenharmony_ci            }
1124cabdff1aSopenharmony_ci
1125cabdff1aSopenharmony_ci            qp += s->ps.sps->qp_bd_offset;
1126cabdff1aSopenharmony_ci        }
1127cabdff1aSopenharmony_ci
1128cabdff1aSopenharmony_ci        shift    = s->ps.sps->bit_depth + log2_trafo_size - 5;
1129cabdff1aSopenharmony_ci        add      = 1 << (shift-1);
1130cabdff1aSopenharmony_ci        scale    = level_scale[rem6[qp]] << (div6[qp]);
1131cabdff1aSopenharmony_ci        scale_m  = 16; // default when no custom scaling lists.
1132cabdff1aSopenharmony_ci        dc_scale = 16;
1133cabdff1aSopenharmony_ci
1134cabdff1aSopenharmony_ci        if (s->ps.sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) {
1135cabdff1aSopenharmony_ci            const ScalingList *sl = s->ps.pps->scaling_list_data_present_flag ?
1136cabdff1aSopenharmony_ci            &s->ps.pps->scaling_list : &s->ps.sps->scaling_list;
1137cabdff1aSopenharmony_ci            int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1138cabdff1aSopenharmony_ci
1139cabdff1aSopenharmony_ci            matrix_id = 3 * matrix_id + c_idx;
1140cabdff1aSopenharmony_ci
1141cabdff1aSopenharmony_ci            scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1142cabdff1aSopenharmony_ci            if (log2_trafo_size >= 4)
1143cabdff1aSopenharmony_ci                dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1144cabdff1aSopenharmony_ci        }
1145cabdff1aSopenharmony_ci    } else {
1146cabdff1aSopenharmony_ci        shift        = 0;
1147cabdff1aSopenharmony_ci        add          = 0;
1148cabdff1aSopenharmony_ci        scale        = 0;
1149cabdff1aSopenharmony_ci        dc_scale     = 0;
1150cabdff1aSopenharmony_ci    }
1151cabdff1aSopenharmony_ci
1152cabdff1aSopenharmony_ci    if (lc->cu.pred_mode == MODE_INTER && s->ps.sps->explicit_rdpcm_enabled_flag &&
1153cabdff1aSopenharmony_ci        (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1154cabdff1aSopenharmony_ci        explicit_rdpcm_flag = explicit_rdpcm_flag_decode(s, c_idx);
1155cabdff1aSopenharmony_ci        if (explicit_rdpcm_flag) {
1156cabdff1aSopenharmony_ci            explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(s, c_idx);
1157cabdff1aSopenharmony_ci        }
1158cabdff1aSopenharmony_ci    }
1159cabdff1aSopenharmony_ci
1160cabdff1aSopenharmony_ci    last_significant_coeff_xy_prefix_decode(s, c_idx, log2_trafo_size,
1161cabdff1aSopenharmony_ci                                           &last_significant_coeff_x, &last_significant_coeff_y);
1162cabdff1aSopenharmony_ci
1163cabdff1aSopenharmony_ci    if (last_significant_coeff_x > 3) {
1164cabdff1aSopenharmony_ci        int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
1165cabdff1aSopenharmony_ci        last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1166cabdff1aSopenharmony_ci        (2 + (last_significant_coeff_x & 1)) +
1167cabdff1aSopenharmony_ci        suffix;
1168cabdff1aSopenharmony_ci    }
1169cabdff1aSopenharmony_ci
1170cabdff1aSopenharmony_ci    if (last_significant_coeff_y > 3) {
1171cabdff1aSopenharmony_ci        int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1172cabdff1aSopenharmony_ci        last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1173cabdff1aSopenharmony_ci        (2 + (last_significant_coeff_y & 1)) +
1174cabdff1aSopenharmony_ci        suffix;
1175cabdff1aSopenharmony_ci    }
1176cabdff1aSopenharmony_ci
1177cabdff1aSopenharmony_ci    if (scan_idx == SCAN_VERT)
1178cabdff1aSopenharmony_ci        FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1179cabdff1aSopenharmony_ci
1180cabdff1aSopenharmony_ci    x_cg_last_sig = last_significant_coeff_x >> 2;
1181cabdff1aSopenharmony_ci    y_cg_last_sig = last_significant_coeff_y >> 2;
1182cabdff1aSopenharmony_ci
1183cabdff1aSopenharmony_ci    switch (scan_idx) {
1184cabdff1aSopenharmony_ci    case SCAN_DIAG: {
1185cabdff1aSopenharmony_ci        int last_x_c = last_significant_coeff_x & 3;
1186cabdff1aSopenharmony_ci        int last_y_c = last_significant_coeff_y & 3;
1187cabdff1aSopenharmony_ci
1188cabdff1aSopenharmony_ci        scan_x_off = ff_hevc_diag_scan4x4_x;
1189cabdff1aSopenharmony_ci        scan_y_off = ff_hevc_diag_scan4x4_y;
1190cabdff1aSopenharmony_ci        num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1191cabdff1aSopenharmony_ci        if (trafo_size == 4) {
1192cabdff1aSopenharmony_ci            scan_x_cg = scan_1x1;
1193cabdff1aSopenharmony_ci            scan_y_cg = scan_1x1;
1194cabdff1aSopenharmony_ci        } else if (trafo_size == 8) {
1195cabdff1aSopenharmony_ci            num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1196cabdff1aSopenharmony_ci            scan_x_cg = diag_scan2x2_x;
1197cabdff1aSopenharmony_ci            scan_y_cg = diag_scan2x2_y;
1198cabdff1aSopenharmony_ci        } else if (trafo_size == 16) {
1199cabdff1aSopenharmony_ci            num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1200cabdff1aSopenharmony_ci            scan_x_cg = ff_hevc_diag_scan4x4_x;
1201cabdff1aSopenharmony_ci            scan_y_cg = ff_hevc_diag_scan4x4_y;
1202cabdff1aSopenharmony_ci        } else { // trafo_size == 32
1203cabdff1aSopenharmony_ci            num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1204cabdff1aSopenharmony_ci            scan_x_cg = ff_hevc_diag_scan8x8_x;
1205cabdff1aSopenharmony_ci            scan_y_cg = ff_hevc_diag_scan8x8_y;
1206cabdff1aSopenharmony_ci        }
1207cabdff1aSopenharmony_ci        break;
1208cabdff1aSopenharmony_ci    }
1209cabdff1aSopenharmony_ci    case SCAN_HORIZ:
1210cabdff1aSopenharmony_ci        scan_x_cg = horiz_scan2x2_x;
1211cabdff1aSopenharmony_ci        scan_y_cg = horiz_scan2x2_y;
1212cabdff1aSopenharmony_ci        scan_x_off = horiz_scan4x4_x;
1213cabdff1aSopenharmony_ci        scan_y_off = horiz_scan4x4_y;
1214cabdff1aSopenharmony_ci        num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1215cabdff1aSopenharmony_ci        break;
1216cabdff1aSopenharmony_ci    default: //SCAN_VERT
1217cabdff1aSopenharmony_ci        scan_x_cg = horiz_scan2x2_y;
1218cabdff1aSopenharmony_ci        scan_y_cg = horiz_scan2x2_x;
1219cabdff1aSopenharmony_ci        scan_x_off = horiz_scan4x4_y;
1220cabdff1aSopenharmony_ci        scan_y_off = horiz_scan4x4_x;
1221cabdff1aSopenharmony_ci        num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1222cabdff1aSopenharmony_ci        break;
1223cabdff1aSopenharmony_ci    }
1224cabdff1aSopenharmony_ci    num_coeff++;
1225cabdff1aSopenharmony_ci    num_last_subset = (num_coeff - 1) >> 4;
1226cabdff1aSopenharmony_ci
1227cabdff1aSopenharmony_ci    for (i = num_last_subset; i >= 0; i--) {
1228cabdff1aSopenharmony_ci        int n, m;
1229cabdff1aSopenharmony_ci        int x_cg, y_cg, x_c, y_c, pos;
1230cabdff1aSopenharmony_ci        int implicit_non_zero_coeff = 0;
1231cabdff1aSopenharmony_ci        int64_t trans_coeff_level;
1232cabdff1aSopenharmony_ci        int prev_sig = 0;
1233cabdff1aSopenharmony_ci        int offset = i << 4;
1234cabdff1aSopenharmony_ci        int rice_init = 0;
1235cabdff1aSopenharmony_ci
1236cabdff1aSopenharmony_ci        uint8_t significant_coeff_flag_idx[16];
1237cabdff1aSopenharmony_ci        uint8_t nb_significant_coeff_flag = 0;
1238cabdff1aSopenharmony_ci
1239cabdff1aSopenharmony_ci        x_cg = scan_x_cg[i];
1240cabdff1aSopenharmony_ci        y_cg = scan_y_cg[i];
1241cabdff1aSopenharmony_ci
1242cabdff1aSopenharmony_ci        if ((i < num_last_subset) && (i > 0)) {
1243cabdff1aSopenharmony_ci            int ctx_cg = 0;
1244cabdff1aSopenharmony_ci            if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1245cabdff1aSopenharmony_ci                ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1246cabdff1aSopenharmony_ci            if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1247cabdff1aSopenharmony_ci                ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1248cabdff1aSopenharmony_ci
1249cabdff1aSopenharmony_ci            significant_coeff_group_flag[x_cg][y_cg] =
1250cabdff1aSopenharmony_ci                significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1251cabdff1aSopenharmony_ci            implicit_non_zero_coeff = 1;
1252cabdff1aSopenharmony_ci        } else {
1253cabdff1aSopenharmony_ci            significant_coeff_group_flag[x_cg][y_cg] =
1254cabdff1aSopenharmony_ci            ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1255cabdff1aSopenharmony_ci             (x_cg == 0 && y_cg == 0));
1256cabdff1aSopenharmony_ci        }
1257cabdff1aSopenharmony_ci
1258cabdff1aSopenharmony_ci        last_scan_pos = num_coeff - offset - 1;
1259cabdff1aSopenharmony_ci
1260cabdff1aSopenharmony_ci        if (i == num_last_subset) {
1261cabdff1aSopenharmony_ci            n_end = last_scan_pos - 1;
1262cabdff1aSopenharmony_ci            significant_coeff_flag_idx[0] = last_scan_pos;
1263cabdff1aSopenharmony_ci            nb_significant_coeff_flag = 1;
1264cabdff1aSopenharmony_ci        } else {
1265cabdff1aSopenharmony_ci            n_end = 15;
1266cabdff1aSopenharmony_ci        }
1267cabdff1aSopenharmony_ci
1268cabdff1aSopenharmony_ci        if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1269cabdff1aSopenharmony_ci            prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1270cabdff1aSopenharmony_ci        if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1271cabdff1aSopenharmony_ci            prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1272cabdff1aSopenharmony_ci
1273cabdff1aSopenharmony_ci        if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1274cabdff1aSopenharmony_ci            static const uint8_t ctx_idx_map[] = {
1275cabdff1aSopenharmony_ci                0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2
1276cabdff1aSopenharmony_ci                1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1277cabdff1aSopenharmony_ci                2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1
1278cabdff1aSopenharmony_ci                2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2
1279cabdff1aSopenharmony_ci                2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2  // default
1280cabdff1aSopenharmony_ci            };
1281cabdff1aSopenharmony_ci            const uint8_t *ctx_idx_map_p;
1282cabdff1aSopenharmony_ci            int scf_offset = 0;
1283cabdff1aSopenharmony_ci            if (s->ps.sps->transform_skip_context_enabled_flag &&
1284cabdff1aSopenharmony_ci                (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1285cabdff1aSopenharmony_ci                ctx_idx_map_p = &ctx_idx_map[4 * 16];
1286cabdff1aSopenharmony_ci                if (c_idx == 0) {
1287cabdff1aSopenharmony_ci                    scf_offset = 40;
1288cabdff1aSopenharmony_ci                } else {
1289cabdff1aSopenharmony_ci                    scf_offset = 14 + 27;
1290cabdff1aSopenharmony_ci                }
1291cabdff1aSopenharmony_ci            } else {
1292cabdff1aSopenharmony_ci                if (c_idx != 0)
1293cabdff1aSopenharmony_ci                    scf_offset = 27;
1294cabdff1aSopenharmony_ci                if (log2_trafo_size == 2) {
1295cabdff1aSopenharmony_ci                    ctx_idx_map_p = &ctx_idx_map[0];
1296cabdff1aSopenharmony_ci                } else {
1297cabdff1aSopenharmony_ci                    ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4];
1298cabdff1aSopenharmony_ci                    if (c_idx == 0) {
1299cabdff1aSopenharmony_ci                        if ((x_cg > 0 || y_cg > 0))
1300cabdff1aSopenharmony_ci                            scf_offset += 3;
1301cabdff1aSopenharmony_ci                        if (log2_trafo_size == 3) {
1302cabdff1aSopenharmony_ci                            scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1303cabdff1aSopenharmony_ci                        } else {
1304cabdff1aSopenharmony_ci                            scf_offset += 21;
1305cabdff1aSopenharmony_ci                        }
1306cabdff1aSopenharmony_ci                    } else {
1307cabdff1aSopenharmony_ci                        if (log2_trafo_size == 3)
1308cabdff1aSopenharmony_ci                            scf_offset += 9;
1309cabdff1aSopenharmony_ci                        else
1310cabdff1aSopenharmony_ci                            scf_offset += 12;
1311cabdff1aSopenharmony_ci                    }
1312cabdff1aSopenharmony_ci                }
1313cabdff1aSopenharmony_ci            }
1314cabdff1aSopenharmony_ci            for (n = n_end; n > 0; n--) {
1315cabdff1aSopenharmony_ci                x_c = scan_x_off[n];
1316cabdff1aSopenharmony_ci                y_c = scan_y_off[n];
1317cabdff1aSopenharmony_ci                if (significant_coeff_flag_decode(s, x_c, y_c, scf_offset, ctx_idx_map_p)) {
1318cabdff1aSopenharmony_ci                    significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1319cabdff1aSopenharmony_ci                    nb_significant_coeff_flag++;
1320cabdff1aSopenharmony_ci                    implicit_non_zero_coeff = 0;
1321cabdff1aSopenharmony_ci                }
1322cabdff1aSopenharmony_ci            }
1323cabdff1aSopenharmony_ci            if (implicit_non_zero_coeff == 0) {
1324cabdff1aSopenharmony_ci                if (s->ps.sps->transform_skip_context_enabled_flag &&
1325cabdff1aSopenharmony_ci                    (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1326cabdff1aSopenharmony_ci                    if (c_idx == 0) {
1327cabdff1aSopenharmony_ci                        scf_offset = 42;
1328cabdff1aSopenharmony_ci                    } else {
1329cabdff1aSopenharmony_ci                        scf_offset = 16 + 27;
1330cabdff1aSopenharmony_ci                    }
1331cabdff1aSopenharmony_ci                } else {
1332cabdff1aSopenharmony_ci                    if (i == 0) {
1333cabdff1aSopenharmony_ci                        if (c_idx == 0)
1334cabdff1aSopenharmony_ci                            scf_offset = 0;
1335cabdff1aSopenharmony_ci                        else
1336cabdff1aSopenharmony_ci                            scf_offset = 27;
1337cabdff1aSopenharmony_ci                    } else {
1338cabdff1aSopenharmony_ci                        scf_offset = 2 + scf_offset;
1339cabdff1aSopenharmony_ci                    }
1340cabdff1aSopenharmony_ci                }
1341cabdff1aSopenharmony_ci                if (significant_coeff_flag_decode_0(s, c_idx, scf_offset) == 1) {
1342cabdff1aSopenharmony_ci                    significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1343cabdff1aSopenharmony_ci                    nb_significant_coeff_flag++;
1344cabdff1aSopenharmony_ci                }
1345cabdff1aSopenharmony_ci            } else {
1346cabdff1aSopenharmony_ci                significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1347cabdff1aSopenharmony_ci                nb_significant_coeff_flag++;
1348cabdff1aSopenharmony_ci            }
1349cabdff1aSopenharmony_ci        }
1350cabdff1aSopenharmony_ci
1351cabdff1aSopenharmony_ci        n_end = nb_significant_coeff_flag;
1352cabdff1aSopenharmony_ci
1353cabdff1aSopenharmony_ci
1354cabdff1aSopenharmony_ci        if (n_end) {
1355cabdff1aSopenharmony_ci            int first_nz_pos_in_cg;
1356cabdff1aSopenharmony_ci            int last_nz_pos_in_cg;
1357cabdff1aSopenharmony_ci            int c_rice_param = 0;
1358cabdff1aSopenharmony_ci            int first_greater1_coeff_idx = -1;
1359cabdff1aSopenharmony_ci            uint8_t coeff_abs_level_greater1_flag[8];
1360cabdff1aSopenharmony_ci            uint16_t coeff_sign_flag;
1361cabdff1aSopenharmony_ci            int sum_abs = 0;
1362cabdff1aSopenharmony_ci            int sign_hidden;
1363cabdff1aSopenharmony_ci            int sb_type;
1364cabdff1aSopenharmony_ci
1365cabdff1aSopenharmony_ci
1366cabdff1aSopenharmony_ci            // initialize first elem of coeff_bas_level_greater1_flag
1367cabdff1aSopenharmony_ci            int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1368cabdff1aSopenharmony_ci
1369cabdff1aSopenharmony_ci            if (s->ps.sps->persistent_rice_adaptation_enabled_flag) {
1370cabdff1aSopenharmony_ci                if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag)
1371cabdff1aSopenharmony_ci                    sb_type = 2 * (c_idx == 0 ? 1 : 0);
1372cabdff1aSopenharmony_ci                else
1373cabdff1aSopenharmony_ci                    sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1374cabdff1aSopenharmony_ci                c_rice_param = lc->stat_coeff[sb_type] / 4;
1375cabdff1aSopenharmony_ci            }
1376cabdff1aSopenharmony_ci
1377cabdff1aSopenharmony_ci            if (!(i == num_last_subset) && greater1_ctx == 0)
1378cabdff1aSopenharmony_ci                ctx_set++;
1379cabdff1aSopenharmony_ci            greater1_ctx = 1;
1380cabdff1aSopenharmony_ci            last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1381cabdff1aSopenharmony_ci
1382cabdff1aSopenharmony_ci            for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1383cabdff1aSopenharmony_ci                int inc = (ctx_set << 2) + greater1_ctx;
1384cabdff1aSopenharmony_ci                coeff_abs_level_greater1_flag[m] =
1385cabdff1aSopenharmony_ci                    coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1386cabdff1aSopenharmony_ci                if (coeff_abs_level_greater1_flag[m]) {
1387cabdff1aSopenharmony_ci                    greater1_ctx = 0;
1388cabdff1aSopenharmony_ci                    if (first_greater1_coeff_idx == -1)
1389cabdff1aSopenharmony_ci                        first_greater1_coeff_idx = m;
1390cabdff1aSopenharmony_ci                } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1391cabdff1aSopenharmony_ci                    greater1_ctx++;
1392cabdff1aSopenharmony_ci                }
1393cabdff1aSopenharmony_ci            }
1394cabdff1aSopenharmony_ci            first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1395cabdff1aSopenharmony_ci
1396cabdff1aSopenharmony_ci            if (lc->cu.cu_transquant_bypass_flag ||
1397cabdff1aSopenharmony_ci                (lc->cu.pred_mode ==  MODE_INTRA  &&
1398cabdff1aSopenharmony_ci                 s->ps.sps->implicit_rdpcm_enabled_flag  &&  transform_skip_flag  &&
1399cabdff1aSopenharmony_ci                 (pred_mode_intra == 10 || pred_mode_intra  ==  26 )) ||
1400cabdff1aSopenharmony_ci                 explicit_rdpcm_flag)
1401cabdff1aSopenharmony_ci                sign_hidden = 0;
1402cabdff1aSopenharmony_ci            else
1403cabdff1aSopenharmony_ci                sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1404cabdff1aSopenharmony_ci
1405cabdff1aSopenharmony_ci            if (first_greater1_coeff_idx != -1) {
1406cabdff1aSopenharmony_ci                coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1407cabdff1aSopenharmony_ci            }
1408cabdff1aSopenharmony_ci            if (!s->ps.pps->sign_data_hiding_flag || !sign_hidden ) {
1409cabdff1aSopenharmony_ci                coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1410cabdff1aSopenharmony_ci            } else {
1411cabdff1aSopenharmony_ci                coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1412cabdff1aSopenharmony_ci            }
1413cabdff1aSopenharmony_ci
1414cabdff1aSopenharmony_ci            for (m = 0; m < n_end; m++) {
1415cabdff1aSopenharmony_ci                n = significant_coeff_flag_idx[m];
1416cabdff1aSopenharmony_ci                GET_COORD(offset, n);
1417cabdff1aSopenharmony_ci                if (m < 8) {
1418cabdff1aSopenharmony_ci                    trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1419cabdff1aSopenharmony_ci                    if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1420cabdff1aSopenharmony_ci                        int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param);
1421cabdff1aSopenharmony_ci
1422cabdff1aSopenharmony_ci                        trans_coeff_level += last_coeff_abs_level_remaining;
1423cabdff1aSopenharmony_ci                        if (trans_coeff_level > (3 << c_rice_param))
1424cabdff1aSopenharmony_ci                            c_rice_param = s->ps.sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1425cabdff1aSopenharmony_ci                        if (s->ps.sps->persistent_rice_adaptation_enabled_flag && !rice_init) {
1426cabdff1aSopenharmony_ci                            int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1427cabdff1aSopenharmony_ci                            if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1428cabdff1aSopenharmony_ci                                lc->stat_coeff[sb_type]++;
1429cabdff1aSopenharmony_ci                            else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1430cabdff1aSopenharmony_ci                                if (lc->stat_coeff[sb_type] > 0)
1431cabdff1aSopenharmony_ci                                    lc->stat_coeff[sb_type]--;
1432cabdff1aSopenharmony_ci                            rice_init = 1;
1433cabdff1aSopenharmony_ci                        }
1434cabdff1aSopenharmony_ci                    }
1435cabdff1aSopenharmony_ci                } else {
1436cabdff1aSopenharmony_ci                    int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param);
1437cabdff1aSopenharmony_ci
1438cabdff1aSopenharmony_ci                    trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1439cabdff1aSopenharmony_ci                    if (trans_coeff_level > (3 << c_rice_param))
1440cabdff1aSopenharmony_ci                        c_rice_param = s->ps.sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1441cabdff1aSopenharmony_ci                    if (s->ps.sps->persistent_rice_adaptation_enabled_flag && !rice_init) {
1442cabdff1aSopenharmony_ci                        int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1443cabdff1aSopenharmony_ci                        if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1444cabdff1aSopenharmony_ci                            lc->stat_coeff[sb_type]++;
1445cabdff1aSopenharmony_ci                        else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1446cabdff1aSopenharmony_ci                            if (lc->stat_coeff[sb_type] > 0)
1447cabdff1aSopenharmony_ci                                lc->stat_coeff[sb_type]--;
1448cabdff1aSopenharmony_ci                        rice_init = 1;
1449cabdff1aSopenharmony_ci                    }
1450cabdff1aSopenharmony_ci                }
1451cabdff1aSopenharmony_ci                if (s->ps.pps->sign_data_hiding_flag && sign_hidden) {
1452cabdff1aSopenharmony_ci                    sum_abs += trans_coeff_level;
1453cabdff1aSopenharmony_ci                    if (n == first_nz_pos_in_cg && (sum_abs&1))
1454cabdff1aSopenharmony_ci                        trans_coeff_level = -trans_coeff_level;
1455cabdff1aSopenharmony_ci                }
1456cabdff1aSopenharmony_ci                if (coeff_sign_flag >> 15)
1457cabdff1aSopenharmony_ci                    trans_coeff_level = -trans_coeff_level;
1458cabdff1aSopenharmony_ci                coeff_sign_flag <<= 1;
1459cabdff1aSopenharmony_ci                if(!lc->cu.cu_transquant_bypass_flag) {
1460cabdff1aSopenharmony_ci                    if (s->ps.sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) {
1461cabdff1aSopenharmony_ci                        if(y_c || x_c || log2_trafo_size < 4) {
1462cabdff1aSopenharmony_ci                            switch(log2_trafo_size) {
1463cabdff1aSopenharmony_ci                                case 3: pos = (y_c << 3) + x_c; break;
1464cabdff1aSopenharmony_ci                                case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1465cabdff1aSopenharmony_ci                                case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1466cabdff1aSopenharmony_ci                                default: pos = (y_c << 2) + x_c; break;
1467cabdff1aSopenharmony_ci                            }
1468cabdff1aSopenharmony_ci                            scale_m = scale_matrix[pos];
1469cabdff1aSopenharmony_ci                        } else {
1470cabdff1aSopenharmony_ci                            scale_m = dc_scale;
1471cabdff1aSopenharmony_ci                        }
1472cabdff1aSopenharmony_ci                    }
1473cabdff1aSopenharmony_ci                    trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1474cabdff1aSopenharmony_ci                    if(trans_coeff_level < 0) {
1475cabdff1aSopenharmony_ci                        if((~trans_coeff_level) & 0xFffffffffff8000)
1476cabdff1aSopenharmony_ci                            trans_coeff_level = -32768;
1477cabdff1aSopenharmony_ci                    } else {
1478cabdff1aSopenharmony_ci                        if(trans_coeff_level & 0xffffffffffff8000)
1479cabdff1aSopenharmony_ci                            trans_coeff_level = 32767;
1480cabdff1aSopenharmony_ci                    }
1481cabdff1aSopenharmony_ci                }
1482cabdff1aSopenharmony_ci                coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1483cabdff1aSopenharmony_ci            }
1484cabdff1aSopenharmony_ci        }
1485cabdff1aSopenharmony_ci    }
1486cabdff1aSopenharmony_ci
1487cabdff1aSopenharmony_ci    if (lc->cu.cu_transquant_bypass_flag) {
1488cabdff1aSopenharmony_ci        if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag &&
1489cabdff1aSopenharmony_ci                                    (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1490cabdff1aSopenharmony_ci            int mode = s->ps.sps->implicit_rdpcm_enabled_flag ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1491cabdff1aSopenharmony_ci
1492cabdff1aSopenharmony_ci            s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1493cabdff1aSopenharmony_ci        }
1494cabdff1aSopenharmony_ci    } else {
1495cabdff1aSopenharmony_ci        if (transform_skip_flag) {
1496cabdff1aSopenharmony_ci            int rot = s->ps.sps->transform_skip_rotation_enabled_flag &&
1497cabdff1aSopenharmony_ci                      log2_trafo_size == 2 &&
1498cabdff1aSopenharmony_ci                      lc->cu.pred_mode == MODE_INTRA;
1499cabdff1aSopenharmony_ci            if (rot) {
1500cabdff1aSopenharmony_ci                for (i = 0; i < 8; i++)
1501cabdff1aSopenharmony_ci                    FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1502cabdff1aSopenharmony_ci            }
1503cabdff1aSopenharmony_ci
1504cabdff1aSopenharmony_ci            s->hevcdsp.dequant(coeffs, log2_trafo_size);
1505cabdff1aSopenharmony_ci
1506cabdff1aSopenharmony_ci            if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag &&
1507cabdff1aSopenharmony_ci                                        lc->cu.pred_mode == MODE_INTRA &&
1508cabdff1aSopenharmony_ci                                        (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1509cabdff1aSopenharmony_ci                int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1510cabdff1aSopenharmony_ci
1511cabdff1aSopenharmony_ci                s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1512cabdff1aSopenharmony_ci            }
1513cabdff1aSopenharmony_ci        } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1514cabdff1aSopenharmony_ci            s->hevcdsp.transform_4x4_luma(coeffs);
1515cabdff1aSopenharmony_ci        } else {
1516cabdff1aSopenharmony_ci            int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1517cabdff1aSopenharmony_ci            if (max_xy == 0)
1518cabdff1aSopenharmony_ci                s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1519cabdff1aSopenharmony_ci            else {
1520cabdff1aSopenharmony_ci                int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1521cabdff1aSopenharmony_ci                if (max_xy < 4)
1522cabdff1aSopenharmony_ci                    col_limit = FFMIN(4, col_limit);
1523cabdff1aSopenharmony_ci                else if (max_xy < 8)
1524cabdff1aSopenharmony_ci                    col_limit = FFMIN(8, col_limit);
1525cabdff1aSopenharmony_ci                else if (max_xy < 12)
1526cabdff1aSopenharmony_ci                    col_limit = FFMIN(24, col_limit);
1527cabdff1aSopenharmony_ci                s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1528cabdff1aSopenharmony_ci            }
1529cabdff1aSopenharmony_ci        }
1530cabdff1aSopenharmony_ci    }
1531cabdff1aSopenharmony_ci    if (lc->tu.cross_pf) {
1532cabdff1aSopenharmony_ci        int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1533cabdff1aSopenharmony_ci
1534cabdff1aSopenharmony_ci        for (i = 0; i < (trafo_size * trafo_size); i++) {
1535cabdff1aSopenharmony_ci            coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1536cabdff1aSopenharmony_ci        }
1537cabdff1aSopenharmony_ci    }
1538cabdff1aSopenharmony_ci    s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1539cabdff1aSopenharmony_ci}
1540cabdff1aSopenharmony_ci
1541cabdff1aSopenharmony_civoid ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1542cabdff1aSopenharmony_ci{
1543cabdff1aSopenharmony_ci    HEVCLocalContext *lc = s->HEVClc;
1544cabdff1aSopenharmony_ci    int x = abs_mvd_greater0_flag_decode(s);
1545cabdff1aSopenharmony_ci    int y = abs_mvd_greater0_flag_decode(s);
1546cabdff1aSopenharmony_ci
1547cabdff1aSopenharmony_ci    if (x)
1548cabdff1aSopenharmony_ci        x += abs_mvd_greater1_flag_decode(s);
1549cabdff1aSopenharmony_ci    if (y)
1550cabdff1aSopenharmony_ci        y += abs_mvd_greater1_flag_decode(s);
1551cabdff1aSopenharmony_ci
1552cabdff1aSopenharmony_ci    switch (x) {
1553cabdff1aSopenharmony_ci    case 2: lc->pu.mvd.x = mvd_decode(s);           break;
1554cabdff1aSopenharmony_ci    case 1: lc->pu.mvd.x = mvd_sign_flag_decode(s); break;
1555cabdff1aSopenharmony_ci    case 0: lc->pu.mvd.x = 0;                       break;
1556cabdff1aSopenharmony_ci    }
1557cabdff1aSopenharmony_ci
1558cabdff1aSopenharmony_ci    switch (y) {
1559cabdff1aSopenharmony_ci    case 2: lc->pu.mvd.y = mvd_decode(s);           break;
1560cabdff1aSopenharmony_ci    case 1: lc->pu.mvd.y = mvd_sign_flag_decode(s); break;
1561cabdff1aSopenharmony_ci    case 0: lc->pu.mvd.y = 0;                       break;
1562cabdff1aSopenharmony_ci    }
1563cabdff1aSopenharmony_ci}
1564cabdff1aSopenharmony_ci
1565