Commit | Line | Data |
---|---|---|
de6d9b64 FB |
1 | /* |
2 | * Generic DCT based hybrid video encoder | |
ff4ec49e | 3 | * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. |
8f2ab833 | 4 | * Copyright (c) 2002-2004 Michael Niedermayer |
de6d9b64 | 5 | * |
ff4ec49e FB |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public | |
8 | * License as published by the Free Software Foundation; either | |
9 | * version 2 of the License, or (at your option) any later version. | |
de6d9b64 | 10 | * |
ff4ec49e | 11 | * This library is distributed in the hope that it will be useful, |
de6d9b64 | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ff4ec49e FB |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. | |
de6d9b64 | 15 | * |
ff4ec49e FB |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with this library; if not, write to the Free Software | |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
de6d9b64 FB |
19 | */ |
20 | ||
983e3246 MN |
21 | /** |
22 | * @file mpegvideo.h | |
23 | * mpegvideo header. | |
24 | */ | |
25 | ||
cd4af68a ZK |
26 | #ifndef AVCODEC_MPEGVIDEO_H |
27 | #define AVCODEC_MPEGVIDEO_H | |
28 | ||
5c91a675 | 29 | #include "dsputil.h" |
caa336b4 | 30 | #include "bitstream.h" |
5c91a675 | 31 | |
160d679c | 32 | #define FRAME_SKIPPED 100 ///< return value for header parsers if frame is not coded |
eec1c6b9 | 33 | |
de6d9b64 FB |
34 | enum OutputFormat { |
35 | FMT_MPEG1, | |
c6148de2 | 36 | FMT_H261, |
de6d9b64 | 37 | FMT_H263, |
9dbcbd92 | 38 | FMT_MJPEG, |
0da71265 | 39 | FMT_H264, |
de6d9b64 FB |
40 | }; |
41 | ||
1e491e29 MN |
42 | #define EDGE_WIDTH 16 |
43 | ||
de6d9b64 FB |
44 | #define MPEG_BUF_SIZE (16 * 1024) |
45 | ||
ad324c93 MN |
46 | #define QMAT_SHIFT_MMX 16 |
47 | #define QMAT_SHIFT 22 | |
2f349de2 | 48 | |
45870f57 MN |
49 | #define MAX_FCODE 7 |
50 | #define MAX_MV 2048 | |
1e491e29 | 51 | |
9c3d33d6 MN |
52 | #define MAX_THREADS 8 |
53 | ||
5cbb0e70 | 54 | #define MAX_PICTURE_COUNT 32 |
45870f57 | 55 | |
7f2fe444 MN |
56 | #define ME_MAP_SIZE 64 |
57 | #define ME_MAP_SHIFT 3 | |
58 | #define ME_MAP_MV_BITS 11 | |
59 | ||
0151a6f5 MN |
60 | /* run length table */ |
61 | #define MAX_RUN 64 | |
62 | #define MAX_LEVEL 64 | |
63 | ||
277f4827 MN |
64 | #define I_TYPE FF_I_TYPE ///< Intra |
65 | #define P_TYPE FF_P_TYPE ///< Predicted | |
66 | #define B_TYPE FF_B_TYPE ///< Bi-dir predicted | |
67 | #define S_TYPE FF_S_TYPE ///< S(GMC)-VOP MPEG4 | |
0da71265 MN |
68 | #define SI_TYPE FF_SI_TYPE ///< Switching Intra |
69 | #define SP_TYPE FF_SP_TYPE ///< Switching Predicted | |
140cb663 | 70 | |
0ecca7a4 MN |
71 | #define MAX_MB_BYTES (30*16*16*3/8 + 120) |
72 | ||
9cdd6a24 MN |
73 | typedef struct Predictor{ |
74 | double coeff; | |
75 | double count; | |
76 | double decay; | |
77 | } Predictor; | |
78 | ||
8b4c7dbc MN |
79 | typedef struct RateControlEntry{ |
80 | int pict_type; | |
c5d309f2 | 81 | float qscale; |
8b4c7dbc MN |
82 | int mv_bits; |
83 | int i_tex_bits; | |
84 | int p_tex_bits; | |
85 | int misc_bits; | |
0c1a9eda | 86 | uint64_t expected_bits; |
8b4c7dbc MN |
87 | int new_pict_type; |
88 | float new_qscale; | |
3aa102be MN |
89 | int mc_mb_var_sum; |
90 | int mb_var_sum; | |
91 | int i_count; | |
92 | int f_code; | |
93 | int b_code; | |
8b4c7dbc MN |
94 | }RateControlEntry; |
95 | ||
277f4827 MN |
96 | /** |
97 | * rate control context. | |
98 | */ | |
8b4c7dbc MN |
99 | typedef struct RateControlContext{ |
100 | FILE *stats_file; | |
277f4827 | 101 | int num_entries; ///< number of RateControlEntries |
8b4c7dbc | 102 | RateControlEntry *entry; |
fb066639 | 103 | double buffer_index; ///< amount of bits in the video/audio buffer |
3aa102be | 104 | Predictor pred[5]; |
277f4827 MN |
105 | double short_term_qsum; ///< sum of recent qscales |
106 | double short_term_qcount; ///< count of recent qscales | |
107 | double pass1_rc_eq_output_sum;///< sum of the output of the rc equation, this is used for normalization | |
108 | double pass1_wanted_bits; ///< bits which should have been outputed by the pass1 code (including complexity init) | |
3aa102be | 109 | double last_qscale; |
277f4827 | 110 | double last_qscale_for[5]; ///< last qscale for a specific pict type, used for max_diff & ipb factor stuff |
3aa102be MN |
111 | int last_mc_mb_var_sum; |
112 | int last_mb_var_sum; | |
0c1a9eda ZK |
113 | uint64_t i_cplx_sum[5]; |
114 | uint64_t p_cplx_sum[5]; | |
115 | uint64_t mv_bits_sum[5]; | |
116 | uint64_t qscale_sum[5]; | |
3aa102be | 117 | int frame_count[5]; |
947ac25a | 118 | int last_non_b_pict_type; |
8b4c7dbc MN |
119 | }RateControlContext; |
120 | ||
277f4827 MN |
121 | /** |
122 | * Scantable. | |
123 | */ | |
2ad1516a | 124 | typedef struct ScanTable{ |
0c1a9eda ZK |
125 | const uint8_t *scantable; |
126 | uint8_t permutated[64]; | |
127 | uint8_t raster_end[64]; | |
05c4072b | 128 | #ifdef ARCH_POWERPC |
277f4827 | 129 | /** Used by dct_quantise_alitvec to find last-non-zero */ |
0c1a9eda | 130 | uint8_t __align8 inverse[64]; |
05c4072b | 131 | #endif |
2ad1516a MN |
132 | } ScanTable; |
133 | ||
277f4827 MN |
134 | /** |
135 | * Picture. | |
136 | */ | |
1e491e29 | 137 | typedef struct Picture{ |
492cd3a9 | 138 | FF_COMMON_FRAME |
1e491e29 | 139 | |
0da71265 MN |
140 | /** |
141 | * halfpel luma planes. | |
142 | */ | |
143 | uint8_t *interpolated[3]; | |
b40cd4e0 | 144 | int16_t (*motion_val_base[2])[2]; |
7bc9090a | 145 | uint32_t *mb_type_base; |
bb198e19 | 146 | #define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if theres just one type |
0da71265 MN |
147 | #define IS_INTRA4x4(a) ((a)&MB_TYPE_INTRA4x4) |
148 | #define IS_INTRA16x16(a) ((a)&MB_TYPE_INTRA16x16) | |
7bc9090a MN |
149 | #define IS_PCM(a) ((a)&MB_TYPE_INTRA_PCM) |
150 | #define IS_INTRA(a) ((a)&7) | |
0da71265 | 151 | #define IS_INTER(a) ((a)&(MB_TYPE_16x16|MB_TYPE_16x8|MB_TYPE_8x16|MB_TYPE_8x8)) |
7bc9090a | 152 | #define IS_SKIP(a) ((a)&MB_TYPE_SKIP) |
0da71265 MN |
153 | #define IS_INTRA_PCM(a) ((a)&MB_TYPE_INTRA_PCM) |
154 | #define IS_INTERLACED(a) ((a)&MB_TYPE_INTERLACED) | |
155 | #define IS_DIRECT(a) ((a)&MB_TYPE_DIRECT2) | |
7bc9090a | 156 | #define IS_GMC(a) ((a)&MB_TYPE_GMC) |
0da71265 MN |
157 | #define IS_16X16(a) ((a)&MB_TYPE_16x16) |
158 | #define IS_16X8(a) ((a)&MB_TYPE_16x8) | |
159 | #define IS_8X16(a) ((a)&MB_TYPE_8x16) | |
160 | #define IS_8X8(a) ((a)&MB_TYPE_8x8) | |
161 | #define IS_SUB_8X8(a) ((a)&MB_TYPE_16x16) //note reused | |
162 | #define IS_SUB_8X4(a) ((a)&MB_TYPE_16x8) //note reused | |
163 | #define IS_SUB_4X8(a) ((a)&MB_TYPE_8x16) //note reused | |
164 | #define IS_SUB_4X4(a) ((a)&MB_TYPE_8x8) //note reused | |
7bc9090a MN |
165 | #define IS_ACPRED(a) ((a)&MB_TYPE_ACPRED) |
166 | #define IS_QUANT(a) ((a)&MB_TYPE_QUANT) | |
0da71265 MN |
167 | #define IS_DIR(a, part, list) ((a) & (MB_TYPE_P0L0<<((part)+2*(list)))) |
168 | #define USES_LIST(a, list) ((a) & ((MB_TYPE_P0L0|MB_TYPE_P1L0)<<(2*(list)))) ///< does this mb use listX, note doesnt work if subMBs | |
b40cd4e0 | 169 | #define HAS_CBP(a) ((a)&MB_TYPE_CBP) |
0da71265 | 170 | |
0da71265 MN |
171 | int field_poc[2]; ///< h264 top/bottom POC |
172 | int poc; ///< h264 frame POC | |
173 | int frame_num; ///< h264 frame_num | |
174 | int pic_id; ///< h264 pic_num or long_term_pic_idx | |
175 | int long_ref; ///< 1->long term reference 0->short term reference | |
2f944356 LM |
176 | int ref_poc[2][16]; ///< h264 POCs of the frames used as reference |
177 | int ref_count[2]; ///< number of entries in ref_poc | |
0da71265 | 178 | |
277f4827 MN |
179 | int mb_var_sum; ///< sum of MB variance for current frame |
180 | int mc_mb_var_sum; ///< motion compensated MB variance for current frame | |
181 | uint16_t *mb_var; ///< Table for MB variances | |
182 | uint16_t *mc_mb_var; ///< Table for motion compensated MB variances | |
183 | uint8_t *mb_mean; ///< Table for MB luminance | |
bb628dae | 184 | int32_t *mb_cmp_score; ///< Table for MB cmp scores, for mb decision FIXME remove |
0d1e9246 | 185 | int b_frame_score; /* */ |
1e491e29 MN |
186 | } Picture; |
187 | ||
d7425f59 | 188 | typedef struct ParseContext{ |
0c1a9eda | 189 | uint8_t *buffer; |
d7425f59 MN |
190 | int index; |
191 | int last_index; | |
192 | int buffer_size; | |
bb463d81 | 193 | uint32_t state; ///< contains the last few bytes in MSB order |
d7425f59 | 194 | int frame_start_found; |
bb463d81 MN |
195 | int overread; ///< the number of bytes which where irreversibly read from the next frame |
196 | int overread_index; ///< the index into ParseContext.buffer of the overreaded bytes | |
d7425f59 MN |
197 | } ParseContext; |
198 | ||
1457ab52 MN |
199 | struct MpegEncContext; |
200 | ||
277f4827 MN |
201 | /** |
202 | * Motion estimation context. | |
203 | */ | |
1457ab52 | 204 | typedef struct MotionEstContext{ |
1f202b0d | 205 | AVCodecContext *avctx; |
160d679c | 206 | int skip; ///< set if ME is skipped for the current MB |
277f4827 | 207 | int co_located_mv[4][2]; ///< mv from last p frame for direct mode ME |
1457ab52 | 208 | int direct_basis_mv[4][2]; |
277f4827 | 209 | uint8_t *scratchpad; ///< data area for the me algo, so that the ME doesnt need to malloc/free |
2750b827 MN |
210 | uint8_t *best_mb; |
211 | uint8_t *temp_mb[2]; | |
212 | uint8_t *temp; | |
213 | int best_bits; | |
277f4827 MN |
214 | uint32_t *map; ///< map to avoid duplicate evaluations |
215 | uint32_t *score_map; ///< map to store the scores | |
1457ab52 | 216 | int map_generation; |
826f429a | 217 | int pre_penalty_factor; |
1457ab52 MN |
218 | int penalty_factor; |
219 | int sub_penalty_factor; | |
67725183 | 220 | int mb_penalty_factor; |
2750b827 MN |
221 | int flags; |
222 | int sub_flags; | |
223 | int mb_flags; | |
277f4827 | 224 | int pre_pass; ///< = 1 for the pre pass |
826f429a | 225 | int dia_size; |
bb198e19 MN |
226 | int xmin; |
227 | int xmax; | |
228 | int ymin; | |
229 | int ymax; | |
2750b827 MN |
230 | int pred_x; |
231 | int pred_y; | |
232 | uint8_t *src[4][4]; | |
233 | uint8_t *ref[4][4]; | |
234 | int stride; | |
235 | int uvstride; | |
1f202b0d MN |
236 | /* temp variables for picture complexity calculation */ |
237 | int mc_mb_var_sum_temp; | |
238 | int mb_var_sum_temp; | |
239 | int scene_change_score; | |
2750b827 MN |
240 | /* cmp, chroma_cmp;*/ |
241 | op_pixels_func (*hpel_put)[4]; | |
242 | op_pixels_func (*hpel_avg)[4]; | |
2750b827 MN |
243 | qpel_mc_func (*qpel_put)[16]; |
244 | qpel_mc_func (*qpel_avg)[16]; | |
30952237 | 245 | uint8_t (*mv_penalty)[MAX_MV*2+1]; ///< amount of bits needed to encode a MV |
2750b827 | 246 | uint8_t *current_mv_penalty; |
1457ab52 MN |
247 | int (*sub_motion_search)(struct MpegEncContext * s, |
248 | int *mx_ptr, int *my_ptr, int dmin, | |
2750b827 MN |
249 | int src_index, int ref_index, |
250 | int size, int h); | |
1457ab52 MN |
251 | }MotionEstContext; |
252 | ||
277f4827 MN |
253 | /** |
254 | * MpegEncContext. | |
255 | */ | |
de6d9b64 | 256 | typedef struct MpegEncContext { |
58f26ba9 | 257 | struct AVCodecContext *avctx; |
de6d9b64 | 258 | /* the following parameters must be initialized before encoding */ |
277f4827 | 259 | int width, height;///< picture size. must be a multiple of 16 |
de6d9b64 | 260 | int gop_size; |
277f4827 MN |
261 | int intra_only; ///< if true, only intra pictures are generated |
262 | int bit_rate; ///< wanted bit rate | |
277f4827 MN |
263 | enum OutputFormat out_format; ///< output format |
264 | int h263_pred; ///< use mpeg4/h263 ac/dc predictions | |
d7e9533a MN |
265 | |
266 | /* the following codec id fields are deprecated in favor of codec_id */ | |
277f4827 | 267 | int h263_plus; ///< h263 plus headers |
277f4827 | 268 | int h263_msmpeg4; ///< generate MSMPEG4 compatible stream (deprecated, use msmpeg4_version instead) |
d4f5d74a | 269 | int h263_flv; ///< use flv h263 header |
d7e9533a | 270 | |
0f242af2 | 271 | enum CodecID codec_id; /* see CODEC_ID_xxx */ |
277f4827 | 272 | int fixed_qscale; ///< fixed qscale if non zero |
277f4827 MN |
273 | int encoding; ///< true if we are encoding (vs decoding) |
274 | int flags; ///< AVCodecContext.flags (HQ, MV4, ...) | |
303e50e6 | 275 | int flags2; ///< AVCodecContext.flags2 |
277f4827 | 276 | int max_b_frames; ///< max number of b-frames for encoding |
7f2fe444 MN |
277 | int luma_elim_threshold; |
278 | int chroma_elim_threshold; | |
277f4827 MN |
279 | int strict_std_compliance; ///< strictly follow the std (MPEG4, ...) |
280 | int workaround_bugs; ///< workaround bugs in encoders which cannot be detected automatically | |
de6d9b64 FB |
281 | /* the following fields are managed internally by the encoder */ |
282 | ||
277f4827 | 283 | /** bit output */ |
de6d9b64 FB |
284 | PutBitContext pb; |
285 | ||
286 | /* sequence parameters */ | |
287 | int context_initialized; | |
1031fabd MN |
288 | int input_picture_number; ///< used to set pic->display_picture_number, shouldnt be used for/by anything else |
289 | int coded_picture_number; ///< used to set pic->coded_picture_number, shouldnt be used for/by anything else | |
290 | int picture_number; //FIXME remove, unclear definition | |
277f4827 MN |
291 | int picture_in_gop_number; ///< 0-> first pic in gop, ... |
292 | int b_frames_since_non_b; ///< used for encoding, relative to not yet reordered input | |
e51f4948 | 293 | int64_t user_specified_pts;///< last non zero pts from AVFrame which was passed into avcodec_encode_video() |
277f4827 | 294 | int mb_width, mb_height; ///< number of MBs horizontally & vertically |
bb628dae DB |
295 | int mb_stride; ///< mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 |
296 | int b8_stride; ///< 2*mb_width+1 used for some 8x8 block arrays to allow simple addressing | |
297 | int b4_stride; ///< 4*mb_width+1 used for some 4x4 block arrays to allow simple addressing | |
298 | int h_edge_pos, v_edge_pos;///< horizontal / vertical position of the right/bottom edge (pixel replication) | |
277f4827 MN |
299 | int mb_num; ///< number of MBs of a picture |
300 | int linesize; ///< line size, in bytes, may be different from width | |
301 | int uvlinesize; ///< line size, for chroma in bytes, may be different from width | |
b465449e | 302 | Picture *picture; ///< main picture buffer |
9d9e3172 MN |
303 | Picture **input_picture; ///< next pictures on display order for encoding |
304 | Picture **reordered_input_picture; ///< pointer to the next pictures in codedorder for encoding | |
b536d0aa | 305 | |
9c3d33d6 MN |
306 | int start_mb_y; ///< start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y) |
307 | int end_mb_y; ///< end mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y) | |
308 | struct MpegEncContext *thread_context[MAX_THREADS]; | |
309 | ||
b536d0aa MN |
310 | /** |
311 | * copy of the previous picture structure. | |
312 | * note, linesize & data, might not match the previous picture (for field pictures) | |
313 | */ | |
314 | Picture last_picture; | |
315 | ||
316 | /** | |
317 | * copy of the next picture structure. | |
318 | * note, linesize & data, might not match the next picture (for field pictures) | |
319 | */ | |
320 | Picture next_picture; | |
321 | ||
322 | /** | |
323 | * copy of the source picture structure for encoding. | |
324 | * note, linesize & data, might not match the source picture (for field pictures) | |
325 | */ | |
326 | Picture new_picture; | |
327 | ||
328 | /** | |
329 | * copy of the current picture structure. | |
330 | * note, linesize & data, might not match the current picture (for field pictures) | |
331 | */ | |
277f4827 | 332 | Picture current_picture; ///< buffer to store the decompressed current picture |
b536d0aa MN |
333 | |
334 | Picture *last_picture_ptr; ///< pointer to the previous picture. | |
335 | Picture *next_picture_ptr; ///< pointer to the next picture (for bidir pred) | |
b536d0aa | 336 | Picture *current_picture_ptr; ///< pointer to the current picture |
0c9bbaec | 337 | uint8_t *visualization_buffer[3]; //< temporary buffer vor MV visualization |
277f4827 | 338 | int last_dc[3]; ///< last DC values for MPEG1 |
137c8468 | 339 | int16_t *dc_val_base; |
277f4827 | 340 | int16_t *dc_val[3]; ///< used for mpeg4 DC prediction, all 3 arrays must be continuous |
0da71265 | 341 | int16_t dc_cache[4*5]; |
de6d9b64 | 342 | int y_dc_scale, c_dc_scale; |
c26ae41d MN |
343 | const uint8_t *y_dc_scale_table; ///< qscale -> y_dc_scale table |
344 | const uint8_t *c_dc_scale_table; ///< qscale -> c_dc_scale table | |
332f9ac4 | 345 | const uint8_t *chroma_qscale_table; ///< qscale -> chroma_qscale (h263) |
137c8468 | 346 | uint8_t *coded_block_base; |
277f4827 | 347 | uint8_t *coded_block; ///< used for coded block pattern prediction (msmpeg4v3, wmv1) |
137c8468 | 348 | int16_t (*ac_val_base)[16]; |
277f4827 | 349 | int16_t (*ac_val[3])[16]; ///< used for for mpeg4 AC prediction, all 3 arrays must be continuous |
de6d9b64 | 350 | int ac_pred; |
277f4827 | 351 | uint8_t *prev_pict_types; ///< previous picture types in bitstream order, used for mb skip |
f943e138 | 352 | #define PREV_PICT_TYPES_BUFFER_SIZE 256 |
160d679c | 353 | int mb_skipped; ///< MUST BE SET only during DECODING |
277f4827 | 354 | uint8_t *mbskip_table; /**< used to avoid copy if macroblock skipped (for black regions for example) |
9dbcbd92 | 355 | and used for b-frame encoding & decoding (contains skip table of next P Frame) */ |
277f4827 MN |
356 | uint8_t *mbintra_table; ///< used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding |
357 | uint8_t *cbp_table; ///< used to store cbp, ac_pred for partitioned decoding | |
358 | uint8_t *pred_dir_table; ///< used to store pred_dir for partitioned decoding | |
f7b47594 | 359 | uint8_t *allocated_edge_emu_buffer; |
9c3d33d6 | 360 | uint8_t *edge_emu_buffer; ///< points into the middle of allocated_edge_emu_buffer |
bb628dae | 361 | uint8_t *rd_scratchpad; ///< scratchpad for rate distortion mb decision |
9c3d33d6 MN |
362 | uint8_t *obmc_scratchpad; |
363 | uint8_t *b_scratchpad; ///< scratchpad used for writing into write only buffers | |
de6d9b64 | 364 | |
277f4827 | 365 | int qscale; ///< QP |
332f9ac4 | 366 | int chroma_qscale; ///< chroma QP |
158c7f05 MN |
367 | int lambda; ///< lagrange multipler used in rate distortion |
368 | int lambda2; ///< (lambda*lambda) >> FF_LAMBDA_SHIFT | |
369 | int *lambda_table; | |
277f4827 MN |
370 | int adaptive_quant; ///< use adaptive quantization |
371 | int dquant; ///< qscale difference to prev qscale | |
372 | int pict_type; ///< I_TYPE, P_TYPE, B_TYPE, ... | |
14e2a940 | 373 | int last_pict_type; //FIXME removes |
277f4827 | 374 | int last_non_b_pict_type; ///< used for mpeg4 gmc b-frames & ratecontrol |
14e2a940 | 375 | int dropable; |
de6d9b64 | 376 | int frame_rate_index; |
5e5c247a | 377 | |
de6d9b64 | 378 | /* motion compensation */ |
277f4827 MN |
379 | int unrestricted_mv; ///< mv can point outside of the coded picture |
380 | int h263_long_vectors; ///< use horrible h263v1 long vector mode | |
160d679c | 381 | int decode; ///< if 0 then decoding will be skipped (for encoding b frames for example) |
277f4827 | 382 | |
bb628dae | 383 | DSPContext dsp; ///< pointers for accelerated dsp functions |
277f4827 MN |
384 | int f_code; ///< forward MV resolution |
385 | int b_code; ///< backward MV resolution for B Frames (mpeg4) | |
7bc9090a MN |
386 | int16_t (*p_mv_table_base)[2]; |
387 | int16_t (*b_forw_mv_table_base)[2]; | |
388 | int16_t (*b_back_mv_table_base)[2]; | |
389 | int16_t (*b_bidir_forw_mv_table_base)[2]; | |
390 | int16_t (*b_bidir_back_mv_table_base)[2]; | |
391 | int16_t (*b_direct_mv_table_base)[2]; | |
bb198e19 MN |
392 | int16_t (*p_field_mv_table_base[2][2])[2]; |
393 | int16_t (*b_field_mv_table_base[2][2][2])[2]; | |
277f4827 MN |
394 | int16_t (*p_mv_table)[2]; ///< MV table (1MV per MB) p-frame encoding |
395 | int16_t (*b_forw_mv_table)[2]; ///< MV table (1MV per MB) forward mode b-frame encoding | |
396 | int16_t (*b_back_mv_table)[2]; ///< MV table (1MV per MB) backward mode b-frame encoding | |
397 | int16_t (*b_bidir_forw_mv_table)[2]; ///< MV table (1MV per MB) bidir mode b-frame encoding | |
398 | int16_t (*b_bidir_back_mv_table)[2]; ///< MV table (1MV per MB) bidir mode b-frame encoding | |
399 | int16_t (*b_direct_mv_table)[2]; ///< MV table (1MV per MB) direct mode b-frame encoding | |
bb198e19 MN |
400 | int16_t (*p_field_mv_table[2][2])[2]; ///< MV table (2MV per MB) interlaced p-frame encoding |
401 | int16_t (*b_field_mv_table[2][2][2])[2];///< MV table (4MV per MB) interlaced b-frame encoding | |
402 | uint8_t (*p_field_select_table[2]); | |
403 | uint8_t (*b_field_select_table[2][2]); | |
277f4827 | 404 | int me_method; ///< ME algorithm |
de6d9b64 | 405 | int mv_dir; |
e4eadb4b MN |
406 | #define MV_DIR_BACKWARD 1 |
407 | #define MV_DIR_FORWARD 2 | |
277f4827 | 408 | #define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) |
de6d9b64 | 409 | int mv_type; |
277f4827 MN |
410 | #define MV_TYPE_16X16 0 ///< 1 vector for the whole mb |
411 | #define MV_TYPE_8X8 1 ///< 4 vectors (h263, mpeg4 4MV) | |
412 | #define MV_TYPE_16X8 2 ///< 2 vectors, one per 16x8 block | |
413 | #define MV_TYPE_FIELD 3 ///< 2 vectors, one per field | |
414 | #define MV_TYPE_DMV 4 ///< 2 vectors, special mpeg2 Dual Prime Vectors | |
415 | /**motion vectors for a macroblock | |
de6d9b64 FB |
416 | first coordinate : 0 = forward 1 = backward |
417 | second " : depend on type | |
418 | third " : 0 = x, 1 = y | |
419 | */ | |
420 | int mv[2][4][2]; | |
421 | int field_select[2][2]; | |
277f4827 MN |
422 | int last_mv[2][2][2]; ///< last MV, used for MV prediction in MPEG1 & B-frame MPEG4 |
423 | uint8_t *fcode_tab; ///< smallest fcode needed for each MV | |
1457ab52 MN |
424 | |
425 | MotionEstContext me; | |
de6d9b64 | 426 | |
277f4827 | 427 | int no_rounding; /**< apply no rounding to motion compensation (MPEG4, msmpeg4, ...) |
91029be7 | 428 | for b-frames rounding mode is allways 0 */ |
de6d9b64 | 429 | |
160d679c | 430 | int hurry_up; /**< when set to 1 during decoding, b frames will be skipped |
2417652e | 431 | when set to 2 idct/dequant will be skipped too */ |
c5d309f2 | 432 | |
de6d9b64 FB |
433 | /* macroblock layer */ |
434 | int mb_x, mb_y; | |
9b8709d1 | 435 | int mb_skip_run; |
de6d9b64 | 436 | int mb_intra; |
bb198e19 MN |
437 | uint16_t *mb_type; ///< Table for candidate MB types for encoding |
438 | #define CANDIDATE_MB_TYPE_INTRA 0x01 | |
439 | #define CANDIDATE_MB_TYPE_INTER 0x02 | |
440 | #define CANDIDATE_MB_TYPE_INTER4V 0x04 | |
160d679c | 441 | #define CANDIDATE_MB_TYPE_SKIPPED 0x08 |
7bc9090a | 442 | //#define MB_TYPE_GMC 0x10 |
7f2fe444 | 443 | |
bb198e19 MN |
444 | #define CANDIDATE_MB_TYPE_DIRECT 0x10 |
445 | #define CANDIDATE_MB_TYPE_FORWARD 0x20 | |
446 | #define CANDIDATE_MB_TYPE_BACKWARD 0x40 | |
447 | #define CANDIDATE_MB_TYPE_BIDIR 0x80 | |
448 | ||
449 | #define CANDIDATE_MB_TYPE_INTER_I 0x100 | |
450 | #define CANDIDATE_MB_TYPE_FORWARD_I 0x200 | |
451 | #define CANDIDATE_MB_TYPE_BACKWARD_I 0x400 | |
452 | #define CANDIDATE_MB_TYPE_BIDIR_I 0x800 | |
4278e7a6 | 453 | |
277f4827 | 454 | int block_index[6]; ///< index to current MB in block based arrays with edges |
4278e7a6 | 455 | int block_wrap[6]; |
7d1c3fc1 | 456 | uint8_t *dest[3]; |
7bc9090a MN |
457 | |
458 | int *mb_index2xy; ///< mb_index -> mb_x + mb_y*mb_stride | |
4278e7a6 | 459 | |
277f4827 | 460 | /** matrix transmitted in the bitstream */ |
0c1a9eda ZK |
461 | uint16_t intra_matrix[64]; |
462 | uint16_t chroma_intra_matrix[64]; | |
463 | uint16_t inter_matrix[64]; | |
464 | uint16_t chroma_inter_matrix[64]; | |
1984f635 | 465 | #define QUANT_BIAS_SHIFT 8 |
277f4827 MN |
466 | int intra_quant_bias; ///< bias for the quantizer |
467 | int inter_quant_bias; ///< bias for the quantizer | |
468 | int min_qcoeff; ///< minimum encodable coefficient | |
469 | int max_qcoeff; ///< maximum encodable coefficient | |
470 | int ac_esc_length; ///< num of bits needed to encode the longest esc | |
477ab036 MN |
471 | uint8_t *intra_ac_vlc_length; |
472 | uint8_t *intra_ac_vlc_last_length; | |
473 | uint8_t *inter_ac_vlc_length; | |
474 | uint8_t *inter_ac_vlc_last_length; | |
67725183 MN |
475 | uint8_t *luma_dc_vlc_length; |
476 | uint8_t *chroma_dc_vlc_length; | |
c442d75c | 477 | #define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level)) |
477ab036 | 478 | |
f2f6134b MN |
479 | int coded_score[6]; |
480 | ||
277f4827 | 481 | /** precomputed matrix (combine qscale and DCT renorm) */ |
7e4995c3 MN |
482 | int (*q_intra_matrix)[64]; |
483 | int (*q_inter_matrix)[64]; | |
642ccefb MN |
484 | /** identical to the above but for MMX & these are not permutated, second 64 entries are bias*/ |
485 | uint16_t (*q_intra_matrix16)[2][64]; | |
486 | uint16_t (*q_inter_matrix16)[2][64]; | |
5e5c247a | 487 | int block_last_index[12]; ///< last non zero coefficient in block |
2ad1516a | 488 | /* scantables */ |
05c4072b | 489 | ScanTable __align8 intra_scantable; |
2ad1516a MN |
490 | ScanTable intra_h_scantable; |
491 | ScanTable intra_v_scantable; | |
277f4827 | 492 | ScanTable inter_scantable; ///< if inter == intra then intra should be used to reduce tha cache usage |
821cb11f MN |
493 | |
494 | /* noise reduction */ | |
495 | int (*dct_error_sum)[64]; | |
496 | int dct_count[2]; | |
497 | uint16_t (*dct_offset)[64]; | |
de6d9b64 | 498 | |
277f4827 | 499 | void *opaque; ///< private data for the user |
de6d9b64 FB |
500 | |
501 | /* bit rate control */ | |
0c1a9eda ZK |
502 | int64_t wanted_bits; |
503 | int64_t total_bits; | |
277f4827 MN |
504 | int frame_bits; ///< bits used for the current frame |
505 | RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c | |
9cdd6a24 | 506 | |
098eefe1 MN |
507 | /* statistics, used for 2-pass encoding */ |
508 | int mv_bits; | |
509 | int header_bits; | |
510 | int i_tex_bits; | |
511 | int p_tex_bits; | |
512 | int i_count; | |
66370d3f MN |
513 | int f_count; |
514 | int b_count; | |
098eefe1 | 515 | int skip_count; |
277f4827 MN |
516 | int misc_bits; ///< cbp, mb_type |
517 | int last_bits; ///< temp var used for calculating the above vars | |
7f2fe444 MN |
518 | |
519 | /* error concealment / resync */ | |
7bc9090a | 520 | int error_count; |
277f4827 MN |
521 | uint8_t *error_status_table; ///< table of the error status of each MB |
522 | #define VP_START 1 ///< current MB is the first after a resync marker | |
4d2858de MN |
523 | #define AC_ERROR 2 |
524 | #define DC_ERROR 4 | |
525 | #define MV_ERROR 8 | |
526 | #define AC_END 16 | |
527 | #define DC_END 32 | |
528 | #define MV_END 64 | |
529 | //FIXME some prefix? | |
530 | ||
277f4827 MN |
531 | int resync_mb_x; ///< x position of last resync marker |
532 | int resync_mb_y; ///< y position of last resync marker | |
533 | GetBitContext last_resync_gb; ///< used to search for the next resync marker | |
534 | int mb_num_left; ///< number of MBs left in this video packet (for partitioned Slices only) | |
535 | int next_p_frame_damaged; ///< set if the next p frame is damaged, to avoid showing trashed b frames | |
7f2fe444 | 536 | int error_resilience; |
d7425f59 MN |
537 | |
538 | ParseContext parse_context; | |
098eefe1 | 539 | |
102d3908 | 540 | /* H.263 specific */ |
644d98a4 | 541 | int gob_index; |
dba019da | 542 | int obmc; ///< overlapped block motion compensation |
d140623f | 543 | |
544286b3 | 544 | /* H.263+ specific */ |
277f4827 MN |
545 | int umvplus; ///< == H263+ && unrestricted_mv |
546 | int h263_aic; ///< Advanded INTRA Coding (AIC) | |
ba58dabc MN |
547 | int h263_aic_dir; ///< AIC direction: 0 = left, 1 = top |
548 | int h263_slice_structured; | |
dba019da | 549 | int alt_inter_vlc; ///< alternative inter vlc |
68b94c35 | 550 | int modified_quant; |
ba58dabc | 551 | int loop_filter; |
b056e73c | 552 | int custom_pcf; |
544286b3 | 553 | |
de6d9b64 | 554 | /* mpeg4 specific */ |
277f4827 | 555 | int time_increment_bits; ///< number of bits to represent the fractional part of time |
9dbcbd92 | 556 | int last_time_base; |
277f4827 MN |
557 | int time_base; ///< time in seconds of last I,P,S Frame |
558 | int64_t time; ///< time of current frame | |
0c1a9eda | 559 | int64_t last_non_b_time; |
277f4827 MN |
560 | uint16_t pp_time; ///< time distance between the last 2 p,s,i frames |
561 | uint16_t pb_time; ///< time distance between the last b and p,s,i frame | |
0c1a9eda | 562 | uint16_t pp_field_time; |
277f4827 | 563 | uint16_t pb_field_time; ///< like above, just for interlaced |
1a565432 FB |
564 | int shape; |
565 | int vol_sprite_usage; | |
cc9ba006 MN |
566 | int sprite_width; |
567 | int sprite_height; | |
568 | int sprite_left; | |
569 | int sprite_top; | |
570 | int sprite_brightness_change; | |
73c8e514 | 571 | int num_sprite_warping_points; |
44eb4951 | 572 | int real_sprite_warping_points; |
277f4827 MN |
573 | int sprite_offset[2][2]; ///< sprite offset[isChroma][isMVY] |
574 | int sprite_delta[2][2]; ///< sprite_delta [isY][isMVY] | |
575 | int sprite_shift[2]; ///< sprite shift [isChroma] | |
73c8e514 | 576 | int mcsel; |
1a565432 | 577 | int quant_precision; |
277f4827 | 578 | int quarter_sample; ///< 1->qpel, 0->half pel ME/MC |
cc9ba006 | 579 | int scalability; |
0fd90455 MN |
580 | int hierachy_type; |
581 | int enhancement_type; | |
cc9ba006 MN |
582 | int new_pred; |
583 | int reduced_res_vop; | |
0da71265 | 584 | int aspect_ratio_info; //FIXME remove |
cc9ba006 MN |
585 | int sprite_warping_accuracy; |
586 | int low_latency_sprite; | |
277f4827 MN |
587 | int data_partitioning; ///< data partitioning flag from header |
588 | int partitioned_frame; ///< is current frame partitioned | |
589 | int rvlc; ///< reversible vlc | |
590 | int resync_marker; ///< could this stream contain resync markers | |
591 | int low_delay; ///< no reordering needed / has no b-frames | |
1ff662cc | 592 | int vo_type; |
277f4827 | 593 | int vol_control_parameters; ///< does the stream contain the low_delay flag, used to workaround buggy encoders |
34790165 | 594 | int intra_dc_threshold; ///< QP above whch the ac VLC should be used for intra dc |
277f4827 MN |
595 | PutBitContext tex_pb; ///< used for data partitioned VOPs |
596 | PutBitContext pb2; ///< used for data partitioned VOPs | |
d930ef19 | 597 | int mpeg_quant; |
277f4827 MN |
598 | int t_frame; ///< time distance of first I -> B, used for interlaced b frames |
599 | int padding_bug_score; ///< used to detect the VERY common padding bug in MPEG4 | |
44eb4951 MN |
600 | |
601 | /* divx specific, used to workaround (many) bugs in divx5 */ | |
602 | int divx_version; | |
603 | int divx_build; | |
d5a21172 | 604 | int divx_packed; |
0c1a9eda | 605 | uint8_t *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them |
eec1c6b9 | 606 | int bitstream_buffer_size; |
0ecca7a4 | 607 | int allocated_bitstream_buffer_size; |
eec1c6b9 | 608 | |
7da71a5c MN |
609 | int xvid_build; |
610 | ||
4d2858de | 611 | /* lavc specific stuff, used to workaround bugs in libavcodec */ |
4d2858de MN |
612 | int lavc_build; |
613 | ||
de6d9b64 | 614 | /* RV10 specific */ |
277f4827 | 615 | int rv10_version; ///< RV10 version: 0 or 3 |
de6d9b64 FB |
616 | int rv10_first_dc_coded[3]; |
617 | ||
618 | /* MJPEG specific */ | |
619 | struct MJpegContext *mjpeg_ctx; | |
277f4827 MN |
620 | int mjpeg_vsample[3]; ///< vertical sampling factors, default = {2, 1, 1} |
621 | int mjpeg_hsample[3]; ///< horizontal sampling factors, default = {2, 1, 1} | |
622 | int mjpeg_write_tables; ///< do we want to have quantisation- and huffmantables in the jpeg file ? | |
623 | int mjpeg_data_only_frames; ///< frames only with SOI, SOS and EOI markers | |
de6d9b64 FB |
624 | |
625 | /* MSMPEG4 specific */ | |
626 | int mv_table_index; | |
627 | int rl_table_index; | |
628 | int rl_chroma_table_index; | |
629 | int dc_table_index; | |
630 | int use_skip_mb_code; | |
277f4827 MN |
631 | int slice_height; ///< in macroblocks |
632 | int first_slice_line; ///< used in mpeg4 too to handle resync markers | |
ae40484c | 633 | int flipflop_rounding; |
277f4827 | 634 | int msmpeg4_version; ///< 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8 |
0151a6f5 MN |
635 | int per_mb_rl_table; |
636 | int esc3_level_length; | |
637 | int esc3_run_length; | |
277f4827 | 638 | /** [mb_intra][isChroma][level][run][last] */ |
6b460aa3 | 639 | int (*ac_stats)[2][MAX_LEVEL+1][MAX_RUN+1][2]; |
de0f2f4c | 640 | int inter_intra_pred; |
1457ab52 | 641 | int mspel; |
0151a6f5 | 642 | |
de6d9b64 FB |
643 | /* decompression specific */ |
644 | GetBitContext gb; | |
645 | ||
1e491e29 | 646 | /* Mpeg1 specific */ |
277f4827 MN |
647 | int gop_picture_number; ///< index of the first picture of a GOP based on fake_pic_num & mpeg1 specific |
648 | int last_mv_dir; ///< last mv_dir, used for b frame encoding | |
0da71265 | 649 | int broken_link; ///< no_output_of_prior_pics_flag |
d60a8f85 | 650 | uint8_t *vbv_delay_ptr; ///< pointer to vbv_delay in the bitstream |
1e491e29 | 651 | |
de6d9b64 FB |
652 | /* MPEG2 specific - I wish I had not to support this mess. */ |
653 | int progressive_sequence; | |
654 | int mpeg_f_code[2][2]; | |
655 | int picture_structure; | |
656 | /* picture type */ | |
657 | #define PICT_TOP_FIELD 1 | |
658 | #define PICT_BOTTOM_FIELD 2 | |
659 | #define PICT_FRAME 3 | |
660 | ||
661 | int intra_dc_precision; | |
662 | int frame_pred_frame_dct; | |
663 | int top_field_first; | |
664 | int concealment_motion_vectors; | |
665 | int q_scale_type; | |
666 | int intra_vlc_format; | |
667 | int alternate_scan; | |
668 | int repeat_first_field; | |
669 | int chroma_420_type; | |
5e5c247a IK |
670 | int chroma_format; |
671 | #define CHROMA_420 1 | |
672 | #define CHROMA_422 2 | |
673 | #define CHROMA_444 3 | |
ffdff4d7 IK |
674 | int chroma_x_shift;//depend on pix_format, that depend on chroma_format |
675 | int chroma_y_shift; | |
5e5c247a | 676 | |
de6d9b64 | 677 | int progressive_frame; |
de6d9b64 FB |
678 | int full_pel[2]; |
679 | int interlaced_dct; | |
de6d9b64 | 680 | int first_slice; |
c3bf0288 | 681 | int first_field; ///< is 1 for the first field of a field picture 0 otherwise |
ba58dabc | 682 | |
644d98a4 | 683 | /* RTP specific */ |
e4eadb4b | 684 | int rtp_mode; |
ba58dabc | 685 | |
0c1a9eda | 686 | uint8_t *ptr_lastgob; |
a579db0c IK |
687 | int swap_uv;//vcr2 codec is mpeg2 varint with UV swaped |
688 | short * pblocks[12]; | |
644d98a4 | 689 | |
277f4827 | 690 | DCTELEM (*block)[64]; ///< points to one of the following blocks |
45686da2 | 691 | DCTELEM (*blocks)[6][64]; // for HQ mode we need to keep the best block |
4d2858de MN |
692 | int (*decode_mb)(struct MpegEncContext *s, DCTELEM block[6][64]); // used by some codecs to avoid a switch() |
693 | #define SLICE_OK 0 | |
694 | #define SLICE_ERROR -1 | |
c3bf0288 MN |
695 | #define SLICE_END -2 ///<end marker found |
696 | #define SLICE_NOEND -3 ///<no end marker or error found but mb count exceeded | |
4d2858de | 697 | |
d50635cd | 698 | void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s, |
67309e49 | 699 | DCTELEM *block/*align 16*/, int n, int qscale); |
d50635cd | 700 | void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s, |
67309e49 | 701 | DCTELEM *block/*align 16*/, int n, int qscale); |
d50635cd | 702 | void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s, |
67309e49 | 703 | DCTELEM *block/*align 16*/, int n, int qscale); |
d50635cd MN |
704 | void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s, |
705 | DCTELEM *block/*align 16*/, int n, int qscale); | |
706 | void (*dct_unquantize_h263_intra)(struct MpegEncContext *s, | |
707 | DCTELEM *block/*align 16*/, int n, int qscale); | |
708 | void (*dct_unquantize_h263_inter)(struct MpegEncContext *s, | |
709 | DCTELEM *block/*align 16*/, int n, int qscale); | |
c6148de2 MN |
710 | void (*dct_unquantize_h261_intra)(struct MpegEncContext *s, |
711 | DCTELEM *block/*align 16*/, int n, int qscale); | |
712 | void (*dct_unquantize_h261_inter)(struct MpegEncContext *s, | |
713 | DCTELEM *block/*align 16*/, int n, int qscale); | |
d50635cd MN |
714 | void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both) |
715 | DCTELEM *block/*align 16*/, int n, int qscale); | |
716 | void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both) | |
67309e49 MN |
717 | DCTELEM *block/*align 16*/, int n, int qscale); |
718 | int (*dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow); | |
3a87ac94 | 719 | int (*fast_dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow); |
783df5f3 | 720 | void (*denoise_dct)(struct MpegEncContext *s, DCTELEM *block); |
de6d9b64 FB |
721 | } MpegEncContext; |
722 | ||
4d2858de | 723 | |
defdfc9a | 724 | int DCT_common_init(MpegEncContext *s); |
3edcacde | 725 | void MPV_decode_defaults(MpegEncContext *s); |
de6d9b64 FB |
726 | int MPV_common_init(MpegEncContext *s); |
727 | void MPV_common_end(MpegEncContext *s); | |
ffdff4d7 | 728 | void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]); |
d6db1c9c | 729 | int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx); |
de6d9b64 | 730 | void MPV_frame_end(MpegEncContext *s); |
1457ab52 MN |
731 | int MPV_encode_init(AVCodecContext *avctx); |
732 | int MPV_encode_end(AVCodecContext *avctx); | |
733 | int MPV_encode_picture(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data); | |
21af69f7 FB |
734 | #ifdef HAVE_MMX |
735 | void MPV_common_init_mmx(MpegEncContext *s); | |
736 | #endif | |
e0580f8c FH |
737 | #ifdef ARCH_ALPHA |
738 | void MPV_common_init_axp(MpegEncContext *s); | |
739 | #endif | |
c7e07931 MO |
740 | #ifdef HAVE_MLIB |
741 | void MPV_common_init_mlib(MpegEncContext *s); | |
742 | #endif | |
5917d17c LS |
743 | #ifdef HAVE_MMI |
744 | void MPV_common_init_mmi(MpegEncContext *s); | |
745 | #endif | |
83f238cb | 746 | #ifdef ARCH_ARMV4L |
d43b10ec | 747 | void MPV_common_init_armv4l(MpegEncContext *s); |
83f238cb | 748 | #endif |
05c4072b MN |
749 | #ifdef ARCH_POWERPC |
750 | void MPV_common_init_ppc(MpegEncContext *s); | |
751 | #endif | |
0c1a9eda | 752 | extern void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w); |
0c1a9eda | 753 | void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length); |
7f2fe444 | 754 | void ff_clean_intra_table_entries(MpegEncContext *s); |
3d2e8cce | 755 | void ff_init_scantable(uint8_t *, ScanTable *st, const uint8_t *src_scantable); |
640950c7 | 756 | void ff_draw_horiz_band(MpegEncContext *s, int y, int h); |
c009df3f | 757 | void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h, |
1457ab52 | 758 | int src_x, int src_y, int w, int h); |
bb463d81 | 759 | #define END_NOT_FOUND -100 |
e4cb187d MN |
760 | int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size); |
761 | void ff_parse_close(AVCodecParserContext *s); | |
7a06ff14 | 762 | void ff_mpeg_flush(AVCodecContext *avctx); |
0c9bbaec | 763 | void ff_print_debug_info(MpegEncContext *s, AVFrame *pict); |
d6eb3c50 | 764 | void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix); |
5f194811 | 765 | int ff_find_unused_picture(MpegEncContext *s, int shared); |
821cb11f | 766 | void ff_denoise_dct(MpegEncContext *s, DCTELEM *block); |
c62c07d3 | 767 | void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src); |
59b571c1 | 768 | |
46b4feec MN |
769 | void ff_er_frame_start(MpegEncContext *s); |
770 | void ff_er_frame_end(MpegEncContext *s); | |
771 | void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int endy, int status); | |
772 | ||
773 | ||
a33c7159 | 774 | extern enum PixelFormat ff_yuv420p_list[2]; |
de6d9b64 | 775 | |
7d1c3fc1 | 776 | void ff_init_block_index(MpegEncContext *s); |
4d2858de MN |
777 | |
778 | static inline void ff_update_block_index(MpegEncContext *s){ | |
178fcca8 MN |
779 | const int block_size= 8>>s->avctx->lowres; |
780 | ||
4d2858de MN |
781 | s->block_index[0]+=2; |
782 | s->block_index[1]+=2; | |
783 | s->block_index[2]+=2; | |
784 | s->block_index[3]+=2; | |
785 | s->block_index[4]++; | |
786 | s->block_index[5]++; | |
178fcca8 MN |
787 | s->dest[0]+= 2*block_size; |
788 | s->dest[1]+= block_size; | |
789 | s->dest[2]+= block_size; | |
4d2858de MN |
790 | } |
791 | ||
4d2a4834 | 792 | static inline int get_bits_diff(MpegEncContext *s){ |
fe455f33 | 793 | const int bits= put_bits_count(&s->pb); |
4d2a4834 MN |
794 | const int last= s->last_bits; |
795 | ||
796 | s->last_bits = bits; | |
797 | ||
798 | return bits - last; | |
799 | } | |
4d2858de | 800 | |
de6d9b64 | 801 | /* motion_est.c */ |
9dbcbd92 MN |
802 | void ff_estimate_p_frame_motion(MpegEncContext * s, |
803 | int mb_x, int mb_y); | |
804 | void ff_estimate_b_frame_motion(MpegEncContext * s, | |
805 | int mb_x, int mb_y); | |
806 | int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type); | |
807 | void ff_fix_long_p_mvs(MpegEncContext * s); | |
bb198e19 MN |
808 | void ff_fix_long_mvs(MpegEncContext * s, uint8_t *field_select_table, int field_select, |
809 | int16_t (*mv_table)[2], int f_code, int type, int truncate); | |
1457ab52 | 810 | void ff_init_me(MpegEncContext *s); |
f5fb6b34 | 811 | int ff_pre_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); |
155ec6ed MN |
812 | inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, |
813 | int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], | |
814 | int ref_mv_scale, int size, int h); | |
815 | int inline ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, | |
816 | int ref_index, int size, int h, int add_rate); | |
4d2858de | 817 | |
de6d9b64 | 818 | /* mpeg12.c */ |
0c1a9eda ZK |
819 | extern const int16_t ff_mpeg1_default_intra_matrix[64]; |
820 | extern const int16_t ff_mpeg1_default_non_intra_matrix[64]; | |
c26ae41d | 821 | extern const uint8_t ff_mpeg1_dc_scale_table[128]; |
de6d9b64 FB |
822 | |
823 | void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number); | |
824 | void mpeg1_encode_mb(MpegEncContext *s, | |
825 | DCTELEM block[6][64], | |
826 | int motion_x, int motion_y); | |
0151a6f5 | 827 | void ff_mpeg1_encode_init(MpegEncContext *s); |
9b8709d1 MN |
828 | void ff_mpeg1_encode_slice_header(MpegEncContext *s); |
829 | void ff_mpeg1_clean_buffers(MpegEncContext *s); | |
e96682e6 | 830 | int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size); |
de6d9b64 | 831 | |
4d2858de | 832 | |
277f4827 | 833 | /** RLTable. */ |
de6d9b64 | 834 | typedef struct RLTable { |
277f4827 MN |
835 | int n; ///< number of entries of table_vlc minus 1 |
836 | int last; ///< number of values for last = 0 | |
0c1a9eda ZK |
837 | const uint16_t (*table_vlc)[2]; |
838 | const int8_t *table_run; | |
839 | const int8_t *table_level; | |
277f4827 MN |
840 | uint8_t *index_run[2]; ///< encoding only |
841 | int8_t *max_level[2]; ///< encoding & decoding | |
842 | int8_t *max_run[2]; ///< encoding & decoding | |
843 | VLC vlc; ///< decoding only deprected FIXME remove | |
844 | RL_VLC_ELEM *rl_vlc[32]; ///< decoding only | |
de6d9b64 FB |
845 | } RLTable; |
846 | ||
073c2593 BP |
847 | void init_rl(RLTable *rl, int use_static); |
848 | void init_vlc_rl(RLTable *rl, int use_static); | |
de6d9b64 | 849 | |
3232bc88 | 850 | static inline int get_rl_index(const RLTable *rl, int last, int run, int level) |
de6d9b64 FB |
851 | { |
852 | int index; | |
853 | index = rl->index_run[last][run]; | |
854 | if (index >= rl->n) | |
855 | return rl->n; | |
856 | if (level > rl->max_level[last][run]) | |
857 | return rl->n; | |
858 | return index + level - 1; | |
859 | } | |
860 | ||
c26ae41d MN |
861 | extern const uint8_t ff_mpeg4_y_dc_scale_table[32]; |
862 | extern const uint8_t ff_mpeg4_c_dc_scale_table[32]; | |
863 | extern const uint8_t ff_aic_dc_scale_table[32]; | |
0c1a9eda ZK |
864 | extern const int16_t ff_mpeg4_default_intra_matrix[64]; |
865 | extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; | |
332f9ac4 MN |
866 | extern const uint8_t ff_h263_chroma_qscale_table[32]; |
867 | extern const uint8_t ff_h263_loop_filter_strength[32]; | |
68b94c35 | 868 | |
5f6c92d4 MN |
869 | /* h261.c */ |
870 | void ff_h261_loop_filter(MpegEncContext *s); | |
1c3990db MN |
871 | void ff_h261_reorder_mb_index(MpegEncContext* s); |
872 | void ff_h261_encode_mb(MpegEncContext *s, | |
873 | DCTELEM block[6][64], | |
874 | int motion_x, int motion_y); | |
875 | void ff_h261_encode_picture_header(MpegEncContext * s, int picture_number); | |
876 | void ff_h261_encode_init(MpegEncContext *s); | |
5f6c92d4 | 877 | |
554daa24 | 878 | |
e96682e6 | 879 | /* h263.c, h263dec.c */ |
1457ab52 MN |
880 | int ff_h263_decode_init(AVCodecContext *avctx); |
881 | int ff_h263_decode_frame(AVCodecContext *avctx, | |
882 | void *data, int *data_size, | |
0c1a9eda | 883 | uint8_t *buf, int buf_size); |
1457ab52 | 884 | int ff_h263_decode_end(AVCodecContext *avctx); |
de6d9b64 FB |
885 | void h263_encode_mb(MpegEncContext *s, |
886 | DCTELEM block[6][64], | |
887 | int motion_x, int motion_y); | |
d6231b9e MN |
888 | void mpeg4_encode_mb(MpegEncContext *s, |
889 | DCTELEM block[6][64], | |
890 | int motion_x, int motion_y); | |
de6d9b64 | 891 | void h263_encode_picture_header(MpegEncContext *s, int picture_number); |
44a2950f | 892 | void ff_flv_encode_picture_header(MpegEncContext *s, int picture_number); |
ba58dabc | 893 | void h263_encode_gob_header(MpegEncContext * s, int mb_line); |
137c8468 | 894 | int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir, |
de6d9b64 | 895 | int *px, int *py); |
0e15384d | 896 | void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
de6d9b64 | 897 | int dir); |
91029be7 | 898 | void ff_set_mpeg4_time(MpegEncContext * s, int picture_number); |
de6d9b64 | 899 | void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); |
45870f57 | 900 | void h263_encode_init(MpegEncContext *s); |
de6d9b64 FB |
901 | void h263_decode_init_vlc(MpegEncContext *s); |
902 | int h263_decode_picture_header(MpegEncContext *s); | |
4d2858de | 903 | int ff_h263_decode_gob_header(MpegEncContext *s); |
b704e742 | 904 | int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb); |
7d1c3fc1 | 905 | void ff_h263_update_motion_val(MpegEncContext * s); |
cdb4e730 | 906 | void ff_h263_loop_filter(MpegEncContext * s); |
554daa24 | 907 | void ff_set_qscale(MpegEncContext * s, int qscale); |
ba58dabc MN |
908 | int ff_h263_decode_mba(MpegEncContext *s); |
909 | void ff_h263_encode_mba(MpegEncContext *s); | |
b704e742 | 910 | |
de6d9b64 | 911 | int intel_h263_decode_picture_header(MpegEncContext *s); |
d4f5d74a | 912 | int flv_h263_decode_picture_header(MpegEncContext *s); |
4d2858de MN |
913 | int ff_h263_decode_mb(MpegEncContext *s, |
914 | DCTELEM block[6][64]); | |
fcfee63b MN |
915 | int ff_mpeg4_decode_mb(MpegEncContext *s, |
916 | DCTELEM block[6][64]); | |
de6d9b64 | 917 | int h263_get_picture_format(int width, int height); |
7f2fe444 MN |
918 | void ff_mpeg4_encode_video_packet_header(MpegEncContext *s); |
919 | void ff_mpeg4_clean_buffers(MpegEncContext *s); | |
920 | void ff_mpeg4_stuffing(PutBitContext * pbc); | |
921 | void ff_mpeg4_init_partitions(MpegEncContext *s); | |
922 | void ff_mpeg4_merge_partitions(MpegEncContext *s); | |
c5d309f2 | 923 | void ff_clean_mpeg4_qscales(MpegEncContext *s); |
9e4c6948 | 924 | void ff_clean_h263_qscales(MpegEncContext *s); |
4d2858de MN |
925 | int ff_mpeg4_decode_partitions(MpegEncContext *s); |
926 | int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); | |
927 | int ff_h263_resync(MpegEncContext *s); | |
928 | int ff_h263_get_gob_height(MpegEncContext *s); | |
7bc9090a | 929 | int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my); |
4df8ca9d | 930 | int ff_h263_round_chroma(int x); |
5e13a730 | 931 | void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code); |
4df8ca9d | 932 | int ff_mpeg4_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size); |
4d2858de | 933 | |
de6d9b64 FB |
934 | |
935 | /* rv10.c */ | |
936 | void rv10_encode_picture_header(MpegEncContext *s, int picture_number); | |
937 | int rv_decode_dc(MpegEncContext *s, int n); | |
d0271e8a | 938 | void rv20_encode_picture_header(MpegEncContext *s, int picture_number); |
de6d9b64 | 939 | |
4d2858de | 940 | |
de6d9b64 FB |
941 | /* msmpeg4.c */ |
942 | void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number); | |
ae40484c | 943 | void msmpeg4_encode_ext_header(MpegEncContext * s); |
de6d9b64 FB |
944 | void msmpeg4_encode_mb(MpegEncContext * s, |
945 | DCTELEM block[6][64], | |
946 | int motion_x, int motion_y); | |
de6d9b64 | 947 | int msmpeg4_decode_picture_header(MpegEncContext * s); |
ae40484c | 948 | int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size); |
0151a6f5 MN |
949 | int ff_msmpeg4_decode_init(MpegEncContext *s); |
950 | void ff_msmpeg4_encode_init(MpegEncContext *s); | |
1457ab52 | 951 | int ff_wmv2_decode_picture_header(MpegEncContext * s); |
b1609412 | 952 | int ff_wmv2_decode_secondary_picture_header(MpegEncContext * s); |
1457ab52 MN |
953 | void ff_wmv2_add_mb(MpegEncContext *s, DCTELEM block[6][64], uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr); |
954 | void ff_mspel_motion(MpegEncContext *s, | |
0c1a9eda ZK |
955 | uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
956 | uint8_t **ref_picture, op_pixels_func (*pix_op)[4], | |
1457ab52 MN |
957 | int motion_x, int motion_y, int h); |
958 | int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number); | |
959 | void ff_wmv2_encode_mb(MpegEncContext * s, | |
960 | DCTELEM block[6][64], | |
961 | int motion_x, int motion_y); | |
de6d9b64 | 962 | |
c009df3f | 963 | /* mjpeg.c */ |
de6d9b64 FB |
964 | int mjpeg_init(MpegEncContext *s); |
965 | void mjpeg_close(MpegEncContext *s); | |
966 | void mjpeg_encode_mb(MpegEncContext *s, | |
967 | DCTELEM block[6][64]); | |
968 | void mjpeg_picture_header(MpegEncContext *s); | |
969 | void mjpeg_picture_trailer(MpegEncContext *s); | |
9c3d33d6 | 970 | void ff_mjpeg_stuffing(PutBitContext * pbc); |
8b4c7dbc | 971 | |
4d2858de | 972 | |
8b4c7dbc MN |
973 | /* rate control */ |
974 | int ff_rate_control_init(MpegEncContext *s); | |
c5d309f2 | 975 | float ff_rate_estimate_qscale(MpegEncContext *s); |
8b4c7dbc MN |
976 | void ff_write_pass1_stats(MpegEncContext *s); |
977 | void ff_rate_control_uninit(MpegEncContext *s); | |
5c91a675 ZK |
978 | double ff_eval(char *s, double *const_value, const char **const_name, |
979 | double (**func1)(void *, double), const char **func1_name, | |
3aa102be MN |
980 | double (**func2)(void *, double, double), char **func2_name, |
981 | void *opaque); | |
11dffbe1 | 982 | int ff_vbv_update(MpegEncContext *s, int frame_size); |
3aa102be | 983 | |
8b4c7dbc | 984 | |
cd4af68a | 985 | #endif /* AVCODEC_MPEGVIDEO_H */ |