📄 mpegvideo.h
字号:
/* * Generic DCT based hybrid video encoder * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifndef AVCODEC_MPEGVIDEO_H#define AVCODEC_MPEGVIDEO_H#define FRAME_SKIPED 100 // return value for header parsers if frame is not codedenum OutputFormat { FMT_MPEG1, FMT_H263, FMT_MJPEG, };#define MPEG_BUF_SIZE (16 * 1024)#define QMAT_SHIFT_MMX 16#define QMAT_SHIFT 22#define MAX_FCODE 7#define MAX_MV 2048#define REORDER_BUFFER_SIZE (FF_MAX_B_FRAMES+2)#define ME_MAP_SIZE 64#define ME_MAP_SHIFT 3#define ME_MAP_MV_BITS 11/* run length table */#define MAX_RUN 64#define MAX_LEVEL 64typedef struct Predictor{ double coeff; double count; double decay;} Predictor;typedef struct RateControlEntry{ int pict_type; float qscale; int mv_bits; int i_tex_bits; int p_tex_bits; int misc_bits; UINT64 expected_bits; int new_pict_type; float new_qscale; int mc_mb_var_sum; int mb_var_sum; int i_count; int f_code; int b_code;}RateControlEntry;typedef struct RateControlContext{ FILE *stats_file; int num_entries; /* number of RateControlEntries */ RateControlEntry *entry; int buffer_index; /* amount of bits in the video/audio buffer */ Predictor pred[5]; double short_term_qsum; /* sum of recent qscales */ double short_term_qcount; /* count of recent qscales */ double pass1_rc_eq_output_sum;/* sum of the output of the rc equation, this is used for normalization */ double pass1_wanted_bits; /* bits which should have been outputed by the pass1 code (including complexity init) */ double last_qscale; double last_qscale_for[5]; /* last qscale for a specific pict type, used for max_diff & ipb factor stuff */ int last_mc_mb_var_sum; int last_mb_var_sum; UINT64 i_cplx_sum[5]; UINT64 p_cplx_sum[5]; UINT64 mv_bits_sum[5]; UINT64 qscale_sum[5]; int frame_count[5]; int last_non_b_pict_type;}RateControlContext;typedef struct ReorderBuffer{ UINT8 *picture[3]; int pict_type; int qscale; int force_type; int picture_number; int picture_in_gop_number;} ReorderBuffer;typedef struct ScanTable{ const UINT8 *scantable; UINT8 permutated[64]; UINT8 raster_end[64];#ifdef ARCH_POWERPC /* Used by dct_quantise_alitvec to find last-non-zero */ UINT8 __align8 inverse[64];#endif} ScanTable;typedef struct ParseContext{ UINT8 *buffer; int index; int last_index; int buffer_size; int state; int frame_start_found;} ParseContext;typedef struct MpegEncContext { struct AVCodecContext *avctx; /* the following parameters must be initialized before encoding */ int width, height; /* picture size. must be a multiple of 16 */ int gop_size; int frame_rate; /* number of frames per second */ int intra_only; /* if true, only intra pictures are generated */ int bit_rate; /* wanted bit rate */ int bit_rate_tolerance; /* amount of +- bits (>0)*/ enum OutputFormat out_format; /* output format */ int h263_pred; /* use mpeg4/h263 ac/dc predictions *//* the following codec id fields are deprecated in favor of codec_id */ int h263_plus; /* h263 plus headers */ int h263_rv10; /* use RV10 variation for H263 */ int h263_msmpeg4; /* generate MSMPEG4 compatible stream (deprecated, use msmpeg4_version instead)*/ int h263_intel; /* use I263 intel h263 header */ int codec_id; /* see CODEC_ID_xxx */ int fixed_qscale; /* fixed qscale if non zero */ float qcompress; /* amount of qscale change between easy & hard scenes (0.0-1.0) */ float qblur; /* amount of qscale smoothing over time (0.0-1.0) */ int qmin; /* min qscale */ int qmax; /* max qscale */ int max_qdiff; /* max qscale difference between frames */ int encoding; /* true if we are encoding (vs decoding) */ int flags; /* AVCodecContext.flags (HQ, MV4, ...) */ int force_input_type;/* 0= no force, otherwise I_TYPE, P_TYPE, ... */ int max_b_frames; /* max number of b-frames for encoding */ int b_frame_strategy; int luma_elim_threshold; int chroma_elim_threshold; int strict_std_compliance; /* strictly follow the std (MPEG4, ...) */ int workaround_bugs; /* workaround bugs in encoders which cannot be detected automatically */ /* the following fields are managed internally by the encoder */ /* bit output */ PutBitContext pb; /* sequence parameters */ int context_initialized; int input_picture_number; int input_picture_in_gop_number; /* 0-> first pic in gop, ... */ int picture_number; int fake_picture_number; /* picture number at the bitstream frame rate */ int gop_picture_number; /* index of the first picture of a GOP based on fake_pic_num & mpeg1 specific */ int picture_in_gop_number; /* 0-> first pic in gop, ... */ int b_frames_since_non_b; /* used for encoding, relative to not yet reordered input */ int mb_width, mb_height; /* number of MBs horizontally & vertically */ int h_edge_pos, v_edge_pos;/* horizontal / vertical position of the right/bottom edge (pixel replicateion)*/ int mb_num; /* number of MBs of a picture */ int linesize; /* line size, in bytes, may be different from width */ int uvlinesize; /* line size, for chroma in bytes, may be different from width */ UINT8 *new_picture[3]; /* picture to be compressed */ UINT8 *picture_buffer[REORDER_BUFFER_SIZE][3]; /* internal buffers used for reordering of input pictures */ int picture_buffer_index; ReorderBuffer coded_order[REORDER_BUFFER_SIZE]; UINT8 *last_picture[3]; /* previous picture */ UINT8 *last_picture_base[3]; /* real start of the picture */ UINT8 *next_picture[3]; /* previous picture (for bidir pred) */ UINT8 *next_picture_base[3]; /* real start of the picture */ UINT8 *aux_picture[3]; /* aux picture (for B frames only) */ UINT8 *aux_picture_base[3]; /* real start of the picture */ UINT8 *current_picture[3]; /* buffer to store the decompressed current picture */ void *last_dr_opaque; void *next_dr_opaque; int ip_buffer_count; /* number of buffers, currently only >2 if dr1 is used */ int num_available_buffers; /* is 0 at the start & after seeking, after the first I frame its 1 after next I/P 2 */ int last_dc[3]; /* last DC values for MPEG1 */ INT16 *dc_val[3]; /* used for mpeg4 DC prediction, all 3 arrays must be continuous */ int y_dc_scale, c_dc_scale; UINT8 *y_dc_scale_table; /* qscale -> y_dc_scale table */ UINT8 *c_dc_scale_table; /* qscale -> c_dc_scale table */ UINT8 *coded_block; /* used for coded block pattern prediction (msmpeg4v3, wmv1)*/ INT16 (*ac_val[3])[16]; /* used for for mpeg4 AC prediction, all 3 arrays must be continuous */ int ac_pred; int mb_skiped; /* MUST BE SET only during DECODING */ UINT8 *mbskip_table; /* used to avoid copy if macroblock skipped (for black regions for example) and used for b-frame encoding & decoding (contains skip table of next P Frame) */ UINT8 *mbintra_table; /* used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding */ UINT8 *cbp_table; /* used to store cbp, ac_pred for partitioned decoding */ UINT8 *pred_dir_table; /* used to store pred_dir for partitioned decoding */ INT8 *qscale_table; /* used to store qscale */ INT8 *aux_qscale_table; INT8 *next_qscale_table; INT8 *last_qscale_table; //FIXME move these into some picture struct (MpegEncContext.aux.qscale_table[]) UINT8 *edge_emu_buffer; int input_qscale; /* qscale prior to reordering of frames */ int input_pict_type; /* pict_type prior to reordering of frames */ int force_type; /* 0= no force, otherwise I_TYPE, P_TYPE, ... */ int qscale; /* QP */ float frame_qscale; /* qscale from the frame level rc */ int adaptive_quant; /* use adaptive quantization */ int dquant; /* qscale difference to prev qscale */ int pict_type; /* I_TYPE, P_TYPE, B_TYPE, ... */ int last_pict_type; int last_non_b_pict_type; /* used for mpeg4 gmc b-frames & ratecontrol */ int frame_rate_index; /* motion compensation */ int unrestricted_mv; int h263_long_vectors; /* use horrible h263v1 long vector mode */ DSPContext dsp; /* pointers for accelerated dsp fucntions */ int f_code; /* forward MV resolution */ int b_code; /* backward MV resolution for B Frames (mpeg4) */ INT16 (*motion_val)[2]; /* used for MV prediction (4MV per MB) */ INT16 (*p_mv_table)[2]; /* MV table (1MV per MB) p-frame encoding */ INT16 (*b_forw_mv_table)[2]; /* MV table (1MV per MB) forward mode b-frame encoding */ INT16 (*b_back_mv_table)[2]; /* MV table (1MV per MB) backward mode b-frame encoding */ INT16 (*b_bidir_forw_mv_table)[2]; /* MV table (1MV per MB) bidir mode b-frame encoding */ INT16 (*b_bidir_back_mv_table)[2]; /* MV table (1MV per MB) bidir mode b-frame encoding */ INT16 (*b_direct_forw_mv_table)[2];/* MV table (1MV per MB) direct mode b-frame encoding */ INT16 (*b_direct_back_mv_table)[2];/* MV table (1MV per MB) direct mode b-frame encoding */ INT16 (*b_direct_mv_table)[2]; /* MV table (1MV per MB) direct mode b-frame encoding */ int me_method; /* ME algorithm */ uint8_t *me_scratchpad; /* data area for the me algo, so that the ME doesnt need to malloc/free */ uint32_t *me_map; /* map to avoid duplicate evaluations */ uint16_t *me_score_map; /* map to store the SADs */ int me_map_generation; int skip_me; /* set if ME is skiped for the current MB */ int scene_change_score; int mv_dir;#define MV_DIR_BACKWARD 1#define MV_DIR_FORWARD 2#define MV_DIRECT 4 // bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) int mv_type;#define MV_TYPE_16X16 0 /* 1 vector for the whole mb */#define MV_TYPE_8X8 1 /* 4 vectors (h263, mpeg4 4MV) */#define MV_TYPE_16X8 2 /* 2 vectors, one per 16x8 block */ #define MV_TYPE_FIELD 3 /* 2 vectors, one per field */ #define MV_TYPE_DMV 4 /* 2 vectors, special mpeg2 Dual Prime Vectors */ /* motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend on type third " : 0 = x, 1 = y */ int mv[2][4][2]; int field_select[2][2]; int last_mv[2][2][2]; /* last MV, used for MV prediction in MPEG1 & B-frame MPEG4 */ UINT16 (*mv_penalty)[MAX_MV*2+1]; /* amount of bits needed to encode a MV, used for ME */ UINT8 *fcode_tab; /* smallest fcode needed for each MV */ int has_b_frames; int no_rounding; /* apply no rounding to motion compensation (MPEG4, msmpeg4, ...) for b-frames rounding mode is allways 0 */ int hurry_up; /* when set to 1 during decoding, b frames will be skiped when set to 2 idct/dequant will be skipped too */ /* macroblock layer */ int mb_x, mb_y; int mb_incr; int mb_intra; UINT16 *mb_var; /* Table for MB variances */ UINT16 *mc_mb_var; /* Table for motion compensated MB variances */ UINT8 *mb_mean; /* Table for MB luminance */ UINT8 *mb_type; /* Table for MB type */#define MB_TYPE_INTRA 0x01#define MB_TYPE_INTER 0x02#define MB_TYPE_INTER4V 0x04#define MB_TYPE_SKIPED 0x08#define MB_TYPE_GMC 0x10#define MB_TYPE_DIRECT 0x10#define MB_TYPE_FORWARD 0x20#define MB_TYPE_BACKWARD 0x40#define MB_TYPE_BIDIR 0x80 int block_index[6]; /* index to current MB in block based arrays with edges*/ int block_wrap[6]; /* matrix transmitted in the bitstream */ UINT16 intra_matrix[64]; UINT16 chroma_intra_matrix[64]; UINT16 inter_matrix[64]; UINT16 chroma_inter_matrix[64];#define QUANT_BIAS_SHIFT 4 int intra_quant_bias; /* bias for the quantizer */ int inter_quant_bias; /* bias for the quantizer */ int min_qcoeff; /* minimum encodable coefficient */ int max_qcoeff; /* maximum encodable coefficient */ /* precomputed matrix (combine qscale and DCT renorm) */ int __align8 q_intra_matrix[32][64]; int __align8 q_inter_matrix[32][64]; /* identical to the above but for MMX & these are not permutated */ UINT16 __align8 q_intra_matrix16[32][64]; UINT16 __align8 q_inter_matrix16[32][64]; UINT16 __align8 q_intra_matrix16_bias[32][64]; UINT16 __align8 q_inter_matrix16_bias[32][64]; int block_last_index[6]; /* last non zero coefficient in block */ /* scantables */ ScanTable __align8 intra_scantable; ScanTable intra_h_scantable; ScanTable intra_v_scantable; ScanTable inter_scantable; // if inter == intra then intra should be used to reduce tha cache usage UINT8 idct_permutation[64]; int idct_permutation_type;#define FF_NO_IDCT_PERM 1#define FF_LIBMPEG2_IDCT_PERM 2#define FF_SIMPLE_IDCT_PERM 3#define FF_TRANSPOSE_IDCT_PERM 4 void *opaque; /* private data for the user */ /* bit rate control */ int I_frame_bits; //FIXME used in mpeg12 ... int mb_var_sum; /* sum of MB variance for current frame */ int mc_mb_var_sum; /* motion compensated MB variance for current frame */ INT64 wanted_bits; INT64 total_bits; int frame_bits; /* bits used for the current frame */ RateControlContext rc_context; // contains stuff only accessed in ratecontrol.c /* statistics, used for 2-pass encoding */ int mv_bits; int header_bits; int i_tex_bits; int p_tex_bits; int i_count; int f_count; int b_count; int skip_count; int misc_bits; // cbp, mb_type int last_bits; //temp var used for calculating the above vars /* error concealment / resync */ UINT8 *error_status_table; /* table of the error status of each MB */ #define VP_START 1 /* current MB is the first after a resync marker */#define AC_ERROR 2#define DC_ERROR 4#define MV_ERROR 8#define AC_END 16#define DC_END 32#define MV_END 64//FIXME some prefix? int resync_mb_x; /* x position of last resync marker */ int resync_mb_y; /* y position of last resync marker */ GetBitContext last_resync_gb; /* used to serach for the next resync marker */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -