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 (
s->ps.pps->entropy_coding_sync_enabled_flag &&
407 (ctb_addr_ts %
s->ps.sps->ctb_width == 2 ||
408 (
s->ps.sps->ctb_width == 2 &&
409 ctb_addr_ts %
s->ps.sps->ctb_width == 0))) {
411 if (
s->ps.sps->persistent_rice_adaptation_enabled) {
420 if (
s->ps.sps->persistent_rice_adaptation_enabled) {
442 int init_type = 2 -
s->sh.slice_type;
450 int m = (init_value >> 4) * 5 - 45;
451 int n = ((init_value & 15) << 3) - 16;
452 int pre = 2 * (((m *
av_clip(
s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
456 pre = 124 + (pre & 1);
460 for (
i = 0;
i < 4;
i++)
468 if (ctb_addr_ts ==
s->ps.pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs]) {
472 if (
s->sh.dependent_slice_segment_flag == 0 ||
473 (
s->ps.pps->tiles_enabled_flag &&
474 s->ps.pps->tile_id[ctb_addr_ts] !=
s->ps.pps->tile_id[ctb_addr_ts - 1]))
477 if (!
s->sh.first_slice_in_pic_flag &&
478 s->ps.pps->entropy_coding_sync_enabled_flag) {
479 if (ctb_addr_ts %
s->ps.sps->ctb_width == 0) {
480 if (
s->ps.sps->ctb_width == 1)
482 else if (
s->sh.dependent_slice_segment_flag == 1)
487 if (
s->ps.pps->tiles_enabled_flag &&
488 s->ps.pps->tile_id[ctb_addr_ts] !=
s->ps.pps->tile_id[ctb_addr_ts - 1]) {
490 if (
s->threads_number == 1)
499 if (
s->ps.pps->entropy_coding_sync_enabled_flag) {
500 if (ctb_addr_ts %
s->ps.sps->ctb_width == 0) {
503 if (
s->threads_number == 1)
511 if (
s->ps.sps->ctb_width == 1)
521 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
543 for (
i = 0;
i < 4;
i++)
577 return GET_CABAC(CU_TRANSQUANT_BYPASS_FLAG_OFFSET);
583 int min_cb_width =
s->ps.sps->min_cb_width;
593 return GET_CABAC(SKIP_FLAG_OFFSET + inc);
602 while (prefix_val < 5 &&
GET_CABAC(CU_QP_DELTA_OFFSET + inc)) {
606 if (prefix_val >= 5) {
609 suffix_val += 1 << k;
620 return prefix_val + suffix_val;
630 return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG_OFFSET);
638 while (
i < c_max &&
GET_CABAC(CU_CHROMA_QP_OFFSET_IDX_OFFSET))
653 int inc = 0, depth_left = 0, depth_top = 0;
656 int x_cb = x0 >>
sps->log2_min_cb_size;
657 int y_cb = y0 >>
sps->log2_min_cb_size;
660 depth_left =
s->tab_ct_depth[(y_cb) *
sps->min_cb_width + x_cb - 1];
662 depth_top =
s->tab_ct_depth[(y_cb - 1) *
sps->min_cb_width + x_cb];
664 inc += (depth_left > ct_depth);
665 inc += (depth_top > ct_depth);
667 return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc);
679 if (log2_cb_size == 3)
714 return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
730 for (
i = 0;
i < 4;
i++)
738 if (!
GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
764 if (nPbW + nPbH == 12)
765 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
769 return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
775 int max = num_ref_idx_lx - 1;
778 while (
i < max_ctx &&
GET_CABAC(REF_IDX_L0_OFFSET +
i))
795 return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET);
800 return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET);
805 return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1);
833 return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
838 return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
843 return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
848 return GET_CABAC(TRANSFORM_SKIP_FLAG_OFFSET + !!c_idx);
853 return GET_CABAC(EXPLICIT_RDPCM_FLAG_OFFSET + !!c_idx);
858 return GET_CABAC(EXPLICIT_RDPCM_DIR_FLAG_OFFSET + !!c_idx);
865 while (
i < 4 &&
GET_CABAC(LOG2_RES_SCALE_ABS_OFFSET + 4 * idx +
i))
873 return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx);
877 int log2_size,
int *last_scx_prefix,
int *last_scy_prefix)
880 int max = (log2_size << 1) - 1;
881 int ctx_offset, ctx_shift;
884 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
885 ctx_shift = (log2_size + 1) >> 2;
888 ctx_shift = log2_size - 2;
891 GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (
i >> ctx_shift) + ctx_offset))
893 *last_scx_prefix =
i;
897 GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (
i >> ctx_shift) + ctx_offset))
899 *last_scy_prefix =
i;
903 int last_significant_coeff_prefix)
906 int length = (last_significant_coeff_prefix >> 1) - 1;
909 for (
i = 1;
i < length;
i++)
918 inc =
FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
920 return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc);
923 int offset,
const uint8_t *ctx_idx_map)
925 int inc = ctx_idx_map[(y_c << 2) + x_c] +
offset;
926 return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc);
940 return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc);
948 return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET + inc);
955 int last_coeff_abs_level_remaining;
962 for (
i = 0;
i < rc_rice_param;
i++)
964 last_coeff_abs_level_remaining = (prefix << rc_rice_param) +
suffix;
966 int prefix_minus3 = prefix - 3;
968 if (prefix ==
CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
973 for (
i = 0;
i < prefix_minus3 + rc_rice_param;
i++)
975 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
976 << rc_rice_param) +
suffix;
978 return last_coeff_abs_level_remaining;
986 for (
i = 0;
i < nb;
i++)
992 int log2_trafo_size,
enum ScanType scan_idx,
995 #define GET_COORD(offset, n) \
997 x_c = (x_cg << 2) + scan_x_off[n]; \
998 y_c = (y_cg << 2) + scan_y_off[n]; \
1001 int transform_skip_flag = 0;
1003 int last_significant_coeff_x, last_significant_coeff_y;
1007 int greater1_ctx = 1;
1009 int num_last_subset;
1010 int x_cg_last_sig, y_cg_last_sig;
1012 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1014 ptrdiff_t
stride =
s->frame->linesize[c_idx];
1015 int hshift =
s->ps.sps->hshift[c_idx];
1016 int vshift =
s->ps.sps->vshift[c_idx];
1017 uint8_t *dst = &
s->frame->data[c_idx][(y0 >> vshift) *
stride +
1018 ((x0 >> hshift) <<
s->ps.sps->pixel_shift)];
1020 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1021 int explicit_rdpcm_flag = 0;
1022 int explicit_rdpcm_dir_flag;
1024 int trafo_size = 1 << log2_trafo_size;
1027 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1028 const uint8_t *scale_matrix =
NULL;
1033 memset(coeffs, 0, trafo_size * trafo_size *
sizeof(int16_t));
1037 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1038 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1039 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1040 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1041 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1042 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1045 static const uint8_t div6[51 + 4 * 6 + 1] = {
1046 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1047 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1048 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1049 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1051 int qp_y = lc->
qp_y;
1053 if (
s->ps.pps->transform_skip_enabled_flag &&
1054 log2_trafo_size <= s->ps.pps->log2_max_transform_skip_block_size) {
1059 qp = qp_y +
s->ps.sps->qp_bd_offset;
1064 offset =
s->ps.pps->cb_qp_offset +
s->sh.slice_cb_qp_offset +
1067 offset =
s->ps.pps->cr_qp_offset +
s->sh.slice_cr_qp_offset +
1071 if (
s->ps.sps->chroma_format_idc == 1) {
1077 qp = qp_c[qp_i - 30];
1085 qp +=
s->ps.sps->qp_bd_offset;
1088 shift =
s->ps.sps->bit_depth + log2_trafo_size - 5;
1089 add = 1 << (
shift-1);
1090 scale = level_scale[rem6[qp]] << (div6[qp]);
1094 if (
s->ps.sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1095 const ScalingList *sl =
s->ps.pps->scaling_list_data_present_flag ?
1096 &
s->ps.pps->scaling_list : &
s->ps.sps->scaling_list;
1099 matrix_id = 3 * matrix_id + c_idx;
1101 scale_matrix = sl->
sl[log2_trafo_size - 2][matrix_id];
1102 if (log2_trafo_size >= 4)
1103 dc_scale = sl->
sl_dc[log2_trafo_size - 4][matrix_id];
1115 if (explicit_rdpcm_flag) {
1121 &last_significant_coeff_x, &last_significant_coeff_y);
1123 if (last_significant_coeff_x > 3) {
1125 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1126 (2 + (last_significant_coeff_x & 1)) +
1130 if (last_significant_coeff_y > 3) {
1132 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1133 (2 + (last_significant_coeff_y & 1)) +
1138 FFSWAP(
int, last_significant_coeff_x, last_significant_coeff_y);
1140 x_cg_last_sig = last_significant_coeff_x >> 2;
1141 y_cg_last_sig = last_significant_coeff_y >> 2;
1145 int last_x_c = last_significant_coeff_x & 3;
1146 int last_y_c = last_significant_coeff_y & 3;
1151 if (trafo_size == 4) {
1154 }
else if (trafo_size == 8) {
1158 }
else if (trafo_size == 16) {
1174 num_coeff =
horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1181 num_coeff =
horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1185 num_last_subset = (num_coeff - 1) >> 4;
1187 for (
i = num_last_subset;
i >= 0;
i--) {
1189 int x_cg, y_cg, x_c, y_c,
pos;
1190 int implicit_non_zero_coeff = 0;
1191 int64_t trans_coeff_level;
1196 uint8_t significant_coeff_flag_idx[16];
1197 uint8_t nb_significant_coeff_flag = 0;
1199 x_cg = scan_x_cg[
i];
1200 y_cg = scan_y_cg[
i];
1202 if ((
i < num_last_subset) && (
i > 0)) {
1204 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1205 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1206 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1207 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1209 significant_coeff_group_flag[x_cg][y_cg] =
1211 implicit_non_zero_coeff = 1;
1213 significant_coeff_group_flag[x_cg][y_cg] =
1214 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1215 (x_cg == 0 && y_cg == 0));
1218 last_scan_pos = num_coeff -
offset - 1;
1220 if (
i == num_last_subset) {
1221 n_end = last_scan_pos - 1;
1222 significant_coeff_flag_idx[0] = last_scan_pos;
1223 nb_significant_coeff_flag = 1;
1228 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1229 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1230 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1231 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1233 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1234 static const uint8_t ctx_idx_map[] = {
1235 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8,
1236 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1237 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1238 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1239 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
1241 const uint8_t *ctx_idx_map_p;
1243 if (
s->ps.sps->transform_skip_context_enabled &&
1245 ctx_idx_map_p = &ctx_idx_map[4 * 16];
1249 scf_offset = 14 + 27;
1254 if (log2_trafo_size == 2) {
1255 ctx_idx_map_p = &ctx_idx_map[0];
1257 ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4];
1259 if ((x_cg > 0 || y_cg > 0))
1261 if (log2_trafo_size == 3) {
1262 scf_offset += (scan_idx ==
SCAN_DIAG) ? 9 : 15;
1267 if (log2_trafo_size == 3)
1274 for (n = n_end; n > 0; n--) {
1275 x_c = scan_x_off[n];
1276 y_c = scan_y_off[n];
1278 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1279 nb_significant_coeff_flag++;
1280 implicit_non_zero_coeff = 0;
1283 if (implicit_non_zero_coeff == 0) {
1284 if (
s->ps.sps->transform_skip_context_enabled &&
1289 scf_offset = 16 + 27;
1298 scf_offset = 2 + scf_offset;
1302 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1303 nb_significant_coeff_flag++;
1306 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1307 nb_significant_coeff_flag++;
1311 n_end = nb_significant_coeff_flag;
1315 int first_nz_pos_in_cg;
1316 int last_nz_pos_in_cg;
1317 int c_rice_param = 0;
1318 int first_greater1_coeff_idx = -1;
1319 uint8_t coeff_abs_level_greater1_flag[8];
1320 uint16_t coeff_sign_flag;
1327 int ctx_set = (
i > 0 && c_idx == 0) ? 2 : 0;
1329 if (
s->ps.sps->persistent_rice_adaptation_enabled) {
1331 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1333 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1337 if (!(
i == num_last_subset) && greater1_ctx == 0)
1340 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1342 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1343 int inc = (ctx_set << 2) + greater1_ctx;
1344 coeff_abs_level_greater1_flag[m] =
1346 if (coeff_abs_level_greater1_flag[m]) {
1348 if (first_greater1_coeff_idx == -1)
1349 first_greater1_coeff_idx = m;
1350 }
else if (greater1_ctx > 0 && greater1_ctx < 3) {
1354 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1358 s->ps.sps->implicit_rdpcm_enabled && transform_skip_flag &&
1359 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1360 explicit_rdpcm_flag)
1363 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1365 if (first_greater1_coeff_idx != -1) {
1368 if (!
s->ps.pps->sign_data_hiding_flag || !sign_hidden ) {
1369 coeff_sign_flag =
coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1371 coeff_sign_flag =
coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1374 for (m = 0; m < n_end; m++) {
1375 n = significant_coeff_flag_idx[m];
1378 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1379 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1382 trans_coeff_level += last_coeff_abs_level_remaining;
1383 if (trans_coeff_level > (3 << c_rice_param))
1384 c_rice_param =
s->ps.sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 :
FFMIN(c_rice_param + 1, 4);
1385 if (
s->ps.sps->persistent_rice_adaptation_enabled && !rice_init) {
1386 int c_rice_p_init = lc->
stat_coeff[sb_type] / 4;
1387 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1389 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1398 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1399 if (trans_coeff_level > (3 << c_rice_param))
1400 c_rice_param =
s->ps.sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 :
FFMIN(c_rice_param + 1, 4);
1401 if (
s->ps.sps->persistent_rice_adaptation_enabled && !rice_init) {
1402 int c_rice_p_init = lc->
stat_coeff[sb_type] / 4;
1403 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1405 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1411 if (
s->ps.pps->sign_data_hiding_flag && sign_hidden) {
1412 sum_abs += trans_coeff_level;
1413 if (n == first_nz_pos_in_cg && (sum_abs&1))
1414 trans_coeff_level = -trans_coeff_level;
1416 if (coeff_sign_flag >> 15)
1417 trans_coeff_level = -trans_coeff_level;
1418 coeff_sign_flag <<= 1;
1420 if (
s->ps.sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1421 if(y_c || x_c || log2_trafo_size < 4) {
1422 switch(log2_trafo_size) {
1423 case 3:
pos = (y_c << 3) + x_c;
break;
1424 case 4:
pos = ((y_c >> 1) << 3) + (x_c >> 1);
break;
1425 case 5:
pos = ((y_c >> 2) << 3) + (x_c >> 2);
break;
1426 default:
pos = (y_c << 2) + x_c;
break;
1428 scale_m = scale_matrix[
pos];
1433 trans_coeff_level = (trans_coeff_level * (int64_t)
scale * (int64_t)scale_m + add) >>
shift;
1434 if(trans_coeff_level < 0) {
1435 if((~trans_coeff_level) & 0xFffffffffff8000)
1436 trans_coeff_level = -32768;
1438 if(trans_coeff_level & 0xffffffffffff8000)
1439 trans_coeff_level = 32767;
1442 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1448 if (explicit_rdpcm_flag || (
s->ps.sps->implicit_rdpcm_enabled &&
1449 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1450 int mode =
s->ps.sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1452 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size,
mode);
1455 if (transform_skip_flag) {
1456 int rot =
s->ps.sps->transform_skip_rotation_enabled &&
1457 log2_trafo_size == 2 &&
1460 for (
i = 0;
i < 8;
i++)
1461 FFSWAP(int16_t, coeffs[
i], coeffs[16 -
i - 1]);
1464 s->hevcdsp.dequant(coeffs, log2_trafo_size);
1466 if (explicit_rdpcm_flag || (
s->ps.sps->implicit_rdpcm_enabled &&
1468 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1469 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1471 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size,
mode);
1474 s->hevcdsp.transform_4x4_luma(coeffs);
1476 int max_xy =
FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1478 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1480 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1482 col_limit =
FFMIN(4, col_limit);
1483 else if (max_xy < 8)
1484 col_limit =
FFMIN(8, col_limit);
1485 else if (max_xy < 12)
1486 col_limit =
FFMIN(24, col_limit);
1487 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1494 for (
i = 0;
i < (trafo_size * trafo_size);
i++) {
1498 s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs,
stride);
1514 case 0: lc->
pu.
mvd.
x = 0;
break;
1520 case 0: lc->
pu.
mvd.
y = 0;
break;