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;