Commit | Line | Data |
---|---|---|
2ba45a60 DM |
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 | ||
2ba45a60 DM |
634 | typedef struct CodingUnit { |
635 | int x; | |
636 | int y; | |
637 | ||
638 | enum PredMode pred_mode; ///< PredMode | |
639 | enum PartMode part_mode; ///< PartMode | |
640 | ||
2ba45a60 DM |
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 { | |
2ba45a60 DM |
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 { | |
2ba45a60 DM |
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]; | |
f6fa7814 | 765 | DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]); |
2ba45a60 | 766 | |
f6fa7814 | 767 | int ct_depth; |
2ba45a60 DM |
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 */ |