ffmpeg / libavcodec / mpegvideo.h @ 983e3246
History | View | Annotate | Download (32.2 KB)
1 |
/*
|
---|---|
2 |
* Generic DCT based hybrid video encoder
|
3 |
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
|
4 |
*
|
5 |
* This library is free software; you can redistribute it and/or
|
6 |
* modify it under the terms of the GNU Lesser General Public
|
7 |
* License as published by the Free Software Foundation; either
|
8 |
* version 2 of the License, or (at your option) any later version.
|
9 |
*
|
10 |
* This library 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 GNU
|
13 |
* Lesser General Public License for more details.
|
14 |
*
|
15 |
* You should have received a copy of the GNU Lesser General Public
|
16 |
* License along with this library; if not, write to the Free Software
|
17 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18 |
*/
|
19 |
|
20 |
/**
|
21 |
* @file mpegvideo.h
|
22 |
* mpegvideo header.
|
23 |
*/
|
24 |
|
25 |
#ifndef AVCODEC_MPEGVIDEO_H
|
26 |
#define AVCODEC_MPEGVIDEO_H
|
27 |
|
28 |
#include "dsputil.h" |
29 |
|
30 |
#define FRAME_SKIPED 100 // return value for header parsers if frame is not coded |
31 |
|
32 |
enum OutputFormat {
|
33 |
FMT_MPEG1, |
34 |
FMT_H263, |
35 |
FMT_MJPEG, |
36 |
}; |
37 |
|
38 |
#define EDGE_WIDTH 16 |
39 |
|
40 |
#define MPEG_BUF_SIZE (16 * 1024) |
41 |
|
42 |
#define QMAT_SHIFT_MMX 16 |
43 |
#define QMAT_SHIFT 22 |
44 |
|
45 |
#define MAX_FCODE 7 |
46 |
#define MAX_MV 2048 |
47 |
|
48 |
#define MAX_PICTURE_COUNT 15 |
49 |
|
50 |
#define ME_MAP_SIZE 64 |
51 |
#define ME_MAP_SHIFT 3 |
52 |
#define ME_MAP_MV_BITS 11 |
53 |
|
54 |
/* run length table */
|
55 |
#define MAX_RUN 64 |
56 |
#define MAX_LEVEL 64 |
57 |
|
58 |
#define I_TYPE FF_I_TYPE // Intra |
59 |
#define P_TYPE FF_P_TYPE // Predicted |
60 |
#define B_TYPE FF_B_TYPE // Bi-dir predicted |
61 |
#define S_TYPE FF_S_TYPE // S(GMC)-VOP MPEG4 |
62 |
|
63 |
typedef struct Predictor{ |
64 |
double coeff;
|
65 |
double count;
|
66 |
double decay;
|
67 |
} Predictor; |
68 |
|
69 |
typedef struct RateControlEntry{ |
70 |
int pict_type;
|
71 |
float qscale;
|
72 |
int mv_bits;
|
73 |
int i_tex_bits;
|
74 |
int p_tex_bits;
|
75 |
int misc_bits;
|
76 |
uint64_t expected_bits; |
77 |
int new_pict_type;
|
78 |
float new_qscale;
|
79 |
int mc_mb_var_sum;
|
80 |
int mb_var_sum;
|
81 |
int i_count;
|
82 |
int f_code;
|
83 |
int b_code;
|
84 |
}RateControlEntry; |
85 |
|
86 |
typedef struct RateControlContext{ |
87 |
FILE *stats_file; |
88 |
int num_entries; /* number of RateControlEntries */ |
89 |
RateControlEntry *entry; |
90 |
int buffer_index; /* amount of bits in the video/audio buffer */ |
91 |
Predictor pred[5];
|
92 |
double short_term_qsum; /* sum of recent qscales */ |
93 |
double short_term_qcount; /* count of recent qscales */ |
94 |
double pass1_rc_eq_output_sum;/* sum of the output of the rc equation, this is used for normalization */ |
95 |
double pass1_wanted_bits; /* bits which should have been outputed by the pass1 code (including complexity init) */ |
96 |
double last_qscale;
|
97 |
double last_qscale_for[5]; /* last qscale for a specific pict type, used for max_diff & ipb factor stuff */ |
98 |
int last_mc_mb_var_sum;
|
99 |
int last_mb_var_sum;
|
100 |
uint64_t i_cplx_sum[5];
|
101 |
uint64_t p_cplx_sum[5];
|
102 |
uint64_t mv_bits_sum[5];
|
103 |
uint64_t qscale_sum[5];
|
104 |
int frame_count[5]; |
105 |
int last_non_b_pict_type;
|
106 |
}RateControlContext; |
107 |
|
108 |
typedef struct ScanTable{ |
109 |
const uint8_t *scantable;
|
110 |
uint8_t permutated[64];
|
111 |
uint8_t raster_end[64];
|
112 |
#ifdef ARCH_POWERPC
|
113 |
/* Used by dct_quantise_alitvec to find last-non-zero */
|
114 |
uint8_t __align8 inverse[64];
|
115 |
#endif
|
116 |
} ScanTable; |
117 |
|
118 |
typedef struct Picture{ |
119 |
FF_COMMON_FRAME |
120 |
|
121 |
int mb_var_sum; /* sum of MB variance for current frame */ |
122 |
int mc_mb_var_sum; /* motion compensated MB variance for current frame */ |
123 |
uint16_t *mb_var; /* Table for MB variances */
|
124 |
uint16_t *mc_mb_var; /* Table for motion compensated MB variances */
|
125 |
uint8_t *mb_mean; /* Table for MB luminance */
|
126 |
int32_t *mb_cmp_score; /* Table for MB cmp scores, for mb decission */
|
127 |
int b_frame_score; /* */ |
128 |
} Picture; |
129 |
|
130 |
typedef struct ParseContext{ |
131 |
uint8_t *buffer; |
132 |
int index;
|
133 |
int last_index;
|
134 |
int buffer_size;
|
135 |
int state;
|
136 |
int frame_start_found;
|
137 |
} ParseContext; |
138 |
|
139 |
struct MpegEncContext;
|
140 |
|
141 |
typedef struct MotionEstContext{ |
142 |
int skip; /* set if ME is skiped for the current MB */ |
143 |
int co_located_mv[4][2]; /* mv from last p frame for direct mode ME */ |
144 |
int direct_basis_mv[4][2]; |
145 |
uint8_t *scratchpad; /* data area for the me algo, so that the ME doesnt need to malloc/free */
|
146 |
uint32_t *map; /* map to avoid duplicate evaluations */
|
147 |
uint32_t *score_map; /* map to store the scores */
|
148 |
int map_generation;
|
149 |
int pre_penalty_factor;
|
150 |
int penalty_factor;
|
151 |
int sub_penalty_factor;
|
152 |
int mb_penalty_factor;
|
153 |
int pre_pass; /* = 1 for the pre pass */ |
154 |
int dia_size;
|
155 |
uint16_t (*mv_penalty)[MAX_MV*2+1]; /* amount of bits needed to encode a MV */ |
156 |
int (*sub_motion_search)(struct MpegEncContext * s, |
157 |
int *mx_ptr, int *my_ptr, int dmin, |
158 |
int xmin, int ymin, int xmax, int ymax, |
159 |
int pred_x, int pred_y, Picture *ref_picture, |
160 |
int n, int size, uint16_t * const mv_penalty); |
161 |
int (*motion_search[7])(struct MpegEncContext * s, int block, |
162 |
int *mx_ptr, int *my_ptr, |
163 |
int P[10][2], int pred_x, int pred_y, |
164 |
int xmin, int ymin, int xmax, int ymax, Picture *ref_picture, int16_t (*last_mv)[2], |
165 |
int ref_mv_scale, uint16_t * const mv_penalty); |
166 |
int (*pre_motion_search)(struct MpegEncContext * s, int block, |
167 |
int *mx_ptr, int *my_ptr, |
168 |
int P[10][2], int pred_x, int pred_y, |
169 |
int xmin, int ymin, int xmax, int ymax, Picture *ref_picture, int16_t (*last_mv)[2], |
170 |
int ref_mv_scale, uint16_t * const mv_penalty); |
171 |
int (*get_mb_score)(struct MpegEncContext * s, int mx, int my, int pred_x, int pred_y, Picture *ref_picture, |
172 |
uint16_t * const mv_penalty);
|
173 |
}MotionEstContext; |
174 |
|
175 |
typedef struct MpegEncContext { |
176 |
struct AVCodecContext *avctx;
|
177 |
/* the following parameters must be initialized before encoding */
|
178 |
int width, height; /* picture size. must be a multiple of 16 */ |
179 |
int gop_size;
|
180 |
int frame_rate; /* number of frames per second */ |
181 |
int intra_only; /* if true, only intra pictures are generated */ |
182 |
int bit_rate; /* wanted bit rate */ |
183 |
int bit_rate_tolerance; /* amount of +- bits (>0)*/ |
184 |
enum OutputFormat out_format; /* output format */ |
185 |
int h263_pred; /* use mpeg4/h263 ac/dc predictions */ |
186 |
|
187 |
/* the following codec id fields are deprecated in favor of codec_id */
|
188 |
int h263_plus; /* h263 plus headers */ |
189 |
int h263_rv10; /* use RV10 variation for H263 */ |
190 |
int h263_msmpeg4; /* generate MSMPEG4 compatible stream (deprecated, use msmpeg4_version instead)*/ |
191 |
int h263_intel; /* use I263 intel h263 header */ |
192 |
|
193 |
int codec_id; /* see CODEC_ID_xxx */ |
194 |
int fixed_qscale; /* fixed qscale if non zero */ |
195 |
float qcompress; /* amount of qscale change between easy & hard scenes (0.0-1.0) */ |
196 |
float qblur; /* amount of qscale smoothing over time (0.0-1.0) */ |
197 |
int qmin; /* min qscale */ |
198 |
int qmax; /* max qscale */ |
199 |
int max_qdiff; /* max qscale difference between frames */ |
200 |
int encoding; /* true if we are encoding (vs decoding) */ |
201 |
int flags; /* AVCodecContext.flags (HQ, MV4, ...) */ |
202 |
int max_b_frames; /* max number of b-frames for encoding */ |
203 |
int b_frame_strategy;
|
204 |
int luma_elim_threshold;
|
205 |
int chroma_elim_threshold;
|
206 |
int strict_std_compliance; /* strictly follow the std (MPEG4, ...) */ |
207 |
int workaround_bugs; /* workaround bugs in encoders which cannot be detected automatically */ |
208 |
/* the following fields are managed internally by the encoder */
|
209 |
|
210 |
/* bit output */
|
211 |
PutBitContext pb; |
212 |
|
213 |
/* sequence parameters */
|
214 |
int context_initialized;
|
215 |
int input_picture_number;
|
216 |
int picture_number;
|
217 |
int picture_in_gop_number; /* 0-> first pic in gop, ... */ |
218 |
int b_frames_since_non_b; /* used for encoding, relative to not yet reordered input */ |
219 |
int mb_width, mb_height; /* number of MBs horizontally & vertically */ |
220 |
int h_edge_pos, v_edge_pos;/* horizontal / vertical position of the right/bottom edge (pixel replicateion)*/ |
221 |
int mb_num; /* number of MBs of a picture */ |
222 |
int linesize; /* line size, in bytes, may be different from width */ |
223 |
int uvlinesize; /* line size, for chroma in bytes, may be different from width */ |
224 |
Picture picture[MAX_PICTURE_COUNT]; /* main picture buffer */
|
225 |
Picture *input_picture[MAX_PICTURE_COUNT]; /* next pictures on display order for encoding*/
|
226 |
Picture *reordered_input_picture[MAX_PICTURE_COUNT]; /* pointer to the next pictures in codedorder for encoding*/
|
227 |
Picture last_picture; /* previous picture */
|
228 |
Picture next_picture; /* previous picture (for bidir pred) */
|
229 |
Picture new_picture; /* source picture for encoding */
|
230 |
Picture current_picture; /* buffer to store the decompressed current picture */
|
231 |
int last_dc[3]; /* last DC values for MPEG1 */ |
232 |
int16_t *dc_val[3]; /* used for mpeg4 DC prediction, all 3 arrays must be continuous */ |
233 |
int y_dc_scale, c_dc_scale;
|
234 |
uint8_t *y_dc_scale_table; /* qscale -> y_dc_scale table */
|
235 |
uint8_t *c_dc_scale_table; /* qscale -> c_dc_scale table */
|
236 |
uint8_t *coded_block; /* used for coded block pattern prediction (msmpeg4v3, wmv1)*/
|
237 |
int16_t (*ac_val[3])[16]; /* used for for mpeg4 AC prediction, all 3 arrays must be continuous */ |
238 |
int ac_pred;
|
239 |
uint8_t *prev_pict_types; /* previous picture types in bitstream order, used for mb skip */
|
240 |
#define PREV_PICT_TYPES_BUFFER_SIZE 256 |
241 |
int mb_skiped; /* MUST BE SET only during DECODING */ |
242 |
uint8_t *mbskip_table; /* used to avoid copy if macroblock skipped (for black regions for example)
|
243 |
and used for b-frame encoding & decoding (contains skip table of next P Frame) */
|
244 |
uint8_t *mbintra_table; /* used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding */
|
245 |
uint8_t *cbp_table; /* used to store cbp, ac_pred for partitioned decoding */
|
246 |
uint8_t *pred_dir_table; /* used to store pred_dir for partitioned decoding */
|
247 |
uint8_t *allocated_edge_emu_buffer; |
248 |
uint8_t *edge_emu_buffer; /* points into the middle of allocated_edge_emu_buffer */
|
249 |
|
250 |
int qscale; /* QP */ |
251 |
float frame_qscale; /* qscale from the frame level rc FIXME remove*/ |
252 |
int adaptive_quant; /* use adaptive quantization */ |
253 |
int dquant; /* qscale difference to prev qscale */ |
254 |
int pict_type; /* I_TYPE, P_TYPE, B_TYPE, ... */ |
255 |
int last_pict_type;
|
256 |
int last_non_b_pict_type; /* used for mpeg4 gmc b-frames & ratecontrol */ |
257 |
int frame_rate_index;
|
258 |
/* motion compensation */
|
259 |
int unrestricted_mv; /* mv can point outside of the coded picture */ |
260 |
int h263_long_vectors; /* use horrible h263v1 long vector mode */ |
261 |
|
262 |
DSPContext dsp; /* pointers for accelerated dsp fucntions */
|
263 |
int f_code; /* forward MV resolution */ |
264 |
int b_code; /* backward MV resolution for B Frames (mpeg4) */ |
265 |
int16_t (*motion_val)[2]; /* used for MV prediction (4MV per MB) */ |
266 |
int16_t (*p_mv_table)[2]; /* MV table (1MV per MB) p-frame encoding */ |
267 |
int16_t (*b_forw_mv_table)[2]; /* MV table (1MV per MB) forward mode b-frame encoding */ |
268 |
int16_t (*b_back_mv_table)[2]; /* MV table (1MV per MB) backward mode b-frame encoding */ |
269 |
int16_t (*b_bidir_forw_mv_table)[2]; /* MV table (1MV per MB) bidir mode b-frame encoding */ |
270 |
int16_t (*b_bidir_back_mv_table)[2]; /* MV table (1MV per MB) bidir mode b-frame encoding */ |
271 |
int16_t (*b_direct_mv_table)[2]; /* MV table (1MV per MB) direct mode b-frame encoding */ |
272 |
int me_method; /* ME algorithm */ |
273 |
int scene_change_score;
|
274 |
int mv_dir;
|
275 |
#define MV_DIR_BACKWARD 1 |
276 |
#define MV_DIR_FORWARD 2 |
277 |
#define MV_DIRECT 4 // bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) |
278 |
int mv_type;
|
279 |
#define MV_TYPE_16X16 0 /* 1 vector for the whole mb */ |
280 |
#define MV_TYPE_8X8 1 /* 4 vectors (h263, mpeg4 4MV) */ |
281 |
#define MV_TYPE_16X8 2 /* 2 vectors, one per 16x8 block */ |
282 |
#define MV_TYPE_FIELD 3 /* 2 vectors, one per field */ |
283 |
#define MV_TYPE_DMV 4 /* 2 vectors, special mpeg2 Dual Prime Vectors */ |
284 |
/* motion vectors for a macroblock
|
285 |
first coordinate : 0 = forward 1 = backward
|
286 |
second " : depend on type
|
287 |
third " : 0 = x, 1 = y
|
288 |
*/
|
289 |
int mv[2][4][2]; |
290 |
int field_select[2][2]; |
291 |
int last_mv[2][2][2]; /* last MV, used for MV prediction in MPEG1 & B-frame MPEG4 */ |
292 |
uint8_t *fcode_tab; /* smallest fcode needed for each MV */
|
293 |
|
294 |
MotionEstContext me; |
295 |
|
296 |
int no_rounding; /* apply no rounding to motion compensation (MPEG4, msmpeg4, ...) |
297 |
for b-frames rounding mode is allways 0 */
|
298 |
|
299 |
int hurry_up; /* when set to 1 during decoding, b frames will be skiped |
300 |
when set to 2 idct/dequant will be skipped too */
|
301 |
|
302 |
/* macroblock layer */
|
303 |
int mb_x, mb_y;
|
304 |
int mb_incr;
|
305 |
int mb_intra;
|
306 |
uint8_t *mb_type; /* Table for MB type */
|
307 |
#define MB_TYPE_INTRA 0x01 |
308 |
#define MB_TYPE_INTER 0x02 |
309 |
#define MB_TYPE_INTER4V 0x04 |
310 |
#define MB_TYPE_SKIPED 0x08 |
311 |
#define MB_TYPE_GMC 0x10 |
312 |
|
313 |
#define MB_TYPE_DIRECT 0x10 |
314 |
#define MB_TYPE_FORWARD 0x20 |
315 |
#define MB_TYPE_BACKWARD 0x40 |
316 |
#define MB_TYPE_BIDIR 0x80 |
317 |
|
318 |
int block_index[6]; /* index to current MB in block based arrays with edges*/ |
319 |
int block_wrap[6]; |
320 |
|
321 |
/* matrix transmitted in the bitstream */
|
322 |
uint16_t intra_matrix[64];
|
323 |
uint16_t chroma_intra_matrix[64];
|
324 |
uint16_t inter_matrix[64];
|
325 |
uint16_t chroma_inter_matrix[64];
|
326 |
#define QUANT_BIAS_SHIFT 4 |
327 |
int intra_quant_bias; /* bias for the quantizer */ |
328 |
int inter_quant_bias; /* bias for the quantizer */ |
329 |
int min_qcoeff; /* minimum encodable coefficient */ |
330 |
int max_qcoeff; /* maximum encodable coefficient */ |
331 |
int ac_esc_length; /* num of bits needed to encode the longest esc */ |
332 |
uint8_t *intra_ac_vlc_length; |
333 |
uint8_t *intra_ac_vlc_last_length; |
334 |
uint8_t *inter_ac_vlc_length; |
335 |
uint8_t *inter_ac_vlc_last_length; |
336 |
uint8_t *luma_dc_vlc_length; |
337 |
uint8_t *chroma_dc_vlc_length; |
338 |
#define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level)) |
339 |
|
340 |
/* precomputed matrix (combine qscale and DCT renorm) */
|
341 |
int __align8 q_intra_matrix[32][64]; |
342 |
int __align8 q_inter_matrix[32][64]; |
343 |
/* identical to the above but for MMX & these are not permutated */
|
344 |
uint16_t __align8 q_intra_matrix16[32][64]; |
345 |
uint16_t __align8 q_inter_matrix16[32][64]; |
346 |
uint16_t __align8 q_intra_matrix16_bias[32][64]; |
347 |
uint16_t __align8 q_inter_matrix16_bias[32][64]; |
348 |
int block_last_index[6]; /* last non zero coefficient in block */ |
349 |
/* scantables */
|
350 |
ScanTable __align8 intra_scantable; |
351 |
ScanTable intra_h_scantable; |
352 |
ScanTable intra_v_scantable; |
353 |
ScanTable inter_scantable; // if inter == intra then intra should be used to reduce tha cache usage
|
354 |
|
355 |
void *opaque; /* private data for the user */ |
356 |
|
357 |
/* bit rate control */
|
358 |
int I_frame_bits; //FIXME used in mpeg12 ... |
359 |
int64_t wanted_bits; |
360 |
int64_t total_bits; |
361 |
int frame_bits; /* bits used for the current frame */ |
362 |
RateControlContext rc_context; // contains stuff only accessed in ratecontrol.c
|
363 |
|
364 |
/* statistics, used for 2-pass encoding */
|
365 |
int mv_bits;
|
366 |
int header_bits;
|
367 |
int i_tex_bits;
|
368 |
int p_tex_bits;
|
369 |
int i_count;
|
370 |
int f_count;
|
371 |
int b_count;
|
372 |
int skip_count;
|
373 |
int misc_bits; // cbp, mb_type |
374 |
int last_bits; //temp var used for calculating the above vars |
375 |
|
376 |
/* error concealment / resync */
|
377 |
uint8_t *error_status_table; /* table of the error status of each MB */
|
378 |
#define VP_START 1 /* current MB is the first after a resync marker */ |
379 |
#define AC_ERROR 2 |
380 |
#define DC_ERROR 4 |
381 |
#define MV_ERROR 8 |
382 |
#define AC_END 16 |
383 |
#define DC_END 32 |
384 |
#define MV_END 64 |
385 |
//FIXME some prefix?
|
386 |
|
387 |
int resync_mb_x; /* x position of last resync marker */ |
388 |
int resync_mb_y; /* y position of last resync marker */ |
389 |
GetBitContext last_resync_gb; /* used to search for the next resync marker */
|
390 |
int mb_num_left; /* number of MBs left in this video packet (for partitioned Slices only)*/ |
391 |
int next_p_frame_damaged; /* set if the next p frame is damaged, to avoid showing trashed b frames */ |
392 |
int error_resilience;
|
393 |
|
394 |
ParseContext parse_context; |
395 |
|
396 |
/* H.263 specific */
|
397 |
int gob_number;
|
398 |
int gob_index;
|
399 |
|
400 |
/* H.263+ specific */
|
401 |
int umvplus; /* == H263+ && unrestricted_mv */ |
402 |
int h263_aic; /* Advanded INTRA Coding (AIC) */ |
403 |
int h263_aic_dir; /* AIC direction: 0 = left, 1 = top */ |
404 |
|
405 |
/* mpeg4 specific */
|
406 |
int time_increment_resolution;
|
407 |
int time_increment_bits; /* number of bits to represent the fractional part of time */ |
408 |
int last_time_base;
|
409 |
int time_base; /* time in seconds of last I,P,S Frame */ |
410 |
int64_t time; /* time of current frame */
|
411 |
int64_t last_non_b_time; |
412 |
uint16_t pp_time; /* time distance between the last 2 p,s,i frames */
|
413 |
uint16_t pb_time; /* time distance between the last b and p,s,i frame */
|
414 |
uint16_t pp_field_time; |
415 |
uint16_t pb_field_time; /* like above, just for interlaced */
|
416 |
int shape;
|
417 |
int vol_sprite_usage;
|
418 |
int sprite_width;
|
419 |
int sprite_height;
|
420 |
int sprite_left;
|
421 |
int sprite_top;
|
422 |
int sprite_brightness_change;
|
423 |
int num_sprite_warping_points;
|
424 |
int real_sprite_warping_points;
|
425 |
int sprite_offset[2][2]; /* sprite offset[isChroma][isMVY] */ |
426 |
int sprite_delta[2][2]; /* sprite_delta [isY][isMVY] */ |
427 |
int sprite_shift[2]; /* sprite shift [isChroma] */ |
428 |
int mcsel;
|
429 |
int quant_precision;
|
430 |
int quarter_sample; /* 1->qpel, 0->half pel ME/MC */ |
431 |
int scalability;
|
432 |
int hierachy_type;
|
433 |
int enhancement_type;
|
434 |
int new_pred;
|
435 |
int reduced_res_vop;
|
436 |
int aspect_ratio_info;
|
437 |
int aspected_width;
|
438 |
int aspected_height;
|
439 |
int sprite_warping_accuracy;
|
440 |
int low_latency_sprite;
|
441 |
int data_partitioning; /* data partitioning flag from header */ |
442 |
int partitioned_frame; /* is current frame partitioned */ |
443 |
int rvlc; /* reversible vlc */ |
444 |
int resync_marker; /* could this stream contain resync markers*/ |
445 |
int low_delay; /* no reordering needed / has no b-frames */ |
446 |
int vo_type;
|
447 |
int vol_control_parameters; /* does the stream contain the low_delay flag, used to workaround buggy encoders */ |
448 |
PutBitContext tex_pb; /* used for data partitioned VOPs */
|
449 |
PutBitContext pb2; /* used for data partitioned VOPs */
|
450 |
#define PB_BUFFER_SIZE 1024*256 |
451 |
uint8_t *tex_pb_buffer; |
452 |
uint8_t *pb2_buffer; |
453 |
int mpeg_quant;
|
454 |
#define CO_LOCATED_TYPE_4MV 1 |
455 |
#define CO_LOCATED_TYPE_FIELDMV 2 |
456 |
int8_t *co_located_type_table; /* 4mv & field_mv info for next b frame */
|
457 |
int16_t (*field_mv_table)[2][2]; /* used for interlaced b frame decoding */ |
458 |
int8_t (*field_select_table)[2]; /* wtf, no really another table for interlaced b frames */ |
459 |
int t_frame; /* time distance of first I -> B, used for interlaced b frames */ |
460 |
int padding_bug_score; /* used to detect the VERY common padding bug in MPEG4 */ |
461 |
|
462 |
/* divx specific, used to workaround (many) bugs in divx5 */
|
463 |
int divx_version;
|
464 |
int divx_build;
|
465 |
#define BITSTREAM_BUFFER_SIZE 1024*256 |
466 |
uint8_t *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them
|
467 |
int bitstream_buffer_size;
|
468 |
|
469 |
int xvid_build;
|
470 |
|
471 |
/* lavc specific stuff, used to workaround bugs in libavcodec */
|
472 |
int ffmpeg_version;
|
473 |
int lavc_build;
|
474 |
|
475 |
/* RV10 specific */
|
476 |
int rv10_version; /* RV10 version: 0 or 3 */ |
477 |
int rv10_first_dc_coded[3]; |
478 |
|
479 |
/* MJPEG specific */
|
480 |
struct MJpegContext *mjpeg_ctx;
|
481 |
int mjpeg_vsample[3]; /* vertical sampling factors, default = {2, 1, 1} */ |
482 |
int mjpeg_hsample[3]; /* horizontal sampling factors, default = {2, 1, 1} */ |
483 |
int mjpeg_write_tables; /* do we want to have quantisation- and |
484 |
huffmantables in the jpeg file ? */
|
485 |
int mjpeg_data_only_frames; /* frames only with SOI, SOS and EOI markers */ |
486 |
|
487 |
/* MSMPEG4 specific */
|
488 |
int mv_table_index;
|
489 |
int rl_table_index;
|
490 |
int rl_chroma_table_index;
|
491 |
int dc_table_index;
|
492 |
int use_skip_mb_code;
|
493 |
int slice_height; /* in macroblocks */ |
494 |
int first_slice_line; /* used in mpeg4 too to handle resync markers */ |
495 |
int flipflop_rounding;
|
496 |
int msmpeg4_version; /* 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8*/ |
497 |
int per_mb_rl_table;
|
498 |
int esc3_level_length;
|
499 |
int esc3_run_length;
|
500 |
/* [mb_intra][isChroma][level][run][last] */
|
501 |
int (*ac_stats)[2][MAX_LEVEL+1][MAX_RUN+1][2]; |
502 |
int inter_intra_pred;
|
503 |
int mspel;
|
504 |
|
505 |
/* decompression specific */
|
506 |
GetBitContext gb; |
507 |
|
508 |
/* Mpeg1 specific */
|
509 |
int fake_picture_number; /* picture number at the bitstream frame rate */ |
510 |
int gop_picture_number; /* index of the first picture of a GOP based on fake_pic_num & mpeg1 specific */ |
511 |
int last_mv_dir; /* last mv_dir, used for b frame encoding */ |
512 |
|
513 |
/* MPEG2 specific - I wish I had not to support this mess. */
|
514 |
int progressive_sequence;
|
515 |
int mpeg_f_code[2][2]; |
516 |
int picture_structure;
|
517 |
/* picture type */
|
518 |
#define PICT_TOP_FIELD 1 |
519 |
#define PICT_BOTTOM_FIELD 2 |
520 |
#define PICT_FRAME 3 |
521 |
|
522 |
int intra_dc_precision;
|
523 |
int frame_pred_frame_dct;
|
524 |
int top_field_first;
|
525 |
int concealment_motion_vectors;
|
526 |
int q_scale_type;
|
527 |
int intra_vlc_format;
|
528 |
int alternate_scan;
|
529 |
int repeat_first_field;
|
530 |
int chroma_420_type;
|
531 |
int progressive_frame;
|
532 |
int mpeg2;
|
533 |
int full_pel[2]; |
534 |
int interlaced_dct;
|
535 |
int first_slice;
|
536 |
int first_field;
|
537 |
|
538 |
/* RTP specific */
|
539 |
/* These are explained on avcodec.h */
|
540 |
int rtp_mode;
|
541 |
int rtp_payload_size;
|
542 |
void (*rtp_callback)(void *data, int size, int packet_number); |
543 |
uint8_t *ptr_lastgob; |
544 |
uint8_t *ptr_last_mb_line; |
545 |
uint32_t mb_line_avgsize; |
546 |
|
547 |
DCTELEM (*block)[64]; /* points to one of the following blocks */ |
548 |
DCTELEM blocks[2][6][64] __align8; // for HQ mode we need to keep the best block |
549 |
int (*decode_mb)(struct MpegEncContext *s, DCTELEM block[6][64]); // used by some codecs to avoid a switch() |
550 |
#define SLICE_OK 0 |
551 |
#define SLICE_ERROR -1 |
552 |
#define SLICE_END -2 //end marker found |
553 |
#define SLICE_NOEND -3 //no end marker or error found but mb count exceeded |
554 |
|
555 |
void (*dct_unquantize_mpeg1)(struct MpegEncContext *s, |
556 |
DCTELEM *block/*align 16*/, int n, int qscale); |
557 |
void (*dct_unquantize_mpeg2)(struct MpegEncContext *s, |
558 |
DCTELEM *block/*align 16*/, int n, int qscale); |
559 |
void (*dct_unquantize_h263)(struct MpegEncContext *s, |
560 |
DCTELEM *block/*align 16*/, int n, int qscale); |
561 |
void (*dct_unquantize)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both) |
562 |
DCTELEM *block/*align 16*/, int n, int qscale); |
563 |
int (*dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow); |
564 |
int (*fast_dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow); |
565 |
} MpegEncContext; |
566 |
|
567 |
|
568 |
int DCT_common_init(MpegEncContext *s);
|
569 |
int MPV_common_init(MpegEncContext *s);
|
570 |
void MPV_common_end(MpegEncContext *s);
|
571 |
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); |
572 |
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx);
|
573 |
void MPV_frame_end(MpegEncContext *s);
|
574 |
int MPV_encode_init(AVCodecContext *avctx);
|
575 |
int MPV_encode_end(AVCodecContext *avctx);
|
576 |
int MPV_encode_picture(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data); |
577 |
#ifdef HAVE_MMX
|
578 |
void MPV_common_init_mmx(MpegEncContext *s);
|
579 |
#endif
|
580 |
#ifdef ARCH_ALPHA
|
581 |
void MPV_common_init_axp(MpegEncContext *s);
|
582 |
#endif
|
583 |
#ifdef HAVE_MLIB
|
584 |
void MPV_common_init_mlib(MpegEncContext *s);
|
585 |
#endif
|
586 |
#ifdef HAVE_MMI
|
587 |
void MPV_common_init_mmi(MpegEncContext *s);
|
588 |
#endif
|
589 |
#ifdef ARCH_ARMV4L
|
590 |
void MPV_common_init_armv4l(MpegEncContext *s);
|
591 |
#endif
|
592 |
#ifdef ARCH_POWERPC
|
593 |
void MPV_common_init_ppc(MpegEncContext *s);
|
594 |
#endif
|
595 |
extern void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w); |
596 |
void ff_conceal_past_errors(MpegEncContext *s, int conceal_all); |
597 |
void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length); |
598 |
void ff_clean_intra_table_entries(MpegEncContext *s);
|
599 |
void ff_init_scantable(MpegEncContext *s, ScanTable *st, const uint8_t *src_scantable); |
600 |
void ff_error_resilience(MpegEncContext *s);
|
601 |
void ff_draw_horiz_band(MpegEncContext *s, int y, int h); |
602 |
void ff_emulated_edge_mc(MpegEncContext *s, uint8_t *src, int linesize, int block_w, int block_h, |
603 |
int src_x, int src_y, int w, int h); |
604 |
char ff_get_pict_type_char(int pict_type); |
605 |
int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size); |
606 |
|
607 |
extern enum PixelFormat ff_yuv420p_list[2]; |
608 |
|
609 |
static inline void ff_init_block_index(MpegEncContext *s){ |
610 |
s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2; |
611 |
s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2; |
612 |
s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2; |
613 |
s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2; |
614 |
s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x; |
615 |
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; |
616 |
} |
617 |
|
618 |
static inline void ff_update_block_index(MpegEncContext *s){ |
619 |
s->block_index[0]+=2; |
620 |
s->block_index[1]+=2; |
621 |
s->block_index[2]+=2; |
622 |
s->block_index[3]+=2; |
623 |
s->block_index[4]++;
|
624 |
s->block_index[5]++;
|
625 |
} |
626 |
|
627 |
|
628 |
/* motion_est.c */
|
629 |
void ff_estimate_p_frame_motion(MpegEncContext * s,
|
630 |
int mb_x, int mb_y); |
631 |
void ff_estimate_b_frame_motion(MpegEncContext * s,
|
632 |
int mb_x, int mb_y); |
633 |
int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type); |
634 |
void ff_fix_long_p_mvs(MpegEncContext * s);
|
635 |
void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, int type); |
636 |
void ff_init_me(MpegEncContext *s);
|
637 |
int ff_pre_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); |
638 |
|
639 |
|
640 |
/* mpeg12.c */
|
641 |
extern const int16_t ff_mpeg1_default_intra_matrix[64]; |
642 |
extern const int16_t ff_mpeg1_default_non_intra_matrix[64]; |
643 |
extern uint8_t ff_mpeg1_dc_scale_table[128]; |
644 |
|
645 |
void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number); |
646 |
void mpeg1_encode_mb(MpegEncContext *s,
|
647 |
DCTELEM block[6][64], |
648 |
int motion_x, int motion_y); |
649 |
void ff_mpeg1_encode_init(MpegEncContext *s);
|
650 |
|
651 |
|
652 |
/* h263enc.c */
|
653 |
typedef struct RLTable { |
654 |
int n; /* number of entries of table_vlc minus 1 */ |
655 |
int last; /* number of values for last = 0 */ |
656 |
const uint16_t (*table_vlc)[2]; |
657 |
const int8_t *table_run;
|
658 |
const int8_t *table_level;
|
659 |
uint8_t *index_run[2]; /* encoding only */ |
660 |
int8_t *max_level[2]; /* encoding & decoding */ |
661 |
int8_t *max_run[2]; /* encoding & decoding */ |
662 |
VLC vlc; /* decoding only deprected FIXME remove*/
|
663 |
RL_VLC_ELEM *rl_vlc[32]; /* decoding only */ |
664 |
} RLTable; |
665 |
|
666 |
void init_rl(RLTable *rl);
|
667 |
void init_vlc_rl(RLTable *rl);
|
668 |
|
669 |
static inline int get_rl_index(const RLTable *rl, int last, int run, int level) |
670 |
{ |
671 |
int index;
|
672 |
index = rl->index_run[last][run]; |
673 |
if (index >= rl->n)
|
674 |
return rl->n;
|
675 |
if (level > rl->max_level[last][run])
|
676 |
return rl->n;
|
677 |
return index + level - 1; |
678 |
} |
679 |
|
680 |
extern uint8_t ff_mpeg4_y_dc_scale_table[32]; |
681 |
extern uint8_t ff_mpeg4_c_dc_scale_table[32]; |
682 |
extern const int16_t ff_mpeg4_default_intra_matrix[64]; |
683 |
extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; |
684 |
int ff_h263_decode_init(AVCodecContext *avctx);
|
685 |
int ff_h263_decode_frame(AVCodecContext *avctx,
|
686 |
void *data, int *data_size, |
687 |
uint8_t *buf, int buf_size);
|
688 |
int ff_h263_decode_end(AVCodecContext *avctx);
|
689 |
void h263_encode_mb(MpegEncContext *s,
|
690 |
DCTELEM block[6][64], |
691 |
int motion_x, int motion_y); |
692 |
void mpeg4_encode_mb(MpegEncContext *s,
|
693 |
DCTELEM block[6][64], |
694 |
int motion_x, int motion_y); |
695 |
void h263_encode_picture_header(MpegEncContext *s, int picture_number); |
696 |
int h263_encode_gob_header(MpegEncContext * s, int mb_line); |
697 |
int16_t *h263_pred_motion(MpegEncContext * s, int block,
|
698 |
int *px, int *py); |
699 |
void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
700 |
int dir);
|
701 |
void ff_set_mpeg4_time(MpegEncContext * s, int picture_number); |
702 |
void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); |
703 |
void h263_encode_init(MpegEncContext *s);
|
704 |
void h263_decode_init_vlc(MpegEncContext *s);
|
705 |
int h263_decode_picture_header(MpegEncContext *s);
|
706 |
int ff_h263_decode_gob_header(MpegEncContext *s);
|
707 |
int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
|
708 |
|
709 |
|
710 |
int intel_h263_decode_picture_header(MpegEncContext *s);
|
711 |
int ff_h263_decode_mb(MpegEncContext *s,
|
712 |
DCTELEM block[6][64]); |
713 |
int h263_get_picture_format(int width, int height); |
714 |
void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
|
715 |
void ff_mpeg4_clean_buffers(MpegEncContext *s);
|
716 |
void ff_mpeg4_stuffing(PutBitContext * pbc);
|
717 |
void ff_mpeg4_init_partitions(MpegEncContext *s);
|
718 |
void ff_mpeg4_merge_partitions(MpegEncContext *s);
|
719 |
void ff_clean_mpeg4_qscales(MpegEncContext *s);
|
720 |
void ff_clean_h263_qscales(MpegEncContext *s);
|
721 |
int ff_mpeg4_decode_partitions(MpegEncContext *s);
|
722 |
int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
|
723 |
int ff_h263_resync(MpegEncContext *s);
|
724 |
int ff_h263_get_gob_height(MpegEncContext *s);
|
725 |
void ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my); |
726 |
inline int ff_h263_round_chroma(int x); |
727 |
|
728 |
|
729 |
/* rv10.c */
|
730 |
void rv10_encode_picture_header(MpegEncContext *s, int picture_number); |
731 |
int rv_decode_dc(MpegEncContext *s, int n); |
732 |
|
733 |
|
734 |
/* msmpeg4.c */
|
735 |
void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number); |
736 |
void msmpeg4_encode_ext_header(MpegEncContext * s);
|
737 |
void msmpeg4_encode_mb(MpegEncContext * s,
|
738 |
DCTELEM block[6][64], |
739 |
int motion_x, int motion_y); |
740 |
int msmpeg4_decode_picture_header(MpegEncContext * s);
|
741 |
int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size); |
742 |
int ff_msmpeg4_decode_init(MpegEncContext *s);
|
743 |
void ff_msmpeg4_encode_init(MpegEncContext *s);
|
744 |
int ff_wmv2_decode_picture_header(MpegEncContext * s);
|
745 |
void ff_wmv2_add_mb(MpegEncContext *s, DCTELEM block[6][64], uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr); |
746 |
void ff_mspel_motion(MpegEncContext *s,
|
747 |
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
748 |
uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
|
749 |
int motion_x, int motion_y, int h); |
750 |
int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number); |
751 |
void ff_wmv2_encode_mb(MpegEncContext * s,
|
752 |
DCTELEM block[6][64], |
753 |
int motion_x, int motion_y); |
754 |
|
755 |
/* mjpegenc.c */
|
756 |
int mjpeg_init(MpegEncContext *s);
|
757 |
void mjpeg_close(MpegEncContext *s);
|
758 |
void mjpeg_encode_mb(MpegEncContext *s,
|
759 |
DCTELEM block[6][64]); |
760 |
void mjpeg_picture_header(MpegEncContext *s);
|
761 |
void mjpeg_picture_trailer(MpegEncContext *s);
|
762 |
|
763 |
|
764 |
/* rate control */
|
765 |
int ff_rate_control_init(MpegEncContext *s);
|
766 |
float ff_rate_estimate_qscale(MpegEncContext *s);
|
767 |
void ff_write_pass1_stats(MpegEncContext *s);
|
768 |
void ff_rate_control_uninit(MpegEncContext *s);
|
769 |
double ff_eval(char *s, double *const_value, const char **const_name, |
770 |
double (**func1)(void *, double), const char **func1_name, |
771 |
double (**func2)(void *, double, double), char **func2_name, |
772 |
void *opaque);
|
773 |
|
774 |
|
775 |
#endif /* AVCODEC_MPEGVIDEO_H */ |