| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder | ||
| 3 | * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | ||
| 4 | * | ||
| 5 | * This file is part of FFmpeg. | ||
| 6 | * | ||
| 7 | * FFmpeg is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU Lesser General Public | ||
| 9 | * License as published by the Free Software Foundation; either | ||
| 10 | * version 2.1 of the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * Lesser General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU Lesser General Public | ||
| 18 | * License along with FFmpeg; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | /** | ||
| 23 | * @file | ||
| 24 | * H.264 / AVC / MPEG-4 part10 codec. | ||
| 25 | * @author Michael Niedermayer <michaelni@gmx.at> | ||
| 26 | */ | ||
| 27 | |||
| 28 | #ifndef AVCODEC_H264DEC_H | ||
| 29 | #define AVCODEC_H264DEC_H | ||
| 30 | |||
| 31 | #include "libavutil/mem_internal.h" | ||
| 32 | |||
| 33 | #include "cabac.h" | ||
| 34 | #include "error_resilience.h" | ||
| 35 | #include "h264_parse.h" | ||
| 36 | #include "h264_ps.h" | ||
| 37 | #include "h264_sei.h" | ||
| 38 | #include "h2645_parse.h" | ||
| 39 | #include "h264chroma.h" | ||
| 40 | #include "h264dsp.h" | ||
| 41 | #include "h264pred.h" | ||
| 42 | #include "h264qpel.h" | ||
| 43 | #include "mpegutils.h" | ||
| 44 | #include "threadframe.h" | ||
| 45 | #include "videodsp.h" | ||
| 46 | |||
| 47 | #define H264_MAX_PICTURE_COUNT 36 | ||
| 48 | |||
| 49 | /* Compiling in interlaced support reduces the speed | ||
| 50 | * of progressive decoding by about 2%. */ | ||
| 51 | #define ALLOW_INTERLACE | ||
| 52 | |||
| 53 | #define FMO 0 | ||
| 54 | |||
| 55 | /** | ||
| 56 | * The maximum number of slices supported by the decoder. | ||
| 57 | * must be a power of 2 | ||
| 58 | */ | ||
| 59 | #define MAX_SLICES 32 | ||
| 60 | |||
| 61 | #ifdef ALLOW_INTERLACE | ||
| 62 | #define MB_MBAFF(h) (h)->mb_mbaff | ||
| 63 | #define MB_FIELD(sl) (sl)->mb_field_decoding_flag | ||
| 64 | #define FRAME_MBAFF(h) (h)->mb_aff_frame | ||
| 65 | #define FIELD_PICTURE(h) ((h)->picture_structure != PICT_FRAME) | ||
| 66 | #define LEFT_MBS 2 | ||
| 67 | #define LTOP 0 | ||
| 68 | #define LBOT 1 | ||
| 69 | #define LEFT(i) (i) | ||
| 70 | #else | ||
| 71 | #define MB_MBAFF(h) 0 | ||
| 72 | #define MB_FIELD(sl) 0 | ||
| 73 | #define FRAME_MBAFF(h) 0 | ||
| 74 | #define FIELD_PICTURE(h) 0 | ||
| 75 | #undef IS_INTERLACED | ||
| 76 | #define IS_INTERLACED(mb_type) 0 | ||
| 77 | #define LEFT_MBS 1 | ||
| 78 | #define LTOP 0 | ||
| 79 | #define LBOT 0 | ||
| 80 | #define LEFT(i) 0 | ||
| 81 | #endif | ||
| 82 | #define FIELD_OR_MBAFF_PICTURE(h) (FRAME_MBAFF(h) || FIELD_PICTURE(h)) | ||
| 83 | |||
| 84 | #ifndef CABAC | ||
| 85 | #define CABAC(h) (h)->ps.pps->cabac | ||
| 86 | #endif | ||
| 87 | |||
| 88 | #define CHROMA(h) ((h)->ps.sps->chroma_format_idc) | ||
| 89 | #define CHROMA422(h) ((h)->ps.sps->chroma_format_idc == 2) | ||
| 90 | #define CHROMA444(h) ((h)->ps.sps->chroma_format_idc == 3) | ||
| 91 | |||
| 92 | #define IS_REF0(a) ((a) & MB_TYPE_REF0) | ||
| 93 | #define IS_8x8DCT(a) ((a) & MB_TYPE_8x8DCT) | ||
| 94 | #define IS_SUB_8X8(a) ((a) & MB_TYPE_16x16) // note reused | ||
| 95 | #define IS_SUB_8X4(a) ((a) & MB_TYPE_16x8) // note reused | ||
| 96 | #define IS_SUB_4X8(a) ((a) & MB_TYPE_8x16) // note reused | ||
| 97 | #define IS_SUB_4X4(a) ((a) & MB_TYPE_8x8) // note reused | ||
| 98 | #define IS_DIR(a, part, list) ((a) & (MB_TYPE_P0L0 << ((part) + 2 * (list)))) | ||
| 99 | |||
| 100 | // does this mb use listX, note does not work if subMBs | ||
| 101 | #define USES_LIST(a, list) ((a) & ((MB_TYPE_P0L0 | MB_TYPE_P1L0) << (2 * (list)))) | ||
| 102 | |||
| 103 | /** | ||
| 104 | * Memory management control operation. | ||
| 105 | */ | ||
| 106 | typedef struct MMCO { | ||
| 107 | MMCOOpcode opcode; | ||
| 108 | int short_pic_num; ///< pic_num without wrapping (pic_num & max_pic_num) | ||
| 109 | int long_arg; ///< index, pic_num, or num long refs depending on opcode | ||
| 110 | } MMCO; | ||
| 111 | |||
| 112 | typedef struct H264Picture { | ||
| 113 | AVFrame *f; | ||
| 114 | ThreadFrame tf; | ||
| 115 | |||
| 116 | AVFrame *f_grain; | ||
| 117 | |||
| 118 | int8_t *qscale_table_base; ///< RefStruct reference | ||
| 119 | int8_t *qscale_table; | ||
| 120 | |||
| 121 | int16_t (*motion_val_base[2])[2]; ///< RefStruct reference | ||
| 122 | int16_t (*motion_val[2])[2]; | ||
| 123 | |||
| 124 | uint32_t *mb_type_base; ///< RefStruct reference | ||
| 125 | uint32_t *mb_type; | ||
| 126 | |||
| 127 | /// RefStruct reference for hardware accelerator private data | ||
| 128 | void *hwaccel_picture_private; | ||
| 129 | |||
| 130 | int8_t *ref_index[2]; ///< RefStruct reference | ||
| 131 | |||
| 132 | int field_poc[2]; ///< top/bottom POC | ||
| 133 | int poc; ///< frame POC | ||
| 134 | int frame_num; ///< frame_num (raw frame_num from slice header) | ||
| 135 | int mmco_reset; /**< MMCO_RESET set this 1. Reordering code must | ||
| 136 | not mix pictures before and after MMCO_RESET. */ | ||
| 137 | int pic_id; /**< pic_num (short -> no wrap version of pic_num, | ||
| 138 | pic_num & max_pic_num; long -> long_pic_num) */ | ||
| 139 | int long_ref; ///< 1->long term reference 0->short term reference | ||
| 140 | int ref_poc[2][2][32]; ///< POCs of the frames/fields used as reference (FIXME need per slice) | ||
| 141 | int ref_count[2][2]; ///< number of entries in ref_poc (FIXME need per slice) | ||
| 142 | int mbaff; ///< 1 -> MBAFF frame 0-> not MBAFF | ||
| 143 | int field_picture; ///< whether or not picture was encoded in separate fields | ||
| 144 | |||
| 145 | /** | ||
| 146 | * H264Picture.reference has this flag set, | ||
| 147 | * when the picture is held for delayed output. | ||
| 148 | */ | ||
| 149 | #define DELAYED_PIC_REF (1 << 2) | ||
| 150 | int reference; | ||
| 151 | int recovered; ///< picture at IDR or recovery point + recovery count | ||
| 152 | int invalid_gap; | ||
| 153 | int sei_recovery_frame_cnt; | ||
| 154 | int needs_fg; ///< whether picture needs film grain synthesis (see `f_grain`) | ||
| 155 | |||
| 156 | const PPS *pps; | ||
| 157 | |||
| 158 | int mb_width, mb_height; | ||
| 159 | int mb_stride; | ||
| 160 | |||
| 161 | /// RefStruct reference; its pointee is shared between decoding threads. | ||
| 162 | atomic_int *decode_error_flags; | ||
| 163 | |||
| 164 | int gray; | ||
| 165 | } H264Picture; | ||
| 166 | |||
| 167 | typedef struct H264Ref { | ||
| 168 | uint8_t *data[3]; | ||
| 169 | int linesize[3]; | ||
| 170 | |||
| 171 | int reference; | ||
| 172 | int poc; | ||
| 173 | int pic_id; | ||
| 174 | |||
| 175 | const H264Picture *parent; | ||
| 176 | } H264Ref; | ||
| 177 | |||
| 178 | typedef struct H264SliceContext { | ||
| 179 | const struct H264Context *h264; | ||
| 180 | GetBitContext gb; | ||
| 181 | ERContext *er; | ||
| 182 | |||
| 183 | int slice_num; | ||
| 184 | int slice_type; | ||
| 185 | int slice_type_nos; ///< S free slice type (SI/SP are remapped to I/P) | ||
| 186 | int slice_type_fixed; | ||
| 187 | |||
| 188 | int qscale; | ||
| 189 | int chroma_qp[2]; // QPc | ||
| 190 | int qp_thresh; ///< QP threshold to skip loopfilter | ||
| 191 | int last_qscale_diff; | ||
| 192 | |||
| 193 | // deblock | ||
| 194 | int deblocking_filter; ///< disable_deblocking_filter_idc with 1 <-> 0 | ||
| 195 | int slice_alpha_c0_offset; | ||
| 196 | int slice_beta_offset; | ||
| 197 | |||
| 198 | H264PredWeightTable pwt; | ||
| 199 | |||
| 200 | int prev_mb_skipped; | ||
| 201 | int next_mb_skipped; | ||
| 202 | |||
| 203 | int chroma_pred_mode; | ||
| 204 | int intra16x16_pred_mode; | ||
| 205 | |||
| 206 | int8_t intra4x4_pred_mode_cache[5 * 8]; | ||
| 207 | int8_t(*intra4x4_pred_mode); | ||
| 208 | |||
| 209 | int topleft_mb_xy; | ||
| 210 | int top_mb_xy; | ||
| 211 | int topright_mb_xy; | ||
| 212 | int left_mb_xy[LEFT_MBS]; | ||
| 213 | |||
| 214 | int topleft_type; | ||
| 215 | int top_type; | ||
| 216 | int topright_type; | ||
| 217 | int left_type[LEFT_MBS]; | ||
| 218 | |||
| 219 | const uint8_t *left_block; | ||
| 220 | int topleft_partition; | ||
| 221 | |||
| 222 | unsigned int topleft_samples_available; | ||
| 223 | unsigned int top_samples_available; | ||
| 224 | unsigned int topright_samples_available; | ||
| 225 | unsigned int left_samples_available; | ||
| 226 | |||
| 227 | ptrdiff_t linesize, uvlinesize; | ||
| 228 | ptrdiff_t mb_linesize; ///< may be equal to s->linesize or s->linesize * 2, for mbaff | ||
| 229 | ptrdiff_t mb_uvlinesize; | ||
| 230 | |||
| 231 | int mb_x, mb_y; | ||
| 232 | int mb_xy; | ||
| 233 | int resync_mb_x; | ||
| 234 | int resync_mb_y; | ||
| 235 | unsigned int first_mb_addr; | ||
| 236 | // index of the first MB of the next slice | ||
| 237 | int next_slice_idx; | ||
| 238 | int mb_skip_run; | ||
| 239 | int is_complex; | ||
| 240 | |||
| 241 | int picture_structure; | ||
| 242 | int mb_field_decoding_flag; | ||
| 243 | int mb_mbaff; ///< mb_aff_frame && mb_field_decoding_flag | ||
| 244 | |||
| 245 | int redundant_pic_count; | ||
| 246 | |||
| 247 | /** | ||
| 248 | * number of neighbors (top and/or left) that used 8x8 dct | ||
| 249 | */ | ||
| 250 | int neighbor_transform_size; | ||
| 251 | |||
| 252 | int direct_spatial_mv_pred; | ||
| 253 | int col_parity; | ||
| 254 | int col_fieldoff; | ||
| 255 | |||
| 256 | int cbp; | ||
| 257 | int top_cbp; | ||
| 258 | int left_cbp; | ||
| 259 | |||
| 260 | int dist_scale_factor[32]; | ||
| 261 | int dist_scale_factor_field[2][32]; | ||
| 262 | int map_col_to_list0[2][16 + 32]; | ||
| 263 | int map_col_to_list0_field[2][2][16 + 32]; | ||
| 264 | |||
| 265 | /** | ||
| 266 | * num_ref_idx_l0/1_active_minus1 + 1 | ||
| 267 | */ | ||
| 268 | unsigned int ref_count[2]; ///< counts frames or fields, depending on current mb mode | ||
| 269 | unsigned int list_count; | ||
| 270 | H264Ref ref_list[2][48]; /**< 0..15: frame refs, 16..47: mbaff field refs. | ||
| 271 | * Reordered version of default_ref_list | ||
| 272 | * according to picture reordering in slice header */ | ||
| 273 | struct { | ||
| 274 | uint8_t op; | ||
| 275 | uint32_t val; | ||
| 276 | } ref_modifications[2][32]; | ||
| 277 | int nb_ref_modifications[2]; | ||
| 278 | |||
| 279 | unsigned int pps_id; | ||
| 280 | |||
| 281 | const uint8_t *intra_pcm_ptr; | ||
| 282 | |||
| 283 | uint8_t *bipred_scratchpad; | ||
| 284 | uint8_t *edge_emu_buffer; | ||
| 285 | uint8_t (*top_borders[2])[(16 * 3) * 2]; | ||
| 286 | int bipred_scratchpad_allocated; | ||
| 287 | int edge_emu_buffer_allocated; | ||
| 288 | int top_borders_allocated[2]; | ||
| 289 | |||
| 290 | /** | ||
| 291 | * non zero coeff count cache. | ||
| 292 | * is 64 if not available. | ||
| 293 | */ | ||
| 294 | DECLARE_ALIGNED(8, uint8_t, non_zero_count_cache)[15 * 8]; | ||
| 295 | |||
| 296 | /** | ||
| 297 | * Motion vector cache. | ||
| 298 | */ | ||
| 299 | DECLARE_ALIGNED(16, int16_t, mv_cache)[2][5 * 8][2]; | ||
| 300 | DECLARE_ALIGNED(8, int8_t, ref_cache)[2][5 * 8]; | ||
| 301 | DECLARE_ALIGNED(16, uint8_t, mvd_cache)[2][5 * 8][2]; | ||
| 302 | uint8_t direct_cache[5 * 8]; | ||
| 303 | |||
| 304 | DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4]; | ||
| 305 | |||
| 306 | /// as a DCT coefficient is int32_t in high depth, we need to reserve twice the space. | ||
| 307 | DECLARE_ALIGNED(16, int16_t, mb)[16 * 48 * 2]; | ||
| 308 | DECLARE_ALIGNED(16, int16_t, mb_luma_dc)[3][16 * 2]; | ||
| 309 | /// as mb is addressed by scantable[i] and scantable is uint8_t we can either | ||
| 310 | /// check that i is not too large or ensure that there is some unused stuff after mb | ||
| 311 | int16_t mb_padding[256 * 2]; | ||
| 312 | |||
| 313 | uint8_t (*mvd_table[2])[2]; | ||
| 314 | |||
| 315 | /** | ||
| 316 | * Cabac | ||
| 317 | */ | ||
| 318 | CABACContext cabac; | ||
| 319 | uint8_t cabac_state[1024]; | ||
| 320 | int cabac_init_idc; | ||
| 321 | |||
| 322 | MMCO mmco[H264_MAX_MMCO_COUNT]; | ||
| 323 | int nb_mmco; | ||
| 324 | int explicit_ref_marking; | ||
| 325 | |||
| 326 | int frame_num; | ||
| 327 | int idr_pic_id; | ||
| 328 | int poc_lsb; | ||
| 329 | int delta_poc_bottom; | ||
| 330 | int delta_poc[2]; | ||
| 331 | int curr_pic_num; | ||
| 332 | int max_pic_num; | ||
| 333 | } H264SliceContext; | ||
| 334 | |||
| 335 | /** | ||
| 336 | * H264Context | ||
| 337 | */ | ||
| 338 | typedef struct H264Context { | ||
| 339 | const AVClass *class; | ||
| 340 | AVCodecContext *avctx; | ||
| 341 | VideoDSPContext vdsp; | ||
| 342 | H264DSPContext h264dsp; | ||
| 343 | H264ChromaContext h264chroma; | ||
| 344 | H264QpelContext h264qpel; | ||
| 345 | |||
| 346 | H264Picture DPB[H264_MAX_PICTURE_COUNT]; | ||
| 347 | H264Picture *cur_pic_ptr; | ||
| 348 | H264Picture cur_pic; | ||
| 349 | H264Picture last_pic_for_ec; | ||
| 350 | |||
| 351 | H264SliceContext *slice_ctx; | ||
| 352 | int nb_slice_ctx; | ||
| 353 | int nb_slice_ctx_queued; | ||
| 354 | |||
| 355 | H2645Packet pkt; | ||
| 356 | |||
| 357 | int pixel_shift; ///< 0 for 8-bit H.264, 1 for high-bit-depth H.264 | ||
| 358 | |||
| 359 | /* coded dimensions -- 16 * mb w/h */ | ||
| 360 | int width, height; | ||
| 361 | int chroma_x_shift, chroma_y_shift; | ||
| 362 | |||
| 363 | int droppable; | ||
| 364 | |||
| 365 | int context_initialized; | ||
| 366 | int flags; | ||
| 367 | int workaround_bugs; | ||
| 368 | int x264_build; | ||
| 369 | /* Set when slice threading is used and at least one slice uses deblocking | ||
| 370 | * mode 1 (i.e. across slice boundaries). Then we disable the loop filter | ||
| 371 | * during normal MB decoding and execute it serially at the end. | ||
| 372 | */ | ||
| 373 | int postpone_filter; | ||
| 374 | |||
| 375 | /* | ||
| 376 | * Set to 1 when the current picture is IDR, 0 otherwise. | ||
| 377 | */ | ||
| 378 | int picture_idr; | ||
| 379 | |||
| 380 | /* | ||
| 381 | * Set to 1 when the current picture contains only I slices, 0 otherwise. | ||
| 382 | */ | ||
| 383 | int picture_intra_only; | ||
| 384 | |||
| 385 | int crop_left; | ||
| 386 | int crop_right; | ||
| 387 | int crop_top; | ||
| 388 | int crop_bottom; | ||
| 389 | |||
| 390 | int8_t(*intra4x4_pred_mode); | ||
| 391 | H264PredContext hpc; | ||
| 392 | |||
| 393 | uint8_t (*non_zero_count)[48]; | ||
| 394 | |||
| 395 | #define LIST_NOT_USED -1 // FIXME rename? | ||
| 396 | |||
| 397 | /** | ||
| 398 | * block_offset[ 0..23] for frame macroblocks | ||
| 399 | * block_offset[24..47] for field macroblocks | ||
| 400 | */ | ||
| 401 | int block_offset[2 * (16 * 3)]; | ||
| 402 | |||
| 403 | uint32_t *mb2b_xy; // FIXME are these 4 a good idea? | ||
| 404 | uint32_t *mb2br_xy; | ||
| 405 | int b_stride; // FIXME use s->b4_stride | ||
| 406 | |||
| 407 | uint16_t *slice_table; ///< slice_table_base + 2*mb_stride + 1 | ||
| 408 | |||
| 409 | // interlacing specific flags | ||
| 410 | int mb_aff_frame; | ||
| 411 | int picture_structure; | ||
| 412 | int first_field; | ||
| 413 | |||
| 414 | uint8_t *list_counts; ///< Array of list_count per MB specifying the slice type | ||
| 415 | |||
| 416 | /* 0x100 -> non null luma_dc, 0x80/0x40 -> non null chroma_dc (cb/cr), 0x?0 -> chroma_cbp(0, 1, 2), 0x0? luma_cbp */ | ||
| 417 | uint16_t *cbp_table; | ||
| 418 | |||
| 419 | /* chroma_pred_mode for i4x4 or i16x16, else 0 */ | ||
| 420 | uint8_t *chroma_pred_mode_table; | ||
| 421 | uint8_t (*mvd_table[2])[2]; | ||
| 422 | uint8_t *direct_table; | ||
| 423 | |||
| 424 | uint8_t scan_padding[16]; | ||
| 425 | uint8_t zigzag_scan[16]; | ||
| 426 | uint8_t zigzag_scan8x8[64]; | ||
| 427 | uint8_t zigzag_scan8x8_cavlc[64]; | ||
| 428 | uint8_t field_scan[16]; | ||
| 429 | uint8_t field_scan8x8[64]; | ||
| 430 | uint8_t field_scan8x8_cavlc[64]; | ||
| 431 | uint8_t zigzag_scan_q0[16]; | ||
| 432 | uint8_t zigzag_scan8x8_q0[64]; | ||
| 433 | uint8_t zigzag_scan8x8_cavlc_q0[64]; | ||
| 434 | uint8_t field_scan_q0[16]; | ||
| 435 | uint8_t field_scan8x8_q0[64]; | ||
| 436 | uint8_t field_scan8x8_cavlc_q0[64]; | ||
| 437 | |||
| 438 | int mb_y; | ||
| 439 | int mb_height, mb_width; | ||
| 440 | int mb_stride; | ||
| 441 | int mb_num; | ||
| 442 | |||
| 443 | // ============================================================= | ||
| 444 | // Things below are not used in the MB or more inner code | ||
| 445 | |||
| 446 | int nal_ref_idc; | ||
| 447 | int nal_unit_type; | ||
| 448 | |||
| 449 | int has_slice; ///< slice NAL is found in the packet, set by decode_nal_units, its state does not need to be preserved outside h264_decode_frame() | ||
| 450 | |||
| 451 | /** | ||
| 452 | * Used to parse AVC variant of H.264 | ||
| 453 | */ | ||
| 454 | int is_avc; ///< this flag is != 0 if codec is avc1 | ||
| 455 | int nal_length_size; ///< Number of bytes used for nal length (1, 2 or 4) | ||
| 456 | |||
| 457 | int bit_depth_luma; ///< luma bit depth from sps to detect changes | ||
| 458 | int chroma_format_idc; ///< chroma format from sps to detect changes | ||
| 459 | |||
| 460 | H264ParamSets ps; | ||
| 461 | |||
| 462 | uint16_t *slice_table_base; | ||
| 463 | |||
| 464 | H264POCContext poc; | ||
| 465 | |||
| 466 | H264Ref default_ref[2]; | ||
| 467 | H264Picture *short_ref[32]; | ||
| 468 | H264Picture *long_ref[32]; | ||
| 469 | H264Picture *delayed_pic[H264_MAX_DPB_FRAMES + 2]; // FIXME size? | ||
| 470 | int last_pocs[H264_MAX_DPB_FRAMES]; | ||
| 471 | H264Picture *next_output_pic; | ||
| 472 | int next_outputed_poc; | ||
| 473 | int poc_offset; ///< PicOrderCnt_offset from SMPTE RDD-2006 | ||
| 474 | |||
| 475 | /** | ||
| 476 | * memory management control operations buffer. | ||
| 477 | */ | ||
| 478 | MMCO mmco[H264_MAX_MMCO_COUNT]; | ||
| 479 | int nb_mmco; | ||
| 480 | int mmco_reset; | ||
| 481 | int explicit_ref_marking; | ||
| 482 | |||
| 483 | int long_ref_count; ///< number of actual long term references | ||
| 484 | int short_ref_count; ///< number of actual short term references | ||
| 485 | |||
| 486 | /** | ||
| 487 | * @name Members for slice based multithreading | ||
| 488 | * @{ | ||
| 489 | */ | ||
| 490 | /** | ||
| 491 | * current slice number, used to initialize slice_num of each thread/context | ||
| 492 | */ | ||
| 493 | int current_slice; | ||
| 494 | |||
| 495 | /** @} */ | ||
| 496 | |||
| 497 | /** | ||
| 498 | * Complement sei_pic_struct | ||
| 499 | * SEI_PIC_STRUCT_TOP_BOTTOM and SEI_PIC_STRUCT_BOTTOM_TOP indicate interlaced frames. | ||
| 500 | * However, soft telecined frames may have these values. | ||
| 501 | * This is used in an attempt to flag soft telecine progressive. | ||
| 502 | */ | ||
| 503 | int prev_interlaced_frame; | ||
| 504 | |||
| 505 | /** | ||
| 506 | * Are the SEI recovery points looking valid. | ||
| 507 | */ | ||
| 508 | int valid_recovery_point; | ||
| 509 | |||
| 510 | /** | ||
| 511 | * recovery_frame is the frame_num at which the next frame should | ||
| 512 | * be fully constructed. | ||
| 513 | * | ||
| 514 | * Set to -1 when not expecting a recovery point. | ||
| 515 | */ | ||
| 516 | int recovery_frame; | ||
| 517 | |||
| 518 | /** | ||
| 519 | * We have seen an IDR, so all the following frames in coded order are correctly | ||
| 520 | * decodable. | ||
| 521 | */ | ||
| 522 | #define FRAME_RECOVERED_IDR (1 << 0) | ||
| 523 | /** | ||
| 524 | * Sufficient number of frames have been decoded since a SEI recovery point, | ||
| 525 | * so all the following frames in presentation order are correct. | ||
| 526 | */ | ||
| 527 | #define FRAME_RECOVERED_SEI (1 << 1) | ||
| 528 | /** | ||
| 529 | * Recovery point detected by heuristic | ||
| 530 | */ | ||
| 531 | #define FRAME_RECOVERED_HEURISTIC (1 << 2) | ||
| 532 | |||
| 533 | /** | ||
| 534 | * Initial frame has been completely recovered. | ||
| 535 | * | ||
| 536 | * Once this is set, all following decoded as well as displayed frames will be marked as recovered | ||
| 537 | * If a frame is marked as recovered frame_recovered will be set once this frame is output and thus | ||
| 538 | * all subsequently output fraames are also marked as recovered | ||
| 539 | * | ||
| 540 | * In effect, if you want all subsequent DECODED frames marked as recovered, set frame_recovered | ||
| 541 | * If you want all subsequent DISPLAYED frames marked as recovered, set the frame->recovered | ||
| 542 | */ | ||
| 543 | int frame_recovered; | ||
| 544 | |||
| 545 | int has_recovery_point; | ||
| 546 | |||
| 547 | int missing_fields; | ||
| 548 | |||
| 549 | /* for frame threading, this is set to 1 | ||
| 550 | * after finish_setup() has been called, so we cannot modify | ||
| 551 | * some context properties (which are supposed to stay constant between | ||
| 552 | * slices) anymore */ | ||
| 553 | int setup_finished; | ||
| 554 | |||
| 555 | int cur_chroma_format_idc; | ||
| 556 | int cur_bit_depth_luma; | ||
| 557 | int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low | ||
| 558 | |||
| 559 | /* original AVCodecContext dimensions, used to handle container | ||
| 560 | * cropping */ | ||
| 561 | int width_from_caller; | ||
| 562 | int height_from_caller; | ||
| 563 | |||
| 564 | int enable_er; | ||
| 565 | ERContext er; | ||
| 566 | int16_t *dc_val_base; | ||
| 567 | |||
| 568 | H264SEIContext sei; | ||
| 569 | |||
| 570 | struct AVRefStructPool *qscale_table_pool; | ||
| 571 | struct AVRefStructPool *mb_type_pool; | ||
| 572 | struct AVRefStructPool *motion_val_pool; | ||
| 573 | struct AVRefStructPool *ref_index_pool; | ||
| 574 | struct AVRefStructPool *decode_error_flags_pool; | ||
| 575 | int ref2frm[MAX_SLICES][2][64]; ///< reference to frame number lists, used in the loop filter, the first 2 are for -2,-1 | ||
| 576 | |||
| 577 | int non_gray; ///< Did we encounter a intra frame after a gray gap frame | ||
| 578 | int noref_gray; | ||
| 579 | int skip_gray; | ||
| 580 | } H264Context; | ||
| 581 | |||
| 582 | extern const uint16_t ff_h264_mb_sizes[4]; | ||
| 583 | |||
| 584 | /** | ||
| 585 | * Reconstruct bitstream slice_type. | ||
| 586 | */ | ||
| 587 | int ff_h264_get_slice_type(const H264SliceContext *sl); | ||
| 588 | |||
| 589 | /** | ||
| 590 | * Allocate tables. | ||
| 591 | * needs width/height | ||
| 592 | */ | ||
| 593 | int ff_h264_alloc_tables(H264Context *h); | ||
| 594 | |||
| 595 | int ff_h264_decode_ref_pic_list_reordering(H264SliceContext *sl, void *logctx); | ||
| 596 | int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl); | ||
| 597 | void ff_h264_remove_all_refs(H264Context *h); | ||
| 598 | |||
| 599 | /** | ||
| 600 | * Execute the reference picture marking (memory management control operations). | ||
| 601 | */ | ||
| 602 | int ff_h264_execute_ref_pic_marking(H264Context *h); | ||
| 603 | |||
| 604 | int ff_h264_decode_ref_pic_marking(H264SliceContext *sl, GetBitContext *gb, | ||
| 605 | const H2645NAL *nal, void *logctx); | ||
| 606 | |||
| 607 | void ff_h264_hl_decode_mb(const H264Context *h, H264SliceContext *sl); | ||
| 608 | void ff_h264_decode_init_vlc(void); | ||
| 609 | |||
| 610 | /** | ||
| 611 | * Decode a macroblock | ||
| 612 | * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR on error | ||
| 613 | */ | ||
| 614 | int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl); | ||
| 615 | |||
| 616 | /** | ||
| 617 | * Decode a CABAC coded macroblock | ||
| 618 | * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR on error | ||
| 619 | */ | ||
| 620 | int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl); | ||
| 621 | |||
| 622 | void ff_h264_init_cabac_states(const H264Context *h, H264SliceContext *sl); | ||
| 623 | |||
| 624 | void ff_h264_direct_dist_scale_factor(const H264Context *const h, H264SliceContext *sl); | ||
| 625 | void ff_h264_direct_ref_list_init(const H264Context *const h, H264SliceContext *sl); | ||
| 626 | void ff_h264_pred_direct_motion(const H264Context *const h, H264SliceContext *sl, | ||
| 627 | int *mb_type); | ||
| 628 | |||
| 629 | void ff_h264_filter_mb_fast(const H264Context *h, H264SliceContext *sl, int mb_x, int mb_y, | ||
| 630 | uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, | ||
| 631 | unsigned int linesize, unsigned int uvlinesize); | ||
| 632 | void ff_h264_filter_mb(const H264Context *h, H264SliceContext *sl, int mb_x, int mb_y, | ||
| 633 | uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, | ||
| 634 | unsigned int linesize, unsigned int uvlinesize); | ||
| 635 | |||
| 636 | /* | ||
| 637 | * o-o o-o | ||
| 638 | * / / / | ||
| 639 | * o-o o-o | ||
| 640 | * ,---' | ||
| 641 | * o-o o-o | ||
| 642 | * / / / | ||
| 643 | * o-o o-o | ||
| 644 | */ | ||
| 645 | |||
| 646 | /* Scan8 organization: | ||
| 647 | * 0 1 2 3 4 5 6 7 | ||
| 648 | * 0 DY y y y y y | ||
| 649 | * 1 y Y Y Y Y | ||
| 650 | * 2 y Y Y Y Y | ||
| 651 | * 3 y Y Y Y Y | ||
| 652 | * 4 y Y Y Y Y | ||
| 653 | * 5 DU u u u u u | ||
| 654 | * 6 u U U U U | ||
| 655 | * 7 u U U U U | ||
| 656 | * 8 u U U U U | ||
| 657 | * 9 u U U U U | ||
| 658 | * 10 DV v v v v v | ||
| 659 | * 11 v V V V V | ||
| 660 | * 12 v V V V V | ||
| 661 | * 13 v V V V V | ||
| 662 | * 14 v V V V V | ||
| 663 | * DY/DU/DV are for luma/chroma DC. | ||
| 664 | */ | ||
| 665 | |||
| 666 | #define LUMA_DC_BLOCK_INDEX 48 | ||
| 667 | #define CHROMA_DC_BLOCK_INDEX 49 | ||
| 668 | |||
| 669 | /** | ||
| 670 | * Get the chroma qp. | ||
| 671 | */ | ||
| 672 | 64123290 | static av_always_inline int get_chroma_qp(const PPS *pps, int t, int qscale) | |
| 673 | { | ||
| 674 | 64123290 | return pps->chroma_qp_table[t][qscale]; | |
| 675 | } | ||
| 676 | |||
| 677 | int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup); | ||
| 678 | |||
| 679 | int ff_h264_ref_picture(H264Picture *dst, const H264Picture *src); | ||
| 680 | int ff_h264_replace_picture(H264Picture *dst, const H264Picture *src); | ||
| 681 | void ff_h264_unref_picture(H264Picture *pic); | ||
| 682 | |||
| 683 | void ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl); | ||
| 684 | |||
| 685 | void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height); | ||
| 686 | |||
| 687 | /** | ||
| 688 | * Submit a slice for decoding. | ||
| 689 | * | ||
| 690 | * Parse the slice header, starting a new field/frame if necessary. If any | ||
| 691 | * slices are queued for the previous field, they are decoded. | ||
| 692 | */ | ||
| 693 | int ff_h264_queue_decode_slice(H264Context *h, const H2645NAL *nal); | ||
| 694 | int ff_h264_execute_decode_slices(H264Context *h); | ||
| 695 | int ff_h264_update_thread_context(AVCodecContext *dst, | ||
| 696 | const AVCodecContext *src); | ||
| 697 | int ff_h264_update_thread_context_for_user(AVCodecContext *dst, | ||
| 698 | const AVCodecContext *src); | ||
| 699 | |||
| 700 | void ff_h264_flush_change(H264Context *h); | ||
| 701 | |||
| 702 | void ff_h264_free_tables(H264Context *h); | ||
| 703 | |||
| 704 | void ff_h264_set_erpic(ERPicture *dst, const H264Picture *src); | ||
| 705 | |||
| 706 | #endif /* AVCODEC_H264DEC_H */ | ||
| 707 |