]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mpegvideo.h
10l - set pixelfmt (colorspace) _before_ calling get_buffer() callback
[ffmpeg] / libavcodec / mpegvideo.h
index 00e6ebe46e2a29697455f5fc2d15a9dd197375d0..a61ae62a4001bfeff09f3aa2564a60598b8d0a0c 100644 (file)
@@ -53,7 +53,7 @@ typedef struct Predictor{
 
 typedef struct RateControlEntry{
     int pict_type;
-    int qscale;
+    float qscale;
     int mv_bits;
     int i_tex_bits;
     int p_tex_bits;
@@ -76,12 +76,10 @@ typedef struct RateControlContext{
     Predictor pred[5];
     double short_term_qsum;   /* sum of recent qscales */
     double short_term_qcount; /* count of recent qscales */
-    double pass1_bits;        /* bits outputted by the pass1 code (including complexity init) */
+    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 */
-    double next_non_b_qscale;
-    double next_p_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];
@@ -89,6 +87,7 @@ typedef struct RateControlContext{
     UINT64 mv_bits_sum[5];
     UINT64 qscale_sum[5];
     int frame_count[5];
+    int last_non_b_pict_type;
 }RateControlContext;
 
 typedef struct ReorderBuffer{
@@ -100,6 +99,25 @@ typedef struct ReorderBuffer{
     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 */
@@ -182,13 +200,19 @@ typedef struct MpegEncContext {
     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 for partitioned decoding (& postprocessing FIXME export) */
+    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 */
@@ -242,13 +266,14 @@ typedef struct MpegEncContext {
 
     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
@@ -275,14 +300,25 @@ typedef struct MpegEncContext {
     int min_qcoeff;          /* minimum encodable coefficient */
     int max_qcoeff;          /* maximum encodable coefficient */
     /* precomputed matrix (combine qscale and DCT renorm) */
-    int q_intra_matrix[32][64];
-    int q_inter_matrix[32][64];
+    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 */
 
@@ -301,24 +337,31 @@ typedef struct MpegEncContext {
     int i_tex_bits;
     int p_tex_bits;
     int i_count;
-    int p_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 */
-    int mb_num_left;                 /* number of MBs left in this video packet */
-    GetBitContext next_resync_gb;    /* starts at the next resync marker */
-    int next_resync_qscale;          /* qscale of next resync marker */
-    int next_resync_pos;             /* bitstream position of next resync marker */
-#define DECODING_AC_LOST -1
-#define DECODING_ACDC_LOST -2
-#define DECODING_DESYNC -3
-    int decoding_error;
+    GetBitContext last_resync_gb;    /* used to serach for the next resync marker */
+    int mb_num_left;                 /* number of MBs left in this video packet (for partitioned Slices only)*/
     int next_p_frame_damaged;        /* set if the next p frame is damaged, to avoid showing trashed b frames */
     int error_resilience;
+    
+    ParseContext parse_context;
 
     /* H.263 specific */
     int gob_number;
@@ -338,7 +381,9 @@ typedef struct MpegEncContext {
     INT64 time;                   /* time of current frame */ 
     INT64 last_non_b_time;
     UINT16 pp_time;               /* time distance between the last 2 p,s,i frames */
-    UINT16 bp_time;               /* time distance between the last b and p,s,i frame */
+    UINT16 pb_time;               /* time distance between the last b and p,s,i frame */
+    UINT16 pp_field_time;
+    UINT16 pb_field_time;         /* like above, just for interlaced */
     int shape;
     int vol_sprite_usage;
     int sprite_width;
@@ -348,9 +393,9 @@ typedef struct MpegEncContext {
     int sprite_brightness_change;
     int num_sprite_warping_points;
     int real_sprite_warping_points;
-    int sprite_offset[2][2];
-    int sprite_delta[2][2][2];
-    int sprite_shift[2][2];
+    int sprite_offset[2][2];         /* sprite offset[isChroma][isMVY] */
+    int sprite_delta[2][2];          /* sprite_delta [isY][isMVY] */ 
+    int sprite_shift[2];             /* sprite shift [isChroma] */
     int mcsel;
     int quant_precision;
     int quarter_sample;              /* 1->qpel, 0->half pel ME/MC */ 
@@ -364,7 +409,8 @@ typedef struct MpegEncContext {
     int aspected_height;
     int sprite_warping_accuracy;
     int low_latency_sprite;
-    int data_partitioning;
+    int data_partitioning;           /* data partitioning flag from header */
+    int partitioned_frame;           /* is current frame partitioned */
     int rvlc;                        /* reversible vlc */
     int resync_marker;               /* could this stream contain resync markers*/
     int low_delay;                   /* no reordering needed / has no b-frames */
@@ -376,7 +422,13 @@ typedef struct MpegEncContext {
     uint8_t *tex_pb_buffer;          
     uint8_t *pb2_buffer;
     int mpeg_quant;
-    INT8 *non_b_mv4_table;
+#define CO_LOCATED_TYPE_4MV     1
+#define CO_LOCATED_TYPE_FIELDMV 2
+    INT8 *co_located_type_table;     /* 4mv & field_mv info for next b frame */
+    INT16 (*field_mv_table)[2][2];   /* used for interlaced b frame decoding */
+    INT8 (*field_select_table)[2];   /* wtf, no really another table for interlaced b frames */
+    int t_frame;                     /* time distance of first I -> B, used for interlaced b frames */
+    int padding_bug_score;           /* used to detect the VERY common padding bug in MPEG4 */
 
     /* divx specific, used to workaround (many) bugs in divx5 */
     int divx_version;
@@ -385,6 +437,12 @@ typedef struct MpegEncContext {
     UINT8 *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them
     int bitstream_buffer_size;
     
+    int xvid_build;
+    
+    /* lavc specific stuff, used to workaround bugs in libavcodec */
+    int ffmpeg_version;
+    int lavc_build;
+    
     /* RV10 specific */
     int rv10_version; /* RV10 version: 0 or 3 */
     int rv10_first_dc_coded[3];
@@ -410,12 +468,8 @@ typedef struct MpegEncContext {
     int per_mb_rl_table;
     int esc3_level_length;
     int esc3_run_length;
-    UINT8 *inter_scantable;
-    UINT8 *intra_scantable;
-    UINT8 *intra_v_scantable;
-    UINT8 *intra_h_scantable;
     /* [mb_intra][isChroma][level][run][last] */
-    int ac_stats[2][2][MAX_LEVEL+1][MAX_RUN+1][2];
+    int (*ac_stats)[2][MAX_LEVEL+1][MAX_RUN+1][2];
     int inter_intra_pred;
 
     /* decompression specific */
@@ -457,6 +511,12 @@ typedef struct MpegEncContext {
     
     DCTELEM (*block)[64]; /* points to one of the following blocks */
     DCTELEM blocks[2][6][64] __align8; // for HQ mode we need to keep the best block
+    int (*decode_mb)(struct MpegEncContext *s, DCTELEM block[6][64]); // used by some codecs to avoid a switch()
+#define SLICE_OK         0
+#define SLICE_ERROR     -1
+#define SLICE_END       -2 //end marker found
+#define SLICE_NOEND     -3 //no end marker or error found but mb count exceeded
+    
     void (*dct_unquantize_mpeg1)(struct MpegEncContext *s, 
                            DCTELEM *block, int n, int qscale);
     void (*dct_unquantize_mpeg2)(struct MpegEncContext *s, 
@@ -466,13 +526,17 @@ typedef struct MpegEncContext {
     void (*dct_unquantize)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both)
                            DCTELEM *block, int n, int qscale);
     int (*dct_quantize)(struct MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
-    void (*fdct)(DCTELEM *block);
+    void (*fdct)(DCTELEM *block/* align 16*/);
+    void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
+    void (*idct_add)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
 } MpegEncContext;
 
+
+int DCT_common_init(MpegEncContext *s);
 int MPV_common_init(MpegEncContext *s);
 void MPV_common_end(MpegEncContext *s);
 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
-void MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx);
+int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx);
 void MPV_frame_end(MpegEncContext *s);
 #ifdef HAVE_MMX
 void MPV_common_init_mmx(MpegEncContext *s);
@@ -483,10 +547,40 @@ void MPV_common_init_axp(MpegEncContext *s);
 #ifdef HAVE_MLIB
 void MPV_common_init_mlib(MpegEncContext *s);
 #endif
+#ifdef HAVE_MMI
+void MPV_common_init_mmi(MpegEncContext *s);
+#endif
+#ifdef ARCH_POWERPC
+void MPV_common_init_ppc(MpegEncContext *s);
+#endif
 extern void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w);
 void ff_conceal_past_errors(MpegEncContext *s, int conceal_all);
 void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length);
 void ff_clean_intra_table_entries(MpegEncContext *s);
+void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scantable);
+void ff_error_resilience(MpegEncContext *s);
+void ff_draw_horiz_band(MpegEncContext *s);
+
+extern int ff_bit_exact;
+
+static inline void ff_init_block_index(MpegEncContext *s){
+    s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
+    s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1)     + s->mb_x*2;
+    s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
+    s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2)     + s->mb_x*2;
+    s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1)                    + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
+    s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
+}
+
+static inline void ff_update_block_index(MpegEncContext *s){
+    s->block_index[0]+=2;
+    s->block_index[1]+=2;
+    s->block_index[2]+=2;
+    s->block_index[3]+=2;
+    s->block_index[4]++;
+    s->block_index[5]++;
+}
+
 
 /* motion_est.c */
 void ff_estimate_p_frame_motion(MpegEncContext * s,
@@ -497,9 +591,10 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type);
 void ff_fix_long_p_mvs(MpegEncContext * s);
 void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, int type);
 
+
 /* mpeg12.c */
-extern INT16 ff_mpeg1_default_intra_matrix[64];
-extern INT16 ff_mpeg1_default_non_intra_matrix[64];
+extern const INT16 ff_mpeg1_default_intra_matrix[64];
+extern const INT16 ff_mpeg1_default_non_intra_matrix[64];
 extern UINT8 ff_mpeg1_dc_scale_table[128];
 
 void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number);
@@ -508,6 +603,7 @@ void mpeg1_encode_mb(MpegEncContext *s,
                      int motion_x, int motion_y);
 void ff_mpeg1_encode_init(MpegEncContext *s);
 
+
 /* h263enc.c */
 typedef struct RLTable {
     int n; /* number of entries of table_vlc minus 1 */
@@ -538,9 +634,8 @@ static inline int get_rl_index(const RLTable *rl, int last, int run, int level)
 
 extern UINT8 ff_mpeg4_y_dc_scale_table[32];
 extern UINT8 ff_mpeg4_c_dc_scale_table[32];
-extern INT16 ff_mpeg4_default_intra_matrix[64];
-extern INT16 ff_mpeg4_default_non_intra_matrix[64];
-
+extern const INT16 ff_mpeg4_default_intra_matrix[64];
+extern const INT16 ff_mpeg4_default_non_intra_matrix[64];
 void h263_encode_mb(MpegEncContext *s, 
                     DCTELEM block[6][64],
                     int motion_x, int motion_y);
@@ -556,28 +651,34 @@ void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number);
 void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
 void h263_encode_init(MpegEncContext *s);
-
 void h263_decode_init_vlc(MpegEncContext *s);
 int h263_decode_picture_header(MpegEncContext *s);
-int h263_decode_gob_header(MpegEncContext *s);
-int mpeg4_decode_picture_header(MpegEncContext * s);
+int ff_h263_decode_gob_header(MpegEncContext *s);
+int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
+
+
 int intel_h263_decode_picture_header(MpegEncContext *s);
-int h263_decode_mb(MpegEncContext *s,
-                   DCTELEM block[6][64]);
+int ff_h263_decode_mb(MpegEncContext *s,
+                      DCTELEM block[6][64]);
 int h263_get_picture_format(int width, int height);
-int ff_mpeg4_decode_video_packet_header(MpegEncContext *s);
-int ff_mpeg4_resync(MpegEncContext *s);
 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
 void ff_mpeg4_clean_buffers(MpegEncContext *s);
 void ff_mpeg4_stuffing(PutBitContext * pbc);
 void ff_mpeg4_init_partitions(MpegEncContext *s);
 void ff_mpeg4_merge_partitions(MpegEncContext *s);
-extern inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
+void ff_clean_mpeg4_qscales(MpegEncContext *s);
+void ff_clean_h263_qscales(MpegEncContext *s);
+int ff_mpeg4_decode_partitions(MpegEncContext *s);
+int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
+int ff_h263_resync(MpegEncContext *s);
+int ff_h263_get_gob_height(MpegEncContext *s);
+
 
 /* rv10.c */
 void rv10_encode_picture_header(MpegEncContext *s, int picture_number);
 int rv_decode_dc(MpegEncContext *s, int n);
 
+
 /* msmpeg4.c */
 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number);
 void msmpeg4_encode_ext_header(MpegEncContext * s);
@@ -586,13 +687,11 @@ void msmpeg4_encode_mb(MpegEncContext * s,
                        int motion_x, int motion_y);
 int msmpeg4_decode_picture_header(MpegEncContext * s);
 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size);
-int msmpeg4_decode_mb(MpegEncContext *s, 
-                      DCTELEM block[6][64]);
 int ff_msmpeg4_decode_init(MpegEncContext *s);
 void ff_msmpeg4_encode_init(MpegEncContext *s);
 
-/* mjpegenc.c */
 
+/* mjpegenc.c */
 int mjpeg_init(MpegEncContext *s);
 void mjpeg_close(MpegEncContext *s);
 void mjpeg_encode_mb(MpegEncContext *s, 
@@ -600,10 +699,10 @@ void mjpeg_encode_mb(MpegEncContext *s,
 void mjpeg_picture_header(MpegEncContext *s);
 void mjpeg_picture_trailer(MpegEncContext *s);
 
+
 /* rate control */
 int ff_rate_control_init(MpegEncContext *s);
-int ff_rate_estimate_qscale(MpegEncContext *s);
-int ff_rate_estimate_qscale_pass2(MpegEncContext *s);
+float ff_rate_estimate_qscale(MpegEncContext *s);
 void ff_write_pass1_stats(MpegEncContext *s);
 void ff_rate_control_uninit(MpegEncContext *s);
 double ff_eval(char *s, double *const_value, char **const_name,