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)
915 int inc = ctx_idx_map[(y_c << 2) + x_c] +
offset;
930 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET +
inc);
938 return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET +
inc);
945 int last_coeff_abs_level_remaining;
952 for (
i = 0;
i < rc_rice_param;
i++)
954 last_coeff_abs_level_remaining = (prefix << rc_rice_param) +
suffix;
956 int prefix_minus3 = prefix - 3;
958 if (prefix ==
CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
963 for (
i = 0;
i < prefix_minus3 + rc_rice_param;
i++)
965 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
966 << rc_rice_param) +
suffix;
968 return last_coeff_abs_level_remaining;
976 for (
i = 0;
i < nb;
i++)
983 int log2_trafo_size,
enum ScanType scan_idx,
986 #define GET_COORD(offset, n) \
988 x_c = (x_cg << 2) + scan_x_off[n]; \
989 y_c = (y_cg << 2) + scan_y_off[n]; \
993 int transform_skip_flag = 0;
995 int last_significant_coeff_x, last_significant_coeff_y;
999 int greater1_ctx = 1;
1001 int num_last_subset;
1002 int x_cg_last_sig, y_cg_last_sig;
1004 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1006 ptrdiff_t
stride =
s->cur_frame->f->linesize[c_idx];
1007 int hshift =
sps->hshift[c_idx];
1008 int vshift =
sps->vshift[c_idx];
1009 uint8_t *
dst = &
s->cur_frame->f->data[c_idx][(y0 >> vshift) *
stride +
1010 ((x0 >> hshift) <<
sps->pixel_shift)];
1012 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1013 int explicit_rdpcm_flag = 0;
1014 int explicit_rdpcm_dir_flag;
1016 int trafo_size = 1 << log2_trafo_size;
1019 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1020 const uint8_t *scale_matrix =
NULL;
1025 memset(coeffs, 0, trafo_size * trafo_size *
sizeof(int16_t));
1029 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1030 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1031 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1032 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1033 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1034 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1037 static const uint8_t div6[51 + 4 * 6 + 1] = {
1038 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1039 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1040 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1041 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1043 int qp_y = lc->
qp_y;
1045 if (
pps->transform_skip_enabled_flag &&
1046 log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1051 qp = qp_y +
sps->qp_bd_offset;
1056 offset =
pps->cb_qp_offset +
s->sh.slice_cb_qp_offset +
1059 offset =
pps->cr_qp_offset +
s->sh.slice_cr_qp_offset +
1063 if (
sps->chroma_format_idc == 1) {
1069 qp = qp_c[qp_i - 30];
1077 qp +=
sps->qp_bd_offset;
1080 shift =
sps->bit_depth + log2_trafo_size - 5;
1081 add = 1 << (
shift-1);
1082 scale = level_scale[rem6[qp]] << (div6[qp]);
1086 if (
sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1088 &
pps->scaling_list : &
sps->scaling_list;
1091 matrix_id = 3 * matrix_id + c_idx;
1093 scale_matrix = sl->
sl[log2_trafo_size - 2][matrix_id];
1094 if (log2_trafo_size >= 4)
1095 dc_scale = sl->
sl_dc[log2_trafo_size - 4][matrix_id];
1107 if (explicit_rdpcm_flag) {
1113 &last_significant_coeff_x, &last_significant_coeff_y);
1115 if (last_significant_coeff_x > 3) {
1117 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1118 (2 + (last_significant_coeff_x & 1)) +
1122 if (last_significant_coeff_y > 3) {
1124 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1125 (2 + (last_significant_coeff_y & 1)) +
1130 FFSWAP(
int, last_significant_coeff_x, last_significant_coeff_y);
1132 x_cg_last_sig = last_significant_coeff_x >> 2;
1133 y_cg_last_sig = last_significant_coeff_y >> 2;
1137 int last_x_c = last_significant_coeff_x & 3;
1138 int last_y_c = last_significant_coeff_y & 3;
1143 if (trafo_size == 4) {
1146 }
else if (trafo_size == 8) {
1150 }
else if (trafo_size == 16) {
1166 num_coeff =
horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1173 num_coeff =
horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1177 num_last_subset = (num_coeff - 1) >> 4;
1179 for (
i = num_last_subset;
i >= 0;
i--) {
1181 int x_cg, y_cg, x_c, y_c,
pos;
1182 int implicit_non_zero_coeff = 0;
1188 uint8_t significant_coeff_flag_idx[16];
1189 uint8_t nb_significant_coeff_flag = 0;
1191 x_cg = scan_x_cg[
i];
1192 y_cg = scan_y_cg[
i];
1194 if ((
i < num_last_subset) && (
i > 0)) {
1196 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1197 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1198 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1199 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1201 significant_coeff_group_flag[x_cg][y_cg] =
1203 implicit_non_zero_coeff = 1;
1205 significant_coeff_group_flag[x_cg][y_cg] =
1206 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1207 (x_cg == 0 && y_cg == 0));
1210 last_scan_pos = num_coeff -
offset - 1;
1212 if (
i == num_last_subset) {
1213 n_end = last_scan_pos - 1;
1214 significant_coeff_flag_idx[0] = last_scan_pos;
1215 nb_significant_coeff_flag = 1;
1220 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1221 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1222 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1223 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1225 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1226 static const uint8_t ctx_idx_map[] = {
1227 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8,
1228 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1229 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1230 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1231 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
1233 const uint8_t *ctx_idx_map_p;
1235 if (
sps->transform_skip_context_enabled &&
1237 ctx_idx_map_p = &ctx_idx_map[4 * 16];
1241 scf_offset = 14 + 27;
1246 if (log2_trafo_size == 2) {
1247 ctx_idx_map_p = &ctx_idx_map[0];
1249 ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4];
1251 if ((x_cg > 0 || y_cg > 0))
1253 if (log2_trafo_size == 3) {
1254 scf_offset += (scan_idx ==
SCAN_DIAG) ? 9 : 15;
1259 if (log2_trafo_size == 3)
1266 for (n = n_end; n > 0; n--) {
1267 x_c = scan_x_off[n];
1268 y_c = scan_y_off[n];
1270 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1271 nb_significant_coeff_flag++;
1272 implicit_non_zero_coeff = 0;
1275 if (implicit_non_zero_coeff == 0) {
1276 if (
sps->transform_skip_context_enabled &&
1281 scf_offset = 16 + 27;
1290 scf_offset = 2 + scf_offset;
1294 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1295 nb_significant_coeff_flag++;
1298 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1299 nb_significant_coeff_flag++;
1303 n_end = nb_significant_coeff_flag;
1307 int first_nz_pos_in_cg;
1308 int last_nz_pos_in_cg;
1309 int c_rice_param = 0;
1310 int first_greater1_coeff_idx = -1;
1311 uint8_t coeff_abs_level_greater1_flag[8];
1312 uint16_t coeff_sign_flag;
1319 int ctx_set = (
i > 0 && c_idx == 0) ? 2 : 0;
1321 if (
sps->persistent_rice_adaptation_enabled) {
1323 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1325 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1329 if (!(
i == num_last_subset) && greater1_ctx == 0)
1332 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1334 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1335 int inc = (ctx_set << 2) + greater1_ctx;
1336 coeff_abs_level_greater1_flag[m] =
1338 if (coeff_abs_level_greater1_flag[m]) {
1340 if (first_greater1_coeff_idx == -1)
1341 first_greater1_coeff_idx = m;
1342 }
else if (greater1_ctx > 0 && greater1_ctx < 3) {
1346 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1350 sps->implicit_rdpcm_enabled && transform_skip_flag &&
1351 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1352 explicit_rdpcm_flag)
1355 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1357 if (first_greater1_coeff_idx != -1) {
1360 if (!
pps->sign_data_hiding_flag || !sign_hidden ) {
1361 coeff_sign_flag =
coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1363 coeff_sign_flag =
coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1366 for (m = 0; m < n_end; m++) {
1367 n = significant_coeff_flag_idx[m];
1370 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1371 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1374 trans_coeff_level += last_coeff_abs_level_remaining;
1375 if (trans_coeff_level > (3 << c_rice_param))
1376 c_rice_param =
sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 :
FFMIN(c_rice_param + 1, 4);
1377 if (
sps->persistent_rice_adaptation_enabled && !rice_init) {
1378 int c_rice_p_init = lc->
stat_coeff[sb_type] / 4;
1379 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1381 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1390 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1391 if (trans_coeff_level > (3 << c_rice_param))
1392 c_rice_param =
sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 :
FFMIN(c_rice_param + 1, 4);
1393 if (
sps->persistent_rice_adaptation_enabled && !rice_init) {
1394 int c_rice_p_init = lc->
stat_coeff[sb_type] / 4;
1395 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1397 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1403 if (
pps->sign_data_hiding_flag && sign_hidden) {
1404 sum_abs += trans_coeff_level;
1405 if (n == first_nz_pos_in_cg && (sum_abs&1))
1406 trans_coeff_level = -trans_coeff_level;
1408 if (coeff_sign_flag >> 15)
1409 trans_coeff_level = -trans_coeff_level;
1410 coeff_sign_flag <<= 1;
1412 if (
sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1413 if(y_c || x_c || log2_trafo_size < 4) {
1414 switch(log2_trafo_size) {
1415 case 3:
pos = (y_c << 3) + x_c;
break;
1416 case 4:
pos = ((y_c >> 1) << 3) + (x_c >> 1);
break;
1417 case 5:
pos = ((y_c >> 2) << 3) + (x_c >> 2);
break;
1418 default:
pos = (y_c << 2) + x_c;
break;
1420 scale_m = scale_matrix[
pos];
1426 if(trans_coeff_level < 0) {
1427 if((~trans_coeff_level) & 0xFffffffffff8000)
1428 trans_coeff_level = -32768;
1430 if(trans_coeff_level & 0xffffffffffff8000)
1431 trans_coeff_level = 32767;
1434 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1440 if (explicit_rdpcm_flag || (
sps->implicit_rdpcm_enabled &&
1441 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1442 int mode =
sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1444 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size,
mode);
1447 if (transform_skip_flag) {
1448 int rot =
sps->transform_skip_rotation_enabled &&
1449 log2_trafo_size == 2 &&
1452 for (
i = 0;
i < 8;
i++)
1453 FFSWAP(int16_t, coeffs[
i], coeffs[16 -
i - 1]);
1456 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1458 if (explicit_rdpcm_flag || (
sps->implicit_rdpcm_enabled &&
1460 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1461 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1463 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size,
mode);
1466 s->hevcdsp.transform_4x4_luma(coeffs);
1468 int max_xy =
FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1470 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1472 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1474 col_limit =
FFMIN(4, col_limit);
1475 else if (max_xy < 8)
1476 col_limit =
FFMIN(8, col_limit);
1477 else if (max_xy < 12)
1478 col_limit =
FFMIN(24, col_limit);
1479 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1486 for (
i = 0;
i < (trafo_size * trafo_size);
i++) {
1490 s->hevcdsp.add_residual[log2_trafo_size-2](
dst, coeffs,
stride);
1506 case 0: lc->
pu.
mvd.
x = 0;
break;
1512 case 0: lc->
pu.
mvd.
y = 0;
break;