4 * Copyright (C) 2012 - 2013 Guillaume Martres
5 * Copyright (C) 2012 - 2013 Gildas Cocherel
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "libavutil/attributes.h"
25 #include "libavutil/common.h"
27 #include "cabac_functions.h"
30 #define CABAC_MAX_BIN 31
33 * number of bin by SyntaxElement.
35 av_unused static const int8_t num_bins_in_se[] = {
39 0, // sao_band_position
42 0, // end_of_slice_flag
43 3, // split_coding_unit_flag
44 1, // cu_transquant_bypass_flag
50 1, // prev_intra_luma_pred_mode
52 0, // rem_intra_luma_pred_mode
53 2, // intra_chroma_pred_mode
59 2, // abs_mvd_greater0_flag
60 2, // abs_mvd_greater1_flag
64 1, // no_residual_data_flag
65 3, // split_transform_flag
68 2, // transform_skip_flag[][]
69 2, // explicit_rdpcm_flag[][]
70 2, // explicit_rdpcm_dir_flag[][]
71 18, // last_significant_coeff_x_prefix
72 18, // last_significant_coeff_y_prefix
73 0, // last_significant_coeff_x_suffix
74 0, // last_significant_coeff_y_suffix
75 4, // significant_coeff_group_flag
76 44, // significant_coeff_flag
77 24, // coeff_abs_level_greater1_flag
78 6, // coeff_abs_level_greater2_flag
79 0, // coeff_abs_level_remaining
81 8, // log2_res_scale_abs
82 2, // res_scale_sign_flag
83 1, // cu_chroma_qp_offset_flag
84 1, // cu_chroma_qp_offset_idx
88 * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement.
90 static const int elem_offset[sizeof(num_bins_in_se)] = {
94 2, // sao_band_position
97 2, // end_of_slice_flag
98 2, // split_coding_unit_flag
99 5, // cu_transquant_bypass_flag
105 17, // prev_intra_luma_pred_mode
107 18, // rem_intra_luma_pred_mode
108 18, // intra_chroma_pred_mode
111 22, // inter_pred_idc
114 31, // abs_mvd_greater0_flag
115 33, // abs_mvd_greater1_flag
116 35, // abs_mvd_minus2
119 36, // no_residual_data_flag
120 37, // split_transform_flag
122 42, // cbf_cb, cbf_cr
123 46, // transform_skip_flag[][]
124 48, // explicit_rdpcm_flag[][]
125 50, // explicit_rdpcm_dir_flag[][]
126 52, // last_significant_coeff_x_prefix
127 70, // last_significant_coeff_y_prefix
128 88, // last_significant_coeff_x_suffix
129 88, // last_significant_coeff_y_suffix
130 88, // significant_coeff_group_flag
131 92, // significant_coeff_flag
132 136, // coeff_abs_level_greater1_flag
133 160, // coeff_abs_level_greater2_flag
134 166, // coeff_abs_level_remaining
135 166, // coeff_sign_flag
136 166, // log2_res_scale_abs
137 174, // res_scale_sign_flag
138 176, // cu_chroma_qp_offset_flag
139 177, // cu_chroma_qp_offset_idx
144 * Indexed by init_type
146 static const uint8_t init_values[3][HEVC_CONTEXTS] = {
151 // split_coding_unit_flag
153 // cu_transquant_bypass_flag
163 // prev_intra_luma_pred_mode
165 // intra_chroma_pred_mode
172 CNU, CNU, CNU, CNU, CNU,
177 // abs_mvd_greater1_flag
179 // abs_mvd_greater1_flag
183 // no_residual_data_flag
185 // split_transform_flag
191 // transform_skip_flag
193 // explicit_rdpcm_flag
195 // explicit_rdpcm_dir_flag
197 // last_significant_coeff_x_prefix
198 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
200 // last_significant_coeff_y_prefix
201 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
203 // significant_coeff_group_flag
205 // significant_coeff_flag
206 111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153,
207 125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
208 139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
210 // coeff_abs_level_greater1_flag
211 140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107,
212 122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
213 // coeff_abs_level_greater2_flag
214 138, 153, 136, 167, 152, 152,
215 // log2_res_scale_abs
216 154, 154, 154, 154, 154, 154, 154, 154,
217 // res_scale_sign_flag
219 // cu_chroma_qp_offset_flag
221 // cu_chroma_qp_offset_idx
228 // split_coding_unit_flag
230 // cu_transquant_bypass_flag
240 // prev_intra_luma_pred_mode
242 // intra_chroma_pred_mode
254 // abs_mvd_greater1_flag
256 // abs_mvd_greater1_flag
260 // no_residual_data_flag
262 // split_transform_flag
268 // transform_skip_flag
270 // explicit_rdpcm_flag
272 // explicit_rdpcm_dir_flag
274 // last_significant_coeff_x_prefix
275 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
277 // last_significant_coeff_y_prefix
278 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
280 // significant_coeff_group_flag
282 // significant_coeff_flag
283 155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153,
284 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
285 153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
287 // coeff_abs_level_greater1_flag
288 154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
289 136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
290 // coeff_abs_level_greater2_flag
291 107, 167, 91, 122, 107, 167,
292 // log2_res_scale_abs
293 154, 154, 154, 154, 154, 154, 154, 154,
294 // res_scale_sign_flag
296 // cu_chroma_qp_offset_flag
298 // cu_chroma_qp_offset_idx
305 // split_coding_unit_flag
307 // cu_transquant_bypass_flag
317 // prev_intra_luma_pred_mode
319 // intra_chroma_pred_mode
331 // abs_mvd_greater1_flag
333 // abs_mvd_greater1_flag
337 // no_residual_data_flag
339 // split_transform_flag
345 // transform_skip_flag
347 // explicit_rdpcm_flag
349 // explicit_rdpcm_dir_flag
351 // last_significant_coeff_x_prefix
352 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
354 // last_significant_coeff_y_prefix
355 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
357 // significant_coeff_group_flag
359 // significant_coeff_flag
360 170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153,
361 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
362 153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
364 // coeff_abs_level_greater1_flag
365 154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
366 136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
367 // coeff_abs_level_greater2_flag
368 107, 167, 91, 107, 107, 167,
369 // log2_res_scale_abs
370 154, 154, 154, 154, 154, 154, 154, 154,
371 // res_scale_sign_flag
373 // cu_chroma_qp_offset_flag
375 // cu_chroma_qp_offset_idx
380 static const uint8_t scan_1x1[1] = {
384 static const uint8_t horiz_scan2x2_x[4] = {
388 static const uint8_t horiz_scan2x2_y[4] = {
392 static const uint8_t horiz_scan4x4_x[16] = {
399 static const uint8_t horiz_scan4x4_y[16] = {
406 static const uint8_t horiz_scan8x8_inv[8][8] = {
407 { 0, 1, 2, 3, 16, 17, 18, 19, },
408 { 4, 5, 6, 7, 20, 21, 22, 23, },
409 { 8, 9, 10, 11, 24, 25, 26, 27, },
410 { 12, 13, 14, 15, 28, 29, 30, 31, },
411 { 32, 33, 34, 35, 48, 49, 50, 51, },
412 { 36, 37, 38, 39, 52, 53, 54, 55, },
413 { 40, 41, 42, 43, 56, 57, 58, 59, },
414 { 44, 45, 46, 47, 60, 61, 62, 63, },
417 static const uint8_t diag_scan2x2_x[4] = {
421 static const uint8_t diag_scan2x2_y[4] = {
425 static const uint8_t diag_scan2x2_inv[2][2] = {
430 const uint8_t ff_hevc_diag_scan4x4_x[16] = {
437 const uint8_t ff_hevc_diag_scan4x4_y[16] = {
444 static const uint8_t diag_scan4x4_inv[4][4] = {
451 const uint8_t ff_hevc_diag_scan8x8_x[64] = {
470 const uint8_t ff_hevc_diag_scan8x8_y[64] = {
489 static const uint8_t diag_scan8x8_inv[8][8] = {
490 { 0, 2, 5, 9, 14, 20, 27, 35, },
491 { 1, 4, 8, 13, 19, 26, 34, 42, },
492 { 3, 7, 12, 18, 25, 33, 41, 48, },
493 { 6, 11, 17, 24, 32, 40, 47, 53, },
494 { 10, 16, 23, 31, 39, 46, 52, 57, },
495 { 15, 22, 30, 38, 45, 51, 56, 60, },
496 { 21, 29, 37, 44, 50, 55, 59, 62, },
497 { 28, 36, 43, 49, 54, 58, 61, 63, },
500 void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts)
502 if (s->pps->entropy_coding_sync_enabled_flag &&
503 (ctb_addr_ts % s->sps->ctb_width == 2 ||
504 (s->sps->ctb_width == 2 &&
505 ctb_addr_ts % s->sps->ctb_width == 0))) {
506 memcpy(s->cabac_state, s->HEVClc->cabac_state, HEVC_CONTEXTS);
510 static void load_states(HEVCContext *s)
512 memcpy(s->HEVClc->cabac_state, s->cabac_state, HEVC_CONTEXTS);
515 static void cabac_reinit(HEVCLocalContext *lc)
517 skip_bytes(&lc->cc, 0);
520 static void cabac_init_decoder(HEVCContext *s)
522 GetBitContext *gb = &s->HEVClc->gb;
525 ff_init_cabac_decoder(&s->HEVClc->cc,
526 gb->buffer + get_bits_count(gb) / 8,
527 (get_bits_left(gb) + 7) / 8);
530 static void cabac_init_state(HEVCContext *s)
532 int init_type = 2 - s->sh.slice_type;
535 if (s->sh.cabac_init_flag && s->sh.slice_type != I_SLICE)
538 for (i = 0; i < HEVC_CONTEXTS; i++) {
539 int init_value = init_values[init_type][i];
540 int m = (init_value >> 4) * 5 - 45;
541 int n = ((init_value & 15) << 3) - 16;
542 int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
546 pre = 124 + (pre & 1);
547 s->HEVClc->cabac_state[i] = pre;
550 for (i = 0; i < 4; i++)
551 s->HEVClc->stat_coeff[i] = 0;
554 void ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts)
556 if (ctb_addr_ts == s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
557 cabac_init_decoder(s);
558 if (s->sh.dependent_slice_segment_flag == 0 ||
559 (s->pps->tiles_enabled_flag &&
560 s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]))
563 if (!s->sh.first_slice_in_pic_flag &&
564 s->pps->entropy_coding_sync_enabled_flag) {
565 if (ctb_addr_ts % s->sps->ctb_width == 0) {
566 if (s->sps->ctb_width == 1)
568 else if (s->sh.dependent_slice_segment_flag == 1)
573 if (s->pps->tiles_enabled_flag &&
574 s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
575 if (s->threads_number == 1)
576 cabac_reinit(s->HEVClc);
578 cabac_init_decoder(s);
581 if (s->pps->entropy_coding_sync_enabled_flag) {
582 if (ctb_addr_ts % s->sps->ctb_width == 0) {
583 get_cabac_terminate(&s->HEVClc->cc);
584 if (s->threads_number == 1)
585 cabac_reinit(s->HEVClc);
587 cabac_init_decoder(s);
589 if (s->sps->ctb_width == 1)
598 #define GET_CABAC(ctx) get_cabac(&s->HEVClc->cc, &s->HEVClc->cabac_state[ctx])
600 int ff_hevc_sao_merge_flag_decode(HEVCContext *s)
602 return GET_CABAC(elem_offset[SAO_MERGE_FLAG]);
605 int ff_hevc_sao_type_idx_decode(HEVCContext *s)
607 if (!GET_CABAC(elem_offset[SAO_TYPE_IDX]))
610 if (!get_cabac_bypass(&s->HEVClc->cc))
615 int ff_hevc_sao_band_position_decode(HEVCContext *s)
618 int value = get_cabac_bypass(&s->HEVClc->cc);
620 for (i = 0; i < 4; i++)
621 value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
625 int ff_hevc_sao_offset_abs_decode(HEVCContext *s)
628 int length = (1 << (FFMIN(s->sps->bit_depth, 10) - 5)) - 1;
630 while (i < length && get_cabac_bypass(&s->HEVClc->cc))
635 int ff_hevc_sao_offset_sign_decode(HEVCContext *s)
637 return get_cabac_bypass(&s->HEVClc->cc);
640 int ff_hevc_sao_eo_class_decode(HEVCContext *s)
642 int ret = get_cabac_bypass(&s->HEVClc->cc) << 1;
643 ret |= get_cabac_bypass(&s->HEVClc->cc);
647 int ff_hevc_end_of_slice_flag_decode(HEVCContext *s)
649 return get_cabac_terminate(&s->HEVClc->cc);
652 int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
654 return GET_CABAC(elem_offset[CU_TRANSQUANT_BYPASS_FLAG]);
657 int ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb)
659 int min_cb_width = s->sps->min_cb_width;
661 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
662 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
664 if (s->HEVClc->ctb_left_flag || x0b)
665 inc = !!SAMPLE_CTB(s->skip_flag, x_cb - 1, y_cb);
666 if (s->HEVClc->ctb_up_flag || y0b)
667 inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1);
669 return GET_CABAC(elem_offset[SKIP_FLAG] + inc);
672 int ff_hevc_cu_qp_delta_abs(HEVCContext *s)
678 while (prefix_val < 5 && GET_CABAC(elem_offset[CU_QP_DELTA] + inc)) {
682 if (prefix_val >= 5) {
684 while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
685 suffix_val += 1 << k;
688 if (k == CABAC_MAX_BIN)
689 av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
692 suffix_val += get_cabac_bypass(&s->HEVClc->cc) << k;
694 return prefix_val + suffix_val;
697 int ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s)
699 return get_cabac_bypass(&s->HEVClc->cc);
702 int ff_hevc_cu_chroma_qp_offset_flag(HEVCContext *s)
704 return GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_FLAG]);
707 int ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s)
709 int c_max= FFMAX(5, s->pps->chroma_qp_offset_list_len_minus1);
712 while (i < c_max && GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_IDX]))
718 int ff_hevc_pred_mode_decode(HEVCContext *s)
720 return GET_CABAC(elem_offset[PRED_MODE_FLAG]);
723 int ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0)
725 int inc = 0, depth_left = 0, depth_top = 0;
726 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
727 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
728 int x_cb = x0 >> s->sps->log2_min_cb_size;
729 int y_cb = y0 >> s->sps->log2_min_cb_size;
731 if (s->HEVClc->ctb_left_flag || x0b)
732 depth_left = s->tab_ct_depth[(y_cb) * s->sps->min_cb_width + x_cb - 1];
733 if (s->HEVClc->ctb_up_flag || y0b)
734 depth_top = s->tab_ct_depth[(y_cb - 1) * s->sps->min_cb_width + x_cb];
736 inc += (depth_left > ct_depth);
737 inc += (depth_top > ct_depth);
739 return GET_CABAC(elem_offset[SPLIT_CODING_UNIT_FLAG] + inc);
742 int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
744 if (GET_CABAC(elem_offset[PART_MODE])) // 1
746 if (log2_cb_size == s->sps->log2_min_cb_size) {
747 if (s->HEVClc->cu.pred_mode == MODE_INTRA) // 0
749 if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
751 if (log2_cb_size == 3) // 00
753 if (GET_CABAC(elem_offset[PART_MODE] + 2)) // 001
755 return PART_NxN; // 000
758 if (!s->sps->amp_enabled_flag) {
759 if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
764 if (GET_CABAC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX
765 if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 011
767 if (get_cabac_bypass(&s->HEVClc->cc)) // 0101
769 return PART_2NxnU; // 0100
772 if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 001
774 if (get_cabac_bypass(&s->HEVClc->cc)) // 0001
776 return PART_nLx2N; // 0000
779 int ff_hevc_pcm_flag_decode(HEVCContext *s)
781 return get_cabac_terminate(&s->HEVClc->cc);
784 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
786 return GET_CABAC(elem_offset[PREV_INTRA_LUMA_PRED_FLAG]);
789 int ff_hevc_mpm_idx_decode(HEVCContext *s)
792 while (i < 2 && get_cabac_bypass(&s->HEVClc->cc))
797 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s)
800 int value = get_cabac_bypass(&s->HEVClc->cc);
802 for (i = 0; i < 4; i++)
803 value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
807 int ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s)
810 if (!GET_CABAC(elem_offset[INTRA_CHROMA_PRED_MODE]))
813 ret = get_cabac_bypass(&s->HEVClc->cc) << 1;
814 ret |= get_cabac_bypass(&s->HEVClc->cc);
818 int ff_hevc_merge_idx_decode(HEVCContext *s)
820 int i = GET_CABAC(elem_offset[MERGE_IDX]);
823 while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&s->HEVClc->cc))
829 int ff_hevc_merge_flag_decode(HEVCContext *s)
831 return GET_CABAC(elem_offset[MERGE_FLAG]);
834 int ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH)
836 if (nPbW + nPbH == 12)
837 return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
838 if (GET_CABAC(elem_offset[INTER_PRED_IDC] + s->HEVClc->ct_depth))
841 return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
844 int ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx)
847 int max = num_ref_idx_lx - 1;
848 int max_ctx = FFMIN(max, 2);
850 while (i < max_ctx && GET_CABAC(elem_offset[REF_IDX_L0] + i))
853 while (i < max && get_cabac_bypass(&s->HEVClc->cc))
860 int ff_hevc_mvp_lx_flag_decode(HEVCContext *s)
862 return GET_CABAC(elem_offset[MVP_LX_FLAG]);
865 int ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s)
867 return GET_CABAC(elem_offset[NO_RESIDUAL_DATA_FLAG]);
870 static av_always_inline int abs_mvd_greater0_flag_decode(HEVCContext *s)
872 return GET_CABAC(elem_offset[ABS_MVD_GREATER0_FLAG]);
875 static av_always_inline int abs_mvd_greater1_flag_decode(HEVCContext *s)
877 return GET_CABAC(elem_offset[ABS_MVD_GREATER1_FLAG] + 1);
880 static av_always_inline int mvd_decode(HEVCContext *s)
885 while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
889 if (k == CABAC_MAX_BIN)
890 av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
892 ret += get_cabac_bypass(&s->HEVClc->cc) << k;
893 return get_cabac_bypass_sign(&s->HEVClc->cc, -ret);
896 static av_always_inline int mvd_sign_flag_decode(HEVCContext *s)
898 return get_cabac_bypass_sign(&s->HEVClc->cc, -1);
901 int ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size)
903 return GET_CABAC(elem_offset[SPLIT_TRANSFORM_FLAG] + 5 - log2_trafo_size);
906 int ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth)
908 return GET_CABAC(elem_offset[CBF_CB_CR] + trafo_depth);
911 int ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth)
913 return GET_CABAC(elem_offset[CBF_LUMA] + !trafo_depth);
916 static int ff_hevc_transform_skip_flag_decode(HEVCContext *s, int c_idx)
918 return GET_CABAC(elem_offset[TRANSFORM_SKIP_FLAG] + !!c_idx);
921 static int explicit_rdpcm_flag_decode(HEVCContext *s, int c_idx)
923 return GET_CABAC(elem_offset[EXPLICIT_RDPCM_FLAG] + !!c_idx);
926 static int explicit_rdpcm_dir_flag_decode(HEVCContext *s, int c_idx)
928 return GET_CABAC(elem_offset[EXPLICIT_RDPCM_DIR_FLAG] + !!c_idx);
931 int ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx) {
934 while (i < 4 && GET_CABAC(elem_offset[LOG2_RES_SCALE_ABS] + 4 * idx + i))
940 int ff_hevc_res_scale_sign_flag(HEVCContext *s, int idx) {
941 return GET_CABAC(elem_offset[RES_SCALE_SIGN_FLAG] + idx);
944 static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCContext *s, int c_idx,
945 int log2_size, int *last_scx_prefix, int *last_scy_prefix)
948 int max = (log2_size << 1) - 1;
949 int ctx_offset, ctx_shift;
952 ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
953 ctx_shift = (log2_size + 1) >> 2;
956 ctx_shift = log2_size - 2;
959 GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_X_PREFIX] + (i >> ctx_shift) + ctx_offset))
961 *last_scx_prefix = i;
965 GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_Y_PREFIX] + (i >> ctx_shift) + ctx_offset))
967 *last_scy_prefix = i;
970 static av_always_inline int last_significant_coeff_suffix_decode(HEVCContext *s,
971 int last_significant_coeff_prefix)
974 int length = (last_significant_coeff_prefix >> 1) - 1;
975 int value = get_cabac_bypass(&s->HEVClc->cc);
977 for (i = 1; i < length; i++)
978 value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
982 static av_always_inline int significant_coeff_group_flag_decode(HEVCContext *s, int c_idx, int ctx_cg)
986 inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
988 return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_GROUP_FLAG] + inc);
990 static av_always_inline int significant_coeff_flag_decode(HEVCContext *s, int x_c, int y_c,
991 int offset, const uint8_t *ctx_idx_map)
993 int inc = ctx_idx_map[(y_c << 2) + x_c] + offset;
994 return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + inc);
997 static av_always_inline int significant_coeff_flag_decode_0(HEVCContext *s, int c_idx, int offset)
999 return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + offset);
1002 static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCContext *s, int c_idx, int inc)
1008 return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER1_FLAG] + inc);
1011 static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCContext *s, int c_idx, int inc)
1016 return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER2_FLAG] + inc);
1019 static av_always_inline int coeff_abs_level_remaining_decode(HEVCContext *s, int rc_rice_param)
1023 int last_coeff_abs_level_remaining;
1026 while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc))
1028 if (prefix == CABAC_MAX_BIN)
1029 av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
1031 for (i = 0; i < rc_rice_param; i++)
1032 suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
1033 last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
1035 int prefix_minus3 = prefix - 3;
1036 for (i = 0; i < prefix_minus3 + rc_rice_param; i++)
1037 suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
1038 last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1039 << rc_rice_param) + suffix;
1041 return last_coeff_abs_level_remaining;
1044 static av_always_inline int coeff_sign_flag_decode(HEVCContext *s, uint8_t nb)
1049 for (i = 0; i < nb; i++)
1050 ret = (ret << 1) | get_cabac_bypass(&s->HEVClc->cc);
1054 void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
1055 int log2_trafo_size, enum ScanType scan_idx,
1058 #define GET_COORD(offset, n) \
1060 x_c = (x_cg << 2) + scan_x_off[n]; \
1061 y_c = (y_cg << 2) + scan_y_off[n]; \
1063 HEVCLocalContext *lc = s->HEVClc;
1064 int transform_skip_flag = 0;
1066 int last_significant_coeff_x, last_significant_coeff_y;
1070 int greater1_ctx = 1;
1072 int num_last_subset;
1073 int x_cg_last_sig, y_cg_last_sig;
1075 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1077 ptrdiff_t stride = s->frame->linesize[c_idx];
1078 int hshift = s->sps->hshift[c_idx];
1079 int vshift = s->sps->vshift[c_idx];
1080 uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
1081 ((x0 >> hshift) << s->sps->pixel_shift)];
1082 int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1083 uint8_t significant_coeff_group_flag[8][8] = {{0}};
1084 int explicit_rdpcm_flag = 0;
1085 int explicit_rdpcm_dir_flag;
1087 int trafo_size = 1 << log2_trafo_size;
1089 int qp,shift,add,scale,scale_m;
1090 const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1091 const uint8_t *scale_matrix = NULL;
1093 int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1094 lc->tu.intra_pred_mode_c;
1096 memset(coeffs, 0, trafo_size * trafo_size * sizeof(int16_t));
1098 // Derive QP for dequant
1099 if (!lc->cu.cu_transquant_bypass_flag) {
1100 static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1101 static const uint8_t rem6[51 + 4 * 6 + 1] = {
1102 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1103 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1104 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1105 4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1108 static const uint8_t div6[51 + 4 * 6 + 1] = {
1109 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1110 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1111 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1112 10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1114 int qp_y = lc->qp_y;
1116 if (s->pps->transform_skip_enabled_flag &&
1117 log2_trafo_size <= s->pps->log2_max_transform_skip_block_size) {
1118 transform_skip_flag = ff_hevc_transform_skip_flag_decode(s, c_idx);
1122 qp = qp_y + s->sps->qp_bd_offset;
1127 offset = s->pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1128 lc->tu.cu_qp_offset_cb;
1130 offset = s->pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1131 lc->tu.cu_qp_offset_cr;
1133 qp_i = av_clip(qp_y + offset, - s->sps->qp_bd_offset, 57);
1134 if (s->sps->chroma_format_idc == 1) {
1140 qp = qp_c[qp_i - 30];
1148 qp += s->sps->qp_bd_offset;
1151 shift = s->sps->bit_depth + log2_trafo_size - 5;
1152 add = 1 << (shift-1);
1153 scale = level_scale[rem6[qp]] << (div6[qp]);
1154 scale_m = 16; // default when no custom scaling lists.
1157 if (s->sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) {
1158 const ScalingList *sl = s->pps->scaling_list_data_present_flag ?
1159 &s->pps->scaling_list : &s->sps->scaling_list;
1160 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1162 matrix_id = 3 * matrix_id + c_idx;
1164 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1165 if (log2_trafo_size >= 4)
1166 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1175 if (lc->cu.pred_mode == MODE_INTER && s->sps->explicit_rdpcm_enabled_flag &&
1176 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1177 explicit_rdpcm_flag = explicit_rdpcm_flag_decode(s, c_idx);
1178 if (explicit_rdpcm_flag) {
1179 explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(s, c_idx);
1183 last_significant_coeff_xy_prefix_decode(s, c_idx, log2_trafo_size,
1184 &last_significant_coeff_x, &last_significant_coeff_y);
1186 if (last_significant_coeff_x > 3) {
1187 int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
1188 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1189 (2 + (last_significant_coeff_x & 1)) +
1193 if (last_significant_coeff_y > 3) {
1194 int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1195 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1196 (2 + (last_significant_coeff_y & 1)) +
1200 if (scan_idx == SCAN_VERT)
1201 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1203 x_cg_last_sig = last_significant_coeff_x >> 2;
1204 y_cg_last_sig = last_significant_coeff_y >> 2;
1208 int last_x_c = last_significant_coeff_x & 3;
1209 int last_y_c = last_significant_coeff_y & 3;
1211 scan_x_off = ff_hevc_diag_scan4x4_x;
1212 scan_y_off = ff_hevc_diag_scan4x4_y;
1213 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1214 if (trafo_size == 4) {
1215 scan_x_cg = scan_1x1;
1216 scan_y_cg = scan_1x1;
1217 } else if (trafo_size == 8) {
1218 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1219 scan_x_cg = diag_scan2x2_x;
1220 scan_y_cg = diag_scan2x2_y;
1221 } else if (trafo_size == 16) {
1222 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1223 scan_x_cg = ff_hevc_diag_scan4x4_x;
1224 scan_y_cg = ff_hevc_diag_scan4x4_y;
1225 } else { // trafo_size == 32
1226 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1227 scan_x_cg = ff_hevc_diag_scan8x8_x;
1228 scan_y_cg = ff_hevc_diag_scan8x8_y;
1233 scan_x_cg = horiz_scan2x2_x;
1234 scan_y_cg = horiz_scan2x2_y;
1235 scan_x_off = horiz_scan4x4_x;
1236 scan_y_off = horiz_scan4x4_y;
1237 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1239 default: //SCAN_VERT
1240 scan_x_cg = horiz_scan2x2_y;
1241 scan_y_cg = horiz_scan2x2_x;
1242 scan_x_off = horiz_scan4x4_y;
1243 scan_y_off = horiz_scan4x4_x;
1244 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1248 num_last_subset = (num_coeff - 1) >> 4;
1250 for (i = num_last_subset; i >= 0; i--) {
1252 int x_cg, y_cg, x_c, y_c, pos;
1253 int implicit_non_zero_coeff = 0;
1254 int64_t trans_coeff_level;
1256 int offset = i << 4;
1259 uint8_t significant_coeff_flag_idx[16];
1260 uint8_t nb_significant_coeff_flag = 0;
1262 x_cg = scan_x_cg[i];
1263 y_cg = scan_y_cg[i];
1265 if ((i < num_last_subset) && (i > 0)) {
1267 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1268 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1269 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1270 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1272 significant_coeff_group_flag[x_cg][y_cg] =
1273 significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1274 implicit_non_zero_coeff = 1;
1276 significant_coeff_group_flag[x_cg][y_cg] =
1277 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1278 (x_cg == 0 && y_cg == 0));
1281 last_scan_pos = num_coeff - offset - 1;
1283 if (i == num_last_subset) {
1284 n_end = last_scan_pos - 1;
1285 significant_coeff_flag_idx[0] = last_scan_pos;
1286 nb_significant_coeff_flag = 1;
1291 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1292 prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1293 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1294 prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1296 if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1297 static const uint8_t ctx_idx_map[] = {
1298 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2
1299 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1300 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1
1301 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2
1302 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // default
1304 const uint8_t *ctx_idx_map_p;
1306 if (s->sps->transform_skip_context_enabled_flag &&
1307 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1308 ctx_idx_map_p = (uint8_t*) &ctx_idx_map[4 * 16];
1312 scf_offset = 14 + 27;
1317 if (log2_trafo_size == 2) {
1318 ctx_idx_map_p = (uint8_t*) &ctx_idx_map[0];
1320 ctx_idx_map_p = (uint8_t*) &ctx_idx_map[(prev_sig + 1) << 4];
1322 if ((x_cg > 0 || y_cg > 0))
1324 if (log2_trafo_size == 3) {
1325 scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1330 if (log2_trafo_size == 3)
1337 for (n = n_end; n > 0; n--) {
1338 x_c = scan_x_off[n];
1339 y_c = scan_y_off[n];
1340 if (significant_coeff_flag_decode(s, x_c, y_c, scf_offset, ctx_idx_map_p)) {
1341 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1342 nb_significant_coeff_flag++;
1343 implicit_non_zero_coeff = 0;
1346 if (implicit_non_zero_coeff == 0) {
1347 if (s->sps->transform_skip_context_enabled_flag &&
1348 (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1352 scf_offset = 16 + 27;
1361 scf_offset = 2 + scf_offset;
1364 if (significant_coeff_flag_decode_0(s, c_idx, scf_offset) == 1) {
1365 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1366 nb_significant_coeff_flag++;
1369 significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1370 nb_significant_coeff_flag++;
1374 n_end = nb_significant_coeff_flag;
1378 int first_nz_pos_in_cg;
1379 int last_nz_pos_in_cg;
1380 int c_rice_param = 0;
1381 int first_greater1_coeff_idx = -1;
1382 uint8_t coeff_abs_level_greater1_flag[8];
1383 uint16_t coeff_sign_flag;
1389 // initialize first elem of coeff_bas_level_greater1_flag
1390 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1392 if (s->sps->persistent_rice_adaptation_enabled_flag) {
1393 if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag)
1394 sb_type = 2 * (c_idx == 0 ? 1 : 0);
1396 sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1397 c_rice_param = lc->stat_coeff[sb_type] / 4;
1400 if (!(i == num_last_subset) && greater1_ctx == 0)
1403 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1405 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1406 int inc = (ctx_set << 2) + greater1_ctx;
1407 coeff_abs_level_greater1_flag[m] =
1408 coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1409 if (coeff_abs_level_greater1_flag[m]) {
1411 if (first_greater1_coeff_idx == -1)
1412 first_greater1_coeff_idx = m;
1413 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1417 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1419 if (lc->cu.cu_transquant_bypass_flag ||
1420 (lc->cu.pred_mode == MODE_INTRA &&
1421 s->sps->implicit_rdpcm_enabled_flag && transform_skip_flag &&
1422 (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1423 explicit_rdpcm_flag)
1426 sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1428 if (first_greater1_coeff_idx != -1) {
1429 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1431 if (!s->pps->sign_data_hiding_flag || !sign_hidden ) {
1432 coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1434 coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1437 for (m = 0; m < n_end; m++) {
1438 n = significant_coeff_flag_idx[m];
1439 GET_COORD(offset, n);
1441 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1442 if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1443 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param);
1445 trans_coeff_level += last_coeff_abs_level_remaining;
1446 if (trans_coeff_level > (3 << c_rice_param))
1447 c_rice_param = s->sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1448 if (s->sps->persistent_rice_adaptation_enabled_flag && !rice_init) {
1449 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1450 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1451 lc->stat_coeff[sb_type]++;
1452 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1453 if (lc->stat_coeff[sb_type] > 0)
1454 lc->stat_coeff[sb_type]--;
1459 int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param);
1461 trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1462 if (trans_coeff_level > (3 << c_rice_param))
1463 c_rice_param = s->sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1464 if (s->sps->persistent_rice_adaptation_enabled_flag && !rice_init) {
1465 int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1466 if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1467 lc->stat_coeff[sb_type]++;
1468 else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1469 if (lc->stat_coeff[sb_type] > 0)
1470 lc->stat_coeff[sb_type]--;
1474 if (s->pps->sign_data_hiding_flag && sign_hidden) {
1475 sum_abs += trans_coeff_level;
1476 if (n == first_nz_pos_in_cg && (sum_abs&1))
1477 trans_coeff_level = -trans_coeff_level;
1479 if (coeff_sign_flag >> 15)
1480 trans_coeff_level = -trans_coeff_level;
1481 coeff_sign_flag <<= 1;
1482 if(!lc->cu.cu_transquant_bypass_flag) {
1483 if (s->sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) {
1484 if(y_c || x_c || log2_trafo_size < 4) {
1485 switch(log2_trafo_size) {
1486 case 3: pos = (y_c << 3) + x_c; break;
1487 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1488 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1489 default: pos = (y_c << 2) + x_c; break;
1491 scale_m = scale_matrix[pos];
1496 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1497 if(trans_coeff_level < 0) {
1498 if((~trans_coeff_level) & 0xFffffffffff8000)
1499 trans_coeff_level = -32768;
1501 if(trans_coeff_level & 0xffffffffffff8000)
1502 trans_coeff_level = 32767;
1505 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1510 if (lc->cu.cu_transquant_bypass_flag) {
1511 if (explicit_rdpcm_flag || (s->sps->implicit_rdpcm_enabled_flag &&
1512 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1513 int mode = s->sps->implicit_rdpcm_enabled_flag ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1515 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1518 if (transform_skip_flag) {
1519 int rot = s->sps->transform_skip_rotation_enabled_flag &&
1520 log2_trafo_size == 2 &&
1521 lc->cu.pred_mode == MODE_INTRA;
1523 for (i = 0; i < 8; i++)
1524 FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1527 s->hevcdsp.transform_skip(coeffs, log2_trafo_size);
1529 if (explicit_rdpcm_flag || (s->sps->implicit_rdpcm_enabled_flag &&
1530 lc->cu.pred_mode == MODE_INTRA &&
1531 (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1532 int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1534 s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1536 } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1537 s->hevcdsp.idct_4x4_luma(coeffs);
1539 int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1541 s->hevcdsp.idct_dc[log2_trafo_size-2](coeffs);
1543 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1545 col_limit = FFMIN(4, col_limit);
1546 else if (max_xy < 8)
1547 col_limit = FFMIN(8, col_limit);
1548 else if (max_xy < 12)
1549 col_limit = FFMIN(24, col_limit);
1550 s->hevcdsp.idct[log2_trafo_size-2](coeffs, col_limit);
1554 if (lc->tu.cross_pf) {
1555 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1557 for (i = 0; i < (trafo_size * trafo_size); i++) {
1558 coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1561 s->hevcdsp.transform_add[log2_trafo_size-2](dst, coeffs, stride);
1564 void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1566 HEVCLocalContext *lc = s->HEVClc;
1567 int x = abs_mvd_greater0_flag_decode(s);
1568 int y = abs_mvd_greater0_flag_decode(s);
1571 x += abs_mvd_greater1_flag_decode(s);
1573 y += abs_mvd_greater1_flag_decode(s);
1576 case 2: lc->pu.mvd.x = mvd_decode(s); break;
1577 case 1: lc->pu.mvd.x = mvd_sign_flag_decode(s); break;
1578 case 0: lc->pu.mvd.x = 0; break;
1582 case 2: lc->pu.mvd.y = mvd_decode(s); break;
1583 case 1: lc->pu.mvd.y = mvd_sign_flag_decode(s); break;
1584 case 0: lc->pu.mvd.y = 0; break;