| 1 | /* |
| 2 | * HEVC video decoder |
| 3 | * |
| 4 | * Copyright (C) 2012 - 2013 Guillaume Martres |
| 5 | * |
| 6 | * This file is part of FFmpeg. |
| 7 | * |
| 8 | * FFmpeg is free software; you can redistribute it and/or |
| 9 | * modify it under the terms of the GNU Lesser General Public |
| 10 | * License as published by the Free Software Foundation; either |
| 11 | * version 2.1 of the License, or (at your option) any later version. |
| 12 | * |
| 13 | * FFmpeg is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 | * Lesser General Public License for more details. |
| 17 | * |
| 18 | * You should have received a copy of the GNU Lesser General Public |
| 19 | * License along with FFmpeg; if not, write to the Free Software |
| 20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 21 | */ |
| 22 | |
| 23 | #ifndef AVCODEC_HEVC_H |
| 24 | #define AVCODEC_HEVC_H |
| 25 | |
| 26 | #include "libavutil/buffer.h" |
| 27 | #include "libavutil/md5.h" |
| 28 | |
| 29 | #include "avcodec.h" |
| 30 | #include "bswapdsp.h" |
| 31 | #include "cabac.h" |
| 32 | #include "get_bits.h" |
| 33 | #include "hevcpred.h" |
| 34 | #include "hevcdsp.h" |
| 35 | #include "internal.h" |
| 36 | #include "thread.h" |
| 37 | #include "videodsp.h" |
| 38 | |
| 39 | #define MAX_DPB_SIZE 16 // A.4.1 |
| 40 | #define MAX_REFS 16 |
| 41 | |
| 42 | #define MAX_NB_THREADS 16 |
| 43 | #define SHIFT_CTB_WPP 2 |
| 44 | |
| 45 | /** |
| 46 | * 7.4.2.1 |
| 47 | */ |
| 48 | #define MAX_SUB_LAYERS 7 |
| 49 | #define MAX_VPS_COUNT 16 |
| 50 | #define MAX_SPS_COUNT 32 |
| 51 | #define MAX_PPS_COUNT 256 |
| 52 | #define MAX_SHORT_TERM_RPS_COUNT 64 |
| 53 | #define MAX_CU_SIZE 128 |
| 54 | |
| 55 | //TODO: check if this is really the maximum |
| 56 | #define MAX_TRANSFORM_DEPTH 5 |
| 57 | |
| 58 | #define MAX_TB_SIZE 32 |
| 59 | #define MAX_LOG2_CTB_SIZE 6 |
| 60 | #define MAX_QP 51 |
| 61 | #define DEFAULT_INTRA_TC_OFFSET 2 |
| 62 | |
| 63 | #define HEVC_CONTEXTS 199 |
| 64 | |
| 65 | #define MRG_MAX_NUM_CANDS 5 |
| 66 | |
| 67 | #define L0 0 |
| 68 | #define L1 1 |
| 69 | |
| 70 | #define EPEL_EXTRA_BEFORE 1 |
| 71 | #define EPEL_EXTRA_AFTER 2 |
| 72 | #define EPEL_EXTRA 3 |
| 73 | #define QPEL_EXTRA_BEFORE 3 |
| 74 | #define QPEL_EXTRA_AFTER 4 |
| 75 | #define QPEL_EXTRA 7 |
| 76 | |
| 77 | #define EDGE_EMU_BUFFER_STRIDE 80 |
| 78 | |
| 79 | /** |
| 80 | * Value of the luma sample at position (x, y) in the 2D array tab. |
| 81 | */ |
| 82 | #define SAMPLE(tab, x, y) ((tab)[(y) * s->sps->width + (x)]) |
| 83 | #define SAMPLE_CTB(tab, x, y) ((tab)[(y) * min_cb_width + (x)]) |
| 84 | |
| 85 | #define IS_IDR(s) ((s)->nal_unit_type == NAL_IDR_W_RADL || (s)->nal_unit_type == NAL_IDR_N_LP) |
| 86 | #define IS_BLA(s) ((s)->nal_unit_type == NAL_BLA_W_RADL || (s)->nal_unit_type == NAL_BLA_W_LP || \ |
| 87 | (s)->nal_unit_type == NAL_BLA_N_LP) |
| 88 | #define IS_IRAP(s) ((s)->nal_unit_type >= 16 && (s)->nal_unit_type <= 23) |
| 89 | |
| 90 | /** |
| 91 | * Table 7-3: NAL unit type codes |
| 92 | */ |
| 93 | enum NALUnitType { |
| 94 | NAL_TRAIL_N = 0, |
| 95 | NAL_TRAIL_R = 1, |
| 96 | NAL_TSA_N = 2, |
| 97 | NAL_TSA_R = 3, |
| 98 | NAL_STSA_N = 4, |
| 99 | NAL_STSA_R = 5, |
| 100 | NAL_RADL_N = 6, |
| 101 | NAL_RADL_R = 7, |
| 102 | NAL_RASL_N = 8, |
| 103 | NAL_RASL_R = 9, |
| 104 | NAL_BLA_W_LP = 16, |
| 105 | NAL_BLA_W_RADL = 17, |
| 106 | NAL_BLA_N_LP = 18, |
| 107 | NAL_IDR_W_RADL = 19, |
| 108 | NAL_IDR_N_LP = 20, |
| 109 | NAL_CRA_NUT = 21, |
| 110 | NAL_VPS = 32, |
| 111 | NAL_SPS = 33, |
| 112 | NAL_PPS = 34, |
| 113 | NAL_AUD = 35, |
| 114 | NAL_EOS_NUT = 36, |
| 115 | NAL_EOB_NUT = 37, |
| 116 | NAL_FD_NUT = 38, |
| 117 | NAL_SEI_PREFIX = 39, |
| 118 | NAL_SEI_SUFFIX = 40, |
| 119 | }; |
| 120 | |
| 121 | enum RPSType { |
| 122 | ST_CURR_BEF = 0, |
| 123 | ST_CURR_AFT, |
| 124 | ST_FOLL, |
| 125 | LT_CURR, |
| 126 | LT_FOLL, |
| 127 | NB_RPS_TYPE, |
| 128 | }; |
| 129 | |
| 130 | enum SliceType { |
| 131 | B_SLICE = 0, |
| 132 | P_SLICE = 1, |
| 133 | I_SLICE = 2, |
| 134 | }; |
| 135 | |
| 136 | enum SyntaxElement { |
| 137 | SAO_MERGE_FLAG = 0, |
| 138 | SAO_TYPE_IDX, |
| 139 | SAO_EO_CLASS, |
| 140 | SAO_BAND_POSITION, |
| 141 | SAO_OFFSET_ABS, |
| 142 | SAO_OFFSET_SIGN, |
| 143 | END_OF_SLICE_FLAG, |
| 144 | SPLIT_CODING_UNIT_FLAG, |
| 145 | CU_TRANSQUANT_BYPASS_FLAG, |
| 146 | SKIP_FLAG, |
| 147 | CU_QP_DELTA, |
| 148 | PRED_MODE_FLAG, |
| 149 | PART_MODE, |
| 150 | PCM_FLAG, |
| 151 | PREV_INTRA_LUMA_PRED_FLAG, |
| 152 | MPM_IDX, |
| 153 | REM_INTRA_LUMA_PRED_MODE, |
| 154 | INTRA_CHROMA_PRED_MODE, |
| 155 | MERGE_FLAG, |
| 156 | MERGE_IDX, |
| 157 | INTER_PRED_IDC, |
| 158 | REF_IDX_L0, |
| 159 | REF_IDX_L1, |
| 160 | ABS_MVD_GREATER0_FLAG, |
| 161 | ABS_MVD_GREATER1_FLAG, |
| 162 | ABS_MVD_MINUS2, |
| 163 | MVD_SIGN_FLAG, |
| 164 | MVP_LX_FLAG, |
| 165 | NO_RESIDUAL_DATA_FLAG, |
| 166 | SPLIT_TRANSFORM_FLAG, |
| 167 | CBF_LUMA, |
| 168 | CBF_CB_CR, |
| 169 | TRANSFORM_SKIP_FLAG, |
| 170 | EXPLICIT_RDPCM_FLAG, |
| 171 | EXPLICIT_RDPCM_DIR_FLAG, |
| 172 | LAST_SIGNIFICANT_COEFF_X_PREFIX, |
| 173 | LAST_SIGNIFICANT_COEFF_Y_PREFIX, |
| 174 | LAST_SIGNIFICANT_COEFF_X_SUFFIX, |
| 175 | LAST_SIGNIFICANT_COEFF_Y_SUFFIX, |
| 176 | SIGNIFICANT_COEFF_GROUP_FLAG, |
| 177 | SIGNIFICANT_COEFF_FLAG, |
| 178 | COEFF_ABS_LEVEL_GREATER1_FLAG, |
| 179 | COEFF_ABS_LEVEL_GREATER2_FLAG, |
| 180 | COEFF_ABS_LEVEL_REMAINING, |
| 181 | COEFF_SIGN_FLAG, |
| 182 | LOG2_RES_SCALE_ABS, |
| 183 | RES_SCALE_SIGN_FLAG, |
| 184 | CU_CHROMA_QP_OFFSET_FLAG, |
| 185 | CU_CHROMA_QP_OFFSET_IDX, |
| 186 | }; |
| 187 | |
| 188 | enum PartMode { |
| 189 | PART_2Nx2N = 0, |
| 190 | PART_2NxN = 1, |
| 191 | PART_Nx2N = 2, |
| 192 | PART_NxN = 3, |
| 193 | PART_2NxnU = 4, |
| 194 | PART_2NxnD = 5, |
| 195 | PART_nLx2N = 6, |
| 196 | PART_nRx2N = 7, |
| 197 | }; |
| 198 | |
| 199 | enum PredMode { |
| 200 | MODE_INTER = 0, |
| 201 | MODE_INTRA, |
| 202 | MODE_SKIP, |
| 203 | }; |
| 204 | |
| 205 | enum InterPredIdc { |
| 206 | PRED_L0 = 0, |
| 207 | PRED_L1, |
| 208 | PRED_BI, |
| 209 | }; |
| 210 | |
| 211 | enum PredFlag { |
| 212 | PF_INTRA = 0, |
| 213 | PF_L0, |
| 214 | PF_L1, |
| 215 | PF_BI, |
| 216 | }; |
| 217 | |
| 218 | enum IntraPredMode { |
| 219 | INTRA_PLANAR = 0, |
| 220 | INTRA_DC, |
| 221 | INTRA_ANGULAR_2, |
| 222 | INTRA_ANGULAR_3, |
| 223 | INTRA_ANGULAR_4, |
| 224 | INTRA_ANGULAR_5, |
| 225 | INTRA_ANGULAR_6, |
| 226 | INTRA_ANGULAR_7, |
| 227 | INTRA_ANGULAR_8, |
| 228 | INTRA_ANGULAR_9, |
| 229 | INTRA_ANGULAR_10, |
| 230 | INTRA_ANGULAR_11, |
| 231 | INTRA_ANGULAR_12, |
| 232 | INTRA_ANGULAR_13, |
| 233 | INTRA_ANGULAR_14, |
| 234 | INTRA_ANGULAR_15, |
| 235 | INTRA_ANGULAR_16, |
| 236 | INTRA_ANGULAR_17, |
| 237 | INTRA_ANGULAR_18, |
| 238 | INTRA_ANGULAR_19, |
| 239 | INTRA_ANGULAR_20, |
| 240 | INTRA_ANGULAR_21, |
| 241 | INTRA_ANGULAR_22, |
| 242 | INTRA_ANGULAR_23, |
| 243 | INTRA_ANGULAR_24, |
| 244 | INTRA_ANGULAR_25, |
| 245 | INTRA_ANGULAR_26, |
| 246 | INTRA_ANGULAR_27, |
| 247 | INTRA_ANGULAR_28, |
| 248 | INTRA_ANGULAR_29, |
| 249 | INTRA_ANGULAR_30, |
| 250 | INTRA_ANGULAR_31, |
| 251 | INTRA_ANGULAR_32, |
| 252 | INTRA_ANGULAR_33, |
| 253 | INTRA_ANGULAR_34, |
| 254 | }; |
| 255 | |
| 256 | enum SAOType { |
| 257 | SAO_NOT_APPLIED = 0, |
| 258 | SAO_BAND, |
| 259 | SAO_EDGE, |
| 260 | SAO_APPLIED |
| 261 | }; |
| 262 | |
| 263 | enum SAOEOClass { |
| 264 | SAO_EO_HORIZ = 0, |
| 265 | SAO_EO_VERT, |
| 266 | SAO_EO_135D, |
| 267 | SAO_EO_45D, |
| 268 | }; |
| 269 | |
| 270 | enum ScanType { |
| 271 | SCAN_DIAG = 0, |
| 272 | SCAN_HORIZ, |
| 273 | SCAN_VERT, |
| 274 | }; |
| 275 | |
| 276 | typedef struct ShortTermRPS { |
| 277 | unsigned int num_negative_pics; |
| 278 | int num_delta_pocs; |
| 279 | int32_t delta_poc[32]; |
| 280 | uint8_t used[32]; |
| 281 | } ShortTermRPS; |
| 282 | |
| 283 | typedef struct LongTermRPS { |
| 284 | int poc[32]; |
| 285 | uint8_t used[32]; |
| 286 | uint8_t nb_refs; |
| 287 | } LongTermRPS; |
| 288 | |
| 289 | typedef struct RefPicList { |
| 290 | struct HEVCFrame *ref[MAX_REFS]; |
| 291 | int list[MAX_REFS]; |
| 292 | int isLongTerm[MAX_REFS]; |
| 293 | int nb_refs; |
| 294 | } RefPicList; |
| 295 | |
| 296 | typedef struct RefPicListTab { |
| 297 | RefPicList refPicList[2]; |
| 298 | } RefPicListTab; |
| 299 | |
| 300 | typedef struct HEVCWindow { |
| 301 | int left_offset; |
| 302 | int right_offset; |
| 303 | int top_offset; |
| 304 | int bottom_offset; |
| 305 | } HEVCWindow; |
| 306 | |
| 307 | typedef struct VUI { |
| 308 | AVRational sar; |
| 309 | |
| 310 | int overscan_info_present_flag; |
| 311 | int overscan_appropriate_flag; |
| 312 | |
| 313 | int video_signal_type_present_flag; |
| 314 | int video_format; |
| 315 | int video_full_range_flag; |
| 316 | int colour_description_present_flag; |
| 317 | uint8_t colour_primaries; |
| 318 | uint8_t transfer_characteristic; |
| 319 | uint8_t matrix_coeffs; |
| 320 | |
| 321 | int chroma_loc_info_present_flag; |
| 322 | int chroma_sample_loc_type_top_field; |
| 323 | int chroma_sample_loc_type_bottom_field; |
| 324 | int neutra_chroma_indication_flag; |
| 325 | |
| 326 | int field_seq_flag; |
| 327 | int frame_field_info_present_flag; |
| 328 | |
| 329 | int default_display_window_flag; |
| 330 | HEVCWindow def_disp_win; |
| 331 | |
| 332 | int vui_timing_info_present_flag; |
| 333 | uint32_t vui_num_units_in_tick; |
| 334 | uint32_t vui_time_scale; |
| 335 | int vui_poc_proportional_to_timing_flag; |
| 336 | int vui_num_ticks_poc_diff_one_minus1; |
| 337 | int vui_hrd_parameters_present_flag; |
| 338 | |
| 339 | int bitstream_restriction_flag; |
| 340 | int tiles_fixed_structure_flag; |
| 341 | int motion_vectors_over_pic_boundaries_flag; |
| 342 | int restricted_ref_pic_lists_flag; |
| 343 | int min_spatial_segmentation_idc; |
| 344 | int max_bytes_per_pic_denom; |
| 345 | int max_bits_per_min_cu_denom; |
| 346 | int log2_max_mv_length_horizontal; |
| 347 | int log2_max_mv_length_vertical; |
| 348 | } VUI; |
| 349 | |
| 350 | typedef struct PTLCommon { |
| 351 | uint8_t profile_space; |
| 352 | uint8_t tier_flag; |
| 353 | uint8_t profile_idc; |
| 354 | uint8_t profile_compatibility_flag[32]; |
| 355 | uint8_t level_idc; |
| 356 | uint8_t progressive_source_flag; |
| 357 | uint8_t interlaced_source_flag; |
| 358 | uint8_t non_packed_constraint_flag; |
| 359 | uint8_t frame_only_constraint_flag; |
| 360 | } PTLCommon; |
| 361 | |
| 362 | typedef struct PTL { |
| 363 | PTLCommon general_ptl; |
| 364 | PTLCommon sub_layer_ptl[MAX_SUB_LAYERS]; |
| 365 | |
| 366 | uint8_t sub_layer_profile_present_flag[MAX_SUB_LAYERS]; |
| 367 | uint8_t sub_layer_level_present_flag[MAX_SUB_LAYERS]; |
| 368 | } PTL; |
| 369 | |
| 370 | typedef struct HEVCVPS { |
| 371 | uint8_t vps_temporal_id_nesting_flag; |
| 372 | int vps_max_layers; |
| 373 | int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1 |
| 374 | |
| 375 | PTL ptl; |
| 376 | int vps_sub_layer_ordering_info_present_flag; |
| 377 | unsigned int vps_max_dec_pic_buffering[MAX_SUB_LAYERS]; |
| 378 | unsigned int vps_num_reorder_pics[MAX_SUB_LAYERS]; |
| 379 | unsigned int vps_max_latency_increase[MAX_SUB_LAYERS]; |
| 380 | int vps_max_layer_id; |
| 381 | int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1 |
| 382 | uint8_t vps_timing_info_present_flag; |
| 383 | uint32_t vps_num_units_in_tick; |
| 384 | uint32_t vps_time_scale; |
| 385 | uint8_t vps_poc_proportional_to_timing_flag; |
| 386 | int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1 |
| 387 | int vps_num_hrd_parameters; |
| 388 | } HEVCVPS; |
| 389 | |
| 390 | typedef struct ScalingList { |
| 391 | /* This is a little wasteful, since sizeID 0 only needs 8 coeffs, |
| 392 | * and size ID 3 only has 2 arrays, not 6. */ |
| 393 | uint8_t sl[4][6][64]; |
| 394 | uint8_t sl_dc[2][6]; |
| 395 | } ScalingList; |
| 396 | |
| 397 | typedef struct HEVCSPS { |
| 398 | unsigned vps_id; |
| 399 | int chroma_format_idc; |
| 400 | uint8_t separate_colour_plane_flag; |
| 401 | |
| 402 | ///< output (i.e. cropped) values |
| 403 | int output_width, output_height; |
| 404 | HEVCWindow output_window; |
| 405 | |
| 406 | HEVCWindow pic_conf_win; |
| 407 | |
| 408 | int bit_depth; |
| 409 | int pixel_shift; |
| 410 | enum AVPixelFormat pix_fmt; |
| 411 | |
| 412 | unsigned int log2_max_poc_lsb; |
| 413 | int pcm_enabled_flag; |
| 414 | |
| 415 | int max_sub_layers; |
| 416 | struct { |
| 417 | int max_dec_pic_buffering; |
| 418 | int num_reorder_pics; |
| 419 | int max_latency_increase; |
| 420 | } temporal_layer[MAX_SUB_LAYERS]; |
| 421 | |
| 422 | VUI vui; |
| 423 | PTL ptl; |
| 424 | |
| 425 | uint8_t scaling_list_enable_flag; |
| 426 | ScalingList scaling_list; |
| 427 | |
| 428 | unsigned int nb_st_rps; |
| 429 | ShortTermRPS st_rps[MAX_SHORT_TERM_RPS_COUNT]; |
| 430 | |
| 431 | uint8_t amp_enabled_flag; |
| 432 | uint8_t sao_enabled; |
| 433 | |
| 434 | uint8_t long_term_ref_pics_present_flag; |
| 435 | uint16_t lt_ref_pic_poc_lsb_sps[32]; |
| 436 | uint8_t used_by_curr_pic_lt_sps_flag[32]; |
| 437 | uint8_t num_long_term_ref_pics_sps; |
| 438 | |
| 439 | struct { |
| 440 | uint8_t bit_depth; |
| 441 | uint8_t bit_depth_chroma; |
| 442 | unsigned int log2_min_pcm_cb_size; |
| 443 | unsigned int log2_max_pcm_cb_size; |
| 444 | uint8_t loop_filter_disable_flag; |
| 445 | } pcm; |
| 446 | uint8_t sps_temporal_mvp_enabled_flag; |
| 447 | uint8_t sps_strong_intra_smoothing_enable_flag; |
| 448 | |
| 449 | unsigned int log2_min_cb_size; |
| 450 | unsigned int log2_diff_max_min_coding_block_size; |
| 451 | unsigned int log2_min_tb_size; |
| 452 | unsigned int log2_max_trafo_size; |
| 453 | unsigned int log2_ctb_size; |
| 454 | unsigned int log2_min_pu_size; |
| 455 | |
| 456 | int max_transform_hierarchy_depth_inter; |
| 457 | int max_transform_hierarchy_depth_intra; |
| 458 | |
| 459 | int transform_skip_rotation_enabled_flag; |
| 460 | int transform_skip_context_enabled_flag; |
| 461 | int implicit_rdpcm_enabled_flag; |
| 462 | int explicit_rdpcm_enabled_flag; |
| 463 | int intra_smoothing_disabled_flag; |
| 464 | int persistent_rice_adaptation_enabled_flag; |
| 465 | |
| 466 | ///< coded frame dimension in various units |
| 467 | int width; |
| 468 | int height; |
| 469 | int ctb_width; |
| 470 | int ctb_height; |
| 471 | int ctb_size; |
| 472 | int min_cb_width; |
| 473 | int min_cb_height; |
| 474 | int min_tb_width; |
| 475 | int min_tb_height; |
| 476 | int min_pu_width; |
| 477 | int min_pu_height; |
| 478 | int tb_mask; |
| 479 | |
| 480 | int hshift[3]; |
| 481 | int vshift[3]; |
| 482 | |
| 483 | int qp_bd_offset; |
| 484 | } HEVCSPS; |
| 485 | |
| 486 | typedef struct HEVCPPS { |
| 487 | unsigned int sps_id; ///< seq_parameter_set_id |
| 488 | |
| 489 | uint8_t sign_data_hiding_flag; |
| 490 | |
| 491 | uint8_t cabac_init_present_flag; |
| 492 | |
| 493 | int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1 |
| 494 | int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1 |
| 495 | int pic_init_qp_minus26; |
| 496 | |
| 497 | uint8_t constrained_intra_pred_flag; |
| 498 | uint8_t transform_skip_enabled_flag; |
| 499 | |
| 500 | uint8_t cu_qp_delta_enabled_flag; |
| 501 | int diff_cu_qp_delta_depth; |
| 502 | |
| 503 | int cb_qp_offset; |
| 504 | int cr_qp_offset; |
| 505 | uint8_t pic_slice_level_chroma_qp_offsets_present_flag; |
| 506 | uint8_t weighted_pred_flag; |
| 507 | uint8_t weighted_bipred_flag; |
| 508 | uint8_t output_flag_present_flag; |
| 509 | uint8_t transquant_bypass_enable_flag; |
| 510 | |
| 511 | uint8_t dependent_slice_segments_enabled_flag; |
| 512 | uint8_t tiles_enabled_flag; |
| 513 | uint8_t entropy_coding_sync_enabled_flag; |
| 514 | |
| 515 | int num_tile_columns; ///< num_tile_columns_minus1 + 1 |
| 516 | int num_tile_rows; ///< num_tile_rows_minus1 + 1 |
| 517 | uint8_t uniform_spacing_flag; |
| 518 | uint8_t loop_filter_across_tiles_enabled_flag; |
| 519 | |
| 520 | uint8_t seq_loop_filter_across_slices_enabled_flag; |
| 521 | |
| 522 | uint8_t deblocking_filter_control_present_flag; |
| 523 | uint8_t deblocking_filter_override_enabled_flag; |
| 524 | uint8_t disable_dbf; |
| 525 | int beta_offset; ///< beta_offset_div2 * 2 |
| 526 | int tc_offset; ///< tc_offset_div2 * 2 |
| 527 | |
| 528 | uint8_t scaling_list_data_present_flag; |
| 529 | ScalingList scaling_list; |
| 530 | |
| 531 | uint8_t lists_modification_present_flag; |
| 532 | int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2 |
| 533 | int num_extra_slice_header_bits; |
| 534 | uint8_t slice_header_extension_present_flag; |
| 535 | uint8_t log2_max_transform_skip_block_size; |
| 536 | uint8_t cross_component_prediction_enabled_flag; |
| 537 | uint8_t chroma_qp_offset_list_enabled_flag; |
| 538 | uint8_t diff_cu_chroma_qp_offset_depth; |
| 539 | uint8_t chroma_qp_offset_list_len_minus1; |
| 540 | int8_t cb_qp_offset_list[5]; |
| 541 | int8_t cr_qp_offset_list[5]; |
| 542 | uint8_t log2_sao_offset_scale_luma; |
| 543 | uint8_t log2_sao_offset_scale_chroma; |
| 544 | |
| 545 | // Inferred parameters |
| 546 | unsigned int *column_width; ///< ColumnWidth |
| 547 | unsigned int *row_height; ///< RowHeight |
| 548 | unsigned int *col_bd; ///< ColBd |
| 549 | unsigned int *row_bd; ///< RowBd |
| 550 | int *col_idxX; |
| 551 | |
| 552 | int *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS |
| 553 | int *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS |
| 554 | int *tile_id; ///< TileId |
| 555 | int *tile_pos_rs; ///< TilePosRS |
| 556 | int *min_tb_addr_zs; ///< MinTbAddrZS |
| 557 | int *min_tb_addr_zs_tab;///< MinTbAddrZS |
| 558 | } HEVCPPS; |
| 559 | |
| 560 | typedef struct SliceHeader { |
| 561 | unsigned int pps_id; |
| 562 | |
| 563 | ///< address (in raster order) of the first block in the current slice segment |
| 564 | unsigned int slice_segment_addr; |
| 565 | ///< address (in raster order) of the first block in the current slice |
| 566 | unsigned int slice_addr; |
| 567 | |
| 568 | enum SliceType slice_type; |
| 569 | |
| 570 | int pic_order_cnt_lsb; |
| 571 | |
| 572 | uint8_t first_slice_in_pic_flag; |
| 573 | uint8_t dependent_slice_segment_flag; |
| 574 | uint8_t pic_output_flag; |
| 575 | uint8_t colour_plane_id; |
| 576 | |
| 577 | ///< RPS coded in the slice header itself is stored here |
| 578 | ShortTermRPS slice_rps; |
| 579 | const ShortTermRPS *short_term_rps; |
| 580 | LongTermRPS long_term_rps; |
| 581 | unsigned int list_entry_lx[2][32]; |
| 582 | |
| 583 | uint8_t rpl_modification_flag[2]; |
| 584 | uint8_t no_output_of_prior_pics_flag; |
| 585 | uint8_t slice_temporal_mvp_enabled_flag; |
| 586 | |
| 587 | unsigned int nb_refs[2]; |
| 588 | |
| 589 | uint8_t slice_sample_adaptive_offset_flag[3]; |
| 590 | uint8_t mvd_l1_zero_flag; |
| 591 | |
| 592 | uint8_t cabac_init_flag; |
| 593 | uint8_t disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag |
| 594 | uint8_t slice_loop_filter_across_slices_enabled_flag; |
| 595 | uint8_t collocated_list; |
| 596 | |
| 597 | unsigned int collocated_ref_idx; |
| 598 | |
| 599 | int slice_qp_delta; |
| 600 | int slice_cb_qp_offset; |
| 601 | int slice_cr_qp_offset; |
| 602 | |
| 603 | uint8_t cu_chroma_qp_offset_enabled_flag; |
| 604 | |
| 605 | int beta_offset; ///< beta_offset_div2 * 2 |
| 606 | int tc_offset; ///< tc_offset_div2 * 2 |
| 607 | |
| 608 | unsigned int max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand |
| 609 | |
| 610 | int *entry_point_offset; |
| 611 | int * offset; |
| 612 | int * size; |
| 613 | int num_entry_point_offsets; |
| 614 | |
| 615 | int8_t slice_qp; |
| 616 | |
| 617 | uint8_t luma_log2_weight_denom; |
| 618 | int16_t chroma_log2_weight_denom; |
| 619 | |
| 620 | int16_t luma_weight_l0[16]; |
| 621 | int16_t chroma_weight_l0[16][2]; |
| 622 | int16_t chroma_weight_l1[16][2]; |
| 623 | int16_t luma_weight_l1[16]; |
| 624 | |
| 625 | int16_t luma_offset_l0[16]; |
| 626 | int16_t chroma_offset_l0[16][2]; |
| 627 | |
| 628 | int16_t luma_offset_l1[16]; |
| 629 | int16_t chroma_offset_l1[16][2]; |
| 630 | |
| 631 | int slice_ctb_addr_rs; |
| 632 | } SliceHeader; |
| 633 | |
| 634 | typedef struct CodingUnit { |
| 635 | int x; |
| 636 | int y; |
| 637 | |
| 638 | enum PredMode pred_mode; ///< PredMode |
| 639 | enum PartMode part_mode; ///< PartMode |
| 640 | |
| 641 | // Inferred parameters |
| 642 | uint8_t intra_split_flag; ///< IntraSplitFlag |
| 643 | uint8_t max_trafo_depth; ///< MaxTrafoDepth |
| 644 | uint8_t cu_transquant_bypass_flag; |
| 645 | } CodingUnit; |
| 646 | |
| 647 | typedef struct Mv { |
| 648 | int16_t x; ///< horizontal component of motion vector |
| 649 | int16_t y; ///< vertical component of motion vector |
| 650 | } Mv; |
| 651 | |
| 652 | typedef struct MvField { |
| 653 | DECLARE_ALIGNED(4, Mv, mv)[2]; |
| 654 | int8_t ref_idx[2]; |
| 655 | int8_t pred_flag; |
| 656 | } MvField; |
| 657 | |
| 658 | typedef struct NeighbourAvailable { |
| 659 | int cand_bottom_left; |
| 660 | int cand_left; |
| 661 | int cand_up; |
| 662 | int cand_up_left; |
| 663 | int cand_up_right; |
| 664 | int cand_up_right_sap; |
| 665 | } NeighbourAvailable; |
| 666 | |
| 667 | typedef struct PredictionUnit { |
| 668 | int mpm_idx; |
| 669 | int rem_intra_luma_pred_mode; |
| 670 | uint8_t intra_pred_mode[4]; |
| 671 | Mv mvd; |
| 672 | uint8_t merge_flag; |
| 673 | uint8_t intra_pred_mode_c[4]; |
| 674 | uint8_t chroma_mode_c[4]; |
| 675 | } PredictionUnit; |
| 676 | |
| 677 | typedef struct TransformUnit { |
| 678 | int cu_qp_delta; |
| 679 | |
| 680 | int res_scale_val; |
| 681 | |
| 682 | // Inferred parameters; |
| 683 | int intra_pred_mode; |
| 684 | int intra_pred_mode_c; |
| 685 | int chroma_mode_c; |
| 686 | uint8_t is_cu_qp_delta_coded; |
| 687 | uint8_t is_cu_chroma_qp_offset_coded; |
| 688 | int8_t cu_qp_offset_cb; |
| 689 | int8_t cu_qp_offset_cr; |
| 690 | uint8_t cross_pf; |
| 691 | } TransformUnit; |
| 692 | |
| 693 | typedef struct DBParams { |
| 694 | int beta_offset; |
| 695 | int tc_offset; |
| 696 | } DBParams; |
| 697 | |
| 698 | #define HEVC_FRAME_FLAG_OUTPUT (1 << 0) |
| 699 | #define HEVC_FRAME_FLAG_SHORT_REF (1 << 1) |
| 700 | #define HEVC_FRAME_FLAG_LONG_REF (1 << 2) |
| 701 | #define HEVC_FRAME_FLAG_BUMPING (1 << 3) |
| 702 | |
| 703 | typedef struct HEVCFrame { |
| 704 | AVFrame *frame; |
| 705 | ThreadFrame tf; |
| 706 | MvField *tab_mvf; |
| 707 | RefPicList *refPicList; |
| 708 | RefPicListTab **rpl_tab; |
| 709 | int ctb_count; |
| 710 | int poc; |
| 711 | struct HEVCFrame *collocated_ref; |
| 712 | |
| 713 | HEVCWindow window; |
| 714 | |
| 715 | AVBufferRef *tab_mvf_buf; |
| 716 | AVBufferRef *rpl_tab_buf; |
| 717 | AVBufferRef *rpl_buf; |
| 718 | |
| 719 | /** |
| 720 | * A sequence counter, so that old frames are output first |
| 721 | * after a POC reset |
| 722 | */ |
| 723 | uint16_t sequence; |
| 724 | |
| 725 | /** |
| 726 | * A combination of HEVC_FRAME_FLAG_* |
| 727 | */ |
| 728 | uint8_t flags; |
| 729 | } HEVCFrame; |
| 730 | |
| 731 | typedef struct HEVCNAL { |
| 732 | uint8_t *rbsp_buffer; |
| 733 | int rbsp_buffer_size; |
| 734 | |
| 735 | int size; |
| 736 | const uint8_t *data; |
| 737 | } HEVCNAL; |
| 738 | |
| 739 | typedef struct HEVCLocalContext { |
| 740 | uint8_t cabac_state[HEVC_CONTEXTS]; |
| 741 | |
| 742 | uint8_t stat_coeff[4]; |
| 743 | |
| 744 | uint8_t first_qp_group; |
| 745 | |
| 746 | GetBitContext gb; |
| 747 | CABACContext cc; |
| 748 | |
| 749 | int8_t qp_y; |
| 750 | int8_t curr_qp_y; |
| 751 | |
| 752 | int qPy_pred; |
| 753 | |
| 754 | TransformUnit tu; |
| 755 | |
| 756 | uint8_t ctb_left_flag; |
| 757 | uint8_t ctb_up_flag; |
| 758 | uint8_t ctb_up_right_flag; |
| 759 | uint8_t ctb_up_left_flag; |
| 760 | int end_of_tiles_x; |
| 761 | int end_of_tiles_y; |
| 762 | /* +7 is for subpixel interpolation, *2 for high bit depths */ |
| 763 | DECLARE_ALIGNED(32, uint8_t, edge_emu_buffer)[(MAX_PB_SIZE + 7) * EDGE_EMU_BUFFER_STRIDE * 2]; |
| 764 | DECLARE_ALIGNED(32, uint8_t, edge_emu_buffer2)[(MAX_PB_SIZE + 7) * EDGE_EMU_BUFFER_STRIDE * 2]; |
| 765 | DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]); |
| 766 | |
| 767 | int ct_depth; |
| 768 | CodingUnit cu; |
| 769 | PredictionUnit pu; |
| 770 | NeighbourAvailable na; |
| 771 | |
| 772 | #define BOUNDARY_LEFT_SLICE (1 << 0) |
| 773 | #define BOUNDARY_LEFT_TILE (1 << 1) |
| 774 | #define BOUNDARY_UPPER_SLICE (1 << 2) |
| 775 | #define BOUNDARY_UPPER_TILE (1 << 3) |
| 776 | /* properties of the boundary of the current CTB for the purposes |
| 777 | * of the deblocking filter */ |
| 778 | int boundary_flags; |
| 779 | } HEVCLocalContext; |
| 780 | |
| 781 | typedef struct HEVCContext { |
| 782 | const AVClass *c; // needed by private avoptions |
| 783 | AVCodecContext *avctx; |
| 784 | |
| 785 | struct HEVCContext *sList[MAX_NB_THREADS]; |
| 786 | |
| 787 | HEVCLocalContext *HEVClcList[MAX_NB_THREADS]; |
| 788 | HEVCLocalContext *HEVClc; |
| 789 | |
| 790 | uint8_t threads_type; |
| 791 | uint8_t threads_number; |
| 792 | |
| 793 | int width; |
| 794 | int height; |
| 795 | |
| 796 | uint8_t *cabac_state; |
| 797 | |
| 798 | /** 1 if the independent slice segment header was successfully parsed */ |
| 799 | uint8_t slice_initialized; |
| 800 | |
| 801 | AVFrame *frame; |
| 802 | AVFrame *sao_frame; |
| 803 | AVFrame *tmp_frame; |
| 804 | AVFrame *output_frame; |
| 805 | |
| 806 | const HEVCVPS *vps; |
| 807 | const HEVCSPS *sps; |
| 808 | const HEVCPPS *pps; |
| 809 | AVBufferRef *vps_list[MAX_VPS_COUNT]; |
| 810 | AVBufferRef *sps_list[MAX_SPS_COUNT]; |
| 811 | AVBufferRef *pps_list[MAX_PPS_COUNT]; |
| 812 | |
| 813 | AVBufferRef *current_sps; |
| 814 | |
| 815 | AVBufferPool *tab_mvf_pool; |
| 816 | AVBufferPool *rpl_tab_pool; |
| 817 | |
| 818 | ///< candidate references for the current frame |
| 819 | RefPicList rps[5]; |
| 820 | |
| 821 | SliceHeader sh; |
| 822 | SAOParams *sao; |
| 823 | DBParams *deblock; |
| 824 | enum NALUnitType nal_unit_type; |
| 825 | int temporal_id; ///< temporal_id_plus1 - 1 |
| 826 | HEVCFrame *ref; |
| 827 | HEVCFrame DPB[32]; |
| 828 | int poc; |
| 829 | int pocTid0; |
| 830 | int slice_idx; ///< number of the slice being currently decoded |
| 831 | int eos; ///< current packet contains an EOS/EOB NAL |
| 832 | int last_eos; ///< last packet contains an EOS/EOB NAL |
| 833 | int max_ra; |
| 834 | int bs_width; |
| 835 | int bs_height; |
| 836 | |
| 837 | int is_decoded; |
| 838 | |
| 839 | HEVCPredContext hpc; |
| 840 | HEVCDSPContext hevcdsp; |
| 841 | VideoDSPContext vdsp; |
| 842 | BswapDSPContext bdsp; |
| 843 | int8_t *qp_y_tab; |
| 844 | uint8_t *horizontal_bs; |
| 845 | uint8_t *vertical_bs; |
| 846 | |
| 847 | int32_t *tab_slice_address; |
| 848 | |
| 849 | // CU |
| 850 | uint8_t *skip_flag; |
| 851 | uint8_t *tab_ct_depth; |
| 852 | // PU |
| 853 | uint8_t *tab_ipm; |
| 854 | |
| 855 | uint8_t *cbf_luma; // cbf_luma of colocated TU |
| 856 | uint8_t *is_pcm; |
| 857 | |
| 858 | // CTB-level flags affecting loop filter operation |
| 859 | uint8_t *filter_slice_edges; |
| 860 | |
| 861 | /** used on BE to byteswap the lines for checksumming */ |
| 862 | uint8_t *checksum_buf; |
| 863 | int checksum_buf_size; |
| 864 | |
| 865 | /** |
| 866 | * Sequence counters for decoded and output frames, so that old |
| 867 | * frames are output first after a POC reset |
| 868 | */ |
| 869 | uint16_t seq_decode; |
| 870 | uint16_t seq_output; |
| 871 | |
| 872 | int enable_parallel_tiles; |
| 873 | int wpp_err; |
| 874 | int skipped_bytes; |
| 875 | int *skipped_bytes_pos; |
| 876 | int skipped_bytes_pos_size; |
| 877 | |
| 878 | int *skipped_bytes_nal; |
| 879 | int **skipped_bytes_pos_nal; |
| 880 | int *skipped_bytes_pos_size_nal; |
| 881 | |
| 882 | const uint8_t *data; |
| 883 | |
| 884 | HEVCNAL *nals; |
| 885 | int nb_nals; |
| 886 | int nals_allocated; |
| 887 | // type of the first VCL NAL of the current frame |
| 888 | enum NALUnitType first_nal_type; |
| 889 | |
| 890 | // for checking the frame checksums |
| 891 | struct AVMD5 *md5_ctx; |
| 892 | uint8_t md5[3][16]; |
| 893 | uint8_t is_md5; |
| 894 | |
| 895 | uint8_t context_initialized; |
| 896 | uint8_t is_nalff; ///< this flag is != 0 if bitstream is encapsulated |
| 897 | ///< as a format defined in 14496-15 |
| 898 | int apply_defdispwin; |
| 899 | |
| 900 | int active_seq_parameter_set_id; |
| 901 | |
| 902 | int nal_length_size; ///< Number of bytes used for nal length (1, 2 or 4) |
| 903 | int nuh_layer_id; |
| 904 | |
| 905 | /** frame packing arrangement variables */ |
| 906 | int sei_frame_packing_present; |
| 907 | int frame_packing_arrangement_type; |
| 908 | int content_interpretation_type; |
| 909 | int quincunx_subsampling; |
| 910 | |
| 911 | /** display orientation */ |
| 912 | int sei_display_orientation_present; |
| 913 | int sei_anticlockwise_rotation; |
| 914 | int sei_hflip, sei_vflip; |
| 915 | |
| 916 | int picture_struct; |
| 917 | } HEVCContext; |
| 918 | |
| 919 | int ff_hevc_decode_short_term_rps(HEVCContext *s, ShortTermRPS *rps, |
| 920 | const HEVCSPS *sps, int is_slice_header); |
| 921 | int ff_hevc_decode_nal_vps(HEVCContext *s); |
| 922 | int ff_hevc_decode_nal_sps(HEVCContext *s); |
| 923 | int ff_hevc_decode_nal_pps(HEVCContext *s); |
| 924 | int ff_hevc_decode_nal_sei(HEVCContext *s); |
| 925 | |
| 926 | int ff_hevc_extract_rbsp(HEVCContext *s, const uint8_t *src, int length, |
| 927 | HEVCNAL *nal); |
| 928 | |
| 929 | /** |
| 930 | * Mark all frames in DPB as unused for reference. |
| 931 | */ |
| 932 | void ff_hevc_clear_refs(HEVCContext *s); |
| 933 | |
| 934 | /** |
| 935 | * Drop all frames currently in DPB. |
| 936 | */ |
| 937 | void ff_hevc_flush_dpb(HEVCContext *s); |
| 938 | |
| 939 | /** |
| 940 | * Compute POC of the current frame and return it. |
| 941 | */ |
| 942 | int ff_hevc_compute_poc(HEVCContext *s, int poc_lsb); |
| 943 | |
| 944 | RefPicList *ff_hevc_get_ref_list(HEVCContext *s, HEVCFrame *frame, |
| 945 | int x0, int y0); |
| 946 | |
| 947 | /** |
| 948 | * Construct the reference picture sets for the current frame. |
| 949 | */ |
| 950 | int ff_hevc_frame_rps(HEVCContext *s); |
| 951 | |
| 952 | /** |
| 953 | * Construct the reference picture list(s) for the current slice. |
| 954 | */ |
| 955 | int ff_hevc_slice_rpl(HEVCContext *s); |
| 956 | |
| 957 | void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts); |
| 958 | void ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts); |
| 959 | int ff_hevc_sao_merge_flag_decode(HEVCContext *s); |
| 960 | int ff_hevc_sao_type_idx_decode(HEVCContext *s); |
| 961 | int ff_hevc_sao_band_position_decode(HEVCContext *s); |
| 962 | int ff_hevc_sao_offset_abs_decode(HEVCContext *s); |
| 963 | int ff_hevc_sao_offset_sign_decode(HEVCContext *s); |
| 964 | int ff_hevc_sao_eo_class_decode(HEVCContext *s); |
| 965 | int ff_hevc_end_of_slice_flag_decode(HEVCContext *s); |
| 966 | int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s); |
| 967 | int ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, |
| 968 | int x_cb, int y_cb); |
| 969 | int ff_hevc_pred_mode_decode(HEVCContext *s); |
| 970 | int ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, |
| 971 | int x0, int y0); |
| 972 | int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size); |
| 973 | int ff_hevc_pcm_flag_decode(HEVCContext *s); |
| 974 | int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s); |
| 975 | int ff_hevc_mpm_idx_decode(HEVCContext *s); |
| 976 | int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s); |
| 977 | int ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s); |
| 978 | int ff_hevc_merge_idx_decode(HEVCContext *s); |
| 979 | int ff_hevc_merge_flag_decode(HEVCContext *s); |
| 980 | int ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH); |
| 981 | int ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx); |
| 982 | int ff_hevc_mvp_lx_flag_decode(HEVCContext *s); |
| 983 | int ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s); |
| 984 | int ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size); |
| 985 | int ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth); |
| 986 | int ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth); |
| 987 | int ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx); |
| 988 | int ff_hevc_res_scale_sign_flag(HEVCContext *s, int idx); |
| 989 | |
| 990 | /** |
| 991 | * Get the number of candidate references for the current frame. |
| 992 | */ |
| 993 | int ff_hevc_frame_nb_refs(HEVCContext *s); |
| 994 | |
| 995 | int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc); |
| 996 | |
| 997 | /** |
| 998 | * Find next frame in output order and put a reference to it in frame. |
| 999 | * @return 1 if a frame was output, 0 otherwise |
| 1000 | */ |
| 1001 | int ff_hevc_output_frame(HEVCContext *s, AVFrame *frame, int flush); |
| 1002 | |
| 1003 | void ff_hevc_bump_frame(HEVCContext *s); |
| 1004 | |
| 1005 | void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags); |
| 1006 | |
| 1007 | void ff_hevc_set_neighbour_available(HEVCContext *s, int x0, int y0, |
| 1008 | int nPbW, int nPbH); |
| 1009 | void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, |
| 1010 | int nPbW, int nPbH, int log2_cb_size, |
| 1011 | int part_idx, int merge_idx, MvField *mv); |
| 1012 | void ff_hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, |
| 1013 | int nPbW, int nPbH, int log2_cb_size, |
| 1014 | int part_idx, int merge_idx, |
| 1015 | MvField *mv, int mvp_lx_flag, int LX); |
| 1016 | void ff_hevc_set_qPy(HEVCContext *s, int xBase, int yBase, |
| 1017 | int log2_cb_size); |
| 1018 | void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, |
| 1019 | int log2_trafo_size); |
| 1020 | int ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s); |
| 1021 | int ff_hevc_cu_qp_delta_abs(HEVCContext *s); |
| 1022 | int ff_hevc_cu_chroma_qp_offset_flag(HEVCContext *s); |
| 1023 | int ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s); |
| 1024 | void ff_hevc_hls_filter(HEVCContext *s, int x, int y, int ctb_size); |
| 1025 | void ff_hevc_hls_filters(HEVCContext *s, int x_ctb, int y_ctb, int ctb_size); |
| 1026 | void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0, |
| 1027 | int log2_trafo_size, enum ScanType scan_idx, |
| 1028 | int c_idx); |
| 1029 | |
| 1030 | void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size); |
| 1031 | |
| 1032 | |
| 1033 | extern const uint8_t ff_hevc_qpel_extra_before[4]; |
| 1034 | extern const uint8_t ff_hevc_qpel_extra_after[4]; |
| 1035 | extern const uint8_t ff_hevc_qpel_extra[4]; |
| 1036 | |
| 1037 | extern const uint8_t ff_hevc_diag_scan4x4_x[16]; |
| 1038 | extern const uint8_t ff_hevc_diag_scan4x4_y[16]; |
| 1039 | extern const uint8_t ff_hevc_diag_scan8x8_x[64]; |
| 1040 | extern const uint8_t ff_hevc_diag_scan8x8_y[64]; |
| 1041 | |
| 1042 | #endif /* AVCODEC_HEVC_H */ |