32 #define CABAC_MAX_BIN 31
35 #define CABAC_ELEMS(ELEM) \
36 ELEM(SAO_MERGE_FLAG, 1) \
37 ELEM(SAO_TYPE_IDX, 1) \
38 ELEM(SAO_EO_CLASS, 0) \
39 ELEM(SAO_BAND_POSITION, 0) \
40 ELEM(SAO_OFFSET_ABS, 0) \
41 ELEM(SAO_OFFSET_SIGN, 0) \
42 ELEM(END_OF_SLICE_FLAG, 0) \
43 ELEM(SPLIT_CODING_UNIT_FLAG, 3) \
44 ELEM(CU_TRANSQUANT_BYPASS_FLAG, 1) \
46 ELEM(CU_QP_DELTA, 3) \
47 ELEM(PRED_MODE_FLAG, 1) \
50 ELEM(PREV_INTRA_LUMA_PRED_FLAG, 1) \
52 ELEM(REM_INTRA_LUMA_PRED_MODE, 0) \
53 ELEM(INTRA_CHROMA_PRED_MODE, 2) \
56 ELEM(INTER_PRED_IDC, 5) \
59 ELEM(ABS_MVD_GREATER0_FLAG, 2) \
60 ELEM(ABS_MVD_GREATER1_FLAG, 2) \
61 ELEM(ABS_MVD_MINUS2, 0) \
62 ELEM(MVD_SIGN_FLAG, 0) \
63 ELEM(MVP_LX_FLAG, 1) \
64 ELEM(NO_RESIDUAL_DATA_FLAG, 1) \
65 ELEM(SPLIT_TRANSFORM_FLAG, 3) \
68 ELEM(TRANSFORM_SKIP_FLAG, 2) \
69 ELEM(EXPLICIT_RDPCM_FLAG, 2) \
70 ELEM(EXPLICIT_RDPCM_DIR_FLAG, 2) \
71 ELEM(LAST_SIGNIFICANT_COEFF_X_PREFIX, 18) \
72 ELEM(LAST_SIGNIFICANT_COEFF_Y_PREFIX, 18) \
73 ELEM(LAST_SIGNIFICANT_COEFF_X_SUFFIX, 0) \
74 ELEM(LAST_SIGNIFICANT_COEFF_Y_SUFFIX, 0) \
75 ELEM(SIGNIFICANT_COEFF_GROUP_FLAG, 4) \
76 ELEM(SIGNIFICANT_COEFF_FLAG, 44) \
77 ELEM(COEFF_ABS_LEVEL_GREATER1_FLAG, 24) \
78 ELEM(COEFF_ABS_LEVEL_GREATER2_FLAG, 6) \
79 ELEM(COEFF_ABS_LEVEL_REMAINING, 0) \
80 ELEM(COEFF_SIGN_FLAG, 0) \
81 ELEM(LOG2_RES_SCALE_ABS, 8) \
82 ELEM(RES_SCALE_SIGN_FLAG, 2) \
83 ELEM(CU_CHROMA_QP_OFFSET_FLAG, 1) \
84 ELEM(CU_CHROMA_QP_OFFSET_IDX, 1) \
90 #define OFFSET(NAME, NUM_BINS) \
92 NAME ## _END = NAME ## _OFFSET + NUM_BINS - 1,
144 94, 138, 182, 154, 154,
152 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
155 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
160 111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153,
161 125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
162 139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
165 140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107,
166 122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
168 138, 153, 136, 167, 152, 152,
170 154, 154, 154, 154, 154, 154, 154, 154,
221 149, 107, 167, 154, 154,
229 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
232 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
237 155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153,
238 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
239 153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
242 154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
243 136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
245 107, 167, 91, 122, 107, 167,
247 154, 154, 154, 154, 154, 154, 154, 154,
298 149, 92, 167, 154, 154,
306 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
309 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
314 170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153,
315 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
316 153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
319 154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
320 136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
322 107, 167, 91, 107, 107, 167,
324 154, 154, 154, 154, 154, 154, 154, 154,
361 { 0, 1, 2, 3, 16, 17, 18, 19, },
362 { 4, 5, 6, 7, 20, 21, 22, 23, },
363 { 8, 9, 10, 11, 24, 25, 26, 27, },
364 { 12, 13, 14, 15, 28, 29, 30, 31, },
365 { 32, 33, 34, 35, 48, 49, 50, 51, },
366 { 36, 37, 38, 39, 52, 53, 54, 55, },
367 { 40, 41, 42, 43, 56, 57, 58, 59, },
368 { 44, 45, 46, 47, 60, 61, 62, 63, },
392 { 0, 2, 5, 9, 14, 20, 27, 35, },
393 { 1, 4, 8, 13, 19, 26, 34, 42, },
394 { 3, 7, 12, 18, 25, 33, 41, 48, },
395 { 6, 11, 17, 24, 32, 40, 47, 53, },
396 { 10, 16, 23, 31, 39, 46, 52, 57, },
397 { 15, 22, 30, 38, 45, 51, 56, 60, },
398 { 21, 29, 37, 44, 50, 55, 59, 62, },
399 { 28, 36, 43, 49, 54, 58, 61, 63, },
406 if (
pps->entropy_coding_sync_enabled_flag &&
407 (ctb_addr_ts %
sps->ctb_width == 2 ||
408 (
sps->ctb_width == 2 &&
409 ctb_addr_ts %
sps->ctb_width == 0))) {
411 if (
sps->persistent_rice_adaptation_enabled) {
420 if (
sps->persistent_rice_adaptation_enabled) {
432 int init_type = 2 -
s->sh.slice_type;
440 int m = (init_value >> 4) * 5 - 45;
441 int n = ((init_value & 15) << 3) - 16;
442 int pre = 2 * (((m *
av_clip(
s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
446 pre = 124 + (pre & 1);
450 for (
i = 0;
i < 4;
i++)
455 int ctb_addr_ts,
const uint8_t *
data,
size_t size,
461 if (ctb_addr_ts ==
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs]) {
465 if (
s->sh.dependent_slice_segment_flag == 0 ||
466 (
pps->tiles_enabled_flag &&
467 pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]))
470 if (!
s->sh.first_slice_in_pic_flag &&
471 pps->entropy_coding_sync_enabled_flag) {
472 if (ctb_addr_ts %
sps->ctb_width == 0) {
473 if (
sps->ctb_width == 1)
475 else if (
s->sh.dependent_slice_segment_flag == 1)
480 if (
pps->tiles_enabled_flag &&
481 pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]) {
492 if (
pps->entropy_coding_sync_enabled_flag) {
493 if (ctb_addr_ts %
sps->ctb_width == 0) {
504 if (
sps->ctb_width == 1)
514 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
536 for (
i = 0;
i < 4;
i++)
570 return GET_CABAC(CU_TRANSQUANT_BYPASS_FLAG_OFFSET);
574 int x0,
int y0,
int x_cb,
int y_cb,
int min_cb_width)
592 while (prefix_val < 5 &&
GET_CABAC(CU_QP_DELTA_OFFSET +
inc)) {
596 if (prefix_val >= 5) {
599 suffix_val += 1 << k;
610 return prefix_val + suffix_val;
620 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG_OFFSET);
625 int c_max=
FFMAX(5, chroma_qp_offset_list_len_minus1);
628 while (
i < c_max &&
GET_CABAC(CU_CHROMA_QP_OFFSET_IDX_OFFSET))
641 int ct_depth,
int x0,
int y0)
643 int inc = 0, depth_left = 0, depth_top = 0;
646 int x_cb = x0 >>
sps->log2_min_cb_size;
647 int y_cb = y0 >>
sps->log2_min_cb_size;
650 depth_left = tab_ct_depth[(y_cb) *
sps->min_cb_width + x_cb - 1];
652 depth_top = tab_ct_depth[(y_cb - 1) *
sps->min_cb_width + x_cb];
654 inc += (depth_left > ct_depth);
655 inc += (depth_top > ct_depth);
664 if (log2_cb_size ==
sps->log2_min_cb_size) {
669 if (log2_cb_size == 3)
676 if (!
sps->amp_enabled) {
704 return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
720 for (
i = 0;
i < 4;
i++)
728 if (!
GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
754 if (nPbW + nPbH == 12)
755 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
759 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
765 int max = num_ref_idx_lx - 1;
768 while (
i < max_ctx &&
GET_CABAC(REF_IDX_L0_OFFSET +
i))
785 return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET);
790 return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET);
795 return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1);
823 return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
828 return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
833 return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
838 return GET_CABAC(TRANSFORM_SKIP_FLAG_OFFSET + !!c_idx);
843 return GET_CABAC(EXPLICIT_RDPCM_FLAG_OFFSET + !!c_idx);
848 return GET_CABAC(EXPLICIT_RDPCM_DIR_FLAG_OFFSET + !!c_idx);
855 while (
i < 4 &&
GET_CABAC(LOG2_RES_SCALE_ABS_OFFSET + 4 * idx +
i))
863 return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx);
867 int log2_size,
int *last_scx_prefix,
int *last_scy_prefix)
870 int max = (log2_size << 1) - 1;
871 int ctx_offset, ctx_shift;
874 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
875 ctx_shift = (log2_size + 1) >> 2;
878 ctx_shift = log2_size - 2;
881 GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (
i >> ctx_shift) + ctx_offset))
883 *last_scx_prefix =
i;
887 GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (
i >> ctx_shift) + ctx_offset))
889 *last_scy_prefix =
i;
893 int last_significant_coeff_prefix)
896 int length = (last_significant_coeff_prefix >> 1) - 1;
899 for (
i = 1;
i < length;
i++)
908 inc =
FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
910 return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET +
inc);
913 int offset,
const uint8_t *ctx_idx_map)
930 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET +
inc);
938 return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET +
inc);
946 const uint8_t *bytestream =
c->bytestream;
949 x = (uint64_t)
c->low << n;
951 int fill = (bytestream[0] << 9) + (bytestream[1] << 1) -
CABAC_MASK;
953 x = (uint64_t)((((
int64_t)
c->low << avail) + fill)) << (n - avail);
954 #if !UNCHECKED_BITSTREAM_READER
955 if (bytestream < c->bytestream_end)
962 c->bytestream = bytestream;
967 for (
int i = 0;
i < n;
i++)
982 uint64_t x = (uint64_t)
c->low << n;
985 if (n < 1 || x >=
r << n) {
993 t = ~q & ((1 << n) - 1);
998 c->low = (x >> k) - ((uint64_t)(q >> k) *
r);
1001 c->low = x - (uint64_t)q *
r;
1011 int last_coeff_abs_level_remaining;
1017 if (rc_rice_param > 2)
1020 for (
i = 0;
i < rc_rice_param;
i++)
1022 last_coeff_abs_level_remaining = (
prefix << rc_rice_param) + suffix;
1024 int prefix_minus3 =
prefix - 3;
1032 k = prefix_minus3 + rc_rice_param;
1039 for (
i = 0;
i < k;
i++)
1042 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1043 << rc_rice_param) + suffix;
1045 return last_coeff_abs_level_remaining;
1056 for (
i = 0;
i < nb;
i++)
1063 int log2_trafo_size,
enum ScanType scan_idx,
1066 #define GET_COORD(offset, n) \
1068 x_c = (x_cg << 2) + scan_x_off[n]; \
1069 y_c = (y_cg << 2) + scan_y_off[n]; \
1073 int transform_skip_flag = 0;
1075 int last_significant_coeff_x, last_significant_coeff_y;
1079 int greater1_ctx = 1;
1081 int num_last_subset;
1082 int max_xy, col_limit, clear_rows;
1083 int x_cg_last_sig, y_cg_last_sig;
1085 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1087 ptrdiff_t
stride =
s->cur_frame->f->linesize[c_idx];
1088 int hshift =
sps->hshift[c_idx];
1089 int vshift =
sps->vshift[c_idx];
1090 uint8_t *
dst = &
s->cur_frame->f->data[c_idx][(y0 >> vshift) *
stride +
1091 ((x0 >> hshift) <<
sps->pixel_shift)];
1093 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1094 int explicit_rdpcm_flag = 0;
1095 int explicit_rdpcm_dir_flag;
1097 int trafo_size = 1 << log2_trafo_size;
1100 static const uint8_t
level_scale[] = { 40, 45, 51, 57, 64, 72 };
1101 const uint8_t *scale_matrix =
NULL;
1108 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1109 static const uint8_t
rem6[51 + 4 * 6 + 1] = {
1110 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1111 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1112 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1113 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1116 static const uint8_t
div6[51 + 4 * 6 + 1] = {
1117 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1118 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1119 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1120 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1122 int qp_y = lc->
qp_y;
1124 if (
pps->transform_skip_enabled_flag &&
1125 log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1130 qp = qp_y +
sps->qp_bd_offset;
1135 offset =
pps->cb_qp_offset +
s->sh.slice_cb_qp_offset +
1138 offset =
pps->cr_qp_offset +
s->sh.slice_cr_qp_offset +
1142 if (
sps->chroma_format_idc == 1) {
1148 qp = qp_c[qp_i - 30];
1156 qp +=
sps->qp_bd_offset;
1159 shift =
sps->bit_depth + log2_trafo_size - 5;
1160 add = 1 << (
shift-1);
1165 if (
sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1167 &
pps->scaling_list : &
sps->scaling_list;
1170 matrix_id = 3 * matrix_id + c_idx;
1172 scale_matrix = sl->
sl[log2_trafo_size - 2][matrix_id];
1173 if (log2_trafo_size >= 4)
1174 dc_scale = sl->
sl_dc[log2_trafo_size - 4][matrix_id];
1186 if (explicit_rdpcm_flag) {
1192 &last_significant_coeff_x, &last_significant_coeff_y);
1194 if (last_significant_coeff_x > 3) {
1196 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1197 (2 + (last_significant_coeff_x & 1)) +
1201 if (last_significant_coeff_y > 3) {
1203 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1204 (2 + (last_significant_coeff_y & 1)) +
1209 FFSWAP(
int, last_significant_coeff_x, last_significant_coeff_y);
1211 x_cg_last_sig = last_significant_coeff_x >> 2;
1212 y_cg_last_sig = last_significant_coeff_y >> 2;
1216 int last_x_c = last_significant_coeff_x & 3;
1217 int last_y_c = last_significant_coeff_y & 3;
1222 if (trafo_size == 4) {
1225 }
else if (trafo_size == 8) {
1229 }
else if (trafo_size == 16) {
1245 num_coeff =
horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1252 num_coeff =
horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1256 num_last_subset = (num_coeff - 1) >> 4;
1258 max_xy =
FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1259 col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1261 col_limit =
FFMIN(4, col_limit);
1262 else if (max_xy < 8)
1263 col_limit =
FFMIN(8, col_limit);
1264 else if (max_xy < 12)
1265 col_limit =
FFMIN(24, col_limit);
1268 clear_rows = trafo_size;
1275 memset(coeffs, 0, clear_rows * trafo_size *
sizeof(int16_t));
1277 for (
i = num_last_subset;
i >= 0;
i--) {
1279 int x_cg, y_cg, x_c, y_c,
pos;
1280 int implicit_non_zero_coeff = 0;
1286 uint8_t significant_coeff_flag_idx[16];
1287 uint8_t nb_significant_coeff_flag = 0;
1289 x_cg = scan_x_cg[
i];
1290 y_cg = scan_y_cg[
i];
1292 if ((
i < num_last_subset) && (
i > 0)) {
1294 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1295 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1296 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1297 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1299 significant_coeff_group_flag[x_cg][y_cg] =
1301 implicit_non_zero_coeff = 1;
1303 significant_coeff_group_flag[x_cg][y_cg] =
1304 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1305 (x_cg == 0 && y_cg == 0));
1308 last_scan_pos = num_coeff -
offset - 1;
1310 if (
i == num_last_subset) {
1311 n_end = last_scan_pos - 1;
1312 significant_coeff_flag_idx[0] = last_scan_pos;
1313 nb_significant_coeff_flag = 1;
1318 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1319 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1320 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1321 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1323 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1325 static const uint8_t ctx_idx_map[3][5 * 16] = {
1327 0, 2, 1, 6, 3, 4, 7, 6, 4, 5, 7, 8, 5, 8, 8, 8,
1328 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1329 2, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
1330 2, 2, 1, 2, 1, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0,
1331 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1334 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8,
1335 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1336 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1337 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1338 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1341 0, 2, 6, 7, 1, 3, 6, 7, 4, 4, 8, 8, 5, 5, 8, 8,
1342 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1343 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1344 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1345 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1348 const uint8_t *ctx_idx_map_p;
1351 if (
sps->transform_skip_context_enabled &&
1353 ctx_idx_map_p = &ctx_idx_map[scan_idx][4 * 16];
1357 scf_offset = 14 + 27;
1362 if (log2_trafo_size == 2) {
1363 ctx_idx_map_p = &ctx_idx_map[scan_idx][0];
1365 ctx_idx_map_p = &ctx_idx_map[scan_idx][(prev_sig + 1) << 4];
1367 if ((x_cg > 0 || y_cg > 0))
1369 if (log2_trafo_size == 3) {
1370 scf_offset += (scan_idx ==
SCAN_DIAG) ? 9 : 15;
1375 if (log2_trafo_size == 3)
1383 nb0 = nb_significant_coeff_flag;
1384 for (n = n_end; n > 0; n--) {
1386 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1387 nb_significant_coeff_flag +=
sig;
1389 if (nb_significant_coeff_flag != nb0)
1390 implicit_non_zero_coeff = 0;
1391 if (implicit_non_zero_coeff == 0) {
1392 if (
sps->transform_skip_context_enabled &&
1397 scf_offset = 16 + 27;
1406 scf_offset = 2 + scf_offset;
1409 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1410 nb_significant_coeff_flag +=
1413 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1414 nb_significant_coeff_flag++;
1418 n_end = nb_significant_coeff_flag;
1422 int first_nz_pos_in_cg;
1423 int last_nz_pos_in_cg;
1424 int c_rice_param = 0;
1425 int first_greater1_coeff_idx = -1;
1426 uint8_t coeff_abs_level_greater1_flag[8];
1427 uint16_t coeff_sign_flag;
1435 int ctx_set = (
i > 0 && c_idx == 0) ? 2 : 0;
1437 if (
sps->persistent_rice_adaptation_enabled) {
1439 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1441 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1445 if (!(
i == num_last_subset) && greater1_ctx == 0)
1448 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1451 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1452 int inc = (ctx_set << 2) + greater1_ctx;
1454 coeff_abs_level_greater1_flag[m] =
flag;
1455 gt1_mask |=
flag << m;
1456 greater1_ctx = (greater1_ctx + (greater1_ctx - 1
U < 2)) & (
flag - 1);
1459 first_greater1_coeff_idx =
ff_ctz(gt1_mask);
1460 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1464 sps->implicit_rdpcm_enabled && transform_skip_flag &&
1465 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1466 explicit_rdpcm_flag)
1469 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1471 if (first_greater1_coeff_idx != -1) {
1474 if (!
pps->sign_data_hiding_flag || !sign_hidden ) {
1475 coeff_sign_flag =
coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1477 coeff_sign_flag =
coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1480 for (m = 0; m < n_end; m++) {
1483 n = significant_coeff_flag_idx[m];
1486 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1487 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1490 trans_coeff_level += last_coeff_abs_level_remaining;
1491 if (trans_coeff_level > (3 << c_rice_param))
1492 c_rice_param =
sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 :
FFMIN(c_rice_param + 1, 4);
1493 if (
sps->persistent_rice_adaptation_enabled && !rice_init) {
1494 int c_rice_p_init = lc->
stat_coeff[sb_type] / 4;
1495 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1497 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1506 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1507 if (trans_coeff_level > (3 << c_rice_param))
1508 c_rice_param =
sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 :
FFMIN(c_rice_param + 1, 4);
1509 if (
sps->persistent_rice_adaptation_enabled && !rice_init) {
1510 int c_rice_p_init = lc->
stat_coeff[sb_type] / 4;
1511 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1513 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1519 if (
pps->sign_data_hiding_flag && sign_hidden) {
1520 sum_abs += trans_coeff_level;
1521 if (n == first_nz_pos_in_cg && (sum_abs&1))
1522 trans_coeff_level = -trans_coeff_level;
1525 sign = -(
int64_t)(coeff_sign_flag >> 15);
1526 trans_coeff_level = (trans_coeff_level ^ sign) - sign;
1527 coeff_sign_flag <<= 1;
1529 if (
sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1530 if(y_c || x_c || log2_trafo_size < 4) {
1531 switch(log2_trafo_size) {
1532 case 3:
pos = (y_c << 3) + x_c;
break;
1533 case 4:
pos = ((y_c >> 1) << 3) + (x_c >> 1);
break;
1534 case 5:
pos = ((y_c >> 2) << 3) + (x_c >> 2);
break;
1535 default:
pos = (y_c << 2) + x_c;
break;
1537 scale_m = scale_matrix[
pos];
1543 trans_coeff_level =
FFMAX(
FFMIN(trans_coeff_level, 32767), -32768);
1545 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1551 if (explicit_rdpcm_flag || (
sps->implicit_rdpcm_enabled &&
1552 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1553 int mode =
sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1555 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size,
mode);
1558 if (transform_skip_flag) {
1559 int rot =
sps->transform_skip_rotation_enabled &&
1560 log2_trafo_size == 2 &&
1563 for (
i = 0;
i < 8;
i++)
1564 FFSWAP(int16_t, coeffs[
i], coeffs[16 -
i - 1]);
1567 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1569 if (explicit_rdpcm_flag || (
sps->implicit_rdpcm_enabled &&
1571 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1572 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1574 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size,
mode);
1577 s->hevcdsp.transform_4x4_luma(coeffs);
1580 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1582 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1588 for (
i = 0;
i < (trafo_size * trafo_size);
i++) {
1592 s->hevcdsp.add_residual[log2_trafo_size-2](
dst, coeffs,
stride);
1608 case 0: lc->
pu.
mvd.
x = 0;
break;
1614 case 0: lc->
pu.
mvd.
y = 0;
break;