summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/mpegvideo.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libffmpeg/libavcodec/mpegvideo.h')
-rw-r--r--src/libffmpeg/libavcodec/mpegvideo.h103
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);