9f930739300a31636f606fcfe01ed7a5e29c40cb
[ffmpeg.git] / libavcodec / mpegvideo.h
1 /*
2  * Generic DCT based hybrid video encoder
3  * Copyright (c) 2000,2001 Gerard Lantau.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19
20 /* Macros for picture code type. */
21 #define I_TYPE 1
22 #define P_TYPE 2
23 #define B_TYPE 3
24
25 enum OutputFormat {
26     FMT_MPEG1,
27     FMT_H263,
28     FMT_MJPEG,
29 };
30
31 #define MPEG_BUF_SIZE (16 * 1024)
32
33 typedef struct MpegEncContext {
34     /* the following parameters must be initialized before encoding */
35     int width, height; /* picture size. must be a multiple of 16 */
36     int gop_size;
37     int frame_rate; /* number of frames per second */
38     int intra_only; /* if true, only intra pictures are generated */
39     int bit_rate;        /* wanted bit rate */
40     enum OutputFormat out_format; /* output format */
41     int h263_plus; /* h263 plus headers */
42     int h263_rv10; /* use RV10 variation for H263 */
43     int h263_pred; /* use OpenDIVX (aka mpeg4) ac/dc predictions */
44     int h263_msmpeg4; /* generate MSMPEG4 compatible stream */
45     int h263_intel; /* use I263 intel h263 header */
46     int fixed_qscale; /* fixed qscale if non zero */
47     int encoding;     /* true if we are encoding (vs decoding) */
48     /* the following fields are managed internally by the encoder */
49
50     /* bit output */
51     PutBitContext pb;
52
53     /* sequence parameters */
54     int context_initialized;
55     int picture_number;
56     int fake_picture_number; /* picture number at the bitstream frame rate */
57     int gop_picture_number; /* index of the first picture of a GOP */
58     int mb_width, mb_height;
59     int linesize;              /* line size, in bytes, may be different from width */
60     UINT8 *new_picture[3];     /* picture to be compressed */
61     UINT8 *last_picture[3];    /* previous picture */
62     UINT8 *last_picture_base[3]; /* real start of the picture */
63     UINT8 *next_picture[3];    /* previous picture (for bidir pred) */
64     UINT8 *next_picture_base[3]; /* real start of the picture */
65     UINT8 *aux_picture[3];    /* aux picture (for B frames only) */
66     UINT8 *aux_picture_base[3]; /* real start of the picture */
67     UINT8 *current_picture[3]; /* buffer to store the decompressed current picture */
68     int last_dc[3]; /* last DC values for MPEG1 */
69     INT16 *dc_val[3]; /* used for mpeg4 DC prediction */
70     int y_dc_scale, c_dc_scale;
71     UINT8 *coded_block; /* used for coded block pattern prediction */
72     INT16 (*ac_val[3])[16]; /* used for for mpeg4 AC prediction */
73     int ac_pred;
74     int mb_skiped;              /* MUST BE SET only during DECODING */
75     UINT8 *mbskip_table;        /* used to avoid copy if macroblock
76                                    skipped (for black regions for example) */
77
78     int qscale;
79     int pict_type;
80     int frame_rate_index;
81     /* motion compensation */
82     int unrestricted_mv;
83     int h263_long_vectors; /* use horrible h263v1 long vector mode */
84
85     int f_code; /* resolution */
86     INT16 (*motion_val)[2]; /* used for MV prediction */
87     int full_search;
88     int mv_dir;
89 #define MV_DIR_BACKWARD  1
90 #define MV_DIR_FORWARD   2
91     int mv_type;
92 #define MV_TYPE_16X16       0   /* 1 vector for the whole mb */
93 #define MV_TYPE_8X8         1   /* 4 vectors (h263) */
94 #define MV_TYPE_16X8        2   /* 2 vectors, one per 16x8 block */ 
95 #define MV_TYPE_FIELD       3   /* 2 vectors, one per field */ 
96 #define MV_TYPE_DMV         4   /* 2 vectors, special mpeg2 Dual Prime Vectors */
97     /* motion vectors for a macroblock 
98        first coordinate : 0 = forward 1 = backward
99        second "         : depend on type
100        third  "         : 0 = x, 1 = y
101     */
102     int mv[2][4][2];
103     int field_select[2][2];
104     int last_mv[2][2][2];
105
106     int has_b_frames;
107     int no_rounding; /* apply no rounding to motion estimation (MPEG4) */
108
109     /* macroblock layer */
110     int mb_x, mb_y;
111     int mb_incr;
112     int mb_intra;
113     /* matrix transmitted in the bitstream */
114     UINT16 intra_matrix[64];
115     UINT16 chroma_intra_matrix[64];
116     UINT16 non_intra_matrix[64];
117     UINT16 chroma_non_intra_matrix[64];
118     /* precomputed matrix (combine qscale and DCT renorm) */
119     int q_intra_matrix[64];
120     int q_non_intra_matrix[64];
121     int block_last_index[6];  /* last non zero coefficient in block */
122
123     void *opaque; /* private data for the user */
124
125     /* bit rate control */
126     int I_frame_bits;    /* wanted number of bits per I frame */
127     int P_frame_bits;    /* same for P frame */
128     long long wanted_bits;
129     long long total_bits;
130
131     /* mpeg4 specific */
132     int time_increment_bits;
133
134     /* RV10 specific */
135     int rv10_version; /* RV10 version: 0 or 3 */
136     int rv10_first_dc_coded[3];
137     
138     /* MJPEG specific */
139     struct MJpegContext *mjpeg_ctx;
140
141     /* MSMPEG4 specific */
142     int mv_table_index;
143     int rl_table_index;
144     int rl_chroma_table_index;
145     int dc_table_index;
146     int use_skip_mb_code;
147     int slice_height;      /* in macroblocks */
148     int first_slice_line;  
149     /* decompression specific */
150     GetBitContext gb;
151
152     /* MPEG2 specific - I wish I had not to support this mess. */
153     int progressive_sequence;
154     int mpeg_f_code[2][2];
155     int picture_structure;
156 /* picture type */
157 #define PICT_TOP_FIELD     1
158 #define PICT_BOTTOM_FIELD  2
159 #define PICT_FRAME         3
160
161     int intra_dc_precision;
162     int frame_pred_frame_dct;
163     int top_field_first;
164     int concealment_motion_vectors;
165     int q_scale_type;
166     int intra_vlc_format;
167     int alternate_scan;
168     int repeat_first_field;
169     int chroma_420_type;
170     int progressive_frame;
171     int mpeg2;
172     int full_pel[2];
173     int interlaced_dct;
174     int last_qscale;
175     int first_slice;
176
177     DCTELEM block[6][64] __align8;
178     void (*dct_unquantize)(struct MpegEncContext *s, 
179                            DCTELEM *block, int n, int qscale);
180 } MpegEncContext;
181
182 //const 
183 extern UINT8 zigzag_direct[64];
184
185 int MPV_common_init(MpegEncContext *s);
186 void MPV_common_end(MpegEncContext *s);
187 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
188 void MPV_frame_start(MpegEncContext *s);
189 void MPV_frame_end(MpegEncContext *s);
190 #ifdef HAVE_MMX
191 void MPV_common_init_mmx(MpegEncContext *s);
192 #endif
193
194 /* motion_est.c */
195
196 int estimate_motion(MpegEncContext *s, 
197                     int mb_x, int mb_y,
198                     int *mx_ptr, int *my_ptr);
199
200 /* mpeg12.c */
201 extern const UINT8 default_intra_matrix[64];
202 extern const UINT8 default_non_intra_matrix[64];
203
204 void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number);
205 void mpeg1_encode_mb(MpegEncContext *s,
206                      DCTELEM block[6][64],
207                      int motion_x, int motion_y);
208
209 /* h263enc.c */
210
211 /* run length table */
212 #define MAX_RUN    64
213 #define MAX_LEVEL  64
214
215 typedef struct RLTable {
216     int n; /* number of entries of table_vlc minus 1 */
217     int last; /* number of values for last = 0 */
218     const UINT16 (*table_vlc)[2];
219     const INT8 *table_run;
220     const INT8 *table_level;
221     UINT8 *index_run[2]; /* encoding only */
222     INT8 *max_level[2]; /* encoding & decoding */
223     INT8 *max_run[2];   /* encoding & decoding */
224     VLC vlc;            /* decoding only */
225 } RLTable;
226
227 void init_rl(RLTable *rl);
228 void init_vlc_rl(RLTable *rl);
229
230 extern inline int get_rl_index(const RLTable *rl, int last, int run, int level)
231 {
232     int index;
233     index = rl->index_run[last][run];
234     if (index >= rl->n)
235         return rl->n;
236     if (level > rl->max_level[last][run])
237         return rl->n;
238     return index + level - 1;
239 }
240
241 void h263_encode_mb(MpegEncContext *s, 
242                     DCTELEM block[6][64],
243                     int motion_x, int motion_y);
244 void h263_encode_picture_header(MpegEncContext *s, int picture_number);
245 void h263_dc_scale(MpegEncContext *s);
246 INT16 *h263_pred_motion(MpegEncContext * s, int block, 
247                         int *px, int *py);
248 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n, 
249                    int dir);
250 void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
251 void h263_encode_init_vlc(MpegEncContext *s);
252
253 void h263_decode_init_vlc(MpegEncContext *s);
254 int h263_decode_picture_header(MpegEncContext *s);
255 int mpeg4_decode_picture_header(MpegEncContext * s);
256 int intel_h263_decode_picture_header(MpegEncContext *s);
257 int h263_decode_mb(MpegEncContext *s,
258                    DCTELEM block[6][64]);
259 int h263_get_picture_format(int width, int height);
260 extern UINT8 ff_alternate_horizontal_scan[64];
261 extern UINT8 ff_alternate_vertical_scan[64];
262
263 /* rv10.c */
264 void rv10_encode_picture_header(MpegEncContext *s, int picture_number);
265 int rv_decode_dc(MpegEncContext *s, int n);
266
267 /* msmpeg4.c */
268 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number);
269 void msmpeg4_encode_mb(MpegEncContext * s, 
270                        DCTELEM block[6][64],
271                        int motion_x, int motion_y);
272 void msmpeg4_dc_scale(MpegEncContext * s);
273 int msmpeg4_decode_picture_header(MpegEncContext * s);
274 int msmpeg4_decode_mb(MpegEncContext *s, 
275                       DCTELEM block[6][64]);
276 int msmpeg4_decode_init_vlc(MpegEncContext *s);
277
278 /* mjpegenc.c */
279
280 int mjpeg_init(MpegEncContext *s);
281 void mjpeg_close(MpegEncContext *s);
282 void mjpeg_encode_mb(MpegEncContext *s, 
283                      DCTELEM block[6][64]);
284 void mjpeg_picture_header(MpegEncContext *s);
285 void mjpeg_picture_trailer(MpegEncContext *s);