File: mpegvideo.h

package info (click to toggle)
yorick-mpeg 0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 504 kB
  • sloc: ansic: 6,219; makefile: 113
file content (551 lines) | stat: -rw-r--r-- 21,342 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
/*
 * Generic DCT based hybrid video encoder
 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
 * Copyright (c) 2002-2004 Michael Niedermayer
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/**
 * @file mpegvideo.h
 * mpegvideo header.
 */
 
#ifndef AVCODEC_MPEGVIDEO_H
#define AVCODEC_MPEGVIDEO_H

#include "dsputil.h"

#define FRAME_SKIPED 100 /*/< return value for header parsers if frame is not coded*/

enum OutputFormat {
  FMT_MPEG1
};

#define EDGE_WIDTH 16

#define MPEG_BUF_SIZE (16 * 1024)

#define QMAT_SHIFT_MMX 16
#define QMAT_SHIFT 22

#define MAX_FCODE 7
#define MAX_MV 2048

#define MAX_PICTURE_COUNT 15

#define ME_MAP_SIZE 64
#define ME_MAP_SHIFT 3
#define ME_MAP_MV_BITS 11

/* run length table */
#define MAX_RUN    64
#define MAX_LEVEL  64

#define I_TYPE FF_I_TYPE  /*/< Intra*/
#define P_TYPE FF_P_TYPE  /*/< Predicted*/
#define B_TYPE FF_B_TYPE  /*/< Bi-dir predicted*/

typedef struct Predictor{
    double coeff;
    double count;
    double decay;
} Predictor;

typedef struct RateControlEntry{
    int pict_type;
    float qscale;
    int mv_bits;
    int i_tex_bits;
    int p_tex_bits;
    int misc_bits;
    uint64_t expected_bits;
    int new_pict_type;
    float new_qscale;
    int mc_mb_var_sum;
    int mb_var_sum;
    int i_count;
    int f_code;
    int b_code;
}RateControlEntry;

/**
 * rate control context.
 */
typedef struct RateControlContext{
    FILE *stats_file;
    int num_entries;              /*/< number of RateControlEntries */
    RateControlEntry *entry;
    double buffer_index;          /*/< amount of bits in the video/audio buffer */
    Predictor pred[5];
    double short_term_qsum;       /*/< sum of recent qscales */
    double short_term_qcount;     /*/< count of recent qscales */
    double pass1_rc_eq_output_sum;/*/< sum of the output of the rc equation, this is used for normalization  */
    double pass1_wanted_bits;     /*/< bits which should have been outputed by the pass1 code (including complexity init) */
    double last_qscale;
    double last_qscale_for[5];    /*/< last qscale for a specific pict type, used for max_diff & ipb factor stuff */
    int last_mc_mb_var_sum;
    int last_mb_var_sum;
    uint64_t i_cplx_sum[5];
    uint64_t p_cplx_sum[5];
    uint64_t mv_bits_sum[5];
    uint64_t qscale_sum[5];
    int frame_count[5];
    int last_non_b_pict_type;
}RateControlContext;

/**
 * Scantable.
 */
typedef struct ScanTable{
    const uint8_t *scantable;
    uint8_t permutated[64];
    uint8_t raster_end[64];
  /*#ifdef ARCH_POWERPC*/
		/** Used by dct_quantise_alitvec to find last-non-zero */
  /* uint8_t __align8 inverse[64]; */
  /*#endif*/
} ScanTable;

/**
 * Picture.
 */
typedef struct Picture{
    FF_COMMON_FRAME

    /**
     * halfpel luma planes.
     */
    uint8_t *interpolated[3];
    int16_t (*motion_val_base[2])[2];
    uint32_t *mb_type_base;
#define MB_TYPE_INTRA MB_TYPE_INTRA4x4 /*default mb_type if theres just one type*/

    int mb_var_sum;             /*/< sum of MB variance for current frame */
    int mc_mb_var_sum;          /*/< motion compensated MB variance for current frame */
    uint16_t *mb_var;           /*/< Table for MB variances */
    uint16_t *mc_mb_var;        /*/< Table for motion compensated MB variances */
    uint8_t *mb_mean;           /*/< Table for MB luminance */

    int b_frame_score;          /* */
} Picture;

typedef struct ParseContext{
    uint8_t *buffer;
    int index;
    int last_index;
    int buffer_size;
    uint32_t state;             /*/< contains the last few bytes in MSB order*/
    int frame_start_found;
    int overread;               /*/< the number of bytes which where irreversibly read from the next frame*/
    int overread_index;         /*/< the index into ParseContext.buffer of the overreaded bytes*/
} ParseContext;

struct MpegEncContext;

/**
 * Motion estimation context.
 */
typedef struct MotionEstContext{
  AVCodecContext *avctx;
  int skip;                      /* set if ME is skiped for the current MB */
  uint8_t *scratchpad;           /* data area for the me algo, so that the ME doesnt need to malloc/free */
  uint8_t *best_mb;
  uint8_t *temp;
  uint32_t *map;                 /* map to avoid duplicate evaluations */
  uint32_t *score_map;           /* map to store the scores */
  int map_generation;  

  int penalty_factor;
  int sub_penalty_factor;
  int mb_penalty_factor;
  int flags;

  int xmin;
  int xmax;
  int ymin;
  int ymax;
  int pred_x;
  int pred_y;
  uint8_t *src[4][4];
  uint8_t *ref[4][4];
  int stride;
  int uvstride;
  /* temp variables for picture complexity calculation */
  int mc_mb_var_sum_temp;
  int mb_var_sum_temp;
  int scene_change_score;

  uint8_t (*mv_penalty)[MAX_MV*2+1];  /* bits needed to encode a MV */
  uint8_t *current_mv_penalty;
}MotionEstContext;

/**
 * MpegEncContext.
 */
typedef struct MpegEncContext {
    struct AVCodecContext *avctx;
    /* the following parameters must be initialized before encoding */
    int width, height;/*/< picture size. must be a multiple of 16 */
    int gop_size;
    int intra_only;   /*/< if true, only intra pictures are generated */
    int bit_rate;     /*/< wanted bit rate */
    enum OutputFormat out_format; /*/< output format */

    int codec_id;     /* see CODEC_ID_xxx */

    int flags;        /*/< AVCodecContext.flags (HQ, MV4, ...) */
    int flags2;       /*/< AVCodecContext.flags2*/
    int max_b_frames; /*/< max number of b-frames for encoding */

    /* the following fields are managed internally by the encoder */

    /** bit output */
    PutBitContext pb;

    /* sequence parameters */
    int context_initialized;
    int input_picture_number;  /*/< used to set pic->display_picture_number, shouldnt be used for/by anything else*/
    int coded_picture_number;  /*/< used to set pic->coded_picture_number, shouldnt be used for/by anything else*/
    int picture_number;       /*FIXME remove, unclear definition*/
    int picture_in_gop_number; /*/< 0-> first pic in gop, ... */
    int b_frames_since_non_b;  /*/< used for encoding, relative to not yet reordered input */
    int64_t user_specified_pts;/*/< last non zero pts from AVFrame which was passed into avcodec_encode_video()*/
    int mb_width, mb_height;   /*/< number of MBs horizontally & vertically */
    int mb_stride;             /*/< mb_width+1 used for some arrays to allow simple addressng of left & top MBs withoutt sig11*/
    int b8_stride;             /*/< 2*mb_width+1 used for some 8x8 block arrays to allow simple addressng*/

    int h_edge_pos, v_edge_pos;/*/< horizontal / vertical position of the right/bottom edge (pixel replicateion)*/
    int mb_num;                /*/< number of MBs of a picture */
    int linesize;              /*/< line size, in bytes, may be different from width */
    int uvlinesize;            /*/< line size, for chroma in bytes, may be different from width */
    Picture *picture;          /*/< main picture buffer */
    Picture **input_picture;   /*/< next pictures on display order for encoding*/
    Picture **reordered_input_picture; /*/< pointer to the next pictures in codedorder for encoding*/
    
    int start_mb_y;            /*/< start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)*/
    int end_mb_y;              /*/< end   mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)*/
    struct MpegEncContext *thread_context[1];

    /** 
     * copy of the previous picture structure.
     * note, linesize & data, might not match the previous picture (for field pictures)
     */
    Picture last_picture;       

    /** 
     * copy of the next picture structure.
     * note, linesize & data, might not match the next picture (for field pictures)
     */
    Picture next_picture;

    /** 
     * copy of the source picture structure for encoding.
     * note, linesize & data, might not match the source picture (for field pictures)
     */
    Picture new_picture;

    /** 
     * copy of the current picture structure.
     * note, linesize & data, might not match the current picture (for field pictures)
     */
    Picture current_picture;    /*/< buffer to store the decompressed current picture */

    Picture *last_picture_ptr;     /*/< pointer to the previous picture.*/
    Picture *next_picture_ptr;     /*/< pointer to the next picture (for bidir pred) */
    Picture *current_picture_ptr;  /*/< pointer to the current picture*/
    uint8_t *visualization_buffer[3]; /*< temporary buffer vor MV visualization*/
    int last_dc[3];                /*/< last DC values for MPEG1 */

    int y_dc_scale, c_dc_scale;
    uint8_t *y_dc_scale_table;     /*/< qscale -> y_dc_scale table */
    uint8_t *c_dc_scale_table;     /*/< qscale -> c_dc_scale table */
    const uint8_t *chroma_qscale_table;  /*/< qscale -> chroma_qscale (h263)*/

    uint8_t *prev_pict_types;     /*/< previous picture types in bitstream order, used for mb skip */
#define PREV_PICT_TYPES_BUFFER_SIZE 256

    uint8_t *allocated_edge_emu_buffer;
    uint8_t *edge_emu_buffer;     /*/< points into the middle of allocated_edge_emu_buffer*/
    uint8_t *rd_scratchpad;       /*/< scartchpad for rate distortion mb decission*/
    uint8_t *b_scratchpad;        /*/< scratchpad used for writing into write only buffers*/

    int qscale;                 /*/< QP */
    int chroma_qscale;          /*/< chroma QP */
    int lambda;                 /*/< lagrange multipler used in rate distortion*/
    int lambda2;                /*/< (lambda*lambda) >> FF_LAMBDA_SHIFT */
    int *lambda_table;

    int dquant;                 /*/< qscale difference to prev qscale  */
    int pict_type;              /*/< I_TYPE, P_TYPE, B_TYPE, ... */
    int last_pict_type; /*FIXME removes*/
    int last_non_b_pict_type;   /*/< used for mpeg4 gmc b-frames & ratecontrol */
    int dropable;
    int frame_rate_index;
    int frame_rate_ext_n;       /*/< MPEG-2 specific framerate modificators (numerator)*/
    int frame_rate_ext_d;       /*/< MPEG-2 specific framerate modificators (denominator)*/

    int decode;                 /*/< if 0 then decoding will be skiped (for encoding b frames for example)*/

    DSPContext dsp;             /*/< pointers for accelerated dsp fucntions */
    int f_code;                 /*/< forward MV resolution */
    int b_code;                 /*/< backward MV resolution for B Frames (mpeg4) */
    int16_t (*p_mv_table_base)[2];
    int16_t (*b_forw_mv_table_base)[2];
    int16_t (*b_back_mv_table_base)[2];
    int16_t (*b_bidir_forw_mv_table_base)[2]; 
    int16_t (*b_bidir_back_mv_table_base)[2]; 
    int16_t (*b_direct_mv_table_base)[2];
    int16_t (*p_field_mv_table_base[2][2])[2];
    int16_t (*b_field_mv_table_base[2][2][2])[2];
    int16_t (*p_mv_table)[2];            /*/< MV table (1MV per MB) p-frame encoding */
    int16_t (*b_forw_mv_table)[2];       /*/< MV table (1MV per MB) forward mode b-frame encoding */
    int16_t (*b_back_mv_table)[2];       /*/< MV table (1MV per MB) backward mode b-frame encoding */
    int16_t (*b_bidir_forw_mv_table)[2]; /*/< MV table (1MV per MB) bidir mode b-frame encoding */
    int16_t (*b_bidir_back_mv_table)[2]; /*/< MV table (1MV per MB) bidir mode b-frame encoding */
    int16_t (*b_direct_mv_table)[2];     /*/< MV table (1MV per MB) direct mode b-frame encoding */
    int16_t (*p_field_mv_table[2][2])[2];   /*/< MV table (2MV per MB) interlaced p-frame encoding*/
    int16_t (*b_field_mv_table[2][2][2])[2];/*/< MV table (4MV per MB) interlaced b-frame encoding*/
    uint8_t (*p_field_select_table[2]);
    uint8_t (*b_field_select_table[2][2]);

    int mv_dir;
#define MV_DIR_BACKWARD  1
#define MV_DIR_FORWARD   2
#define MV_DIRECT        4 /*/< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4)*/

    /**motion vectors for a macroblock 
       first coordinate : 0 = forward 1 = backward
       second "         : depend on type
       third  "         : 0 = x, 1 = y
    */
    int mv[2][4][2];
    int field_select[2][2];
    int last_mv[2][2][2];             /*/< last MV, used for MV prediction in MPEG1 & B-frame MPEG4 */
    uint8_t *fcode_tab;               /*/< smallest fcode needed for each MV */

    MotionEstContext me;

    /* macroblock layer */
    int mb_x, mb_y;
    int mb_skip_run;
    int mb_intra;
    uint16_t *mb_type;           /*/< Table for candidate MB types for encoding*/
#define CANDIDATE_MB_TYPE_INTRA    0x01
#define CANDIDATE_MB_TYPE_INTER    0x02
#define CANDIDATE_MB_TYPE_INTER4V  0x04
#define CANDIDATE_MB_TYPE_SKIPED   0x08

#define CANDIDATE_MB_TYPE_DIRECT   0x10
#define CANDIDATE_MB_TYPE_FORWARD  0x20
#define CANDIDATE_MB_TYPE_BACKWARD 0x40
#define CANDIDATE_MB_TYPE_BIDIR    0x80

#define CANDIDATE_MB_TYPE_INTER_I    0x100
#define CANDIDATE_MB_TYPE_FORWARD_I  0x200
#define CANDIDATE_MB_TYPE_BACKWARD_I 0x400
#define CANDIDATE_MB_TYPE_BIDIR_I    0x800

    int block_index[6]; /*/< index to current MB in block based arrays with edges*/
    int block_wrap[6];
    uint8_t *dest[3];
    
    int *mb_index2xy;        /*/< mb_index -> mb_x + mb_y*mb_stride*/

    /** matrix transmitted in the bitstream */
    uint16_t intra_matrix[64];
    uint16_t chroma_intra_matrix[64];
    uint16_t inter_matrix[64];
    uint16_t chroma_inter_matrix[64];
#define QUANT_BIAS_SHIFT 8
    int intra_quant_bias;    /*/< bias for the quantizer */
    int inter_quant_bias;    /*/< bias for the quantizer */
    int min_qcoeff;          /*/< minimum encodable coefficient */
    int max_qcoeff;          /*/< maximum encodable coefficient */
    int ac_esc_length;       /*/< num of bits needed to encode the longest esc */
    uint8_t *intra_ac_vlc_length;
    uint8_t *intra_ac_vlc_last_length;
    uint8_t *inter_ac_vlc_length;
    uint8_t *inter_ac_vlc_last_length;
    uint8_t *luma_dc_vlc_length;
    uint8_t *chroma_dc_vlc_length;
#define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level))

    int coded_score[6];

    /** precomputed matrix (combine qscale and DCT renorm) */
    int (*q_intra_matrix)[64];
    int (*q_inter_matrix)[64];
    /** identical to the above but for MMX & these are not permutated, second 64 entries are bias*/
    uint16_t (*q_intra_matrix16)[2][64];
    uint16_t (*q_inter_matrix16)[2][64];
    int block_last_index[12];  /*/< last non zero coefficient in block*/
    /* scantables */
    ScanTable __align8 intra_scantable;
    ScanTable intra_h_scantable;
    ScanTable intra_v_scantable;
    ScanTable inter_scantable; /*/< if inter == intra then intra should be used to reduce tha cache usage*/

    void *opaque;              /*/< private data for the user*/

    /* bit rate control */
    int64_t wanted_bits;
    int64_t total_bits;
    int frame_bits;                /*/< bits used for the current frame */
    RateControlContext rc_context; /*/< contains stuff only accessed in ratecontrol.c*/

    /* statistics, used for 2-pass encoding */
    int mv_bits;
    int header_bits;
    int i_tex_bits;
    int p_tex_bits;
    int i_count;
    int f_count;
    int b_count;
    int skip_count;
    int misc_bits; /*/< cbp, mb_type*/
    int last_bits; /*/< temp var used for calculating the above vars*/

    int resync_mb_x;                 /*/< x position of last resync marker */
    int resync_mb_y;                 /*/< y position of last resync marker */

    int mb_num_left;                 /*/< number of MBs left in this video packet (for partitioned Slices only)*/
    int next_p_frame_damaged;        /*/< set if the next p frame is damaged, to avoid showing trashed b frames */

    ParseContext parse_context;

    /* mpeg4 specific */
    int time_increment_resolution;
    int64_t time;       /* time of current frame  */
    uint16_t pp_time;   /* time distance between the last 2 p,s,i frames */
    uint16_t pb_time;   /* time distance between the last b and p,s,i frame */
    int64_t last_non_b_time;

    PutBitContext tex_pb;            /*/< used for data partitioned VOPs */
    PutBitContext pb2;               /*/< used for data partitioned VOPs */

    int t_frame;                       /*/< time distance of first I -> B, used for interlaced b frames */

    /* lavc specific stuff, used to workaround bugs in libavcodec */
    int ffmpeg_version;
    int lavc_build;

    /* MSMPEG4 specific */
    int first_slice_line;  /*/< used in mpeg4 too to handle resync markers */

    int inter_intra_pred;
    int mspel;

    /* Mpeg1 specific */
    int gop_picture_number;  /*/< index of the first picture of a GOP based on fake_pic_num & mpeg1 specific */
    int last_mv_dir;         /*/< last mv_dir, used for b frame encoding */
    int broken_link;         /*/< no_output_of_prior_pics_flag*/
    uint8_t *vbv_delay_ptr;  /*/< pointer to vbv_delay in the bitstream */

    int intra_dc_precision;

    int chroma_x_shift;/*depend on pix_format, that depend on chroma_format*/
    int chroma_y_shift;

    int first_slice;

    DCTELEM (*block)[64]; /*/< points to one of the following blocks */
    DCTELEM (*blocks)[6][64]; /* for HQ mode we need to keep the best block*/
} MpegEncContext;


int DCT_common_init(MpegEncContext *s);
int MPV_common_init(MpegEncContext *s);
void MPV_common_end(MpegEncContext *s);
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]);
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx);
void MPV_frame_end(MpegEncContext *s);
int MPV_encode_init(AVCodecContext *avctx);
int MPV_encode_end(AVCodecContext *avctx);
int MPV_encode_picture(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data);

void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length);
void ff_init_scantable(ScanTable *st, const uint8_t *src_scantable);
void ff_draw_horiz_band(MpegEncContext *s, int y, int h);
void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h, 
                                    int src_x, int src_y, int w, int h);
#define END_NOT_FOUND -100
int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size);

void ff_mpeg_flush(AVCodecContext *avctx);

void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix);
int ff_find_unused_picture(MpegEncContext *s, int shared);

void ff_er_frame_start(MpegEncContext *s);
void ff_er_frame_end(MpegEncContext *s);
void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int endy, int status);

void ff_init_block_index(MpegEncContext *s);

/* motion_est.c */
void ff_estimate_p_frame_motion(MpegEncContext * s,
                             int mb_x, int mb_y);
void ff_estimate_b_frame_motion(MpegEncContext * s,
                             int mb_x, int mb_y);
int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type);
void ff_fix_long_mvs(MpegEncContext * s, int16_t (*mv_table)[2],
                     int f_code, int type, int truncate);
void ff_init_me(MpegEncContext *s);


/* mpeg12.c */
extern const int16_t ff_mpeg1_default_intra_matrix[64];
extern const int16_t ff_mpeg1_default_non_intra_matrix[64];
extern uint8_t ff_mpeg1_dc_scale_table[128];

void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number);
void mpeg1_encode_mb(MpegEncContext *s,
                     DCTELEM block[6][64],
                     int motion_x, int motion_y);
void ff_mpeg1_encode_init(MpegEncContext *s);
void ff_mpeg1_encode_slice_header(MpegEncContext *s);
int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf,int buf_size);

/** RLTable. */
typedef struct RLTable {
  int n;                         /*/< number of entries of table_vlc minus 1 */
  int last;                      /*/< number of values for last = 0 */
  const uint16_t (*table_vlc)[2];
  const int8_t *table_run;
  const int8_t *table_level;
  uint8_t *index_run[2];         /*/< encoding only */
  int8_t *max_level[2];          /*/< encoding & decoding */
  int8_t *max_run[2];            /*/< encoding & decoding */
} RLTable;

void init_rl(RLTable *rl);

void ff_set_mpeg4_time(MpegEncContext * s, int picture_number);
void ff_set_qscale(MpegEncContext * s, int qscale);

/* rate control */
int ff_rate_control_init(MpegEncContext *s);
float ff_rate_estimate_qscale(MpegEncContext *s);
void ff_write_pass1_stats(MpegEncContext *s);
void ff_rate_control_uninit(MpegEncContext *s);
double ff_eval(char *s, double *const_value, const char **const_name,
               double (**func1)(void *, double), const char **func1_name,
               double (**func2)(void *, double, double), char **func2_name,
               void *opaque);
int ff_vbv_update(MpegEncContext *s, int frame_size);


#endif /* AVCODEC_MPEGVIDEO_H */