28 #ifndef AVCODEC_H264DEC_H 29 #define AVCODEC_H264DEC_H 32 #include "libavutil/intreadwrite.h" 33 #include "libavutil/thread.h" 36 #include "error_resilience.h" 40 #include "h2645_parse.h" 41 #include "h264chroma.h" 46 #include "mpegutils.h" 52 #define H264_MAX_PICTURE_COUNT 36 54 #define MAX_MMCO_COUNT 66 56 #define MAX_DELAYED_PIC_COUNT 16 60 #define ALLOW_INTERLACE 70 #ifdef ALLOW_INTERLACE 71 #define MB_MBAFF(h) (h)->mb_mbaff 72 #define MB_FIELD(sl) (sl)->mb_field_decoding_flag 73 #define FRAME_MBAFF(h) (h)->mb_aff_frame 74 #define FIELD_PICTURE(h) ((h)->picture_structure != PICT_FRAME) 81 #define MB_FIELD(sl) 0 82 #define FRAME_MBAFF(h) 0 83 #define FIELD_PICTURE(h) 0 85 #define IS_INTERLACED(mb_type) 0 91 #define FIELD_OR_MBAFF_PICTURE(h) (FRAME_MBAFF(h) || FIELD_PICTURE(h)) 94 #define CABAC(h) (h)->ps.pps->cabac 97 #define CHROMA(h) ((h)->ps.sps->chroma_format_idc) 98 #define CHROMA422(h) ((h)->ps.sps->chroma_format_idc == 2) 99 #define CHROMA444(h) ((h)->ps.sps->chroma_format_idc == 3) 101 #define MB_TYPE_REF0 MB_TYPE_ACPRED // dirty but it fits in 16 bit 102 #define MB_TYPE_8x8DCT 0x01000000 103 #define IS_REF0(a) ((a) & MB_TYPE_REF0) 104 #define IS_8x8DCT(a) ((a) & MB_TYPE_8x8DCT) 133 int8_t *qscale_table;
136 int16_t (*motion_val[2])[2];
145 int8_t *ref_index[2];
155 int ref_poc[2][2][32];
163 int sei_recovery_frame_cnt;
185 int slice_type_fixed;
190 int last_qscale_diff;
194 int slice_alpha_c0_offset;
195 int slice_beta_offset;
202 int chroma_pred_mode;
203 int intra16x16_pred_mode;
205 int8_t intra4x4_pred_mode_cache[5 * 8];
206 int8_t(*intra4x4_pred_mode);
211 int left_mb_xy[LEFT_MBS];
216 int left_type[LEFT_MBS];
218 const uint8_t *left_block;
219 int topleft_partition;
221 unsigned int topleft_samples_available;
222 unsigned int top_samples_available;
223 unsigned int topright_samples_available;
224 unsigned int left_samples_available;
226 ptrdiff_t linesize, uvlinesize;
228 ptrdiff_t mb_uvlinesize;
234 unsigned int first_mb_addr;
240 int picture_structure;
241 int mb_field_decoding_flag;
244 int redundant_pic_count;
251 int direct_spatial_mv_pred;
259 int dist_scale_factor[32];
260 int dist_scale_factor_field[2][32];
261 int map_col_to_list0[2][16 + 32];
262 int map_col_to_list0_field[2][2][16 + 32];
267 unsigned int ref_count[2];
268 unsigned int list_count;
275 } ref_modifications[2][32];
276 int nb_ref_modifications[2];
280 const uint8_t *intra_pcm_ptr;
281 int16_t *dc_val_base;
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];
302 uint8_t direct_cache[5 * 8];
311 int16_t mb_padding[256 * 2];
313 uint8_t (*mvd_table[2])[2];
319 uint8_t cabac_state[1024];
322 MMCO mmco[MAX_MMCO_COUNT];
324 int explicit_ref_marking;
328 int delta_poc_bottom;
352 int nb_slice_ctx_queued;
360 int chroma_x_shift, chroma_y_shift;
363 int coded_picture_number;
365 int context_initialized;
385 int8_t(*intra4x4_pred_mode);
388 uint8_t (*non_zero_count)[48];
390 #define LIST_NOT_USED -1 // FIXME rename? 391 #define PART_NOT_AVAILABLE -2 397 int block_offset[2 * (16 * 3)];
407 int picture_structure;
416 uint8_t *chroma_pred_mode_table;
417 uint8_t (*mvd_table[2])[2];
418 uint8_t *direct_table;
420 uint8_t scan_padding[16];
421 uint8_t zigzag_scan[16];
422 uint8_t zigzag_scan8x8[64];
423 uint8_t zigzag_scan8x8_cavlc[64];
424 uint8_t field_scan[16];
425 uint8_t field_scan8x8[64];
426 uint8_t field_scan8x8_cavlc[64];
427 uint8_t zigzag_scan_q0[16];
428 uint8_t zigzag_scan8x8_q0[64];
429 uint8_t zigzag_scan8x8_cavlc_q0[64];
430 uint8_t field_scan_q0[16];
431 uint8_t field_scan8x8_q0[64];
432 uint8_t field_scan8x8_cavlc_q0[64];
435 int mb_height, mb_width;
458 uint16_t *slice_table_base;
465 H264Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2];
466 int last_pocs[MAX_DELAYED_PIC_COUNT];
468 int next_outputed_poc;
476 int explicit_ref_marking;
517 #define FRAME_RECOVERED_IDR (1 << 0) 522 #define FRAME_RECOVERED_SEI (1 << 1) 526 int has_recovery_point;
536 int cur_chroma_format_idc;
537 int cur_bit_depth_luma;
542 int width_from_caller;
543 int height_from_caller;
556 extern const uint16_t ff_h264_mb_sizes[4];
569 int ff_h264_decode_ref_pic_list_reordering(
H264SliceContext *sl,
void *logctx);
582 void ff_h264_decode_init_vlc(
void);
604 uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr,
605 unsigned int linesize,
unsigned int uvlinesize);
607 uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr,
608 unsigned int linesize,
unsigned int uvlinesize);
640 #define LUMA_DC_BLOCK_INDEX 48 641 #define CHROMA_DC_BLOCK_INDEX 49 644 static const uint8_t scan8[16 * 3 + 3] = {
645 4 + 1 * 8, 5 + 1 * 8, 4 + 2 * 8, 5 + 2 * 8,
646 6 + 1 * 8, 7 + 1 * 8, 6 + 2 * 8, 7 + 2 * 8,
647 4 + 3 * 8, 5 + 3 * 8, 4 + 4 * 8, 5 + 4 * 8,
648 6 + 3 * 8, 7 + 3 * 8, 6 + 4 * 8, 7 + 4 * 8,
649 4 + 6 * 8, 5 + 6 * 8, 4 + 7 * 8, 5 + 7 * 8,
650 6 + 6 * 8, 7 + 6 * 8, 6 + 7 * 8, 7 + 7 * 8,
651 4 + 8 * 8, 5 + 8 * 8, 4 + 9 * 8, 5 + 9 * 8,
652 6 + 8 * 8, 7 + 8 * 8, 6 + 9 * 8, 7 + 9 * 8,
653 4 + 11 * 8, 5 + 11 * 8, 4 + 12 * 8, 5 + 12 * 8,
654 6 + 11 * 8, 7 + 11 * 8, 6 + 12 * 8, 7 + 12 * 8,
655 4 + 13 * 8, 5 + 13 * 8, 4 + 14 * 8, 5 + 14 * 8,
656 6 + 13 * 8, 7 + 13 * 8, 6 + 14 * 8, 7 + 14 * 8,
657 0 + 0 * 8, 0 + 5 * 8, 0 + 10 * 8
660 static av_always_inline uint32_t pack16to32(
unsigned a,
unsigned b)
663 return (b & 0xFFFF) + (a << 16);
665 return (a & 0xFFFF) + (b << 16);
669 static av_always_inline uint16_t pack8to16(
unsigned a,
unsigned b)
672 return (b & 0xFF) + (a << 8);
674 return (a & 0xFF) + (b << 8);
681 static av_always_inline
int get_chroma_qp(
const PPS *pps,
int t,
int qscale)
689 static av_always_inline
int pred_intra_mode(
const H264Context *h,
692 const int index8 = scan8[n];
693 const int left = sl->intra4x4_pred_mode_cache[index8 - 1];
694 const int top = sl->intra4x4_pred_mode_cache[index8 - 8];
695 const int min = FFMIN(left, top);
697 ff_tlog(h->avctx,
"mode:%d %d min:%d\n", left, top, min);
705 static av_always_inline
void write_back_intra_pred_mode(
const H264Context *h,
708 int8_t *i4x4 = sl->intra4x4_pred_mode + h->mb2br_xy[sl->mb_xy];
709 int8_t *i4x4_cache = sl->intra4x4_pred_mode_cache;
711 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
712 i4x4[4] = i4x4_cache[7 + 8 * 3];
713 i4x4[5] = i4x4_cache[7 + 8 * 2];
714 i4x4[6] = i4x4_cache[7 + 8 * 1];
717 static av_always_inline
void write_back_non_zero_count(
const H264Context *h,
720 const int mb_xy = sl->mb_xy;
721 uint8_t *nnz = h->non_zero_count[mb_xy];
722 uint8_t *nnz_cache = sl->non_zero_count_cache;
724 AV_COPY32(&nnz[ 0], &nnz_cache[4 + 8 * 1]);
725 AV_COPY32(&nnz[ 4], &nnz_cache[4 + 8 * 2]);
726 AV_COPY32(&nnz[ 8], &nnz_cache[4 + 8 * 3]);
727 AV_COPY32(&nnz[12], &nnz_cache[4 + 8 * 4]);
728 AV_COPY32(&nnz[16], &nnz_cache[4 + 8 * 6]);
729 AV_COPY32(&nnz[20], &nnz_cache[4 + 8 * 7]);
730 AV_COPY32(&nnz[32], &nnz_cache[4 + 8 * 11]);
731 AV_COPY32(&nnz[36], &nnz_cache[4 + 8 * 12]);
733 if (!h->chroma_y_shift) {
734 AV_COPY32(&nnz[24], &nnz_cache[4 + 8 * 8]);
735 AV_COPY32(&nnz[28], &nnz_cache[4 + 8 * 9]);
736 AV_COPY32(&nnz[40], &nnz_cache[4 + 8 * 13]);
737 AV_COPY32(&nnz[44], &nnz_cache[4 + 8 * 14]);
741 static av_always_inline
void write_back_motion_list(
const H264Context *h,
745 int mb_type,
int list)
747 int16_t(*mv_dst)[2] = &h->cur_pic.motion_val[list][b_xy];
748 int16_t(*mv_src)[2] = &sl->mv_cache[list][scan8[0]];
749 AV_COPY128(mv_dst + 0 * b_stride, mv_src + 8 * 0);
750 AV_COPY128(mv_dst + 1 * b_stride, mv_src + 8 * 1);
751 AV_COPY128(mv_dst + 2 * b_stride, mv_src + 8 * 2);
752 AV_COPY128(mv_dst + 3 * b_stride, mv_src + 8 * 3);
754 uint8_t (*mvd_dst)[2] = &sl->mvd_table[list][FMO ? 8 * sl->mb_xy
755 : h->mb2br_xy[sl->mb_xy]];
756 uint8_t(*mvd_src)[2] = &sl->mvd_cache[list][scan8[0]];
757 if (IS_SKIP(mb_type)) {
760 AV_COPY64(mvd_dst, mvd_src + 8 * 3);
761 AV_COPY16(mvd_dst + 3 + 3, mvd_src + 3 + 8 * 0);
762 AV_COPY16(mvd_dst + 3 + 2, mvd_src + 3 + 8 * 1);
763 AV_COPY16(mvd_dst + 3 + 1, mvd_src + 3 + 8 * 2);
768 int8_t *ref_index = &h->cur_pic.ref_index[list][b8_xy];
769 int8_t *ref_cache = sl->ref_cache[list];
770 ref_index[0 + 0 * 2] = ref_cache[scan8[0]];
771 ref_index[1 + 0 * 2] = ref_cache[scan8[4]];
772 ref_index[0 + 1 * 2] = ref_cache[scan8[8]];
773 ref_index[1 + 1 * 2] = ref_cache[scan8[12]];
777 static av_always_inline
void write_back_motion(
const H264Context *h,
781 const int b_stride = h->b_stride;
782 const int b_xy = 4 * sl->mb_x + 4 * sl->mb_y * h->b_stride;
783 const int b8_xy = 4 * sl->mb_xy;
785 if (USES_LIST(mb_type, 0)) {
786 write_back_motion_list(h, sl, b_stride, b_xy, b8_xy, mb_type, 0);
788 fill_rectangle(&h->cur_pic.ref_index[0][b8_xy],
789 2, 2, 2, (uint8_t)LIST_NOT_USED, 1);
791 if (USES_LIST(mb_type, 1))
792 write_back_motion_list(h, sl, b_stride, b_xy, b8_xy, mb_type, 1);
795 if (IS_8X8(mb_type)) {
796 uint8_t *direct_table = &h->direct_table[4 * sl->mb_xy];
797 direct_table[1] = sl->sub_mb_type[1] >> 1;
798 direct_table[2] = sl->sub_mb_type[2] >> 1;
799 direct_table[3] = sl->sub_mb_type[3] >> 1;
806 if (h->ps.sps->direct_8x8_inference_flag)
807 return !(AV_RN64A(sl->sub_mb_type) &
808 ((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8) *
809 0x0001000100010001ULL));
811 return !(AV_RN64A(sl->sub_mb_type) &
812 ((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8 | MB_TYPE_DIRECT2) *
813 0x0001000100010001ULL));
816 static inline int find_start_code(
const uint8_t *buf,
int buf_size,
817 int buf_index,
int next_avc)
821 buf_index = avpriv_find_start_code(buf + buf_index, buf + next_avc + 1, &state) - buf - 1;
823 return FFMIN(buf_index, buf_size);
Definition: videodsp.h:41
Memory management control operation.
Definition: h264dec.h:122
int long_ref
1->long term reference 0->short term reference
Definition: h264dec.h:154
This structure describes decoded (raw) audio or video data.
Definition: frame.h:218
int neighbor_transform_size
number of neighbors (top and/or left) that used 8x8 dct
Definition: h264dec.h:249
int ff_h264_execute_ref_pic_marking(H264Context *h)
Execute the reference picture marking (memory management control operations).
Definition: h264_refs.c:608
Definition: error_resilience.h:53
int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
Decode a CABAC coded macroblock.
Definition: h264_cabac.c:1914
Definition: h264dec.h:177
Picture parameter set.
Definition: h264_ps.h:108
int ff_h264_alloc_tables(H264Context *h)
Allocate tables.
Definition: h264dec.c:180
int is_avc
Used to parse AVC variant of H.264.
Definition: h264dec.h:450
H264Context.
Definition: h264dec.h:337
Definition: h2645_parse.h:74
int ff_h264_execute_decode_slices(H264Context *h)
Call decode_slice() for each context.
Definition: h264_slice.c:2733
int short_pic_num
pic_num without wrapping (pic_num & max_pic_num)
Definition: h264dec.h:124
Definition: h264dec.h:166
int field_picture
whether or not picture was encoded in separate fields
Definition: h264dec.h:158
int poc
frame POC
Definition: h264dec.h:148
Definition: h264chroma.h:27
Context for storing H.264 prediction functions.
Definition: h264pred.h:92
int frame_recovered
Initial frame has been completely recovered.
Definition: h264dec.h:524
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:120
int has_slice
slice NAL is found in the packet, set by decode_nal_units, its state does not need to be preserved ou...
Definition: h264dec.h:445
int recovered
picture at IDR or recovery point + recovery count
Definition: h264dec.h:161
Definition: buffer_internal.h:76
Definition: h264qpel.h:27
H.264 parameter set handling.
int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl)
Init context Allocate buffers which are not shared amongst multiple threads.
Definition: h264dec.c:238
Definition: h264_parse.h:30
void * hwaccel_picture_private
hardware accelerator private data
Definition: h264dec.h:142
int deblocking_filter
disable_deblocking_filter_idc with 1 <-> 0
Definition: h264dec.h:193
int prev_interlaced_frame
Complement sei_pic_struct SEI_PIC_STRUCT_TOP_BOTTOM and SEI_PIC_STRUCT_BOTTOM_TOP indicate interlaced...
Definition: h264dec.h:498
int frame_num
frame_num (raw frame_num from slice header)
Definition: h264dec.h:149
MMCOOpcode
Memory management control operation opcode.
Definition: h264dec.h:109
int valid_recovery_point
Are the SEI recovery points looking valid.
Definition: h264dec.h:503
uint8_t * list_counts
Array of list_count per MB specifying the slice type.
Definition: h264dec.h:410
int ff_h264_get_slice_type(const H264SliceContext *sl)
Reconstruct bitstream slice_type.
Definition: h264_slice.c:2147
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
Definition: h264dec.h:184
int nal_length_size
Number of bytes used for nal length (1, 2 or 4)
Definition: h264dec.h:451
useful rectangle filling function
Context for storing H.264 DSP functions.
Definition: h264dsp.h:42
uint16_t * slice_table
slice_table_base + 2*mb_stride + 1
Definition: h264dec.h:403
Definition: h264_sei.h:155
CABACContext cabac
Cabac.
Definition: h264dec.h:318
struct H264Context H264Context
H264Context.
int long_ref_count
number of actual long term references
Definition: h264dec.h:478
int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl)
Decode a macroblock.
Definition: h264_cavlc.c:702
uint8_t chroma_qp_table[2][QP_MAX_NUM+1]
pre-scaled (with chroma_qp_index_offset) version of qp_table
Definition: h264_ps.h:126
int ff_h264_queue_decode_slice(H264Context *h, const H2645NAL *nal)
Submit a slice for decoding.
Definition: h264_slice.c:2022
int bit_depth_luma
luma bit depth from sps to detect changes
Definition: h264dec.h:453
int chroma_format_idc
chroma format from sps to detect changes
Definition: h264dec.h:454
int recovery_frame
recovery_frame is the frame_num at which the next frame should be fully constructed.
Definition: h264dec.h:511
main external API structure.
Definition: avcodec.h:1518
int qp_thresh
QP threshold to skip loopfilter.
Definition: h264dec.h:189
Definition: h2645_parse.h:31
Describe the class of an AVClass context structure.
Definition: log.h:67
int pixel_shift
0 for 8-bit H.264, 1 for high-bit-depth H.264
Definition: h264dec.h:356
int mmco_reset
MMCO_RESET set this 1.
Definition: h264dec.h:150
refcounted data buffer API
int mb_mbaff
mb_aff_frame && mb_field_decoding_flag
Definition: h264dec.h:242
ptrdiff_t mb_linesize
may be equal to s->linesize or s->linesize * 2, for mbaff
Definition: h264dec.h:227
Definition: h264_ps.h:137
H.264 / AVC / MPEG-4 prediction functions.
Definition: h264dec.h:128
int mbaff
1 -> MBAFF frame 0-> not MBAFF
Definition: h264dec.h:157
A reference to a data buffer.
Definition: buffer.h:81
struct MMCO MMCO
Memory management control operation.
int pic_id
pic_num (short -> no wrap version of pic_num, pic_num & max_pic_num; long -> long_pic_num) ...
Definition: h264dec.h:152
#define MAX_SLICES
The maximum number of slices supported by the decoder.
Definition: h264dec.h:68
Definition: get_bits.h:56
common internal api header.
Bi-dir predicted.
Definition: avutil.h:276
Definition: h264_parse.h:43
int long_arg
index, pic_num, or num long refs depending on opcode
Definition: h264dec.h:125
Core video DSP helper functions.
Decoded Picture Buffer (DPB).
Definition: vaapi_h264.c:82
int current_slice
current slice number, used to initialize slice_num of each thread/context
Definition: h264dec.h:488
H.264 decoder/parser shared code.
Definition: error_resilience.h:41
int short_ref_count
number of actual short term references
Definition: h264dec.h:479