1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * HEVC CABAC decoding 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (C) 2012 - 2013 Guillaume Martres 5cabdff1aSopenharmony_ci * Copyright (C) 2012 - 2013 Gildas Cocherel 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 25cabdff1aSopenharmony_ci#include "libavutil/common.h" 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "cabac_functions.h" 28cabdff1aSopenharmony_ci#include "hevc_data.h" 29cabdff1aSopenharmony_ci#include "hevc.h" 30cabdff1aSopenharmony_ci#include "hevcdec.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#define CABAC_MAX_BIN 31 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci/** 35cabdff1aSopenharmony_ci * number of bin by SyntaxElement. 36cabdff1aSopenharmony_ci */ 37cabdff1aSopenharmony_cistatic const int8_t num_bins_in_se[] = { 38cabdff1aSopenharmony_ci 1, // sao_merge_flag 39cabdff1aSopenharmony_ci 1, // sao_type_idx 40cabdff1aSopenharmony_ci 0, // sao_eo_class 41cabdff1aSopenharmony_ci 0, // sao_band_position 42cabdff1aSopenharmony_ci 0, // sao_offset_abs 43cabdff1aSopenharmony_ci 0, // sao_offset_sign 44cabdff1aSopenharmony_ci 0, // end_of_slice_flag 45cabdff1aSopenharmony_ci 3, // split_coding_unit_flag 46cabdff1aSopenharmony_ci 1, // cu_transquant_bypass_flag 47cabdff1aSopenharmony_ci 3, // skip_flag 48cabdff1aSopenharmony_ci 3, // cu_qp_delta 49cabdff1aSopenharmony_ci 1, // pred_mode 50cabdff1aSopenharmony_ci 4, // part_mode 51cabdff1aSopenharmony_ci 0, // pcm_flag 52cabdff1aSopenharmony_ci 1, // prev_intra_luma_pred_mode 53cabdff1aSopenharmony_ci 0, // mpm_idx 54cabdff1aSopenharmony_ci 0, // rem_intra_luma_pred_mode 55cabdff1aSopenharmony_ci 2, // intra_chroma_pred_mode 56cabdff1aSopenharmony_ci 1, // merge_flag 57cabdff1aSopenharmony_ci 1, // merge_idx 58cabdff1aSopenharmony_ci 5, // inter_pred_idc 59cabdff1aSopenharmony_ci 2, // ref_idx_l0 60cabdff1aSopenharmony_ci 2, // ref_idx_l1 61cabdff1aSopenharmony_ci 2, // abs_mvd_greater0_flag 62cabdff1aSopenharmony_ci 2, // abs_mvd_greater1_flag 63cabdff1aSopenharmony_ci 0, // abs_mvd_minus2 64cabdff1aSopenharmony_ci 0, // mvd_sign_flag 65cabdff1aSopenharmony_ci 1, // mvp_lx_flag 66cabdff1aSopenharmony_ci 1, // no_residual_data_flag 67cabdff1aSopenharmony_ci 3, // split_transform_flag 68cabdff1aSopenharmony_ci 2, // cbf_luma 69cabdff1aSopenharmony_ci 5, // cbf_cb, cbf_cr 70cabdff1aSopenharmony_ci 2, // transform_skip_flag[][] 71cabdff1aSopenharmony_ci 2, // explicit_rdpcm_flag[][] 72cabdff1aSopenharmony_ci 2, // explicit_rdpcm_dir_flag[][] 73cabdff1aSopenharmony_ci 18, // last_significant_coeff_x_prefix 74cabdff1aSopenharmony_ci 18, // last_significant_coeff_y_prefix 75cabdff1aSopenharmony_ci 0, // last_significant_coeff_x_suffix 76cabdff1aSopenharmony_ci 0, // last_significant_coeff_y_suffix 77cabdff1aSopenharmony_ci 4, // significant_coeff_group_flag 78cabdff1aSopenharmony_ci 44, // significant_coeff_flag 79cabdff1aSopenharmony_ci 24, // coeff_abs_level_greater1_flag 80cabdff1aSopenharmony_ci 6, // coeff_abs_level_greater2_flag 81cabdff1aSopenharmony_ci 0, // coeff_abs_level_remaining 82cabdff1aSopenharmony_ci 0, // coeff_sign_flag 83cabdff1aSopenharmony_ci 8, // log2_res_scale_abs 84cabdff1aSopenharmony_ci 2, // res_scale_sign_flag 85cabdff1aSopenharmony_ci 1, // cu_chroma_qp_offset_flag 86cabdff1aSopenharmony_ci 1, // cu_chroma_qp_offset_idx 87cabdff1aSopenharmony_ci}; 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci/** 90cabdff1aSopenharmony_ci * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement. 91cabdff1aSopenharmony_ci */ 92cabdff1aSopenharmony_cistatic const int elem_offset[sizeof(num_bins_in_se)] = { 93cabdff1aSopenharmony_ci 0, // sao_merge_flag 94cabdff1aSopenharmony_ci 1, // sao_type_idx 95cabdff1aSopenharmony_ci 2, // sao_eo_class 96cabdff1aSopenharmony_ci 2, // sao_band_position 97cabdff1aSopenharmony_ci 2, // sao_offset_abs 98cabdff1aSopenharmony_ci 2, // sao_offset_sign 99cabdff1aSopenharmony_ci 2, // end_of_slice_flag 100cabdff1aSopenharmony_ci 2, // split_coding_unit_flag 101cabdff1aSopenharmony_ci 5, // cu_transquant_bypass_flag 102cabdff1aSopenharmony_ci 6, // skip_flag 103cabdff1aSopenharmony_ci 9, // cu_qp_delta 104cabdff1aSopenharmony_ci 12, // pred_mode 105cabdff1aSopenharmony_ci 13, // part_mode 106cabdff1aSopenharmony_ci 17, // pcm_flag 107cabdff1aSopenharmony_ci 17, // prev_intra_luma_pred_mode 108cabdff1aSopenharmony_ci 18, // mpm_idx 109cabdff1aSopenharmony_ci 18, // rem_intra_luma_pred_mode 110cabdff1aSopenharmony_ci 18, // intra_chroma_pred_mode 111cabdff1aSopenharmony_ci 20, // merge_flag 112cabdff1aSopenharmony_ci 21, // merge_idx 113cabdff1aSopenharmony_ci 22, // inter_pred_idc 114cabdff1aSopenharmony_ci 27, // ref_idx_l0 115cabdff1aSopenharmony_ci 29, // ref_idx_l1 116cabdff1aSopenharmony_ci 31, // abs_mvd_greater0_flag 117cabdff1aSopenharmony_ci 33, // abs_mvd_greater1_flag 118cabdff1aSopenharmony_ci 35, // abs_mvd_minus2 119cabdff1aSopenharmony_ci 35, // mvd_sign_flag 120cabdff1aSopenharmony_ci 35, // mvp_lx_flag 121cabdff1aSopenharmony_ci 36, // no_residual_data_flag 122cabdff1aSopenharmony_ci 37, // split_transform_flag 123cabdff1aSopenharmony_ci 40, // cbf_luma 124cabdff1aSopenharmony_ci 42, // cbf_cb, cbf_cr 125cabdff1aSopenharmony_ci 47, // transform_skip_flag[][] 126cabdff1aSopenharmony_ci 49, // explicit_rdpcm_flag[][] 127cabdff1aSopenharmony_ci 51, // explicit_rdpcm_dir_flag[][] 128cabdff1aSopenharmony_ci 53, // last_significant_coeff_x_prefix 129cabdff1aSopenharmony_ci 71, // last_significant_coeff_y_prefix 130cabdff1aSopenharmony_ci 89, // last_significant_coeff_x_suffix 131cabdff1aSopenharmony_ci 89, // last_significant_coeff_y_suffix 132cabdff1aSopenharmony_ci 89, // significant_coeff_group_flag 133cabdff1aSopenharmony_ci 93, // significant_coeff_flag 134cabdff1aSopenharmony_ci 137, // coeff_abs_level_greater1_flag 135cabdff1aSopenharmony_ci 161, // coeff_abs_level_greater2_flag 136cabdff1aSopenharmony_ci 167, // coeff_abs_level_remaining 137cabdff1aSopenharmony_ci 167, // coeff_sign_flag 138cabdff1aSopenharmony_ci 167, // log2_res_scale_abs 139cabdff1aSopenharmony_ci 175, // res_scale_sign_flag 140cabdff1aSopenharmony_ci 177, // cu_chroma_qp_offset_flag 141cabdff1aSopenharmony_ci 178, // cu_chroma_qp_offset_idx 142cabdff1aSopenharmony_ci}; 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci#define CNU 154 145cabdff1aSopenharmony_ci/** 146cabdff1aSopenharmony_ci * Indexed by init_type 147cabdff1aSopenharmony_ci */ 148cabdff1aSopenharmony_cistatic const uint8_t init_values[3][HEVC_CONTEXTS] = { 149cabdff1aSopenharmony_ci { // sao_merge_flag 150cabdff1aSopenharmony_ci 153, 151cabdff1aSopenharmony_ci // sao_type_idx 152cabdff1aSopenharmony_ci 200, 153cabdff1aSopenharmony_ci // split_coding_unit_flag 154cabdff1aSopenharmony_ci 139, 141, 157, 155cabdff1aSopenharmony_ci // cu_transquant_bypass_flag 156cabdff1aSopenharmony_ci 154, 157cabdff1aSopenharmony_ci // skip_flag 158cabdff1aSopenharmony_ci CNU, CNU, CNU, 159cabdff1aSopenharmony_ci // cu_qp_delta 160cabdff1aSopenharmony_ci 154, 154, 154, 161cabdff1aSopenharmony_ci // pred_mode 162cabdff1aSopenharmony_ci CNU, 163cabdff1aSopenharmony_ci // part_mode 164cabdff1aSopenharmony_ci 184, CNU, CNU, CNU, 165cabdff1aSopenharmony_ci // prev_intra_luma_pred_mode 166cabdff1aSopenharmony_ci 184, 167cabdff1aSopenharmony_ci // intra_chroma_pred_mode 168cabdff1aSopenharmony_ci 63, 139, 169cabdff1aSopenharmony_ci // merge_flag 170cabdff1aSopenharmony_ci CNU, 171cabdff1aSopenharmony_ci // merge_idx 172cabdff1aSopenharmony_ci CNU, 173cabdff1aSopenharmony_ci // inter_pred_idc 174cabdff1aSopenharmony_ci CNU, CNU, CNU, CNU, CNU, 175cabdff1aSopenharmony_ci // ref_idx_l0 176cabdff1aSopenharmony_ci CNU, CNU, 177cabdff1aSopenharmony_ci // ref_idx_l1 178cabdff1aSopenharmony_ci CNU, CNU, 179cabdff1aSopenharmony_ci // abs_mvd_greater1_flag 180cabdff1aSopenharmony_ci CNU, CNU, 181cabdff1aSopenharmony_ci // abs_mvd_greater1_flag 182cabdff1aSopenharmony_ci CNU, CNU, 183cabdff1aSopenharmony_ci // mvp_lx_flag 184cabdff1aSopenharmony_ci CNU, 185cabdff1aSopenharmony_ci // no_residual_data_flag 186cabdff1aSopenharmony_ci CNU, 187cabdff1aSopenharmony_ci // split_transform_flag 188cabdff1aSopenharmony_ci 153, 138, 138, 189cabdff1aSopenharmony_ci // cbf_luma 190cabdff1aSopenharmony_ci 111, 141, 191cabdff1aSopenharmony_ci // cbf_cb, cbf_cr 192cabdff1aSopenharmony_ci 94, 138, 182, 154, 154, 193cabdff1aSopenharmony_ci // transform_skip_flag 194cabdff1aSopenharmony_ci 139, 139, 195cabdff1aSopenharmony_ci // explicit_rdpcm_flag 196cabdff1aSopenharmony_ci 139, 139, 197cabdff1aSopenharmony_ci // explicit_rdpcm_dir_flag 198cabdff1aSopenharmony_ci 139, 139, 199cabdff1aSopenharmony_ci // last_significant_coeff_x_prefix 200cabdff1aSopenharmony_ci 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111, 201cabdff1aSopenharmony_ci 79, 108, 123, 63, 202cabdff1aSopenharmony_ci // last_significant_coeff_y_prefix 203cabdff1aSopenharmony_ci 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111, 204cabdff1aSopenharmony_ci 79, 108, 123, 63, 205cabdff1aSopenharmony_ci // significant_coeff_group_flag 206cabdff1aSopenharmony_ci 91, 171, 134, 141, 207cabdff1aSopenharmony_ci // significant_coeff_flag 208cabdff1aSopenharmony_ci 111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153, 209cabdff1aSopenharmony_ci 125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140, 210cabdff1aSopenharmony_ci 139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111, 211cabdff1aSopenharmony_ci 141, 111, 212cabdff1aSopenharmony_ci // coeff_abs_level_greater1_flag 213cabdff1aSopenharmony_ci 140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107, 214cabdff1aSopenharmony_ci 122, 152, 140, 179, 166, 182, 140, 227, 122, 197, 215cabdff1aSopenharmony_ci // coeff_abs_level_greater2_flag 216cabdff1aSopenharmony_ci 138, 153, 136, 167, 152, 152, 217cabdff1aSopenharmony_ci // log2_res_scale_abs 218cabdff1aSopenharmony_ci 154, 154, 154, 154, 154, 154, 154, 154, 219cabdff1aSopenharmony_ci // res_scale_sign_flag 220cabdff1aSopenharmony_ci 154, 154, 221cabdff1aSopenharmony_ci // cu_chroma_qp_offset_flag 222cabdff1aSopenharmony_ci 154, 223cabdff1aSopenharmony_ci // cu_chroma_qp_offset_idx 224cabdff1aSopenharmony_ci 154, 225cabdff1aSopenharmony_ci }, 226cabdff1aSopenharmony_ci { // sao_merge_flag 227cabdff1aSopenharmony_ci 153, 228cabdff1aSopenharmony_ci // sao_type_idx 229cabdff1aSopenharmony_ci 185, 230cabdff1aSopenharmony_ci // split_coding_unit_flag 231cabdff1aSopenharmony_ci 107, 139, 126, 232cabdff1aSopenharmony_ci // cu_transquant_bypass_flag 233cabdff1aSopenharmony_ci 154, 234cabdff1aSopenharmony_ci // skip_flag 235cabdff1aSopenharmony_ci 197, 185, 201, 236cabdff1aSopenharmony_ci // cu_qp_delta 237cabdff1aSopenharmony_ci 154, 154, 154, 238cabdff1aSopenharmony_ci // pred_mode 239cabdff1aSopenharmony_ci 149, 240cabdff1aSopenharmony_ci // part_mode 241cabdff1aSopenharmony_ci 154, 139, 154, 154, 242cabdff1aSopenharmony_ci // prev_intra_luma_pred_mode 243cabdff1aSopenharmony_ci 154, 244cabdff1aSopenharmony_ci // intra_chroma_pred_mode 245cabdff1aSopenharmony_ci 152, 139, 246cabdff1aSopenharmony_ci // merge_flag 247cabdff1aSopenharmony_ci 110, 248cabdff1aSopenharmony_ci // merge_idx 249cabdff1aSopenharmony_ci 122, 250cabdff1aSopenharmony_ci // inter_pred_idc 251cabdff1aSopenharmony_ci 95, 79, 63, 31, 31, 252cabdff1aSopenharmony_ci // ref_idx_l0 253cabdff1aSopenharmony_ci 153, 153, 254cabdff1aSopenharmony_ci // ref_idx_l1 255cabdff1aSopenharmony_ci 153, 153, 256cabdff1aSopenharmony_ci // abs_mvd_greater1_flag 257cabdff1aSopenharmony_ci 140, 198, 258cabdff1aSopenharmony_ci // abs_mvd_greater1_flag 259cabdff1aSopenharmony_ci 140, 198, 260cabdff1aSopenharmony_ci // mvp_lx_flag 261cabdff1aSopenharmony_ci 168, 262cabdff1aSopenharmony_ci // no_residual_data_flag 263cabdff1aSopenharmony_ci 79, 264cabdff1aSopenharmony_ci // split_transform_flag 265cabdff1aSopenharmony_ci 124, 138, 94, 266cabdff1aSopenharmony_ci // cbf_luma 267cabdff1aSopenharmony_ci 153, 111, 268cabdff1aSopenharmony_ci // cbf_cb, cbf_cr 269cabdff1aSopenharmony_ci 149, 107, 167, 154, 154, 270cabdff1aSopenharmony_ci // transform_skip_flag 271cabdff1aSopenharmony_ci 139, 139, 272cabdff1aSopenharmony_ci // explicit_rdpcm_flag 273cabdff1aSopenharmony_ci 139, 139, 274cabdff1aSopenharmony_ci // explicit_rdpcm_dir_flag 275cabdff1aSopenharmony_ci 139, 139, 276cabdff1aSopenharmony_ci // last_significant_coeff_x_prefix 277cabdff1aSopenharmony_ci 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95, 278cabdff1aSopenharmony_ci 94, 108, 123, 108, 279cabdff1aSopenharmony_ci // last_significant_coeff_y_prefix 280cabdff1aSopenharmony_ci 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95, 281cabdff1aSopenharmony_ci 94, 108, 123, 108, 282cabdff1aSopenharmony_ci // significant_coeff_group_flag 283cabdff1aSopenharmony_ci 121, 140, 61, 154, 284cabdff1aSopenharmony_ci // significant_coeff_flag 285cabdff1aSopenharmony_ci 155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153, 286cabdff1aSopenharmony_ci 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170, 287cabdff1aSopenharmony_ci 153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140, 288cabdff1aSopenharmony_ci 140, 140, 289cabdff1aSopenharmony_ci // coeff_abs_level_greater1_flag 290cabdff1aSopenharmony_ci 154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121, 291cabdff1aSopenharmony_ci 136, 137, 169, 194, 166, 167, 154, 167, 137, 182, 292cabdff1aSopenharmony_ci // coeff_abs_level_greater2_flag 293cabdff1aSopenharmony_ci 107, 167, 91, 122, 107, 167, 294cabdff1aSopenharmony_ci // log2_res_scale_abs 295cabdff1aSopenharmony_ci 154, 154, 154, 154, 154, 154, 154, 154, 296cabdff1aSopenharmony_ci // res_scale_sign_flag 297cabdff1aSopenharmony_ci 154, 154, 298cabdff1aSopenharmony_ci // cu_chroma_qp_offset_flag 299cabdff1aSopenharmony_ci 154, 300cabdff1aSopenharmony_ci // cu_chroma_qp_offset_idx 301cabdff1aSopenharmony_ci 154, 302cabdff1aSopenharmony_ci }, 303cabdff1aSopenharmony_ci { // sao_merge_flag 304cabdff1aSopenharmony_ci 153, 305cabdff1aSopenharmony_ci // sao_type_idx 306cabdff1aSopenharmony_ci 160, 307cabdff1aSopenharmony_ci // split_coding_unit_flag 308cabdff1aSopenharmony_ci 107, 139, 126, 309cabdff1aSopenharmony_ci // cu_transquant_bypass_flag 310cabdff1aSopenharmony_ci 154, 311cabdff1aSopenharmony_ci // skip_flag 312cabdff1aSopenharmony_ci 197, 185, 201, 313cabdff1aSopenharmony_ci // cu_qp_delta 314cabdff1aSopenharmony_ci 154, 154, 154, 315cabdff1aSopenharmony_ci // pred_mode 316cabdff1aSopenharmony_ci 134, 317cabdff1aSopenharmony_ci // part_mode 318cabdff1aSopenharmony_ci 154, 139, 154, 154, 319cabdff1aSopenharmony_ci // prev_intra_luma_pred_mode 320cabdff1aSopenharmony_ci 183, 321cabdff1aSopenharmony_ci // intra_chroma_pred_mode 322cabdff1aSopenharmony_ci 152, 139, 323cabdff1aSopenharmony_ci // merge_flag 324cabdff1aSopenharmony_ci 154, 325cabdff1aSopenharmony_ci // merge_idx 326cabdff1aSopenharmony_ci 137, 327cabdff1aSopenharmony_ci // inter_pred_idc 328cabdff1aSopenharmony_ci 95, 79, 63, 31, 31, 329cabdff1aSopenharmony_ci // ref_idx_l0 330cabdff1aSopenharmony_ci 153, 153, 331cabdff1aSopenharmony_ci // ref_idx_l1 332cabdff1aSopenharmony_ci 153, 153, 333cabdff1aSopenharmony_ci // abs_mvd_greater1_flag 334cabdff1aSopenharmony_ci 169, 198, 335cabdff1aSopenharmony_ci // abs_mvd_greater1_flag 336cabdff1aSopenharmony_ci 169, 198, 337cabdff1aSopenharmony_ci // mvp_lx_flag 338cabdff1aSopenharmony_ci 168, 339cabdff1aSopenharmony_ci // no_residual_data_flag 340cabdff1aSopenharmony_ci 79, 341cabdff1aSopenharmony_ci // split_transform_flag 342cabdff1aSopenharmony_ci 224, 167, 122, 343cabdff1aSopenharmony_ci // cbf_luma 344cabdff1aSopenharmony_ci 153, 111, 345cabdff1aSopenharmony_ci // cbf_cb, cbf_cr 346cabdff1aSopenharmony_ci 149, 92, 167, 154, 154, 347cabdff1aSopenharmony_ci // transform_skip_flag 348cabdff1aSopenharmony_ci 139, 139, 349cabdff1aSopenharmony_ci // explicit_rdpcm_flag 350cabdff1aSopenharmony_ci 139, 139, 351cabdff1aSopenharmony_ci // explicit_rdpcm_dir_flag 352cabdff1aSopenharmony_ci 139, 139, 353cabdff1aSopenharmony_ci // last_significant_coeff_x_prefix 354cabdff1aSopenharmony_ci 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111, 355cabdff1aSopenharmony_ci 79, 108, 123, 93, 356cabdff1aSopenharmony_ci // last_significant_coeff_y_prefix 357cabdff1aSopenharmony_ci 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111, 358cabdff1aSopenharmony_ci 79, 108, 123, 93, 359cabdff1aSopenharmony_ci // significant_coeff_group_flag 360cabdff1aSopenharmony_ci 121, 140, 61, 154, 361cabdff1aSopenharmony_ci // significant_coeff_flag 362cabdff1aSopenharmony_ci 170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153, 363cabdff1aSopenharmony_ci 154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170, 364cabdff1aSopenharmony_ci 153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140, 365cabdff1aSopenharmony_ci 140, 140, 366cabdff1aSopenharmony_ci // coeff_abs_level_greater1_flag 367cabdff1aSopenharmony_ci 154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121, 368cabdff1aSopenharmony_ci 136, 122, 169, 208, 166, 167, 154, 152, 167, 182, 369cabdff1aSopenharmony_ci // coeff_abs_level_greater2_flag 370cabdff1aSopenharmony_ci 107, 167, 91, 107, 107, 167, 371cabdff1aSopenharmony_ci // log2_res_scale_abs 372cabdff1aSopenharmony_ci 154, 154, 154, 154, 154, 154, 154, 154, 373cabdff1aSopenharmony_ci // res_scale_sign_flag 374cabdff1aSopenharmony_ci 154, 154, 375cabdff1aSopenharmony_ci // cu_chroma_qp_offset_flag 376cabdff1aSopenharmony_ci 154, 377cabdff1aSopenharmony_ci // cu_chroma_qp_offset_idx 378cabdff1aSopenharmony_ci 154, 379cabdff1aSopenharmony_ci }, 380cabdff1aSopenharmony_ci}; 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_cistatic const uint8_t scan_1x1[1] = { 383cabdff1aSopenharmony_ci 0, 384cabdff1aSopenharmony_ci}; 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_cistatic const uint8_t horiz_scan2x2_x[4] = { 387cabdff1aSopenharmony_ci 0, 1, 0, 1, 388cabdff1aSopenharmony_ci}; 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_cistatic const uint8_t horiz_scan2x2_y[4] = { 391cabdff1aSopenharmony_ci 0, 0, 1, 1 392cabdff1aSopenharmony_ci}; 393cabdff1aSopenharmony_ci 394cabdff1aSopenharmony_cistatic const uint8_t horiz_scan4x4_x[16] = { 395cabdff1aSopenharmony_ci 0, 1, 2, 3, 396cabdff1aSopenharmony_ci 0, 1, 2, 3, 397cabdff1aSopenharmony_ci 0, 1, 2, 3, 398cabdff1aSopenharmony_ci 0, 1, 2, 3, 399cabdff1aSopenharmony_ci}; 400cabdff1aSopenharmony_ci 401cabdff1aSopenharmony_cistatic const uint8_t horiz_scan4x4_y[16] = { 402cabdff1aSopenharmony_ci 0, 0, 0, 0, 403cabdff1aSopenharmony_ci 1, 1, 1, 1, 404cabdff1aSopenharmony_ci 2, 2, 2, 2, 405cabdff1aSopenharmony_ci 3, 3, 3, 3, 406cabdff1aSopenharmony_ci}; 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_cistatic const uint8_t horiz_scan8x8_inv[8][8] = { 409cabdff1aSopenharmony_ci { 0, 1, 2, 3, 16, 17, 18, 19, }, 410cabdff1aSopenharmony_ci { 4, 5, 6, 7, 20, 21, 22, 23, }, 411cabdff1aSopenharmony_ci { 8, 9, 10, 11, 24, 25, 26, 27, }, 412cabdff1aSopenharmony_ci { 12, 13, 14, 15, 28, 29, 30, 31, }, 413cabdff1aSopenharmony_ci { 32, 33, 34, 35, 48, 49, 50, 51, }, 414cabdff1aSopenharmony_ci { 36, 37, 38, 39, 52, 53, 54, 55, }, 415cabdff1aSopenharmony_ci { 40, 41, 42, 43, 56, 57, 58, 59, }, 416cabdff1aSopenharmony_ci { 44, 45, 46, 47, 60, 61, 62, 63, }, 417cabdff1aSopenharmony_ci}; 418cabdff1aSopenharmony_ci 419cabdff1aSopenharmony_cistatic const uint8_t diag_scan2x2_x[4] = { 420cabdff1aSopenharmony_ci 0, 0, 1, 1, 421cabdff1aSopenharmony_ci}; 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_cistatic const uint8_t diag_scan2x2_y[4] = { 424cabdff1aSopenharmony_ci 0, 1, 0, 1, 425cabdff1aSopenharmony_ci}; 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_cistatic const uint8_t diag_scan2x2_inv[2][2] = { 428cabdff1aSopenharmony_ci { 0, 2, }, 429cabdff1aSopenharmony_ci { 1, 3, }, 430cabdff1aSopenharmony_ci}; 431cabdff1aSopenharmony_ci 432cabdff1aSopenharmony_cistatic const uint8_t diag_scan4x4_inv[4][4] = { 433cabdff1aSopenharmony_ci { 0, 2, 5, 9, }, 434cabdff1aSopenharmony_ci { 1, 4, 8, 12, }, 435cabdff1aSopenharmony_ci { 3, 7, 11, 14, }, 436cabdff1aSopenharmony_ci { 6, 10, 13, 15, }, 437cabdff1aSopenharmony_ci}; 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_cistatic const uint8_t diag_scan8x8_inv[8][8] = { 440cabdff1aSopenharmony_ci { 0, 2, 5, 9, 14, 20, 27, 35, }, 441cabdff1aSopenharmony_ci { 1, 4, 8, 13, 19, 26, 34, 42, }, 442cabdff1aSopenharmony_ci { 3, 7, 12, 18, 25, 33, 41, 48, }, 443cabdff1aSopenharmony_ci { 6, 11, 17, 24, 32, 40, 47, 53, }, 444cabdff1aSopenharmony_ci { 10, 16, 23, 31, 39, 46, 52, 57, }, 445cabdff1aSopenharmony_ci { 15, 22, 30, 38, 45, 51, 56, 60, }, 446cabdff1aSopenharmony_ci { 21, 29, 37, 44, 50, 55, 59, 62, }, 447cabdff1aSopenharmony_ci { 28, 36, 43, 49, 54, 58, 61, 63, }, 448cabdff1aSopenharmony_ci}; 449cabdff1aSopenharmony_ci 450cabdff1aSopenharmony_civoid ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts) 451cabdff1aSopenharmony_ci{ 452cabdff1aSopenharmony_ci if (s->ps.pps->entropy_coding_sync_enabled_flag && 453cabdff1aSopenharmony_ci (ctb_addr_ts % s->ps.sps->ctb_width == 2 || 454cabdff1aSopenharmony_ci (s->ps.sps->ctb_width == 2 && 455cabdff1aSopenharmony_ci ctb_addr_ts % s->ps.sps->ctb_width == 0))) { 456cabdff1aSopenharmony_ci memcpy(s->cabac_state, s->HEVClc->cabac_state, HEVC_CONTEXTS); 457cabdff1aSopenharmony_ci if (s->ps.sps->persistent_rice_adaptation_enabled_flag) { 458cabdff1aSopenharmony_ci memcpy(s->stat_coeff, s->HEVClc->stat_coeff, HEVC_STAT_COEFFS); 459cabdff1aSopenharmony_ci } 460cabdff1aSopenharmony_ci } 461cabdff1aSopenharmony_ci} 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_cistatic void load_states(HEVCContext *s, int thread) 464cabdff1aSopenharmony_ci{ 465cabdff1aSopenharmony_ci memcpy(s->HEVClc->cabac_state, s->cabac_state, HEVC_CONTEXTS); 466cabdff1aSopenharmony_ci if (s->ps.sps->persistent_rice_adaptation_enabled_flag) { 467cabdff1aSopenharmony_ci const HEVCContext *prev = s->sList[(thread + s->threads_number - 1) % s->threads_number]; 468cabdff1aSopenharmony_ci memcpy(s->HEVClc->stat_coeff, prev->stat_coeff, HEVC_STAT_COEFFS); 469cabdff1aSopenharmony_ci } 470cabdff1aSopenharmony_ci} 471cabdff1aSopenharmony_ci 472cabdff1aSopenharmony_cistatic int cabac_reinit(HEVCLocalContext *lc) 473cabdff1aSopenharmony_ci{ 474cabdff1aSopenharmony_ci return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0; 475cabdff1aSopenharmony_ci} 476cabdff1aSopenharmony_ci 477cabdff1aSopenharmony_cistatic int cabac_init_decoder(HEVCContext *s) 478cabdff1aSopenharmony_ci{ 479cabdff1aSopenharmony_ci GetBitContext *gb = &s->HEVClc->gb; 480cabdff1aSopenharmony_ci skip_bits(gb, 1); 481cabdff1aSopenharmony_ci align_get_bits(gb); 482cabdff1aSopenharmony_ci return ff_init_cabac_decoder(&s->HEVClc->cc, 483cabdff1aSopenharmony_ci gb->buffer + get_bits_count(gb) / 8, 484cabdff1aSopenharmony_ci (get_bits_left(gb) + 7) / 8); 485cabdff1aSopenharmony_ci} 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_cistatic void cabac_init_state(HEVCContext *s) 488cabdff1aSopenharmony_ci{ 489cabdff1aSopenharmony_ci int init_type = 2 - s->sh.slice_type; 490cabdff1aSopenharmony_ci int i; 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci if (s->sh.cabac_init_flag && s->sh.slice_type != HEVC_SLICE_I) 493cabdff1aSopenharmony_ci init_type ^= 3; 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci for (i = 0; i < HEVC_CONTEXTS; i++) { 496cabdff1aSopenharmony_ci int init_value = init_values[init_type][i]; 497cabdff1aSopenharmony_ci int m = (init_value >> 4) * 5 - 45; 498cabdff1aSopenharmony_ci int n = ((init_value & 15) << 3) - 16; 499cabdff1aSopenharmony_ci int pre = 2 * (((m * av_clip(s->sh.slice_qp, 0, 51)) >> 4) + n) - 127; 500cabdff1aSopenharmony_ci 501cabdff1aSopenharmony_ci pre ^= pre >> 31; 502cabdff1aSopenharmony_ci if (pre > 124) 503cabdff1aSopenharmony_ci pre = 124 + (pre & 1); 504cabdff1aSopenharmony_ci s->HEVClc->cabac_state[i] = pre; 505cabdff1aSopenharmony_ci } 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 508cabdff1aSopenharmony_ci s->HEVClc->stat_coeff[i] = 0; 509cabdff1aSopenharmony_ci} 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ciint ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts, int thread) 512cabdff1aSopenharmony_ci{ 513cabdff1aSopenharmony_ci if (ctb_addr_ts == s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) { 514cabdff1aSopenharmony_ci int ret = cabac_init_decoder(s); 515cabdff1aSopenharmony_ci if (ret < 0) 516cabdff1aSopenharmony_ci return ret; 517cabdff1aSopenharmony_ci if (s->sh.dependent_slice_segment_flag == 0 || 518cabdff1aSopenharmony_ci (s->ps.pps->tiles_enabled_flag && 519cabdff1aSopenharmony_ci s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1])) 520cabdff1aSopenharmony_ci cabac_init_state(s); 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci if (!s->sh.first_slice_in_pic_flag && 523cabdff1aSopenharmony_ci s->ps.pps->entropy_coding_sync_enabled_flag) { 524cabdff1aSopenharmony_ci if (ctb_addr_ts % s->ps.sps->ctb_width == 0) { 525cabdff1aSopenharmony_ci if (s->ps.sps->ctb_width == 1) 526cabdff1aSopenharmony_ci cabac_init_state(s); 527cabdff1aSopenharmony_ci else if (s->sh.dependent_slice_segment_flag == 1) 528cabdff1aSopenharmony_ci load_states(s, thread); 529cabdff1aSopenharmony_ci } 530cabdff1aSopenharmony_ci } 531cabdff1aSopenharmony_ci } else { 532cabdff1aSopenharmony_ci if (s->ps.pps->tiles_enabled_flag && 533cabdff1aSopenharmony_ci s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) { 534cabdff1aSopenharmony_ci int ret; 535cabdff1aSopenharmony_ci if (s->threads_number == 1) 536cabdff1aSopenharmony_ci ret = cabac_reinit(s->HEVClc); 537cabdff1aSopenharmony_ci else { 538cabdff1aSopenharmony_ci ret = cabac_init_decoder(s); 539cabdff1aSopenharmony_ci } 540cabdff1aSopenharmony_ci if (ret < 0) 541cabdff1aSopenharmony_ci return ret; 542cabdff1aSopenharmony_ci cabac_init_state(s); 543cabdff1aSopenharmony_ci } 544cabdff1aSopenharmony_ci if (s->ps.pps->entropy_coding_sync_enabled_flag) { 545cabdff1aSopenharmony_ci if (ctb_addr_ts % s->ps.sps->ctb_width == 0) { 546cabdff1aSopenharmony_ci int ret; 547cabdff1aSopenharmony_ci get_cabac_terminate(&s->HEVClc->cc); 548cabdff1aSopenharmony_ci if (s->threads_number == 1) 549cabdff1aSopenharmony_ci ret = cabac_reinit(s->HEVClc); 550cabdff1aSopenharmony_ci else { 551cabdff1aSopenharmony_ci ret = cabac_init_decoder(s); 552cabdff1aSopenharmony_ci } 553cabdff1aSopenharmony_ci if (ret < 0) 554cabdff1aSopenharmony_ci return ret; 555cabdff1aSopenharmony_ci 556cabdff1aSopenharmony_ci if (s->ps.sps->ctb_width == 1) 557cabdff1aSopenharmony_ci cabac_init_state(s); 558cabdff1aSopenharmony_ci else 559cabdff1aSopenharmony_ci load_states(s, thread); 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci } 563cabdff1aSopenharmony_ci return 0; 564cabdff1aSopenharmony_ci} 565cabdff1aSopenharmony_ci 566cabdff1aSopenharmony_ci#define GET_CABAC(ctx) get_cabac(&s->HEVClc->cc, &s->HEVClc->cabac_state[ctx]) 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ciint ff_hevc_sao_merge_flag_decode(HEVCContext *s) 569cabdff1aSopenharmony_ci{ 570cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SAO_MERGE_FLAG]); 571cabdff1aSopenharmony_ci} 572cabdff1aSopenharmony_ci 573cabdff1aSopenharmony_ciint ff_hevc_sao_type_idx_decode(HEVCContext *s) 574cabdff1aSopenharmony_ci{ 575cabdff1aSopenharmony_ci if (!GET_CABAC(elem_offset[SAO_TYPE_IDX])) 576cabdff1aSopenharmony_ci return 0; 577cabdff1aSopenharmony_ci 578cabdff1aSopenharmony_ci if (!get_cabac_bypass(&s->HEVClc->cc)) 579cabdff1aSopenharmony_ci return SAO_BAND; 580cabdff1aSopenharmony_ci return SAO_EDGE; 581cabdff1aSopenharmony_ci} 582cabdff1aSopenharmony_ci 583cabdff1aSopenharmony_ciint ff_hevc_sao_band_position_decode(HEVCContext *s) 584cabdff1aSopenharmony_ci{ 585cabdff1aSopenharmony_ci int i; 586cabdff1aSopenharmony_ci int value = get_cabac_bypass(&s->HEVClc->cc); 587cabdff1aSopenharmony_ci 588cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 589cabdff1aSopenharmony_ci value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc); 590cabdff1aSopenharmony_ci return value; 591cabdff1aSopenharmony_ci} 592cabdff1aSopenharmony_ci 593cabdff1aSopenharmony_ciint ff_hevc_sao_offset_abs_decode(HEVCContext *s) 594cabdff1aSopenharmony_ci{ 595cabdff1aSopenharmony_ci int i = 0; 596cabdff1aSopenharmony_ci int length = (1 << (FFMIN(s->ps.sps->bit_depth, 10) - 5)) - 1; 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci while (i < length && get_cabac_bypass(&s->HEVClc->cc)) 599cabdff1aSopenharmony_ci i++; 600cabdff1aSopenharmony_ci return i; 601cabdff1aSopenharmony_ci} 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_ciint ff_hevc_sao_offset_sign_decode(HEVCContext *s) 604cabdff1aSopenharmony_ci{ 605cabdff1aSopenharmony_ci return get_cabac_bypass(&s->HEVClc->cc); 606cabdff1aSopenharmony_ci} 607cabdff1aSopenharmony_ci 608cabdff1aSopenharmony_ciint ff_hevc_sao_eo_class_decode(HEVCContext *s) 609cabdff1aSopenharmony_ci{ 610cabdff1aSopenharmony_ci int ret = get_cabac_bypass(&s->HEVClc->cc) << 1; 611cabdff1aSopenharmony_ci ret |= get_cabac_bypass(&s->HEVClc->cc); 612cabdff1aSopenharmony_ci return ret; 613cabdff1aSopenharmony_ci} 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_ciint ff_hevc_end_of_slice_flag_decode(HEVCContext *s) 616cabdff1aSopenharmony_ci{ 617cabdff1aSopenharmony_ci return get_cabac_terminate(&s->HEVClc->cc); 618cabdff1aSopenharmony_ci} 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ciint ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s) 621cabdff1aSopenharmony_ci{ 622cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[CU_TRANSQUANT_BYPASS_FLAG]); 623cabdff1aSopenharmony_ci} 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_ciint ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb) 626cabdff1aSopenharmony_ci{ 627cabdff1aSopenharmony_ci int min_cb_width = s->ps.sps->min_cb_width; 628cabdff1aSopenharmony_ci int inc = 0; 629cabdff1aSopenharmony_ci int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size); 630cabdff1aSopenharmony_ci int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size); 631cabdff1aSopenharmony_ci 632cabdff1aSopenharmony_ci if (s->HEVClc->ctb_left_flag || x0b) 633cabdff1aSopenharmony_ci inc = !!SAMPLE_CTB(s->skip_flag, x_cb - 1, y_cb); 634cabdff1aSopenharmony_ci if (s->HEVClc->ctb_up_flag || y0b) 635cabdff1aSopenharmony_ci inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1); 636cabdff1aSopenharmony_ci 637cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SKIP_FLAG] + inc); 638cabdff1aSopenharmony_ci} 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_ciint ff_hevc_cu_qp_delta_abs(HEVCContext *s) 641cabdff1aSopenharmony_ci{ 642cabdff1aSopenharmony_ci int prefix_val = 0; 643cabdff1aSopenharmony_ci int suffix_val = 0; 644cabdff1aSopenharmony_ci int inc = 0; 645cabdff1aSopenharmony_ci 646cabdff1aSopenharmony_ci while (prefix_val < 5 && GET_CABAC(elem_offset[CU_QP_DELTA] + inc)) { 647cabdff1aSopenharmony_ci prefix_val++; 648cabdff1aSopenharmony_ci inc = 1; 649cabdff1aSopenharmony_ci } 650cabdff1aSopenharmony_ci if (prefix_val >= 5) { 651cabdff1aSopenharmony_ci int k = 0; 652cabdff1aSopenharmony_ci while (k < 7 && get_cabac_bypass(&s->HEVClc->cc)) { 653cabdff1aSopenharmony_ci suffix_val += 1 << k; 654cabdff1aSopenharmony_ci k++; 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci if (k == 7) { 657cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k); 658cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 659cabdff1aSopenharmony_ci } 660cabdff1aSopenharmony_ci 661cabdff1aSopenharmony_ci while (k--) 662cabdff1aSopenharmony_ci suffix_val += get_cabac_bypass(&s->HEVClc->cc) << k; 663cabdff1aSopenharmony_ci } 664cabdff1aSopenharmony_ci return prefix_val + suffix_val; 665cabdff1aSopenharmony_ci} 666cabdff1aSopenharmony_ci 667cabdff1aSopenharmony_ciint ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s) 668cabdff1aSopenharmony_ci{ 669cabdff1aSopenharmony_ci return get_cabac_bypass(&s->HEVClc->cc); 670cabdff1aSopenharmony_ci} 671cabdff1aSopenharmony_ci 672cabdff1aSopenharmony_ciint ff_hevc_cu_chroma_qp_offset_flag(HEVCContext *s) 673cabdff1aSopenharmony_ci{ 674cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_FLAG]); 675cabdff1aSopenharmony_ci} 676cabdff1aSopenharmony_ci 677cabdff1aSopenharmony_ciint ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s) 678cabdff1aSopenharmony_ci{ 679cabdff1aSopenharmony_ci int c_max= FFMAX(5, s->ps.pps->chroma_qp_offset_list_len_minus1); 680cabdff1aSopenharmony_ci int i = 0; 681cabdff1aSopenharmony_ci 682cabdff1aSopenharmony_ci while (i < c_max && GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_IDX])) 683cabdff1aSopenharmony_ci i++; 684cabdff1aSopenharmony_ci 685cabdff1aSopenharmony_ci return i; 686cabdff1aSopenharmony_ci} 687cabdff1aSopenharmony_ci 688cabdff1aSopenharmony_ciint ff_hevc_pred_mode_decode(HEVCContext *s) 689cabdff1aSopenharmony_ci{ 690cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[PRED_MODE_FLAG]); 691cabdff1aSopenharmony_ci} 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ciint ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0) 694cabdff1aSopenharmony_ci{ 695cabdff1aSopenharmony_ci int inc = 0, depth_left = 0, depth_top = 0; 696cabdff1aSopenharmony_ci int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size); 697cabdff1aSopenharmony_ci int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size); 698cabdff1aSopenharmony_ci int x_cb = x0 >> s->ps.sps->log2_min_cb_size; 699cabdff1aSopenharmony_ci int y_cb = y0 >> s->ps.sps->log2_min_cb_size; 700cabdff1aSopenharmony_ci 701cabdff1aSopenharmony_ci if (s->HEVClc->ctb_left_flag || x0b) 702cabdff1aSopenharmony_ci depth_left = s->tab_ct_depth[(y_cb) * s->ps.sps->min_cb_width + x_cb - 1]; 703cabdff1aSopenharmony_ci if (s->HEVClc->ctb_up_flag || y0b) 704cabdff1aSopenharmony_ci depth_top = s->tab_ct_depth[(y_cb - 1) * s->ps.sps->min_cb_width + x_cb]; 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci inc += (depth_left > ct_depth); 707cabdff1aSopenharmony_ci inc += (depth_top > ct_depth); 708cabdff1aSopenharmony_ci 709cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SPLIT_CODING_UNIT_FLAG] + inc); 710cabdff1aSopenharmony_ci} 711cabdff1aSopenharmony_ci 712cabdff1aSopenharmony_ciint ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size) 713cabdff1aSopenharmony_ci{ 714cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE])) // 1 715cabdff1aSopenharmony_ci return PART_2Nx2N; 716cabdff1aSopenharmony_ci if (log2_cb_size == s->ps.sps->log2_min_cb_size) { 717cabdff1aSopenharmony_ci if (s->HEVClc->cu.pred_mode == MODE_INTRA) // 0 718cabdff1aSopenharmony_ci return PART_NxN; 719cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01 720cabdff1aSopenharmony_ci return PART_2NxN; 721cabdff1aSopenharmony_ci if (log2_cb_size == 3) // 00 722cabdff1aSopenharmony_ci return PART_Nx2N; 723cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE] + 2)) // 001 724cabdff1aSopenharmony_ci return PART_Nx2N; 725cabdff1aSopenharmony_ci return PART_NxN; // 000 726cabdff1aSopenharmony_ci } 727cabdff1aSopenharmony_ci 728cabdff1aSopenharmony_ci if (!s->ps.sps->amp_enabled_flag) { 729cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01 730cabdff1aSopenharmony_ci return PART_2NxN; 731cabdff1aSopenharmony_ci return PART_Nx2N; 732cabdff1aSopenharmony_ci } 733cabdff1aSopenharmony_ci 734cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX 735cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 011 736cabdff1aSopenharmony_ci return PART_2NxN; 737cabdff1aSopenharmony_ci if (get_cabac_bypass(&s->HEVClc->cc)) // 0101 738cabdff1aSopenharmony_ci return PART_2NxnD; 739cabdff1aSopenharmony_ci return PART_2NxnU; // 0100 740cabdff1aSopenharmony_ci } 741cabdff1aSopenharmony_ci 742cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 001 743cabdff1aSopenharmony_ci return PART_Nx2N; 744cabdff1aSopenharmony_ci if (get_cabac_bypass(&s->HEVClc->cc)) // 0001 745cabdff1aSopenharmony_ci return PART_nRx2N; 746cabdff1aSopenharmony_ci return PART_nLx2N; // 0000 747cabdff1aSopenharmony_ci} 748cabdff1aSopenharmony_ci 749cabdff1aSopenharmony_ciint ff_hevc_pcm_flag_decode(HEVCContext *s) 750cabdff1aSopenharmony_ci{ 751cabdff1aSopenharmony_ci return get_cabac_terminate(&s->HEVClc->cc); 752cabdff1aSopenharmony_ci} 753cabdff1aSopenharmony_ci 754cabdff1aSopenharmony_ciint ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s) 755cabdff1aSopenharmony_ci{ 756cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[PREV_INTRA_LUMA_PRED_FLAG]); 757cabdff1aSopenharmony_ci} 758cabdff1aSopenharmony_ci 759cabdff1aSopenharmony_ciint ff_hevc_mpm_idx_decode(HEVCContext *s) 760cabdff1aSopenharmony_ci{ 761cabdff1aSopenharmony_ci int i = 0; 762cabdff1aSopenharmony_ci while (i < 2 && get_cabac_bypass(&s->HEVClc->cc)) 763cabdff1aSopenharmony_ci i++; 764cabdff1aSopenharmony_ci return i; 765cabdff1aSopenharmony_ci} 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ciint ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s) 768cabdff1aSopenharmony_ci{ 769cabdff1aSopenharmony_ci int i; 770cabdff1aSopenharmony_ci int value = get_cabac_bypass(&s->HEVClc->cc); 771cabdff1aSopenharmony_ci 772cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 773cabdff1aSopenharmony_ci value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc); 774cabdff1aSopenharmony_ci return value; 775cabdff1aSopenharmony_ci} 776cabdff1aSopenharmony_ci 777cabdff1aSopenharmony_ciint ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s) 778cabdff1aSopenharmony_ci{ 779cabdff1aSopenharmony_ci int ret; 780cabdff1aSopenharmony_ci if (!GET_CABAC(elem_offset[INTRA_CHROMA_PRED_MODE])) 781cabdff1aSopenharmony_ci return 4; 782cabdff1aSopenharmony_ci 783cabdff1aSopenharmony_ci ret = get_cabac_bypass(&s->HEVClc->cc) << 1; 784cabdff1aSopenharmony_ci ret |= get_cabac_bypass(&s->HEVClc->cc); 785cabdff1aSopenharmony_ci return ret; 786cabdff1aSopenharmony_ci} 787cabdff1aSopenharmony_ci 788cabdff1aSopenharmony_ciint ff_hevc_merge_idx_decode(HEVCContext *s) 789cabdff1aSopenharmony_ci{ 790cabdff1aSopenharmony_ci int i = GET_CABAC(elem_offset[MERGE_IDX]); 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_ci if (i != 0) { 793cabdff1aSopenharmony_ci while (i < s->sh.max_num_merge_cand-1 && get_cabac_bypass(&s->HEVClc->cc)) 794cabdff1aSopenharmony_ci i++; 795cabdff1aSopenharmony_ci } 796cabdff1aSopenharmony_ci return i; 797cabdff1aSopenharmony_ci} 798cabdff1aSopenharmony_ci 799cabdff1aSopenharmony_ciint ff_hevc_merge_flag_decode(HEVCContext *s) 800cabdff1aSopenharmony_ci{ 801cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[MERGE_FLAG]); 802cabdff1aSopenharmony_ci} 803cabdff1aSopenharmony_ci 804cabdff1aSopenharmony_ciint ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH) 805cabdff1aSopenharmony_ci{ 806cabdff1aSopenharmony_ci if (nPbW + nPbH == 12) 807cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4); 808cabdff1aSopenharmony_ci if (GET_CABAC(elem_offset[INTER_PRED_IDC] + s->HEVClc->ct_depth)) 809cabdff1aSopenharmony_ci return PRED_BI; 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4); 812cabdff1aSopenharmony_ci} 813cabdff1aSopenharmony_ci 814cabdff1aSopenharmony_ciint ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx) 815cabdff1aSopenharmony_ci{ 816cabdff1aSopenharmony_ci int i = 0; 817cabdff1aSopenharmony_ci int max = num_ref_idx_lx - 1; 818cabdff1aSopenharmony_ci int max_ctx = FFMIN(max, 2); 819cabdff1aSopenharmony_ci 820cabdff1aSopenharmony_ci while (i < max_ctx && GET_CABAC(elem_offset[REF_IDX_L0] + i)) 821cabdff1aSopenharmony_ci i++; 822cabdff1aSopenharmony_ci if (i == 2) { 823cabdff1aSopenharmony_ci while (i < max && get_cabac_bypass(&s->HEVClc->cc)) 824cabdff1aSopenharmony_ci i++; 825cabdff1aSopenharmony_ci } 826cabdff1aSopenharmony_ci 827cabdff1aSopenharmony_ci return i; 828cabdff1aSopenharmony_ci} 829cabdff1aSopenharmony_ci 830cabdff1aSopenharmony_ciint ff_hevc_mvp_lx_flag_decode(HEVCContext *s) 831cabdff1aSopenharmony_ci{ 832cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[MVP_LX_FLAG]); 833cabdff1aSopenharmony_ci} 834cabdff1aSopenharmony_ci 835cabdff1aSopenharmony_ciint ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s) 836cabdff1aSopenharmony_ci{ 837cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[NO_RESIDUAL_DATA_FLAG]); 838cabdff1aSopenharmony_ci} 839cabdff1aSopenharmony_ci 840cabdff1aSopenharmony_cistatic av_always_inline int abs_mvd_greater0_flag_decode(HEVCContext *s) 841cabdff1aSopenharmony_ci{ 842cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[ABS_MVD_GREATER0_FLAG]); 843cabdff1aSopenharmony_ci} 844cabdff1aSopenharmony_ci 845cabdff1aSopenharmony_cistatic av_always_inline int abs_mvd_greater1_flag_decode(HEVCContext *s) 846cabdff1aSopenharmony_ci{ 847cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[ABS_MVD_GREATER1_FLAG] + 1); 848cabdff1aSopenharmony_ci} 849cabdff1aSopenharmony_ci 850cabdff1aSopenharmony_cistatic av_always_inline int mvd_decode(HEVCContext *s) 851cabdff1aSopenharmony_ci{ 852cabdff1aSopenharmony_ci int ret = 2; 853cabdff1aSopenharmony_ci int k = 1; 854cabdff1aSopenharmony_ci 855cabdff1aSopenharmony_ci while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) { 856cabdff1aSopenharmony_ci ret += 1U << k; 857cabdff1aSopenharmony_ci k++; 858cabdff1aSopenharmony_ci } 859cabdff1aSopenharmony_ci if (k == CABAC_MAX_BIN) { 860cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k); 861cabdff1aSopenharmony_ci return 0; 862cabdff1aSopenharmony_ci } 863cabdff1aSopenharmony_ci while (k--) 864cabdff1aSopenharmony_ci ret += get_cabac_bypass(&s->HEVClc->cc) << k; 865cabdff1aSopenharmony_ci return get_cabac_bypass_sign(&s->HEVClc->cc, -ret); 866cabdff1aSopenharmony_ci} 867cabdff1aSopenharmony_ci 868cabdff1aSopenharmony_cistatic av_always_inline int mvd_sign_flag_decode(HEVCContext *s) 869cabdff1aSopenharmony_ci{ 870cabdff1aSopenharmony_ci return get_cabac_bypass_sign(&s->HEVClc->cc, -1); 871cabdff1aSopenharmony_ci} 872cabdff1aSopenharmony_ci 873cabdff1aSopenharmony_ciint ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size) 874cabdff1aSopenharmony_ci{ 875cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SPLIT_TRANSFORM_FLAG] + 5 - log2_trafo_size); 876cabdff1aSopenharmony_ci} 877cabdff1aSopenharmony_ci 878cabdff1aSopenharmony_ciint ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth) 879cabdff1aSopenharmony_ci{ 880cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[CBF_CB_CR] + trafo_depth); 881cabdff1aSopenharmony_ci} 882cabdff1aSopenharmony_ci 883cabdff1aSopenharmony_ciint ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth) 884cabdff1aSopenharmony_ci{ 885cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[CBF_LUMA] + !trafo_depth); 886cabdff1aSopenharmony_ci} 887cabdff1aSopenharmony_ci 888cabdff1aSopenharmony_cistatic int hevc_transform_skip_flag_decode(HEVCContext *s, int c_idx) 889cabdff1aSopenharmony_ci{ 890cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[TRANSFORM_SKIP_FLAG] + !!c_idx); 891cabdff1aSopenharmony_ci} 892cabdff1aSopenharmony_ci 893cabdff1aSopenharmony_cistatic int explicit_rdpcm_flag_decode(HEVCContext *s, int c_idx) 894cabdff1aSopenharmony_ci{ 895cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[EXPLICIT_RDPCM_FLAG] + !!c_idx); 896cabdff1aSopenharmony_ci} 897cabdff1aSopenharmony_ci 898cabdff1aSopenharmony_cistatic int explicit_rdpcm_dir_flag_decode(HEVCContext *s, int c_idx) 899cabdff1aSopenharmony_ci{ 900cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[EXPLICIT_RDPCM_DIR_FLAG] + !!c_idx); 901cabdff1aSopenharmony_ci} 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_ciint ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx) { 904cabdff1aSopenharmony_ci int i =0; 905cabdff1aSopenharmony_ci 906cabdff1aSopenharmony_ci while (i < 4 && GET_CABAC(elem_offset[LOG2_RES_SCALE_ABS] + 4 * idx + i)) 907cabdff1aSopenharmony_ci i++; 908cabdff1aSopenharmony_ci 909cabdff1aSopenharmony_ci return i; 910cabdff1aSopenharmony_ci} 911cabdff1aSopenharmony_ci 912cabdff1aSopenharmony_ciint ff_hevc_res_scale_sign_flag(HEVCContext *s, int idx) { 913cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[RES_SCALE_SIGN_FLAG] + idx); 914cabdff1aSopenharmony_ci} 915cabdff1aSopenharmony_ci 916cabdff1aSopenharmony_cistatic av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCContext *s, int c_idx, 917cabdff1aSopenharmony_ci int log2_size, int *last_scx_prefix, int *last_scy_prefix) 918cabdff1aSopenharmony_ci{ 919cabdff1aSopenharmony_ci int i = 0; 920cabdff1aSopenharmony_ci int max = (log2_size << 1) - 1; 921cabdff1aSopenharmony_ci int ctx_offset, ctx_shift; 922cabdff1aSopenharmony_ci 923cabdff1aSopenharmony_ci if (!c_idx) { 924cabdff1aSopenharmony_ci ctx_offset = 3 * (log2_size - 2) + ((log2_size - 1) >> 2); 925cabdff1aSopenharmony_ci ctx_shift = (log2_size + 1) >> 2; 926cabdff1aSopenharmony_ci } else { 927cabdff1aSopenharmony_ci ctx_offset = 15; 928cabdff1aSopenharmony_ci ctx_shift = log2_size - 2; 929cabdff1aSopenharmony_ci } 930cabdff1aSopenharmony_ci while (i < max && 931cabdff1aSopenharmony_ci GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_X_PREFIX] + (i >> ctx_shift) + ctx_offset)) 932cabdff1aSopenharmony_ci i++; 933cabdff1aSopenharmony_ci *last_scx_prefix = i; 934cabdff1aSopenharmony_ci 935cabdff1aSopenharmony_ci i = 0; 936cabdff1aSopenharmony_ci while (i < max && 937cabdff1aSopenharmony_ci GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_Y_PREFIX] + (i >> ctx_shift) + ctx_offset)) 938cabdff1aSopenharmony_ci i++; 939cabdff1aSopenharmony_ci *last_scy_prefix = i; 940cabdff1aSopenharmony_ci} 941cabdff1aSopenharmony_ci 942cabdff1aSopenharmony_cistatic av_always_inline int last_significant_coeff_suffix_decode(HEVCContext *s, 943cabdff1aSopenharmony_ci int last_significant_coeff_prefix) 944cabdff1aSopenharmony_ci{ 945cabdff1aSopenharmony_ci int i; 946cabdff1aSopenharmony_ci int length = (last_significant_coeff_prefix >> 1) - 1; 947cabdff1aSopenharmony_ci int value = get_cabac_bypass(&s->HEVClc->cc); 948cabdff1aSopenharmony_ci 949cabdff1aSopenharmony_ci for (i = 1; i < length; i++) 950cabdff1aSopenharmony_ci value = (value << 1) | get_cabac_bypass(&s->HEVClc->cc); 951cabdff1aSopenharmony_ci return value; 952cabdff1aSopenharmony_ci} 953cabdff1aSopenharmony_ci 954cabdff1aSopenharmony_cistatic av_always_inline int significant_coeff_group_flag_decode(HEVCContext *s, int c_idx, int ctx_cg) 955cabdff1aSopenharmony_ci{ 956cabdff1aSopenharmony_ci int inc; 957cabdff1aSopenharmony_ci 958cabdff1aSopenharmony_ci inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0); 959cabdff1aSopenharmony_ci 960cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_GROUP_FLAG] + inc); 961cabdff1aSopenharmony_ci} 962cabdff1aSopenharmony_cistatic av_always_inline int significant_coeff_flag_decode(HEVCContext *s, int x_c, int y_c, 963cabdff1aSopenharmony_ci int offset, const uint8_t *ctx_idx_map) 964cabdff1aSopenharmony_ci{ 965cabdff1aSopenharmony_ci int inc = ctx_idx_map[(y_c << 2) + x_c] + offset; 966cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + inc); 967cabdff1aSopenharmony_ci} 968cabdff1aSopenharmony_ci 969cabdff1aSopenharmony_cistatic av_always_inline int significant_coeff_flag_decode_0(HEVCContext *s, int c_idx, int offset) 970cabdff1aSopenharmony_ci{ 971cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + offset); 972cabdff1aSopenharmony_ci} 973cabdff1aSopenharmony_ci 974cabdff1aSopenharmony_cistatic av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCContext *s, int c_idx, int inc) 975cabdff1aSopenharmony_ci{ 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci if (c_idx > 0) 978cabdff1aSopenharmony_ci inc += 16; 979cabdff1aSopenharmony_ci 980cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER1_FLAG] + inc); 981cabdff1aSopenharmony_ci} 982cabdff1aSopenharmony_ci 983cabdff1aSopenharmony_cistatic av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCContext *s, int c_idx, int inc) 984cabdff1aSopenharmony_ci{ 985cabdff1aSopenharmony_ci if (c_idx > 0) 986cabdff1aSopenharmony_ci inc += 4; 987cabdff1aSopenharmony_ci 988cabdff1aSopenharmony_ci return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER2_FLAG] + inc); 989cabdff1aSopenharmony_ci} 990cabdff1aSopenharmony_ci 991cabdff1aSopenharmony_cistatic av_always_inline int coeff_abs_level_remaining_decode(HEVCContext *s, int rc_rice_param) 992cabdff1aSopenharmony_ci{ 993cabdff1aSopenharmony_ci int prefix = 0; 994cabdff1aSopenharmony_ci int suffix = 0; 995cabdff1aSopenharmony_ci int last_coeff_abs_level_remaining; 996cabdff1aSopenharmony_ci int i; 997cabdff1aSopenharmony_ci 998cabdff1aSopenharmony_ci while (prefix < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) 999cabdff1aSopenharmony_ci prefix++; 1000cabdff1aSopenharmony_ci 1001cabdff1aSopenharmony_ci if (prefix < 3) { 1002cabdff1aSopenharmony_ci for (i = 0; i < rc_rice_param; i++) 1003cabdff1aSopenharmony_ci suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc); 1004cabdff1aSopenharmony_ci last_coeff_abs_level_remaining = (prefix << rc_rice_param) + suffix; 1005cabdff1aSopenharmony_ci } else { 1006cabdff1aSopenharmony_ci int prefix_minus3 = prefix - 3; 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci if (prefix == CABAC_MAX_BIN || prefix_minus3 + rc_rice_param > 16 + 6) { 1009cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", prefix); 1010cabdff1aSopenharmony_ci return 0; 1011cabdff1aSopenharmony_ci } 1012cabdff1aSopenharmony_ci 1013cabdff1aSopenharmony_ci for (i = 0; i < prefix_minus3 + rc_rice_param; i++) 1014cabdff1aSopenharmony_ci suffix = (suffix << 1) | get_cabac_bypass(&s->HEVClc->cc); 1015cabdff1aSopenharmony_ci last_coeff_abs_level_remaining = (((1 << prefix_minus3) + 3 - 1) 1016cabdff1aSopenharmony_ci << rc_rice_param) + suffix; 1017cabdff1aSopenharmony_ci } 1018cabdff1aSopenharmony_ci return last_coeff_abs_level_remaining; 1019cabdff1aSopenharmony_ci} 1020cabdff1aSopenharmony_ci 1021cabdff1aSopenharmony_cistatic av_always_inline int coeff_sign_flag_decode(HEVCContext *s, uint8_t nb) 1022cabdff1aSopenharmony_ci{ 1023cabdff1aSopenharmony_ci int i; 1024cabdff1aSopenharmony_ci int ret = 0; 1025cabdff1aSopenharmony_ci 1026cabdff1aSopenharmony_ci for (i = 0; i < nb; i++) 1027cabdff1aSopenharmony_ci ret = (ret << 1) | get_cabac_bypass(&s->HEVClc->cc); 1028cabdff1aSopenharmony_ci return ret; 1029cabdff1aSopenharmony_ci} 1030cabdff1aSopenharmony_ci 1031cabdff1aSopenharmony_civoid ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0, 1032cabdff1aSopenharmony_ci int log2_trafo_size, enum ScanType scan_idx, 1033cabdff1aSopenharmony_ci int c_idx) 1034cabdff1aSopenharmony_ci{ 1035cabdff1aSopenharmony_ci#define GET_COORD(offset, n) \ 1036cabdff1aSopenharmony_ci do { \ 1037cabdff1aSopenharmony_ci x_c = (x_cg << 2) + scan_x_off[n]; \ 1038cabdff1aSopenharmony_ci y_c = (y_cg << 2) + scan_y_off[n]; \ 1039cabdff1aSopenharmony_ci } while (0) 1040cabdff1aSopenharmony_ci HEVCLocalContext *lc = s->HEVClc; 1041cabdff1aSopenharmony_ci int transform_skip_flag = 0; 1042cabdff1aSopenharmony_ci 1043cabdff1aSopenharmony_ci int last_significant_coeff_x, last_significant_coeff_y; 1044cabdff1aSopenharmony_ci int last_scan_pos; 1045cabdff1aSopenharmony_ci int n_end; 1046cabdff1aSopenharmony_ci int num_coeff = 0; 1047cabdff1aSopenharmony_ci int greater1_ctx = 1; 1048cabdff1aSopenharmony_ci 1049cabdff1aSopenharmony_ci int num_last_subset; 1050cabdff1aSopenharmony_ci int x_cg_last_sig, y_cg_last_sig; 1051cabdff1aSopenharmony_ci 1052cabdff1aSopenharmony_ci const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off; 1053cabdff1aSopenharmony_ci 1054cabdff1aSopenharmony_ci ptrdiff_t stride = s->frame->linesize[c_idx]; 1055cabdff1aSopenharmony_ci int hshift = s->ps.sps->hshift[c_idx]; 1056cabdff1aSopenharmony_ci int vshift = s->ps.sps->vshift[c_idx]; 1057cabdff1aSopenharmony_ci uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride + 1058cabdff1aSopenharmony_ci ((x0 >> hshift) << s->ps.sps->pixel_shift)]; 1059cabdff1aSopenharmony_ci int16_t *coeffs = (int16_t*)(c_idx ? lc->edge_emu_buffer2 : lc->edge_emu_buffer); 1060cabdff1aSopenharmony_ci uint8_t significant_coeff_group_flag[8][8] = {{0}}; 1061cabdff1aSopenharmony_ci int explicit_rdpcm_flag = 0; 1062cabdff1aSopenharmony_ci int explicit_rdpcm_dir_flag; 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_ci int trafo_size = 1 << log2_trafo_size; 1065cabdff1aSopenharmony_ci int i; 1066cabdff1aSopenharmony_ci int qp,shift,add,scale,scale_m; 1067cabdff1aSopenharmony_ci static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 }; 1068cabdff1aSopenharmony_ci const uint8_t *scale_matrix = NULL; 1069cabdff1aSopenharmony_ci uint8_t dc_scale; 1070cabdff1aSopenharmony_ci int pred_mode_intra = (c_idx == 0) ? lc->tu.intra_pred_mode : 1071cabdff1aSopenharmony_ci lc->tu.intra_pred_mode_c; 1072cabdff1aSopenharmony_ci 1073cabdff1aSopenharmony_ci memset(coeffs, 0, trafo_size * trafo_size * sizeof(int16_t)); 1074cabdff1aSopenharmony_ci 1075cabdff1aSopenharmony_ci // Derive QP for dequant 1076cabdff1aSopenharmony_ci if (!lc->cu.cu_transquant_bypass_flag) { 1077cabdff1aSopenharmony_ci static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 }; 1078cabdff1aSopenharmony_ci static const uint8_t rem6[51 + 4 * 6 + 1] = { 1079cabdff1aSopenharmony_ci 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 1080cabdff1aSopenharmony_ci 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1081cabdff1aSopenharmony_ci 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 1082cabdff1aSopenharmony_ci 4, 5, 0, 1, 2, 3, 4, 5, 0, 1 1083cabdff1aSopenharmony_ci }; 1084cabdff1aSopenharmony_ci 1085cabdff1aSopenharmony_ci static const uint8_t div6[51 + 4 * 6 + 1] = { 1086cabdff1aSopenharmony_ci 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1087cabdff1aSopenharmony_ci 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 1088cabdff1aSopenharmony_ci 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 1089cabdff1aSopenharmony_ci 10, 10, 11, 11, 11, 11, 11, 11, 12, 12 1090cabdff1aSopenharmony_ci }; 1091cabdff1aSopenharmony_ci int qp_y = lc->qp_y; 1092cabdff1aSopenharmony_ci 1093cabdff1aSopenharmony_ci if (s->ps.pps->transform_skip_enabled_flag && 1094cabdff1aSopenharmony_ci log2_trafo_size <= s->ps.pps->log2_max_transform_skip_block_size) { 1095cabdff1aSopenharmony_ci transform_skip_flag = hevc_transform_skip_flag_decode(s, c_idx); 1096cabdff1aSopenharmony_ci } 1097cabdff1aSopenharmony_ci 1098cabdff1aSopenharmony_ci if (c_idx == 0) { 1099cabdff1aSopenharmony_ci qp = qp_y + s->ps.sps->qp_bd_offset; 1100cabdff1aSopenharmony_ci } else { 1101cabdff1aSopenharmony_ci int qp_i, offset; 1102cabdff1aSopenharmony_ci 1103cabdff1aSopenharmony_ci if (c_idx == 1) 1104cabdff1aSopenharmony_ci offset = s->ps.pps->cb_qp_offset + s->sh.slice_cb_qp_offset + 1105cabdff1aSopenharmony_ci lc->tu.cu_qp_offset_cb; 1106cabdff1aSopenharmony_ci else 1107cabdff1aSopenharmony_ci offset = s->ps.pps->cr_qp_offset + s->sh.slice_cr_qp_offset + 1108cabdff1aSopenharmony_ci lc->tu.cu_qp_offset_cr; 1109cabdff1aSopenharmony_ci 1110cabdff1aSopenharmony_ci qp_i = av_clip(qp_y + offset, - s->ps.sps->qp_bd_offset, 57); 1111cabdff1aSopenharmony_ci if (s->ps.sps->chroma_format_idc == 1) { 1112cabdff1aSopenharmony_ci if (qp_i < 30) 1113cabdff1aSopenharmony_ci qp = qp_i; 1114cabdff1aSopenharmony_ci else if (qp_i > 43) 1115cabdff1aSopenharmony_ci qp = qp_i - 6; 1116cabdff1aSopenharmony_ci else 1117cabdff1aSopenharmony_ci qp = qp_c[qp_i - 30]; 1118cabdff1aSopenharmony_ci } else { 1119cabdff1aSopenharmony_ci if (qp_i > 51) 1120cabdff1aSopenharmony_ci qp = 51; 1121cabdff1aSopenharmony_ci else 1122cabdff1aSopenharmony_ci qp = qp_i; 1123cabdff1aSopenharmony_ci } 1124cabdff1aSopenharmony_ci 1125cabdff1aSopenharmony_ci qp += s->ps.sps->qp_bd_offset; 1126cabdff1aSopenharmony_ci } 1127cabdff1aSopenharmony_ci 1128cabdff1aSopenharmony_ci shift = s->ps.sps->bit_depth + log2_trafo_size - 5; 1129cabdff1aSopenharmony_ci add = 1 << (shift-1); 1130cabdff1aSopenharmony_ci scale = level_scale[rem6[qp]] << (div6[qp]); 1131cabdff1aSopenharmony_ci scale_m = 16; // default when no custom scaling lists. 1132cabdff1aSopenharmony_ci dc_scale = 16; 1133cabdff1aSopenharmony_ci 1134cabdff1aSopenharmony_ci if (s->ps.sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) { 1135cabdff1aSopenharmony_ci const ScalingList *sl = s->ps.pps->scaling_list_data_present_flag ? 1136cabdff1aSopenharmony_ci &s->ps.pps->scaling_list : &s->ps.sps->scaling_list; 1137cabdff1aSopenharmony_ci int matrix_id = lc->cu.pred_mode != MODE_INTRA; 1138cabdff1aSopenharmony_ci 1139cabdff1aSopenharmony_ci matrix_id = 3 * matrix_id + c_idx; 1140cabdff1aSopenharmony_ci 1141cabdff1aSopenharmony_ci scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id]; 1142cabdff1aSopenharmony_ci if (log2_trafo_size >= 4) 1143cabdff1aSopenharmony_ci dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id]; 1144cabdff1aSopenharmony_ci } 1145cabdff1aSopenharmony_ci } else { 1146cabdff1aSopenharmony_ci shift = 0; 1147cabdff1aSopenharmony_ci add = 0; 1148cabdff1aSopenharmony_ci scale = 0; 1149cabdff1aSopenharmony_ci dc_scale = 0; 1150cabdff1aSopenharmony_ci } 1151cabdff1aSopenharmony_ci 1152cabdff1aSopenharmony_ci if (lc->cu.pred_mode == MODE_INTER && s->ps.sps->explicit_rdpcm_enabled_flag && 1153cabdff1aSopenharmony_ci (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) { 1154cabdff1aSopenharmony_ci explicit_rdpcm_flag = explicit_rdpcm_flag_decode(s, c_idx); 1155cabdff1aSopenharmony_ci if (explicit_rdpcm_flag) { 1156cabdff1aSopenharmony_ci explicit_rdpcm_dir_flag = explicit_rdpcm_dir_flag_decode(s, c_idx); 1157cabdff1aSopenharmony_ci } 1158cabdff1aSopenharmony_ci } 1159cabdff1aSopenharmony_ci 1160cabdff1aSopenharmony_ci last_significant_coeff_xy_prefix_decode(s, c_idx, log2_trafo_size, 1161cabdff1aSopenharmony_ci &last_significant_coeff_x, &last_significant_coeff_y); 1162cabdff1aSopenharmony_ci 1163cabdff1aSopenharmony_ci if (last_significant_coeff_x > 3) { 1164cabdff1aSopenharmony_ci int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_x); 1165cabdff1aSopenharmony_ci last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) * 1166cabdff1aSopenharmony_ci (2 + (last_significant_coeff_x & 1)) + 1167cabdff1aSopenharmony_ci suffix; 1168cabdff1aSopenharmony_ci } 1169cabdff1aSopenharmony_ci 1170cabdff1aSopenharmony_ci if (last_significant_coeff_y > 3) { 1171cabdff1aSopenharmony_ci int suffix = last_significant_coeff_suffix_decode(s, last_significant_coeff_y); 1172cabdff1aSopenharmony_ci last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) * 1173cabdff1aSopenharmony_ci (2 + (last_significant_coeff_y & 1)) + 1174cabdff1aSopenharmony_ci suffix; 1175cabdff1aSopenharmony_ci } 1176cabdff1aSopenharmony_ci 1177cabdff1aSopenharmony_ci if (scan_idx == SCAN_VERT) 1178cabdff1aSopenharmony_ci FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y); 1179cabdff1aSopenharmony_ci 1180cabdff1aSopenharmony_ci x_cg_last_sig = last_significant_coeff_x >> 2; 1181cabdff1aSopenharmony_ci y_cg_last_sig = last_significant_coeff_y >> 2; 1182cabdff1aSopenharmony_ci 1183cabdff1aSopenharmony_ci switch (scan_idx) { 1184cabdff1aSopenharmony_ci case SCAN_DIAG: { 1185cabdff1aSopenharmony_ci int last_x_c = last_significant_coeff_x & 3; 1186cabdff1aSopenharmony_ci int last_y_c = last_significant_coeff_y & 3; 1187cabdff1aSopenharmony_ci 1188cabdff1aSopenharmony_ci scan_x_off = ff_hevc_diag_scan4x4_x; 1189cabdff1aSopenharmony_ci scan_y_off = ff_hevc_diag_scan4x4_y; 1190cabdff1aSopenharmony_ci num_coeff = diag_scan4x4_inv[last_y_c][last_x_c]; 1191cabdff1aSopenharmony_ci if (trafo_size == 4) { 1192cabdff1aSopenharmony_ci scan_x_cg = scan_1x1; 1193cabdff1aSopenharmony_ci scan_y_cg = scan_1x1; 1194cabdff1aSopenharmony_ci } else if (trafo_size == 8) { 1195cabdff1aSopenharmony_ci num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4; 1196cabdff1aSopenharmony_ci scan_x_cg = diag_scan2x2_x; 1197cabdff1aSopenharmony_ci scan_y_cg = diag_scan2x2_y; 1198cabdff1aSopenharmony_ci } else if (trafo_size == 16) { 1199cabdff1aSopenharmony_ci num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4; 1200cabdff1aSopenharmony_ci scan_x_cg = ff_hevc_diag_scan4x4_x; 1201cabdff1aSopenharmony_ci scan_y_cg = ff_hevc_diag_scan4x4_y; 1202cabdff1aSopenharmony_ci } else { // trafo_size == 32 1203cabdff1aSopenharmony_ci num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4; 1204cabdff1aSopenharmony_ci scan_x_cg = ff_hevc_diag_scan8x8_x; 1205cabdff1aSopenharmony_ci scan_y_cg = ff_hevc_diag_scan8x8_y; 1206cabdff1aSopenharmony_ci } 1207cabdff1aSopenharmony_ci break; 1208cabdff1aSopenharmony_ci } 1209cabdff1aSopenharmony_ci case SCAN_HORIZ: 1210cabdff1aSopenharmony_ci scan_x_cg = horiz_scan2x2_x; 1211cabdff1aSopenharmony_ci scan_y_cg = horiz_scan2x2_y; 1212cabdff1aSopenharmony_ci scan_x_off = horiz_scan4x4_x; 1213cabdff1aSopenharmony_ci scan_y_off = horiz_scan4x4_y; 1214cabdff1aSopenharmony_ci num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x]; 1215cabdff1aSopenharmony_ci break; 1216cabdff1aSopenharmony_ci default: //SCAN_VERT 1217cabdff1aSopenharmony_ci scan_x_cg = horiz_scan2x2_y; 1218cabdff1aSopenharmony_ci scan_y_cg = horiz_scan2x2_x; 1219cabdff1aSopenharmony_ci scan_x_off = horiz_scan4x4_y; 1220cabdff1aSopenharmony_ci scan_y_off = horiz_scan4x4_x; 1221cabdff1aSopenharmony_ci num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y]; 1222cabdff1aSopenharmony_ci break; 1223cabdff1aSopenharmony_ci } 1224cabdff1aSopenharmony_ci num_coeff++; 1225cabdff1aSopenharmony_ci num_last_subset = (num_coeff - 1) >> 4; 1226cabdff1aSopenharmony_ci 1227cabdff1aSopenharmony_ci for (i = num_last_subset; i >= 0; i--) { 1228cabdff1aSopenharmony_ci int n, m; 1229cabdff1aSopenharmony_ci int x_cg, y_cg, x_c, y_c, pos; 1230cabdff1aSopenharmony_ci int implicit_non_zero_coeff = 0; 1231cabdff1aSopenharmony_ci int64_t trans_coeff_level; 1232cabdff1aSopenharmony_ci int prev_sig = 0; 1233cabdff1aSopenharmony_ci int offset = i << 4; 1234cabdff1aSopenharmony_ci int rice_init = 0; 1235cabdff1aSopenharmony_ci 1236cabdff1aSopenharmony_ci uint8_t significant_coeff_flag_idx[16]; 1237cabdff1aSopenharmony_ci uint8_t nb_significant_coeff_flag = 0; 1238cabdff1aSopenharmony_ci 1239cabdff1aSopenharmony_ci x_cg = scan_x_cg[i]; 1240cabdff1aSopenharmony_ci y_cg = scan_y_cg[i]; 1241cabdff1aSopenharmony_ci 1242cabdff1aSopenharmony_ci if ((i < num_last_subset) && (i > 0)) { 1243cabdff1aSopenharmony_ci int ctx_cg = 0; 1244cabdff1aSopenharmony_ci if (x_cg < (1 << (log2_trafo_size - 2)) - 1) 1245cabdff1aSopenharmony_ci ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg]; 1246cabdff1aSopenharmony_ci if (y_cg < (1 << (log2_trafo_size - 2)) - 1) 1247cabdff1aSopenharmony_ci ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1]; 1248cabdff1aSopenharmony_ci 1249cabdff1aSopenharmony_ci significant_coeff_group_flag[x_cg][y_cg] = 1250cabdff1aSopenharmony_ci significant_coeff_group_flag_decode(s, c_idx, ctx_cg); 1251cabdff1aSopenharmony_ci implicit_non_zero_coeff = 1; 1252cabdff1aSopenharmony_ci } else { 1253cabdff1aSopenharmony_ci significant_coeff_group_flag[x_cg][y_cg] = 1254cabdff1aSopenharmony_ci ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) || 1255cabdff1aSopenharmony_ci (x_cg == 0 && y_cg == 0)); 1256cabdff1aSopenharmony_ci } 1257cabdff1aSopenharmony_ci 1258cabdff1aSopenharmony_ci last_scan_pos = num_coeff - offset - 1; 1259cabdff1aSopenharmony_ci 1260cabdff1aSopenharmony_ci if (i == num_last_subset) { 1261cabdff1aSopenharmony_ci n_end = last_scan_pos - 1; 1262cabdff1aSopenharmony_ci significant_coeff_flag_idx[0] = last_scan_pos; 1263cabdff1aSopenharmony_ci nb_significant_coeff_flag = 1; 1264cabdff1aSopenharmony_ci } else { 1265cabdff1aSopenharmony_ci n_end = 15; 1266cabdff1aSopenharmony_ci } 1267cabdff1aSopenharmony_ci 1268cabdff1aSopenharmony_ci if (x_cg < ((1 << log2_trafo_size) - 1) >> 2) 1269cabdff1aSopenharmony_ci prev_sig = !!significant_coeff_group_flag[x_cg + 1][y_cg]; 1270cabdff1aSopenharmony_ci if (y_cg < ((1 << log2_trafo_size) - 1) >> 2) 1271cabdff1aSopenharmony_ci prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1); 1272cabdff1aSopenharmony_ci 1273cabdff1aSopenharmony_ci if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) { 1274cabdff1aSopenharmony_ci static const uint8_t ctx_idx_map[] = { 1275cabdff1aSopenharmony_ci 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2 1276cabdff1aSopenharmony_ci 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0 1277cabdff1aSopenharmony_ci 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1 1278cabdff1aSopenharmony_ci 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2 1279cabdff1aSopenharmony_ci 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // default 1280cabdff1aSopenharmony_ci }; 1281cabdff1aSopenharmony_ci const uint8_t *ctx_idx_map_p; 1282cabdff1aSopenharmony_ci int scf_offset = 0; 1283cabdff1aSopenharmony_ci if (s->ps.sps->transform_skip_context_enabled_flag && 1284cabdff1aSopenharmony_ci (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) { 1285cabdff1aSopenharmony_ci ctx_idx_map_p = &ctx_idx_map[4 * 16]; 1286cabdff1aSopenharmony_ci if (c_idx == 0) { 1287cabdff1aSopenharmony_ci scf_offset = 40; 1288cabdff1aSopenharmony_ci } else { 1289cabdff1aSopenharmony_ci scf_offset = 14 + 27; 1290cabdff1aSopenharmony_ci } 1291cabdff1aSopenharmony_ci } else { 1292cabdff1aSopenharmony_ci if (c_idx != 0) 1293cabdff1aSopenharmony_ci scf_offset = 27; 1294cabdff1aSopenharmony_ci if (log2_trafo_size == 2) { 1295cabdff1aSopenharmony_ci ctx_idx_map_p = &ctx_idx_map[0]; 1296cabdff1aSopenharmony_ci } else { 1297cabdff1aSopenharmony_ci ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4]; 1298cabdff1aSopenharmony_ci if (c_idx == 0) { 1299cabdff1aSopenharmony_ci if ((x_cg > 0 || y_cg > 0)) 1300cabdff1aSopenharmony_ci scf_offset += 3; 1301cabdff1aSopenharmony_ci if (log2_trafo_size == 3) { 1302cabdff1aSopenharmony_ci scf_offset += (scan_idx == SCAN_DIAG) ? 9 : 15; 1303cabdff1aSopenharmony_ci } else { 1304cabdff1aSopenharmony_ci scf_offset += 21; 1305cabdff1aSopenharmony_ci } 1306cabdff1aSopenharmony_ci } else { 1307cabdff1aSopenharmony_ci if (log2_trafo_size == 3) 1308cabdff1aSopenharmony_ci scf_offset += 9; 1309cabdff1aSopenharmony_ci else 1310cabdff1aSopenharmony_ci scf_offset += 12; 1311cabdff1aSopenharmony_ci } 1312cabdff1aSopenharmony_ci } 1313cabdff1aSopenharmony_ci } 1314cabdff1aSopenharmony_ci for (n = n_end; n > 0; n--) { 1315cabdff1aSopenharmony_ci x_c = scan_x_off[n]; 1316cabdff1aSopenharmony_ci y_c = scan_y_off[n]; 1317cabdff1aSopenharmony_ci if (significant_coeff_flag_decode(s, x_c, y_c, scf_offset, ctx_idx_map_p)) { 1318cabdff1aSopenharmony_ci significant_coeff_flag_idx[nb_significant_coeff_flag] = n; 1319cabdff1aSopenharmony_ci nb_significant_coeff_flag++; 1320cabdff1aSopenharmony_ci implicit_non_zero_coeff = 0; 1321cabdff1aSopenharmony_ci } 1322cabdff1aSopenharmony_ci } 1323cabdff1aSopenharmony_ci if (implicit_non_zero_coeff == 0) { 1324cabdff1aSopenharmony_ci if (s->ps.sps->transform_skip_context_enabled_flag && 1325cabdff1aSopenharmony_ci (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) { 1326cabdff1aSopenharmony_ci if (c_idx == 0) { 1327cabdff1aSopenharmony_ci scf_offset = 42; 1328cabdff1aSopenharmony_ci } else { 1329cabdff1aSopenharmony_ci scf_offset = 16 + 27; 1330cabdff1aSopenharmony_ci } 1331cabdff1aSopenharmony_ci } else { 1332cabdff1aSopenharmony_ci if (i == 0) { 1333cabdff1aSopenharmony_ci if (c_idx == 0) 1334cabdff1aSopenharmony_ci scf_offset = 0; 1335cabdff1aSopenharmony_ci else 1336cabdff1aSopenharmony_ci scf_offset = 27; 1337cabdff1aSopenharmony_ci } else { 1338cabdff1aSopenharmony_ci scf_offset = 2 + scf_offset; 1339cabdff1aSopenharmony_ci } 1340cabdff1aSopenharmony_ci } 1341cabdff1aSopenharmony_ci if (significant_coeff_flag_decode_0(s, c_idx, scf_offset) == 1) { 1342cabdff1aSopenharmony_ci significant_coeff_flag_idx[nb_significant_coeff_flag] = 0; 1343cabdff1aSopenharmony_ci nb_significant_coeff_flag++; 1344cabdff1aSopenharmony_ci } 1345cabdff1aSopenharmony_ci } else { 1346cabdff1aSopenharmony_ci significant_coeff_flag_idx[nb_significant_coeff_flag] = 0; 1347cabdff1aSopenharmony_ci nb_significant_coeff_flag++; 1348cabdff1aSopenharmony_ci } 1349cabdff1aSopenharmony_ci } 1350cabdff1aSopenharmony_ci 1351cabdff1aSopenharmony_ci n_end = nb_significant_coeff_flag; 1352cabdff1aSopenharmony_ci 1353cabdff1aSopenharmony_ci 1354cabdff1aSopenharmony_ci if (n_end) { 1355cabdff1aSopenharmony_ci int first_nz_pos_in_cg; 1356cabdff1aSopenharmony_ci int last_nz_pos_in_cg; 1357cabdff1aSopenharmony_ci int c_rice_param = 0; 1358cabdff1aSopenharmony_ci int first_greater1_coeff_idx = -1; 1359cabdff1aSopenharmony_ci uint8_t coeff_abs_level_greater1_flag[8]; 1360cabdff1aSopenharmony_ci uint16_t coeff_sign_flag; 1361cabdff1aSopenharmony_ci int sum_abs = 0; 1362cabdff1aSopenharmony_ci int sign_hidden; 1363cabdff1aSopenharmony_ci int sb_type; 1364cabdff1aSopenharmony_ci 1365cabdff1aSopenharmony_ci 1366cabdff1aSopenharmony_ci // initialize first elem of coeff_bas_level_greater1_flag 1367cabdff1aSopenharmony_ci int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0; 1368cabdff1aSopenharmony_ci 1369cabdff1aSopenharmony_ci if (s->ps.sps->persistent_rice_adaptation_enabled_flag) { 1370cabdff1aSopenharmony_ci if (!transform_skip_flag && !lc->cu.cu_transquant_bypass_flag) 1371cabdff1aSopenharmony_ci sb_type = 2 * (c_idx == 0 ? 1 : 0); 1372cabdff1aSopenharmony_ci else 1373cabdff1aSopenharmony_ci sb_type = 2 * (c_idx == 0 ? 1 : 0) + 1; 1374cabdff1aSopenharmony_ci c_rice_param = lc->stat_coeff[sb_type] / 4; 1375cabdff1aSopenharmony_ci } 1376cabdff1aSopenharmony_ci 1377cabdff1aSopenharmony_ci if (!(i == num_last_subset) && greater1_ctx == 0) 1378cabdff1aSopenharmony_ci ctx_set++; 1379cabdff1aSopenharmony_ci greater1_ctx = 1; 1380cabdff1aSopenharmony_ci last_nz_pos_in_cg = significant_coeff_flag_idx[0]; 1381cabdff1aSopenharmony_ci 1382cabdff1aSopenharmony_ci for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) { 1383cabdff1aSopenharmony_ci int inc = (ctx_set << 2) + greater1_ctx; 1384cabdff1aSopenharmony_ci coeff_abs_level_greater1_flag[m] = 1385cabdff1aSopenharmony_ci coeff_abs_level_greater1_flag_decode(s, c_idx, inc); 1386cabdff1aSopenharmony_ci if (coeff_abs_level_greater1_flag[m]) { 1387cabdff1aSopenharmony_ci greater1_ctx = 0; 1388cabdff1aSopenharmony_ci if (first_greater1_coeff_idx == -1) 1389cabdff1aSopenharmony_ci first_greater1_coeff_idx = m; 1390cabdff1aSopenharmony_ci } else if (greater1_ctx > 0 && greater1_ctx < 3) { 1391cabdff1aSopenharmony_ci greater1_ctx++; 1392cabdff1aSopenharmony_ci } 1393cabdff1aSopenharmony_ci } 1394cabdff1aSopenharmony_ci first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1]; 1395cabdff1aSopenharmony_ci 1396cabdff1aSopenharmony_ci if (lc->cu.cu_transquant_bypass_flag || 1397cabdff1aSopenharmony_ci (lc->cu.pred_mode == MODE_INTRA && 1398cabdff1aSopenharmony_ci s->ps.sps->implicit_rdpcm_enabled_flag && transform_skip_flag && 1399cabdff1aSopenharmony_ci (pred_mode_intra == 10 || pred_mode_intra == 26 )) || 1400cabdff1aSopenharmony_ci explicit_rdpcm_flag) 1401cabdff1aSopenharmony_ci sign_hidden = 0; 1402cabdff1aSopenharmony_ci else 1403cabdff1aSopenharmony_ci sign_hidden = (last_nz_pos_in_cg - first_nz_pos_in_cg >= 4); 1404cabdff1aSopenharmony_ci 1405cabdff1aSopenharmony_ci if (first_greater1_coeff_idx != -1) { 1406cabdff1aSopenharmony_ci coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set); 1407cabdff1aSopenharmony_ci } 1408cabdff1aSopenharmony_ci if (!s->ps.pps->sign_data_hiding_flag || !sign_hidden ) { 1409cabdff1aSopenharmony_ci coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag); 1410cabdff1aSopenharmony_ci } else { 1411cabdff1aSopenharmony_ci coeff_sign_flag = coeff_sign_flag_decode(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1)); 1412cabdff1aSopenharmony_ci } 1413cabdff1aSopenharmony_ci 1414cabdff1aSopenharmony_ci for (m = 0; m < n_end; m++) { 1415cabdff1aSopenharmony_ci n = significant_coeff_flag_idx[m]; 1416cabdff1aSopenharmony_ci GET_COORD(offset, n); 1417cabdff1aSopenharmony_ci if (m < 8) { 1418cabdff1aSopenharmony_ci trans_coeff_level = 1 + coeff_abs_level_greater1_flag[m]; 1419cabdff1aSopenharmony_ci if (trans_coeff_level == ((m == first_greater1_coeff_idx) ? 3 : 2)) { 1420cabdff1aSopenharmony_ci int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param); 1421cabdff1aSopenharmony_ci 1422cabdff1aSopenharmony_ci trans_coeff_level += last_coeff_abs_level_remaining; 1423cabdff1aSopenharmony_ci if (trans_coeff_level > (3 << c_rice_param)) 1424cabdff1aSopenharmony_ci c_rice_param = s->ps.sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4); 1425cabdff1aSopenharmony_ci if (s->ps.sps->persistent_rice_adaptation_enabled_flag && !rice_init) { 1426cabdff1aSopenharmony_ci int c_rice_p_init = lc->stat_coeff[sb_type] / 4; 1427cabdff1aSopenharmony_ci if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init)) 1428cabdff1aSopenharmony_ci lc->stat_coeff[sb_type]++; 1429cabdff1aSopenharmony_ci else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init)) 1430cabdff1aSopenharmony_ci if (lc->stat_coeff[sb_type] > 0) 1431cabdff1aSopenharmony_ci lc->stat_coeff[sb_type]--; 1432cabdff1aSopenharmony_ci rice_init = 1; 1433cabdff1aSopenharmony_ci } 1434cabdff1aSopenharmony_ci } 1435cabdff1aSopenharmony_ci } else { 1436cabdff1aSopenharmony_ci int last_coeff_abs_level_remaining = coeff_abs_level_remaining_decode(s, c_rice_param); 1437cabdff1aSopenharmony_ci 1438cabdff1aSopenharmony_ci trans_coeff_level = 1 + last_coeff_abs_level_remaining; 1439cabdff1aSopenharmony_ci if (trans_coeff_level > (3 << c_rice_param)) 1440cabdff1aSopenharmony_ci c_rice_param = s->ps.sps->persistent_rice_adaptation_enabled_flag ? c_rice_param + 1 : FFMIN(c_rice_param + 1, 4); 1441cabdff1aSopenharmony_ci if (s->ps.sps->persistent_rice_adaptation_enabled_flag && !rice_init) { 1442cabdff1aSopenharmony_ci int c_rice_p_init = lc->stat_coeff[sb_type] / 4; 1443cabdff1aSopenharmony_ci if (last_coeff_abs_level_remaining >= (3 << c_rice_p_init)) 1444cabdff1aSopenharmony_ci lc->stat_coeff[sb_type]++; 1445cabdff1aSopenharmony_ci else if (2 * last_coeff_abs_level_remaining < (1 << c_rice_p_init)) 1446cabdff1aSopenharmony_ci if (lc->stat_coeff[sb_type] > 0) 1447cabdff1aSopenharmony_ci lc->stat_coeff[sb_type]--; 1448cabdff1aSopenharmony_ci rice_init = 1; 1449cabdff1aSopenharmony_ci } 1450cabdff1aSopenharmony_ci } 1451cabdff1aSopenharmony_ci if (s->ps.pps->sign_data_hiding_flag && sign_hidden) { 1452cabdff1aSopenharmony_ci sum_abs += trans_coeff_level; 1453cabdff1aSopenharmony_ci if (n == first_nz_pos_in_cg && (sum_abs&1)) 1454cabdff1aSopenharmony_ci trans_coeff_level = -trans_coeff_level; 1455cabdff1aSopenharmony_ci } 1456cabdff1aSopenharmony_ci if (coeff_sign_flag >> 15) 1457cabdff1aSopenharmony_ci trans_coeff_level = -trans_coeff_level; 1458cabdff1aSopenharmony_ci coeff_sign_flag <<= 1; 1459cabdff1aSopenharmony_ci if(!lc->cu.cu_transquant_bypass_flag) { 1460cabdff1aSopenharmony_ci if (s->ps.sps->scaling_list_enable_flag && !(transform_skip_flag && log2_trafo_size > 2)) { 1461cabdff1aSopenharmony_ci if(y_c || x_c || log2_trafo_size < 4) { 1462cabdff1aSopenharmony_ci switch(log2_trafo_size) { 1463cabdff1aSopenharmony_ci case 3: pos = (y_c << 3) + x_c; break; 1464cabdff1aSopenharmony_ci case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break; 1465cabdff1aSopenharmony_ci case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break; 1466cabdff1aSopenharmony_ci default: pos = (y_c << 2) + x_c; break; 1467cabdff1aSopenharmony_ci } 1468cabdff1aSopenharmony_ci scale_m = scale_matrix[pos]; 1469cabdff1aSopenharmony_ci } else { 1470cabdff1aSopenharmony_ci scale_m = dc_scale; 1471cabdff1aSopenharmony_ci } 1472cabdff1aSopenharmony_ci } 1473cabdff1aSopenharmony_ci trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift; 1474cabdff1aSopenharmony_ci if(trans_coeff_level < 0) { 1475cabdff1aSopenharmony_ci if((~trans_coeff_level) & 0xFffffffffff8000) 1476cabdff1aSopenharmony_ci trans_coeff_level = -32768; 1477cabdff1aSopenharmony_ci } else { 1478cabdff1aSopenharmony_ci if(trans_coeff_level & 0xffffffffffff8000) 1479cabdff1aSopenharmony_ci trans_coeff_level = 32767; 1480cabdff1aSopenharmony_ci } 1481cabdff1aSopenharmony_ci } 1482cabdff1aSopenharmony_ci coeffs[y_c * trafo_size + x_c] = trans_coeff_level; 1483cabdff1aSopenharmony_ci } 1484cabdff1aSopenharmony_ci } 1485cabdff1aSopenharmony_ci } 1486cabdff1aSopenharmony_ci 1487cabdff1aSopenharmony_ci if (lc->cu.cu_transquant_bypass_flag) { 1488cabdff1aSopenharmony_ci if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag && 1489cabdff1aSopenharmony_ci (pred_mode_intra == 10 || pred_mode_intra == 26))) { 1490cabdff1aSopenharmony_ci int mode = s->ps.sps->implicit_rdpcm_enabled_flag ? (pred_mode_intra == 26) : explicit_rdpcm_dir_flag; 1491cabdff1aSopenharmony_ci 1492cabdff1aSopenharmony_ci s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode); 1493cabdff1aSopenharmony_ci } 1494cabdff1aSopenharmony_ci } else { 1495cabdff1aSopenharmony_ci if (transform_skip_flag) { 1496cabdff1aSopenharmony_ci int rot = s->ps.sps->transform_skip_rotation_enabled_flag && 1497cabdff1aSopenharmony_ci log2_trafo_size == 2 && 1498cabdff1aSopenharmony_ci lc->cu.pred_mode == MODE_INTRA; 1499cabdff1aSopenharmony_ci if (rot) { 1500cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) 1501cabdff1aSopenharmony_ci FFSWAP(int16_t, coeffs[i], coeffs[16 - i - 1]); 1502cabdff1aSopenharmony_ci } 1503cabdff1aSopenharmony_ci 1504cabdff1aSopenharmony_ci s->hevcdsp.dequant(coeffs, log2_trafo_size); 1505cabdff1aSopenharmony_ci 1506cabdff1aSopenharmony_ci if (explicit_rdpcm_flag || (s->ps.sps->implicit_rdpcm_enabled_flag && 1507cabdff1aSopenharmony_ci lc->cu.pred_mode == MODE_INTRA && 1508cabdff1aSopenharmony_ci (pred_mode_intra == 10 || pred_mode_intra == 26))) { 1509cabdff1aSopenharmony_ci int mode = explicit_rdpcm_flag ? explicit_rdpcm_dir_flag : (pred_mode_intra == 26); 1510cabdff1aSopenharmony_ci 1511cabdff1aSopenharmony_ci s->hevcdsp.transform_rdpcm(coeffs, log2_trafo_size, mode); 1512cabdff1aSopenharmony_ci } 1513cabdff1aSopenharmony_ci } else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) { 1514cabdff1aSopenharmony_ci s->hevcdsp.transform_4x4_luma(coeffs); 1515cabdff1aSopenharmony_ci } else { 1516cabdff1aSopenharmony_ci int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y); 1517cabdff1aSopenharmony_ci if (max_xy == 0) 1518cabdff1aSopenharmony_ci s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs); 1519cabdff1aSopenharmony_ci else { 1520cabdff1aSopenharmony_ci int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4; 1521cabdff1aSopenharmony_ci if (max_xy < 4) 1522cabdff1aSopenharmony_ci col_limit = FFMIN(4, col_limit); 1523cabdff1aSopenharmony_ci else if (max_xy < 8) 1524cabdff1aSopenharmony_ci col_limit = FFMIN(8, col_limit); 1525cabdff1aSopenharmony_ci else if (max_xy < 12) 1526cabdff1aSopenharmony_ci col_limit = FFMIN(24, col_limit); 1527cabdff1aSopenharmony_ci s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit); 1528cabdff1aSopenharmony_ci } 1529cabdff1aSopenharmony_ci } 1530cabdff1aSopenharmony_ci } 1531cabdff1aSopenharmony_ci if (lc->tu.cross_pf) { 1532cabdff1aSopenharmony_ci int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer; 1533cabdff1aSopenharmony_ci 1534cabdff1aSopenharmony_ci for (i = 0; i < (trafo_size * trafo_size); i++) { 1535cabdff1aSopenharmony_ci coeffs[i] = coeffs[i] + ((lc->tu.res_scale_val * coeffs_y[i]) >> 3); 1536cabdff1aSopenharmony_ci } 1537cabdff1aSopenharmony_ci } 1538cabdff1aSopenharmony_ci s->hevcdsp.add_residual[log2_trafo_size-2](dst, coeffs, stride); 1539cabdff1aSopenharmony_ci} 1540cabdff1aSopenharmony_ci 1541cabdff1aSopenharmony_civoid ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size) 1542cabdff1aSopenharmony_ci{ 1543cabdff1aSopenharmony_ci HEVCLocalContext *lc = s->HEVClc; 1544cabdff1aSopenharmony_ci int x = abs_mvd_greater0_flag_decode(s); 1545cabdff1aSopenharmony_ci int y = abs_mvd_greater0_flag_decode(s); 1546cabdff1aSopenharmony_ci 1547cabdff1aSopenharmony_ci if (x) 1548cabdff1aSopenharmony_ci x += abs_mvd_greater1_flag_decode(s); 1549cabdff1aSopenharmony_ci if (y) 1550cabdff1aSopenharmony_ci y += abs_mvd_greater1_flag_decode(s); 1551cabdff1aSopenharmony_ci 1552cabdff1aSopenharmony_ci switch (x) { 1553cabdff1aSopenharmony_ci case 2: lc->pu.mvd.x = mvd_decode(s); break; 1554cabdff1aSopenharmony_ci case 1: lc->pu.mvd.x = mvd_sign_flag_decode(s); break; 1555cabdff1aSopenharmony_ci case 0: lc->pu.mvd.x = 0; break; 1556cabdff1aSopenharmony_ci } 1557cabdff1aSopenharmony_ci 1558cabdff1aSopenharmony_ci switch (y) { 1559cabdff1aSopenharmony_ci case 2: lc->pu.mvd.y = mvd_decode(s); break; 1560cabdff1aSopenharmony_ci case 1: lc->pu.mvd.y = mvd_sign_flag_decode(s); break; 1561cabdff1aSopenharmony_ci case 0: lc->pu.mvd.y = 0; break; 1562cabdff1aSopenharmony_ci } 1563cabdff1aSopenharmony_ci} 1564cabdff1aSopenharmony_ci 1565