avcodec/hevc: new idct + asm
[ffmpeg.git] / libavcodec / hevc_cabac.c
index b7d77d2..b23b89c 100644 (file)
 #include "cabac_functions.h"
 #include "hevc.h"
 
-#define CABAC_MAX_BIN 100
+#define CABAC_MAX_BIN 31
 
 /**
  * number of bin by SyntaxElement.
  */
 static const int8_t num_bins_in_se[] = {
-     1,  // sao_merge_flag
-     1,  // sao_type_idx
-     0,  // sao_eo_class
-     0,  // sao_band_position
-     0,  // sao_offset_abs
-     0,  // sao_offset_sign
-     0,  // end_of_slice_flag
-     3,  // split_coding_unit_flag
-     1,  // cu_transquant_bypass_flag
-     3,  // skip_flag
-     3,  // cu_qp_delta
-     1,  // pred_mode
-     4,  // part_mode
-     0,  // pcm_flag
-     1,  // prev_intra_luma_pred_mode
-     0,  // mpm_idx
-     0,  // rem_intra_luma_pred_mode
-     2,  // intra_chroma_pred_mode
-     1,  // merge_flag
-     1,  // merge_idx
-     5,  // inter_pred_idc
-     2,  // ref_idx_l0
-     2,  // ref_idx_l1
-     2,  // abs_mvd_greater0_flag
-     2,  // abs_mvd_greater1_flag
-     0,  // abs_mvd_minus2
-     0,  // mvd_sign_flag
-     1,  // mvp_lx_flag
-     1,  // no_residual_data_flag
-     3,  // split_transform_flag
-     2,  // cbf_luma
-     4,  // cbf_cb, cbf_cr
-     2,  // transform_skip_flag[][]
-    18,  // last_significant_coeff_x_prefix
-    18,  // last_significant_coeff_y_prefix
-     0,  // last_significant_coeff_x_suffix
-     0,  // last_significant_coeff_y_suffix
-     4,  // significant_coeff_group_flag
-    42,  // significant_coeff_flag
-    24,  // coeff_abs_level_greater1_flag
-     6,  // coeff_abs_level_greater2_flag
-     0,  // coeff_abs_level_remaining
-     0,  // coeff_sign_flag
+     1, // sao_merge_flag
+     1, // sao_type_idx
+     0, // sao_eo_class
+     0, // sao_band_position
+     0, // sao_offset_abs
+     0, // sao_offset_sign
+     0, // end_of_slice_flag
+     3, // split_coding_unit_flag
+     1, // cu_transquant_bypass_flag
+     3, // skip_flag
+     3, // cu_qp_delta
+     1, // pred_mode
+     4, // part_mode
+     0, // pcm_flag
+     1, // prev_intra_luma_pred_mode
+     0, // mpm_idx
+     0, // rem_intra_luma_pred_mode
+     2, // intra_chroma_pred_mode
+     1, // merge_flag
+     1, // merge_idx
+     5, // inter_pred_idc
+     2, // ref_idx_l0
+     2, // ref_idx_l1
+     2, // abs_mvd_greater0_flag
+     2, // abs_mvd_greater1_flag
+     0, // abs_mvd_minus2
+     0, // mvd_sign_flag
+     1, // mvp_lx_flag
+     1, // no_residual_data_flag
+     3, // split_transform_flag
+     2, // cbf_luma
+     4, // cbf_cb, cbf_cr
+     2, // transform_skip_flag[][]
+    18, // last_significant_coeff_x_prefix
+    18, // last_significant_coeff_y_prefix
+     0, // last_significant_coeff_x_suffix
+     0, // last_significant_coeff_y_suffix
+     4, // significant_coeff_group_flag
+    42, // significant_coeff_flag
+    24, // coeff_abs_level_greater1_flag
+     6, // coeff_abs_level_greater2_flag
+     0, // coeff_abs_level_remaining
+     0, // coeff_sign_flag
 };
 
 /**
  * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement.
  */
 static const int elem_offset[sizeof(num_bins_in_se)] = {
-    0,
-    1,
-    2,
-    2,
-    2,
-    2,
-    2,
-    2,
-    5,
-    6,
-    9,
-    12,
-    13,
-    17,
-    17,
-    18,
-    18,
-    18,
-    20,
-    21,
-    22,
-    27,
-    29,
-    31,
-    33,
-    35,
-    35,
-    35,
-    36,
-    37,
-    40,
-    42,
-    46,
-    48,
-    66,
-    84,
-    84,
-    84,
-    88,
+      0,
+      1,
+      2,
+      2,
+      2,
+      2,
+      2,
+      2,
+      5,
+      6,
+      9,
+     12,
+     13,
+     17,
+     17,
+     18,
+     18,
+     18,
+     20,
+     21,
+     22,
+     27,
+     29,
+     31,
+     33,
+     35,
+     35,
+     35,
+     36,
+     37,
+     40,
+     42,
+     46,
+     48,
+     66,
+     84,
+     84,
+     84,
+     88,
     130,
     154,
     160,
@@ -132,201 +132,195 @@ static const int elem_offset[sizeof(num_bins_in_se)] = {
  * Indexed by init_type
  */
 static const uint8_t init_values[3][HEVC_CONTEXTS] = {
-    {
-        // sao_merge_flag
-        153,
-        // sao_type_idx
-        200,
-        // split_coding_unit_flag
-        139, 141, 157,
-        // cu_transquant_bypass_flag
-        154,
-        // skip_flag
-        CNU, CNU, CNU,
-        // cu_qp_delta
-        154, 154, 154,
-        // pred_mode
-        CNU,
-        // part_mode
-        184, CNU, CNU, CNU,
-        // prev_intra_luma_pred_mode
-        184,
-        // intra_chroma_pred_mode
-        63, 139,
-        // merge_flag
-        CNU,
-        // merge_idx
-        CNU,
-        // inter_pred_idc
-        CNU, CNU, CNU, CNU, CNU,
-        // ref_idx_l0
-        CNU, CNU,
-        // ref_idx_l1
-        CNU, CNU,
-        // abs_mvd_greater1_flag
-        CNU, CNU,
-        // abs_mvd_greater1_flag
-        CNU, CNU,
-        // mvp_lx_flag
-        CNU,
-        // no_residual_data_flag
-        CNU,
-        // split_transform_flag
-        153, 138, 138,
-        // cbf_luma
-        111, 141,
-        // cbf_cb, cbf_cr
-        94, 138, 182, 154,
-        // transform_skip_flag
-        139, 139,
-        // last_significant_coeff_x_prefix
-        110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
-         79, 108, 123,  63,
-        // last_significant_coeff_y_prefix
-        110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
-         79, 108, 123,  63,
-        // significant_coeff_group_flag
-        91, 171, 134, 141,
-        // significant_coeff_flag
-        111, 111, 125, 110, 110,  94, 124, 108, 124, 107, 125, 141, 179, 153,
-        125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
-        139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
-        // coeff_abs_level_greater1_flag
-        140,  92, 137, 138, 140, 152, 138, 139, 153,  74, 149,  92, 139, 107,
-        122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
-        // coeff_abs_level_greater2_flag
-        138, 153, 136, 167, 152, 152,
-    },
-    {
-        // sao_merge_flag
-        153,
-        // sao_type_idx
-        185,
-        // split_coding_unit_flag
-        107, 139, 126,
-        // cu_transquant_bypass_flag
-        154,
-        // skip_flag
-        197, 185, 201,
-        // cu_qp_delta
-        154, 154, 154,
-        // pred_mode
-        149,
-        // part_mode
-        154, 139, 154, 154,
-        // prev_intra_luma_pred_mode
-        154,
-        // intra_chroma_pred_mode
-        152, 139,
-        // merge_flag
-        110,
-        // merge_idx
-        122,
-        // inter_pred_idc
-        95, 79, 63, 31, 31,
-        // ref_idx_l0
-        153, 153,
-        // ref_idx_l1
-        153, 153,
-        // abs_mvd_greater1_flag
-        140, 198,
-        // abs_mvd_greater1_flag
-        140, 198,
-        // mvp_lx_flag
-        168,
-        // no_residual_data_flag
-        79,
-        // split_transform_flag
-        124, 138, 94,
-        // cbf_luma
-        153, 111,
-        // cbf_cb, cbf_cr
-        149, 107, 167, 154,
-        // transform_skip_flag
-        139, 139,
-        // last_significant_coeff_x_prefix
-        125, 110,  94, 110,  95,  79, 125, 111, 110,  78, 110, 111, 111,  95,
-         94, 108, 123, 108,
-        // last_significant_coeff_y_prefix
-        125, 110,  94, 110,  95,  79, 125, 111, 110,  78, 110, 111, 111,  95,
-         94, 108, 123, 108,
-        // significant_coeff_group_flag
-        121, 140, 61, 154,
-        // significant_coeff_flag
-        155, 154, 139, 153, 139, 123, 123,  63, 153, 166, 183, 140, 136, 153,
-        154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
-        153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
-        // coeff_abs_level_greater1_flag
-        154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
-        136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
-        // coeff_abs_level_greater2_flag
-        107, 167, 91, 122, 107, 167,
-    },
-    {
-        // sao_merge_flag
-        153,
-        // sao_type_idx
-        160,
-        // split_coding_unit_flag
-        107, 139, 126,
-        // cu_transquant_bypass_flag
-        154,
-        // skip_flag
-        197, 185, 201,
-        // cu_qp_delta
-        154, 154, 154,
-        // pred_mode
-        134,
-        // part_mode
-        154, 139, 154, 154,
-        // prev_intra_luma_pred_mode
-        183,
-        // intra_chroma_pred_mode
-        152, 139,
-        // merge_flag
-        154,
-        // merge_idx
-        137,
-        // inter_pred_idc
-        95, 79, 63, 31, 31,
-        // ref_idx_l0
-        153, 153,
-        // ref_idx_l1
-        153, 153,
-        // abs_mvd_greater1_flag
-        169, 198,
-        // abs_mvd_greater1_flag
-        169, 198,
-        // mvp_lx_flag
-        168,
-        // no_residual_data_flag
-        79,
-        // split_transform_flag
-        224, 167, 122,
-        // cbf_luma
-        153, 111,
-        // cbf_cb, cbf_cr
-        149, 92, 167, 154,
-        // transform_skip_flag
-        139, 139,
-        // last_significant_coeff_x_prefix
-        125, 110, 124, 110,  95,  94, 125, 111, 111,  79, 125, 126, 111, 111,
-         79, 108, 123,  93,
-        // last_significant_coeff_y_prefix
-        125, 110, 124, 110,  95,  94, 125, 111, 111,  79, 125, 126, 111, 111,
-         79, 108, 123,  93,
-        // significant_coeff_group_flag
-        121, 140, 61, 154,
-        // significant_coeff_flag
-        170, 154, 139, 153, 139, 123, 123,  63, 124, 166, 183, 140, 136, 153,
-        154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
-        153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
-        // coeff_abs_level_greater1_flag
-        154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
-        136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
-        // coeff_abs_level_greater2_flag
-        107, 167, 91, 107, 107, 167,
-    },
+    { // sao_merge_flag
+      153,
+      // sao_type_idx
+      200,
+      // split_coding_unit_flag
+      139, 141, 157,
+      // cu_transquant_bypass_flag
+      154,
+      // skip_flag
+      CNU, CNU, CNU,
+      // cu_qp_delta
+      154, 154, 154,
+      // pred_mode
+      CNU,
+      // part_mode
+      184, CNU, CNU, CNU,
+      // prev_intra_luma_pred_mode
+      184,
+      // intra_chroma_pred_mode
+      63, 139,
+      // merge_flag
+      CNU,
+      // merge_idx
+      CNU,
+      // inter_pred_idc
+      CNU, CNU, CNU, CNU, CNU,
+      // ref_idx_l0
+      CNU, CNU,
+      // ref_idx_l1
+      CNU, CNU,
+      // abs_mvd_greater1_flag
+      CNU, CNU,
+      // abs_mvd_greater1_flag
+      CNU, CNU,
+      // mvp_lx_flag
+      CNU,
+      // no_residual_data_flag
+      CNU,
+      // split_transform_flag
+      153, 138, 138,
+      // cbf_luma
+      111, 141,
+      // cbf_cb, cbf_cr
+      94, 138, 182, 154,
+      // transform_skip_flag
+      139, 139,
+      // last_significant_coeff_x_prefix
+      110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
+       79, 108, 123,  63,
+      // last_significant_coeff_y_prefix
+      110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
+       79, 108, 123,  63,
+      // significant_coeff_group_flag
+      91, 171, 134, 141,
+      // significant_coeff_flag
+      111, 111, 125, 110, 110,  94, 124, 108, 124, 107, 125, 141, 179, 153,
+      125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
+      139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
+      // coeff_abs_level_greater1_flag
+      140,  92, 137, 138, 140, 152, 138, 139, 153,  74, 149,  92, 139, 107,
+      122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
+      // coeff_abs_level_greater2_flag
+      138, 153, 136, 167, 152, 152, },
+    { // sao_merge_flag
+      153,
+      // sao_type_idx
+      185,
+      // split_coding_unit_flag
+      107, 139, 126,
+      // cu_transquant_bypass_flag
+      154,
+      // skip_flag
+      197, 185, 201,
+      // cu_qp_delta
+      154, 154, 154,
+      // pred_mode
+      149,
+      // part_mode
+      154, 139, 154, 154,
+      // prev_intra_luma_pred_mode
+      154,
+      // intra_chroma_pred_mode
+      152, 139,
+      // merge_flag
+      110,
+      // merge_idx
+      122,
+      // inter_pred_idc
+      95, 79, 63, 31, 31,
+      // ref_idx_l0
+      153, 153,
+      // ref_idx_l1
+      153, 153,
+      // abs_mvd_greater1_flag
+      140, 198,
+      // abs_mvd_greater1_flag
+      140, 198,
+      // mvp_lx_flag
+      168,
+      // no_residual_data_flag
+      79,
+      // split_transform_flag
+      124, 138, 94,
+      // cbf_luma
+      153, 111,
+      // cbf_cb, cbf_cr
+      149, 107, 167, 154,
+      // transform_skip_flag
+      139, 139,
+      // last_significant_coeff_x_prefix
+      125, 110,  94, 110,  95,  79, 125, 111, 110,  78, 110, 111, 111,  95,
+       94, 108, 123, 108,
+      // last_significant_coeff_y_prefix
+      125, 110,  94, 110,  95,  79, 125, 111, 110,  78, 110, 111, 111,  95,
+       94, 108, 123, 108,
+      // significant_coeff_group_flag
+      121, 140, 61, 154,
+      // significant_coeff_flag
+      155, 154, 139, 153, 139, 123, 123,  63, 153, 166, 183, 140, 136, 153,
+      154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
+      153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
+      // coeff_abs_level_greater1_flag
+      154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
+      136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
+      // coeff_abs_level_greater2_flag
+      107, 167, 91, 122, 107, 167, },
+    { // sao_merge_flag
+      153,
+      // sao_type_idx
+      160,
+      // split_coding_unit_flag
+      107, 139, 126,
+      // cu_transquant_bypass_flag
+      154,
+      // skip_flag
+      197, 185, 201,
+      // cu_qp_delta
+      154, 154, 154,
+      // pred_mode
+      134,
+      // part_mode
+      154, 139, 154, 154,
+      // prev_intra_luma_pred_mode
+      183,
+      // intra_chroma_pred_mode
+      152, 139,
+      // merge_flag
+      154,
+      // merge_idx
+      137,
+      // inter_pred_idc
+      95, 79, 63, 31, 31,
+      // ref_idx_l0
+      153, 153,
+      // ref_idx_l1
+      153, 153,
+      // abs_mvd_greater1_flag
+      169, 198,
+      // abs_mvd_greater1_flag
+      169, 198,
+      // mvp_lx_flag
+      168,
+      // no_residual_data_flag
+      79,
+      // split_transform_flag
+      224, 167, 122,
+      // cbf_luma
+      153, 111,
+      // cbf_cb, cbf_cr
+      149, 92, 167, 154,
+      // transform_skip_flag
+      139, 139,
+      // last_significant_coeff_x_prefix
+      125, 110, 124, 110,  95,  94, 125, 111, 111,  79, 125, 126, 111, 111,
+       79, 108, 123,  93,
+      // last_significant_coeff_y_prefix
+      125, 110, 124, 110,  95,  94, 125, 111, 111,  79, 125, 126, 111, 111,
+       79, 108, 123,  93,
+      // significant_coeff_group_flag
+      121, 140, 61, 154,
+      // significant_coeff_flag
+      170, 154, 139, 153, 139, 123, 123,  63, 124, 166, 183, 140, 136, 153,
+      154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
+      153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
+      // coeff_abs_level_greater1_flag
+      154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
+      136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
+      // coeff_abs_level_greater2_flag
+      107, 167, 91, 107, 107, 167, },
 };
 
 static const uint8_t scan_1x1[1] = {
@@ -504,16 +498,16 @@ static const uint8_t diag_scan8x8_inv[8][8] = {
 void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts)
 {
     if (s->pps->entropy_coding_sync_enabled_flag &&
-        ((ctb_addr_ts % s->sps->ctb_width) == 2 ||
+        (ctb_addr_ts % s->sps->ctb_width == 2 ||
          (s->sps->ctb_width == 2 &&
-          (ctb_addr_ts % s->sps->ctb_width) == 0))) {
-        memcpy(s->cabac_state, s->HEVClc.cabac_state, HEVC_CONTEXTS);
+          ctb_addr_ts % s->sps->ctb_width == 0))) {
+        memcpy(s->cabac_state, s->HEVClc->cabac_state, HEVC_CONTEXTS);
     }
 }
 
 static void load_states(HEVCContext *s)
 {
-    memcpy(s->HEVClc.cabac_state, s->cabac_state, HEVC_CONTEXTS);
+    memcpy(s->HEVClc->cabac_state, s->cabac_state, HEVC_CONTEXTS);
 }
 
 static void cabac_reinit(HEVCLocalContext *lc)
@@ -523,10 +517,10 @@ static void cabac_reinit(HEVCLocalContext *lc)
 
 static void cabac_init_decoder(HEVCContext *s)
 {
-    GetBitContext *gb = &s->HEVClc.gb;
+    GetBitContext *gb = &s->HEVClc->gb;
     skip_bits(gb, 1);
     align_get_bits(gb);
-    ff_init_cabac_decoder(&s->HEVClc.cc,
+    ff_init_cabac_decoder(&s->HEVClc->cc,
                           gb->buffer + get_bits_count(gb) / 8,
                           (get_bits_left(gb) + 7) / 8);
 }
@@ -543,12 +537,12 @@ static void cabac_init_state(HEVCContext *s)
         int init_value = init_values[init_type][i];
         int m = (init_value >> 4) * 5 - 45;
         int n = ((init_value & 15) << 3) - 16;
-        int pre = 2 * (((m * av_clip_c(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
+        int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
 
         pre ^= pre >> 31;
         if (pre > 124)
             pre = 124 + (pre & 1);
-        s->HEVClc.cabac_state[i] =  pre;
+        s->HEVClc->cabac_state[i] = pre;
     }
 }
 
@@ -556,13 +550,14 @@ void ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts)
 {
     if (ctb_addr_ts == s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
         cabac_init_decoder(s);
-        if ((s->sh.dependent_slice_segment_flag == 0) ||
+        if (s->sh.dependent_slice_segment_flag == 0 ||
             (s->pps->tiles_enabled_flag &&
-             (s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1])))
+             s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]))
             cabac_init_state(s);
 
-        if (!s->sh.first_slice_in_pic_flag && s->pps->entropy_coding_sync_enabled_flag) {
-            if ((ctb_addr_ts % s->sps->ctb_width) == 0) {
+        if (!s->sh.first_slice_in_pic_flag &&
+            s->pps->entropy_coding_sync_enabled_flag) {
+            if (ctb_addr_ts % s->sps->ctb_width == 0) {
                 if (s->sps->ctb_width == 1)
                     cabac_init_state(s);
                 else if (s->sh.dependent_slice_segment_flag == 1)
@@ -571,14 +566,20 @@ void ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts)
         }
     } else {
         if (s->pps->tiles_enabled_flag &&
-            (s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1])) {
-            cabac_reinit(&s->HEVClc);
+            s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
+            if (s->threads_number == 1)
+                cabac_reinit(s->HEVClc);
+            else
+                cabac_init_decoder(s);
             cabac_init_state(s);
         }
         if (s->pps->entropy_coding_sync_enabled_flag) {
-            if ((ctb_addr_ts % s->sps->ctb_width) == 0) {
-                get_cabac_terminate(&s->HEVClc.cc);
-                cabac_reinit(&s->HEVClc);
+            if (ctb_addr_ts % s->sps->ctb_width == 0) {
+                get_cabac_terminate(&s->HEVClc->cc);
+                if (s->threads_number == 1)
+                    cabac_reinit(s->HEVClc);
+                else
+                    cabac_init_decoder(s);
 
                 if (s->sps->ctb_width == 1)
                     cabac_init_state(s);
@@ -589,7 +590,7 @@ void ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts)
     }
 }
 
-#define GET_CABAC(ctx) get_cabac(&s->HEVClc.cc, &s->HEVClc.cabac_state[ctx])
+#define GET_CABAC(ctx) get_cabac(&s->HEVClc->cc, &s->HEVClc->cabac_state[ctx])
 
 int ff_hevc_sao_merge_flag_decode(HEVCContext *s)
 {
@@ -601,7 +602,7 @@ int ff_hevc_sao_type_idx_decode(HEVCContext *s)
     if (!GET_CABAC(elem_offset[SAO_TYPE_IDX]))
         return 0;
 
-    if (!get_cabac_bypass(&s->HEVClc.cc))
+    if (!get_cabac_bypass(&s->HEVClc->cc))
         return SAO_BAND;
     return SAO_EDGE;
 }
@@ -609,10 +610,10 @@ int ff_hevc_sao_type_idx_decode(HEVCContext *s)
 int ff_hevc_sao_band_position_decode(HEVCContext *s)
 {
     int i;
-    int value = get_cabac_bypass(&s->HEVClc.cc);
+    int value = get_cabac_bypass(&s->HEVClc->cc);
 
     for (i = 0; i < 4; i++)
-        value = (value << 1) | get_cabac_bypass(&s->HEVClc.cc);
+        value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
     return value;
 }
 
@@ -621,26 +622,26 @@ int ff_hevc_sao_offset_abs_decode(HEVCContext *s)
     int i = 0;
     int length = (1 << (FFMIN(s->sps->bit_depth, 10) - 5)) - 1;
 
-    while (i < length && get_cabac_bypass(&s->HEVClc.cc))
+    while (i < length && get_cabac_bypass(&s->HEVClc->cc))
         i++;
     return i;
 }
 
 int ff_hevc_sao_offset_sign_decode(HEVCContext *s)
 {
-    return get_cabac_bypass(&s->HEVClc.cc);
+    return get_cabac_bypass(&s->HEVClc->cc);
 }
 
 int ff_hevc_sao_eo_class_decode(HEVCContext *s)
 {
-    int ret = (get_cabac_bypass(&s->HEVClc.cc) << 1);
-    ret    |=  get_cabac_bypass(&s->HEVClc.cc);
+    int ret = get_cabac_bypass(&s->HEVClc->cc) << 1;
+    ret    |= get_cabac_bypass(&s->HEVClc->cc);
     return ret;
 }
 
 int ff_hevc_end_of_slice_flag_decode(HEVCContext *s)
 {
-    return get_cabac_terminate(&s->HEVClc.cc);
+    return get_cabac_terminate(&s->HEVClc->cc);
 }
 
 int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
@@ -650,15 +651,15 @@ int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
 
 int ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb)
 {
-    int pic_width_in_ctb = s->sps->width >> s->sps->log2_min_coding_block_size;
+    int min_cb_width = s->sps->min_cb_width;
     int inc = 0;
     int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
     int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
 
-    if (s->HEVClc.ctb_left_flag || x0b)
-        inc = SAMPLE_CTB(s->skip_flag, x_cb-1, y_cb);
-    if (s->HEVClc.ctb_up_flag || y0b)
-        inc += SAMPLE_CTB(s->skip_flag, x_cb, y_cb-1);
+    if (s->HEVClc->ctb_left_flag || x0b)
+        inc = !!SAMPLE_CTB(s->skip_flag, x_cb - 1, y_cb);
+    if (s->HEVClc->ctb_up_flag || y0b)
+        inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1);
 
     return GET_CABAC(elem_offset[SKIP_FLAG] + inc);
 }
@@ -675,7 +676,7 @@ int ff_hevc_cu_qp_delta_abs(HEVCContext *s)
     }
     if (prefix_val >= 5) {
         int k = 0;
-        while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc.cc)) {
+        while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
             suffix_val += 1 << k;
             k++;
         }
@@ -683,14 +684,14 @@ int ff_hevc_cu_qp_delta_abs(HEVCContext *s)
             av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
 
         while (k--)
-            suffix_val += get_cabac_bypass(&s->HEVClc.cc) << k;
+            suffix_val += get_cabac_bypass(&s->HEVClc->cc) << k;
     }
     return prefix_val + suffix_val;
 }
 
 int ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s)
 {
-    return get_cabac_bypass(&s->HEVClc.cc);
+    return get_cabac_bypass(&s->HEVClc->cc);
 }
 
 int ff_hevc_pred_mode_decode(HEVCContext *s)
@@ -701,18 +702,19 @@ int ff_hevc_pred_mode_decode(HEVCContext *s)
 int ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0)
 {
     int inc = 0, depth_left = 0, depth_top = 0;
-    int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
-    int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
-    int x_cb = x0 >> s->sps->log2_min_coding_block_size;
-    int y_cb = y0 >> s->sps->log2_min_coding_block_size;
+    int x0b  = x0 & ((1 << s->sps->log2_ctb_size) - 1);
+    int y0b  = y0 & ((1 << s->sps->log2_ctb_size) - 1);
+    int x_cb = x0 >> s->sps->log2_min_cb_size;
+    int y_cb = y0 >> s->sps->log2_min_cb_size;
 
-    if (s->HEVClc.ctb_left_flag || x0b)
-        depth_left = s->tab_ct_depth[(y_cb)*s->sps->min_cb_width + x_cb-1];
-    if (s->HEVClc.ctb_up_flag || y0b)
-        depth_top = s->tab_ct_depth[(y_cb-1)*s->sps->min_cb_width + x_cb];
+    if (s->HEVClc->ctb_left_flag || x0b)
+        depth_left = s->tab_ct_depth[(y_cb) * s->sps->min_cb_width + x_cb - 1];
+    if (s->HEVClc->ctb_up_flag || y0b)
+        depth_top = s->tab_ct_depth[(y_cb - 1) * s->sps->min_cb_width + x_cb];
 
     inc += (depth_left > ct_depth);
-    inc += (depth_top > ct_depth);
+    inc += (depth_top  > ct_depth);
+
     return GET_CABAC(elem_offset[SPLIT_CODING_UNIT_FLAG] + inc);
 }
 
@@ -720,8 +722,8 @@ int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
 {
     if (GET_CABAC(elem_offset[PART_MODE])) // 1
         return PART_2Nx2N;
-    if (log2_cb_size == s->sps->log2_min_coding_block_size) {
-        if (s->HEVClc.cu.pred_mode == MODE_INTRA) // 0
+    if (log2_cb_size == s->sps->log2_min_cb_size) {
+        if (s->HEVClc->cu.pred_mode == MODE_INTRA) // 0
             return PART_NxN;
         if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01
             return PART_2NxN;
@@ -741,21 +743,21 @@ int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
     if (GET_CABAC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX
         if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 011
             return PART_2NxN;
-        if (get_cabac_bypass(&s->HEVClc.cc)) // 0101
+        if (get_cabac_bypass(&s->HEVClc->cc)) // 0101
             return PART_2NxnD;
         return PART_2NxnU; // 0100
     }
 
     if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 001
         return PART_Nx2N;
-    if (get_cabac_bypass(&s->HEVClc.cc)) // 0001
+    if (get_cabac_bypass(&s->HEVClc->cc)) // 0001
         return PART_nRx2N;
-    return  PART_nLx2N; // 0000
+    return PART_nLx2N;  // 0000
 }
 
 int ff_hevc_pcm_flag_decode(HEVCContext *s)
 {
-    return get_cabac_terminate(&s->HEVClc.cc);
+    return get_cabac_terminate(&s->HEVClc->cc);
 }
 
 int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
@@ -766,7 +768,7 @@ int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
 int ff_hevc_mpm_idx_decode(HEVCContext *s)
 {
     int i = 0;
-    while (i < 2 && get_cabac_bypass(&s->HEVClc.cc))
+    while (i < 2 && get_cabac_bypass(&s->HEVClc->cc))
         i++;
     return i;
 }
@@ -774,10 +776,10 @@ int ff_hevc_mpm_idx_decode(HEVCContext *s)
 int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s)
 {
     int i;
-    int value = get_cabac_bypass(&s->HEVClc.cc);
+    int value = get_cabac_bypass(&s->HEVClc->cc);
 
     for (i = 0; i < 4; i++)
-        value = (value << 1) | get_cabac_bypass(&s->HEVClc.cc);
+        value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
     return value;
 }
 
@@ -787,8 +789,8 @@ int ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s)
     if (!GET_CABAC(elem_offset[INTRA_CHROMA_PRED_MODE]))
         return 4;
 
-    ret  = (get_cabac_bypass(&s->HEVClc.cc) << 1);
-    ret |=  get_cabac_bypass(&s->HEVClc.cc);
+    ret  = get_cabac_bypass(&s->HEVClc->cc) << 1;
+    ret |= get_cabac_bypass(&s->HEVClc->cc);
     return ret;
 }
 
@@ -797,7 +799,7 @@ int ff_hevc_merge_idx_decode(HEVCContext *s)
     int i = GET_CABAC(elem_offset[MERGE_IDX]);
 
     if (i != 0) {
-        while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&s->HEVClc.cc))
+        while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&s->HEVClc->cc))
             i++;
     }
     return i;
@@ -812,7 +814,7 @@ int ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH)
 {
     if (nPbW + nPbH == 12)
         return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
-    if (GET_CABAC(elem_offset[INTER_PRED_IDC] + s->HEVClc.ct.depth))
+    if (GET_CABAC(elem_offset[INTER_PRED_IDC] + s->HEVClc->ct.depth))
         return PRED_BI;
 
     return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4);
@@ -827,7 +829,7 @@ int ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx)
     while (i < max_ctx && GET_CABAC(elem_offset[REF_IDX_L0] + i))
         i++;
     if (i == 2) {
-        while (i < max && get_cabac_bypass(&s->HEVClc.cc))
+        while (i < max && get_cabac_bypass(&s->HEVClc->cc))
             i++;
     }
 
@@ -859,20 +861,20 @@ static av_always_inline int mvd_decode(HEVCContext *s)
     int ret = 2;
     int k = 1;
 
-    while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc.cc)) {
+    while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
         ret += 1 << k;
         k++;
     }
     if (k == CABAC_MAX_BIN)
         av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
     while (k--)
-        ret += get_cabac_bypass(&s->HEVClc.cc) << k;
-    return get_cabac_bypass_sign(&s->HEVClc.cc, -ret);
+        ret += get_cabac_bypass(&s->HEVClc->cc) << k;
+    return get_cabac_bypass_sign(&s->HEVClc->cc, -ret);
 }
 
 static av_always_inline int mvd_sign_flag_decode(HEVCContext *s)
 {
-    return get_cabac_bypass_sign(&s->HEVClc.cc, -1);
+    return get_cabac_bypass_sign(&s->HEVClc->cc, -1);
 }
 
 int ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size)
@@ -929,10 +931,10 @@ static av_always_inline int last_significant_coeff_suffix_decode(HEVCContext *s,
 {
     int i;
     int length = (last_significant_coeff_prefix >> 1) - 1;
-    int value = get_cabac_bypass(&s->HEVClc.cc);
+    int value = get_cabac_bypass(&s->HEVClc->cc);
 
     for (i = 1; i < length; i++)
-        value = (value << 1) | get_cabac_bypass(&s->HEVClc.cc);
+        value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc);
     return value;
 }
 
@@ -988,11 +990,10 @@ static av_always_inline int significant_coeff_flag_decode(HEVCContext *s, int c_
         }
     }
 
-    if (c_idx == 0) {
+    if (c_idx == 0)
         inc = sig_ctx;
-    } else {
+    else
         inc = sig_ctx + 27;
-    }
 
     return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + inc);
 }
@@ -1021,18 +1022,18 @@ static av_always_inline int coeff_abs_level_remaining_decode(HEVCContext *s, int
     int last_coeff_abs_level_remaining;
     int i;
 
-    while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc.cc))
+    while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc))
         prefix++;
     if (prefix == CABAC_MAX_BIN)
         av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
     if (prefix < 3) {
         for (i = 0; i < rc_rice_param; i++)
-            suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc.cc);
+            suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
         last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
     } else {
         int prefix_minus3 = prefix - 3;
         for (i = 0; i < prefix_minus3 + rc_rice_param; i++)
-            suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc.cc);
+            suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc);
         last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
                                               << rc_rice_param) + suffix;
     }
@@ -1045,7 +1046,7 @@ static av_always_inline int coeff_sign_flag_decode(HEVCContext *s, uint8_t nb)
     int ret = 0;
 
     for (i = 0; i < nb; i++)
-        ret = (ret << 1) | get_cabac_bypass(&s->HEVClc.cc);
+        ret = (ret << 1) | get_cabac_bypass(&s->HEVClc->cc);
     return ret;
 }
 
@@ -1058,7 +1059,7 @@ void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
         x_c = (scan_x_cg[offset >> 4] << 2) + scan_x_off[n];    \
         y_c = (scan_y_cg[offset >> 4] << 2) + scan_y_off[n];    \
     } while (0)
-    HEVCLocalContext *lc = &s->HEVClc;
+    HEVCLocalContext *lc = s->HEVClc;
     int transform_skip_flag = 0;
 
     int last_significant_coeff_x, last_significant_coeff_y;
@@ -1113,7 +1114,7 @@ void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
             else
                 offset = s->pps->cr_qp_offset + s->sh.slice_cr_qp_offset;
 
-            qp_i = av_clip_c(qp_y + offset, - s->sps->qp_bd_offset, 57);
+            qp_i = av_clip(qp_y + offset, - s->sps->qp_bd_offset, 57);
             if (qp_i < 30)
                 qp = qp_i;
             else if (qp_i > 43)
@@ -1131,7 +1132,7 @@ void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
         dc_scale = 16;
 
         if (s->sps->scaling_list_enable_flag) {
-            const ScalingList *sl = s->pps->pps_scaling_list_data_present_flag ?
+            const ScalingList *sl = s->pps->scaling_list_data_present_flag ?
             &s->pps->scaling_list : &s->sps->scaling_list;
             int matrix_id = lc->cu.pred_mode != MODE_INTRA;
 
@@ -1387,14 +1388,27 @@ void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0,
             s->hevcdsp.transform_skip(dst, coeffs, stride);
         else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2)
             s->hevcdsp.transform_4x4_luma_add(dst, coeffs, stride);
-        else
-            s->hevcdsp.transform_add[log2_trafo_size-2](dst, coeffs, stride);
+        else {
+            int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
+            if (max_xy == 0)
+                s->hevcdsp.transform_dc_add[log2_trafo_size-2](dst, coeffs, stride);
+            else {
+                int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
+                if (max_xy < 4)
+                    col_limit = FFMIN(4, col_limit);
+                else if (max_xy < 8)
+                    col_limit = FFMIN(8, col_limit);
+                else if (max_xy < 12)
+                    col_limit = FFMIN(24, col_limit);
+                s->hevcdsp.transform_add[log2_trafo_size-2](dst, coeffs, stride, col_limit);
+            }
+        }
     }
 }
 
 void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
 {
-    HEVCLocalContext *lc = &s->HEVClc;
+    HEVCLocalContext *lc = s->HEVClc;
     int x = abs_mvd_greater0_flag_decode(s);
     int y = abs_mvd_greater0_flag_decode(s);
 
@@ -1404,15 +1418,15 @@ void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
         y += abs_mvd_greater1_flag_decode(s);
 
     switch (x) {
-        case 2: lc->pu.mvd.x = mvd_decode(s);           break;
-        case 1: lc->pu.mvd.x = mvd_sign_flag_decode(s); break;
-        case 0: lc->pu.mvd.x = 0;                       break;
+    case 2: lc->pu.mvd.x = mvd_decode(s);           break;
+    case 1: lc->pu.mvd.x = mvd_sign_flag_decode(s); break;
+    case 0: lc->pu.mvd.x = 0;                       break;
     }
 
     switch (y) {
-        case 2: lc->pu.mvd.y = mvd_decode(s);           break;
-        case 1: lc->pu.mvd.y = mvd_sign_flag_decode(s); break;
-        case 0: lc->pu.mvd.y = 0;                       break;
+    case 2: lc->pu.mvd.y = mvd_decode(s);           break;
+    case 1: lc->pu.mvd.y = mvd_sign_flag_decode(s); break;
+    case 0: lc->pu.mvd.y = 0;                       break;
     }
 }