X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fh264.h;h=210b2b2eda25a7bf2922118ebdab22495236675c;hb=6c41eda18ec0ef48763e1672266f7563f05775a5;hp=efe355513211c0310757931ec701336d2fd94a84;hpb=2c1d0f871f6a3ee851f7094cc9946652ba1788ab;p=ffmpeg diff --git a/libavcodec/h264.h b/libavcodec/h264.h index efe35551321..210b2b2eda2 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -31,9 +31,9 @@ #include "libavutil/buffer.h" #include "libavutil/intreadwrite.h" #include "libavutil/thread.h" + #include "cabac.h" #include "error_resilience.h" -#include "get_bits.h" #include "h264_parse.h" #include "h264_sei.h" #include "h2645_parse.h" @@ -234,8 +234,7 @@ typedef struct H264ParamSets { AVBufferRef *sps_ref; /* currently active parameters sets */ const PPS *pps; - // FIXME this should properly be const - SPS *sps; + const SPS *sps; } H264ParamSets; /** @@ -370,11 +369,13 @@ typedef struct H264SliceContext { int mb_xy; int resync_mb_x; int resync_mb_y; + unsigned int first_mb_addr; // index of the first MB of the next slice int next_slice_idx; int mb_skip_run; int is_complex; + int picture_structure; int mb_field_decoding_flag; int mb_mbaff; ///< mb_aff_frame && mb_field_decoding_flag @@ -406,6 +407,13 @@ typedef struct H264SliceContext { H264Ref ref_list[2][48]; /**< 0..15: frame refs, 16..47: mbaff field refs. * Reordered version of default_ref_list * according to picture reordering in slice header */ + struct { + uint8_t op; + uint32_t val; + } ref_modifications[2][32]; + int nb_ref_modifications[2]; + + unsigned int pps_id; const uint8_t *intra_pcm_ptr; int16_t *dc_val_base; @@ -448,6 +456,17 @@ typedef struct H264SliceContext { CABACContext cabac; uint8_t cabac_state[1024]; int cabac_init_idc; + + MMCO mmco[MAX_MMCO_COUNT]; + int nb_mmco; + int explicit_ref_marking; + + int frame_num; + int poc_lsb; + int delta_poc_bottom; + int delta_poc[2]; + int curr_pic_num; + int max_pic_num; } H264SliceContext; /** @@ -460,7 +479,6 @@ typedef struct H264Context { H264DSPContext h264dsp; H264ChromaContext h264chroma; H264QpelContext h264qpel; - GetBitContext gb; H264Picture DPB[H264_MAX_PICTURE_COUNT]; H264Picture *cur_pic_ptr; @@ -516,11 +534,6 @@ typedef struct H264Context { uint32_t *mb2br_xy; int b_stride; // FIXME use s->b4_stride - - unsigned current_sps_id; ///< id of the current SPS - - int au_pps_id; ///< pps_id of current access unit - uint16_t *slice_table; ///< slice_table_base + 2*mb_stride + 1 // interlacing specific flags @@ -577,16 +590,6 @@ typedef struct H264Context { H264POCContext poc; - /** - * frame_num for frames or 2 * frame_num + 1 for field pics. - */ - int curr_pic_num; - - /** - * max_frame_num or 2 * max_frame_num for field pics. - */ - int max_pic_num; - H264Ref default_ref[2]; H264Picture *short_ref[32]; H264Picture *long_ref[32]; @@ -599,8 +602,9 @@ typedef struct H264Context { * memory management control operations buffer. */ MMCO mmco[MAX_MMCO_COUNT]; - int mmco_index; + int nb_mmco; int mmco_reset; + int explicit_ref_marking; int long_ref_count; ///< number of actual long term references int short_ref_count; ///< number of actual short term references @@ -668,7 +672,7 @@ typedef struct H264Context { int missing_fields; -/* for frame threading, this is set to 1 + /* for frame threading, this is set to 1 * after finish_setup() has been called, so we cannot modify * some context properties (which are supposed to stay constant between * slices) anymore */ @@ -720,19 +724,17 @@ int ff_h264_get_slice_type(const H264SliceContext *sl); */ int ff_h264_alloc_tables(H264Context *h); -int ff_h264_decode_ref_pic_list_reordering(H264Context *h, H264SliceContext *sl); -void ff_h264_fill_mbaff_ref_list(H264SliceContext *sl); +int ff_h264_decode_ref_pic_list_reordering(const H264Context *h, H264SliceContext *sl); +int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl); void ff_h264_remove_all_refs(H264Context *h); /** * Execute the reference picture marking (memory management control operations). */ -int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count); - -int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, - int first_slice); +int ff_h264_execute_ref_pic_marking(H264Context *h); -int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice); +int ff_h264_decode_ref_pic_marking(const H264Context *h, H264SliceContext *sl, + GetBitContext *gb); void ff_h264_hl_decode_mb(const H264Context *h, H264SliceContext *sl); int ff_h264_decode_init(AVCodecContext *avctx); @@ -835,9 +837,9 @@ static av_always_inline uint16_t pack8to16(unsigned a, unsigned b) /** * Get the chroma qp. */ -static av_always_inline int get_chroma_qp(const H264Context *h, int t, int qscale) +static av_always_inline int get_chroma_qp(const PPS *pps, int t, int qscale) { - return h->ps.pps->chroma_qp_table[t][qscale]; + return pps->chroma_qp_table[t][qscale]; } /** @@ -989,7 +991,8 @@ int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl); void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height); -int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl); +int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, + const H2645NAL *nal); #define SLICE_SINGLETHREAD 1 #define SLICE_SKIPED 2