FFmpeg
cabac.c
Go to the documentation of this file.
1 /*
2  * HEVC CABAC decoding
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
5  * Copyright (C) 2012 - 2013 Gildas Cocherel
6  *
7  * This file is part of FFmpeg.
8  *
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.
13  *
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.
18  *
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
22  */
23 
24 #include "libavutil/attributes.h"
25 #include "libavutil/common.h"
26 
28 #include "data.h"
29 #include "hevc.h"
30 #include "hevcdec.h"
31 
32 #define CABAC_MAX_BIN 31
33 
34 // ELEM(NAME, NUM_BINS)
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) \
45  ELEM(SKIP_FLAG, 3) \
46  ELEM(CU_QP_DELTA, 3) \
47  ELEM(PRED_MODE_FLAG, 1) \
48  ELEM(PART_MODE, 4) \
49  ELEM(PCM_FLAG, 0) \
50  ELEM(PREV_INTRA_LUMA_PRED_FLAG, 1) \
51  ELEM(MPM_IDX, 0) \
52  ELEM(REM_INTRA_LUMA_PRED_MODE, 0) \
53  ELEM(INTRA_CHROMA_PRED_MODE, 2) \
54  ELEM(MERGE_FLAG, 1) \
55  ELEM(MERGE_IDX, 1) \
56  ELEM(INTER_PRED_IDC, 5) \
57  ELEM(REF_IDX_L0, 2) \
58  ELEM(REF_IDX_L1, 2) \
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) \
66  ELEM(CBF_LUMA, 2) \
67  ELEM(CBF_CB_CR, 5) \
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) \
85 
86 /**
87  * Offset to ctxIdx 0 in init_values and states.
88  */
89 enum {
90 #define OFFSET(NAME, NUM_BINS) \
91  NAME ## _OFFSET, \
92  NAME ## _END = NAME ## _OFFSET + NUM_BINS - 1,
94 };
95 
96 #define CNU 154
97 /**
98  * Indexed by init_type
99  */
100 static const uint8_t init_values[3][HEVC_CONTEXTS] = {
101  { // sao_merge_flag
102  153,
103  // sao_type_idx
104  200,
105  // split_coding_unit_flag
106  139, 141, 157,
107  // cu_transquant_bypass_flag
108  154,
109  // skip_flag
110  CNU, CNU, CNU,
111  // cu_qp_delta
112  154, 154, 154,
113  // pred_mode
114  CNU,
115  // part_mode
116  184, CNU, CNU, CNU,
117  // prev_intra_luma_pred_mode
118  184,
119  // intra_chroma_pred_mode
120  63, 139,
121  // merge_flag
122  CNU,
123  // merge_idx
124  CNU,
125  // inter_pred_idc
126  CNU, CNU, CNU, CNU, CNU,
127  // ref_idx_l0
128  CNU, CNU,
129  // ref_idx_l1
130  CNU, CNU,
131  // abs_mvd_greater1_flag
132  CNU, CNU,
133  // abs_mvd_greater1_flag
134  CNU, CNU,
135  // mvp_lx_flag
136  CNU,
137  // no_residual_data_flag
138  CNU,
139  // split_transform_flag
140  153, 138, 138,
141  // cbf_luma
142  111, 141,
143  // cbf_cb, cbf_cr
144  94, 138, 182, 154, 154,
145  // transform_skip_flag
146  139, 139,
147  // explicit_rdpcm_flag
148  139, 139,
149  // explicit_rdpcm_dir_flag
150  139, 139,
151  // last_significant_coeff_x_prefix
152  110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
153  79, 108, 123, 63,
154  // last_significant_coeff_y_prefix
155  110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
156  79, 108, 123, 63,
157  // significant_coeff_group_flag
158  91, 171, 134, 141,
159  // significant_coeff_flag
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,
163  141, 111,
164  // coeff_abs_level_greater1_flag
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,
167  // coeff_abs_level_greater2_flag
168  138, 153, 136, 167, 152, 152,
169  // log2_res_scale_abs
170  154, 154, 154, 154, 154, 154, 154, 154,
171  // res_scale_sign_flag
172  154, 154,
173  // cu_chroma_qp_offset_flag
174  154,
175  // cu_chroma_qp_offset_idx
176  154,
177  },
178  { // sao_merge_flag
179  153,
180  // sao_type_idx
181  185,
182  // split_coding_unit_flag
183  107, 139, 126,
184  // cu_transquant_bypass_flag
185  154,
186  // skip_flag
187  197, 185, 201,
188  // cu_qp_delta
189  154, 154, 154,
190  // pred_mode
191  149,
192  // part_mode
193  154, 139, 154, 154,
194  // prev_intra_luma_pred_mode
195  154,
196  // intra_chroma_pred_mode
197  152, 139,
198  // merge_flag
199  110,
200  // merge_idx
201  122,
202  // inter_pred_idc
203  95, 79, 63, 31, 31,
204  // ref_idx_l0
205  153, 153,
206  // ref_idx_l1
207  153, 153,
208  // abs_mvd_greater1_flag
209  140, 198,
210  // abs_mvd_greater1_flag
211  140, 198,
212  // mvp_lx_flag
213  168,
214  // no_residual_data_flag
215  79,
216  // split_transform_flag
217  124, 138, 94,
218  // cbf_luma
219  153, 111,
220  // cbf_cb, cbf_cr
221  149, 107, 167, 154, 154,
222  // transform_skip_flag
223  139, 139,
224  // explicit_rdpcm_flag
225  139, 139,
226  // explicit_rdpcm_dir_flag
227  139, 139,
228  // last_significant_coeff_x_prefix
229  125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
230  94, 108, 123, 108,
231  // last_significant_coeff_y_prefix
232  125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
233  94, 108, 123, 108,
234  // significant_coeff_group_flag
235  121, 140, 61, 154,
236  // significant_coeff_flag
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,
240  140, 140,
241  // coeff_abs_level_greater1_flag
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,
244  // coeff_abs_level_greater2_flag
245  107, 167, 91, 122, 107, 167,
246  // log2_res_scale_abs
247  154, 154, 154, 154, 154, 154, 154, 154,
248  // res_scale_sign_flag
249  154, 154,
250  // cu_chroma_qp_offset_flag
251  154,
252  // cu_chroma_qp_offset_idx
253  154,
254  },
255  { // sao_merge_flag
256  153,
257  // sao_type_idx
258  160,
259  // split_coding_unit_flag
260  107, 139, 126,
261  // cu_transquant_bypass_flag
262  154,
263  // skip_flag
264  197, 185, 201,
265  // cu_qp_delta
266  154, 154, 154,
267  // pred_mode
268  134,
269  // part_mode
270  154, 139, 154, 154,
271  // prev_intra_luma_pred_mode
272  183,
273  // intra_chroma_pred_mode
274  152, 139,
275  // merge_flag
276  154,
277  // merge_idx
278  137,
279  // inter_pred_idc
280  95, 79, 63, 31, 31,
281  // ref_idx_l0
282  153, 153,
283  // ref_idx_l1
284  153, 153,
285  // abs_mvd_greater1_flag
286  169, 198,
287  // abs_mvd_greater1_flag
288  169, 198,
289  // mvp_lx_flag
290  168,
291  // no_residual_data_flag
292  79,
293  // split_transform_flag
294  224, 167, 122,
295  // cbf_luma
296  153, 111,
297  // cbf_cb, cbf_cr
298  149, 92, 167, 154, 154,
299  // transform_skip_flag
300  139, 139,
301  // explicit_rdpcm_flag
302  139, 139,
303  // explicit_rdpcm_dir_flag
304  139, 139,
305  // last_significant_coeff_x_prefix
306  125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
307  79, 108, 123, 93,
308  // last_significant_coeff_y_prefix
309  125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
310  79, 108, 123, 93,
311  // significant_coeff_group_flag
312  121, 140, 61, 154,
313  // significant_coeff_flag
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,
317  140, 140,
318  // coeff_abs_level_greater1_flag
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,
321  // coeff_abs_level_greater2_flag
322  107, 167, 91, 107, 107, 167,
323  // log2_res_scale_abs
324  154, 154, 154, 154, 154, 154, 154, 154,
325  // res_scale_sign_flag
326  154, 154,
327  // cu_chroma_qp_offset_flag
328  154,
329  // cu_chroma_qp_offset_idx
330  154,
331  },
332 };
333 
334 static const uint8_t scan_1x1[1] = {
335  0,
336 };
337 
338 static const uint8_t horiz_scan2x2_x[4] = {
339  0, 1, 0, 1,
340 };
341 
342 static const uint8_t horiz_scan2x2_y[4] = {
343  0, 0, 1, 1
344 };
345 
346 static const uint8_t horiz_scan4x4_x[16] = {
347  0, 1, 2, 3,
348  0, 1, 2, 3,
349  0, 1, 2, 3,
350  0, 1, 2, 3,
351 };
352 
353 static const uint8_t horiz_scan4x4_y[16] = {
354  0, 0, 0, 0,
355  1, 1, 1, 1,
356  2, 2, 2, 2,
357  3, 3, 3, 3,
358 };
359 
360 static const uint8_t horiz_scan8x8_inv[8][8] = {
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, },
369 };
370 
371 static const uint8_t diag_scan2x2_x[4] = {
372  0, 0, 1, 1,
373 };
374 
375 static const uint8_t diag_scan2x2_y[4] = {
376  0, 1, 0, 1,
377 };
378 
379 static const uint8_t diag_scan2x2_inv[2][2] = {
380  { 0, 2, },
381  { 1, 3, },
382 };
383 
384 static const uint8_t diag_scan4x4_inv[4][4] = {
385  { 0, 2, 5, 9, },
386  { 1, 4, 8, 12, },
387  { 3, 7, 11, 14, },
388  { 6, 10, 13, 15, },
389 };
390 
391 static const uint8_t diag_scan8x8_inv[8][8] = {
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, },
400 };
401 
403  int ctb_addr_ts)
404 {
405  const HEVCSPS *const sps = pps->sps;
406  if (pps->entropy_coding_sync_enabled_flag &&
407  (ctb_addr_ts % sps->ctb_width == 2 ||
408  (sps->ctb_width == 2 &&
409  ctb_addr_ts % sps->ctb_width == 0))) {
411  if (sps->persistent_rice_adaptation_enabled) {
413  }
414  }
415 }
416 
417 static void load_states(HEVCLocalContext *lc, const HEVCSPS *sps)
418 {
420  if (sps->persistent_rice_adaptation_enabled) {
422  }
423 }
424 
426 {
427  return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0;
428 }
429 
431 {
432  int init_type = 2 - s->sh.slice_type;
433  int i;
434 
435  if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I)
436  init_type ^= 3;
437 
438  for (i = 0; i < HEVC_CONTEXTS; i++) {
439  int init_value = init_values[init_type][i];
440  int m = (init_value >> 4) * 5 - 45;
441  int n = ((init_value & 15) << 3) - 16;
442  int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127;
443 
444  pre ^= pre >> 31;
445  if (pre > 124)
446  pre = 124 + (pre & 1);
447  lc->cabac_state[i] = pre;
448  }
449 
450  for (i = 0; i < 4; i++)
451  lc->stat_coeff[i] = 0;
452 }
453 
455  int ctb_addr_ts, const uint8_t *data, size_t size,
456  int is_wpp)
457 {
458  const HEVCContext *const s = lc->parent;
459  const HEVCSPS *const sps = pps->sps;
460 
461  if (ctb_addr_ts == pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) {
462  int ret = ff_init_cabac_decoder(&lc->cc, data, size);
463  if (ret < 0)
464  return ret;
465  if (s->sh.dependent_slice_segment_flag == 0 ||
466  (pps->tiles_enabled_flag &&
467  pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]))
468  cabac_init_state(lc, s);
469 
470  if (!s->sh.first_slice_in_pic_flag &&
471  pps->entropy_coding_sync_enabled_flag) {
472  if (ctb_addr_ts % sps->ctb_width == 0) {
473  if (sps->ctb_width == 1)
474  cabac_init_state(lc, s);
475  else if (s->sh.dependent_slice_segment_flag == 1)
476  load_states(lc, sps);
477  }
478  }
479  } else {
480  if (pps->tiles_enabled_flag &&
481  pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) {
482  int ret;
483  if (!is_wpp)
484  ret = cabac_reinit(lc);
485  else {
487  }
488  if (ret < 0)
489  return ret;
490  cabac_init_state(lc, s);
491  }
492  if (pps->entropy_coding_sync_enabled_flag) {
493  if (ctb_addr_ts % sps->ctb_width == 0) {
494  int ret;
495  get_cabac_terminate(&lc->cc);
496  if (!is_wpp)
497  ret = cabac_reinit(lc);
498  else {
500  }
501  if (ret < 0)
502  return ret;
503 
504  if (sps->ctb_width == 1)
505  cabac_init_state(lc, s);
506  else
507  load_states(lc, sps);
508  }
509  }
510  }
511  return 0;
512 }
513 
514 #define GET_CABAC(ctx) get_cabac(&lc->cc, &lc->cabac_state[ctx])
515 
517 {
518  return GET_CABAC(SAO_MERGE_FLAG_OFFSET);
519 }
520 
522 {
523  if (!GET_CABAC(SAO_TYPE_IDX_OFFSET))
524  return 0;
525 
526  if (!get_cabac_bypass(&lc->cc))
527  return SAO_BAND;
528  return SAO_EDGE;
529 }
530 
532 {
533  int i;
534  int value = get_cabac_bypass(&lc->cc);
535 
536  for (i = 0; i < 4; i++)
537  value = (value << 1) | get_cabac_bypass(&lc->cc);
538  return value;
539 }
540 
542 {
543  int i = 0;
544  int length = (1 << (FFMIN(bit_depth, 10) - 5)) - 1;
545 
546  while (i < length && get_cabac_bypass(&lc->cc))
547  i++;
548  return i;
549 }
550 
552 {
553  return get_cabac_bypass(&lc->cc);
554 }
555 
557 {
558  int ret = get_cabac_bypass(&lc->cc) << 1;
559  ret |= get_cabac_bypass(&lc->cc);
560  return ret;
561 }
562 
564 {
565  return get_cabac_terminate(&lc->cc);
566 }
567 
569 {
570  return GET_CABAC(CU_TRANSQUANT_BYPASS_FLAG_OFFSET);
571 }
572 
573 int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, uint8_t *skip_flag,
574  int x0, int y0, int x_cb, int y_cb, int min_cb_width)
575 {
576  int inc = 0;
577 
578  if (lc->ctb_left_flag || x0)
579  inc = !!SAMPLE_CTB(skip_flag, x_cb - 1, y_cb);
580  if (lc->ctb_up_flag || y0)
581  inc += !!SAMPLE_CTB(skip_flag, x_cb, y_cb - 1);
582 
583  return GET_CABAC(SKIP_FLAG_OFFSET + inc);
584 }
585 
587 {
588  int prefix_val = 0;
589  int suffix_val = 0;
590  int inc = 0;
591 
592  while (prefix_val < 5 && GET_CABAC(CU_QP_DELTA_OFFSET + inc)) {
593  prefix_val++;
594  inc = 1;
595  }
596  if (prefix_val >= 5) {
597  int k = 0;
598  while (k < 7 && get_cabac_bypass(&lc->cc)) {
599  suffix_val += 1 << k;
600  k++;
601  }
602  if (k == 7) {
603  av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
604  return AVERROR_INVALIDDATA;
605  }
606 
607  while (k--)
608  suffix_val += get_cabac_bypass(&lc->cc) << k;
609  }
610  return prefix_val + suffix_val;
611 }
612 
614 {
615  return get_cabac_bypass(&lc->cc);
616 }
617 
619 {
620  return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG_OFFSET);
621 }
622 
623 int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc, int chroma_qp_offset_list_len_minus1)
624 {
625  int c_max= FFMAX(5, chroma_qp_offset_list_len_minus1);
626  int i = 0;
627 
628  while (i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX_OFFSET))
629  i++;
630 
631  return i;
632 }
633 
635 {
636  return GET_CABAC(PRED_MODE_FLAG_OFFSET);
637 }
638 
640  const HEVCSPS *sps,
641  int ct_depth, int x0, int y0)
642 {
643  int inc = 0, depth_left = 0, depth_top = 0;
644  int x0b = av_zero_extend(x0, sps->log2_ctb_size);
645  int y0b = av_zero_extend(y0, sps->log2_ctb_size);
646  int x_cb = x0 >> sps->log2_min_cb_size;
647  int y_cb = y0 >> sps->log2_min_cb_size;
648 
649  if (lc->ctb_left_flag || x0b)
650  depth_left = tab_ct_depth[(y_cb) * sps->min_cb_width + x_cb - 1];
651  if (lc->ctb_up_flag || y0b)
652  depth_top = tab_ct_depth[(y_cb - 1) * sps->min_cb_width + x_cb];
653 
654  inc += (depth_left > ct_depth);
655  inc += (depth_top > ct_depth);
656 
657  return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc);
658 }
659 
660 int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
661 {
662  if (GET_CABAC(PART_MODE_OFFSET)) // 1
663  return PART_2Nx2N;
664  if (log2_cb_size == sps->log2_min_cb_size) {
665  if (lc->cu.pred_mode == MODE_INTRA) // 0
666  return PART_NxN;
667  if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
668  return PART_2NxN;
669  if (log2_cb_size == 3) // 00
670  return PART_Nx2N;
671  if (GET_CABAC(PART_MODE_OFFSET + 2)) // 001
672  return PART_Nx2N;
673  return PART_NxN; // 000
674  }
675 
676  if (!sps->amp_enabled) {
677  if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01
678  return PART_2NxN;
679  return PART_Nx2N;
680  }
681 
682  if (GET_CABAC(PART_MODE_OFFSET + 1)) { // 01X, 01XX
683  if (GET_CABAC(PART_MODE_OFFSET + 3)) // 011
684  return PART_2NxN;
685  if (get_cabac_bypass(&lc->cc)) // 0101
686  return PART_2NxnD;
687  return PART_2NxnU; // 0100
688  }
689 
690  if (GET_CABAC(PART_MODE_OFFSET + 3)) // 001
691  return PART_Nx2N;
692  if (get_cabac_bypass(&lc->cc)) // 0001
693  return PART_nRx2N;
694  return PART_nLx2N; // 0000
695 }
696 
698 {
699  return get_cabac_terminate(&lc->cc);
700 }
701 
703 {
704  return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET);
705 }
706 
708 {
709  int i = 0;
710  while (i < 2 && get_cabac_bypass(&lc->cc))
711  i++;
712  return i;
713 }
714 
716 {
717  int i;
718  int value = get_cabac_bypass(&lc->cc);
719 
720  for (i = 0; i < 4; i++)
721  value = (value << 1) | get_cabac_bypass(&lc->cc);
722  return value;
723 }
724 
726 {
727  int ret;
728  if (!GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET))
729  return 4;
730 
731  ret = get_cabac_bypass(&lc->cc) << 1;
732  ret |= get_cabac_bypass(&lc->cc);
733  return ret;
734 }
735 
737 {
738  int i = GET_CABAC(MERGE_IDX_OFFSET);
739 
740  if (i != 0) {
741  while (i < lc->parent->sh.max_num_merge_cand-1 && get_cabac_bypass(&lc->cc))
742  i++;
743  }
744  return i;
745 }
746 
748 {
749  return GET_CABAC(MERGE_FLAG_OFFSET);
750 }
751 
753 {
754  if (nPbW + nPbH == 12)
755  return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
756  if (GET_CABAC(INTER_PRED_IDC_OFFSET + lc->ct_depth))
757  return PRED_BI;
758 
759  return GET_CABAC(INTER_PRED_IDC_OFFSET + 4);
760 }
761 
762 int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
763 {
764  int i = 0;
765  int max = num_ref_idx_lx - 1;
766  int max_ctx = FFMIN(max, 2);
767 
768  while (i < max_ctx && GET_CABAC(REF_IDX_L0_OFFSET + i))
769  i++;
770  if (i == 2) {
771  while (i < max && get_cabac_bypass(&lc->cc))
772  i++;
773  }
774 
775  return i;
776 }
777 
779 {
780  return GET_CABAC(MVP_LX_FLAG_OFFSET);
781 }
782 
784 {
785  return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET);
786 }
787 
789 {
790  return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET);
791 }
792 
794 {
795  return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1);
796 }
797 
799 {
800  int ret = 2;
801  int k = 1;
802 
803  while (k < CABAC_MAX_BIN && get_cabac_bypass(&lc->cc)) {
804  ret += 1U << k;
805  k++;
806  }
807  if (k == CABAC_MAX_BIN) {
808  av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
809  return 0;
810  }
811  while (k--)
812  ret += get_cabac_bypass(&lc->cc) << k;
813  return get_cabac_bypass_sign(&lc->cc, -ret);
814 }
815 
817 {
818  return get_cabac_bypass_sign(&lc->cc, -1);
819 }
820 
822 {
823  return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size);
824 }
825 
827 {
828  return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth);
829 }
830 
831 int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
832 {
833  return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth);
834 }
835 
837 {
838  return GET_CABAC(TRANSFORM_SKIP_FLAG_OFFSET + !!c_idx);
839 }
840 
842 {
843  return GET_CABAC(EXPLICIT_RDPCM_FLAG_OFFSET + !!c_idx);
844 }
845 
847 {
848  return GET_CABAC(EXPLICIT_RDPCM_DIR_FLAG_OFFSET + !!c_idx);
849 }
850 
852 {
853  int i =0;
854 
855  while (i < 4 && GET_CABAC(LOG2_RES_SCALE_ABS_OFFSET + 4 * idx + i))
856  i++;
857 
858  return i;
859 }
860 
862 {
863  return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx);
864 }
865 
867  int log2_size, int *last_scx_prefix, int *last_scy_prefix)
868 {
869  int i = 0;
870  int max = (log2_size << 1) - 1;
871  int ctx_offset, ctx_shift;
872 
873  if (!c_idx) {
874  ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2);
875  ctx_shift = (log2_size + 1) >> 2;
876  } else {
877  ctx_offset = 15;
878  ctx_shift = log2_size - 2;
879  }
880  while (i < max &&
881  GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
882  i++;
883  *last_scx_prefix = i;
884 
885  i = 0;
886  while (i < max &&
887  GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset))
888  i++;
889  *last_scy_prefix = i;
890 }
891 
893  int last_significant_coeff_prefix)
894 {
895  int i;
896  int length = (last_significant_coeff_prefix >> 1) - 1;
897  int value = get_cabac_bypass(&lc->cc);
898 
899  for (i = 1; i < length; i++)
900  value = (value << 1) | get_cabac_bypass(&lc->cc);
901  return value;
902 }
903 
905 {
906  int inc;
907 
908  inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0);
909 
910  return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc);
911 }
913  int offset, const uint8_t *ctx_idx_map)
914 {
915  int inc = ctx_idx_map[n] + offset;
916  return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc);
917 }
918 
920 {
921  return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + offset);
922 }
923 
925 {
926 
927  if (c_idx > 0)
928  inc += 16;
929 
930  return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc);
931 }
932 
934 {
935  if (c_idx > 0)
936  inc += 4;
937 
938  return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET + inc);
939 }
940 
941 /* a run of bypass bins is the quotient of the offset by range << 17 */
942 static int cabac_bypass_bits(CABACContext *c, int n)
943 {
944  int avail = CABAC_BITS - ff_ctz(c->low);
945  uint64_t x, r = (uint64_t)c->range << (CABAC_BITS + 1);
946  const uint8_t *bytestream = c->bytestream;
947 
948  if (n < avail) {
949  x = (uint64_t)c->low << n;
950  } else {
951  int fill = (bytestream[0] << 9) + (bytestream[1] << 1) - CABAC_MASK;
952 
953  x = (uint64_t)((((int64_t)c->low << avail) + fill)) << (n - avail);
954 #if !UNCHECKED_BITSTREAM_READER
955  if (bytestream < c->bytestream_end)
956 #endif
957  bytestream += CABAC_BITS / 8;
958  }
959 
960  if (x < r << n) {
961  c->low = x % r;
962  c->bytestream = bytestream;
963  return x / r;
964  } else {
965  int ret = 0;
966 
967  for (int i = 0; i < n; i++)
968  ret = (ret << 1) | get_cabac_bypass(c);
969  return ret;
970  }
971 }
972 
973 /* leading ones of the quotient, consumed only up to the first zero */
975 {
976  int prefix = 0;
977 
978  while (prefix < max) {
979  int avail = CABAC_BITS - ff_ctz(c->low);
980  int n = FFMIN(avail - 1, max - prefix);
981  uint64_t r = (uint64_t)c->range << (CABAC_BITS + 1);
982  uint64_t x = (uint64_t)c->low << n;
983  int q, t;
984 
985  if (n < 1 || x >= r << n) {
986  if (!get_cabac_bypass(c))
987  return prefix;
988  prefix++;
989  continue;
990  }
991 
992  q = x / r;
993  t = ~q & ((1 << n) - 1);
994  if (t) {
995  int p = n - 1 - av_log2(t);
996  int k = n - (p + 1);
997 
998  c->low = (x >> k) - ((uint64_t)(q >> k) * r);
999  return prefix + p;
1000  }
1001  c->low = x - (uint64_t)q * r;
1002  prefix += n;
1003  }
1004  return prefix;
1005 }
1006 
1008 {
1009  int prefix;
1010  int suffix = 0;
1011  int last_coeff_abs_level_remaining;
1012  int i;
1013 
1015 
1016  if (prefix < 3) {
1017  if (rc_rice_param > 2)
1018  suffix = cabac_bypass_bits(&lc->cc, rc_rice_param);
1019  else
1020  for (i = 0; i < rc_rice_param; i++)
1021  suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
1022  last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix;
1023  } else {
1024  int prefix_minus3 = prefix - 3;
1025  int k;
1026 
1027  if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) {
1028  av_log(lc->logctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix);
1029  return 0;
1030  }
1031 
1032  k = prefix_minus3 + rc_rice_param;
1033  if (k > 16) {
1034  suffix = cabac_bypass_bits(&lc->cc, 16) << (k - 16);
1035  suffix |= cabac_bypass_bits(&lc->cc, k - 16);
1036  } else if (k > 2) {
1037  suffix = cabac_bypass_bits(&lc->cc, k);
1038  } else {
1039  for (i = 0; i < k; i++)
1040  suffix = (suffix << 1) | get_cabac_bypass(&lc->cc);
1041  }
1042  last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1)
1043  << rc_rice_param) + suffix;
1044  }
1045  return last_coeff_abs_level_remaining;
1046 }
1047 
1049 {
1050  int i;
1051  int ret = 0;
1052 
1053  if (nb > 2)
1054  return cabac_bypass_bits(&lc->cc, nb);
1055 
1056  for (i = 0; i < nb; i++)
1057  ret = (ret << 1) | get_cabac_bypass(&lc->cc);
1058  return ret;
1059 }
1060 
1062  int x0, int y0,
1063  int log2_trafo_size, enum ScanType scan_idx,
1064  int c_idx)
1065 {
1066 #define GET_COORD(offset, n) \
1067  do { \
1068  x_c = (x_cg << 2) + scan_x_off[n]; \
1069  y_c = (y_cg << 2) + scan_y_off[n]; \
1070  } while (0)
1071  const HEVCContext *const s = lc->parent;
1072  const HEVCSPS *const sps = pps->sps;
1073  int transform_skip_flag = 0;
1074 
1075  int last_significant_coeff_x, last_significant_coeff_y;
1076  int last_scan_pos;
1077  int n_end;
1078  int num_coeff = 0;
1079  int greater1_ctx = 1;
1080 
1081  int num_last_subset;
1082  int max_xy, col_limit, clear_rows;
1083  int x_cg_last_sig, y_cg_last_sig;
1084 
1085  const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
1086 
1087  ptrdiff_t stride = s->cur_frame->f->linesize[c_idx];
1088  int hshift = sps->hshift[c_idx];
1089  int vshift = sps->vshift[c_idx];
1090  uint8_t *dst = &s->cur_frame->f->data[c_idx][(y0 >> vshift) * stride +
1091  ((x0 >> hshift) << sps->pixel_shift)];
1092  int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer);
1093  uint8_t significant_coeff_group_flag[8][8] = {{0}};
1094  int explicit_rdpcm_flag = 0;
1095  int explicit_rdpcm_dir_flag;
1096 
1097  int trafo_size = 1 << log2_trafo_size;
1098  int i;
1099  int qp,shift,add,scale,scale_m;
1100  static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
1101  const uint8_t *scale_matrix = NULL;
1102  uint8_t dc_scale;
1103  int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode :
1104  lc->tu.intra_pred_mode_c;
1105 
1106  // Derive QP for dequant
1108  static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 };
1109  static const uint8_t rem6[51 + 4 * 6 + 1] = {
1110  0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
1111  3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
1112  0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
1113  4, 5, 0, 1, 2, 3, 4, 5, 0, 1
1114  };
1115 
1116  static const uint8_t div6[51 + 4 * 6 + 1] = {
1117  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
1118  3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
1119  7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
1120  10, 10, 11, 11, 11, 11, 11, 11, 12, 12
1121  };
1122  int qp_y = lc->qp_y;
1123 
1124  if (pps->transform_skip_enabled_flag &&
1125  log2_trafo_size <= pps->log2_max_transform_skip_block_size) {
1126  transform_skip_flag = hevc_transform_skip_flag_decode(lc, c_idx);
1127  }
1128 
1129  if (c_idx == 0) {
1130  qp = qp_y + sps->qp_bd_offset;
1131  } else {
1132  int qp_i, offset;
1133 
1134  if (c_idx == 1)
1135  offset = pps->cb_qp_offset + s->sh.slice_cb_qp_offset +
1136  lc->tu.cu_qp_offset_cb;
1137  else
1138  offset = pps->cr_qp_offset + s->sh.slice_cr_qp_offset +
1139  lc->tu.cu_qp_offset_cr;
1140 
1141  qp_i = av_clip(qp_y + offset, - sps->qp_bd_offset, 57);
1142  if (sps->chroma_format_idc == 1) {
1143  if (qp_i < 30)
1144  qp = qp_i;
1145  else if (qp_i > 43)
1146  qp = qp_i - 6;
1147  else
1148  qp = qp_c[qp_i - 30];
1149  } else {
1150  if (qp_i > 51)
1151  qp = 51;
1152  else
1153  qp = qp_i;
1154  }
1155 
1156  qp += sps->qp_bd_offset;
1157  }
1158 
1159  shift = sps->bit_depth + log2_trafo_size - 5;
1160  add = 1 << (shift-1);
1161  scale = level_scale[rem6[qp]] << (div6[qp]);
1162  scale_m = 16; // default when no custom scaling lists.
1163  dc_scale = 16;
1164 
1165  if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1166  const ScalingList *sl = pps->scaling_list_data_present_flag ?
1167  &pps->scaling_list : &sps->scaling_list;
1168  int matrix_id = lc->cu.pred_mode != MODE_INTRA;
1169 
1170  matrix_id = 3 * matrix_id + c_idx;
1171 
1172  scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
1173  if (log2_trafo_size >= 4)
1174  dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1175  }
1176  } else {
1177  shift = 0;
1178  add = 0;
1179  scale = 0;
1180  dc_scale = 0;
1181  }
1182 
1183  if (lc->cu.pred_mode == MODE_INTER && sps->explicit_rdpcm_enabled &&
1184  (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1185  explicit_rdpcm_flag = explicit_rdpcm_flag_decode(lc, c_idx);
1186  if (explicit_rdpcm_flag) {
1187  explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(lc, c_idx);
1188  }
1189  }
1190 
1191  last_significant_coeff_xy_prefix_decode(lc, c_idx, log2_trafo_size,
1192  &last_significant_coeff_x, &last_significant_coeff_y);
1193 
1194  if (last_significant_coeff_x > 3) {
1195  int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_x);
1196  last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1197  (2 + (last_significant_coeff_x & 1)) +
1198  suffix;
1199  }
1200 
1201  if (last_significant_coeff_y > 3) {
1202  int suffix = last_significant_coeff_suffix_decode(lc, last_significant_coeff_y);
1203  last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1204  (2 + (last_significant_coeff_y & 1)) +
1205  suffix;
1206  }
1207 
1208  if (scan_idx == SCAN_VERT)
1209  FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1210 
1211  x_cg_last_sig = last_significant_coeff_x >> 2;
1212  y_cg_last_sig = last_significant_coeff_y >> 2;
1213 
1214  switch (scan_idx) {
1215  case SCAN_DIAG: {
1216  int last_x_c = last_significant_coeff_x & 3;
1217  int last_y_c = last_significant_coeff_y & 3;
1218 
1219  scan_x_off = ff_hevc_diag_scan4x4_x;
1220  scan_y_off = ff_hevc_diag_scan4x4_y;
1221  num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1222  if (trafo_size == 4) {
1223  scan_x_cg = scan_1x1;
1224  scan_y_cg = scan_1x1;
1225  } else if (trafo_size == 8) {
1226  num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1227  scan_x_cg = diag_scan2x2_x;
1228  scan_y_cg = diag_scan2x2_y;
1229  } else if (trafo_size == 16) {
1230  num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1231  scan_x_cg = ff_hevc_diag_scan4x4_x;
1232  scan_y_cg = ff_hevc_diag_scan4x4_y;
1233  } else { // trafo_size == 32
1234  num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1235  scan_x_cg = ff_hevc_diag_scan8x8_x;
1236  scan_y_cg = ff_hevc_diag_scan8x8_y;
1237  }
1238  break;
1239  }
1240  case SCAN_HORIZ:
1241  scan_x_cg = horiz_scan2x2_x;
1242  scan_y_cg = horiz_scan2x2_y;
1243  scan_x_off = horiz_scan4x4_x;
1244  scan_y_off = horiz_scan4x4_y;
1245  num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1246  break;
1247  default: //SCAN_VERT
1248  scan_x_cg = horiz_scan2x2_y;
1249  scan_y_cg = horiz_scan2x2_x;
1250  scan_x_off = horiz_scan4x4_y;
1251  scan_y_off = horiz_scan4x4_x;
1252  num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1253  break;
1254  }
1255  num_coeff++;
1256  num_last_subset = (num_coeff - 1) >> 4;
1257 
1258  max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1259  col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1260  if (max_xy < 4)
1261  col_limit = FFMIN(4, col_limit);
1262  else if (max_xy < 8)
1263  col_limit = FFMIN(8, col_limit);
1264  else if (max_xy < 12)
1265  col_limit = FFMIN(24, col_limit);
1266 
1267  // idct_dc reads coeffs[0] only and writes the whole block: no clear needed
1268  clear_rows = trafo_size;
1269  if (!lc->cu.cu_transquant_bypass_flag && !transform_skip_flag &&
1270  !(lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2)) {
1271  if (max_xy == 0)
1272  clear_rows = 0;
1273  }
1274  if (clear_rows)
1275  memset(coeffs, 0, clear_rows * trafo_size * sizeof(int16_t));
1276 
1277  for (i = num_last_subset; i >= 0; i--) {
1278  int n, m;
1279  int x_cg, y_cg, x_c, y_c, pos;
1280  int implicit_non_zero_coeff = 0;
1281  int64_t trans_coeff_level;
1282  int prev_sig = 0;
1283  int offset = i << 4;
1284  int rice_init = 0;
1285 
1286  uint8_t significant_coeff_flag_idx[16];
1287  uint8_t nb_significant_coeff_flag = 0;
1288 
1289  x_cg = scan_x_cg[i];
1290  y_cg = scan_y_cg[i];
1291 
1292  if ((i < num_last_subset) && (i > 0)) {
1293  int ctx_cg = 0;
1294  if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1295  ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1296  if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1297  ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1298 
1299  significant_coeff_group_flag[x_cg][y_cg] =
1300  significant_coeff_group_flag_decode(lc, c_idx, ctx_cg);
1301  implicit_non_zero_coeff = 1;
1302  } else {
1303  significant_coeff_group_flag[x_cg][y_cg] =
1304  ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1305  (x_cg == 0 && y_cg == 0));
1306  }
1307 
1308  last_scan_pos = num_coeff - offset - 1;
1309 
1310  if (i == num_last_subset) {
1311  n_end = last_scan_pos - 1;
1312  significant_coeff_flag_idx[0] = last_scan_pos;
1313  nb_significant_coeff_flag = 1;
1314  } else {
1315  n_end = 15;
1316  }
1317 
1318  if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1319  prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg];
1320  if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1321  prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1);
1322 
1323  if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) {
1324  // ctx_idx_map composed with the intra-CG scan, indexed by scan position
1325  static const uint8_t ctx_idx_map[3][5 * 16] = {
1326  { // SCAN_DIAG
1327  0, 2, 1, 6, 3, 4, 7, 6, 4, 5, 7, 8, 5, 8, 8, 8, // log2_trafo_size == 2
1328  1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0
1329  2, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, // prev_sig == 1
1330  2, 2, 1, 2, 1, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, // prev_sig == 2
1331  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // default
1332  },
1333  { // SCAN_HORIZ
1334  0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8,
1335  1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1336  2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1337  2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1338  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1339  },
1340  { // SCAN_VERT
1341  0, 2, 6, 7, 1, 3, 6, 7, 4, 4, 8, 8, 5, 5, 8, 8,
1342  1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1343  2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0,
1344  2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1345  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1346  },
1347  };
1348  const uint8_t *ctx_idx_map_p;
1349  int scf_offset = 0;
1350  int nb0;
1351  if (sps->transform_skip_context_enabled &&
1352  (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1353  ctx_idx_map_p = &ctx_idx_map[scan_idx][4 * 16];
1354  if (c_idx == 0) {
1355  scf_offset = 40;
1356  } else {
1357  scf_offset = 14 + 27;
1358  }
1359  } else {
1360  if (c_idx != 0)
1361  scf_offset = 27;
1362  if (log2_trafo_size == 2) {
1363  ctx_idx_map_p = &ctx_idx_map[scan_idx][0];
1364  } else {
1365  ctx_idx_map_p = &ctx_idx_map[scan_idx][(prev_sig + 1) << 4];
1366  if (c_idx == 0) {
1367  if ((x_cg > 0 || y_cg > 0))
1368  scf_offset += 3;
1369  if (log2_trafo_size == 3) {
1370  scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15;
1371  } else {
1372  scf_offset += 21;
1373  }
1374  } else {
1375  if (log2_trafo_size == 3)
1376  scf_offset += 9;
1377  else
1378  scf_offset += 12;
1379  }
1380  }
1381  }
1382  // the flag is a fresh bin: store always, advance conditionally
1383  nb0 = nb_significant_coeff_flag;
1384  for (n = n_end; n > 0; n--) {
1385  int sig = significant_coeff_flag_decode(lc, n, scf_offset, ctx_idx_map_p);
1386  significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1387  nb_significant_coeff_flag += sig;
1388  }
1389  if (nb_significant_coeff_flag != nb0)
1390  implicit_non_zero_coeff = 0;
1391  if (implicit_non_zero_coeff == 0) {
1392  if (sps->transform_skip_context_enabled &&
1393  (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) {
1394  if (c_idx == 0) {
1395  scf_offset = 42;
1396  } else {
1397  scf_offset = 16 + 27;
1398  }
1399  } else {
1400  if (i == 0) {
1401  if (c_idx == 0)
1402  scf_offset = 0;
1403  else
1404  scf_offset = 27;
1405  } else {
1406  scf_offset = 2 + scf_offset;
1407  }
1408  }
1409  significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1410  nb_significant_coeff_flag +=
1411  significant_coeff_flag_decode_0(lc, c_idx, scf_offset);
1412  } else {
1413  significant_coeff_flag_idx[nb_significant_coeff_flag] = 0;
1414  nb_significant_coeff_flag++;
1415  }
1416  }
1417 
1418  n_end = nb_significant_coeff_flag;
1419 
1420 
1421  if (n_end) {
1422  int first_nz_pos_in_cg;
1423  int last_nz_pos_in_cg;
1424  int c_rice_param = 0;
1425  int first_greater1_coeff_idx = -1;
1426  uint8_t coeff_abs_level_greater1_flag[8];
1427  uint16_t coeff_sign_flag;
1428  int sum_abs = 0;
1429  int sign_hidden;
1430  int sb_type;
1431  int gt1_mask = 0;
1432 
1433 
1434  // initialize first elem of coeff_bas_level_greater1_flag
1435  int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1436 
1437  if (sps->persistent_rice_adaptation_enabled) {
1438  if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag)
1439  sb_type = 2 * (c_idx == 0 ? 1 : 0);
1440  else
1441  sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1;
1442  c_rice_param = lc->stat_coeff[sb_type] / 4;
1443  }
1444 
1445  if (!(i == num_last_subset) && greater1_ctx == 0)
1446  ctx_set++;
1447  greater1_ctx = 1;
1448  last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1449 
1450  // fresh bins: branchless context update, first set index from the mask
1451  for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1452  int inc = (ctx_set << 2) + greater1_ctx;
1453  int flag = coeff_abs_level_greater1_flag_decode(lc, c_idx, inc);
1454  coeff_abs_level_greater1_flag[m] = flag;
1455  gt1_mask |= flag << m;
1456  greater1_ctx = (greater1_ctx + (greater1_ctx - 1U < 2)) & (flag - 1);
1457  }
1458  if (gt1_mask)
1459  first_greater1_coeff_idx = ff_ctz(gt1_mask);
1460  first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1461 
1462  if (lc->cu.cu_transquant_bypass_flag ||
1463  (lc->cu.pred_mode == MODE_INTRA &&
1464  sps->implicit_rdpcm_enabled && transform_skip_flag &&
1465  (pred_mode_intra == 10 || pred_mode_intra == 26 )) ||
1466  explicit_rdpcm_flag)
1467  sign_hidden = 0;
1468  else
1469  sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4);
1470 
1471  if (first_greater1_coeff_idx != -1) {
1472  coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(lc, c_idx, ctx_set);
1473  }
1474  if (!pps->sign_data_hiding_flag || !sign_hidden ) {
1475  coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1476  } else {
1477  coeff_sign_flag = coeff_sign_flag_decode(lc, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1478  }
1479 
1480  for (m = 0; m < n_end; m++) {
1481  int64_t sign;
1482 
1483  n = significant_coeff_flag_idx[m];
1484  GET_COORD(offset, n);
1485  if (m < 8) {
1486  trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m];
1487  if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) {
1488  int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1489 
1490  trans_coeff_level += last_coeff_abs_level_remaining;
1491  if (trans_coeff_level > (3 << c_rice_param))
1492  c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1493  if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1494  int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1495  if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1496  lc->stat_coeff[sb_type]++;
1497  else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1498  if (lc->stat_coeff[sb_type] > 0)
1499  lc->stat_coeff[sb_type]--;
1500  rice_init = 1;
1501  }
1502  }
1503  } else {
1504  int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(lc, c_rice_param);
1505 
1506  trans_coeff_level = 1 + last_coeff_abs_level_remaining;
1507  if (trans_coeff_level > (3 << c_rice_param))
1508  c_rice_param = sps->persistent_rice_adaptation_enabled ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4);
1509  if (sps->persistent_rice_adaptation_enabled && !rice_init) {
1510  int c_rice_p_init = lc->stat_coeff[sb_type] / 4;
1511  if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init))
1512  lc->stat_coeff[sb_type]++;
1513  else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init))
1514  if (lc->stat_coeff[sb_type] > 0)
1515  lc->stat_coeff[sb_type]--;
1516  rice_init = 1;
1517  }
1518  }
1519  if (pps->sign_data_hiding_flag && sign_hidden) {
1520  sum_abs += trans_coeff_level;
1521  if (n == first_nz_pos_in_cg && (sum_abs&1))
1522  trans_coeff_level = -trans_coeff_level;
1523  }
1524  // equiprobable sign: apply it branchless
1525  sign = -(int64_t)(coeff_sign_flag >> 15);
1526  trans_coeff_level = (trans_coeff_level ^ sign) - sign;
1527  coeff_sign_flag <<= 1;
1528  if(!lc->cu.cu_transquant_bypass_flag) {
1529  if (sps->scaling_list_enabled && !(transform_skip_flag && log2_trafo_size > 2)) {
1530  if(y_c || x_c || log2_trafo_size < 4) {
1531  switch(log2_trafo_size) {
1532  case 3: pos = (y_c << 3) + x_c; break;
1533  case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1534  case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1535  default: pos = (y_c << 2) + x_c; break;
1536  }
1537  scale_m = scale_matrix[pos];
1538  } else {
1539  scale_m = dc_scale;
1540  }
1541  }
1542  trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1543  trans_coeff_level = FFMAX(FFMIN(trans_coeff_level, 32767), -32768);
1544  }
1545  coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1546  }
1547  }
1548  }
1549 
1550  if (lc->cu.cu_transquant_bypass_flag) {
1551  if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1552  (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1553  int mode = sps->implicit_rdpcm_enabled ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag;
1554 
1555  s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1556  }
1557  } else {
1558  if (transform_skip_flag) {
1559  int rot = sps->transform_skip_rotation_enabled &&
1560  log2_trafo_size == 2 &&
1561  lc->cu.pred_mode == MODE_INTRA;
1562  if (rot) {
1563  for (i = 0; i < 8; i++)
1564  FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]);
1565  }
1566 
1567  s->hevcdsp.dequant(coeffs, log2_trafo_size);
1568 
1569  if (explicit_rdpcm_flag || (sps->implicit_rdpcm_enabled &&
1570  lc->cu.pred_mode == MODE_INTRA &&
1571  (pred_mode_intra == 10 || pred_mode_intra == 26))) {
1572  int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26);
1573 
1574  s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode);
1575  }
1576  } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) {
1577  s->hevcdsp.transform_4x4_luma(coeffs);
1578  } else {
1579  if (max_xy == 0)
1580  s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1581  else
1582  s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1583  }
1584  }
1585  if (lc->tu.cross_pf) {
1586  int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1587 
1588  for (i = 0; i < (trafo_size * trafo_size); i++) {
1589  coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1590  }
1591  }
1592  s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride);
1593 }
1594 
1595 void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
1596 {
1597  int x = abs_mvd_greater0_flag_decode(lc);
1598  int y = abs_mvd_greater0_flag_decode(lc);
1599 
1600  if (x)
1602  if (y)
1604 
1605  switch (x) {
1606  case 2: lc->pu.mvd.x = mvd_decode(lc); break;
1607  case 1: lc->pu.mvd.x = mvd_sign_flag_decode(lc); break;
1608  case 0: lc->pu.mvd.x = 0; break;
1609  }
1610 
1611  switch (y) {
1612  case 2: lc->pu.mvd.y = mvd_decode(lc); break;
1613  case 1: lc->pu.mvd.y = mvd_sign_flag_decode(lc); break;
1614  case 0: lc->pu.mvd.y = 0; break;
1615  }
1616 }
HEVCLocalContext
Definition: hevcdec.h:391
ff_hevc_merge_flag_decode
int ff_hevc_merge_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:747
av_clip
#define av_clip
Definition: common.h:100
r
const char * r
Definition: vf_curves.c:127
flag
int flag
Definition: cpu.c:40
diag_scan2x2_y
static const uint8_t diag_scan2x2_y[4]
Definition: cabac.c:375
explicit_rdpcm_flag_decode
static int explicit_rdpcm_flag_decode(HEVCLocalContext *lc, int c_idx)
Definition: cabac.c:841
mvd_decode
static av_always_inline int mvd_decode(HEVCLocalContext *lc)
Definition: cabac.c:798
ff_hevc_end_of_slice_flag_decode
int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:563
PART_NxN
@ PART_NxN
Definition: hevcdec.h:98
ff_hevc_cu_qp_delta_sign_flag
int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
Definition: cabac.c:613
ff_ctz
#define ff_ctz
Definition: intmath.h:105
SAO_BAND
@ SAO_BAND
Definition: hevcdec.h:164
HEVCLocalContext::ctb_up_flag
uint8_t ctb_up_flag
Definition: hevcdec.h:423
int64_t
long long int64_t
Definition: coverity.c:34
PART_2NxnU
@ PART_2NxnU
Definition: hevcdec.h:99
abs_mvd_greater1_flag_decode
static av_always_inline int abs_mvd_greater1_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:793
mode
Definition: swscale.c:71
ScanType
ScanType
Definition: hevcdec.h:176
level_scale
const static int level_scale[2][6]
Definition: intra.c:336
CNU
#define CNU
Definition: cabac.c:96
ff_hevc_pred_mode_decode
int ff_hevc_pred_mode_decode(HEVCLocalContext *lc)
Definition: cabac.c:634
data
const char data[16]
Definition: mxf.c:149
Mv::y
int16_t y
vertical component of motion vector
Definition: hevcdec.h:305
SAO_EDGE
@ SAO_EDGE
Definition: hevcdec.h:165
ScalingList::sl
uint8_t sl[4][6][64]
Definition: ps.h:248
coeff_abs_level_greater1_flag_decode
static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCLocalContext *lc, int c_idx, int inc)
Definition: cabac.c:924
get_cabac_bypass_sign
#define get_cabac_bypass_sign
Definition: cabac.h:193
max
#define max(a, b)
Definition: cuda_runtime.h:33
get_cabac_terminate
static av_unused int get_cabac_terminate(CABACContext *c)
Definition: cabac_functions.h:187
ff_hevc_sao_type_idx_decode
int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
Definition: cabac.c:521
init_values
static const uint8_t init_values[3][HEVC_CONTEXTS]
Indexed by init_type.
Definition: cabac.c:100
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
horiz_scan2x2_x
static const uint8_t horiz_scan2x2_x[4]
Definition: cabac.c:338
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
cabac_init_state
static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s)
Definition: cabac.c:430
ff_hevc_prev_intra_luma_pred_flag_decode
int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:702
av_always_inline
#define av_always_inline
Definition: attributes.h:76
div6
static const uint8_t div6[63+8 *6+1]
Definition: intra.c:328
cabac_bypass_bits
static int cabac_bypass_bits(CABACContext *c, int n)
Definition: cabac.c:942
PART_2Nx2N
@ PART_2Nx2N
Definition: hevcdec.h:95
HEVCLocalContext::common_cabac_state
HEVCCABACState * common_cabac_state
This is a pointer to the common CABAC state.
Definition: hevcdec.h:413
PRED_BI
@ PRED_BI
Definition: hevcdec.h:114
ff_hevc_split_transform_flag_decode
int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
Definition: cabac.c:821
GET_CABAC
#define GET_CABAC(ctx)
Definition: cabac.c:514
MODE_INTER
@ MODE_INTER
Definition: hevcdec.h:106
ff_hevc_hls_mvd_coding
void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
Definition: cabac.c:1595
HEVCLocalContext::pu
PredictionUnit pu
Definition: hevcdec.h:436
TransformUnit::res_scale_val
int res_scale_val
Definition: hevcdec.h:336
horiz_scan2x2_y
static const uint8_t horiz_scan2x2_y[4]
Definition: cabac.c:342
ff_hevc_diag_scan8x8_y
const uint8_t ff_hevc_diag_scan8x8_y[64]
Definition: data.c:58
ff_hevc_cu_chroma_qp_offset_idx
int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc, int chroma_qp_offset_list_len_minus1)
Definition: cabac.c:623
ff_hevc_sao_offset_abs_decode
int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
Definition: cabac.c:541
cabac_unary_prefix
static int cabac_unary_prefix(CABACContext *c, int max)
Definition: cabac.c:974
abs_mvd_greater0_flag_decode
static av_always_inline int abs_mvd_greater0_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:788
CABAC_MASK
#define CABAC_MASK
Definition: cabac.h:39
sig
static volatile sig_atomic_t sig
Definition: signal.c:48
load_states
static void load_states(HEVCLocalContext *lc, const HEVCSPS *sps)
Definition: cabac.c:417
ff_hevc_mvp_lx_flag_decode
int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:778
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
TransformUnit::intra_pred_mode
int intra_pred_mode
Definition: hevcdec.h:339
diag_scan8x8_inv
static const uint8_t diag_scan8x8_inv[8][8]
Definition: cabac.c:391
significant_coeff_group_flag_decode
static av_always_inline int significant_coeff_group_flag_decode(HEVCLocalContext *lc, int c_idx, int ctx_cg)
Definition: cabac.c:904
OFFSET
#define OFFSET(NAME, NUM_BINS)
Definition: cabac.c:90
HEVCLocalContext::parent
const struct HEVCContext * parent
Definition: hevcdec.h:399
explicit_rdpcm_dir_flag_decode
static int explicit_rdpcm_dir_flag_decode(HEVCLocalContext *lc, int c_idx)
Definition: cabac.c:846
ff_hevc_part_mode_decode
int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
Definition: cabac.c:660
ff_hevc_merge_idx_decode
int ff_hevc_merge_idx_decode(HEVCLocalContext *lc)
Definition: cabac.c:736
prefix
char prefix[8]
Definition: uops_macros_gen.c:49
horiz_scan8x8_inv
static const uint8_t horiz_scan8x8_inv[8][8]
Definition: cabac.c:360
last_significant_coeff_suffix_decode
static av_always_inline int last_significant_coeff_suffix_decode(HEVCLocalContext *lc, int last_significant_coeff_prefix)
Definition: cabac.c:892
ff_hevc_save_states
void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts)
Definition: cabac.c:402
ff_hevc_skip_flag_decode
int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, uint8_t *skip_flag, int x0, int y0, int x_cb, int y_cb, int min_cb_width)
Definition: cabac.c:573
ff_hevc_cbf_cb_cr_decode
int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
Definition: cabac.c:826
hevc.h
ScalingList
Definition: ps.h:245
last_significant_coeff_xy_prefix_decode
static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCLocalContext *lc, int c_idx, int log2_size, int *last_scx_prefix, int *last_scy_prefix)
Definition: cabac.c:866
ff_hevc_hls_residual_coding
void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int log2_trafo_size, enum ScanType scan_idx, int c_idx)
Definition: cabac.c:1061
if
if(ret)
Definition: filter_design.txt:179
ff_hevc_diag_scan4x4_y
const uint8_t ff_hevc_diag_scan4x4_y[16]
Definition: data.c:32
HEVCCABACState::state
uint8_t state[HEVC_CONTEXTS]
Definition: hevcdec.h:183
NULL
#define NULL
Definition: coverity.c:32
ScalingList::sl_dc
uint8_t sl_dc[2][6]
Definition: ps.h:249
horiz_scan4x4_y
static const uint8_t horiz_scan4x4_y[16]
Definition: cabac.c:353
CodingUnit::cu_transquant_bypass_flag
uint8_t cu_transquant_bypass_flag
Definition: hevcdec.h:300
HEVC_SLICE_I
@ HEVC_SLICE_I
Definition: hevc.h:98
diag_scan2x2_x
static const uint8_t diag_scan2x2_x[4]
Definition: cabac.c:371
ff_hevc_res_scale_sign_flag
int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx)
Definition: cabac.c:861
PART_Nx2N
@ PART_Nx2N
Definition: hevcdec.h:97
ff_hevc_ref_idx_lx_decode
int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
Definition: cabac.c:762
attributes.h
data.h
coeff_abs_level_remaining_decode
static av_always_inline int coeff_abs_level_remaining_decode(HEVCLocalContext *lc, int rc_rice_param)
Definition: cabac.c:1007
Mv::x
int16_t x
horizontal component of motion vector
Definition: hevcdec.h:304
ff_hevc_sao_eo_class_decode
int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
Definition: cabac.c:556
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
SAMPLE_CTB
#define SAMPLE_CTB(tab, x, y)
Definition: hevcdec.h:72
inc
static int inc(int num, int period)
Definition: perlin.c:34
SCAN_HORIZ
@ SCAN_HORIZ
Definition: hevcdec.h:178
HEVCLocalContext::edge_emu_buffer
uint8_t edge_emu_buffer[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition: hevcdec.h:429
PART_nLx2N
@ PART_nLx2N
Definition: hevcdec.h:101
ff_hevc_cabac_init
int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts, const uint8_t *data, size_t size, int is_wpp)
Definition: cabac.c:454
diag_scan2x2_inv
static const uint8_t diag_scan2x2_inv[2][2]
Definition: cabac.c:379
HEVCLocalContext::ctb_left_flag
uint8_t ctb_left_flag
Definition: hevcdec.h:422
hevcdec.h
CABAC_MAX_BIN
#define CABAC_MAX_BIN
Definition: cabac.c:32
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
HEVCLocalContext::cabac_state
uint8_t cabac_state[HEVC_CONTEXTS]
Definition: hevcdec.h:392
PART_2NxnD
@ PART_2NxnD
Definition: hevcdec.h:100
size
int size
Definition: twinvq_data.h:10344
SCAN_VERT
@ SCAN_VERT
Definition: hevcdec.h:179
ff_hevc_pcm_flag_decode
int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:697
get_cabac_bypass
#define get_cabac_bypass
Definition: cabac.h:149
diag_scan4x4_inv
static const uint8_t diag_scan4x4_inv[4][4]
Definition: cabac.c:384
horiz_scan4x4_x
static const uint8_t horiz_scan4x4_x[16]
Definition: cabac.c:346
HEVC_STAT_COEFFS
#define HEVC_STAT_COEFFS
Definition: hevcdec.h:52
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
ff_hevc_cbf_luma_decode
int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
Definition: cabac.c:831
av_zero_extend
#define av_zero_extend
Definition: common.h:151
TransformUnit::cu_qp_offset_cb
int8_t cu_qp_offset_cb
Definition: hevcdec.h:344
HEVCLocalContext::ct_depth
int ct_depth
Definition: hevcdec.h:434
ff_init_cabac_decoder
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Definition: cabac.c:162
PART_nRx2N
@ PART_nRx2N
Definition: hevcdec.h:102
MODE_INTRA
#define MODE_INTRA
Definition: vp3.c:83
ff_hevc_cu_transquant_bypass_flag_decode
int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:568
rem6
static const uint8_t rem6[63+8 *6+1]
Definition: intra.c:320
HEVCLocalContext::logctx
void * logctx
Definition: hevcdec.h:398
ff_hevc_no_residual_syntax_flag_decode
int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:783
common.h
s
uint8_t s
Definition: llvidencdsp.c:39
ff_hevc_mpm_idx_decode
int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
Definition: cabac.c:707
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
cabac_functions.h
HEVCLocalContext::qp_y
int8_t qp_y
Definition: hevcdec.h:415
ff_hevc_diag_scan4x4_x
const uint8_t ff_hevc_diag_scan4x4_x[16]
Definition: data.c:25
HEVCLocalContext::stat_coeff
uint8_t stat_coeff[HEVC_STAT_COEFFS]
Definition: hevcdec.h:394
ff_hevc_cu_chroma_qp_offset_flag
int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc)
Definition: cabac.c:618
coeff_sign_flag_decode
static av_always_inline int coeff_sign_flag_decode(HEVCLocalContext *lc, uint8_t nb)
Definition: cabac.c:1048
ff_hevc_sao_merge_flag_decode
int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:516
ret
ret
Definition: filter_design.txt:187
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
PredictionUnit::mvd
Mv mvd
Definition: hevcdec.h:327
HEVCLocalContext::edge_emu_buffer2
uint8_t edge_emu_buffer2[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition: hevcdec.h:431
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
pos
unsigned int pos
Definition: spdifenc.c:414
mvd_sign_flag_decode
static av_always_inline int mvd_sign_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:816
GET_COORD
#define GET_COORD(offset, n)
ff_hevc_sao_band_position_decode
int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
Definition: cabac.c:531
U
#define U(x)
Definition: vpx_arith.h:37
scan_1x1
static const uint8_t scan_1x1[1]
Definition: cabac.c:334
ff_hevc_inter_pred_idc_decode
int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH)
Definition: cabac.c:752
HEVCContext
Definition: hevcdec.h:490
CodingUnit::pred_mode
enum PredMode pred_mode
PredMode.
Definition: hevcdec.h:294
cabac_reinit
static int cabac_reinit(HEVCLocalContext *lc)
Definition: cabac.c:425
ff_hevc_split_coding_unit_flag_decode
int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, uint8_t *tab_ct_depth, const HEVCSPS *sps, int ct_depth, int x0, int y0)
Definition: cabac.c:639
SCAN_DIAG
@ SCAN_DIAG
Definition: hevcdec.h:177
hevc_transform_skip_flag_decode
static int hevc_transform_skip_flag_decode(HEVCLocalContext *lc, int c_idx)
Definition: cabac.c:836
significant_coeff_flag_decode_0
static av_always_inline int significant_coeff_flag_decode_0(HEVCLocalContext *lc, int c_idx, int offset)
Definition: cabac.c:919
CABAC_ELEMS
#define CABAC_ELEMS(ELEM)
Definition: cabac.c:35
pps
uint64_t pps
Definition: dovi_rpuenc.c:36
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
HEVCLocalContext::tu
TransformUnit tu
Definition: hevcdec.h:420
ff_hevc_diag_scan8x8_x
const uint8_t ff_hevc_diag_scan8x8_x[64]
Definition: data.c:39
ff_hevc_cu_qp_delta_abs
int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
Definition: cabac.c:586
HEVCCABACState::stat_coeff
uint8_t stat_coeff[HEVC_STAT_COEFFS]
Definition: hevcdec.h:184
HEVCSPS
Definition: ps.h:252
HEVCPPS
Definition: ps.h:371
significant_coeff_flag_decode
static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int n, int offset, const uint8_t *ctx_idx_map)
Definition: cabac.c:912
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:278
TransformUnit::cross_pf
uint8_t cross_pf
Definition: hevcdec.h:346
HEVCLocalContext::cu
CodingUnit cu
Definition: hevcdec.h:435
ff_hevc_log2_res_scale_abs
int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx)
Definition: cabac.c:851
ff_hevc_sao_offset_sign_decode
int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
Definition: cabac.c:551
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
skip_bytes
static const av_unused uint8_t * skip_bytes(CABACContext *c, int n)
Skip n bytes and reset the decoder.
Definition: cabac_functions.h:203
stride
#define stride
Definition: h264pred_template.c:536
CABAC_BITS
#define CABAC_BITS
Definition: cabac.h:38
TransformUnit::intra_pred_mode_c
int intra_pred_mode_c
Definition: hevcdec.h:340
coeff_abs_level_greater2_flag_decode
static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCLocalContext *lc, int c_idx, int inc)
Definition: cabac.c:933
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
CABACContext
Definition: cabac.h:41
ff_hevc_intra_chroma_pred_mode_decode
int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
Definition: cabac.c:725
PART_2NxN
@ PART_2NxN
Definition: hevcdec.h:96
HEVCLocalContext::cc
CABACContext cc
Definition: hevcdec.h:401
TransformUnit::cu_qp_offset_cr
int8_t cu_qp_offset_cr
Definition: hevcdec.h:345
HEVC_CONTEXTS
#define HEVC_CONTEXTS
Definition: hevcdec.h:51
ff_hevc_rem_intra_luma_pred_mode_decode
int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
Definition: cabac.c:715