Statistics
| Branch: | Revision:

ffmpeg / libavcodec / mpegvideo.c @ 1f0cd30f

History | View | Annotate | Download (75.1 KB)

1
/*
2
 * The simplest mpeg encoder (well, it was the simplest!)
3
 * Copyright (c) 2000,2001 Gerard Lantau.
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
 *
19
 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
20
 */
21
#include <stdlib.h>
22
#include <stdio.h>
23
#include <math.h>
24
#include <string.h>
25
#include "avcodec.h"
26
#include "dsputil.h"
27
#include "mpegvideo.h"
28

    
29
#ifdef USE_FASTMEMCPY
30
#include "fastmemcpy.h"
31
#endif
32

    
33
static void encode_picture(MpegEncContext *s, int picture_number);
34
static void rate_control_init(MpegEncContext *s);
35
static int rate_estimate_qscale(MpegEncContext *s);
36
static void dct_unquantize_mpeg1_c(MpegEncContext *s, 
37
                                   DCTELEM *block, int n, int qscale);
38
static void dct_unquantize_mpeg2_c(MpegEncContext *s,
39
                                   DCTELEM *block, int n, int qscale);
40
static void dct_unquantize_h263_c(MpegEncContext *s, 
41
                                  DCTELEM *block, int n, int qscale);
42
static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w);
43
static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale);
44

    
45
int (*dct_quantize)(MpegEncContext *s, DCTELEM *block, int n, int qscale)= dct_quantize_c;
46
void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c;
47

    
48
#define EDGE_WIDTH 16
49

    
50
/* enable all paranoid tests for rounding, overflows, etc... */
51
//#define PARANOID
52

    
53
//#define DEBUG
54

    
55

    
56
/* for jpeg fast DCT */
57
#define CONST_BITS 14
58

    
59
static const unsigned short aanscales[64] = {
60
    /* precomputed values scaled up by 14 bits */
61
    16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
62
    22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
63
    21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
64
    19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
65
    16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
66
    12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
67
    8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
68
    4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
69
};
70

    
71
static UINT8 h263_chroma_roundtab[16] = {
72
    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
73
};
74

    
75
static UINT16 default_mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
76
static UINT8 default_fcode_tab[MAX_MV*2+1];
77

    
78
extern UINT8 zigzag_end[64];
79

    
80
/* default motion estimation */
81
int motion_estimation_method = ME_EPZS;
82

    
83
static void convert_matrix(int *qmat, UINT16 *qmat16, const UINT16 *quant_matrix, int qscale)
84
{
85
    int i;
86

    
87
    if (av_fdct == jpeg_fdct_ifast) {
88
        for(i=0;i<64;i++) {
89
            /* 16 <= qscale * quant_matrix[i] <= 7905 */
90
            /* 19952         <= aanscales[i] * qscale * quant_matrix[i]           <= 249205026 */
91
            /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
92
            /* 3444240       >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
93
            
94
            qmat[block_permute_op(i)] = (int)((UINT64_C(1) << (QMAT_SHIFT + 11)) / 
95
                            (aanscales[i] * qscale * quant_matrix[block_permute_op(i)]));
96
        }
97
    } else {
98
        for(i=0;i<64;i++) {
99
            /* We can safely suppose that 16 <= quant_matrix[i] <= 255
100
               So 16           <= qscale * quant_matrix[i]             <= 7905
101
               so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
102
               so 32768        >= (1<<19) / (qscale * quant_matrix[i]) >= 67
103
            */
104
            qmat[i]   = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
105
            qmat16[i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[block_permute_op(i)]);
106
        }
107
    }
108
}
109

    
110
/* init common structure for both encoder and decoder */
111
int MPV_common_init(MpegEncContext *s)
112
{
113
    int c_size, i;
114
    UINT8 *pict;
115

    
116
    s->dct_unquantize_h263 = dct_unquantize_h263_c;
117
    s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c;
118
    s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c;
119
        
120
#ifdef HAVE_MMX
121
    MPV_common_init_mmx(s);
122
#endif
123
    //setup default unquantizers (mpeg4 might change it later)
124
    if(s->out_format == FMT_H263)
125
        s->dct_unquantize = s->dct_unquantize_h263;
126
    else
127
        s->dct_unquantize = s->dct_unquantize_mpeg1;
128
    
129
    s->mb_width = (s->width + 15) / 16;
130
    s->mb_height = (s->height + 15) / 16;
131
    s->mb_num = s->mb_width * s->mb_height;
132
    s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH;
133

    
134
    for(i=0;i<3;i++) {
135
        int w, h, shift, pict_start;
136

    
137
        w = s->linesize;
138
        h = s->mb_height * 16 + 2 * EDGE_WIDTH;
139
        shift = (i == 0) ? 0 : 1;
140
        c_size = (w >> shift) * (h >> shift);
141
        pict_start = (w >> shift) * (EDGE_WIDTH >> shift) + (EDGE_WIDTH >> shift);
142

    
143
        pict = av_mallocz(c_size);
144
        if (pict == NULL)
145
            goto fail;
146
        s->last_picture_base[i] = pict;
147
        s->last_picture[i] = pict + pict_start;
148
    
149
        pict = av_mallocz(c_size);
150
        if (pict == NULL)
151
            goto fail;
152
        s->next_picture_base[i] = pict;
153
        s->next_picture[i] = pict + pict_start;
154
        
155
        if (s->has_b_frames) {
156
            pict = av_mallocz(c_size);
157
            if (pict == NULL) 
158
                goto fail;
159
            s->aux_picture_base[i] = pict;
160
            s->aux_picture[i] = pict + pict_start;
161
        }
162
    }
163
    
164
    if (s->encoding) {
165
        int j;
166
        int mv_table_size= (s->mb_width+2)*(s->mb_height+2);
167

    
168
        /* Allocate MB type table */
169
        s->mb_type = av_mallocz(s->mb_num * sizeof(char));
170
        if (s->mb_type == NULL) {
171
            perror("malloc");
172
            goto fail;
173
        }
174
        
175
        s->mb_var = av_mallocz(s->mb_num * sizeof(INT16));
176
        if (s->mb_var == NULL) {
177
            perror("malloc");
178
            goto fail;
179
        }
180

    
181
        /* Allocate MV tables */
182
        s->p_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
183
        if (s->p_mv_table == NULL) {
184
            perror("malloc");
185
            goto fail;
186
        }
187
        s->last_p_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
188
        if (s->last_p_mv_table == NULL) {
189
            perror("malloc");
190
            goto fail;
191
        }
192
        s->b_forw_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
193
        if (s->b_forw_mv_table == NULL) {
194
            perror("malloc");
195
            goto fail;
196
        }
197
        s->b_back_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
198
        if (s->b_back_mv_table == NULL) {
199
            perror("malloc");
200
            goto fail;
201
        }
202
        s->b_bidir_forw_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
203
        if (s->b_bidir_forw_mv_table == NULL) {
204
            perror("malloc");
205
            goto fail;
206
        }
207
        s->b_bidir_back_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
208
        if (s->b_bidir_back_mv_table == NULL) {
209
            perror("malloc");
210
            goto fail;
211
        }
212
        s->b_direct_forw_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
213
        if (s->b_direct_forw_mv_table == NULL) {
214
            perror("malloc");
215
            goto fail;
216
        }
217
        s->b_direct_back_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
218
        if (s->b_direct_back_mv_table == NULL) {
219
            perror("malloc");
220
            goto fail;
221
        }
222
        s->b_direct_mv_table = av_mallocz(mv_table_size * 2 * sizeof(INT16));
223
        if (s->b_direct_mv_table == NULL) {
224
            perror("malloc");
225
            goto fail;
226
        }
227

    
228
        if(s->max_b_frames){
229
            for(j=0; j<REORDER_BUFFER_SIZE; j++){
230
                int i;
231
                for(i=0;i<3;i++) {
232
                    int w, h, shift;
233

    
234
                    w = s->linesize;
235
                    h = s->mb_height * 16;
236
                    shift = (i == 0) ? 0 : 1;
237
                    c_size = (w >> shift) * (h >> shift);
238

    
239
                    pict = av_mallocz(c_size);
240
                    if (pict == NULL)
241
                        goto fail;
242
                    s->picture_buffer[j][i] = pict;
243
                }
244
            }
245
        }
246
    }
247
    
248
    if (s->out_format == FMT_H263 || s->encoding) {
249
        int size;
250
        /* MV prediction */
251
        size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
252
        s->motion_val = malloc(size * 2 * sizeof(INT16));
253
        if (s->motion_val == NULL)
254
            goto fail;
255
        memset(s->motion_val, 0, size * 2 * sizeof(INT16));
256
    }
257

    
258
    if (s->h263_pred || s->h263_plus) {
259
        int y_size, c_size, i, size;
260
        
261
        /* dc values */
262

    
263
        y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
264
        c_size = (s->mb_width + 2) * (s->mb_height + 2);
265
        size = y_size + 2 * c_size;
266
        s->dc_val[0] = malloc(size * sizeof(INT16));
267
        if (s->dc_val[0] == NULL)
268
            goto fail;
269
        s->dc_val[1] = s->dc_val[0] + y_size;
270
        s->dc_val[2] = s->dc_val[1] + c_size;
271
        for(i=0;i<size;i++)
272
            s->dc_val[0][i] = 1024;
273

    
274
        /* ac values */
275
        s->ac_val[0] = av_mallocz(size * sizeof(INT16) * 16);
276
        if (s->ac_val[0] == NULL)
277
            goto fail;
278
        s->ac_val[1] = s->ac_val[0] + y_size;
279
        s->ac_val[2] = s->ac_val[1] + c_size;
280
        
281
        /* cbp values */
282
        s->coded_block = av_mallocz(y_size);
283
        if (!s->coded_block)
284
            goto fail;
285

    
286
        /* which mb is a intra block */
287
        s->mbintra_table = av_mallocz(s->mb_num);
288
        if (!s->mbintra_table)
289
            goto fail;
290
        memset(s->mbintra_table, 1, s->mb_num);
291
    }
292
    /* default structure is frame */
293
    s->picture_structure = PICT_FRAME;
294

    
295
    /* init macroblock skip table */
296
    s->mbskip_table = av_mallocz(s->mb_num);
297
    if (!s->mbskip_table)
298
        goto fail;
299
    
300
    s->block= s->intra_block;
301

    
302
    s->context_initialized = 1;
303
    return 0;
304
 fail:
305
    MPV_common_end(s);
306
    return -1;
307
}
308

    
309
#define CHECK_FREE(p)\
310
{\
311
    if(p) free(p);\
312
    p= NULL;\
313
}
314

    
315
/* init common structure for both encoder and decoder */
316
void MPV_common_end(MpegEncContext *s)
317
{
318
    int i;
319

    
320
    CHECK_FREE(s->mb_type);
321
    CHECK_FREE(s->mb_var);
322
    CHECK_FREE(s->p_mv_table);
323
    CHECK_FREE(s->last_p_mv_table);
324
    CHECK_FREE(s->b_forw_mv_table);
325
    CHECK_FREE(s->b_back_mv_table);
326
    CHECK_FREE(s->b_bidir_forw_mv_table);
327
    CHECK_FREE(s->b_bidir_back_mv_table);
328
    CHECK_FREE(s->b_direct_forw_mv_table);
329
    CHECK_FREE(s->b_direct_back_mv_table);
330
    CHECK_FREE(s->b_direct_mv_table);
331
    CHECK_FREE(s->motion_val);
332
    CHECK_FREE(s->dc_val[0]);
333
    CHECK_FREE(s->ac_val[0]);
334
    CHECK_FREE(s->coded_block);
335
    CHECK_FREE(s->mbintra_table);
336

    
337
    CHECK_FREE(s->mbskip_table);
338
    for(i=0;i<3;i++) {
339
        int j;
340
        CHECK_FREE(s->last_picture_base[i]);
341
        CHECK_FREE(s->next_picture_base[i]);
342
        CHECK_FREE(s->aux_picture_base[i]);
343
        for(j=0; j<REORDER_BUFFER_SIZE; j++){
344
            CHECK_FREE(s->picture_buffer[j][i]);
345
        }
346
    }
347
    s->context_initialized = 0;
348
}
349

    
350
/* init video encoder */
351
int MPV_encode_init(AVCodecContext *avctx)
352
{
353
    MpegEncContext *s = avctx->priv_data;
354
    int i;
355

    
356
    avctx->pix_fmt = PIX_FMT_YUV420P;
357

    
358
    s->bit_rate = avctx->bit_rate;
359
    s->bit_rate_tolerance = avctx->bit_rate_tolerance;
360
    s->frame_rate = avctx->frame_rate;
361
    s->width = avctx->width;
362
    s->height = avctx->height;
363
    s->gop_size = avctx->gop_size;
364
    s->rtp_mode = avctx->rtp_mode;
365
    s->rtp_payload_size = avctx->rtp_payload_size;
366
    if (avctx->rtp_callback)
367
        s->rtp_callback = avctx->rtp_callback;
368
    s->qmin= avctx->qmin;
369
    s->qmax= avctx->qmax;
370
    s->max_qdiff= avctx->max_qdiff;
371
    s->qcompress= avctx->qcompress;
372
    s->qblur= avctx->qblur;
373
    s->avctx = avctx;
374
    s->aspect_ratio_info= avctx->aspect_ratio_info;
375
    s->flags= avctx->flags;
376
    s->max_b_frames= avctx->max_b_frames;
377
    
378
    if (s->gop_size <= 1) {
379
        s->intra_only = 1;
380
        s->gop_size = 12;
381
    } else {
382
        s->intra_only = 0;
383
    }
384
    
385
    /* ME algorithm */
386
    if (avctx->me_method == 0)
387
        /* For compatibility */
388
        s->me_method = motion_estimation_method;
389
    else
390
        s->me_method = avctx->me_method;
391
        
392
    /* Fixed QSCALE */
393
    s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
394
    
395
    switch(avctx->codec->id) {
396
    case CODEC_ID_MPEG1VIDEO:
397
        s->out_format = FMT_MPEG1;
398
        break;
399
    case CODEC_ID_MJPEG:
400
        s->out_format = FMT_MJPEG;
401
        s->intra_only = 1; /* force intra only for jpeg */
402
        s->mjpeg_write_tables = 1; /* write all tables */
403
        s->mjpeg_vsample[0] = 2; /* set up default sampling factors */
404
        s->mjpeg_vsample[1] = 1; /* the only currently supported values */
405
        s->mjpeg_vsample[2] = 1; 
406
        s->mjpeg_hsample[0] = 2; 
407
        s->mjpeg_hsample[1] = 1; 
408
        s->mjpeg_hsample[2] = 1; 
409
        if (mjpeg_init(s) < 0)
410
            return -1;
411
        break;
412
    case CODEC_ID_H263:
413
        if (h263_get_picture_format(s->width, s->height) == 7) {
414
            printf("Input picture size isn't suitable for h263 codec! try h263+\n");
415
            return -1;
416
        }
417
        s->out_format = FMT_H263;
418
        break;
419
    case CODEC_ID_H263P:
420
        s->out_format = FMT_H263;
421
        s->rtp_mode = 1;
422
        s->rtp_payload_size = 1200; 
423
        s->h263_plus = 1;
424
        s->unrestricted_mv = 1;
425
        
426
        /* These are just to be sure */
427
        s->umvplus = 0;
428
        s->umvplus_dec = 0;
429
        break;
430
    case CODEC_ID_RV10:
431
        s->out_format = FMT_H263;
432
        s->h263_rv10 = 1;
433
        break;
434
    case CODEC_ID_MPEG4:
435
        s->out_format = FMT_H263;
436
        s->h263_pred = 1;
437
        s->unrestricted_mv = 1;
438
        s->has_b_frames= s->max_b_frames ? 1 : 0;
439
        break;
440
    case CODEC_ID_MSMPEG4V1:
441
        s->out_format = FMT_H263;
442
        s->h263_msmpeg4 = 1;
443
        s->h263_pred = 1;
444
        s->unrestricted_mv = 1;
445
        s->msmpeg4_version= 1;
446
        break;
447
    case CODEC_ID_MSMPEG4V2:
448
        s->out_format = FMT_H263;
449
        s->h263_msmpeg4 = 1;
450
        s->h263_pred = 1;
451
        s->unrestricted_mv = 1;
452
        s->msmpeg4_version= 2;
453
        break;
454
    case CODEC_ID_MSMPEG4V3:
455
        s->out_format = FMT_H263;
456
        s->h263_msmpeg4 = 1;
457
        s->h263_pred = 1;
458
        s->unrestricted_mv = 1;
459
        s->msmpeg4_version= 3;
460
        break;
461
    default:
462
        return -1;
463
    }
464
    
465
    if((s->flags&CODEC_FLAG_4MV) && !(s->flags&CODEC_FLAG_HQ)){
466
        printf("4MV is currently only supported in HQ mode\n");
467
        return -1;
468
    }
469

    
470
    { /* set up some save defaults, some codecs might override them later */
471
        static int done=0;
472
        if(!done){
473
            int i;
474
            done=1;
475
            memset(default_mv_penalty, 0, sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1));
476
            memset(default_fcode_tab , 0, sizeof(UINT8)*(2*MAX_MV+1));
477

    
478
            for(i=-16; i<16; i++){
479
                default_fcode_tab[i + MAX_MV]= 1;
480
            }
481
        }
482
    }
483
    s->mv_penalty= default_mv_penalty;
484
    s->fcode_tab= default_fcode_tab;
485

    
486
    if (s->out_format == FMT_H263)
487
        h263_encode_init(s);
488
    else if (s->out_format == FMT_MPEG1)
489
        mpeg1_encode_init(s);
490

    
491
    /* dont use mv_penalty table for crap MV as it would be confused */
492
    if (s->me_method < ME_EPZS) s->mv_penalty = default_mv_penalty;
493

    
494
    s->encoding = 1;
495

    
496
    /* init */
497
    if (MPV_common_init(s) < 0)
498
        return -1;
499
    
500
    /* init default q matrix */
501
    for(i=0;i<64;i++) {
502
        s->intra_matrix[i] = default_intra_matrix[i];
503
        s->non_intra_matrix[i] = default_non_intra_matrix[i];
504
    }
505

    
506
    /* rate control init */
507
    rate_control_init(s);
508

    
509
    s->picture_number = 0;
510
    s->picture_in_gop_number = 0;
511
    s->fake_picture_number = 0;
512
    /* motion detector init */
513
    s->f_code = 1;
514
    s->b_code = 1;
515

    
516
    return 0;
517
}
518

    
519
int MPV_encode_end(AVCodecContext *avctx)
520
{
521
    MpegEncContext *s = avctx->priv_data;
522

    
523
#ifdef STATS
524
    print_stats();
525
#endif
526
    MPV_common_end(s);
527
    if (s->out_format == FMT_MJPEG)
528
        mjpeg_close(s);
529
      
530
    return 0;
531
}
532

    
533
/* draw the edges of width 'w' of an image of size width, height */
534
static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w)
535
{
536
    UINT8 *ptr, *last_line;
537
    int i;
538

    
539
    last_line = buf + (height - 1) * wrap;
540
    for(i=0;i<w;i++) {
541
        /* top and bottom */
542
        memcpy(buf - (i + 1) * wrap, buf, width);
543
        memcpy(last_line + (i + 1) * wrap, last_line, width);
544
    }
545
    /* left and right */
546
    ptr = buf;
547
    for(i=0;i<height;i++) {
548
        memset(ptr - w, ptr[0], w);
549
        memset(ptr + width, ptr[width-1], w);
550
        ptr += wrap;
551
    }
552
    /* corners */
553
    for(i=0;i<w;i++) {
554
        memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
555
        memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
556
        memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
557
        memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
558
    }
559
}
560

    
561
/* generic function for encode/decode called before a frame is coded/decoded */
562
void MPV_frame_start(MpegEncContext *s)
563
{
564
    int i;
565
    UINT8 *tmp;
566

    
567
    s->mb_skiped = 0;
568
    if (s->pict_type == B_TYPE) {
569
        for(i=0;i<3;i++) {
570
            s->current_picture[i] = s->aux_picture[i];
571
        }
572
    } else {
573
        s->last_non_b_pict_type= s->pict_type;
574
        for(i=0;i<3;i++) {
575
            /* swap next and last */
576
            tmp = s->last_picture[i];
577
            s->last_picture[i] = s->next_picture[i];
578
            s->next_picture[i] = tmp;
579
            s->current_picture[i] = tmp;
580
        }
581
    }
582
}
583

    
584
/* generic function for encode/decode called after a frame has been coded/decoded */
585
void MPV_frame_end(MpegEncContext *s)
586
{
587
    /* draw edge for correct motion prediction if outside */
588
    if (s->pict_type != B_TYPE && !s->intra_only) {
589
      if(s->avctx==NULL || s->avctx->codec->id!=CODEC_ID_MPEG4 || s->divx_version==500){
590
        draw_edges(s->current_picture[0], s->linesize, s->mb_width*16, s->mb_height*16, EDGE_WIDTH);
591
        draw_edges(s->current_picture[1], s->linesize/2, s->mb_width*8, s->mb_height*8, EDGE_WIDTH/2);
592
        draw_edges(s->current_picture[2], s->linesize/2, s->mb_width*8, s->mb_height*8, EDGE_WIDTH/2);
593
      }else{
594
        /* mpeg4? / opendivx / xvid */
595
        draw_edges(s->current_picture[0], s->linesize, s->width, s->height, EDGE_WIDTH);
596
        draw_edges(s->current_picture[1], s->linesize/2, s->width/2, s->height/2, EDGE_WIDTH/2);
597
        draw_edges(s->current_picture[2], s->linesize/2, s->width/2, s->height/2, EDGE_WIDTH/2);
598
      }
599
    }
600
    emms_c();
601
}
602

    
603
/* reorder input for encoding */
604
void reorder_input(MpegEncContext *s, AVPicture *pict)
605
{
606
    int i, j, index;
607
            
608
    if(s->max_b_frames > FF_MAX_B_FRAMES) s->max_b_frames= FF_MAX_B_FRAMES;
609

    
610
//        delay= s->max_b_frames+1; (or 0 if no b frames cuz decoder diff)
611

    
612
    for(j=0; j<REORDER_BUFFER_SIZE-1; j++){
613
        s->coded_order[j]= s->coded_order[j+1];
614
    }
615
    s->coded_order[j].picture[0]= s->coded_order[j].picture[1]= s->coded_order[j].picture[2]= NULL; //catch uninitalized buffers
616

    
617
    switch(s->input_pict_type){
618
    default: 
619
    case I_TYPE:
620
    case S_TYPE:
621
    case P_TYPE:
622
        index= s->max_b_frames - s->b_frames_since_non_b;
623
        s->b_frames_since_non_b=0;
624
        break;            
625
    case B_TYPE:
626
        index= s->max_b_frames + 1;
627
        s->b_frames_since_non_b++;
628
        break;          
629
    }
630
//printf("index:%d type:%d strides: %d %d\n", index, s->input_pict_type, pict->linesize[0], s->linesize);
631
    if(   (index==0 || (s->flags&CODEC_FLAG_INPUT_PRESERVED))
632
       && pict->linesize[0] == s->linesize
633
       && pict->linesize[1] == s->linesize>>1
634
       && pict->linesize[2] == s->linesize>>1){
635
//printf("ptr\n");
636
        for(i=0; i<3; i++){
637
            s->coded_order[index].picture[i]= pict->data[i];
638
        }
639
    }else{
640
//printf("copy\n");
641
        for(i=0; i<3; i++){
642
            uint8_t *src = pict->data[i];
643
            uint8_t *dest;
644
            int src_wrap = pict->linesize[i];
645
            int dest_wrap = s->linesize;
646
            int w = s->width;
647
            int h = s->height;
648

    
649
            if(index==0) dest= s->last_picture[i]+16; //is current_picture indeed but the switch hapens after reordering
650
            else         dest= s->picture_buffer[s->picture_buffer_index][i];
651

    
652
            if (i >= 1) {
653
                dest_wrap >>= 1;
654
                w >>= 1;
655
                h >>= 1;
656
            }
657

    
658
            s->coded_order[index].picture[i]= dest;
659
            for(j=0;j<h;j++) {
660
                memcpy(dest, src, w);
661
                dest += dest_wrap;
662
                src += src_wrap;
663
            }
664
        }
665
        if(index!=0){
666
            s->picture_buffer_index++;
667
            if(s->picture_buffer_index >= REORDER_BUFFER_SIZE-1) s->picture_buffer_index=0;
668
        }
669
    }
670
    s->coded_order[index].pict_type = s->input_pict_type;
671
    s->coded_order[index].qscale    = s->input_qscale;
672
    s->coded_order[index].force_type= s->force_input_type;
673
    s->coded_order[index].picture_in_gop_number= s->input_picture_in_gop_number;
674
    s->coded_order[index].picture_number= s->input_picture_number;
675

    
676
    for(i=0; i<3; i++){
677
        s->new_picture[i]= s->coded_order[0].picture[i];
678
    }
679
}
680

    
681
int MPV_encode_picture(AVCodecContext *avctx,
682
                       unsigned char *buf, int buf_size, void *data)
683
{
684
    MpegEncContext *s = avctx->priv_data;
685
    AVPicture *pict = data;
686

    
687
    s->input_qscale = avctx->quality;
688

    
689
    init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
690

    
691
    s->force_input_type= (avctx->flags&CODEC_FLAG_TYPE) ?
692
        (avctx->key_frame ? I_TYPE : P_TYPE) : 0;
693
    if (!s->intra_only) {
694
        /* first picture of GOP is intra */
695
        if (s->input_picture_in_gop_number % s->gop_size==0 || s->force_input_type==I_TYPE){
696
            s->input_picture_in_gop_number=0;
697
            s->input_pict_type = I_TYPE;
698
        }else if(s->max_b_frames==0){
699
            s->input_pict_type = P_TYPE;
700
        }else{
701
            if(s->b_frames_since_non_b < s->max_b_frames) //FIXME more IQ
702
                s->input_pict_type = B_TYPE;
703
            else
704
                s->input_pict_type = P_TYPE;
705
        }
706
    } else {
707
        s->input_pict_type = I_TYPE;
708
    }
709

    
710
    reorder_input(s, pict);
711
    
712
    /* output? */
713
    if(s->coded_order[0].picture[0]){
714

    
715
        s->pict_type= s->coded_order[0].pict_type;
716
        if (s->fixed_qscale) /* the ratecontrol needs the last qscale so we dont touch it for CBR */
717
            s->qscale= s->coded_order[0].qscale;
718
        s->force_type= s->coded_order[0].force_type;
719
        s->picture_in_gop_number= s->coded_order[0].picture_in_gop_number;
720
        s->picture_number= s->coded_order[0].picture_number;
721

    
722
        MPV_frame_start(s);
723

    
724
        encode_picture(s, s->picture_number);
725
        avctx->key_frame = (s->pict_type == I_TYPE);
726
        avctx->header_bits = s->header_bits;
727
        avctx->mv_bits     = s->mv_bits;
728
        avctx->misc_bits   = s->misc_bits;
729
        avctx->i_tex_bits  = s->i_tex_bits;
730
        avctx->p_tex_bits  = s->p_tex_bits;
731
        avctx->i_count     = s->i_count;
732
        avctx->p_count     = s->p_count;
733
        avctx->skip_count  = s->skip_count;
734

    
735
        MPV_frame_end(s);
736

    
737
        if (s->out_format == FMT_MJPEG)
738
            mjpeg_picture_trailer(s);
739

    
740
        avctx->quality = s->qscale;
741
    }
742

    
743
    s->input_picture_number++;
744
    s->input_picture_in_gop_number++;
745

    
746
    flush_put_bits(&s->pb);
747
    s->last_frame_bits= s->frame_bits;
748
    s->frame_bits  = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
749
    s->total_bits += s->frame_bits;
750
    avctx->frame_bits  = s->frame_bits;
751
//printf("fcode: %d, type: %d, head: %d, mv: %d, misc: %d, frame: %d, itex: %d, ptex: %d\n", 
752
//s->f_code, avctx->key_frame, s->header_bits, s->mv_bits, s->misc_bits, s->frame_bits, s->i_tex_bits, s->p_tex_bits);
753

    
754
    if (avctx->get_psnr) {
755
        /* At this point pict->data should have the original frame   */
756
        /* an s->current_picture should have the coded/decoded frame */
757
        get_psnr(pict->data, s->current_picture,
758
                 pict->linesize, s->linesize, avctx);
759
//        printf("%f\n", avctx->psnr_y);
760
    }
761
    return pbBufPtr(&s->pb) - s->pb.buf;
762
}
763

    
764
static inline int clip(int a, int amin, int amax)
765
{
766
    if (a < amin)
767
        return amin;
768
    else if (a > amax)
769
        return amax;
770
    else
771
        return a;
772
}
773

    
774
static inline void gmc1_motion(MpegEncContext *s,
775
                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
776
                               int dest_offset,
777
                               UINT8 **ref_picture, int src_offset,
778
                               int h)
779
{
780
    UINT8 *ptr;
781
    int offset, src_x, src_y, linesize;
782
    int motion_x, motion_y;
783

    
784
    if(s->real_sprite_warping_points>1) printf("more than 1 warp point isnt supported\n");
785
    motion_x= s->sprite_offset[0][0];
786
    motion_y= s->sprite_offset[0][1];
787
    src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
788
    src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
789
    motion_x<<=(3-s->sprite_warping_accuracy);
790
    motion_y<<=(3-s->sprite_warping_accuracy);
791
    src_x = clip(src_x, -16, s->width);
792
    if (src_x == s->width)
793
        motion_x =0;
794
    src_y = clip(src_y, -16, s->height);
795
    if (src_y == s->height)
796
        motion_y =0;
797
    
798
    linesize = s->linesize;
799
    ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
800

    
801
    dest_y+=dest_offset;
802
    gmc1(dest_y  , ptr  , linesize, h, motion_x&15, motion_y&15, s->no_rounding);
803
    gmc1(dest_y+8, ptr+8, linesize, h, motion_x&15, motion_y&15, s->no_rounding);
804

    
805
    motion_x= s->sprite_offset[1][0];
806
    motion_y= s->sprite_offset[1][1];
807
    src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
808
    src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
809
    motion_x<<=(3-s->sprite_warping_accuracy);
810
    motion_y<<=(3-s->sprite_warping_accuracy);
811
    src_x = clip(src_x, -8, s->width>>1);
812
    if (src_x == s->width>>1)
813
        motion_x =0;
814
    src_y = clip(src_y, -8, s->height>>1);
815
    if (src_y == s->height>>1)
816
        motion_y =0;
817

    
818
    offset = (src_y * linesize>>1) + src_x + (src_offset>>1);
819
    ptr = ref_picture[1] + offset;
820
    gmc1(dest_cb + (dest_offset>>1), ptr, linesize>>1, h>>1, motion_x&15, motion_y&15, s->no_rounding);
821
    ptr = ref_picture[2] + offset;
822
    gmc1(dest_cr + (dest_offset>>1), ptr, linesize>>1, h>>1, motion_x&15, motion_y&15, s->no_rounding);
823
    
824
    return;
825
}
826

    
827
/* apply one mpeg motion vector to the three components */
828
static inline void mpeg_motion(MpegEncContext *s,
829
                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
830
                               int dest_offset,
831
                               UINT8 **ref_picture, int src_offset,
832
                               int field_based, op_pixels_func *pix_op,
833
                               int motion_x, int motion_y, int h)
834
{
835
    UINT8 *ptr;
836
    int dxy, offset, mx, my, src_x, src_y, height, linesize;
837
if(s->quarter_sample)
838
{
839
    motion_x>>=1;
840
    motion_y>>=1;
841
}
842

    
843
    dxy = ((motion_y & 1) << 1) | (motion_x & 1);
844
    src_x = s->mb_x * 16 + (motion_x >> 1);
845
    src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);
846
                
847
    /* WARNING: do no forget half pels */
848
    height = s->height >> field_based;
849
    src_x = clip(src_x, -16, s->width);
850
    if (src_x == s->width)
851
        dxy &= ~1;
852
    src_y = clip(src_y, -16, height);
853
    if (src_y == height)
854
        dxy &= ~2;
855
    linesize = s->linesize << field_based;
856
    ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;
857
    dest_y += dest_offset;
858
    pix_op[dxy](dest_y, ptr, linesize, h);
859
    pix_op[dxy](dest_y + 8, ptr + 8, linesize, h);
860

    
861
    if (s->out_format == FMT_H263) {
862
        dxy = 0;
863
        if ((motion_x & 3) != 0)
864
            dxy |= 1;
865
        if ((motion_y & 3) != 0)
866
            dxy |= 2;
867
        mx = motion_x >> 2;
868
        my = motion_y >> 2;
869
    } else {
870
        mx = motion_x / 2;
871
        my = motion_y / 2;
872
        dxy = ((my & 1) << 1) | (mx & 1);
873
        mx >>= 1;
874
        my >>= 1;
875
    }
876
    
877
    src_x = s->mb_x * 8 + mx;
878
    src_y = s->mb_y * (8 >> field_based) + my;
879
    src_x = clip(src_x, -8, s->width >> 1);
880
    if (src_x == (s->width >> 1))
881
        dxy &= ~1;
882
    src_y = clip(src_y, -8, height >> 1);
883
    if (src_y == (height >> 1))
884
        dxy &= ~2;
885

    
886
    offset = (src_y * (linesize >> 1)) + src_x + (src_offset >> 1);
887
    ptr = ref_picture[1] + offset;
888
    pix_op[dxy](dest_cb + (dest_offset >> 1), ptr, linesize >> 1, h >> 1);
889
    ptr = ref_picture[2] + offset;
890
    pix_op[dxy](dest_cr + (dest_offset >> 1), ptr, linesize >> 1, h >> 1);
891
}
892

    
893
static inline void qpel_motion(MpegEncContext *s,
894
                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
895
                               int dest_offset,
896
                               UINT8 **ref_picture, int src_offset,
897
                               int field_based, op_pixels_func *pix_op,
898
                               qpel_mc_func *qpix_op,
899
                               int motion_x, int motion_y, int h)
900
{
901
    UINT8 *ptr;
902
    int dxy, offset, mx, my, src_x, src_y, height, linesize;
903

    
904
    dxy = ((motion_y & 3) << 2) | (motion_x & 3);
905
    src_x = s->mb_x * 16 + (motion_x >> 2);
906
    src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
907

    
908
    height = s->height >> field_based;
909
    src_x = clip(src_x, -16, s->width);
910
    if (src_x == s->width)
911
        dxy &= ~3;
912
    src_y = clip(src_y, -16, height);
913
    if (src_y == height)
914
        dxy &= ~12;
915
    linesize = s->linesize << field_based;
916
    ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
917
    dest_y += dest_offset;
918
//printf("%d %d %d\n", src_x, src_y, dxy);
919
    qpix_op[dxy](dest_y                 , ptr                 , linesize, linesize, motion_x&3, motion_y&3);
920
    qpix_op[dxy](dest_y              + 8, ptr              + 8, linesize, linesize, motion_x&3, motion_y&3);
921
    qpix_op[dxy](dest_y + linesize*8    , ptr + linesize*8    , linesize, linesize, motion_x&3, motion_y&3);
922
    qpix_op[dxy](dest_y + linesize*8 + 8, ptr + linesize*8 + 8, linesize, linesize, motion_x&3, motion_y&3);
923
    
924
    mx= (motion_x>>1) | (motion_x&1);
925
    my= (motion_y>>1) | (motion_y&1);
926

    
927
    dxy = 0;
928
    if ((mx & 3) != 0)
929
        dxy |= 1;
930
    if ((my & 3) != 0)
931
        dxy |= 2;
932
    mx = mx >> 2;
933
    my = my >> 2;
934
    
935
    src_x = s->mb_x * 8 + mx;
936
    src_y = s->mb_y * (8 >> field_based) + my;
937
    src_x = clip(src_x, -8, s->width >> 1);
938
    if (src_x == (s->width >> 1))
939
        dxy &= ~1;
940
    src_y = clip(src_y, -8, height >> 1);
941
    if (src_y == (height >> 1))
942
        dxy &= ~2;
943

    
944
    offset = (src_y * (linesize >> 1)) + src_x + (src_offset >> 1);
945
    ptr = ref_picture[1] + offset;
946
    pix_op[dxy](dest_cb + (dest_offset >> 1), ptr, linesize >> 1, h >> 1);
947
    ptr = ref_picture[2] + offset;
948
    pix_op[dxy](dest_cr + (dest_offset >> 1), ptr, linesize >> 1, h >> 1);
949
}
950

    
951

    
952
static inline void MPV_motion(MpegEncContext *s, 
953
                              UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
954
                              int dir, UINT8 **ref_picture, 
955
                              op_pixels_func *pix_op, qpel_mc_func *qpix_op)
956
{
957
    int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;
958
    int mb_x, mb_y, i;
959
    UINT8 *ptr, *dest;
960

    
961
    mb_x = s->mb_x;
962
    mb_y = s->mb_y;
963

    
964
    switch(s->mv_type) {
965
    case MV_TYPE_16X16:
966
        if(s->mcsel){
967
#if 0
968
            mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
969
                        ref_picture, 0,
970
                        0, pix_op,
971
                        s->sprite_offset[0][0]>>3,
972
                        s->sprite_offset[0][1]>>3,
973
                        16);
974
#else
975
            gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,
976
                        ref_picture, 0,
977
                        16);
978
#endif
979
        }else if(s->quarter_sample && dir==0){ //FIXME
980
            qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
981
                        ref_picture, 0,
982
                        0, pix_op, qpix_op,
983
                        s->mv[dir][0][0], s->mv[dir][0][1], 16);
984
        }else{
985
            mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
986
                        ref_picture, 0,
987
                        0, pix_op,
988
                        s->mv[dir][0][0], s->mv[dir][0][1], 16);
989
        }           
990
        break;
991
    case MV_TYPE_8X8:
992
        for(i=0;i<4;i++) {
993
            motion_x = s->mv[dir][i][0];
994
            motion_y = s->mv[dir][i][1];
995

    
996
            dxy = ((motion_y & 1) << 1) | (motion_x & 1);
997
            src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
998
            src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;
999
                    
1000
            /* WARNING: do no forget half pels */
1001
            src_x = clip(src_x, -16, s->width);
1002
            if (src_x == s->width)
1003
                dxy &= ~1;
1004
            src_y = clip(src_y, -16, s->height);
1005
            if (src_y == s->height)
1006
                dxy &= ~2;
1007
                    
1008
            ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1009
            dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1010
            pix_op[dxy](dest, ptr, s->linesize, 8);
1011
        }
1012
        /* In case of 8X8, we construct a single chroma motion vector
1013
           with a special rounding */
1014
        mx = 0;
1015
        my = 0;
1016
        for(i=0;i<4;i++) {
1017
            mx += s->mv[dir][i][0];
1018
            my += s->mv[dir][i][1];
1019
        }
1020
        if (mx >= 0)
1021
            mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
1022
        else {
1023
            mx = -mx;
1024
            mx = -(h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
1025
        }
1026
        if (my >= 0)
1027
            my = (h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
1028
        else {
1029
            my = -my;
1030
            my = -(h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
1031
        }
1032
        dxy = ((my & 1) << 1) | (mx & 1);
1033
        mx >>= 1;
1034
        my >>= 1;
1035

    
1036
        src_x = mb_x * 8 + mx;
1037
        src_y = mb_y * 8 + my;
1038
        src_x = clip(src_x, -8, s->width/2);
1039
        if (src_x == s->width/2)
1040
            dxy &= ~1;
1041
        src_y = clip(src_y, -8, s->height/2);
1042
        if (src_y == s->height/2)
1043
            dxy &= ~2;
1044
        
1045
        offset = (src_y * (s->linesize >> 1)) + src_x;
1046
        ptr = ref_picture[1] + offset;
1047
        pix_op[dxy](dest_cb, ptr, s->linesize >> 1, 8);
1048
        ptr = ref_picture[2] + offset;
1049
        pix_op[dxy](dest_cr, ptr, s->linesize >> 1, 8);
1050
        break;
1051
    case MV_TYPE_FIELD:
1052
        if (s->picture_structure == PICT_FRAME) {
1053
            /* top field */
1054
            mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
1055
                        ref_picture, s->field_select[dir][0] ? s->linesize : 0,
1056
                        1, pix_op,
1057
                        s->mv[dir][0][0], s->mv[dir][0][1], 8);
1058
            /* bottom field */
1059
            mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
1060
                        ref_picture, s->field_select[dir][1] ? s->linesize : 0,
1061
                        1, pix_op,
1062
                        s->mv[dir][1][0], s->mv[dir][1][1], 8);
1063
        } else {
1064
            
1065

    
1066
        }
1067
        break;
1068
    }
1069
}
1070

    
1071

    
1072
/* put block[] to dest[] */
1073
static inline void put_dct(MpegEncContext *s, 
1074
                           DCTELEM *block, int i, UINT8 *dest, int line_size)
1075
{
1076
    if (!s->mpeg2)
1077
        s->dct_unquantize(s, block, i, s->qscale);
1078
    ff_idct (block);
1079
    put_pixels_clamped(block, dest, line_size);
1080
}
1081

    
1082
/* add block[] to dest[] */
1083
static inline void add_dct(MpegEncContext *s, 
1084
                           DCTELEM *block, int i, UINT8 *dest, int line_size)
1085
{
1086
    if (s->block_last_index[i] >= 0) {
1087
        if (!s->mpeg2)
1088
            if(s->encoding || (!s->h263_msmpeg4))
1089
                s->dct_unquantize(s, block, i, s->qscale);
1090

    
1091
        ff_idct (block);
1092
        add_pixels_clamped(block, dest, line_size);
1093
    }
1094
}
1095

    
1096
/* generic function called after a macroblock has been parsed by the
1097
   decoder or after it has been encoded by the encoder.
1098

1099
   Important variables used:
1100
   s->mb_intra : true if intra macroblock
1101
   s->mv_dir   : motion vector direction
1102
   s->mv_type  : motion vector type
1103
   s->mv       : motion vector
1104
   s->interlaced_dct : true if interlaced dct used (mpeg2)
1105
 */
1106
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
1107
{
1108
    int mb_x, mb_y;
1109
    int dct_linesize, dct_offset;
1110
    op_pixels_func *op_pix;
1111
    qpel_mc_func *op_qpix;
1112

    
1113
    mb_x = s->mb_x;
1114
    mb_y = s->mb_y;
1115

    
1116
#ifdef FF_POSTPROCESS
1117
    quant_store[mb_y][mb_x]=s->qscale;
1118
    //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale);
1119
#endif
1120

    
1121
    /* update DC predictors for P macroblocks */
1122
    if (!s->mb_intra) {
1123
        if (s->h263_pred || s->h263_aic) {
1124
          if(s->mbintra_table[mb_x + mb_y*s->mb_width])
1125
          {
1126
            int wrap, xy, v;
1127
            s->mbintra_table[mb_x + mb_y*s->mb_width]=0;
1128
            wrap = 2 * s->mb_width + 2;
1129
            xy = 2 * mb_x + 1 +  (2 * mb_y + 1) * wrap;
1130
            v = 1024;
1131
            
1132
            s->dc_val[0][xy] = v;
1133
            s->dc_val[0][xy + 1] = v;
1134
            s->dc_val[0][xy + wrap] = v;
1135
            s->dc_val[0][xy + 1 + wrap] = v;
1136
            /* ac pred */
1137
            memset(s->ac_val[0][xy], 0, 16 * sizeof(INT16));
1138
            memset(s->ac_val[0][xy + 1], 0, 16 * sizeof(INT16));
1139
            memset(s->ac_val[0][xy + wrap], 0, 16 * sizeof(INT16));
1140
            memset(s->ac_val[0][xy + 1 + wrap], 0, 16 * sizeof(INT16));
1141
            if (s->h263_msmpeg4) {
1142
                s->coded_block[xy] = 0;
1143
                s->coded_block[xy + 1] = 0;
1144
                s->coded_block[xy + wrap] = 0;
1145
                s->coded_block[xy + 1 + wrap] = 0;
1146
            }
1147
            /* chroma */
1148
            wrap = s->mb_width + 2;
1149
            xy = mb_x + 1 + (mb_y + 1) * wrap;
1150
            s->dc_val[1][xy] = v;
1151
            s->dc_val[2][xy] = v;
1152
            /* ac pred */
1153
            memset(s->ac_val[1][xy], 0, 16 * sizeof(INT16));
1154
            memset(s->ac_val[2][xy], 0, 16 * sizeof(INT16));
1155
          }
1156
        } else {
1157
            s->last_dc[0] = 128 << s->intra_dc_precision;
1158
            s->last_dc[1] = 128 << s->intra_dc_precision;
1159
            s->last_dc[2] = 128 << s->intra_dc_precision;
1160
        }
1161
    }
1162
    else if (s->h263_pred || s->h263_aic)
1163
        s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
1164

    
1165
    /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
1166
    if (s->out_format == FMT_H263) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
1167
      if(s->pict_type!=B_TYPE){
1168
        int xy, wrap, motion_x, motion_y;
1169
        
1170
        wrap = 2 * s->mb_width + 2;
1171
        xy = 2 * mb_x + 1 + (2 * mb_y + 1) * wrap;
1172
        if (s->mb_intra) {
1173
            motion_x = 0;
1174
            motion_y = 0;
1175
            goto motion_init;
1176
        } else if (s->mv_type == MV_TYPE_16X16) {
1177
            motion_x = s->mv[0][0][0];
1178
            motion_y = s->mv[0][0][1];
1179
        motion_init:
1180
            /* no update if 8X8 because it has been done during parsing */
1181
            s->motion_val[xy][0] = motion_x;
1182
            s->motion_val[xy][1] = motion_y;
1183
            s->motion_val[xy + 1][0] = motion_x;
1184
            s->motion_val[xy + 1][1] = motion_y;
1185
            s->motion_val[xy + wrap][0] = motion_x;
1186
            s->motion_val[xy + wrap][1] = motion_y;
1187
            s->motion_val[xy + 1 + wrap][0] = motion_x;
1188
            s->motion_val[xy + 1 + wrap][1] = motion_y;
1189
        }
1190
      }
1191
    }
1192
    
1193
    if (!(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) {
1194
        UINT8 *dest_y, *dest_cb, *dest_cr;
1195
        UINT8 *mbskip_ptr;
1196

    
1197
        /* avoid copy if macroblock skipped in last frame too 
1198
           dont touch it for B-frames as they need the skip info from the next p-frame */
1199
        if (s->pict_type != B_TYPE) {
1200
            mbskip_ptr = &s->mbskip_table[s->mb_y * s->mb_width + s->mb_x];
1201
            if (s->mb_skiped) {
1202
                s->mb_skiped = 0;
1203
                /* if previous was skipped too, then nothing to do ! 
1204
                   skip only during decoding as we might trash the buffers during encoding a bit */
1205
                if (*mbskip_ptr != 0 && !s->encoding) 
1206
                    goto the_end;
1207
                *mbskip_ptr = 1; /* indicate that this time we skiped it */
1208
            } else {
1209
                *mbskip_ptr = 0; /* not skipped */
1210
            }
1211
        }
1212

    
1213
        dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize) + mb_x * 16;
1214
        dest_cb = s->current_picture[1] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8;
1215
        dest_cr = s->current_picture[2] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8;
1216

    
1217
        if (s->interlaced_dct) {
1218
            dct_linesize = s->linesize * 2;
1219
            dct_offset = s->linesize;
1220
        } else {
1221
            dct_linesize = s->linesize;
1222
            dct_offset = s->linesize * 8;
1223
        }
1224

    
1225
        if (!s->mb_intra) {
1226
            /* motion handling */
1227
            if((s->flags&CODEC_FLAG_HQ) || (!s->encoding)){
1228
                if (!s->no_rounding){
1229
                    op_pix = put_pixels_tab;
1230
                    op_qpix= qpel_mc_rnd_tab;
1231
                }else{
1232
                    op_pix = put_no_rnd_pixels_tab;
1233
                    op_qpix= qpel_mc_no_rnd_tab;
1234
                }
1235

    
1236
                if (s->mv_dir & MV_DIR_FORWARD) {
1237
                    MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix);
1238
                    if (!s->no_rounding) 
1239
                        op_pix = avg_pixels_tab;
1240
                    else
1241
                        op_pix = avg_no_rnd_pixels_tab;
1242
                }
1243
                if (s->mv_dir & MV_DIR_BACKWARD) {
1244
                    MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix);
1245
                }
1246
            }
1247

    
1248
            /* add dct residue */
1249
            add_dct(s, block[0], 0, dest_y, dct_linesize);
1250
            add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
1251
            add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
1252
            add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
1253

    
1254
            add_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
1255
            add_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
1256
        } else {
1257
            /* dct only in intra block */
1258
            put_dct(s, block[0], 0, dest_y, dct_linesize);
1259
            put_dct(s, block[1], 1, dest_y + 8, dct_linesize);
1260
            put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
1261
            put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
1262

    
1263
            put_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
1264
            put_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
1265
        }
1266
    }
1267
 the_end:
1268
    emms_c(); //FIXME remove
1269
}
1270

    
1271

    
1272
static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
1273
{
1274
    const int mb_x= s->mb_x;
1275
    const int mb_y= s->mb_y;
1276
    int i;
1277
#if 0
1278
        if (s->interlaced_dct) {
1279
            dct_linesize = s->linesize * 2;
1280
            dct_offset = s->linesize;
1281
        } else {
1282
            dct_linesize = s->linesize;
1283
            dct_offset = s->linesize * 8;
1284
        }
1285
#endif
1286

    
1287
    if (s->mb_intra) {
1288
        UINT8 *ptr;
1289
        int wrap;
1290

    
1291
        wrap = s->linesize;
1292
        ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16;
1293
        get_pixels(s->block[0], ptr               , wrap);
1294
        get_pixels(s->block[1], ptr            + 8, wrap);
1295
        get_pixels(s->block[2], ptr + 8 * wrap    , wrap);
1296
        get_pixels(s->block[3], ptr + 8 * wrap + 8, wrap);
1297

    
1298
        wrap >>=1;
1299
        ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8;
1300
        get_pixels(s->block[4], ptr, wrap);
1301

    
1302
        ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8;
1303
        get_pixels(s->block[5], ptr, wrap);
1304
    }else{
1305
        op_pixels_func *op_pix;
1306
        qpel_mc_func *op_qpix;
1307
        UINT8 *dest_y, *dest_cb, *dest_cr;
1308
        UINT8 *ptr;
1309
        int wrap;
1310

    
1311
        dest_y  = s->current_picture[0] + (mb_y * 16 * s->linesize       ) + mb_x * 16;
1312
        dest_cb = s->current_picture[1] + (mb_y * 8  * (s->linesize >> 1)) + mb_x * 8;
1313
        dest_cr = s->current_picture[2] + (mb_y * 8  * (s->linesize >> 1)) + mb_x * 8;
1314

    
1315
        if (!s->no_rounding){
1316
            op_pix = put_pixels_tab;
1317
            op_qpix= qpel_mc_rnd_tab;
1318
        }else{
1319
            op_pix = put_no_rnd_pixels_tab;
1320
            op_qpix= qpel_mc_no_rnd_tab;
1321
        }
1322

    
1323
        if (s->mv_dir & MV_DIR_FORWARD) {
1324
            MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix);
1325
            if (!s->no_rounding) 
1326
                op_pix = avg_pixels_tab;
1327
            else
1328
                op_pix = avg_no_rnd_pixels_tab;
1329
        }
1330
        if (s->mv_dir & MV_DIR_BACKWARD) {
1331
            MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix);
1332
        }
1333
        wrap = s->linesize;
1334
        ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16;
1335
        diff_pixels(s->block[0], ptr               , dest_y               , wrap);
1336
        diff_pixels(s->block[1], ptr            + 8, dest_y            + 8, wrap);
1337
        diff_pixels(s->block[2], ptr + 8 * wrap    , dest_y + 8 * wrap    , wrap);
1338
        diff_pixels(s->block[3], ptr + 8 * wrap + 8, dest_y + 8 * wrap + 8, wrap);
1339

    
1340
        wrap >>=1;
1341
        ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8;
1342
        diff_pixels(s->block[4], ptr, dest_cb, wrap);
1343

    
1344
        ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8;
1345
        diff_pixels(s->block[5], ptr, dest_cr, wrap);
1346
    }
1347
            
1348
#if 0
1349
            {
1350
                float adap_parm;
1351
                
1352
                adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_width*mb_y+mb_x] + 1.0) /
1353
                            ((s->mb_var[s->mb_width*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
1354
            
1355
                printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d", 
1356
                        (s->mb_type[s->mb_width*mb_y+mb_x] > 0) ? 'I' : 'P', 
1357
                        s->qscale, adap_parm, s->qscale*adap_parm,
1358
                        s->mb_var[s->mb_width*mb_y+mb_x], s->avg_mb_var);
1359
            }
1360
#endif
1361
    /* DCT & quantize */
1362
    if (s->h263_msmpeg4) {
1363
        msmpeg4_dc_scale(s);
1364
    } else if (s->h263_pred) {
1365
        h263_dc_scale(s);
1366
    } else {
1367
        /* default quantization values */
1368
        s->y_dc_scale = 8;
1369
        s->c_dc_scale = 8;
1370
    }
1371
    for(i=0;i<6;i++) {
1372
        s->block_last_index[i] = dct_quantize(s, s->block[i], i, s->qscale);
1373
    }
1374

    
1375
    /* huffman encode */
1376
    switch(s->out_format) {
1377
    case FMT_MPEG1:
1378
        mpeg1_encode_mb(s, s->block, motion_x, motion_y);
1379
        break;
1380
    case FMT_H263:
1381
        if (s->h263_msmpeg4)
1382
            msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
1383
        else if(s->h263_pred)
1384
            mpeg4_encode_mb(s, s->block, motion_x, motion_y);
1385
        else
1386
            h263_encode_mb(s, s->block, motion_x, motion_y);
1387
        break;
1388
    case FMT_MJPEG:
1389
        mjpeg_encode_mb(s, s->block);
1390
        break;
1391
    }
1392
}
1393

    
1394
static void copy_bits(PutBitContext *pb, UINT8 *src, int length)
1395
{
1396
#if 1
1397
    int bytes= length>>4;
1398
    int bits= length&15;
1399
    int i;
1400

    
1401
    for(i=0; i<bytes; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i]));
1402
    put_bits(pb, bits, be2me_16(((uint16_t*)src)[i])>>(16-bits));
1403
#else
1404
    int bytes= length>>3;
1405
    int bits= length&7;
1406
    int i;
1407

    
1408
    for(i=0; i<bytes; i++) put_bits(pb, 8, src[i]);
1409
    put_bits(pb, bits, src[i]>>(8-bits));
1410
#endif
1411
}
1412

    
1413
static void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
1414
    int i;
1415

    
1416
    memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
1417

    
1418
    /* mpeg1 */
1419
    d->mb_incr= s->mb_incr;
1420
    for(i=0; i<3; i++)
1421
        d->last_dc[i]= s->last_dc[i];
1422
    
1423
    /* statistics */
1424
    d->mv_bits= s->mv_bits;
1425
    d->i_tex_bits= s->i_tex_bits;
1426
    d->p_tex_bits= s->p_tex_bits;
1427
    d->i_count= s->i_count;
1428
    d->p_count= s->p_count;
1429
    d->skip_count= s->skip_count;
1430
    d->misc_bits= s->misc_bits;
1431
    d->last_bits= s->last_bits;
1432
}
1433

    
1434
static void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
1435
    int i;
1436

    
1437
    memcpy(d->mv, s->mv, 2*4*2*sizeof(int)); 
1438
    memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
1439
    
1440
    /* mpeg1 */
1441
    d->mb_incr= s->mb_incr;
1442
    for(i=0; i<3; i++)
1443
        d->last_dc[i]= s->last_dc[i];
1444
    
1445
    /* statistics */
1446
    d->mv_bits= s->mv_bits;
1447
    d->i_tex_bits= s->i_tex_bits;
1448
    d->p_tex_bits= s->p_tex_bits;
1449
    d->i_count= s->i_count;
1450
    d->p_count= s->p_count;
1451
    d->skip_count= s->skip_count;
1452
    d->misc_bits= s->misc_bits;
1453
    d->last_bits= s->last_bits;
1454

    
1455
    d->mb_intra= s->mb_intra;
1456
    d->mv_type= s->mv_type;
1457
    d->mv_dir= s->mv_dir;
1458
    d->pb= s->pb;
1459
    d->block= s->block;
1460
    for(i=0; i<6; i++)
1461
        d->block_last_index[i]= s->block_last_index[i];
1462
}
1463

    
1464

    
1465
static void encode_picture(MpegEncContext *s, int picture_number)
1466
{
1467
    int mb_x, mb_y, last_gob, pdif = 0;
1468
    int i;
1469
    int bits;
1470
    MpegEncContext best_s, backup_s;
1471
    UINT8 bit_buf[4][3000]; //FIXME check that this is ALLWAYS large enogh for a MB
1472

    
1473
    s->picture_number = picture_number;
1474

    
1475
    s->block_wrap[0]=
1476
    s->block_wrap[1]=
1477
    s->block_wrap[2]=
1478
    s->block_wrap[3]= s->mb_width*2 + 2;
1479
    s->block_wrap[4]=
1480
    s->block_wrap[5]= s->mb_width + 2;
1481
    
1482
    s->last_mc_mb_var = s->mc_mb_var;
1483
    /* Reset the average MB variance */
1484
    s->avg_mb_var = 0;
1485
    s->mc_mb_var = 0;
1486
    
1487
    /* Estimate motion for every MB */
1488
    if(s->pict_type != I_TYPE){
1489
//        int16_t (*tmp)[2]= s->p_mv_table;
1490
//        s->p_mv_table= s->last_mv_table;
1491
//        s->last_mv_table= s->mv_table;
1492
    
1493
        for(mb_y=0; mb_y < s->mb_height; mb_y++) {
1494
            s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
1495
            s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
1496
            s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
1497
            s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
1498
            for(mb_x=0; mb_x < s->mb_width; mb_x++) {
1499
                s->mb_x = mb_x;
1500
                s->mb_y = mb_y;
1501
                s->block_index[0]+=2;
1502
                s->block_index[1]+=2;
1503
                s->block_index[2]+=2;
1504
                s->block_index[3]+=2;
1505

    
1506
                /* compute motion vector & mb_type and store in context */
1507
                if(s->pict_type==B_TYPE)
1508
                    ff_estimate_b_frame_motion(s, mb_x, mb_y);
1509
                else
1510
                    ff_estimate_p_frame_motion(s, mb_x, mb_y);
1511
//                s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
1512
            }
1513
        }
1514
        emms_c();
1515
    }else if(s->pict_type == I_TYPE){
1516
        /* I-Frame */
1517
        //FIXME do we need to zero them?
1518
        memset(s->motion_val[0], 0, sizeof(INT16)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
1519
        memset(s->p_mv_table   , 0, sizeof(INT16)*(s->mb_width+2)*(s->mb_height+2)*2);
1520
        memset(s->mb_type      , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
1521
    }
1522

    
1523
    if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE && (!s->force_type) && s->max_b_frames==0){ //FIXME subtract MV bits
1524
        // FIXME b-frames & scene change detection
1525
        s->input_pict_type= I_TYPE;
1526
        s->pict_type= I_TYPE;
1527
        s->input_picture_in_gop_number=0;
1528
        memset(s->mb_type   , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
1529
//printf("Scene change detected, encoding as I Frame\n");
1530
    }
1531
    
1532
    if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) 
1533
        s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER);
1534
        ff_fix_long_p_mvs(s);
1535
    if(s->pict_type==B_TYPE){
1536
        s->f_code= ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD);
1537
        s->b_code= ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD);
1538
        //FIXME if BIDIR != for&back
1539
        ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD |MB_TYPE_BIDIR);
1540
        ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD|MB_TYPE_BIDIR);
1541
    }
1542
    
1543
//printf("f_code %d ///\n", s->f_code);
1544

    
1545
//    printf("%d %d\n", s->avg_mb_var, s->mc_mb_var);
1546

    
1547
    if (!s->fixed_qscale) 
1548
        s->qscale = rate_estimate_qscale(s);
1549

    
1550
    /* precompute matrix */
1551
    if (s->out_format == FMT_MJPEG) {
1552
        /* for mjpeg, we do include qscale in the matrix */
1553
        s->intra_matrix[0] = default_intra_matrix[0];
1554
        for(i=1;i<64;i++)
1555
            s->intra_matrix[i] = (default_intra_matrix[i] * s->qscale) >> 3;
1556
        convert_matrix(s->q_intra_matrix, s->q_intra_matrix16, s->intra_matrix, 8);
1557
    } else {
1558
        convert_matrix(s->q_intra_matrix, s->q_intra_matrix16, s->intra_matrix, s->qscale);
1559
        convert_matrix(s->q_non_intra_matrix, s->q_non_intra_matrix16, s->non_intra_matrix, s->qscale);
1560
    }
1561

    
1562
    s->last_bits= get_bit_count(&s->pb);
1563
    switch(s->out_format) {
1564
    case FMT_MJPEG:
1565
        mjpeg_picture_header(s);
1566
        break;
1567
    case FMT_H263:
1568
        if (s->h263_msmpeg4) 
1569
            msmpeg4_encode_picture_header(s, picture_number);
1570
        else if (s->h263_pred)
1571
            mpeg4_encode_picture_header(s, picture_number);
1572
        else if (s->h263_rv10) 
1573
            rv10_encode_picture_header(s, picture_number);
1574
        else
1575
            h263_encode_picture_header(s, picture_number);
1576
        break;
1577
    case FMT_MPEG1:
1578
        mpeg1_encode_picture_header(s, picture_number);
1579
        break;
1580
    }
1581
    bits= get_bit_count(&s->pb);
1582
    s->header_bits= bits - s->last_bits;
1583
    s->last_bits= bits;
1584
    s->mv_bits=0;
1585
    s->misc_bits=0;
1586
    s->i_tex_bits=0;
1587
    s->p_tex_bits=0;
1588
    s->i_count=0;
1589
    s->p_count=0;
1590
    s->skip_count=0;
1591

    
1592
    /* init last dc values */
1593
    /* note: quant matrix value (8) is implied here */
1594
    s->last_dc[0] = 128;
1595
    s->last_dc[1] = 128;
1596
    s->last_dc[2] = 128;
1597
    s->mb_incr = 1;
1598
    s->last_mv[0][0][0] = 0;
1599
    s->last_mv[0][0][1] = 0;
1600

    
1601
    /* Get the GOB height based on picture height */
1602
    if (s->out_format == FMT_H263 && !s->h263_pred && !s->h263_msmpeg4) {
1603
        if (s->height <= 400)
1604
            s->gob_index = 1;
1605
        else if (s->height <= 800)
1606
            s->gob_index = 2;
1607
        else
1608
            s->gob_index = 4;
1609
    }
1610
        
1611
    s->avg_mb_var = s->avg_mb_var / s->mb_num;        
1612
    
1613
    for(mb_y=0; mb_y < s->mb_height; mb_y++) {
1614
        /* Put GOB header based on RTP MTU */
1615
        /* TODO: Put all this stuff in a separate generic function */
1616
        if (s->rtp_mode) {
1617
            if (!mb_y) {
1618
                s->ptr_lastgob = s->pb.buf;
1619
                s->ptr_last_mb_line = s->pb.buf;
1620
            } else if (s->out_format == FMT_H263 && !s->h263_pred && !s->h263_msmpeg4 && !(mb_y % s->gob_index)) {
1621
                last_gob = h263_encode_gob_header(s, mb_y);
1622
                if (last_gob) {
1623
                    s->first_gob_line = 1;
1624
                }
1625
            }
1626
        }
1627
        
1628
        s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
1629
        s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
1630
        s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
1631
        s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
1632
        s->block_index[4]= s->block_wrap[4]*(mb_y + 1)                    + s->block_wrap[0]*(s->mb_height*2 + 2);
1633
        s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2);
1634
        for(mb_x=0; mb_x < s->mb_width; mb_x++) {
1635
            /*const */int mb_type= s->mb_type[mb_y * s->mb_width + mb_x];
1636
            PutBitContext pb;
1637
            int d;
1638
            int dmin=10000000;
1639
            int best=0;
1640

    
1641
            s->mb_x = mb_x;
1642
            s->mb_y = mb_y;
1643
            s->block_index[0]+=2;
1644
            s->block_index[1]+=2;
1645
            s->block_index[2]+=2;
1646
            s->block_index[3]+=2;
1647
            s->block_index[4]++;
1648
            s->block_index[5]++;
1649
            if(mb_type & (mb_type-1)){ // more than 1 MB type possible
1650
                pb= s->pb;
1651
                s->mv_dir = MV_DIR_FORWARD;
1652

    
1653
                copy_context_before_encode(&backup_s, s, -1);
1654

    
1655
                if(mb_type&MB_TYPE_INTER){
1656
                    int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
1657
                    s->mv_type = MV_TYPE_16X16;
1658
                    s->mb_intra= 0;
1659
                    s->mv[0][0][0] = s->p_mv_table[xy][0];
1660
                    s->mv[0][0][1] = s->p_mv_table[xy][1];
1661
                    init_put_bits(&s->pb, bit_buf[1], 3000, NULL, NULL);
1662
                    s->block= s->inter_block;
1663

    
1664
                    encode_mb(s, s->mv[0][0][0], s->mv[0][0][1]);
1665
                    d= get_bit_count(&s->pb);
1666
                    if(d<dmin){
1667
                        flush_put_bits(&s->pb);
1668
                        dmin=d;
1669
                        copy_context_after_encode(&best_s, s, MB_TYPE_INTER);
1670
                        best=1;
1671
                    }
1672
                }
1673
                if(mb_type&MB_TYPE_INTER4V){                 
1674
                    copy_context_before_encode(s, &backup_s, MB_TYPE_INTER4V);
1675
                    s->mv_type = MV_TYPE_8X8;
1676
                    s->mb_intra= 0;
1677
                    for(i=0; i<4; i++){
1678
                        s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
1679
                        s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
1680
                    }
1681
                    init_put_bits(&s->pb, bit_buf[2], 3000, NULL, NULL);
1682
                    s->block= s->inter4v_block;
1683

    
1684
                    encode_mb(s, 0, 0);
1685
                    d= get_bit_count(&s->pb);
1686
                    if(d<dmin && 0){
1687
                        flush_put_bits(&s->pb);
1688
                        dmin=d;
1689
                        copy_context_after_encode(&best_s, s, MB_TYPE_INTER4V);
1690
                        best=2;
1691
                    }
1692
                }
1693
                if(mb_type&MB_TYPE_INTRA){
1694
                    copy_context_before_encode(s, &backup_s, MB_TYPE_INTRA);
1695
                    s->mv_type = MV_TYPE_16X16;
1696
                    s->mb_intra= 1;
1697
                    s->mv[0][0][0] = 0;
1698
                    s->mv[0][0][1] = 0;
1699
                    init_put_bits(&s->pb, bit_buf[0], 3000, NULL, NULL);
1700
                    s->block= s->intra_block;
1701
                   
1702
                    encode_mb(s, 0, 0);
1703
                    d= get_bit_count(&s->pb);
1704
                    if(d<dmin){
1705
                        flush_put_bits(&s->pb);
1706
                        dmin=d;
1707
                        copy_context_after_encode(&best_s, s, MB_TYPE_INTRA);
1708
                        best=0;
1709
                    }
1710
                    /* force cleaning of ac/dc pred stuff if needed ... */
1711
                    if(s->h263_pred || s->h263_aic)
1712
                        s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
1713
                }
1714
                copy_context_after_encode(s, &best_s, -1);
1715
                copy_bits(&pb, bit_buf[best], dmin);
1716
                s->pb= pb;
1717
            } else {
1718
                int motion_x, motion_y;
1719
                s->mv_type=MV_TYPE_16X16;
1720
                // only one MB-Type possible
1721
                //FIXME convert to swicth()
1722
                if(mb_type&MB_TYPE_INTRA){
1723
                    s->mv_dir = MV_DIR_FORWARD;
1724
                    s->mb_intra= 1;
1725
                    motion_x= s->mv[0][0][0] = 0;
1726
                    motion_y= s->mv[0][0][1] = 0;
1727
                }else if(mb_type&MB_TYPE_INTER){
1728
                    int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
1729
                    s->mv_dir = MV_DIR_FORWARD;
1730
                    s->mb_intra= 0;
1731
                    motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
1732
                    motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
1733
                }else if(mb_type&MB_TYPE_DIRECT){
1734
                    int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
1735
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
1736
                    s->mb_intra= 0;
1737
                    motion_x=0;
1738
                    motion_y=0;
1739
                    s->mv[0][0][0] = 0;
1740
                    s->mv[0][0][1] = 0;
1741
                    s->mv[1][0][0] = 0;
1742
                    s->mv[1][0][1] = 0;
1743
                }else if(mb_type&MB_TYPE_BIDIR){
1744
                    int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
1745
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
1746
                    s->mb_intra= 0;
1747
                    motion_x=0;
1748
                    motion_y=0;
1749
                    s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
1750
                    s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
1751
                    s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
1752
                    s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
1753
                }else if(mb_type&MB_TYPE_BACKWARD){
1754
                    int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
1755
                    s->mv_dir = MV_DIR_BACKWARD;
1756
                    s->mb_intra= 0;
1757
                    motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
1758
                    motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
1759
                }else if(mb_type&MB_TYPE_FORWARD){
1760
                    int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
1761
                    s->mv_dir = MV_DIR_FORWARD;
1762
                    s->mb_intra= 0;
1763
                    motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
1764
                    motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
1765
//                    printf(" %d %d ", motion_x, motion_y);
1766
                }else{
1767
                    motion_x=motion_y=0; //gcc warning fix
1768
                    printf("illegal MB type\n");
1769
                }
1770
                encode_mb(s, motion_x, motion_y);
1771
            }
1772

    
1773
            MPV_decode_mb(s, s->block);
1774
        }
1775

    
1776

    
1777
        /* Obtain average GOB size for RTP */
1778
        if (s->rtp_mode) {
1779
            if (!mb_y)
1780
                s->mb_line_avgsize = pbBufPtr(&s->pb) - s->ptr_last_mb_line;
1781
            else if (!(mb_y % s->gob_index)) {    
1782
                s->mb_line_avgsize = (s->mb_line_avgsize + pbBufPtr(&s->pb) - s->ptr_last_mb_line) >> 1;
1783
                s->ptr_last_mb_line = pbBufPtr(&s->pb);
1784
            }
1785
            //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y, 
1786
            //                    (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize);
1787
            s->first_gob_line = 0;
1788
        }
1789
    }
1790
    emms_c();
1791

    
1792
    if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
1793
        msmpeg4_encode_ext_header(s);
1794

    
1795
    //if (s->gob_number)
1796
    //    fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
1797
    
1798
    /* Send the last GOB if RTP */    
1799
    if (s->rtp_mode) {
1800
        flush_put_bits(&s->pb);
1801
        pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
1802
        /* Call the RTP callback to send the last GOB */
1803
        if (s->rtp_callback)
1804
            s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
1805
        s->ptr_lastgob = pbBufPtr(&s->pb);
1806
        //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
1807
    }
1808
}
1809

    
1810
static int dct_quantize_c(MpegEncContext *s, 
1811
                        DCTELEM *block, int n,
1812
                        int qscale)
1813
{
1814
    int i, j, level, last_non_zero, q;
1815
    const int *qmat;
1816
    int minLevel, maxLevel;
1817

    
1818
    if(s->avctx!=NULL && s->avctx->codec->id==CODEC_ID_MPEG4){
1819
        /* mpeg4 */
1820
        minLevel= -2048;
1821
        maxLevel= 2047;
1822
    }else if(s->out_format==FMT_MPEG1){
1823
        /* mpeg1 */
1824
        minLevel= -255;
1825
        maxLevel= 255;
1826
    }else if(s->out_format==FMT_MJPEG){
1827
        /* (m)jpeg */
1828
        minLevel= -1023;
1829
        maxLevel= 1023;
1830
    }else{
1831
        /* h263 / msmpeg4 */
1832
        minLevel= -128;
1833
        maxLevel= 127;
1834
    }
1835

    
1836
    av_fdct (block);
1837

    
1838
    /* we need this permutation so that we correct the IDCT
1839
       permutation. will be moved into DCT code */
1840
    block_permute(block);
1841

    
1842
    if (s->mb_intra) {
1843
        if (n < 4)
1844
            q = s->y_dc_scale;
1845
        else
1846
            q = s->c_dc_scale;
1847
        q = q << 3;
1848
        
1849
        /* note: block[0] is assumed to be positive */
1850
        block[0] = (block[0] + (q >> 1)) / q;
1851
        i = 1;
1852
        last_non_zero = 0;
1853
        if (s->out_format == FMT_H263) {
1854
            qmat = s->q_non_intra_matrix;
1855
        } else {
1856
            qmat = s->q_intra_matrix;
1857
        }
1858
    } else {
1859
        i = 0;
1860
        last_non_zero = -1;
1861
        qmat = s->q_non_intra_matrix;
1862
    }
1863

    
1864
    for(;i<64;i++) {
1865
        j = zigzag_direct[i];
1866
        level = block[j];
1867
        level = level * qmat[j];
1868
#ifdef PARANOID
1869
        {
1870
            static int count = 0;
1871
            int level1, level2, qmat1;
1872
            double val;
1873
            if (qmat == s->q_non_intra_matrix) {
1874
                qmat1 = default_non_intra_matrix[j] * s->qscale;
1875
            } else {
1876
                qmat1 = default_intra_matrix[j] * s->qscale;
1877
            }
1878
            if (av_fdct != jpeg_fdct_ifast)
1879
                val = ((double)block[j] * 8.0) / (double)qmat1;
1880
            else
1881
                val = ((double)block[j] * 8.0 * 2048.0) / 
1882
                    ((double)qmat1 * aanscales[j]);
1883
            level1 = (int)val;
1884
            level2 = level / (1 << (QMAT_SHIFT - 3));
1885
            if (level1 != level2) {
1886
                fprintf(stderr, "%d: quant error qlevel=%d wanted=%d level=%d qmat1=%d qmat=%d wantedf=%0.6f\n", 
1887
                        count, level2, level1, block[j], qmat1, qmat[j],
1888
                        val);
1889
                count++;
1890
            }
1891

    
1892
        }
1893
#endif
1894
        /* XXX: slight error for the low range. Test should be equivalent to
1895
           (level <= -(1 << (QMAT_SHIFT - 3)) || level >= (1 <<
1896
           (QMAT_SHIFT - 3)))
1897
        */
1898
        if (((level << (31 - (QMAT_SHIFT - 3))) >> (31 - (QMAT_SHIFT - 3))) != 
1899
            level) {
1900
            level = level / (1 << (QMAT_SHIFT - 3));
1901
            /* XXX: currently, this code is not optimal. the range should be:
1902
               mpeg1: -255..255
1903
               mpeg2: -2048..2047
1904
               h263:  -128..127
1905
               mpeg4: -2048..2047
1906
            */
1907
            if (level > maxLevel)
1908
                level = maxLevel;
1909
            else if (level < minLevel)
1910
                level = minLevel;
1911

    
1912
            block[j] = level;
1913
            last_non_zero = i;
1914
        } else {
1915
            block[j] = 0;
1916
        }
1917
    }
1918
    return last_non_zero;
1919
}
1920

    
1921
static void dct_unquantize_mpeg1_c(MpegEncContext *s, 
1922
                                   DCTELEM *block, int n, int qscale)
1923
{
1924
    int i, level, nCoeffs;
1925
    const UINT16 *quant_matrix;
1926

    
1927
    if(s->alternate_scan) nCoeffs= 64;
1928
    else nCoeffs= s->block_last_index[n]+1;
1929
    
1930
    if (s->mb_intra) {
1931
        if (n < 4) 
1932
            block[0] = block[0] * s->y_dc_scale;
1933
        else
1934
            block[0] = block[0] * s->c_dc_scale;
1935
        /* XXX: only mpeg1 */
1936
        quant_matrix = s->intra_matrix;
1937
        for(i=1;i<nCoeffs;i++) {
1938
            int j= zigzag_direct[i];
1939
            level = block[j];
1940
            if (level) {
1941
                if (level < 0) {
1942
                    level = -level;
1943
                    level = (int)(level * qscale * quant_matrix[j]) >> 3;
1944
                    level = (level - 1) | 1;
1945
                    level = -level;
1946
                } else {
1947
                    level = (int)(level * qscale * quant_matrix[j]) >> 3;
1948
                    level = (level - 1) | 1;
1949
                }
1950
#ifdef PARANOID
1951
                if (level < -2048 || level > 2047)
1952
                    fprintf(stderr, "unquant error %d %d\n", i, level);
1953
#endif
1954
                block[j] = level;
1955
            }
1956
        }
1957
    } else {
1958
        i = 0;
1959
        quant_matrix = s->non_intra_matrix;
1960
        for(;i<nCoeffs;i++) {
1961
            int j= zigzag_direct[i];
1962
            level = block[j];
1963
            if (level) {
1964
                if (level < 0) {
1965
                    level = -level;
1966
                    level = (((level << 1) + 1) * qscale *
1967
                             ((int) (quant_matrix[j]))) >> 4;
1968
                    level = (level - 1) | 1;
1969
                    level = -level;
1970
                } else {
1971
                    level = (((level << 1) + 1) * qscale *
1972
                             ((int) (quant_matrix[j]))) >> 4;
1973
                    level = (level - 1) | 1;
1974
                }
1975
#ifdef PARANOID
1976
                if (level < -2048 || level > 2047)
1977
                    fprintf(stderr, "unquant error %d %d\n", i, level);
1978
#endif
1979
                block[j] = level;
1980
            }
1981
        }
1982
    }
1983
}
1984

    
1985
static void dct_unquantize_mpeg2_c(MpegEncContext *s, 
1986
                                   DCTELEM *block, int n, int qscale)
1987
{
1988
    int i, level, nCoeffs;
1989
    const UINT16 *quant_matrix;
1990

    
1991
    if(s->alternate_scan) nCoeffs= 64;
1992
    else nCoeffs= s->block_last_index[n]+1;
1993
    
1994
    if (s->mb_intra) {
1995
        if (n < 4) 
1996
            block[0] = block[0] * s->y_dc_scale;
1997
        else
1998
            block[0] = block[0] * s->c_dc_scale;
1999
        quant_matrix = s->intra_matrix;
2000
        for(i=1;i<nCoeffs;i++) {
2001
            int j= zigzag_direct[i];
2002
            level = block[j];
2003
            if (level) {
2004
                if (level < 0) {
2005
                    level = -level;
2006
                    level = (int)(level * qscale * quant_matrix[j]) >> 3;
2007
                    level = -level;
2008
                } else {
2009
                    level = (int)(level * qscale * quant_matrix[j]) >> 3;
2010
                }
2011
#ifdef PARANOID
2012
                if (level < -2048 || level > 2047)
2013
                    fprintf(stderr, "unquant error %d %d\n", i, level);
2014
#endif
2015
                block[j] = level;
2016
            }
2017
        }
2018
    } else {
2019
        int sum=-1;
2020
        i = 0;
2021
        quant_matrix = s->non_intra_matrix;
2022
        for(;i<nCoeffs;i++) {
2023
            int j= zigzag_direct[i];
2024
            level = block[j];
2025
            if (level) {
2026
                if (level < 0) {
2027
                    level = -level;
2028
                    level = (((level << 1) + 1) * qscale *
2029
                             ((int) (quant_matrix[j]))) >> 4;
2030
                    level = -level;
2031
                } else {
2032
                    level = (((level << 1) + 1) * qscale *
2033
                             ((int) (quant_matrix[j]))) >> 4;
2034
                }
2035
#ifdef PARANOID
2036
                if (level < -2048 || level > 2047)
2037
                    fprintf(stderr, "unquant error %d %d\n", i, level);
2038
#endif
2039
                block[j] = level;
2040
                sum+=level;
2041
            }
2042
        }
2043
        block[63]^=sum&1;
2044
    }
2045
}
2046

    
2047

    
2048
static void dct_unquantize_h263_c(MpegEncContext *s, 
2049
                                  DCTELEM *block, int n, int qscale)
2050
{
2051
    int i, level, qmul, qadd;
2052
    int nCoeffs;
2053
    
2054
    if (s->mb_intra) {
2055
        if (!s->h263_aic) {
2056
            if (n < 4) 
2057
                block[0] = block[0] * s->y_dc_scale;
2058
            else
2059
                block[0] = block[0] * s->c_dc_scale;
2060
        }
2061
        i = 1;
2062
        nCoeffs= 64; //does not allways use zigzag table 
2063
    } else {
2064
        i = 0;
2065
        nCoeffs= zigzag_end[ s->block_last_index[n] ];
2066
    }
2067

    
2068
    qmul = s->qscale << 1;
2069
    if (s->h263_aic && s->mb_intra)
2070
        qadd = 0;
2071
    else
2072
        qadd = (s->qscale - 1) | 1;
2073

    
2074
    for(;i<nCoeffs;i++) {
2075
        level = block[i];
2076
        if (level) {
2077
            if (level < 0) {
2078
                level = level * qmul - qadd;
2079
            } else {
2080
                level = level * qmul + qadd;
2081
            }
2082
#ifdef PARANOID
2083
                if (level < -2048 || level > 2047)
2084
                    fprintf(stderr, "unquant error %d %d\n", i, level);
2085
#endif
2086
            block[i] = level;
2087
        }
2088
    }
2089
}
2090

    
2091
/* rate control */
2092

    
2093
static void rate_control_init(MpegEncContext *s)
2094
{
2095
    emms_c();
2096

    
2097
    //initial values, they dont really matter as they will be totally different within a few frames
2098
    s->i_pred.coeff= s->p_pred.coeff= 7.0;
2099
    s->i_pred.count= s->p_pred.count= 1.0;
2100
    
2101
    s->i_pred.decay= s->p_pred.decay= 0.4;
2102
    
2103
    // use more bits at the beginning, otherwise high motion at the begin will look like shit
2104
    s->qsum=100;
2105
    s->qcount=100;
2106

    
2107
    s->short_term_qsum=0.001;
2108
    s->short_term_qcount=0.001;
2109
}
2110

    
2111
static double predict(Predictor *p, double q, double var)
2112
{
2113
    return p->coeff*var / (q*p->count);
2114
}
2115

    
2116
static void update_predictor(Predictor *p, double q, double var, double size)
2117
{
2118
    double new_coeff= size*q / (var + 1);
2119
    if(var<1000) return;
2120
/*{
2121
int pred= predict(p, q, var);
2122
int error= abs(pred-size);
2123
static double sum=0;
2124
static int count=0;
2125
if(count>5) sum+=error;
2126
count++;
2127
if(256*256*256*64%count==0){
2128
    printf("%d %f %f\n", count, sum/count, p->coeff);
2129
}
2130
}*/
2131
    p->count*= p->decay;
2132
    p->coeff*= p->decay;
2133
    p->count++;
2134
    p->coeff+= new_coeff;
2135
}
2136

    
2137
static int rate_estimate_qscale(MpegEncContext *s)
2138
{
2139
    int qmin= s->qmin;
2140
    int qmax= s->qmax;
2141
    int rate_q=5;
2142
    float q;
2143
    int qscale;
2144
    float br_compensation;
2145
    double diff;
2146
    double short_term_q;
2147
    double long_term_q;
2148
    int last_qscale= s->qscale;
2149
    double fps;
2150
    INT64 wanted_bits;
2151
    emms_c();
2152

    
2153
    fps= (double)s->frame_rate / FRAME_RATE_BASE;
2154
    wanted_bits= s->bit_rate*(double)s->picture_number/fps;
2155

    
2156
    
2157
    if(s->picture_number>2){
2158
        /* update predictors */
2159
        if(s->last_pict_type == I_TYPE){
2160
        //FIXME
2161
        }else{ //P Frame
2162
//printf("%d %d %d %f\n", s->qscale, s->last_mc_mb_var, s->frame_bits, s->p_pred.coeff);
2163
            update_predictor(&s->p_pred, s->qscale, s->last_mc_mb_var, s->frame_bits);
2164
        }
2165
    }
2166

    
2167
    if(s->pict_type == I_TYPE){
2168
        //FIXME
2169
        rate_q= s->qsum/s->qcount;
2170
    }else{ //P Frame
2171
        int i;
2172
        int diff, best_diff=1000000000;
2173
        for(i=1; i<=31; i++){
2174
            diff= predict(&s->p_pred, i, s->mc_mb_var) - (double)s->bit_rate/fps;
2175
            if(diff<0) diff= -diff;
2176
            if(diff<best_diff){
2177
                best_diff= diff;
2178
                rate_q= i;
2179
            }
2180
        }
2181
    }
2182

    
2183
    s->short_term_qsum*=s->qblur;
2184
    s->short_term_qcount*=s->qblur;
2185

    
2186
    s->short_term_qsum+= rate_q;
2187
    s->short_term_qcount++;
2188
    short_term_q= s->short_term_qsum/s->short_term_qcount;
2189
    
2190
    long_term_q= s->qsum/s->qcount*(s->total_bits+1)/(wanted_bits+1); //+1 to avoid nan & 0
2191

    
2192
//    q= (long_term_q - short_term_q)*s->qcompress + short_term_q;
2193
    q= 1/((1/long_term_q - 1/short_term_q)*s->qcompress + 1/short_term_q);
2194

    
2195
    diff= s->total_bits - wanted_bits;
2196
    br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
2197
    if(br_compensation<=0.0) br_compensation=0.001;
2198
    q/=br_compensation;
2199

    
2200
    qscale= (int)(q + 0.5);
2201
    if     (qscale<qmin) qscale=qmin;
2202
    else if(qscale>qmax) qscale=qmax;
2203
    
2204
    if     (qscale<last_qscale-s->max_qdiff) qscale=last_qscale-s->max_qdiff;
2205
    else if(qscale>last_qscale+s->max_qdiff) qscale=last_qscale+s->max_qdiff;
2206

    
2207
    s->qsum+= qscale;
2208
    s->qcount++;
2209

    
2210
    s->last_pict_type= s->pict_type;
2211
//printf("q:%d diff:%d comp:%f rate_q:%d st_q:%f fvar:%d last_size:%d\n", qscale, (int)diff, br_compensation, 
2212
//       rate_q, short_term_q, s->mc_mb_var, s->frame_bits);
2213
//printf("%d %d\n", s->bit_rate, (int)fps);
2214
    return qscale;
2215
}
2216

    
2217
AVCodec mpeg1video_encoder = {
2218
    "mpeg1video",
2219
    CODEC_TYPE_VIDEO,
2220
    CODEC_ID_MPEG1VIDEO,
2221
    sizeof(MpegEncContext),
2222
    MPV_encode_init,
2223
    MPV_encode_picture,
2224
    MPV_encode_end,
2225
};
2226

    
2227
AVCodec h263_encoder = {
2228
    "h263",
2229
    CODEC_TYPE_VIDEO,
2230
    CODEC_ID_H263,
2231
    sizeof(MpegEncContext),
2232
    MPV_encode_init,
2233
    MPV_encode_picture,
2234
    MPV_encode_end,
2235
};
2236

    
2237
AVCodec h263p_encoder = {
2238
    "h263p",
2239
    CODEC_TYPE_VIDEO,
2240
    CODEC_ID_H263P,
2241
    sizeof(MpegEncContext),
2242
    MPV_encode_init,
2243
    MPV_encode_picture,
2244
    MPV_encode_end,
2245
};
2246

    
2247
AVCodec rv10_encoder = {
2248
    "rv10",
2249
    CODEC_TYPE_VIDEO,
2250
    CODEC_ID_RV10,
2251
    sizeof(MpegEncContext),
2252
    MPV_encode_init,
2253
    MPV_encode_picture,
2254
    MPV_encode_end,
2255
};
2256

    
2257
AVCodec mjpeg_encoder = {
2258
    "mjpeg",
2259
    CODEC_TYPE_VIDEO,
2260
    CODEC_ID_MJPEG,
2261
    sizeof(MpegEncContext),
2262
    MPV_encode_init,
2263
    MPV_encode_picture,
2264
    MPV_encode_end,
2265
};
2266

    
2267
AVCodec mpeg4_encoder = {
2268
    "mpeg4",
2269
    CODEC_TYPE_VIDEO,
2270
    CODEC_ID_MPEG4,
2271
    sizeof(MpegEncContext),
2272
    MPV_encode_init,
2273
    MPV_encode_picture,
2274
    MPV_encode_end,
2275
};
2276

    
2277
AVCodec msmpeg4v1_encoder = {
2278
    "msmpeg4v1",
2279
    CODEC_TYPE_VIDEO,
2280
    CODEC_ID_MSMPEG4V1,
2281
    sizeof(MpegEncContext),
2282
    MPV_encode_init,
2283
    MPV_encode_picture,
2284
    MPV_encode_end,
2285
};
2286

    
2287
AVCodec msmpeg4v2_encoder = {
2288
    "msmpeg4v2",
2289
    CODEC_TYPE_VIDEO,
2290
    CODEC_ID_MSMPEG4V2,
2291
    sizeof(MpegEncContext),
2292
    MPV_encode_init,
2293
    MPV_encode_picture,
2294
    MPV_encode_end,
2295
};
2296

    
2297
AVCodec msmpeg4v3_encoder = {
2298
    "msmpeg4",
2299
    CODEC_TYPE_VIDEO,
2300
    CODEC_ID_MSMPEG4V3,
2301
    sizeof(MpegEncContext),
2302
    MPV_encode_init,
2303
    MPV_encode_picture,
2304
    MPV_encode_end,
2305
};