diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/mpegvideo.h')
-rw-r--r-- | src/libffmpeg/libavcodec/mpegvideo.h | 103 |
1 files changed, 86 insertions, 17 deletions
diff --git a/src/libffmpeg/libavcodec/mpegvideo.h b/src/libffmpeg/libavcodec/mpegvideo.h index 01e477865..f809a1255 100644 --- a/src/libffmpeg/libavcodec/mpegvideo.h +++ b/src/libffmpeg/libavcodec/mpegvideo.h @@ -34,6 +34,15 @@ enum OutputFormat { #define QMAT_SHIFT_MMX 19 #define QMAT_SHIFT 25 +#define MAX_FCODE 7 +#define MAX_MV 2048 + +typedef struct Predictor{ + double coeff; + double count; + double decay; +} Predictor; + typedef struct MpegEncContext { struct AVCodecContext *avctx; /* the following parameters must be initialized before encoding */ @@ -42,6 +51,7 @@ typedef struct MpegEncContext { 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_plus; /* h263 plus headers */ int h263_rv10; /* use RV10 variation for H263 */ @@ -49,7 +59,14 @@ typedef struct MpegEncContext { int h263_msmpeg4; /* generate MSMPEG4 compatible stream */ int h263_intel; /* use I263 intel h263 header */ 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_type; /* 0= no force, otherwise I_TYPE, P_TYPE, ... */ /* the following fields are managed internally by the encoder */ /* bit output */ @@ -59,7 +76,8 @@ typedef struct MpegEncContext { int context_initialized; 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 */ + 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 mb_width, mb_height; int mb_num; /* number of MBs of a picture */ int linesize; /* line size, in bytes, may be different from width */ @@ -72,10 +90,10 @@ typedef struct MpegEncContext { UINT8 *aux_picture_base[3]; /* real start of the picture */ UINT8 *current_picture[3]; /* buffer to store the decompressed current picture */ int last_dc[3]; /* last DC values for MPEG1 */ - INT16 *dc_val[3]; /* used for mpeg4 DC prediction */ + INT16 *dc_val[3]; /* used for mpeg4 DC prediction, all 3 arrays must be continuous */ int y_dc_scale, c_dc_scale; UINT8 *coded_block; /* used for coded block pattern prediction */ - INT16 (*ac_val[3])[16]; /* used for for mpeg4 AC prediction */ + 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 @@ -84,22 +102,25 @@ typedef struct MpegEncContext { int qscale; int pict_type; + int last_non_b_pict_type; /* used for mpeg4 gmc b-frames */ + int last_pict_type; /* used for bit rate stuff (needs that to update the right predictor) */ int frame_rate_index; /* motion compensation */ int unrestricted_mv; int h263_long_vectors; /* use horrible h263v1 long vector mode */ int f_code; /* resolution */ - int b_code; /* resolution for B Frames*/ - INT16 *mv_table[2]; /* MV table */ - INT16 (*motion_val)[2]; /* used for MV prediction */ + int b_code; /* backward resolution for B Frames (mpeg4) */ + INT16 *mv_table[2]; /* MV table (1MV per MB)*/ + INT16 (*motion_val)[2]; /* used for MV prediction (4MV per MB)*/ int full_search; 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) */ +#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 */ @@ -111,6 +132,8 @@ typedef struct MpegEncContext { int mv[2][4][2]; int field_select[2][2]; int last_mv[2][2][2]; + 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 estimation (MPEG4) */ @@ -119,9 +142,20 @@ typedef struct MpegEncContext { int mb_x, mb_y; int mb_incr; int mb_intra; - INT16 *mb_var; /* Table for MB variances */ - char *mb_type; /* Table for MB type */ - + UINT16 *mb_var; /* Table for MB variances */ + 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_DIRECT 0x10 +#define MB_TYPE_FORWARD 0x20 +#define MB_TYPE_BACKWAD 0x40 +#define MB_TYPE_BIDIR 0x80 + + int block_index[6]; + int block_wrap[6]; + /* matrix transmitted in the bitstream */ UINT16 intra_matrix[64]; UINT16 chroma_intra_matrix[64]; @@ -141,9 +175,30 @@ typedef struct MpegEncContext { int I_frame_bits; /* wanted number of bits per I frame */ int P_frame_bits; /* same for P frame */ int avg_mb_var; /* average MB variance for current frame */ + int mc_mb_var; /* motion compensated MB variance for current frame */ + int last_mc_mb_var; /* motion compensated MB variance for last frame */ INT64 wanted_bits; INT64 total_bits; - + int frame_bits; /* bits used for the current frame */ + int last_frame_bits; /* bits used for the last frame */ + Predictor i_pred; + Predictor p_pred; + double qsum; /* sum of qscales */ + double qcount; /* count of qscales */ + double short_term_qsum; /* sum of recent qscales */ + double short_term_qcount; /* count of recent qscales */ + + /* statistics, used for 2-pass encoding */ + int mv_bits; + int header_bits; + int i_tex_bits; + int p_tex_bits; + int i_count; + int p_count; + int skip_count; + int misc_bits; // cbp, mb_type + int last_bits; //temp var used for calculating the above vars + /* H.263 specific */ int gob_number; int gob_index; @@ -156,7 +211,12 @@ typedef struct MpegEncContext { int h263_aic_dir; /* AIC direction: 0 = left, 1 = top */ /* mpeg4 specific */ + int time_increment_resolution; int time_increment_bits; + int time_increment; + int time_base; + int time; + int last_non_b_time[2]; int shape; int vol_sprite_usage; int sprite_width; @@ -179,6 +239,8 @@ typedef struct MpegEncContext { int sprite_warping_accuracy; int low_latency_sprite; int data_partioning; + int resync_marker; + int resync_x_pos; /* divx specific, used to workaround (many) bugs in divx5 */ int divx_version; @@ -202,9 +264,10 @@ typedef struct MpegEncContext { int dc_table_index; int use_skip_mb_code; int slice_height; /* in macroblocks */ - int first_slice_line; + int first_slice_line; /* used in mpeg4 too to handle resync markers */ int flipflop_rounding; int bitrate; + int msmpeg4_version; /* 1=mp41, 2=mp42, 3=mp43/divx3 */ /* decompression specific */ GetBitContext gb; @@ -242,7 +305,10 @@ typedef struct MpegEncContext { UINT8 *ptr_last_mb_line; UINT32 mb_line_avgsize; - DCTELEM block[6][64] __align8; + DCTELEM (*block)[64]; /* points to one of the following blocks */ + DCTELEM intra_block[6][64] __align8; + DCTELEM inter_block[6][64] __align8; + DCTELEM inter4v_block[6][64] __align8; void (*dct_unquantize)(struct MpegEncContext *s, DCTELEM *block, int n, int qscale); } MpegEncContext; @@ -258,9 +324,8 @@ void MPV_common_init_mmx(MpegEncContext *s); /* motion_est.c */ -int estimate_motion(MpegEncContext *s, - int mb_x, int mb_y, - int *mx_ptr, int *my_ptr); +void estimate_motion(MpegEncContext *s, + int mb_x, int mb_y); /* mpeg12.c */ extern INT16 default_intra_matrix[64]; @@ -270,6 +335,7 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number); void mpeg1_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y); +void mpeg1_encode_init(MpegEncContext *s); /* h263enc.c */ @@ -306,6 +372,9 @@ static inline int get_rl_index(const RLTable *rl, int last, int run, int level) void h263_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y); +void mpeg4_encode_mb(MpegEncContext *s, + DCTELEM block[6][64], + int motion_x, int motion_y); void h263_encode_picture_header(MpegEncContext *s, int picture_number); int h263_encode_gob_header(MpegEncContext * s, int mb_line); void h263_dc_scale(MpegEncContext *s); @@ -314,7 +383,7 @@ INT16 *h263_pred_motion(MpegEncContext * s, int block, void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n, int dir); void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); -void h263_encode_init_vlc(MpegEncContext *s); +void h263_encode_init(MpegEncContext *s); void h263_decode_init_vlc(MpegEncContext *s); int h263_decode_picture_header(MpegEncContext *s); |