mpegvideo.c 237.3 KB
Newer Older
F
Fabrice Bellard 已提交
1 2
/*
 * The simplest mpeg encoder (well, it was the simplest!)
F
Fabrice Bellard 已提交
3
 * Copyright (c) 2000,2001 Fabrice Bellard.
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
F
Fabrice Bellard 已提交
5
 *
F
Fabrice Bellard 已提交
6 7 8 9
 * 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.
F
Fabrice Bellard 已提交
10
 *
F
Fabrice Bellard 已提交
11
 * This library is distributed in the hope that it will be useful,
F
Fabrice Bellard 已提交
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
F
Fabrice Bellard 已提交
13 14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
F
Fabrice Bellard 已提交
15
 *
F
Fabrice Bellard 已提交
16 17 18
 * 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
M
Michael Niedermayer 已提交
19
 *
20
 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
F
Fabrice Bellard 已提交
21
 */
22
 
M
Michael Niedermayer 已提交
23 24 25 26 27
/**
 * @file mpegvideo.c
 * The simplest mpeg encoder (well, it was the simplest!).
 */ 
 
F
Fabrice Bellard 已提交
28 29 30
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
M
Michael Niedermayer 已提交
31
#include "faandct.h"
32
#include <limits.h>
F
Fabrice Bellard 已提交
33

34 35 36 37
#ifdef USE_FASTMEMCPY
#include "fastmemcpy.h"
#endif

38 39
//#undef NDEBUG
//#include <assert.h>
40

41
#ifdef CONFIG_ENCODERS
42
static void encode_picture(MpegEncContext *s, int picture_number);
43
#endif //CONFIG_ENCODERS
44
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, 
45
                                   DCTELEM *block, int n, int qscale);
46
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, 
47
                                   DCTELEM *block, int n, int qscale);
48 49 50 51 52 53 54
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
                                   DCTELEM *block, int n, int qscale);
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
                                   DCTELEM *block, int n, int qscale);
static void dct_unquantize_h263_intra_c(MpegEncContext *s, 
                                  DCTELEM *block, int n, int qscale);
static void dct_unquantize_h263_inter_c(MpegEncContext *s, 
55
                                  DCTELEM *block, int n, int qscale);
56
static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
57
#ifdef CONFIG_ENCODERS
58
static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
M
Michael Niedermayer 已提交
59
static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
M
Michael Niedermayer 已提交
60
static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
61
static int sse_mb(MpegEncContext *s);
M
Michael Niedermayer 已提交
62
static void  denoise_dct_c(MpegEncContext *s, DCTELEM *block);
63
#endif //CONFIG_ENCODERS
M
Michael Niedermayer 已提交
64

I
Ivan Kalvachev 已提交
65 66 67
#ifdef HAVE_XVMC
extern int  XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
extern void XVMC_field_end(MpegEncContext *s);
68
extern void XVMC_decode_mb(MpegEncContext *s);
I
Ivan Kalvachev 已提交
69 70
#endif

71
void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
M
Michael Niedermayer 已提交
72

F
Fabrice Bellard 已提交
73 74 75 76 77 78

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

//#define DEBUG

79

F
Fabrice Bellard 已提交
80 81 82
/* for jpeg fast DCT */
#define CONST_BITS 14

83
static const uint16_t aanscales[64] = {
F
Fabrice Bellard 已提交
84 85 86 87 88 89 90
    /* precomputed values scaled up by 14 bits */
    16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
    22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
    21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
    19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
    16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
    12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
M
Michael Niedermayer 已提交
91 92
    8867 , 12299, 11585, 10426,  8867,  6967,  4799,  2446,
    4520 ,  6270,  5906,  5315,  4520,  3552,  2446,  1247
F
Fabrice Bellard 已提交
93 94
};

95
static const uint8_t h263_chroma_roundtab[16] = {
96
//  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
F
Fabrice Bellard 已提交
97 98 99
    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
};

M
Michael Niedermayer 已提交
100 101 102 103 104
static const uint8_t ff_default_chroma_qscale_table[32]={
//  0  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
    0, 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
};

105
#ifdef CONFIG_ENCODERS
106
static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
107
static uint8_t default_fcode_tab[MAX_MV*2+1];
108

M
Michael Niedermayer 已提交
109 110
enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};

111
static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
112
                           const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
F
Fabrice Bellard 已提交
113
{
114
    int qscale;
115
    int shift=0;
116

117
    for(qscale=qmin; qscale<=qmax; qscale++){
118
        int i;
119
        if (dsp->fdct == ff_jpeg_fdct_islow 
120
#ifdef FAAN_POSTSCALE
121
            || dsp->fdct == ff_faandct
122 123
#endif
            ) {
124
            for(i=0;i<64;i++) {
125
                const int j= dsp->idct_permutation[i];
126 127 128 129 130
                /* 16 <= qscale * quant_matrix[i] <= 7905 */
                /* 19952         <= aanscales[i] * qscale * quant_matrix[i]           <= 249205026 */
                /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
                /* 3444240       >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
                
131
                qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / 
132 133
                                (qscale * quant_matrix[j]));
            }
134
        } else if (dsp->fdct == fdct_ifast
135
#ifndef FAAN_POSTSCALE
136
                   || dsp->fdct == ff_faandct
137 138
#endif
                   ) {
139
            for(i=0;i<64;i++) {
140
                const int j= dsp->idct_permutation[i];
141 142 143 144 145
                /* 16 <= qscale * quant_matrix[i] <= 7905 */
                /* 19952         <= aanscales[i] * qscale * quant_matrix[i]           <= 249205026 */
                /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
                /* 3444240       >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
                
146
                qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) / 
147 148 149 150
                                (aanscales[i] * qscale * quant_matrix[j]));
            }
        } else {
            for(i=0;i<64;i++) {
151
                const int j= dsp->idct_permutation[i];
152 153 154 155 156
                /* We can safely suppose that 16 <= quant_matrix[i] <= 255
                   So 16           <= qscale * quant_matrix[i]             <= 7905
                   so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
                   so 32768        >= (1<<19) / (qscale * quant_matrix[i]) >= 67
                */
157
                qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
M
Michael Niedermayer 已提交
158
//                qmat  [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
159
                qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
160

161 162
                if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
                qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
163
            }
F
Fabrice Bellard 已提交
164
        }
165 166
        
        for(i=intra; i<64; i++){
167 168 169 170 171 172 173 174 175
            int64_t max= 8191;
            if (dsp->fdct == fdct_ifast
#ifndef FAAN_POSTSCALE
                   || dsp->fdct == ff_faandct
#endif
                   ) {
                max= (8191LL*aanscales[i]) >> 14;
            }
            while(((max * qmat[qscale][i]) >> shift) > INT_MAX){ 
176 177 178 179 180 181
                shift++;
            }
        }
    }
    if(shift){
        av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger then %d, overflows possible\n", QMAT_SHIFT - shift);
F
Fabrice Bellard 已提交
182 183
    }
}
184 185 186 187 188 189 190

static inline void update_qscale(MpegEncContext *s){
    s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
    s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
    
    s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
}
191 192
#endif //CONFIG_ENCODERS

M
Michael Niedermayer 已提交
193
void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
194 195
    int i;
    int end;
M
Michael Niedermayer 已提交
196 197
    
    st->scantable= src_scantable;
198 199 200 201

    for(i=0; i<64; i++){
        int j;
        j = src_scantable[i];
M
Michael Niedermayer 已提交
202
        st->permutated[i] = permutation[j];
203 204 205
#ifdef ARCH_POWERPC
        st->inverse[j] = i;
#endif
206 207 208 209 210 211 212 213 214 215 216
    }
    
    end=-1;
    for(i=0; i<64; i++){
        int j;
        j = st->permutated[i];
        if(j>end) end=j;
        st->raster_end[i]= end;
    }
}

217
#ifdef CONFIG_ENCODERS
218 219 220 221 222 223 224 225 226 227 228
void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
    int i;

    if(matrix){
        put_bits(pb, 1, 1);
        for(i=0;i<64;i++) {
            put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
        }
    }else
        put_bits(pb, 1, 0);
}
229
#endif //CONFIG_ENCODERS
230

231 232
/* init common dct for both encoder and decoder */
int DCT_common_init(MpegEncContext *s)
F
Fabrice Bellard 已提交
233
{
234 235 236 237 238 239
    s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
    s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
    s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
    s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
    s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
    s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
240

241
#ifdef CONFIG_ENCODERS
242
    s->dct_quantize= dct_quantize_c;
M
Michael Niedermayer 已提交
243
    s->denoise_dct= denoise_dct_c;
244
#endif //CONFIG_ENCODERS
245 246
        
#ifdef HAVE_MMX
247
    MPV_common_init_mmx(s);
248 249 250
#endif
#ifdef ARCH_ALPHA
    MPV_common_init_axp(s);
N
Nick Kurshev 已提交
251
#endif
252 253 254
#ifdef HAVE_MLIB
    MPV_common_init_mlib(s);
#endif
255 256 257
#ifdef HAVE_MMI
    MPV_common_init_mmi(s);
#endif
258
#ifdef ARCH_ARMV4L
259
    MPV_common_init_armv4l(s);
260
#endif
261 262 263
#ifdef ARCH_POWERPC
    MPV_common_init_ppc(s);
#endif
264

265
#ifdef CONFIG_ENCODERS
266 267
    s->fast_dct_quantize= s->dct_quantize;

M
Michael Niedermayer 已提交
268 269 270 271
    if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
        s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
    }

272 273
#endif //CONFIG_ENCODERS

274 275 276
    /* load & permutate scantables
       note: only wmv uses differnt ones 
    */
M
Michael Niedermayer 已提交
277 278 279 280 281 282 283
    if(s->alternate_scan){
        ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan);
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan);
    }else{
        ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct);
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct);
    }
M
Michael Niedermayer 已提交
284 285
    ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
    ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
286

287 288 289
    return 0;
}

290 291 292 293 294
static void copy_picture(Picture *dst, Picture *src){
    *dst = *src;
    dst->type= FF_BUFFER_TYPE_COPY;
}

295 296 297
static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
    int i;

298 299 300 301 302 303 304 305
    dst->pict_type              = src->pict_type;
    dst->quality                = src->quality;
    dst->coded_picture_number   = src->coded_picture_number;
    dst->display_picture_number = src->display_picture_number;
//    dst->reference              = src->reference;
    dst->pts                    = src->pts;
    dst->interlaced_frame       = src->interlaced_frame;
    dst->top_field_first        = src->top_field_first;
306

307 308 309 310 311 312 313
    if(s->avctx->me_threshold){
        if(!src->motion_val[0])
            av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
        if(!src->mb_type)
            av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
        if(!src->ref_index[0])
            av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
314
        if(src->motion_subsample_log2 != dst->motion_subsample_log2)
315 316
            av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesnt match! (%d!=%d)\n",
            src->motion_subsample_log2, dst->motion_subsample_log2);
317 318 319 320

        memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
        
        for(i=0; i<2; i++){
321 322 323
            int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
            int height= ((16*s->mb_height)>>src->motion_subsample_log2);

324 325 326 327
            if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
                memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
            }
            if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
328
                memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
329
            }
330 331
        }
    }
332 333
}

M
cleanup  
Michael Niedermayer 已提交
334
/**
M
Michael Niedermayer 已提交
335 336
 * allocates a Picture
 * The pixels are allocated/set by calling get_buffer() if shared=0
M
cleanup  
Michael Niedermayer 已提交
337
 */
M
Michael Niedermayer 已提交
338
static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
339 340
    const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
    const int mb_array_size= s->mb_stride*s->mb_height;
341 342
    const int b8_array_size= s->b8_stride*s->mb_height*2;
    const int b4_array_size= s->b4_stride*s->mb_height*4;
M
Michael Niedermayer 已提交
343
    int i;
344
    
M
Michael Niedermayer 已提交
345 346 347 348 349 350 351 352 353
    if(shared){
        assert(pic->data[0]);
        assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
        pic->type= FF_BUFFER_TYPE_SHARED;
    }else{
        int r;
        
        assert(!pic->data[0]);
        
M
Michael Niedermayer 已提交
354
        r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
M
Michael Niedermayer 已提交
355 356
        
        if(r<0 || !pic->age || !pic->type || !pic->data[0]){
357
	    av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
M
Michael Niedermayer 已提交
358 359 360 361
            return -1;
        }

        if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
362
            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
M
Michael Niedermayer 已提交
363 364 365 366
            return -1;
        }

        if(pic->linesize[1] != pic->linesize[2]){
367
            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride missmatch)\n");
M
Michael Niedermayer 已提交
368 369 370 371 372
            return -1;
        }

        s->linesize  = pic->linesize[0];
        s->uvlinesize= pic->linesize[1];
M
cleanup  
Michael Niedermayer 已提交
373
    }
M
Michael Niedermayer 已提交
374 375 376
    
    if(pic->qscale_table==NULL){
        if (s->encoding) {        
377 378 379
            CHECKED_ALLOCZ(pic->mb_var   , mb_array_size * sizeof(int16_t))
            CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
            CHECKED_ALLOCZ(pic->mb_mean  , mb_array_size * sizeof(int8_t))
M
Michael Niedermayer 已提交
380
        }
M
cleanup  
Michael Niedermayer 已提交
381

382
        CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
383
        CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
384
        CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num    * sizeof(uint32_t))
385
        pic->mb_type= pic->mb_type_base + s->mb_stride+1;
M
Michael Niedermayer 已提交
386 387
        if(s->out_format == FMT_H264){
            for(i=0; i<2; i++){
M
Michael Niedermayer 已提交
388 389
                CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4)  * sizeof(int16_t))
                pic->motion_val[i]= pic->motion_val_base[i]+4;
390
                CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
391
            }
M
Michael Niedermayer 已提交
392
            pic->motion_subsample_log2= 2;
393
        }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
394
            for(i=0; i<2; i++){
M
Michael Niedermayer 已提交
395 396
                CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
                pic->motion_val[i]= pic->motion_val_base[i]+4;
397
                CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
M
Michael Niedermayer 已提交
398
            }
M
Michael Niedermayer 已提交
399
            pic->motion_subsample_log2= 3;
M
Michael Niedermayer 已提交
400
        }
401 402 403
        if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
            CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
        }
404
        pic->qstride= s->mb_stride;
405
        CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
M
Michael Niedermayer 已提交
406
    }
M
Michael Niedermayer 已提交
407

408 409 410 411 412 413
    //it might be nicer if the application would keep track of these but it would require a API change
    memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
    s->prev_pict_types[0]= s->pict_type;
    if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
        pic->age= INT_MAX; // skiped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
    
M
cleanup  
Michael Niedermayer 已提交
414 415 416 417 418
    return 0;
fail: //for the CHECKED_ALLOCZ macro
    return -1;
}

M
Michael Niedermayer 已提交
419 420 421
/**
 * deallocates a picture
 */
M
cleanup  
Michael Niedermayer 已提交
422 423
static void free_picture(MpegEncContext *s, Picture *pic){
    int i;
M
Michael Niedermayer 已提交
424 425

    if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
M
Michael Niedermayer 已提交
426
        s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
M
Michael Niedermayer 已提交
427 428
    }

M
cleanup  
Michael Niedermayer 已提交
429 430 431 432 433
    av_freep(&pic->mb_var);
    av_freep(&pic->mc_mb_var);
    av_freep(&pic->mb_mean);
    av_freep(&pic->mbskip_table);
    av_freep(&pic->qscale_table);
M
Michael Niedermayer 已提交
434
    av_freep(&pic->mb_type_base);
435
    av_freep(&pic->dct_coeff);
436
    av_freep(&pic->pan_scan);
M
Michael Niedermayer 已提交
437 438
    pic->mb_type= NULL;
    for(i=0; i<2; i++){
439
        av_freep(&pic->motion_val_base[i]);
M
Michael Niedermayer 已提交
440 441
        av_freep(&pic->ref_index[i]);
    }
442 443
    
    if(pic->type == FF_BUFFER_TYPE_SHARED){
M
Michael Niedermayer 已提交
444 445 446 447 448
        for(i=0; i<4; i++){
            pic->base[i]=
            pic->data[i]= NULL;
        }
        pic->type= 0;        
M
cleanup  
Michael Niedermayer 已提交
449 450 451
    }
}

452 453 454
static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
    int i;

M
Michael Niedermayer 已提交
455
    // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) 
456 457 458 459
    CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
    s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;

     //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
460
    CHECKED_ALLOCZ(s->me.scratchpad,  (s->width+64)*4*16*2*sizeof(uint8_t)) 
461 462 463 464 465 466 467 468 469 470
    s->rd_scratchpad=   s->me.scratchpad;
    s->b_scratchpad=    s->me.scratchpad;
    s->obmc_scratchpad= s->me.scratchpad + 16;
    if (s->encoding) {
        CHECKED_ALLOCZ(s->me.map      , ME_MAP_SIZE*sizeof(uint32_t))
        CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
        if(s->avctx->noise_reduction){
            CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
        }
    }   
471
    CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
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
    s->block= s->blocks[0];

    for(i=0;i<12;i++){
        s->pblocks[i] = (short *)(&s->block[i]);
    }
    return 0;
fail:
    return -1; //free() through MPV_common_end()
}

static void free_duplicate_context(MpegEncContext *s){
    if(s==NULL) return;

    av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
    av_freep(&s->me.scratchpad);
    s->rd_scratchpad=   
    s->b_scratchpad=    
    s->obmc_scratchpad= NULL;
    
    av_freep(&s->dct_error_sum);
    av_freep(&s->me.map);
    av_freep(&s->me.score_map);
    av_freep(&s->blocks);
    s->block= NULL;
}

static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
#define COPY(a) bak->a= src->a
    COPY(allocated_edge_emu_buffer);
    COPY(edge_emu_buffer);
    COPY(me.scratchpad);
    COPY(rd_scratchpad);
    COPY(b_scratchpad);
    COPY(obmc_scratchpad);
    COPY(me.map);
    COPY(me.score_map);
    COPY(blocks);
    COPY(block);
    COPY(start_mb_y);
    COPY(end_mb_y);
    COPY(me.map_generation);
    COPY(pb);
    COPY(dct_error_sum);
515 516
    COPY(dct_count[0]);
    COPY(dct_count[1]);
517 518 519
#undef COPY
}

520
void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
521
    MpegEncContext bak;
522
    int i;
523 524 525 526 527
    //FIXME copy only needed parts
//START_TIMER
    backup_duplicate_context(&bak, dst);
    memcpy(dst, src, sizeof(MpegEncContext));
    backup_duplicate_context(dst, &bak);
528 529 530
    for(i=0;i<12;i++){
        dst->pblocks[i] = (short *)(&dst->block[i]);
    }
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
//STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
}

static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
#define COPY(a) dst->a= src->a
    COPY(pict_type);
    COPY(current_picture);
    COPY(f_code);
    COPY(b_code);
    COPY(qscale);
    COPY(lambda);
    COPY(lambda2);
    COPY(picture_in_gop_number);
    COPY(gop_picture_number);
    COPY(frame_pred_frame_dct); //FIXME dont set in encode_header
    COPY(progressive_frame); //FIXME dont set in encode_header
    COPY(partitioned_frame); //FIXME dont set in encode_header
#undef COPY
}

M
Michael Niedermayer 已提交
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
/**
 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
 * the changed fields will not depend upon the prior state of the MpegEncContext.
 */
static void MPV_common_defaults(MpegEncContext *s){
    s->y_dc_scale_table=
    s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
    s->chroma_qscale_table= ff_default_chroma_qscale_table;
    s->progressive_frame= 1;
    s->progressive_sequence= 1;
    s->picture_structure= PICT_FRAME;

    s->coded_picture_number = 0;
    s->picture_number = 0;
    s->input_picture_number = 0;

    s->picture_in_gop_number = 0;
568 569 570

    s->f_code = 1;
    s->b_code = 1;
M
Michael Niedermayer 已提交
571 572 573 574 575 576 577 578 579 580 581 582 583 584
}

/**
 * sets the given MpegEncContext to defaults for decoding.
 * the changed fields will not depend upon the prior state of the MpegEncContext.
 */
void MPV_decode_defaults(MpegEncContext *s){
    MPV_common_defaults(s);
}

/**
 * sets the given MpegEncContext to defaults for encoding.
 * the changed fields will not depend upon the prior state of the MpegEncContext.
 */
585 586

#ifdef CONFIG_ENCODERS
587
static void MPV_encode_defaults(MpegEncContext *s){
M
Michael Niedermayer 已提交
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
    static int done=0;
    
    MPV_common_defaults(s);
    
    if(!done){
        int i;
        done=1;

        default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
        memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));

        for(i=-16; i<16; i++){
            default_fcode_tab[i + MAX_MV]= 1;
        }
    }
    s->me.mv_penalty= default_mv_penalty;
    s->fcode_tab= default_fcode_tab;
}
606
#endif //CONFIG_ENCODERS
M
Michael Niedermayer 已提交
607 608 609 610 611

/** 
 * init common structure for both encoder and decoder.
 * this assumes that some variables like width/height are already set
 */
612 613
int MPV_common_init(MpegEncContext *s)
{
M
Michael Niedermayer 已提交
614
    int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
615

M
10l  
Michael Niedermayer 已提交
616
    if(s->avctx->thread_count > MAX_THREADS || (16*s->avctx->thread_count > s->height && s->height)){
M
10l  
Michael Niedermayer 已提交
617 618 619 620
        av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
        return -1;
    }

621 622 623
    if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
        return -1;

624
    dsputil_init(&s->dsp, s->avctx);
625
    DCT_common_init(s);
626

627
    s->flags= s->avctx->flags;
628
    s->flags2= s->avctx->flags2;
629

M
cleanup  
Michael Niedermayer 已提交
630
    s->mb_width  = (s->width  + 15) / 16;
F
Fabrice Bellard 已提交
631
    s->mb_height = (s->height + 15) / 16;
632
    s->mb_stride = s->mb_width + 1;
633 634
    s->b8_stride = s->mb_width*2 + 1;
    s->b4_stride = s->mb_width*4 + 1;
635
    mb_array_size= s->mb_height * s->mb_stride;
M
Michael Niedermayer 已提交
636
    mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
637

638 639 640 641
    /* set chroma shifts */
    avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
                                                    &(s->chroma_y_shift) );

642 643 644
    /* set default edge pos, will be overriden in decode_header if needed */
    s->h_edge_pos= s->mb_width*16;
    s->v_edge_pos= s->mb_height*16;
645 646

    s->mb_num = s->mb_width * s->mb_height;
647 648 649 650
    
    s->block_wrap[0]=
    s->block_wrap[1]=
    s->block_wrap[2]=
651
    s->block_wrap[3]= s->b8_stride;
652
    s->block_wrap[4]=
653
    s->block_wrap[5]= s->mb_stride;
M
Michael Niedermayer 已提交
654
 
655 656
    y_size = s->b8_stride * (2 * s->mb_height + 1);
    c_size = s->mb_stride * (s->mb_height + 1);
657
    yc_size = y_size + 2 * c_size;
M
Michael Niedermayer 已提交
658
    
659
    /* convert fourcc to upper case */
660 661 662 663
    s->avctx->codec_tag=   toupper( s->avctx->codec_tag     &0xFF)          
                        + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
                        + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16) 
                        + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
664

665 666 667 668 669
    s->avctx->stream_codec_tag=   toupper( s->avctx->stream_codec_tag     &0xFF)          
                               + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
                               + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16) 
                               + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);

M
Michael Niedermayer 已提交
670
    s->avctx->coded_frame= (AVFrame*)&s->current_picture;
M
cleanup  
Michael Niedermayer 已提交
671

672 673 674 675 676 677 678 679
    CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
    for(y=0; y<s->mb_height; y++){
        for(x=0; x<s->mb_width; x++){
            s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
        }
    }
    s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
    
680
    if (s->encoding) {
681
        /* Allocate MV tables */
682 683 684 685 686 687 688 689 690 691 692 693
        CHECKED_ALLOCZ(s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t))
        s->p_mv_table           = s->p_mv_table_base            + s->mb_stride + 1;
        s->b_forw_mv_table      = s->b_forw_mv_table_base       + s->mb_stride + 1;
        s->b_back_mv_table      = s->b_back_mv_table_base       + s->mb_stride + 1;
        s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
        s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
        s->b_direct_mv_table    = s->b_direct_mv_table_base     + s->mb_stride + 1;
694

695 696 697
        if(s->msmpeg4_version){
            CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
        }
M
Michael Niedermayer 已提交
698
        CHECKED_ALLOCZ(s->avctx->stats_out, 256);
699 700

        /* Allocate MB type table */
M
Michael Niedermayer 已提交
701
        CHECKED_ALLOCZ(s->mb_type  , mb_array_size * sizeof(uint16_t)) //needed for encoding
702 703
        
        CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
704 705 706
        
        CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
        CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
707 708
        CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
        CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
709 710
        CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
        CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
711 712 713 714
        
        if(s->avctx->noise_reduction){
            CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
        }
715
    }
716 717
    CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))

718
    CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
719
    
M
Michael Niedermayer 已提交
720
    if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
721
        /* interlaced direct mode decoding tables */
M
Michael Niedermayer 已提交
722 723 724 725 726 727 728 729 730 731 732 733 734
            for(i=0; i<2; i++){
                int j, k;
                for(j=0; j<2; j++){
                    for(k=0; k<2; k++){
                        CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k]     , mv_table_size * 2 * sizeof(int16_t))
                        s->b_field_mv_table[i][j][k]    = s->b_field_mv_table_base[i][j][k]     + s->mb_stride + 1;
                    }
                    CHECKED_ALLOCZ(s->b_field_select_table[i][j]     , mb_array_size * 2 * sizeof(uint8_t))
                    CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j]     , mv_table_size * 2 * sizeof(int16_t))
                    s->p_field_mv_table[i][j]    = s->p_field_mv_table_base[i][j]     + s->mb_stride + 1;
                }
                CHECKED_ALLOCZ(s->p_field_select_table[i]      , mb_array_size * 2 * sizeof(uint8_t))
            }
F
Fabrice Bellard 已提交
735
    }
M
Michael Niedermayer 已提交
736
    if (s->out_format == FMT_H263) {
F
Fabrice Bellard 已提交
737
        /* ac values */
738 739 740
        CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
        s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
        s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
F
Fabrice Bellard 已提交
741 742 743
        s->ac_val[2] = s->ac_val[1] + c_size;
        
        /* cbp values */
744 745
        CHECKED_ALLOCZ(s->coded_block_base, y_size);
        s->coded_block= s->coded_block_base + s->b8_stride + 1;
M
Michael Niedermayer 已提交
746
        
747
        /* cbp, ac_pred, pred_dir */
748 749
        CHECKED_ALLOCZ(s->cbp_table  , mb_array_size * sizeof(uint8_t))
        CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
750
    }
751 752 753 754
    
    if (s->h263_pred || s->h263_plus || !s->encoding) {
        /* dc values */
        //MN: we need these for error resilience of intra-frames
755 756 757
        CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
        s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
        s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
758 759
        s->dc_val[2] = s->dc_val[1] + c_size;
        for(i=0;i<yc_size;i++)
760
            s->dc_val_base[i] = 1024;
761 762
    }

763
    /* which mb is a intra block */
764 765
    CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
    memset(s->mbintra_table, 1, mb_array_size);
766
    
767
    /* init macroblock skip table */
768
    CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
769
    //Note the +1 is for a quicker mpeg4 slice_end detection
770
    CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
771
    
772
    s->parse_context.state= -1;
773 774 775 776 777
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
       s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
       s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
       s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
    }
778

F
Fabrice Bellard 已提交
779
    s->context_initialized = 1;
780 781 782 783 784 785 786 787 788 789 790 791 792 793

    s->thread_context[0]= s;
    for(i=1; i<s->avctx->thread_count; i++){
        s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
        memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
    }

    for(i=0; i<s->avctx->thread_count; i++){
        if(init_duplicate_context(s->thread_context[i], s) < 0)
           goto fail;
        s->thread_context[i]->start_mb_y= (s->mb_height*(i  ) + s->avctx->thread_count/2) / s->avctx->thread_count;
        s->thread_context[i]->end_mb_y  = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
    }

F
Fabrice Bellard 已提交
794 795
    return 0;
 fail:
796
    MPV_common_end(s);
F
Fabrice Bellard 已提交
797 798 799 800 801 802
    return -1;
}

/* init common structure for both encoder and decoder */
void MPV_common_end(MpegEncContext *s)
{
M
Michael Niedermayer 已提交
803
    int i, j, k;
F
Fabrice Bellard 已提交
804

805 806 807 808 809 810 811
    for(i=0; i<s->avctx->thread_count; i++){
        free_duplicate_context(s->thread_context[i]);
    }
    for(i=1; i<s->avctx->thread_count; i++){
        av_freep(&s->thread_context[i]);
    }

812 813 814
    av_freep(&s->parse_context.buffer);
    s->parse_context.buffer_size=0;

815
    av_freep(&s->mb_type);
816 817 818 819 820 821 822 823 824 825 826 827
    av_freep(&s->p_mv_table_base);
    av_freep(&s->b_forw_mv_table_base);
    av_freep(&s->b_back_mv_table_base);
    av_freep(&s->b_bidir_forw_mv_table_base);
    av_freep(&s->b_bidir_back_mv_table_base);
    av_freep(&s->b_direct_mv_table_base);
    s->p_mv_table= NULL;
    s->b_forw_mv_table= NULL;
    s->b_back_mv_table= NULL;
    s->b_bidir_forw_mv_table= NULL;
    s->b_bidir_back_mv_table= NULL;
    s->b_direct_mv_table= NULL;
M
Michael Niedermayer 已提交
828 829 830 831 832 833 834 835 836 837 838 839
    for(i=0; i<2; i++){
        for(j=0; j<2; j++){
            for(k=0; k<2; k++){
                av_freep(&s->b_field_mv_table_base[i][j][k]);
                s->b_field_mv_table[i][j][k]=NULL;
            }
            av_freep(&s->b_field_select_table[i][j]);
            av_freep(&s->p_field_mv_table_base[i][j]);
            s->p_field_mv_table[i][j]=NULL;
        }
        av_freep(&s->p_field_select_table[i]);
    }
840
    
841 842 843
    av_freep(&s->dc_val_base);
    av_freep(&s->ac_val_base);
    av_freep(&s->coded_block_base);
844
    av_freep(&s->mbintra_table);
845 846 847
    av_freep(&s->cbp_table);
    av_freep(&s->pred_dir_table);
    
848
    av_freep(&s->mbskip_table);
849
    av_freep(&s->prev_pict_types);
850
    av_freep(&s->bitstream_buffer);
851 852
    s->allocated_bitstream_buffer_size=0;

M
Michael Niedermayer 已提交
853
    av_freep(&s->avctx->stats_out);
854
    av_freep(&s->ac_stats);
855
    av_freep(&s->error_status_table);
856
    av_freep(&s->mb_index2xy);
857
    av_freep(&s->lambda_table);
858 859
    av_freep(&s->q_intra_matrix);
    av_freep(&s->q_inter_matrix);
860 861
    av_freep(&s->q_intra_matrix16);
    av_freep(&s->q_inter_matrix16);
862 863
    av_freep(&s->input_picture);
    av_freep(&s->reordered_input_picture);
864
    av_freep(&s->dct_offset);
M
cleanup  
Michael Niedermayer 已提交
865

M
Michael Niedermayer 已提交
866 867 868 869
    if(s->picture){
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            free_picture(s, &s->picture[i]);
        }
F
Fabrice Bellard 已提交
870
    }
871
    av_freep(&s->picture);
F
Fabrice Bellard 已提交
872
    s->context_initialized = 0;
873 874 875
    s->last_picture_ptr=
    s->next_picture_ptr=
    s->current_picture_ptr= NULL;
M
Michael Niedermayer 已提交
876
    s->linesize= s->uvlinesize= 0;
877

878
    for(i=0; i<3; i++)
879
        av_freep(&s->visualization_buffer[i]);
M
Michael Niedermayer 已提交
880 881

    avcodec_default_free_buffers(s->avctx);
F
Fabrice Bellard 已提交
882 883
}

884 885
#ifdef CONFIG_ENCODERS

F
Fabrice Bellard 已提交
886 887 888 889
/* init video encoder */
int MPV_encode_init(AVCodecContext *avctx)
{
    MpegEncContext *s = avctx->priv_data;
890
    int i, dummy;
891
    int chroma_h_shift, chroma_v_shift;
M
Michael Niedermayer 已提交
892 893
    
    MPV_encode_defaults(s);
894

M
Michael Niedermayer 已提交
895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910
    if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUV420P){
        av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
        return -1;
    }

    if(avctx->codec_id == CODEC_ID_MJPEG || avctx->codec_id == CODEC_ID_LJPEG){
        if(avctx->strict_std_compliance>=0 && avctx->pix_fmt != PIX_FMT_YUVJ420P){
            av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
            return -1;
        }
    }else{
        if(avctx->strict_std_compliance>=0 && avctx->pix_fmt != PIX_FMT_YUV420P){
            av_log(avctx, AV_LOG_ERROR, "colorspace not supported\n");
            return -1;
        }
    }
911

F
Fabrice Bellard 已提交
912 913 914
    s->bit_rate = avctx->bit_rate;
    s->width = avctx->width;
    s->height = avctx->height;
915
    if(avctx->gop_size > 600){
916
	av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
917 918
        avctx->gop_size=600;
    }
F
Fabrice Bellard 已提交
919
    s->gop_size = avctx->gop_size;
920
    s->avctx = avctx;
921
    s->flags= avctx->flags;
922
    s->flags2= avctx->flags2;
923
    s->max_b_frames= avctx->max_b_frames;
924
    s->codec_id= avctx->codec->id;
925 926 927 928
    s->luma_elim_threshold  = avctx->luma_elim_threshold;
    s->chroma_elim_threshold= avctx->chroma_elim_threshold;
    s->strict_std_compliance= avctx->strict_std_compliance;
    s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
M
Michael Niedermayer 已提交
929
    s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
930
    s->mpeg_quant= avctx->mpeg_quant;
M
Michael Niedermayer 已提交
931
    s->rtp_mode= !!avctx->rtp_payload_size;
932
    s->intra_dc_precision= avctx->intra_dc_precision;
933
    s->user_specified_pts = AV_NOPTS_VALUE;
934

F
Fabrice Bellard 已提交
935 936 937 938 939 940
    if (s->gop_size <= 1) {
        s->intra_only = 1;
        s->gop_size = 12;
    } else {
        s->intra_only = 0;
    }
941

M
Michael Niedermayer 已提交
942
    s->me_method = avctx->me_method;
943

944
    /* Fixed QSCALE */
M
Michael Niedermayer 已提交
945
    s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
946
    
947
    s->adaptive_quant= (   s->avctx->lumi_masking
948
                        || s->avctx->dark_masking
949 950
                        || s->avctx->temporal_cplx_masking 
                        || s->avctx->spatial_cplx_masking
951
                        || s->avctx->p_masking
952
                        || s->avctx->border_masking
953
                        || (s->flags&CODEC_FLAG_QP_RD))
954
                       && !s->fixed_qscale;
955
    
M
Michael Niedermayer 已提交
956 957 958
    s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
    s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
    s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
959

M
Michael Niedermayer 已提交
960 961 962 963 964 965 966
    if(avctx->rc_max_rate && !avctx->rc_buffer_size){
        av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
        return -1;
    }    

    if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
        av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");
967 968
    }
    
M
Michael Niedermayer 已提交
969 970 971 972 973 974 975 976 977 978
    if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
        av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
        return -1;
    }
    
    if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
        av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
        return -1;
    }
        
979 980 981
    if(   s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate 
       && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
       && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
M
Michael Niedermayer 已提交
982
        
983 984 985
        av_log(avctx, AV_LOG_INFO, "Warning vbv_delay will be set to 0xFFFF (=VBR) as the specified vbv buffer is too large for the given bitrate!\n");
    }
       
M
Michael Niedermayer 已提交
986
    if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4 
987
       && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
988
        av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
989 990
        return -1;
    }
M
Michael Niedermayer 已提交
991
        
M
Michael Niedermayer 已提交
992 993 994 995 996
    if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
        av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
        return -1;
    }
    
M
Michael Niedermayer 已提交
997 998 999 1000 1001
    if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
        av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
        return -1;
    }
    
1002
    if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1003
        av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1004 1005 1006 1007
        return -1;
    }

    if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1008
        av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1009 1010 1011
        return -1;
    }
    
M
Michael Niedermayer 已提交
1012
    if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1013
        av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1014 1015
        return -1;
    }
M
Michael Niedermayer 已提交
1016 1017 1018 1019 1020 1021 1022

    if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN)) 
       && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
        av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
        return -1;
    }
        
1023
    if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1024
        av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");
1025 1026
        return -1;
    }
1027
        
1028
    if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1029
        av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1030 1031 1032
        return -1;
    }

M
Michael Niedermayer 已提交
1033 1034 1035 1036 1037
    if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
        av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
        return -1;
    }
    
1038 1039 1040 1041
    if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
        av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
        return -1;
    }
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
    
    if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4 
       && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO 
       && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
        av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
        return -1;
    }
    
    if(s->avctx->thread_count > 1)
        s->rtp_mode= 1;
M
Michael Niedermayer 已提交
1052

M
Michael Niedermayer 已提交
1053 1054 1055 1056
    if(!avctx->frame_rate || !avctx->frame_rate_base){
        av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
        return -1;
    }
1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
    
    i= (INT_MAX/2+128)>>8;
    if(avctx->me_threshold >= i){
        av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
        return -1;
    }
    if(avctx->mb_threshold >= i){
        av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
        return -1;
    }
M
Michael Niedermayer 已提交
1067
        
M
Michael Niedermayer 已提交
1068 1069 1070 1071 1072 1073 1074
    i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
    if(i > 1){
        av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
        avctx->frame_rate /= i;
        avctx->frame_rate_base /= i;
//        return -1;
    }
1075
    
1076 1077 1078
    if(s->codec_id==CODEC_ID_MJPEG){
        s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
        s->inter_quant_bias= 0;
M
Michael Niedermayer 已提交
1079
    }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
        s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
        s->inter_quant_bias= 0;
    }else{
        s->intra_quant_bias=0;
        s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
    }
    
    if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
        s->intra_quant_bias= avctx->intra_quant_bias;
    if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
        s->inter_quant_bias= avctx->inter_quant_bias;
1091 1092 1093
        
    avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);

1094 1095 1096
    av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
    s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;

F
Fabrice Bellard 已提交
1097 1098 1099
    switch(avctx->codec->id) {
    case CODEC_ID_MPEG1VIDEO:
        s->out_format = FMT_MPEG1;
1100 1101
        s->low_delay= 0; //s->max_b_frames ? 0 : 1;
        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
F
Fabrice Bellard 已提交
1102
        break;
M
Michael Niedermayer 已提交
1103 1104 1105 1106
    case CODEC_ID_MPEG2VIDEO:
        s->out_format = FMT_MPEG1;
        s->low_delay= 0; //s->max_b_frames ? 0 : 1;
        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
M
Michael Niedermayer 已提交
1107
        s->rtp_mode= 1;
M
Michael Niedermayer 已提交
1108
        break;
1109
    case CODEC_ID_LJPEG:
F
Fabrice Bellard 已提交
1110 1111 1112
    case CODEC_ID_MJPEG:
        s->out_format = FMT_MJPEG;
        s->intra_only = 1; /* force intra only for jpeg */
1113
        s->mjpeg_write_tables = 1; /* write all tables */
1114
	s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1115 1116
        s->mjpeg_vsample[0] = 1<<chroma_v_shift;
        s->mjpeg_vsample[1] = 1;
1117
        s->mjpeg_vsample[2] = 1; 
1118
        s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1119 1120
        s->mjpeg_hsample[1] = 1; 
        s->mjpeg_hsample[2] = 1; 
F
Fabrice Bellard 已提交
1121 1122
        if (mjpeg_init(s) < 0)
            return -1;
M
Michael Niedermayer 已提交
1123
        avctx->delay=0;
M
Michael Niedermayer 已提交
1124
        s->low_delay=1;
F
Fabrice Bellard 已提交
1125
        break;
1126 1127 1128 1129 1130
    case CODEC_ID_H261:
        s->out_format = FMT_H261;
        avctx->delay=0;
        s->low_delay=1;
        break;
F
Fabrice Bellard 已提交
1131
    case CODEC_ID_H263:
1132
        if (h263_get_picture_format(s->width, s->height) == 7) {
1133
            av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
F
Fabrice Bellard 已提交
1134
            return -1;
1135
        }
F
Fabrice Bellard 已提交
1136
        s->out_format = FMT_H263;
M
Michael Niedermayer 已提交
1137
	s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
M
Michael Niedermayer 已提交
1138
        avctx->delay=0;
M
Michael Niedermayer 已提交
1139
        s->low_delay=1;
F
Fabrice Bellard 已提交
1140 1141 1142 1143
        break;
    case CODEC_ID_H263P:
        s->out_format = FMT_H263;
        s->h263_plus = 1;
1144
	/* Fx */
M
Michael Niedermayer 已提交
1145
        s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1146
	s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
M
Michael Niedermayer 已提交
1147
	s->modified_quant= s->h263_aic;
1148
	s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
M
Michael Niedermayer 已提交
1149 1150 1151
	s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
	s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
	s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
M
Michael Niedermayer 已提交
1152
        s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
M
Michael Niedermayer 已提交
1153

1154
	/* /Fx */
1155
        /* These are just to be sure */
M
Michael Niedermayer 已提交
1156
        avctx->delay=0;
M
Michael Niedermayer 已提交
1157
        s->low_delay=1;
F
Fabrice Bellard 已提交
1158
        break;
1159 1160 1161 1162 1163 1164 1165 1166
    case CODEC_ID_FLV1:
        s->out_format = FMT_H263;
        s->h263_flv = 2; /* format = 1; 11-bit codes */
        s->unrestricted_mv = 1;
        s->rtp_mode=0; /* don't allow GOB */
        avctx->delay=0;
        s->low_delay=1;
        break;
F
Fabrice Bellard 已提交
1167 1168
    case CODEC_ID_RV10:
        s->out_format = FMT_H263;
M
Michael Niedermayer 已提交
1169
        avctx->delay=0;
M
Michael Niedermayer 已提交
1170
        s->low_delay=1;
F
Fabrice Bellard 已提交
1171
        break;
M
Michael Niedermayer 已提交
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
    case CODEC_ID_RV20:
        s->out_format = FMT_H263;
        avctx->delay=0;
        s->low_delay=1;
        s->modified_quant=1;
        s->h263_aic=1;
        s->h263_plus=1;
        s->loop_filter=1;
        s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
        break;
F
Fabrice Bellard 已提交
1182
    case CODEC_ID_MPEG4:
F
Fabrice Bellard 已提交
1183 1184 1185
        s->out_format = FMT_H263;
        s->h263_pred = 1;
        s->unrestricted_mv = 1;
M
Michael Niedermayer 已提交
1186
        s->low_delay= s->max_b_frames ? 0 : 1;
1187
        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
F
Fabrice Bellard 已提交
1188
        break;
1189
    case CODEC_ID_MSMPEG4V1:
F
Fabrice Bellard 已提交
1190 1191 1192 1193
        s->out_format = FMT_H263;
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->unrestricted_mv = 1;
1194
        s->msmpeg4_version= 1;
M
Michael Niedermayer 已提交
1195
        avctx->delay=0;
M
Michael Niedermayer 已提交
1196
        s->low_delay=1;
1197 1198 1199 1200 1201 1202 1203
        break;
    case CODEC_ID_MSMPEG4V2:
        s->out_format = FMT_H263;
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->unrestricted_mv = 1;
        s->msmpeg4_version= 2;
M
Michael Niedermayer 已提交
1204
        avctx->delay=0;
M
Michael Niedermayer 已提交
1205
        s->low_delay=1;
1206 1207 1208 1209 1210 1211 1212
        break;
    case CODEC_ID_MSMPEG4V3:
        s->out_format = FMT_H263;
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->unrestricted_mv = 1;
        s->msmpeg4_version= 3;
M
Michael Niedermayer 已提交
1213
        s->flipflop_rounding=1;
M
Michael Niedermayer 已提交
1214
        avctx->delay=0;
M
Michael Niedermayer 已提交
1215
        s->low_delay=1;
F
Fabrice Bellard 已提交
1216
        break;
M
Michael Niedermayer 已提交
1217 1218 1219 1220 1221 1222
    case CODEC_ID_WMV1:
        s->out_format = FMT_H263;
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->unrestricted_mv = 1;
        s->msmpeg4_version= 4;
M
Michael Niedermayer 已提交
1223
        s->flipflop_rounding=1;
M
Michael Niedermayer 已提交
1224
        avctx->delay=0;
M
Michael Niedermayer 已提交
1225
        s->low_delay=1;
M
Michael Niedermayer 已提交
1226 1227 1228 1229 1230 1231 1232
        break;
    case CODEC_ID_WMV2:
        s->out_format = FMT_H263;
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->unrestricted_mv = 1;
        s->msmpeg4_version= 5;
M
Michael Niedermayer 已提交
1233
        s->flipflop_rounding=1;
M
Michael Niedermayer 已提交
1234
        avctx->delay=0;
M
Michael Niedermayer 已提交
1235
        s->low_delay=1;
M
Michael Niedermayer 已提交
1236
        break;
F
Fabrice Bellard 已提交
1237 1238 1239
    default:
        return -1;
    }
1240 1241
    
    avctx->has_b_frames= !s->low_delay;
1242

1243 1244
    s->encoding = 1;

F
Fabrice Bellard 已提交
1245 1246 1247
    /* init */
    if (MPV_common_init(s) < 0)
        return -1;
M
Michael Niedermayer 已提交
1248 1249 1250 1251

    if(s->modified_quant)
        s->chroma_qscale_table= ff_h263_chroma_qscale_table;
    s->progressive_frame= 
M
Michael Niedermayer 已提交
1252
    s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1253
    s->quant_precision=5;
F
Fabrice Bellard 已提交
1254
    
1255
    ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1256
    ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1257
    
1258 1259
    if (s->out_format == FMT_H261)
        ff_h261_encode_init(s);
1260 1261 1262 1263
    if (s->out_format == FMT_H263)
        h263_encode_init(s);
    if(s->msmpeg4_version)
        ff_msmpeg4_encode_init(s);
M
Michael Niedermayer 已提交
1264 1265
    if (s->out_format == FMT_MPEG1)
        ff_mpeg1_encode_init(s);
1266

M
Michael Niedermayer 已提交
1267
    /* init q matrix */
1268
    for(i=0;i<64;i++) {
1269
        int j= s->dsp.idct_permutation[i];
1270
        if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1271 1272
            s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
            s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1273
        }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1274 1275
            s->intra_matrix[j] =
            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
M
Michael Niedermayer 已提交
1276
        }else
M
Michael Niedermayer 已提交
1277
        { /* mpeg1/2 */
1278 1279
            s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1280
        }
1281 1282 1283 1284
        if(s->avctx->intra_matrix)
            s->intra_matrix[j] = s->avctx->intra_matrix[i];
        if(s->avctx->inter_matrix)
            s->inter_matrix[j] = s->avctx->inter_matrix[i];
1285 1286 1287
    }

    /* precompute matrix */
1288
    /* for mjpeg, we do include qscale in the matrix */
1289
    if (s->out_format != FMT_MJPEG) {
1290
        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, 
1291
                       s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1292
        convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16, 
1293
                       s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1294 1295
    }

1296 1297
    if(ff_rate_control_init(s) < 0)
        return -1;
M
Michael Niedermayer 已提交
1298
    
F
Fabrice Bellard 已提交
1299 1300 1301 1302 1303 1304 1305 1306 1307 1308
    return 0;
}

int MPV_encode_end(AVCodecContext *avctx)
{
    MpegEncContext *s = avctx->priv_data;

#ifdef STATS
    print_stats();
#endif
1309 1310 1311

    ff_rate_control_uninit(s);

F
Fabrice Bellard 已提交
1312 1313 1314
    MPV_common_end(s);
    if (s->out_format == FMT_MJPEG)
        mjpeg_close(s);
1315

1316
    av_freep(&avctx->extradata);
1317
      
F
Fabrice Bellard 已提交
1318 1319 1320
    return 0;
}

1321 1322
#endif //CONFIG_ENCODERS

1323
void init_rl(RLTable *rl, int use_static)
M
Michael Niedermayer 已提交
1324
{
1325 1326
    int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
    uint8_t index_run[MAX_RUN+1];
M
Michael Niedermayer 已提交
1327 1328
    int last, run, level, start, end, i;

1329 1330 1331 1332
    /* If table is static, we can quit if rl->max_level[0] is not NULL */
    if(use_static && rl->max_level[0])
        return;

M
Michael Niedermayer 已提交
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
    /* compute max_level[], max_run[] and index_run[] */
    for(last=0;last<2;last++) {
        if (last == 0) {
            start = 0;
            end = rl->last;
        } else {
            start = rl->last;
            end = rl->n;
        }

        memset(max_level, 0, MAX_RUN + 1);
        memset(max_run, 0, MAX_LEVEL + 1);
        memset(index_run, rl->n, MAX_RUN + 1);
        for(i=start;i<end;i++) {
            run = rl->table_run[i];
            level = rl->table_level[i];
            if (index_run[run] == rl->n)
                index_run[run] = i;
            if (level > max_level[run])
                max_level[run] = level;
            if (run > max_run[level])
                max_run[level] = run;
        }
1356 1357 1358 1359
        if(use_static)
            rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
        else
            rl->max_level[last] = av_malloc(MAX_RUN + 1);
M
Michael Niedermayer 已提交
1360
        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1361 1362 1363 1364
        if(use_static)
            rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
        else
            rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
M
Michael Niedermayer 已提交
1365
        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1366 1367 1368 1369
        if(use_static)
            rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
        else
            rl->index_run[last] = av_malloc(MAX_RUN + 1);
M
Michael Niedermayer 已提交
1370 1371 1372 1373
        memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
    }
}

F
Fabrice Bellard 已提交
1374
/* draw the edges of width 'w' of an image of size width, height */
1375
//FIXME check that this is ok for mpeg4 interlaced
1376
static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
F
Fabrice Bellard 已提交
1377
{
1378
    uint8_t *ptr, *last_line;
F
Fabrice Bellard 已提交
1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402
    int i;

    last_line = buf + (height - 1) * wrap;
    for(i=0;i<w;i++) {
        /* top and bottom */
        memcpy(buf - (i + 1) * wrap, buf, width);
        memcpy(last_line + (i + 1) * wrap, last_line, width);
    }
    /* left and right */
    ptr = buf;
    for(i=0;i<height;i++) {
        memset(ptr - w, ptr[0], w);
        memset(ptr + width, ptr[width-1], w);
        ptr += wrap;
    }
    /* corners */
    for(i=0;i<w;i++) {
        memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
        memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
        memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
        memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
    }
}

M
Michael Niedermayer 已提交
1403
int ff_find_unused_picture(MpegEncContext *s, int shared){
M
Michael Niedermayer 已提交
1404 1405 1406 1407
    int i;
    
    if(shared){
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
1408
            if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
M
Michael Niedermayer 已提交
1409 1410 1411
        }
    }else{
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
1412
            if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
M
Michael Niedermayer 已提交
1413 1414
        }
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
1415
            if(s->picture[i].data[0]==NULL) return i;
M
Michael Niedermayer 已提交
1416 1417 1418
        }
    }

M
Michael Niedermayer 已提交
1419 1420
    assert(0);
    return -1;
M
Michael Niedermayer 已提交
1421 1422
}

1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439
static void update_noise_reduction(MpegEncContext *s){
    int intra, i;

    for(intra=0; intra<2; intra++){
        if(s->dct_count[intra] > (1<<16)){
            for(i=0; i<64; i++){
                s->dct_error_sum[intra][i] >>=1;
            }
            s->dct_count[intra] >>= 1;
        }
        
        for(i=0; i<64; i++){
            s->dct_offset[intra][i]= (s->avctx->noise_reduction * s->dct_count[intra] + s->dct_error_sum[intra][i]/2) / (s->dct_error_sum[intra][i]+1);
        }
    }
}

M
Michael Niedermayer 已提交
1440 1441 1442
/**
 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
 */
1443
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
F
Fabrice Bellard 已提交
1444
{
M
Michael Niedermayer 已提交
1445
    int i;
M
Michael Niedermayer 已提交
1446
    AVFrame *pic;
1447
    s->mb_skiped = 0;
M
Michael Niedermayer 已提交
1448

M
Michael Niedermayer 已提交
1449
    assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
M
Michael Niedermayer 已提交
1450

M
cleanup  
Michael Niedermayer 已提交
1451
    /* mark&release old frames */
1452
    if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
M
Michael Niedermayer 已提交
1453
        avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
M
cleanup  
Michael Niedermayer 已提交
1454 1455 1456 1457 1458

        /* release forgotten pictures */
        /* if(mpeg124/h263) */
        if(!s->encoding){
            for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
1459
                if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1460
                    av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
M
Michael Niedermayer 已提交
1461
                    avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);                
M
cleanup  
Michael Niedermayer 已提交
1462 1463
                }
            }
1464
        }
1465
    }
1466 1467
alloc:
    if(!s->encoding){
M
Michael Niedermayer 已提交
1468 1469 1470 1471 1472 1473 1474
        /* release non refernce frames */
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
            }
        }

M
Michael Niedermayer 已提交
1475 1476 1477 1478 1479 1480 1481
        if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
            pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
        else{
            i= ff_find_unused_picture(s, 0);
            pic= (AVFrame*)&s->picture[i];
        }

1482 1483
        pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
                        && !s->dropable ? 3 : 0;
M
Michael Niedermayer 已提交
1484

M
Michael Niedermayer 已提交
1485
        pic->coded_picture_number= s->coded_picture_number++;
M
cleanup  
Michael Niedermayer 已提交
1486
        
1487 1488
        if( alloc_picture(s, (Picture*)pic, 0) < 0)
            return -1;
1489

M
Michael Niedermayer 已提交
1490
        s->current_picture_ptr= (Picture*)pic;
1491
        s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1492
        s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
M
cleanup  
Michael Niedermayer 已提交
1493
    }
1494

M
Michael Niedermayer 已提交
1495
    s->current_picture_ptr->pict_type= s->pict_type;
1496 1497
//    if(s->flags && CODEC_FLAG_QSCALE) 
  //      s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1498
    s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
M
Michael Niedermayer 已提交
1499

1500
    copy_picture(&s->current_picture, s->current_picture_ptr);
M
Michael Niedermayer 已提交
1501
  
M
Michael Niedermayer 已提交
1502
  if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
M
cleanup  
Michael Niedermayer 已提交
1503
    if (s->pict_type != B_TYPE) {
M
Michael Niedermayer 已提交
1504
        s->last_picture_ptr= s->next_picture_ptr;
1505 1506
        if(!s->dropable)
            s->next_picture_ptr= s->current_picture_ptr;
F
Fabrice Bellard 已提交
1507
    }
1508 1509 1510 1511 1512
/*    av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
        s->last_picture_ptr    ? s->last_picture_ptr->data[0] : NULL, 
        s->next_picture_ptr    ? s->next_picture_ptr->data[0] : NULL, 
        s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
        s->pict_type, s->dropable);*/
1513
    
1514 1515
    if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
    if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1516
    
1517
    if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1518
        av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1519 1520 1521 1522 1523 1524
        assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
        goto alloc;
    }

    assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));

M
Michael Niedermayer 已提交
1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
    if(s->picture_structure!=PICT_FRAME){
        int i;
        for(i=0; i<4; i++){
            if(s->picture_structure == PICT_BOTTOM_FIELD){
                 s->current_picture.data[i] += s->current_picture.linesize[i];
            } 
            s->current_picture.linesize[i] *= 2;
            s->last_picture.linesize[i] *=2;
            s->next_picture.linesize[i] *=2;
        }
    }
M
Michael Niedermayer 已提交
1536
  }
M
cleanup  
Michael Niedermayer 已提交
1537
   
1538 1539 1540
    s->hurry_up= s->avctx->hurry_up;
    s->error_resilience= avctx->error_resilience;

1541 1542
    /* set dequantizer, we cant do it during init as it might change for mpeg4
       and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1543 1544 1545
    if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
        s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
        s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
M
Maarten Daniels 已提交
1546
    }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1547 1548 1549 1550 1551 1552
        s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
        s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
    }else{
        s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
        s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
    }
1553

1554 1555 1556 1557 1558 1559
    if(s->dct_error_sum){
        assert(s->avctx->noise_reduction && s->encoding);

        update_noise_reduction(s);
    }
        
I
Ivan Kalvachev 已提交
1560 1561 1562 1563
#ifdef HAVE_XVMC
    if(s->avctx->xvmc_acceleration)
        return XVMC_field_start(s, avctx);
#endif
1564
    return 0;
F
Fabrice Bellard 已提交
1565
}
1566

F
Fabrice Bellard 已提交
1567 1568 1569
/* generic function for encode/decode called after a frame has been coded/decoded */
void MPV_frame_end(MpegEncContext *s)
{
M
cleanup  
Michael Niedermayer 已提交
1570
    int i;
F
Fabrice Bellard 已提交
1571
    /* draw edge for correct motion prediction if outside */
I
Ivan Kalvachev 已提交
1572 1573 1574 1575 1576 1577
#ifdef HAVE_XVMC
//just to make sure that all data is rendered.
    if(s->avctx->xvmc_acceleration){
        XVMC_field_end(s);
    }else
#endif
1578
    if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
M
cleanup  
Michael Niedermayer 已提交
1579 1580 1581
            draw_edges(s->current_picture.data[0], s->linesize  , s->h_edge_pos   , s->v_edge_pos   , EDGE_WIDTH  );
            draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
            draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
F
Fabrice Bellard 已提交
1582
    }
M
Michael Niedermayer 已提交
1583
    emms_c();
1584
    
M
Michael Niedermayer 已提交
1585
    s->last_pict_type    = s->pict_type;
1586 1587 1588
    if(s->pict_type!=B_TYPE){
        s->last_non_b_pict_type= s->pict_type;
    }
M
Michael Niedermayer 已提交
1589 1590
#if 0
        /* copy back current_picture variables */
M
cleanup  
Michael Niedermayer 已提交
1591 1592 1593 1594 1595 1596 1597
    for(i=0; i<MAX_PICTURE_COUNT; i++){
        if(s->picture[i].data[0] == s->current_picture.data[0]){
            s->picture[i]= s->current_picture;
            break;
        }    
    }
    assert(i<MAX_PICTURE_COUNT);
M
Michael Niedermayer 已提交
1598
#endif    
M
cleanup  
Michael Niedermayer 已提交
1599

M
Michael Niedermayer 已提交
1600 1601 1602 1603 1604 1605 1606
    if(s->encoding){
        /* release non refernce frames */
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
            }
        }
M
cleanup  
Michael Niedermayer 已提交
1607
    }
M
Michael Niedermayer 已提交
1608 1609 1610 1611 1612 1613
    // clear copies, to avoid confusion
#if 0
    memset(&s->last_picture, 0, sizeof(Picture));
    memset(&s->next_picture, 0, sizeof(Picture));
    memset(&s->current_picture, 0, sizeof(Picture));
#endif
M
Michael Niedermayer 已提交
1614
    s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
F
Fabrice Bellard 已提交
1615 1616
}

1617 1618 1619 1620 1621 1622 1623 1624
/**
 * draws an line from (ex, ey) -> (sx, sy).
 * @param w width of the image
 * @param h height of the image
 * @param stride stride/linesize of the image
 * @param color color of the arrow
 */
static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1625
    int t, x, y, fr, f;
1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642
    
    sx= clip(sx, 0, w-1);
    sy= clip(sy, 0, h-1);
    ex= clip(ex, 0, w-1);
    ey= clip(ey, 0, h-1);
    
    buf[sy*stride + sx]+= color;
    
    if(ABS(ex - sx) > ABS(ey - sy)){
        if(sx > ex){
            t=sx; sx=ex; ex=t;
            t=sy; sy=ey; ey=t;
        }
        buf+= sx + sy*stride;
        ex-= sx;
        f= ((ey-sy)<<16)/ex;
        for(x= 0; x <= ex; x++){
1643 1644 1645 1646
            y = (x*f)>>16;
            fr= (x*f)&0xFFFF;
            buf[ y   *stride + x]+= (color*(0x10000-fr))>>16;
            buf[(y+1)*stride + x]+= (color*         fr )>>16;
1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657
        }
    }else{
        if(sy > ey){
            t=sx; sx=ex; ex=t;
            t=sy; sy=ey; ey=t;
        }
        buf+= sx + sy*stride;
        ey-= sy;
        if(ey) f= ((ex-sx)<<16)/ey;
        else   f= 0;
        for(y= 0; y <= ey; y++){
1658 1659 1660 1661
            x = (y*f)>>16;
            fr= (y*f)&0xFFFF;
            buf[y*stride + x  ]+= (color*(0x10000-fr))>>16;;
            buf[y*stride + x+1]+= (color*         fr )>>16;;
1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698
        }
    }
}

/**
 * draws an arrow from (ex, ey) -> (sx, sy).
 * @param w width of the image
 * @param h height of the image
 * @param stride stride/linesize of the image
 * @param color color of the arrow
 */
static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ 
    int dx,dy;

    sx= clip(sx, -100, w+100);
    sy= clip(sy, -100, h+100);
    ex= clip(ex, -100, w+100);
    ey= clip(ey, -100, h+100);
    
    dx= ex - sx;
    dy= ey - sy;
    
    if(dx*dx + dy*dy > 3*3){
        int rx=  dx + dy;
        int ry= -dx + dy;
        int length= ff_sqrt((rx*rx + ry*ry)<<8);
        
        //FIXME subpixel accuracy
        rx= ROUNDED_DIV(rx*3<<4, length);
        ry= ROUNDED_DIV(ry*3<<4, length);
        
        draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
        draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
    }
    draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
}

1699 1700 1701
/**
 * prints debuging info for the given picture.
 */
1702
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1703 1704 1705 1706 1707

    if(!pict || !pict->mb_type) return;

    if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
        int x,y;
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717
        
        av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
        switch (pict->pict_type) {
            case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
            case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
            case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
            case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
            case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
            case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;            
        }
1718 1719 1720 1721 1722
        for(y=0; y<s->mb_height; y++){
            for(x=0; x<s->mb_width; x++){
                if(s->avctx->debug&FF_DEBUG_SKIP){
                    int count= s->mbskip_table[x + y*s->mb_stride];
                    if(count>9) count=9;
1723
                    av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1724 1725
                }
                if(s->avctx->debug&FF_DEBUG_QP){
1726
                    av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1727 1728 1729 1730 1731
                }
                if(s->avctx->debug&FF_DEBUG_MB_TYPE){
                    int mb_type= pict->mb_type[x + y*s->mb_stride];
                    //Type & MV direction
                    if(IS_PCM(mb_type))
1732
                        av_log(s->avctx, AV_LOG_DEBUG, "P");
1733
                    else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1734
                        av_log(s->avctx, AV_LOG_DEBUG, "A");
1735
                    else if(IS_INTRA4x4(mb_type))
1736
                        av_log(s->avctx, AV_LOG_DEBUG, "i");
1737
                    else if(IS_INTRA16x16(mb_type))
1738
                        av_log(s->avctx, AV_LOG_DEBUG, "I");
1739
                    else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1740
                        av_log(s->avctx, AV_LOG_DEBUG, "d");
1741
                    else if(IS_DIRECT(mb_type))
1742
                        av_log(s->avctx, AV_LOG_DEBUG, "D");
1743
                    else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1744
                        av_log(s->avctx, AV_LOG_DEBUG, "g");
1745
                    else if(IS_GMC(mb_type))
1746
                        av_log(s->avctx, AV_LOG_DEBUG, "G");
1747
                    else if(IS_SKIP(mb_type))
1748
                        av_log(s->avctx, AV_LOG_DEBUG, "S");
1749
                    else if(!USES_LIST(mb_type, 1))
1750
                        av_log(s->avctx, AV_LOG_DEBUG, ">");
1751
                    else if(!USES_LIST(mb_type, 0))
1752
                        av_log(s->avctx, AV_LOG_DEBUG, "<");
1753 1754
                    else{
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1755
                        av_log(s->avctx, AV_LOG_DEBUG, "X");
1756 1757 1758 1759
                    }
                    
                    //segmentation
                    if(IS_8X8(mb_type))
1760
                        av_log(s->avctx, AV_LOG_DEBUG, "+");
1761
                    else if(IS_16X8(mb_type))
1762
                        av_log(s->avctx, AV_LOG_DEBUG, "-");
1763
                    else if(IS_8X16(mb_type))
1764
                        av_log(s->avctx, AV_LOG_DEBUG, "");
1765
                    else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1766
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1767
                    else
1768
                        av_log(s->avctx, AV_LOG_DEBUG, "?");
1769 1770 1771
                    
                        
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1772
                        av_log(s->avctx, AV_LOG_DEBUG, "=");
1773
                    else
1774
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1775
                }
1776
//                av_log(s->avctx, AV_LOG_DEBUG, " ");
1777
            }
1778
            av_log(s->avctx, AV_LOG_DEBUG, "\n");
1779 1780
        }
    }
1781

1782
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1783 1784
        const int shift= 1 + s->quarter_sample;
        int mb_y;
1785 1786
        uint8_t *ptr;
        int i;
1787
        int h_chroma_shift, v_chroma_shift;
1788 1789
        const int width = s->avctx->width;
        const int height= s->avctx->height;
1790 1791
        const int mv_sample_log2= 4 - pict->motion_subsample_log2;
        const int mv_stride= (s->mb_width << mv_sample_log2) + 1;
M
100000l  
Michael Niedermayer 已提交
1792
        s->low_delay=0; //needed to see the vectors without trashing the buffers
1793

1794
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1795
        for(i=0; i<3; i++){
1796
            memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1797 1798 1799 1800
            pict->data[i]= s->visualization_buffer[i];
        }
        pict->type= FF_BUFFER_TYPE_COPY;
        ptr= pict->data[0];
1801 1802 1803 1804 1805

        for(mb_y=0; mb_y<s->mb_height; mb_y++){
            int mb_x;
            for(mb_x=0; mb_x<s->mb_width; mb_x++){
                const int mb_index= mb_x + mb_y*s->mb_stride;
1806 1807 1808
                if((s->avctx->debug_mv) && pict->motion_val){
                  int type;
                  for(type=0; type<3; type++){
1809
                    int direction = 0;
1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823
                    switch (type) {
                      case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
                                continue;
                              direction = 0;
                              break;
                      case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
                                continue;
                              direction = 0;
                              break;
                      case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
                                continue;
                              direction = 1;
                              break;
                    }
1824 1825 1826
                    if(!USES_LIST(pict->mb_type[mb_index], direction))
                        continue;

1827 1828 1829
                    if(IS_8X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<4; i++){
1830 1831
                        int sx= mb_x*16 + 4 + 8*(i&1);
                        int sy= mb_y*16 + 4 + 8*(i>>1);
1832
                        int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1833 1834
                        int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                        int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1835
                        draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1836 1837 1838 1839
                      }
                    }else if(IS_16X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<2; i++){
1840 1841
                        int sx=mb_x*16 + 8;
                        int sy=mb_y*16 + 4 + 8*i;
1842
                        int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
                        
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
                        
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
                      }
                    }else if(IS_8X16(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<2; i++){
                        int sx=mb_x*16 + 4 + 8*i;
                        int sy=mb_y*16 + 8;
1856
                        int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1857 1858 1859 1860 1861 1862
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
                        
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
                        
1863
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1864 1865 1866 1867
                      }
                    }else{
                      int sx= mb_x*16 + 8;
                      int sy= mb_y*16 + 8;
1868
                      int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1869 1870
                      int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                      int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1871
                      draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1872
                    }
1873
                  }                  
M
Michael Niedermayer 已提交
1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933
                }
                if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
                    uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
                    int y;
                    for(y=0; y<8; y++){
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
                    }
                }
                if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
                    int mb_type= pict->mb_type[mb_index];
                    uint64_t u,v;
                    int y;
#define COLOR(theta, r)\
u= (int)(128 + r*cos(theta*3.141592/180));\
v= (int)(128 + r*sin(theta*3.141592/180));

                    
                    u=v=128;
                    if(IS_PCM(mb_type)){
                        COLOR(120,48)
                    }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
                        COLOR(30,48)
                    }else if(IS_INTRA4x4(mb_type)){
                        COLOR(90,48)
                    }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
//                        COLOR(120,48)
                    }else if(IS_DIRECT(mb_type)){
                        COLOR(150,48)
                    }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
                        COLOR(170,48)
                    }else if(IS_GMC(mb_type)){
                        COLOR(190,48)
                    }else if(IS_SKIP(mb_type)){
//                        COLOR(180,48)
                    }else if(!USES_LIST(mb_type, 1)){
                        COLOR(240,48)
                    }else if(!USES_LIST(mb_type, 0)){
                        COLOR(0,48)
                    }else{
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
                        COLOR(300,48)
                    }

                    u*= 0x0101010101010101ULL;
                    v*= 0x0101010101010101ULL;
                    for(y=0; y<8; y++){
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
                    }

                    //segmentation
                    if(IS_8X8(mb_type) || IS_16X8(mb_type)){
                        *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
                        *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
                    }
                    if(IS_8X8(mb_type) || IS_8X16(mb_type)){
                        for(y=0; y<16; y++)
                            pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
                    }
1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948
                    if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
                        int dm= 1 << (mv_sample_log2-2);
                        for(i=0; i<4; i++){
                            int sx= mb_x*16 + 8*(i&1);
                            int sy= mb_y*16 + 8*(i>>1);
                            int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
                            //FIXME bidir
                            int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
                            if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
                                for(y=0; y<8; y++)
                                    pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
                            if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
                                *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
                        }
                    }
M
Michael Niedermayer 已提交
1949 1950 1951 1952
                        
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
                        // hmm
                    }
1953 1954 1955 1956 1957
                }
                s->mbskip_table[mb_index]=0;
            }
        }
    }
1958 1959
}

1960 1961
#ifdef CONFIG_ENCODERS

M
Michael Niedermayer 已提交
1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984
static int get_sae(uint8_t *src, int ref, int stride){
    int x,y;
    int acc=0;
    
    for(y=0; y<16; y++){
        for(x=0; x<16; x++){
            acc+= ABS(src[x+y*stride] - ref);
        }
    }
    
    return acc;
}

static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
    int x, y, w, h;
    int acc=0;
    
    w= s->width &~15;
    h= s->height&~15;
    
    for(y=0; y<h; y+=16){
        for(x=0; x<w; x+=16){
            int offset= x + y*stride;
M
Michael Niedermayer 已提交
1985
            int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
M
Michael Niedermayer 已提交
1986 1987 1988 1989 1990 1991 1992 1993 1994
            int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
            int sae = get_sae(src + offset, mean, stride);
            
            acc+= sae + 500 < sad;
        }
    }
    return acc;
}

M
Michael Niedermayer 已提交
1995

M
Michael Niedermayer 已提交
1996
static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1997
    AVFrame *pic=NULL;
1998
    int64_t pts;
M
Michael Niedermayer 已提交
1999
    int i;
M
cleanup  
Michael Niedermayer 已提交
2000
    const int encoding_delay= s->max_b_frames;
M
Michael Niedermayer 已提交
2001
    int direct=1;
2002
    
2003
    if(pic_arg){
2004 2005 2006 2007
        pts= pic_arg->pts;
        pic_arg->display_picture_number= s->input_picture_number++;

        if(pts != AV_NOPTS_VALUE){ 
2008
            if(s->user_specified_pts != AV_NOPTS_VALUE){
2009
                int64_t time= av_rescale(pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE);
2010 2011 2012
                int64_t last= av_rescale(s->user_specified_pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE);
            
                if(time <= last){            
2013
                    av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%Ld, last=%Ld\n", pts, s->user_specified_pts);
2014 2015 2016
                    return -1;
                }
            }
2017
            s->user_specified_pts= pts;
2018 2019 2020
        }else{
            if(s->user_specified_pts != AV_NOPTS_VALUE){
                s->user_specified_pts= 
2021 2022
                pts= s->user_specified_pts + AV_TIME_BASE*(int64_t)s->avctx->frame_rate_base / s->avctx->frame_rate;
                av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pts);
2023
            }else{
2024
                pts= av_rescale(pic_arg->display_picture_number*(int64_t)s->avctx->frame_rate_base, AV_TIME_BASE, s->avctx->frame_rate);
2025 2026 2027 2028
            }
        }
    }

2029
  if(pic_arg){
M
Michael Niedermayer 已提交
2030 2031 2032 2033 2034
    if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
    if(pic_arg->linesize[0] != s->linesize) direct=0;
    if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
    if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
  
2035
//    av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
M
cleanup  
Michael Niedermayer 已提交
2036
    
M
Michael Niedermayer 已提交
2037
    if(direct){
M
Michael Niedermayer 已提交
2038
        i= ff_find_unused_picture(s, 1);
M
cleanup  
Michael Niedermayer 已提交
2039

M
Michael Niedermayer 已提交
2040
        pic= (AVFrame*)&s->picture[i];
M
Michael Niedermayer 已提交
2041
        pic->reference= 3;
M
cleanup  
Michael Niedermayer 已提交
2042
    
M
Michael Niedermayer 已提交
2043 2044 2045 2046 2047 2048
        for(i=0; i<4; i++){
            pic->data[i]= pic_arg->data[i];
            pic->linesize[i]= pic_arg->linesize[i];
        }
        alloc_picture(s, (Picture*)pic, 1);
    }else{
2049
        int offset= 16;
M
Michael Niedermayer 已提交
2050
        i= ff_find_unused_picture(s, 0);
M
cleanup  
Michael Niedermayer 已提交
2051

M
Michael Niedermayer 已提交
2052
        pic= (AVFrame*)&s->picture[i];
M
Michael Niedermayer 已提交
2053
        pic->reference= 3;
M
cleanup  
Michael Niedermayer 已提交
2054

M
Michael Niedermayer 已提交
2055 2056
        alloc_picture(s, (Picture*)pic, 0);

2057 2058 2059
        if(   pic->data[0] + offset == pic_arg->data[0] 
           && pic->data[1] + offset == pic_arg->data[1]
           && pic->data[2] + offset == pic_arg->data[2]){
M
cleanup  
Michael Niedermayer 已提交
2060
       // empty
M
Michael Niedermayer 已提交
2061 2062 2063
        }else{
            int h_chroma_shift, v_chroma_shift;
            avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
M
cleanup  
Michael Niedermayer 已提交
2064
        
M
Michael Niedermayer 已提交
2065 2066 2067 2068 2069 2070 2071 2072
            for(i=0; i<3; i++){
                int src_stride= pic_arg->linesize[i];
                int dst_stride= i ? s->uvlinesize : s->linesize;
                int h_shift= i ? h_chroma_shift : 0;
                int v_shift= i ? v_chroma_shift : 0;
                int w= s->width >>h_shift;
                int h= s->height>>v_shift;
                uint8_t *src= pic_arg->data[i];
2073
                uint8_t *dst= pic->data[i] + offset;
M
cleanup  
Michael Niedermayer 已提交
2074
            
M
Michael Niedermayer 已提交
2075 2076 2077 2078 2079 2080 2081 2082
                if(src_stride==dst_stride)
                    memcpy(dst, src, src_stride*h);
                else{
                    while(h--){
                        memcpy(dst, src, w);
                        dst += dst_stride;
                        src += src_stride;
                    }
M
cleanup  
Michael Niedermayer 已提交
2083
                }
2084
            }
M
cleanup  
Michael Niedermayer 已提交
2085 2086
        }
    }
2087
    copy_picture_attributes(s, pic, pic_arg);
2088
    pic->pts= pts; //we set this here to avoid modifiying pic_arg
2089
  }
2090
  
M
Michael Niedermayer 已提交
2091 2092 2093 2094 2095
    /* shift buffer entries */
    for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
        s->input_picture[i-1]= s->input_picture[i];
        
    s->input_picture[encoding_delay]= (Picture*)pic;
M
cleanup  
Michael Niedermayer 已提交
2096 2097 2098

    return 0;
}
2099

M
Michael Niedermayer 已提交
2100 2101 2102
static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
    int x, y, plane;
    int score=0;
2103
    int64_t score64=0;
M
Michael Niedermayer 已提交
2104 2105 2106 2107 2108 2109

    for(plane=0; plane<3; plane++){
        const int stride= p->linesize[plane];
        const int bw= plane ? 1 : 2;
        for(y=0; y<s->mb_height*bw; y++){
            for(x=0; x<s->mb_width*bw; x++){
2110
                int v= s->dsp.frame_skip_cmp[1](s, p->data[plane] + 8*(x + y*stride), ref->data[plane] + 8*(x + y*stride), stride, 8);
M
Michael Niedermayer 已提交
2111
                
2112 2113 2114 2115 2116 2117 2118
                switch(s->avctx->frame_skip_exp){
                    case 0: score= FFMAX(score, v); break;
                    case 1: score+= ABS(v);break;
                    case 2: score+= v*v;break;
                    case 3: score64+= ABS(v*v*(int64_t)v);break;
                    case 4: score64+= v*v*(int64_t)(v*v);break;
                }
M
Michael Niedermayer 已提交
2119 2120 2121
            }
        }
    }
2122 2123
    
    if(score) score64= score;
M
Michael Niedermayer 已提交
2124

2125
    if(score64 < s->avctx->frame_skip_threshold)
M
Michael Niedermayer 已提交
2126
        return 1;
2127
    if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
M
Michael Niedermayer 已提交
2128 2129 2130 2131
        return 1;
    return 0;
}

M
cleanup  
Michael Niedermayer 已提交
2132 2133
static void select_input_picture(MpegEncContext *s){
    int i;
M
Michael Niedermayer 已提交
2134

M
cleanup  
Michael Niedermayer 已提交
2135 2136 2137 2138 2139 2140
    for(i=1; i<MAX_PICTURE_COUNT; i++)
        s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
    s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;

    /* set next picture types & ordering */
    if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
M
Michael Niedermayer 已提交
2141
        if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
M
Michael Niedermayer 已提交
2142 2143
            s->reordered_input_picture[0]= s->input_picture[0];
            s->reordered_input_picture[0]->pict_type= I_TYPE;
M
Michael Niedermayer 已提交
2144
            s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
M
Michael Niedermayer 已提交
2145 2146
        }else{
            int b_frames;
M
Michael Niedermayer 已提交
2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158

            if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
                if(skip_check(s, s->input_picture[0], s->next_picture_ptr)){
//av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
                
                    if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
                        for(i=0; i<4; i++)
                            s->input_picture[0]->data[i]= NULL;
                        s->input_picture[0]->type= 0;            
                    }else{
                        assert(   s->input_picture[0]->type==FF_BUFFER_TYPE_USER 
                               || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
M
Michael Niedermayer 已提交
2159
            
M
Michael Niedermayer 已提交
2160 2161 2162 2163 2164 2165 2166
                        s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
                    }

                    goto no_output_pic;
                }
            }

M
Michael Niedermayer 已提交
2167 2168 2169
            if(s->flags&CODEC_FLAG_PASS2){
                for(i=0; i<s->max_b_frames+1; i++){
                    int pict_num= s->input_picture[0]->display_picture_number + i;
2170

2171 2172
                    if(pict_num >= s->rc_context.num_entries) 
                        break;
2173
                    if(!s->input_picture[i]){
2174
                        s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2175 2176
                        break;
                    }
2177 2178 2179

                    s->input_picture[i]->pict_type= 
                        s->rc_context.entry[pict_num].new_pict_type;
M
Michael Niedermayer 已提交
2180 2181
                }
            }
M
Michael Niedermayer 已提交
2182

2183
            if(s->avctx->b_frame_strategy==0){
M
Michael Niedermayer 已提交
2184
                b_frames= s->max_b_frames;
2185
                while(b_frames && !s->input_picture[b_frames]) b_frames--;
M
cleanup  
Michael Niedermayer 已提交
2186
            }else if(s->avctx->b_frame_strategy==1){
M
Michael Niedermayer 已提交
2187
                for(i=1; i<s->max_b_frames+1; i++){
2188
                    if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
M
Michael Niedermayer 已提交
2189
                        s->input_picture[i]->b_frame_score= 
M
Michael Niedermayer 已提交
2190 2191
                            get_intra_count(s, s->input_picture[i  ]->data[0], 
                                               s->input_picture[i-1]->data[0], s->linesize) + 1;
M
Michael Niedermayer 已提交
2192 2193 2194
                    }
                }
                for(i=0; i<s->max_b_frames; i++){
2195
                    if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
M
Michael Niedermayer 已提交
2196 2197 2198
                }
                                
                b_frames= FFMAX(0, i-1);
2199
                
M
Michael Niedermayer 已提交
2200 2201 2202 2203 2204
                /* reset scores */
                for(i=0; i<b_frames+1; i++){
                    s->input_picture[i]->b_frame_score=0;
                }
            }else{
2205
                av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
M
Michael Niedermayer 已提交
2206
                b_frames=0;
2207
            }
M
Michael Niedermayer 已提交
2208 2209 2210 2211

            emms_c();
//static int b_count=0;
//b_count+= b_frames;
2212
//av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2213 2214 2215 2216 2217 2218 2219 2220 2221 2222

            for(i= b_frames - 1; i>=0; i--){
                int type= s->input_picture[i]->pict_type;
                if(type && type != B_TYPE)
                    b_frames= i;
            }
            if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
                av_log(s->avctx, AV_LOG_ERROR, "warning, too many bframes in a row\n");
            }

2223
            if(s->picture_in_gop_number + b_frames >= s->gop_size){
2224 2225 2226
              if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
                    b_frames= s->gop_size - s->picture_in_gop_number - 1;
              }else{
2227 2228 2229
                if(s->flags & CODEC_FLAG_CLOSED_GOP)
                    b_frames=0;
                s->input_picture[b_frames]->pict_type= I_TYPE;
2230
              }
2231 2232 2233 2234 2235 2236 2237
            }
            
            if(   (s->flags & CODEC_FLAG_CLOSED_GOP)
               && b_frames
               && s->input_picture[b_frames]->pict_type== I_TYPE)
                b_frames--;

M
Michael Niedermayer 已提交
2238
            s->reordered_input_picture[0]= s->input_picture[b_frames];
2239
            if(s->reordered_input_picture[0]->pict_type != I_TYPE)
M
Michael Niedermayer 已提交
2240
                s->reordered_input_picture[0]->pict_type= P_TYPE;
M
Michael Niedermayer 已提交
2241
            s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
M
Michael Niedermayer 已提交
2242 2243 2244
            for(i=0; i<b_frames; i++){
                s->reordered_input_picture[i+1]= s->input_picture[i];
                s->reordered_input_picture[i+1]->pict_type= B_TYPE;
M
Michael Niedermayer 已提交
2245
                s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2246 2247 2248
            }
        }
    }
M
Michael Niedermayer 已提交
2249
no_output_pic:
M
cleanup  
Michael Niedermayer 已提交
2250
    if(s->reordered_input_picture[0]){
M
Michael Niedermayer 已提交
2251
        s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
M
Michael Niedermayer 已提交
2252

2253
        copy_picture(&s->new_picture, s->reordered_input_picture[0]);
M
Michael Niedermayer 已提交
2254 2255

        if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
M
Michael Niedermayer 已提交
2256 2257
            // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
        
M
Michael Niedermayer 已提交
2258
            int i= ff_find_unused_picture(s, 0);
M
Michael Niedermayer 已提交
2259 2260 2261 2262 2263 2264 2265
            Picture *pic= &s->picture[i];

            /* mark us unused / free shared pic */
            for(i=0; i<4; i++)
                s->reordered_input_picture[0]->data[i]= NULL;
            s->reordered_input_picture[0]->type= 0;
            
2266
            pic->reference              = s->reordered_input_picture[0]->reference;
M
Michael Niedermayer 已提交
2267 2268 2269
            
            alloc_picture(s, pic, 0);

2270 2271
            copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);

M
Michael Niedermayer 已提交
2272
            s->current_picture_ptr= pic;
M
Michael Niedermayer 已提交
2273
        }else{
M
Michael Niedermayer 已提交
2274 2275
            // input is not a shared pix -> reuse buffer for current_pix

M
Michael Niedermayer 已提交
2276 2277 2278
            assert(   s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER 
                   || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
            
M
Michael Niedermayer 已提交
2279
            s->current_picture_ptr= s->reordered_input_picture[0];
M
Michael Niedermayer 已提交
2280
            for(i=0; i<4; i++){
2281
                s->new_picture.data[i]+=16;
M
Michael Niedermayer 已提交
2282
            }
M
cleanup  
Michael Niedermayer 已提交
2283
        }
2284
        copy_picture(&s->current_picture, s->current_picture_ptr);
M
cleanup  
Michael Niedermayer 已提交
2285 2286 2287 2288 2289
    
        s->picture_number= s->new_picture.display_picture_number;
//printf("dpn:%d\n", s->picture_number);
    }else{
       memset(&s->new_picture, 0, sizeof(Picture));
2290 2291 2292
    }
}

F
Fabrice Bellard 已提交
2293 2294 2295 2296
int MPV_encode_picture(AVCodecContext *avctx,
                       unsigned char *buf, int buf_size, void *data)
{
    MpegEncContext *s = avctx->priv_data;
M
Michael Niedermayer 已提交
2297
    AVFrame *pic_arg = data;
2298
    int i, stuffing_count;
F
Fabrice Bellard 已提交
2299

M
Michael Niedermayer 已提交
2300
    if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUVJ420P){
2301
        av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
M
Michael Niedermayer 已提交
2302 2303 2304
        return -1;
    }
    
2305
    for(i=0; i<avctx->thread_count; i++){
M
Michael Niedermayer 已提交
2306 2307
        int start_y= s->thread_context[i]->start_mb_y;
        int   end_y= s->thread_context[i]->  end_mb_y;
2308
        int h= s->mb_height;
M
Michael Niedermayer 已提交
2309 2310
        uint8_t *start= buf + buf_size*start_y/h;
        uint8_t *end  = buf + buf_size*  end_y/h;
2311 2312 2313

        init_put_bits(&s->thread_context[i]->pb, start, end - start);
    }
F
Fabrice Bellard 已提交
2314

M
cleanup  
Michael Niedermayer 已提交
2315
    s->picture_in_gop_number++;
F
Fabrice Bellard 已提交
2316

2317 2318
    if(load_input_picture(s, pic_arg) < 0)
        return -1;
2319
    
M
cleanup  
Michael Niedermayer 已提交
2320
    select_input_picture(s);
2321 2322
    
    /* output? */
M
cleanup  
Michael Niedermayer 已提交
2323 2324 2325 2326
    if(s->new_picture.data[0]){
        s->pict_type= s->new_picture.pict_type;
//emms_c();
//printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2327
        MPV_frame_start(s, avctx);
2328 2329

        encode_picture(s, s->picture_number);
2330
        
J
Juanjo 已提交
2331
        avctx->real_pict_num  = s->picture_number;
2332 2333 2334 2335 2336 2337
        avctx->header_bits = s->header_bits;
        avctx->mv_bits     = s->mv_bits;
        avctx->misc_bits   = s->misc_bits;
        avctx->i_tex_bits  = s->i_tex_bits;
        avctx->p_tex_bits  = s->p_tex_bits;
        avctx->i_count     = s->i_count;
2338
        avctx->p_count     = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2339 2340 2341 2342 2343 2344
        avctx->skip_count  = s->skip_count;

        MPV_frame_end(s);

        if (s->out_format == FMT_MJPEG)
            mjpeg_picture_trailer(s);
2345 2346 2347
        
        if(s->flags&CODEC_FLAG_PASS1)
            ff_write_pass1_stats(s);
M
Michael Niedermayer 已提交
2348 2349 2350 2351

        for(i=0; i<4; i++){
            avctx->error[i] += s->current_picture_ptr->error[i];
        }
2352

2353 2354
        if(s->flags&CODEC_FLAG_PASS1)
            assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2355
        flush_put_bits(&s->pb);
2356
        s->frame_bits  = put_bits_count(&s->pb);
M
Michael Niedermayer 已提交
2357

M
Michael Niedermayer 已提交
2358 2359
        stuffing_count= ff_vbv_update(s, s->frame_bits);
        if(stuffing_count){
2360 2361 2362 2363 2364
            if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
                av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
                return -1;
            }

M
Michael Niedermayer 已提交
2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383
            switch(s->codec_id){
            case CODEC_ID_MPEG1VIDEO:
            case CODEC_ID_MPEG2VIDEO:
                while(stuffing_count--){
                    put_bits(&s->pb, 8, 0);
                }
            break;
            case CODEC_ID_MPEG4:
                put_bits(&s->pb, 16, 0);
                put_bits(&s->pb, 16, 0x1C3);
                stuffing_count -= 4;
                while(stuffing_count--){
                    put_bits(&s->pb, 8, 0xFF);
                }
            break;
            default:
                av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
            }
            flush_put_bits(&s->pb);
2384
            s->frame_bits  = put_bits_count(&s->pb);
M
Michael Niedermayer 已提交
2385
        }
M
Michael Niedermayer 已提交
2386

M
Michael Niedermayer 已提交
2387
        /* update mpeg1/2 vbv_delay for CBR */    
2388 2389
        if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
           && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
M
Michael Niedermayer 已提交
2390
            int vbv_delay;
M
Michael Niedermayer 已提交
2391

M
Michael Niedermayer 已提交
2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407
            assert(s->repeat_first_field==0);
            
            vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
            assert(vbv_delay < 0xFFFF);

            s->vbv_delay_ptr[0] &= 0xF8;
            s->vbv_delay_ptr[0] |= vbv_delay>>13;
            s->vbv_delay_ptr[1]  = vbv_delay>>5;
            s->vbv_delay_ptr[2] &= 0x07;
            s->vbv_delay_ptr[2] |= vbv_delay<<3;
        }
        s->total_bits += s->frame_bits;
        avctx->frame_bits  = s->frame_bits;
    }else{
        assert((pbBufPtr(&s->pb) == s->pb.buf));
        s->frame_bits=0;
M
Michael Niedermayer 已提交
2408
    }
M
Michael Niedermayer 已提交
2409
    assert((s->frame_bits&7)==0);
2410
    
2411
    return s->frame_bits/8;
F
Fabrice Bellard 已提交
2412 2413
}

2414 2415
#endif //CONFIG_ENCODERS

M
Michael Niedermayer 已提交
2416
static inline void gmc1_motion(MpegEncContext *s,
2417
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2418
                               uint8_t **ref_picture)
M
Michael Niedermayer 已提交
2419
{
2420
    uint8_t *ptr;
M
Michael Niedermayer 已提交
2421
    int offset, src_x, src_y, linesize, uvlinesize;
M
Michael Niedermayer 已提交
2422
    int motion_x, motion_y;
M
Michael Niedermayer 已提交
2423
    int emu=0;
M
Michael Niedermayer 已提交
2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436

    motion_x= s->sprite_offset[0][0];
    motion_y= s->sprite_offset[0][1];
    src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
    src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
    motion_x<<=(3-s->sprite_warping_accuracy);
    motion_y<<=(3-s->sprite_warping_accuracy);
    src_x = clip(src_x, -16, s->width);
    if (src_x == s->width)
        motion_x =0;
    src_y = clip(src_y, -16, s->height);
    if (src_y == s->height)
        motion_y =0;
2437

M
Michael Niedermayer 已提交
2438
    linesize = s->linesize;
M
Michael Niedermayer 已提交
2439
    uvlinesize = s->uvlinesize;
2440
    
2441
    ptr = ref_picture[0] + (src_y * linesize) + src_x;
M
Michael Niedermayer 已提交
2442

M
Michael Niedermayer 已提交
2443
    if(s->flags&CODEC_FLAG_EMU_EDGE){
2444 2445
        if(   (unsigned)src_x >= s->h_edge_pos - 17
           || (unsigned)src_y >= s->v_edge_pos - 17){
2446
            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
M
Michael Niedermayer 已提交
2447 2448 2449
            ptr= s->edge_emu_buffer;
        }
    }
2450 2451
    
    if((motion_x|motion_y)&7){
2452 2453
        s->dsp.gmc1(dest_y  , ptr  , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
        s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2454 2455 2456 2457 2458
    }else{
        int dxy;
        
        dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
        if (s->no_rounding){
2459
	    s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2460
        }else{
2461 2462
            s->dsp.put_pixels_tab       [0][dxy](dest_y, ptr, linesize, 16);
        }
2463 2464 2465
    }
    
    if(s->flags&CODEC_FLAG_GRAY) return;
M
Michael Niedermayer 已提交
2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479

    motion_x= s->sprite_offset[1][0];
    motion_y= s->sprite_offset[1][1];
    src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
    src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
    motion_x<<=(3-s->sprite_warping_accuracy);
    motion_y<<=(3-s->sprite_warping_accuracy);
    src_x = clip(src_x, -8, s->width>>1);
    if (src_x == s->width>>1)
        motion_x =0;
    src_y = clip(src_y, -8, s->height>>1);
    if (src_y == s->height>>1)
        motion_y =0;

2480
    offset = (src_y * uvlinesize) + src_x;
M
Michael Niedermayer 已提交
2481
    ptr = ref_picture[1] + offset;
2482
    if(s->flags&CODEC_FLAG_EMU_EDGE){
2483 2484
        if(   (unsigned)src_x >= (s->h_edge_pos>>1) - 9
           || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2485
            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2486 2487 2488
            ptr= s->edge_emu_buffer;
            emu=1;
        }
M
Michael Niedermayer 已提交
2489
    }
2490
    s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
M
Michael Niedermayer 已提交
2491
    
M
Michael Niedermayer 已提交
2492
    ptr = ref_picture[2] + offset;
M
Michael Niedermayer 已提交
2493
    if(emu){
2494
        ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
M
Michael Niedermayer 已提交
2495 2496
        ptr= s->edge_emu_buffer;
    }
2497
    s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
M
Michael Niedermayer 已提交
2498 2499 2500 2501
    
    return;
}

2502
static inline void gmc_motion(MpegEncContext *s,
2503
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2504
                               uint8_t **ref_picture)
2505
{
2506
    uint8_t *ptr;
2507 2508 2509 2510 2511 2512 2513
    int linesize, uvlinesize;
    const int a= s->sprite_warping_accuracy;
    int ox, oy;

    linesize = s->linesize;
    uvlinesize = s->uvlinesize;

2514
    ptr = ref_picture[0];
2515 2516 2517 2518

    ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
    oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;

2519
    s->dsp.gmc(dest_y, ptr, linesize, 16,
2520 2521 2522 2523 2524 2525
           ox, 
           oy, 
           s->sprite_delta[0][0], s->sprite_delta[0][1],
           s->sprite_delta[1][0], s->sprite_delta[1][1], 
           a+1, (1<<(2*a+1)) - s->no_rounding,
           s->h_edge_pos, s->v_edge_pos);
2526
    s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538
           ox + s->sprite_delta[0][0]*8, 
           oy + s->sprite_delta[1][0]*8, 
           s->sprite_delta[0][0], s->sprite_delta[0][1],
           s->sprite_delta[1][0], s->sprite_delta[1][1], 
           a+1, (1<<(2*a+1)) - s->no_rounding,
           s->h_edge_pos, s->v_edge_pos);

    if(s->flags&CODEC_FLAG_GRAY) return;

    ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
    oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;

2539
    ptr = ref_picture[1];
2540
    s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2541 2542 2543 2544 2545 2546 2547
           ox, 
           oy, 
           s->sprite_delta[0][0], s->sprite_delta[0][1],
           s->sprite_delta[1][0], s->sprite_delta[1][1], 
           a+1, (1<<(2*a+1)) - s->no_rounding,
           s->h_edge_pos>>1, s->v_edge_pos>>1);
    
2548
    ptr = ref_picture[2];
2549
    s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2550 2551 2552 2553 2554 2555 2556 2557
           ox, 
           oy, 
           s->sprite_delta[0][0], s->sprite_delta[0][1],
           s->sprite_delta[1][0], s->sprite_delta[1][1], 
           a+1, (1<<(2*a+1)) - s->no_rounding,
           s->h_edge_pos>>1, s->v_edge_pos>>1);
}

2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570
/**
 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
 * @param buf destination buffer
 * @param src source buffer
 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
 * @param block_w width of block
 * @param block_h height of block
 * @param src_x x coordinate of the top left sample of the block in the source buffer
 * @param src_y y coordinate of the top left sample of the block in the source buffer
 * @param w width of the source buffer
 * @param h height of the source buffer
 */
void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h, 
2571 2572 2573
                                    int src_x, int src_y, int w, int h){
    int x, y;
    int start_y, start_x, end_y, end_x;
2574

2575 2576 2577
    if(src_y>= h){
        src+= (h-1-src_y)*linesize;
        src_y=h-1;
M
Michael Niedermayer 已提交
2578 2579 2580
    }else if(src_y<=-block_h){
        src+= (1-block_h-src_y)*linesize;
        src_y=1-block_h;
2581 2582 2583 2584
    }
    if(src_x>= w){
        src+= (w-1-src_x);
        src_x=w-1;
M
Michael Niedermayer 已提交
2585 2586 2587
    }else if(src_x<=-block_w){
        src+= (1-block_w-src_x);
        src_x=1-block_w;
2588 2589
    }

M
Michael Niedermayer 已提交
2590 2591 2592 2593
    start_y= FFMAX(0, -src_y);
    start_x= FFMAX(0, -src_x);
    end_y= FFMIN(block_h, h-src_y);
    end_x= FFMIN(block_w, w-src_x);
M
Michael Niedermayer 已提交
2594

2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628
    // copy existing part
    for(y=start_y; y<end_y; y++){
        for(x=start_x; x<end_x; x++){
            buf[x + y*linesize]= src[x + y*linesize];
        }
    }

    //top
    for(y=0; y<start_y; y++){
        for(x=start_x; x<end_x; x++){
            buf[x + y*linesize]= buf[x + start_y*linesize];
        }
    }

    //bottom
    for(y=end_y; y<block_h; y++){
        for(x=start_x; x<end_x; x++){
            buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
        }
    }
                                    
    for(y=0; y<block_h; y++){
       //left
        for(x=0; x<start_x; x++){
            buf[x + y*linesize]= buf[start_x + y*linesize];
        }
       
       //right
        for(x=end_x; x<block_w; x++){
            buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
        }
    }
}

M
Michael Niedermayer 已提交
2629
static inline int hpel_motion(MpegEncContext *s, 
2630 2631
                                  uint8_t *dest, uint8_t *src,
                                  int field_based, int field_select,
M
Michael Niedermayer 已提交
2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656
                                  int src_x, int src_y,
                                  int width, int height, int stride,
                                  int h_edge_pos, int v_edge_pos,
                                  int w, int h, op_pixels_func *pix_op,
                                  int motion_x, int motion_y)
{
    int dxy;
    int emu=0;

    dxy = ((motion_y & 1) << 1) | (motion_x & 1);
    src_x += motion_x >> 1;
    src_y += motion_y >> 1;
                
    /* WARNING: do no forget half pels */
    src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
    if (src_x == width)
        dxy &= ~1;
    src_y = clip(src_y, -16, height);
    if (src_y == height)
        dxy &= ~2;
    src += src_y * stride + src_x;

    if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
        if(   (unsigned)src_x > h_edge_pos - (motion_x&1) - w
           || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2657 2658
            ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
                             src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
M
Michael Niedermayer 已提交
2659 2660 2661 2662
            src= s->edge_emu_buffer;
            emu=1;
        }
    }
2663 2664
    if(field_select)
        src += s->linesize;
M
Michael Niedermayer 已提交
2665 2666 2667
    pix_op[dxy](dest, src, stride, h);
    return emu;
}
2668

M
Michael Niedermayer 已提交
2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710
static inline int hpel_motion_lowres(MpegEncContext *s, 
                                  uint8_t *dest, uint8_t *src,
                                  int field_based, int field_select,
                                  int src_x, int src_y,
                                  int width, int height, int stride,
                                  int h_edge_pos, int v_edge_pos,
                                  int w, int h, h264_chroma_mc_func *pix_op,
                                  int motion_x, int motion_y)
{
    const int lowres= s->avctx->lowres;
    const int s_mask= (2<<lowres)-1;
    int emu=0;
    int sx, sy;

    if(s->quarter_sample){
        motion_x/=2;
        motion_y/=2;
    }

    sx= motion_x & s_mask;
    sy= motion_y & s_mask;
    src_x += motion_x >> (lowres+1);
    src_y += motion_y >> (lowres+1);
                
    src += src_y * stride + src_x;

    if(   (unsigned)src_x > h_edge_pos                 - (!!sx) - w
       || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
        ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
                            src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
        src= s->edge_emu_buffer;
        emu=1;
    }

    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    if(field_select)
        src += s->linesize;
    pix_op[lowres](dest, src, stride, h, sx, sy);
    return emu;
}

F
Fabrice Bellard 已提交
2711
/* apply one mpeg motion vector to the three components */
2712
static always_inline void mpeg_motion(MpegEncContext *s,
2713
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2714 2715
                               int field_based, int bottom_field, int field_select,
                               uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
F
Fabrice Bellard 已提交
2716 2717
                               int motion_x, int motion_y, int h)
{
2718 2719
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
    int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2720
    
M
Michael Niedermayer 已提交
2721
#if 0    
M
Michael Niedermayer 已提交
2722 2723 2724 2725 2726
if(s->quarter_sample)
{
    motion_x>>=1;
    motion_y>>=1;
}
M
Michael Niedermayer 已提交
2727
#endif
M
Michael Niedermayer 已提交
2728

2729
    v_edge_pos = s->v_edge_pos >> field_based;
2730
    linesize   = s->current_picture.linesize[0] << field_based;
M
Michael Niedermayer 已提交
2731
    uvlinesize = s->current_picture.linesize[1] << field_based;
2732

2733 2734
    dxy = ((motion_y & 1) << 1) | (motion_x & 1);
    src_x = s->mb_x* 16               + (motion_x >> 1);
2735
    src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
M
Michael Niedermayer 已提交
2736

F
Fabrice Bellard 已提交
2737
    if (s->out_format == FMT_H263) {
2738 2739 2740 2741 2742
        if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
            mx = (motion_x>>1)|(motion_x&1);
            my = motion_y >>1;
            uvdxy = ((my & 1) << 1) | (mx & 1);
            uvsrc_x = s->mb_x* 8               + (mx >> 1);
2743
            uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2744 2745 2746 2747 2748
        }else{
            uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
            uvsrc_x = src_x>>1;
            uvsrc_y = src_y>>1;
        }
2749 2750 2751 2752 2753 2754
    }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
        mx = motion_x / 4;
        my = motion_y / 4;
        uvdxy = 0;
        uvsrc_x = s->mb_x*8 + mx;
        uvsrc_y = s->mb_y*8 + my;
F
Fabrice Bellard 已提交
2755
    } else {
2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775
        if(s->chroma_y_shift){
            mx = motion_x / 2;
            my = motion_y / 2;
            uvdxy = ((my & 1) << 1) | (mx & 1);
            uvsrc_x = s->mb_x* 8               + (mx >> 1);
            uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
        } else {
            if(s->chroma_x_shift){
            //Chroma422
                mx = motion_x / 2;
                uvdxy = ((motion_y & 1) << 1) | (mx & 1);
                uvsrc_x = s->mb_x* 8           + (mx >> 1);
                uvsrc_y = src_y;
            } else {
            //Chroma444
                uvdxy = dxy;
                uvsrc_x = src_x;
                uvsrc_y = src_y;
            }
        }
F
Fabrice Bellard 已提交
2776
    }
2777 2778 2779 2780 2781 2782 2783

    ptr_y  = ref_picture[0] + src_y * linesize + src_x;
    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;

    if(   (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
       || (unsigned)src_y >    v_edge_pos - (motion_y&1) - h){
2784 2785 2786 2787 2788
            if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
               s->codec_id == CODEC_ID_MPEG1VIDEO){
                av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
                return ;
            }
2789 2790 2791 2792
            ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
                             src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
            ptr_y = s->edge_emu_buffer;
            if(!(s->flags&CODEC_FLAG_GRAY)){
M
10l  
Michael Niedermayer 已提交
2793
                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2794 2795 2796 2797 2798 2799 2800
                ff_emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based, 
                                 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
                ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based, 
                                 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
                ptr_cb= uvbuf;
                ptr_cr= uvbuf+16;
            }
2801 2802
    }

2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817
    if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
        dest_y += s->linesize;
        dest_cb+= s->uvlinesize;
        dest_cr+= s->uvlinesize;
    }

    if(field_select){
        ptr_y += s->linesize;
        ptr_cb+= s->uvlinesize;
        ptr_cr+= s->uvlinesize;
    }

    pix_op[0][dxy](dest_y, ptr_y, linesize, h);
    
    if(!(s->flags&CODEC_FLAG_GRAY)){
2818 2819
        pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
        pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2820
    }
M
Michael Niedermayer 已提交
2821 2822 2823
    if(s->out_format == FMT_H261){
        ff_h261_loop_filter(s);
    }
F
Fabrice Bellard 已提交
2824
}
M
Michael Niedermayer 已提交
2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842

/* apply one mpeg motion vector to the three components */
static always_inline void mpeg_motion_lowres(MpegEncContext *s,
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
                               int field_based, int bottom_field, int field_select,
                               uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
                               int motion_x, int motion_y, int h)
{
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
    const int s_mask= (2<<lowres)-1;
    const int h_edge_pos = s->h_edge_pos >> lowres;
    const int v_edge_pos = s->v_edge_pos >> lowres;
    linesize   = s->current_picture.linesize[0] << field_based;
    uvlinesize = s->current_picture.linesize[1] << field_based;

2843 2844 2845 2846 2847 2848 2849 2850 2851
    if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
        motion_x/=2;
        motion_y/=2;
    }
    
    if(field_based){
        motion_y += (bottom_field - field_select)*((1<<lowres)-1);
    }

M
Michael Niedermayer 已提交
2852 2853 2854
    sx= motion_x & s_mask;
    sy= motion_y & s_mask;
    src_x = s->mb_x*2*block_s               + (motion_x >> (lowres+1));
2855
    src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
M
Michael Niedermayer 已提交
2856 2857
    
    if (s->out_format == FMT_H263) {
M
Michael Niedermayer 已提交
2858 2859
        uvsx = ((motion_x>>1) & s_mask) | (sx&1);
        uvsy = ((motion_y>>1) & s_mask) | (sy&1);
M
Michael Niedermayer 已提交
2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874
        uvsrc_x = src_x>>1;
        uvsrc_y = src_y>>1;
    }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
        mx = motion_x / 4;
        my = motion_y / 4;
        uvsx = (2*mx) & s_mask;
        uvsy = (2*my) & s_mask;
        uvsrc_x = s->mb_x*block_s               + (mx >> lowres);
        uvsrc_y = s->mb_y*block_s               + (my >> lowres);
    } else {
        mx = motion_x / 2;
        my = motion_y / 2;
        uvsx = mx & s_mask;
        uvsy = my & s_mask;
        uvsrc_x = s->mb_x*block_s               + (mx >> (lowres+1));
2875
        uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
M
Michael Niedermayer 已提交
2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897
    }

    ptr_y  = ref_picture[0] + src_y * linesize + src_x;
    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;

    if(   (unsigned)src_x > h_edge_pos                 - (!!sx) - 2*block_s
       || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
            ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
                             src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
            ptr_y = s->edge_emu_buffer;
            if(!(s->flags&CODEC_FLAG_GRAY)){
                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
                ff_emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based, 
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
                ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based, 
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
                ptr_cb= uvbuf;
                ptr_cr= uvbuf+16;
            }
    }

2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909
    if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
        dest_y += s->linesize;
        dest_cb+= s->uvlinesize;
        dest_cr+= s->uvlinesize;
    }

    if(field_select){
        ptr_y += s->linesize;
        ptr_cb+= s->uvlinesize;
        ptr_cr+= s->uvlinesize;
    }

M
Michael Niedermayer 已提交
2910 2911 2912 2913 2914 2915 2916 2917 2918 2919
    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
    
    if(!(s->flags&CODEC_FLAG_GRAY)){
        uvsx <<= 2 - lowres;
        uvsy <<= 2 - lowres;
        pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
        pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
    }
M
Michael Niedermayer 已提交
2920
    //FIXME h261 lowres loop filter
M
Michael Niedermayer 已提交
2921 2922
}

M
Michael Niedermayer 已提交
2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991
//FIXME move to dsputil, avg variant, 16x16 version
static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
    int x;
    uint8_t * const top   = src[1];
    uint8_t * const left  = src[2];
    uint8_t * const mid   = src[0];
    uint8_t * const right = src[3];
    uint8_t * const bottom= src[4];
#define OBMC_FILTER(x, t, l, m, r, b)\
    dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
#define OBMC_FILTER4(x, t, l, m, r, b)\
    OBMC_FILTER(x         , t, l, m, r, b);\
    OBMC_FILTER(x+1       , t, l, m, r, b);\
    OBMC_FILTER(x  +stride, t, l, m, r, b);\
    OBMC_FILTER(x+1+stride, t, l, m, r, b);
    
    x=0;
    OBMC_FILTER (x  , 2, 2, 4, 0, 0);
    OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
    OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
    OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
    OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
    OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
    x+= stride;
    OBMC_FILTER (x  , 1, 2, 5, 0, 0);
    OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
    OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
    OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
    x+= stride;
    OBMC_FILTER4(x  , 1, 2, 5, 0, 0);
    OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
    OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
    OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
    x+= 2*stride;
    OBMC_FILTER4(x  , 0, 2, 5, 0, 1);
    OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
    OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
    OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
    x+= 2*stride;
    OBMC_FILTER (x  , 0, 2, 5, 0, 1);
    OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
    OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
    OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
    OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
    OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
    x+= stride;
    OBMC_FILTER (x  , 0, 2, 4, 0, 2);
    OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
    OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
    OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
}

/* obmc for 1 8x8 luma block */
static inline void obmc_motion(MpegEncContext *s,
                               uint8_t *dest, uint8_t *src,
                               int src_x, int src_y,
                               op_pixels_func *pix_op,
                               int16_t mv[5][2]/* mid top left right bottom*/)
#define MID    0
{
    int i;
    uint8_t *ptr[5];
    
    assert(s->quarter_sample==0);
    
    for(i=0; i<5; i++){
        if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
            ptr[i]= ptr[MID];
        }else{
2992
            ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2993
            hpel_motion(s, ptr[i], src, 0, 0,
M
Michael Niedermayer 已提交
2994 2995 2996 2997 2998 2999 3000 3001 3002 3003
                        src_x, src_y,
                        s->width, s->height, s->linesize,
                        s->h_edge_pos, s->v_edge_pos,
                        8, 8, pix_op,
                        mv[i][0], mv[i][1]);
        }
    }

    put_obmc(dest, ptr, s->linesize);                
}
F
Fabrice Bellard 已提交
3004

M
Michael Niedermayer 已提交
3005
static inline void qpel_motion(MpegEncContext *s,
3006
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3007 3008
                               int field_based, int bottom_field, int field_select,
                               uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
M
Michael Niedermayer 已提交
3009
                               qpel_mc_func (*qpix_op)[16],
M
Michael Niedermayer 已提交
3010 3011
                               int motion_x, int motion_y, int h)
{
3012 3013
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
    int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3014

M
Michael Niedermayer 已提交
3015
    dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3016
    src_x = s->mb_x *  16                 + (motion_x >> 2);
M
Michael Niedermayer 已提交
3017 3018
    src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);

3019
    v_edge_pos = s->v_edge_pos >> field_based;
M
Michael Niedermayer 已提交
3020
    linesize = s->linesize << field_based;
3021
    uvlinesize = s->uvlinesize << field_based;
M
Michael Niedermayer 已提交
3022
    
3023 3024 3025
    if(field_based){
        mx= motion_x/2;
        my= motion_y>>1;
M
Michael Niedermayer 已提交
3026 3027 3028 3029
    }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
        static const int rtab[8]= {0,0,1,1,0,0,0,1};
        mx= (motion_x>>1) + rtab[motion_x&7];
        my= (motion_y>>1) + rtab[motion_y&7];
M
Michael Niedermayer 已提交
3030
    }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3031 3032 3033 3034 3035 3036 3037 3038
        mx= (motion_x>>1)|(motion_x&1);
        my= (motion_y>>1)|(motion_y&1);
    }else{
        mx= motion_x/2;
        my= motion_y/2;
    }
    mx= (mx>>1)|(mx&1);
    my= (my>>1)|(my&1);
M
Michael Niedermayer 已提交
3039

3040
    uvdxy= (mx&1) | ((my&1)<<1);
3041 3042
    mx>>=1;
    my>>=1;
M
Michael Niedermayer 已提交
3043

3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056
    uvsrc_x = s->mb_x *  8                 + mx;
    uvsrc_y = s->mb_y * (8 >> field_based) + my;

    ptr_y  = ref_picture[0] +   src_y *   linesize +   src_x;
    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;

    if(   (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16 
       || (unsigned)src_y >    v_edge_pos - (motion_y&3) - h  ){
        ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based, 
                         src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
        ptr_y= s->edge_emu_buffer;
        if(!(s->flags&CODEC_FLAG_GRAY)){
M
10l  
Michael Niedermayer 已提交
3057
            uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3058 3059 3060 3061 3062 3063 3064 3065
            ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based, 
                             uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
            ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based, 
                             uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
            ptr_cb= uvbuf;
            ptr_cr= uvbuf + 16;
        }
    }
M
Michael Niedermayer 已提交
3066

3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084
    if(!field_based)
        qpix_op[0][dxy](dest_y, ptr_y, linesize);
    else{
        if(bottom_field){
            dest_y += s->linesize;
            dest_cb+= s->uvlinesize;
            dest_cr+= s->uvlinesize;
        }

        if(field_select){
            ptr_y  += s->linesize;
            ptr_cb += s->uvlinesize;
            ptr_cr += s->uvlinesize;
        }
        //damn interlaced mode
        //FIXME boundary mirroring is not exactly correct here
        qpix_op[1][dxy](dest_y  , ptr_y  , linesize);
        qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
M
Michael Niedermayer 已提交
3085
    }
3086 3087 3088
    if(!(s->flags&CODEC_FLAG_GRAY)){
        pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
        pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
M
Michael Niedermayer 已提交
3089
    }
M
Michael Niedermayer 已提交
3090 3091
}

3092 3093 3094 3095 3096 3097 3098 3099
inline int ff_h263_round_chroma(int x){
    if (x >= 0)
        return  (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
    else {
        x = -x;
        return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
    }
}
M
Michael Niedermayer 已提交
3100

M
Michael Niedermayer 已提交
3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149
/**
 * h263 chorma 4mv motion compensation.
 */
static inline void chroma_4mv_motion(MpegEncContext *s,
                                     uint8_t *dest_cb, uint8_t *dest_cr,
                                     uint8_t **ref_picture,
                                     op_pixels_func *pix_op,
                                     int mx, int my){
    int dxy, emu=0, src_x, src_y, offset;
    uint8_t *ptr;
    
    /* In case of 8X8, we construct a single chroma motion vector
       with a special rounding */
    mx= ff_h263_round_chroma(mx);
    my= ff_h263_round_chroma(my);
    
    dxy = ((my & 1) << 1) | (mx & 1);
    mx >>= 1;
    my >>= 1;

    src_x = s->mb_x * 8 + mx;
    src_y = s->mb_y * 8 + my;
    src_x = clip(src_x, -8, s->width/2);
    if (src_x == s->width/2)
        dxy &= ~1;
    src_y = clip(src_y, -8, s->height/2);
    if (src_y == s->height/2)
        dxy &= ~2;
    
    offset = (src_y * (s->uvlinesize)) + src_x;
    ptr = ref_picture[1] + offset;
    if(s->flags&CODEC_FLAG_EMU_EDGE){
        if(   (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
           || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
            ptr= s->edge_emu_buffer;
            emu=1;
        }
    }
    pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);

    ptr = ref_picture[2] + offset;
    if(emu){
        ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
        ptr= s->edge_emu_buffer;
    }
    pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
}

M
Michael Niedermayer 已提交
3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199
static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
                                     uint8_t *dest_cb, uint8_t *dest_cr,
                                     uint8_t **ref_picture,
                                     h264_chroma_mc_func *pix_op,
                                     int mx, int my){
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
    const int s_mask= (2<<lowres)-1;
    const int h_edge_pos = s->h_edge_pos >> (lowres+1);
    const int v_edge_pos = s->v_edge_pos >> (lowres+1);
    int emu=0, src_x, src_y, offset, sx, sy;
    uint8_t *ptr;
    
    if(s->quarter_sample){
        mx/=2;
        my/=2;
    }

    /* In case of 8X8, we construct a single chroma motion vector
       with a special rounding */
    mx= ff_h263_round_chroma(mx);
    my= ff_h263_round_chroma(my);
    
    sx= mx & s_mask;
    sy= my & s_mask;
    src_x = s->mb_x*block_s + (mx >> (lowres+1));
    src_y = s->mb_y*block_s + (my >> (lowres+1));
    
    offset = src_y * s->uvlinesize + src_x;
    ptr = ref_picture[1] + offset;
    if(s->flags&CODEC_FLAG_EMU_EDGE){
        if(   (unsigned)src_x > h_edge_pos - (!!sx) - block_s
           || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
            ptr= s->edge_emu_buffer;
            emu=1;
        }
    }     
    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
          
    ptr = ref_picture[2] + offset;
    if(emu){
        ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
        ptr= s->edge_emu_buffer;
    }
    pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
}

M
doxy  
Michael Niedermayer 已提交
3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211
/**
 * motion compesation of a single macroblock
 * @param s context
 * @param dest_y luma destination pointer
 * @param dest_cb chroma cb/u destination pointer
 * @param dest_cr chroma cr/v destination pointer
 * @param dir direction (0->forward, 1->backward)
 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
 * @param pic_op halfpel motion compensation function (average or put normally)
 * @param pic_op qpel motion compensation function (average or put normally)
 * the motion vectors are taken from s->mv and the MV type from s->mv_type
 */
F
Fabrice Bellard 已提交
3212
static inline void MPV_motion(MpegEncContext *s, 
3213 3214
                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
                              int dir, uint8_t **ref_picture, 
M
Michael Niedermayer 已提交
3215
                              op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
F
Fabrice Bellard 已提交
3216
{
M
Michael Niedermayer 已提交
3217
    int dxy, mx, my, src_x, src_y, motion_x, motion_y;
F
Fabrice Bellard 已提交
3218
    int mb_x, mb_y, i;
3219
    uint8_t *ptr, *dest;
F
Fabrice Bellard 已提交
3220 3221 3222 3223

    mb_x = s->mb_x;
    mb_y = s->mb_y;

3224
    if(s->obmc && s->pict_type != B_TYPE){
M
Michael Niedermayer 已提交
3225 3226
        int16_t mv_cache[4][4][2];
        const int xy= s->mb_x + s->mb_y*s->mb_stride;
3227 3228
        const int mot_stride= s->b8_stride;
        const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
M
Michael Niedermayer 已提交
3229 3230 3231

        assert(!s->mb_skiped);
                
3232 3233 3234
        memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy           ], sizeof(int16_t)*4);
        memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
        memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
M
Michael Niedermayer 已提交
3235 3236 3237 3238

        if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
            memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
        }else{
3239
            memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
M
Michael Niedermayer 已提交
3240 3241 3242 3243 3244 3245
        }

        if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
            *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
            *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
        }else{
3246 3247
            *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
            *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
M
Michael Niedermayer 已提交
3248 3249 3250 3251 3252 3253
        }

        if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
            *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
            *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
        }else{
3254 3255
            *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
            *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
M
Michael Niedermayer 已提交
3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284
        }
        
        mx = 0;
        my = 0;
        for(i=0;i<4;i++) {
            const int x= (i&1)+1;
            const int y= (i>>1)+1;
            int16_t mv[5][2]= {
                {mv_cache[y][x  ][0], mv_cache[y][x  ][1]},
                {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
                {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
                {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
                {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
            //FIXME cleanup
            obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
                        ref_picture[0],
                        mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
                        pix_op[1],
                        mv);

            mx += mv[0][0];
            my += mv[0][1];
        }
        if(!(s->flags&CODEC_FLAG_GRAY))
            chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);

        return;
    }
   
F
Fabrice Bellard 已提交
3285 3286
    switch(s->mv_type) {
    case MV_TYPE_16X16:
M
Michael Niedermayer 已提交
3287
        if(s->mcsel){
3288
            if(s->real_sprite_warping_points==1){
3289 3290
                gmc1_motion(s, dest_y, dest_cb, dest_cr,
                            ref_picture);
3291
            }else{
3292 3293
                gmc_motion(s, dest_y, dest_cb, dest_cr,
                            ref_picture);
3294
            }
M
Michael Niedermayer 已提交
3295
        }else if(s->quarter_sample){
3296 3297 3298
            qpel_motion(s, dest_y, dest_cb, dest_cr, 
                        0, 0, 0,
                        ref_picture, pix_op, qpix_op,
M
Michael Niedermayer 已提交
3299
                        s->mv[dir][0][0], s->mv[dir][0][1], 16);
M
Michael Niedermayer 已提交
3300 3301 3302 3303
        }else if(s->mspel){
            ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
                        ref_picture, pix_op,
                        s->mv[dir][0][0], s->mv[dir][0][1], 16);
M
Michael Niedermayer 已提交
3304 3305
        }else
        {
3306 3307 3308
            mpeg_motion(s, dest_y, dest_cb, dest_cr, 
                        0, 0, 0,
                        ref_picture, pix_op,
M
Michael Niedermayer 已提交
3309 3310
                        s->mv[dir][0][0], s->mv[dir][0][1], 16);
        }           
F
Fabrice Bellard 已提交
3311 3312
        break;
    case MV_TYPE_8X8:
M
Michael Niedermayer 已提交
3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333
        mx = 0;
        my = 0;
        if(s->quarter_sample){
            for(i=0;i<4;i++) {
                motion_x = s->mv[dir][i][0];
                motion_y = s->mv[dir][i][1];

                dxy = ((motion_y & 3) << 2) | (motion_x & 3);
                src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
                src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
                    
                /* WARNING: do no forget half pels */
                src_x = clip(src_x, -16, s->width);
                if (src_x == s->width)
                    dxy &= ~3;
                src_y = clip(src_y, -16, s->height);
                if (src_y == s->height)
                    dxy &= ~12;
                    
                ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
                if(s->flags&CODEC_FLAG_EMU_EDGE){
3334 3335
                    if(   (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8 
                       || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3336
                        ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
M
Michael Niedermayer 已提交
3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347
                        ptr= s->edge_emu_buffer;
                    }
                }
                dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
                qpix_op[1][dxy](dest, ptr, s->linesize);

                mx += s->mv[dir][i][0]/2;
                my += s->mv[dir][i][1]/2;
            }
        }else{
            for(i=0;i<4;i++) {
M
Michael Niedermayer 已提交
3348
                hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3349
                            ref_picture[0], 0, 0,
M
Michael Niedermayer 已提交
3350 3351 3352 3353 3354
                            mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
                            s->width, s->height, s->linesize,
                            s->h_edge_pos, s->v_edge_pos,
                            8, 8, pix_op[1],
                            s->mv[dir][i][0], s->mv[dir][i][1]);
M
Michael Niedermayer 已提交
3355 3356 3357

                mx += s->mv[dir][i][0];
                my += s->mv[dir][i][1];
M
Michael Niedermayer 已提交
3358
            }
F
Fabrice Bellard 已提交
3359
        }
M
Michael Niedermayer 已提交
3360

M
Michael Niedermayer 已提交
3361 3362
        if(!(s->flags&CODEC_FLAG_GRAY))
            chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
F
Fabrice Bellard 已提交
3363 3364 3365
        break;
    case MV_TYPE_FIELD:
        if (s->picture_structure == PICT_FRAME) {
3366
            if(s->quarter_sample){
M
Michael Niedermayer 已提交
3367 3368 3369 3370 3371 3372
                for(i=0; i<2; i++){
                    qpel_motion(s, dest_y, dest_cb, dest_cr,
                                1, i, s->field_select[dir][i],
                                ref_picture, pix_op, qpix_op,
                                s->mv[dir][i][0], s->mv[dir][i][1], 8);
                }
3373 3374
            }else{
                /* top field */       
3375 3376 3377
                mpeg_motion(s, dest_y, dest_cb, dest_cr,
                            1, 0, s->field_select[dir][0],
                            ref_picture, pix_op,
3378 3379
                            s->mv[dir][0][0], s->mv[dir][0][1], 8);
                /* bottom field */
3380 3381 3382
                mpeg_motion(s, dest_y, dest_cb, dest_cr,
                            1, 1, s->field_select[dir][1],
                            ref_picture, pix_op,
3383 3384
                            s->mv[dir][1][0], s->mv[dir][1][1], 8);
            }
F
Fabrice Bellard 已提交
3385
        } else {
3386 3387
            if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
                ref_picture= s->current_picture_ptr->data;
3388
            } 
F
Fabrice Bellard 已提交
3389

3390 3391 3392
            mpeg_motion(s, dest_y, dest_cb, dest_cr,
                        0, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
3393
                        s->mv[dir][0][0], s->mv[dir][0][1], 16);
F
Fabrice Bellard 已提交
3394
        }
3395
        break;
M
Michael Niedermayer 已提交
3396 3397 3398
    case MV_TYPE_16X8:
        for(i=0; i<2; i++){
            uint8_t ** ref2picture;
3399

M
Michael Niedermayer 已提交
3400
            if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3401 3402
                ref2picture= ref_picture;
            }else{
3403
                ref2picture= s->current_picture_ptr->data;
3404 3405
            } 

3406
            mpeg_motion(s, dest_y, dest_cb, dest_cr, 
M
Michael Niedermayer 已提交
3407
                        0, 0, s->field_select[dir][i],
3408
                        ref2picture, pix_op,
M
Michael Niedermayer 已提交
3409 3410 3411
                        s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
                
            dest_y += 16*s->linesize;
3412 3413
            dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
            dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
M
Michael Niedermayer 已提交
3414
        }        
F
Fabrice Bellard 已提交
3415
        break;
3416 3417
    case MV_TYPE_DMV:
        if(s->picture_structure == PICT_FRAME){
M
Michael Niedermayer 已提交
3418 3419 3420 3421 3422 3423 3424 3425 3426 3427
            for(i=0; i<2; i++){
                int j;
                for(j=0; j<2; j++){
                    mpeg_motion(s, dest_y, dest_cb, dest_cr,
                                1, j, j^i,
                                ref_picture, pix_op,
                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
                }
                pix_op = s->dsp.avg_pixels_tab; 
            }
3428
        }else{
M
Michael Niedermayer 已提交
3429 3430 3431 3432 3433
            for(i=0; i<2; i++){
                mpeg_motion(s, dest_y, dest_cb, dest_cr, 
                            0, 0, s->picture_structure != i+1,
                            ref_picture, pix_op,
                            s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3434

M
Michael Niedermayer 已提交
3435 3436
                // after put we make avg of the same block
                pix_op=s->dsp.avg_pixels_tab; 
3437

M
Michael Niedermayer 已提交
3438 3439 3440 3441
                //opposite parity is always in the same frame if this is second field
                if(!s->first_field){
                    ref_picture = s->current_picture_ptr->data;    
                }
3442
            }
3443 3444
        }
    break;
M
Michael Niedermayer 已提交
3445
    default: assert(0);
F
Fabrice Bellard 已提交
3446 3447 3448
    }
}

M
Michael Niedermayer 已提交
3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464
/**
 * motion compesation of a single macroblock
 * @param s context
 * @param dest_y luma destination pointer
 * @param dest_cb chroma cb/u destination pointer
 * @param dest_cr chroma cr/v destination pointer
 * @param dir direction (0->forward, 1->backward)
 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
 * @param pic_op halfpel motion compensation function (average or put normally)
 * the motion vectors are taken from s->mv and the MV type from s->mv_type
 */
static inline void MPV_motion_lowres(MpegEncContext *s, 
                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
                              int dir, uint8_t **ref_picture, 
                              h264_chroma_mc_func *pix_op)
{
M
Michael Niedermayer 已提交
3465
    int mx, my;
3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479
    int mb_x, mb_y, i;
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;    

    mb_x = s->mb_x;
    mb_y = s->mb_y;

    switch(s->mv_type) {
    case MV_TYPE_16X16:
        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, 
                    0, 0, 0,
                    ref_picture, pix_op,
                    s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
        break;
M
Michael Niedermayer 已提交
3480
    case MV_TYPE_8X8:
3481 3482 3483
        mx = 0;
        my = 0;
            for(i=0;i<4;i++) {
M
Michael Niedermayer 已提交
3484
                hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3485
                            ref_picture[0], 0, 0,
M
Michael Niedermayer 已提交
3486
                            (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3487
                            s->width, s->height, s->linesize,
M
Michael Niedermayer 已提交
3488 3489
                            s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
                            block_s, block_s, pix_op,
3490 3491 3492 3493 3494 3495 3496
                            s->mv[dir][i][0], s->mv[dir][i][1]);

                mx += s->mv[dir][i][0];
                my += s->mv[dir][i][1];
            }

        if(!(s->flags&CODEC_FLAG_GRAY))
M
Michael Niedermayer 已提交
3497 3498
            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
        break;
3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572
    case MV_TYPE_FIELD:
        if (s->picture_structure == PICT_FRAME) {
            /* top field */       
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        1, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
                        s->mv[dir][0][0], s->mv[dir][0][1], block_s);
            /* bottom field */
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        1, 1, s->field_select[dir][1],
                        ref_picture, pix_op,
                        s->mv[dir][1][0], s->mv[dir][1][1], block_s);
        } else {
            if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
                ref_picture= s->current_picture_ptr->data;
            } 

            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        0, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
                        s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
        }
        break;
    case MV_TYPE_16X8:
        for(i=0; i<2; i++){
            uint8_t ** ref2picture;

            if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
                ref2picture= ref_picture;
            }else{
                ref2picture= s->current_picture_ptr->data;
            } 

            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, 
                        0, 0, s->field_select[dir][i],
                        ref2picture, pix_op,
                        s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
                
            dest_y += 2*block_s*s->linesize;
            dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
            dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
        }        
        break;
    case MV_TYPE_DMV:
        if(s->picture_structure == PICT_FRAME){
            for(i=0; i<2; i++){
                int j;
                for(j=0; j<2; j++){
                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                                1, j, j^i,
                                ref_picture, pix_op,
                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
                }
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
            }
        }else{
            for(i=0; i<2; i++){
                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr, 
                            0, 0, s->picture_structure != i+1,
                            ref_picture, pix_op,
                            s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);

                // after put we make avg of the same block
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;

                //opposite parity is always in the same frame if this is second field
                if(!s->first_field){
                    ref_picture = s->current_picture_ptr->data;    
                }
            }
        }
    break;
    default: assert(0);
    }
M
Michael Niedermayer 已提交
3573
}
F
Fabrice Bellard 已提交
3574 3575 3576

/* put block[] to dest[] */
static inline void put_dct(MpegEncContext *s, 
3577
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
F
Fabrice Bellard 已提交
3578
{
3579
    s->dct_unquantize_intra(s, block, i, qscale);
3580
    s->dsp.idct_put (dest, line_size, block);
F
Fabrice Bellard 已提交
3581 3582 3583 3584
}

/* add block[] to dest[] */
static inline void add_dct(MpegEncContext *s, 
3585
                           DCTELEM *block, int i, uint8_t *dest, int line_size)
F
Fabrice Bellard 已提交
3586
{
M
Michael Niedermayer 已提交
3587
    if (s->block_last_index[i] >= 0) {
3588
        s->dsp.idct_add (dest, line_size, block);
M
Michael Niedermayer 已提交
3589 3590
    }
}
3591

M
Michael Niedermayer 已提交
3592
static inline void add_dequant_dct(MpegEncContext *s, 
M
Michael Niedermayer 已提交
3593
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
M
Michael Niedermayer 已提交
3594
{
F
Fabrice Bellard 已提交
3595
    if (s->block_last_index[i] >= 0) {
3596
        s->dct_unquantize_inter(s, block, i, qscale);
3597

3598
        s->dsp.idct_add (dest, line_size, block);
F
Fabrice Bellard 已提交
3599 3600 3601
    }
}

3602 3603 3604 3605 3606
/**
 * cleans dc, ac, coded_block for the current non intra MB
 */
void ff_clean_intra_table_entries(MpegEncContext *s)
{
3607
    int wrap = s->b8_stride;
3608 3609 3610 3611 3612 3613 3614
    int xy = s->block_index[0];
    
    s->dc_val[0][xy           ] = 
    s->dc_val[0][xy + 1       ] = 
    s->dc_val[0][xy     + wrap] =
    s->dc_val[0][xy + 1 + wrap] = 1024;
    /* ac pred */
3615 3616
    memset(s->ac_val[0][xy       ], 0, 32 * sizeof(int16_t));
    memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3617 3618 3619 3620 3621 3622 3623
    if (s->msmpeg4_version>=3) {
        s->coded_block[xy           ] =
        s->coded_block[xy + 1       ] =
        s->coded_block[xy     + wrap] =
        s->coded_block[xy + 1 + wrap] = 0;
    }
    /* chroma */
3624 3625
    wrap = s->mb_stride;
    xy = s->mb_x + s->mb_y * wrap;
3626 3627 3628
    s->dc_val[1][xy] =
    s->dc_val[2][xy] = 1024;
    /* ac pred */
3629 3630
    memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
    memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3631
    
3632
    s->mbintra_table[xy]= 0;
3633 3634
}

F
Fabrice Bellard 已提交
3635 3636 3637 3638 3639 3640 3641 3642 3643 3644
/* generic function called after a macroblock has been parsed by the
   decoder or after it has been encoded by the encoder.

   Important variables used:
   s->mb_intra : true if intra macroblock
   s->mv_dir   : motion vector direction
   s->mv_type  : motion vector type
   s->mv       : motion vector
   s->interlaced_dct : true if interlaced dct used (mpeg2)
 */
M
Michael Niedermayer 已提交
3645
static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
F
Fabrice Bellard 已提交
3646
{
3647
    int mb_x, mb_y;
3648
    const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
I
Ivan Kalvachev 已提交
3649 3650
#ifdef HAVE_XVMC
    if(s->avctx->xvmc_acceleration){
3651
        XVMC_decode_mb(s);//xvmc uses pblocks
I
Ivan Kalvachev 已提交
3652 3653 3654
        return;
    }
#endif
F
Fabrice Bellard 已提交
3655 3656 3657 3658

    mb_x = s->mb_x;
    mb_y = s->mb_y;

3659 3660 3661 3662 3663 3664 3665 3666 3667
    if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
       /* save DCT coefficients */
       int i,j;
       DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
       for(i=0; i<6; i++)
           for(j=0; j<64; j++)
               *dct++ = block[i][s->dsp.idct_permutation[j]];
    }

M
cleanup  
Michael Niedermayer 已提交
3668
    s->current_picture.qscale_table[mb_xy]= s->qscale;
3669

F
Fabrice Bellard 已提交
3670 3671
    /* update DC predictors for P macroblocks */
    if (!s->mb_intra) {
3672
        if (s->h263_pred || s->h263_aic) {
M
Michael Niedermayer 已提交
3673
            if(s->mbintra_table[mb_xy])
3674
                ff_clean_intra_table_entries(s);
F
Fabrice Bellard 已提交
3675
        } else {
3676 3677
            s->last_dc[0] =
            s->last_dc[1] =
F
Fabrice Bellard 已提交
3678 3679 3680
            s->last_dc[2] = 128 << s->intra_dc_precision;
        }
    }
3681
    else if (s->h263_pred || s->h263_aic)
M
Michael Niedermayer 已提交
3682
        s->mbintra_table[mb_xy]=1;
3683

3684
    if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3685
        uint8_t *dest_y, *dest_cb, *dest_cr;
M
Michael Niedermayer 已提交
3686
        int dct_linesize, dct_offset;
M
Michael Niedermayer 已提交
3687 3688
        op_pixels_func (*op_pix)[4];
        qpel_mc_func (*op_qpix)[16];
M
Michael Niedermayer 已提交
3689 3690
        const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
        const int uvlinesize= s->current_picture.linesize[1];
M
Michael Niedermayer 已提交
3691 3692
        const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3693

M
cleanup  
Michael Niedermayer 已提交
3694 3695 3696
        /* avoid copy if macroblock skipped in last frame too */
        /* skip only during decoding as we might trash the buffers during encoding a bit */
        if(!s->encoding){
3697
            uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
M
cleanup  
Michael Niedermayer 已提交
3698
            const int age= s->current_picture.age;
M
Michael Niedermayer 已提交
3699

M
cleanup  
Michael Niedermayer 已提交
3700 3701 3702 3703 3704 3705
            assert(age);

            if (s->mb_skiped) {
                s->mb_skiped= 0;
                assert(s->pict_type!=I_TYPE);
 
M
Michael Niedermayer 已提交
3706 3707 3708
                (*mbskip_ptr) ++; /* indicate that this time we skiped it */
                if(*mbskip_ptr >99) *mbskip_ptr= 99;

M
cleanup  
Michael Niedermayer 已提交
3709
                /* if previous was skipped too, then nothing to do !  */
3710 3711
                if (*mbskip_ptr >= age && s->current_picture.reference){
                    return;
M
cleanup  
Michael Niedermayer 已提交
3712
                }
3713 3714 3715 3716
            } else if(!s->current_picture.reference){
                (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
                if(*mbskip_ptr >99) *mbskip_ptr= 99;
            } else{
3717 3718
                *mbskip_ptr = 0; /* not skipped */
            }
M
Michael Niedermayer 已提交
3719
        }
M
Michael Niedermayer 已提交
3720
        
3721
        dct_linesize = linesize << s->interlaced_dct;
M
Michael Niedermayer 已提交
3722 3723
        dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
        
3724 3725 3726 3727 3728
        if(readable){
            dest_y=  s->dest[0];
            dest_cb= s->dest[1];
            dest_cr= s->dest[2];
        }else{
3729
            dest_y = s->b_scratchpad;
3730
            dest_cb= s->b_scratchpad+16*linesize;
3731
            dest_cr= s->b_scratchpad+32*linesize;
3732
        }
M
Michael Niedermayer 已提交
3733

F
Fabrice Bellard 已提交
3734 3735
        if (!s->mb_intra) {
            /* motion handling */
3736
            /* decoding or more than one mb_type (MC was allready done otherwise) */
3737
            if(!s->encoding){
M
Michael Niedermayer 已提交
3738 3739
                if(lowres_flag){
                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
F
Fabrice Bellard 已提交
3740

M
Michael Niedermayer 已提交
3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763
                    if (s->mv_dir & MV_DIR_FORWARD) {
                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
                        op_pix = s->dsp.avg_h264_chroma_pixels_tab;
                    }
                    if (s->mv_dir & MV_DIR_BACKWARD) {
                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
                    }
                }else{
                    if ((!s->no_rounding) || s->pict_type==B_TYPE){                
                        op_pix = s->dsp.put_pixels_tab;
                        op_qpix= s->dsp.put_qpel_pixels_tab;
                    }else{
                        op_pix = s->dsp.put_no_rnd_pixels_tab;
                        op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
                    }
                    if (s->mv_dir & MV_DIR_FORWARD) {
                        MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
                        op_pix = s->dsp.avg_pixels_tab;
                        op_qpix= s->dsp.avg_qpel_pixels_tab;
                    }
                    if (s->mv_dir & MV_DIR_BACKWARD) {
                        MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
                    }
3764
                }
F
Fabrice Bellard 已提交
3765 3766
            }

M
Michael Niedermayer 已提交
3767
            /* skip dequant / idct if we are really late ;) */
3768
            if(s->hurry_up>1) return;
M
Michael Niedermayer 已提交
3769

F
Fabrice Bellard 已提交
3770
            /* add dct residue */
M
Michael Niedermayer 已提交
3771
            if(s->encoding || !(   s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3772
                                || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
M
Michael Niedermayer 已提交
3773 3774 3775 3776
                add_dequant_dct(s, block[0], 0, dest_y                          , dct_linesize, s->qscale);
                add_dequant_dct(s, block[1], 1, dest_y              + block_size, dct_linesize, s->qscale);
                add_dequant_dct(s, block[2], 2, dest_y + dct_offset             , dct_linesize, s->qscale);
                add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
M
Michael Niedermayer 已提交
3777

M
Michael Niedermayer 已提交
3778
                if(!(s->flags&CODEC_FLAG_GRAY)){
M
Michael Niedermayer 已提交
3779 3780
                    add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
                    add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
M
Michael Niedermayer 已提交
3781
                }
M
Michael Niedermayer 已提交
3782
            } else if(s->codec_id != CODEC_ID_WMV2){
M
Michael Niedermayer 已提交
3783 3784 3785 3786
                add_dct(s, block[0], 0, dest_y                          , dct_linesize);
                add_dct(s, block[1], 1, dest_y              + block_size, dct_linesize);
                add_dct(s, block[2], 2, dest_y + dct_offset             , dct_linesize);
                add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
F
Fabrice Bellard 已提交
3787

M
Michael Niedermayer 已提交
3788
                if(!(s->flags&CODEC_FLAG_GRAY)){
3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809
                    if(s->chroma_y_shift){//Chroma420
                        add_dct(s, block[4], 4, dest_cb, uvlinesize);
                        add_dct(s, block[5], 5, dest_cr, uvlinesize);
                    }else{
                        //chroma422
                        dct_linesize = uvlinesize << s->interlaced_dct;
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;

                        add_dct(s, block[4], 4, dest_cb, dct_linesize);
                        add_dct(s, block[5], 5, dest_cr, dct_linesize);
                        add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
                        add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
                        if(!s->chroma_x_shift){//Chroma444
                            add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
                            add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
                            add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
                            add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
                        }
                    }
                }//fi gray
            }
M
Michael Niedermayer 已提交
3810
            else{
M
Michael Niedermayer 已提交
3811
                ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
M
Michael Niedermayer 已提交
3812
            }
F
Fabrice Bellard 已提交
3813 3814
        } else {
            /* dct only in intra block */
M
Michael Niedermayer 已提交
3815
            if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
M
Michael Niedermayer 已提交
3816 3817 3818 3819
                put_dct(s, block[0], 0, dest_y                          , dct_linesize, s->qscale);
                put_dct(s, block[1], 1, dest_y              + block_size, dct_linesize, s->qscale);
                put_dct(s, block[2], 2, dest_y + dct_offset             , dct_linesize, s->qscale);
                put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3820 3821

                if(!(s->flags&CODEC_FLAG_GRAY)){
3822 3823
                    put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
                    put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3824 3825
                }
            }else{
M
Michael Niedermayer 已提交
3826 3827 3828 3829
                s->dsp.idct_put(dest_y                          , dct_linesize, block[0]);
                s->dsp.idct_put(dest_y              + block_size, dct_linesize, block[1]);
                s->dsp.idct_put(dest_y + dct_offset             , dct_linesize, block[2]);
                s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3830 3831

                if(!(s->flags&CODEC_FLAG_GRAY)){
3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851
                    if(s->chroma_y_shift){
                        s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
                        s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
                    }else{

                        dct_linesize = uvlinesize << s->interlaced_dct;
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;

                        s->dsp.idct_put(dest_cb,              dct_linesize, block[4]);
                        s->dsp.idct_put(dest_cr,              dct_linesize, block[5]);
                        s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
                        s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
                        if(!s->chroma_x_shift){//Chroma444
                            s->dsp.idct_put(dest_cb + 8,              dct_linesize, block[8]);
                            s->dsp.idct_put(dest_cr + 8,              dct_linesize, block[9]);
                            s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
                            s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
                        }
                    }
                }//gray
M
Michael Niedermayer 已提交
3852
            }
F
Fabrice Bellard 已提交
3853
        }
3854 3855
        if(!readable){
            s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y ,   linesize,16);
3856 3857
            s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
            s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3858
        }
F
Fabrice Bellard 已提交
3859 3860 3861
    }
}

M
Michael Niedermayer 已提交
3862 3863 3864 3865 3866
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
    if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
    else                  MPV_decode_mb_internal(s, block, 0);
}

3867 3868
#ifdef CONFIG_ENCODERS

3869
static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884
{
    static const char tab[64]=
        {3,2,2,1,1,1,1,1,
         1,1,1,1,1,1,1,1,
         1,1,1,1,1,1,1,1,
         0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0};
    int score=0;
    int run=0;
    int i;
    DCTELEM *block= s->block[n];
    const int last_index= s->block_last_index[n];
3885
    int skip_dc;
3886

3887 3888 3889
    if(threshold<0){
        skip_dc=0;
        threshold= -threshold;
3890 3891
    }else
        skip_dc=1;
3892

3893 3894 3895 3896
    /* are all which we could set to zero are allready zero? */
    if(last_index<=skip_dc - 1) return;

    for(i=0; i<=last_index; i++){
3897
        const int j = s->intra_scantable.permutated[i];
3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910
        const int level = ABS(block[j]);
        if(level==1){
            if(skip_dc && i==0) continue;
            score+= tab[run];
            run=0;
        }else if(level>1){
            return;
        }else{
            run++;
        }
    }
    if(score >= threshold) return;
    for(i=skip_dc; i<=last_index; i++){
3911
        const int j = s->intra_scantable.permutated[i];
3912 3913 3914 3915 3916 3917
        block[j]=0;
    }
    if(block[0]) s->block_last_index[n]= 0;
    else         s->block_last_index[n]= -1;
}

3918 3919 3920 3921 3922
static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
{
    int i;
    const int maxlevel= s->max_qcoeff;
    const int minlevel= s->min_qcoeff;
3923
    int overflow=0;
3924 3925 3926 3927 3928 3929 3930 3931
    
    if(s->mb_intra){
        i=1; //skip clipping of intra dc
    }else
        i=0;
    
    for(;i<=last_index; i++){
        const int j= s->intra_scantable.permutated[i];
3932 3933
        int level = block[j];
       
3934 3935 3936 3937 3938 3939 3940 3941
        if     (level>maxlevel){
            level=maxlevel;
            overflow++;
        }else if(level<minlevel){
            level=minlevel;
            overflow++;
        }
        
M
cleanup  
Michael Niedermayer 已提交
3942
        block[j]= level;
3943
    }
3944 3945 3946
    
    if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
        av_log(s->avctx, AV_LOG_INFO, "warning, cliping %d dct coefficents to %d..%d\n", overflow, minlevel, maxlevel);
3947 3948
}

3949 3950
#endif //CONFIG_ENCODERS

3951 3952 3953 3954 3955
/**
 *
 * @param h is the normal height, this will be reduced automatically if needed for the last row
 */
void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
M
Michael Niedermayer 已提交
3956
    if (s->avctx->draw_horiz_band) {
3957
        AVFrame *src;
M
Michael Niedermayer 已提交
3958
        int offset[4];
3959 3960 3961 3962 3963 3964 3965
        
        if(s->picture_structure != PICT_FRAME){
            h <<= 1;
            y <<= 1;
            if(s->first_field  && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
        }

3966
        h= FFMIN(h, s->avctx->height - y);
3967

3968 3969 3970 3971 3972 3973 3974
        if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER)) 
            src= (AVFrame*)s->current_picture_ptr;
        else if(s->last_picture_ptr)
            src= (AVFrame*)s->last_picture_ptr;
        else
            return;
            
M
Michael Niedermayer 已提交
3975
        if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
M
Michael Niedermayer 已提交
3976 3977 3978 3979 3980 3981 3982
            offset[0]=
            offset[1]=
            offset[2]=
            offset[3]= 0;
        }else{
            offset[0]= y * s->linesize;;
            offset[1]= 
3983
            offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
M
Michael Niedermayer 已提交
3984
            offset[3]= 0;
3985
        }
M
Michael Niedermayer 已提交
3986

M
cleanup  
Michael Niedermayer 已提交
3987 3988
        emms_c();

3989 3990
        s->avctx->draw_horiz_band(s->avctx, src, offset,
                                  y, s->picture_structure, h);
3991 3992 3993
    }
}

3994 3995 3996
void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
    const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
    const int uvlinesize= s->current_picture.linesize[1];
M
Michael Niedermayer 已提交
3997
    const int mb_size= 4 - s->avctx->lowres;
3998
        
3999 4000 4001 4002 4003 4004
    s->block_index[0]= s->b8_stride*(s->mb_y*2    ) - 2 + s->mb_x*2;
    s->block_index[1]= s->b8_stride*(s->mb_y*2    ) - 1 + s->mb_x*2;
    s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
    s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
    s->block_index[4]= s->mb_stride*(s->mb_y + 1)                + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
    s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4005 4006
    //block_index is not used by mpeg2, so it is not affected by chroma_format

M
Michael Niedermayer 已提交
4007 4008 4009
    s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
    s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
    s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
M
Michael Niedermayer 已提交
4010

4011 4012
    if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
    {
M
Michael Niedermayer 已提交
4013 4014 4015
        s->dest[0] += s->mb_y *   linesize << mb_size;
        s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
        s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4016
    }
4017 4018
}

4019 4020
#ifdef CONFIG_ENCODERS

M
Michael Niedermayer 已提交
4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043
static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
    int x, y;
//FIXME optimize
    for(y=0; y<8; y++){
        for(x=0; x<8; x++){
            int x2, y2;
            int sum=0;
            int sqr=0;
            int count=0;

            for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
                for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
                    int v= ptr[x2 + y2*stride];
                    sum += v;
                    sqr += v*v;
                    count++;
                }
            }
            weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
        }
    }
}

4044
static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
F
Fabrice Bellard 已提交
4045
{
M
Michael Niedermayer 已提交
4046 4047
    int16_t weight[6][64];
    DCTELEM orig[6][64];
4048 4049 4050
    const int mb_x= s->mb_x;
    const int mb_y= s->mb_y;
    int i;
4051
    int skip_dct[6];
4052
    int dct_offset   = s->linesize*8; //default for progressive frames
M
Michael Niedermayer 已提交
4053 4054
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
    int wrap_y, wrap_c;
4055
    
4056
    for(i=0; i<6; i++) skip_dct[i]=0;
4057 4058
    
    if(s->adaptive_quant){
4059 4060
        const int last_qp= s->qscale;
        const int mb_xy= mb_x + mb_y*s->mb_stride;
4061

4062 4063
        s->lambda= s->lambda_table[mb_xy];
        update_qscale(s);
4064 4065 4066
    
        if(!(s->flags&CODEC_FLAG_QP_RD)){
            s->dquant= s->qscale - last_qp;
4067

4068
            if(s->out_format==FMT_H263){
4069
                s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4070
            
4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081
                if(s->codec_id==CODEC_ID_MPEG4){        
                    if(!s->mb_intra){
                        if(s->pict_type == B_TYPE){
                            if(s->dquant&1) 
                                s->dquant= (s->dquant/2)*2;
                            if(s->mv_dir&MV_DIRECT)
                                s->dquant= 0;
                        }
                        if(s->mv_type==MV_TYPE_8X8)
                            s->dquant=0;
                    }
4082
                }
4083 4084
            }
        }
M
cleanup  
Michael Niedermayer 已提交
4085
        ff_set_qscale(s, last_qp + s->dquant);
M
Michael Niedermayer 已提交
4086 4087
    }else if(s->flags&CODEC_FLAG_QP_RD)
        ff_set_qscale(s, s->qscale + s->dquant);
4088

M
Michael Niedermayer 已提交
4089 4090 4091 4092 4093 4094 4095
    wrap_y = s->linesize;
    wrap_c = s->uvlinesize;
    ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
    ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
    ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;

    if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4096 4097 4098 4099 4100 4101 4102
        uint8_t *ebuf= s->edge_emu_buffer + 32;
        ff_emulated_edge_mc(ebuf            , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width   , s->height);
        ptr_y= ebuf;
        ff_emulated_edge_mc(ebuf+18*wrap_y  , ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
        ptr_cb= ebuf+18*wrap_y;
        ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
        ptr_cr= ebuf+18*wrap_y+8;
M
Michael Niedermayer 已提交
4103 4104
    }

4105
    if (s->mb_intra) {
4106 4107
        if(s->flags&CODEC_FLAG_INTERLACED_DCT){
            int progressive_score, interlaced_score;
M
Michael Niedermayer 已提交
4108

4109
            s->interlaced_dct=0;
M
Michael Niedermayer 已提交
4110 4111
            progressive_score= s->dsp.ildct_cmp[4](s, ptr_y           , NULL, wrap_y, 8) 
                              +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4112 4113

            if(progressive_score > 0){
M
Michael Niedermayer 已提交
4114 4115
                interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y           , NULL, wrap_y*2, 8) 
                                  +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y  , NULL, wrap_y*2, 8);
4116 4117
                if(progressive_score > interlaced_score){
                    s->interlaced_dct=1;
4118
            
4119 4120 4121 4122
                    dct_offset= wrap_y;
                    wrap_y<<=1;
                }
            }
4123 4124
        }
        
M
Michael Niedermayer 已提交
4125 4126 4127 4128
	s->dsp.get_pixels(s->block[0], ptr_y                 , wrap_y);
        s->dsp.get_pixels(s->block[1], ptr_y              + 8, wrap_y);
        s->dsp.get_pixels(s->block[2], ptr_y + dct_offset    , wrap_y);
        s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4129

M
Michael Niedermayer 已提交
4130 4131 4132 4133
        if(s->flags&CODEC_FLAG_GRAY){
            skip_dct[4]= 1;
            skip_dct[5]= 1;
        }else{
M
Michael Niedermayer 已提交
4134 4135 4136
	    s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
            s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
        }
4137
    }else{
M
Michael Niedermayer 已提交
4138 4139
        op_pixels_func (*op_pix)[4];
        qpel_mc_func (*op_qpix)[16];
4140
        uint8_t *dest_y, *dest_cb, *dest_cr;
4141

4142 4143 4144
        dest_y  = s->dest[0];
        dest_cb = s->dest[1];
        dest_cr = s->dest[2];
4145

4146
        if ((!s->no_rounding) || s->pict_type==B_TYPE){
4147 4148
	    op_pix = s->dsp.put_pixels_tab;
            op_qpix= s->dsp.put_qpel_pixels_tab;
M
Michael Niedermayer 已提交
4149
        }else{
4150 4151
            op_pix = s->dsp.put_no_rnd_pixels_tab;
            op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4152 4153 4154
        }

        if (s->mv_dir & MV_DIR_FORWARD) {
M
cleanup  
Michael Niedermayer 已提交
4155
            MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4156 4157
            op_pix = s->dsp.avg_pixels_tab;
            op_qpix= s->dsp.avg_qpel_pixels_tab;
4158 4159
        }
        if (s->mv_dir & MV_DIR_BACKWARD) {
M
cleanup  
Michael Niedermayer 已提交
4160
            MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4161
        }
4162

4163 4164
        if(s->flags&CODEC_FLAG_INTERLACED_DCT){
            int progressive_score, interlaced_score;
4165 4166 4167 4168

            s->interlaced_dct=0;
            progressive_score= s->dsp.ildct_cmp[0](s, dest_y           , ptr_y           , wrap_y, 8) 
                              +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4169
            
4170 4171 4172 4173 4174
            if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;

            if(progressive_score>0){
                interlaced_score = s->dsp.ildct_cmp[0](s, dest_y           , ptr_y           , wrap_y*2, 8) 
                                  +s->dsp.ildct_cmp[0](s, dest_y + wrap_y  , ptr_y + wrap_y  , wrap_y*2, 8);
4175
            
4176 4177
                if(progressive_score > interlaced_score){
                    s->interlaced_dct=1;
4178
            
4179 4180 4181 4182
                    dct_offset= wrap_y;
                    wrap_y<<=1;
                }
            }
4183 4184
        }
        
4185 4186 4187 4188
	s->dsp.diff_pixels(s->block[0], ptr_y                 , dest_y                 , wrap_y);
        s->dsp.diff_pixels(s->block[1], ptr_y              + 8, dest_y              + 8, wrap_y);
        s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset    , dest_y + dct_offset    , wrap_y);
        s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
M
Michael Niedermayer 已提交
4189 4190 4191 4192 4193
        
        if(s->flags&CODEC_FLAG_GRAY){
            skip_dct[4]= 1;
            skip_dct[5]= 1;
        }else{
4194 4195
            s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
            s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
M
Michael Niedermayer 已提交
4196
        }
4197
        /* pre quantization */         
4198
        if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4199
            //FIXME optimize
M
Michael Niedermayer 已提交
4200 4201 4202 4203 4204 4205
	    if(s->dsp.sad[1](NULL, ptr_y               , dest_y               , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
            if(s->dsp.sad[1](NULL, ptr_y            + 8, dest_y            + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
            if(s->dsp.sad[1](NULL, ptr_y +dct_offset   , dest_y +dct_offset   , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
            if(s->dsp.sad[1](NULL, ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y, 8) < 20*s->qscale) skip_dct[3]= 1;
            if(s->dsp.sad[1](NULL, ptr_cb              , dest_cb              , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
            if(s->dsp.sad[1](NULL, ptr_cr              , dest_cr              , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4206
        }
M
Michael Niedermayer 已提交
4207
    }
4208

M
Michael Niedermayer 已提交
4209 4210 4211 4212 4213 4214 4215 4216
    if(s->avctx->quantizer_noise_shaping){
        if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y                 , wrap_y);
        if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y              + 8, wrap_y);
        if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset    , wrap_y);
        if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
        if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb                , wrap_c);
        if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr                , wrap_c);
        memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
4217 4218 4219
    }
            
    /* DCT & quantize */
M
Michael Niedermayer 已提交
4220 4221
    assert(s->out_format!=FMT_MJPEG || s->qscale==8);
    {
4222
        for(i=0;i<6;i++) {
4223 4224
            if(!skip_dct[i]){
                int overflow;
4225
                s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4226
            // FIXME we could decide to change to quantizer instead of clipping
4227 4228
            // JS: I don't think that would be a good idea it could lower quality instead
            //     of improve it. Just INTRADC clipping deserves changes in quantizer
4229 4230 4231
                if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
            }else
                s->block_last_index[i]= -1;
4232
        }
M
Michael Niedermayer 已提交
4233 4234 4235 4236 4237 4238 4239
        if(s->avctx->quantizer_noise_shaping){
            for(i=0;i<6;i++) {
                if(!skip_dct[i]){
                    s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
                }
            }
        }
4240
        
4241 4242
        if(s->luma_elim_threshold && !s->mb_intra)
            for(i=0; i<4; i++)
4243
                dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4244 4245
        if(s->chroma_elim_threshold && !s->mb_intra)
            for(i=4; i<6; i++)
4246
                dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4247 4248 4249 4250 4251 4252 4253

        if(s->flags & CODEC_FLAG_CBP_RD){
            for(i=0;i<6;i++) {
                if(s->block_last_index[i] == -1)
                    s->coded_score[i]= INT_MAX/256;
            }
        }
4254 4255
    }

M
Michael Niedermayer 已提交
4256 4257 4258 4259
    if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
        s->block_last_index[4]=
        s->block_last_index[5]= 0;
        s->block[4][0]=
M
bugs  
Michael Niedermayer 已提交
4260
        s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
M
Michael Niedermayer 已提交
4261 4262
    }

M
Michael Niedermayer 已提交
4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275
    //non c quantize code returns incorrect block_last_index FIXME
    if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
        for(i=0; i<6; i++){
            int j;
            if(s->block_last_index[i]>0){
                for(j=63; j>0; j--){
                    if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
                }
                s->block_last_index[i]= j;
            }
        }
    }

4276
    /* huffman encode */
M
Michael Niedermayer 已提交
4277 4278
    switch(s->codec_id){ //FIXME funct ptr could be slightly faster
    case CODEC_ID_MPEG1VIDEO:
M
Michael Niedermayer 已提交
4279
    case CODEC_ID_MPEG2VIDEO:
M
Michael Niedermayer 已提交
4280 4281 4282 4283 4284 4285 4286 4287 4288
        mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
    case CODEC_ID_MPEG4:
        mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
    case CODEC_ID_MSMPEG4V2:
    case CODEC_ID_MSMPEG4V3:
    case CODEC_ID_WMV1:
        msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
    case CODEC_ID_WMV2:
         ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4289 4290
    case CODEC_ID_H261:
        ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
M
Michael Niedermayer 已提交
4291 4292
    case CODEC_ID_H263:
    case CODEC_ID_H263P:
4293
    case CODEC_ID_FLV1:
M
Michael Niedermayer 已提交
4294
    case CODEC_ID_RV10:
M
Michael Niedermayer 已提交
4295
    case CODEC_ID_RV20:
M
Michael Niedermayer 已提交
4296
        h263_encode_mb(s, s->block, motion_x, motion_y); break;
M
Michael Niedermayer 已提交
4297 4298
    case CODEC_ID_MJPEG:
        mjpeg_encode_mb(s, s->block); break;
M
Michael Niedermayer 已提交
4299 4300
    default:
        assert(0);
4301 4302 4303
    }
}

4304 4305
#endif //CONFIG_ENCODERS

M
Michael Niedermayer 已提交
4306 4307 4308 4309
void ff_mpeg_flush(AVCodecContext *avctx){
    int i;
    MpegEncContext *s = avctx->priv_data;
    
4310 4311 4312
    if(s==NULL || s->picture==NULL) 
        return;
    
M
Michael Niedermayer 已提交
4313 4314 4315 4316 4317
    for(i=0; i<MAX_PICTURE_COUNT; i++){
       if(s->picture[i].data[0] && (   s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
                                    || s->picture[i].type == FF_BUFFER_TYPE_USER))
        avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
    }
M
Michael Niedermayer 已提交
4318
    s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4319
    
M
Michael Niedermayer 已提交
4320 4321
    s->mb_x= s->mb_y= 0;
    
4322 4323 4324 4325 4326 4327
    s->parse_context.state= -1;
    s->parse_context.frame_start_found= 0;
    s->parse_context.overread= 0;
    s->parse_context.overread_index= 0;
    s->parse_context.index= 0;
    s->parse_context.last_index= 0;
4328
    s->bitstream_buffer_size=0;
M
Michael Niedermayer 已提交
4329 4330
}

4331
#ifdef CONFIG_ENCODERS
4332
void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4333
{
4334
    const uint16_t *srcw= (uint16_t*)src;
4335
    int words= length>>4;
4336 4337 4338
    int bits= length&15;
    int i;

4339
    if(length==0) return;
4340
    
4341 4342 4343 4344
    if(words < 16){
        for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
    }else if(put_bits_count(pb)&7){
        for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4345
    }else{
4346 4347
        for(i=0; put_bits_count(pb)&31; i++)
            put_bits(pb, 8, src[i]);
4348
        flush_put_bits(pb);
4349 4350
        memcpy(pbBufPtr(pb), src+i, 2*words-i);
        skip_put_bytes(pb, 2*words-i);
4351
    }
4352
        
4353
    put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4354 4355
}

4356
static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4357 4358 4359 4360 4361
    int i;

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

    /* mpeg1 */
4362
    d->mb_skip_run= s->mb_skip_run;
4363 4364 4365 4366 4367 4368 4369 4370
    for(i=0; i<3; i++)
        d->last_dc[i]= s->last_dc[i];
    
    /* statistics */
    d->mv_bits= s->mv_bits;
    d->i_tex_bits= s->i_tex_bits;
    d->p_tex_bits= s->p_tex_bits;
    d->i_count= s->i_count;
4371 4372
    d->f_count= s->f_count;
    d->b_count= s->b_count;
4373 4374
    d->skip_count= s->skip_count;
    d->misc_bits= s->misc_bits;
4375
    d->last_bits= 0;
4376

4377
    d->mb_skiped= 0;
M
Michael Niedermayer 已提交
4378
    d->qscale= s->qscale;
4379
    d->dquant= s->dquant;
4380 4381
}

4382
static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4383 4384 4385 4386 4387 4388
    int i;

    memcpy(d->mv, s->mv, 2*4*2*sizeof(int)); 
    memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
    
    /* mpeg1 */
4389
    d->mb_skip_run= s->mb_skip_run;
4390 4391 4392 4393 4394 4395 4396 4397
    for(i=0; i<3; i++)
        d->last_dc[i]= s->last_dc[i];
    
    /* statistics */
    d->mv_bits= s->mv_bits;
    d->i_tex_bits= s->i_tex_bits;
    d->p_tex_bits= s->p_tex_bits;
    d->i_count= s->i_count;
4398 4399
    d->f_count= s->f_count;
    d->b_count= s->b_count;
4400 4401 4402 4403
    d->skip_count= s->skip_count;
    d->misc_bits= s->misc_bits;

    d->mb_intra= s->mb_intra;
4404
    d->mb_skiped= s->mb_skiped;
4405 4406 4407
    d->mv_type= s->mv_type;
    d->mv_dir= s->mv_dir;
    d->pb= s->pb;
4408 4409 4410 4411
    if(s->data_partitioning){
        d->pb2= s->pb2;
        d->tex_pb= s->tex_pb;
    }
4412 4413 4414
    d->block= s->block;
    for(i=0; i<6; i++)
        d->block_last_index[i]= s->block_last_index[i];
4415
    d->interlaced_dct= s->interlaced_dct;
M
Michael Niedermayer 已提交
4416
    d->qscale= s->qscale;
4417 4418
}

4419 4420 4421 4422
static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type, 
                           PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
                           int *dmin, int *next_block, int motion_x, int motion_y)
{
4423 4424
    int score;
    uint8_t *dest_backup[3];
4425 4426 4427 4428 4429 4430 4431 4432 4433
    
    copy_context_before_encode(s, backup, type);

    s->block= s->blocks[*next_block];
    s->pb= pb[*next_block];
    if(s->data_partitioning){
        s->pb2   = pb2   [*next_block];
        s->tex_pb= tex_pb[*next_block];
    }
4434 4435 4436
    
    if(*next_block){
        memcpy(dest_backup, s->dest, sizeof(s->dest));
4437 4438 4439 4440
        s->dest[0] = s->rd_scratchpad;
        s->dest[1] = s->rd_scratchpad + 16*s->linesize;
        s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
        assert(s->linesize >= 32); //FIXME
4441
    }
4442 4443

    encode_mb(s, motion_x, motion_y);
4444
    
4445
    score= put_bits_count(&s->pb);
4446
    if(s->data_partitioning){
4447 4448
        score+= put_bits_count(&s->pb2);
        score+= put_bits_count(&s->tex_pb);
4449
    }
4450 4451 4452
   
    if(s->avctx->mb_decision == FF_MB_DECISION_RD){
        MPV_decode_mb(s, s->block);
4453

4454 4455
        score *= s->lambda2;
        score += sse_mb(s) << FF_LAMBDA_SHIFT;
4456 4457 4458 4459 4460 4461 4462 4463
    }
    
    if(*next_block){
        memcpy(s->dest, dest_backup, sizeof(s->dest));
    }

    if(score<*dmin){
        *dmin= score;
4464 4465 4466 4467 4468
        *next_block^=1;

        copy_context_after_encode(best, s, type);
    }
}
4469
                
4470
static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4471 4472 4473 4474 4475
    uint32_t *sq = squareTbl + 256;
    int acc=0;
    int x,y;
    
    if(w==16 && h==16) 
M
Michael Niedermayer 已提交
4476
        return s->dsp.sse[0](NULL, src1, src2, stride, 16);
M
Michael Niedermayer 已提交
4477
    else if(w==8 && h==8)
M
Michael Niedermayer 已提交
4478
        return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4479 4480 4481 4482 4483 4484
    
    for(y=0; y<h; y++){
        for(x=0; x<w; x++){
            acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
        } 
    }
M
Michael Niedermayer 已提交
4485 4486 4487
    
    assert(acc>=0);
    
4488 4489
    return acc;
}
4490

4491 4492 4493 4494 4495 4496 4497 4498
static int sse_mb(MpegEncContext *s){
    int w= 16;
    int h= 16;

    if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
    if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;

    if(w==16 && h==16)
4499
      if(s->avctx->mb_cmp == FF_CMP_NSSE){
M
Michael Niedermayer 已提交
4500 4501 4502
        return  s->dsp.nsse[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
               +s->dsp.nsse[1](s, s->new_picture.data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
               +s->dsp.nsse[1](s, s->new_picture.data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
4503
      }else{
M
Michael Niedermayer 已提交
4504 4505 4506
        return  s->dsp.sse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
               +s->dsp.sse[1](NULL, s->new_picture.data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
               +s->dsp.sse[1](NULL, s->new_picture.data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
4507
      }
4508 4509 4510 4511 4512 4513
    else
        return  sse(s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize)
               +sse(s, s->new_picture.data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize)
               +sse(s, s->new_picture.data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize);
}

4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557
static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
    MpegEncContext *s= arg;

    
    s->me.pre_pass=1;
    s->me.dia_size= s->avctx->pre_dia_size;
    s->first_slice_line=1;
    for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
        for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
            ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
        }
        s->first_slice_line=0;
    }
    
    s->me.pre_pass=0;
    
    return 0;
}

static int estimate_motion_thread(AVCodecContext *c, void *arg){
    MpegEncContext *s= arg;

    s->me.dia_size= s->avctx->dia_size;
    s->first_slice_line=1;
    for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
        s->mb_x=0; //for block init below
        ff_init_block_index(s);
        for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
            s->block_index[0]+=2;
            s->block_index[1]+=2;
            s->block_index[2]+=2;
            s->block_index[3]+=2;
            
            /* compute motion vector & mb_type and store in context */
            if(s->pict_type==B_TYPE)
                ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
            else
                ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
        }
        s->first_slice_line=0;
    }
    return 0;
}

4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573
static int mb_var_thread(AVCodecContext *c, void *arg){
    MpegEncContext *s= arg;
    int mb_x, mb_y;

    for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
        for(mb_x=0; mb_x < s->mb_width; mb_x++) {
            int xx = mb_x * 16;
            int yy = mb_y * 16;
            uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
            int varc;
            int sum = s->dsp.pix_sum(pix, s->linesize);
    
            varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;

            s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
            s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4574
            s->me.mb_var_sum_temp    += varc;
4575 4576
        }
    }
4577
    return 0;
4578 4579
}

4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592
static void write_slice_end(MpegEncContext *s){
    if(s->codec_id==CODEC_ID_MPEG4){
        if(s->partitioned_frame){
            ff_mpeg4_merge_partitions(s);
        }
    
        ff_mpeg4_stuffing(&s->pb);
    }else if(s->out_format == FMT_MJPEG){
        ff_mjpeg_stuffing(&s->pb);
    }

    align_put_bits(&s->pb);
    flush_put_bits(&s->pb);
4593 4594 4595
    
    if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
        s->misc_bits+= get_bits_diff(s);
4596 4597 4598 4599
}

static int encode_thread(AVCodecContext *c, void *arg){
    MpegEncContext *s= arg;
M
Michael Niedermayer 已提交
4600
    int mb_x, mb_y, pdif = 0;
M
Michael Niedermayer 已提交
4601
    int i, j;
4602
    MpegEncContext best_s, backup_s;
4603 4604 4605
    uint8_t bit_buf[2][MAX_MB_BYTES];
    uint8_t bit_buf2[2][MAX_MB_BYTES];
    uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4606
    PutBitContext pb[2], pb2[2], tex_pb[2];
4607
//printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4608 4609

    for(i=0; i<2; i++){
4610 4611 4612
        init_put_bits(&pb    [i], bit_buf    [i], MAX_MB_BYTES);
        init_put_bits(&pb2   [i], bit_buf2   [i], MAX_MB_BYTES);
        init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4613
    }
F
Fabrice Bellard 已提交
4614

4615 4616 4617 4618 4619 4620 4621 4622 4623
    s->last_bits= put_bits_count(&s->pb);
    s->mv_bits=0;
    s->misc_bits=0;
    s->i_tex_bits=0;
    s->p_tex_bits=0;
    s->i_count=0;
    s->f_count=0;
    s->b_count=0;
    s->skip_count=0;
4624

4625 4626 4627
    for(i=0; i<3; i++){
        /* init last dc values */
        /* note: quant matrix value (8) is implied here */
4628
        s->last_dc[i] = 128 << s->intra_dc_precision;
M
Michael Niedermayer 已提交
4629
        
4630
        s->current_picture_ptr->error[i] = 0;
M
Michael Niedermayer 已提交
4631
    }
4632 4633 4634 4635
    s->mb_skip_run = 0;
    memset(s->last_mv, 0, sizeof(s->last_mv));
     
    s->last_mv_dir = 0;
M
Michael Niedermayer 已提交
4636

4637 4638 4639 4640 4641 4642 4643 4644 4645 4646
    switch(s->codec_id){
    case CODEC_ID_H263:
    case CODEC_ID_H263P:
    case CODEC_ID_FLV1:
        s->gob_index = ff_h263_get_gob_height(s);
        break;
    case CODEC_ID_MPEG4:
        if(s->partitioned_frame)
            ff_mpeg4_init_partitions(s);
        break;
4647
    }
4648

4649 4650 4651 4652 4653 4654 4655 4656
    s->resync_mb_x=0;
    s->resync_mb_y=0; 
    s->first_slice_line = 1;
    s->ptr_lastgob = s->pb.buf;
    for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
//    printf("row %d at %X\n", s->mb_y, (int)s);
        s->mb_x=0;
        s->mb_y= mb_y;
M
cleanup  
Michael Niedermayer 已提交
4657

4658 4659 4660 4661
        ff_set_qscale(s, s->qscale);
        ff_init_block_index(s);
        
        for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4662
            int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4663 4664 4665 4666
            int mb_type= s->mb_type[xy];
//            int d;
            int dmin= INT_MAX;
            int dir;
M
Michael Niedermayer 已提交
4667

4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679
            if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
                av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
                return -1;
            }
            if(s->data_partitioning){
                if(   s->pb2   .buf_end - s->pb2   .buf - (put_bits_count(&s->    pb2)>>3) < MAX_MB_BYTES
                   || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
                    av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
                    return -1;
                }
            }

4680
            s->mb_x = mb_x;
4681
            s->mb_y = mb_y;  // moved into loop, can get changed by H.261
4682 4683
            ff_update_block_index(s);

4684 4685 4686
            if(s->codec_id == CODEC_ID_H261){
                ff_h261_reorder_mb_index(s);
                xy= s->mb_y*s->mb_stride + s->mb_x;
M
Maarten Daniels 已提交
4687
                mb_type= s->mb_type[xy];
4688 4689
            }

4690 4691 4692 4693
            /* write gob / video packet header  */
            if(s->rtp_mode){
                int current_packet_size, is_gob_start;
                
4694
                current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710
                
                is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0; 
                
                if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
                
                switch(s->codec_id){
                case CODEC_ID_H263:
                case CODEC_ID_H263P:
                    if(!s->h263_slice_structured)
                        if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
                    break;
                case CODEC_ID_MPEG2VIDEO:
                    if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
                case CODEC_ID_MPEG1VIDEO:
                    if(s->mb_skip_run) is_gob_start=0;
                    break;
M
Michael Niedermayer 已提交
4711
                }
4712

4713 4714 4715
                if(is_gob_start){
                    if(s->start_mb_y != mb_y || mb_x!=0){
                        write_slice_end(s);
4716

4717 4718
                        if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
                            ff_mpeg4_init_partitions(s);
M
Michael Niedermayer 已提交
4719 4720
                        }
                    }
M
Michael Niedermayer 已提交
4721
                
4722
                    assert((put_bits_count(&s->pb)&7) == 0);
M
Michael Niedermayer 已提交
4723
                    current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4724 4725
                    
                    if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4726
                        int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
4727 4728 4729 4730 4731 4732 4733 4734 4735
                        int d= 100 / s->avctx->error_rate;
                        if(r % d == 0){
                            current_packet_size=0;
#ifndef ALT_BITSTREAM_WRITER
                            s->pb.buf_ptr= s->ptr_lastgob;
#endif
                            assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
                        }
                    }
4736 4737 4738 4739 4740

                    if (s->avctx->rtp_callback){
                        int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
                        s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
                    }
M
Michael Niedermayer 已提交
4741 4742 4743
                    
                    switch(s->codec_id){
                    case CODEC_ID_MPEG4:
4744 4745
                        ff_mpeg4_encode_video_packet_header(s);
                        ff_mpeg4_clean_buffers(s);
M
Michael Niedermayer 已提交
4746 4747 4748
                    break;
                    case CODEC_ID_MPEG1VIDEO:
                    case CODEC_ID_MPEG2VIDEO:
4749 4750
                        ff_mpeg1_encode_slice_header(s);
                        ff_mpeg1_clean_buffers(s);
M
Michael Niedermayer 已提交
4751 4752 4753
                    break;
                    case CODEC_ID_H263:
                    case CODEC_ID_H263P:
M
Michael Niedermayer 已提交
4754
                        h263_encode_gob_header(s, mb_y);                       
M
Michael Niedermayer 已提交
4755
                    break;
M
Michael Niedermayer 已提交
4756 4757
                    }

M
Michael Niedermayer 已提交
4758
                    if(s->flags&CODEC_FLAG_PASS1){
4759
                        int bits= put_bits_count(&s->pb);
M
Michael Niedermayer 已提交
4760 4761 4762 4763
                        s->misc_bits+= bits - s->last_bits;
                        s->last_bits= bits;
                    }
    
M
Michael Niedermayer 已提交
4764
                    s->ptr_lastgob += current_packet_size;
4765 4766 4767 4768
                    s->first_slice_line=1;
                    s->resync_mb_x=mb_x;
                    s->resync_mb_y=mb_y;
                }
4769
            }
4770

4771 4772 4773
            if(  (s->resync_mb_x   == s->mb_x)
               && s->resync_mb_y+1 == s->mb_y){
                s->first_slice_line=0; 
4774 4775
            }

4776
            s->mb_skiped=0;
4777
            s->dquant=0; //only for QP_RD
4778

M
Michael Niedermayer 已提交
4779
            if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4780
                int next_block=0;
4781
                int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4782 4783

                copy_context_before_encode(&backup_s, s, -1);
4784 4785
                backup_s.pb= s->pb;
                best_s.data_partitioning= s->data_partitioning;
4786
                best_s.partitioned_frame= s->partitioned_frame;
4787 4788 4789 4790
                if(s->data_partitioning){
                    backup_s.pb2= s->pb2;
                    backup_s.tex_pb= s->tex_pb;
                }
4791

M
Michael Niedermayer 已提交
4792
                if(mb_type&CANDIDATE_MB_TYPE_INTER){
4793
                    s->mv_dir = MV_DIR_FORWARD;
M
Michael Niedermayer 已提交
4794
                    s->mv_type = MV_TYPE_16X16;
4795
                    s->mb_intra= 0;
4796 4797
                    s->mv[0][0][0] = s->p_mv_table[xy][0];
                    s->mv[0][0][1] = s->p_mv_table[xy][1];
M
Michael Niedermayer 已提交
4798
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb, 
4799
                                 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4800
                }
M
Michael Niedermayer 已提交
4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813
                if(mb_type&CANDIDATE_MB_TYPE_INTER_I){ 
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->p_field_select_table[i][xy];
                        s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
                        s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb, 
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4814 4815 4816 4817 4818
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = 0;
                    s->mv[0][0][1] = 0;
M
Michael Niedermayer 已提交
4819
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb, 
4820
                                 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
F
Fabrice Bellard 已提交
4821
                }
M
Michael Niedermayer 已提交
4822
                if(mb_type&CANDIDATE_MB_TYPE_INTER4V){                 
4823
                    s->mv_dir = MV_DIR_FORWARD;
M
Michael Niedermayer 已提交
4824 4825 4826
                    s->mv_type = MV_TYPE_8X8;
                    s->mb_intra= 0;
                    for(i=0; i<4; i++){
4827 4828
                        s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
                        s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
M
Michael Niedermayer 已提交
4829
                    }
M
Michael Niedermayer 已提交
4830
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb, 
4831
                                 &dmin, &next_block, 0, 0);
4832
                }
M
Michael Niedermayer 已提交
4833
                if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4834 4835 4836 4837 4838
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
                    s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
M
Michael Niedermayer 已提交
4839
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb, 
4840
                                 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4841
                }
M
Michael Niedermayer 已提交
4842
                if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4843 4844 4845 4846 4847
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[1][0][0] = s->b_back_mv_table[xy][0];
                    s->mv[1][0][1] = s->b_back_mv_table[xy][1];
M
Michael Niedermayer 已提交
4848
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb, 
4849
                                 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4850
                }
M
Michael Niedermayer 已提交
4851
                if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4852 4853 4854 4855 4856 4857 4858
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_16X16;
                    s->mb_intra= 0;
                    s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
                    s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
                    s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
                    s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
M
Michael Niedermayer 已提交
4859
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb, 
4860
                                 &dmin, &next_block, 0, 0);
4861
                }
M
Michael Niedermayer 已提交
4862
                if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
M
Michael Niedermayer 已提交
4863 4864 4865
                    int mx= s->b_direct_mv_table[xy][0];
                    int my= s->b_direct_mv_table[xy][1];
                    
4866 4867
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
                    s->mb_intra= 0;
M
Michael Niedermayer 已提交
4868
                    ff_mpeg4_set_direct_mv(s, mx, my);
M
Michael Niedermayer 已提交
4869
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, 
M
Michael Niedermayer 已提交
4870
                                 &dmin, &next_block, mx, my);
M
Michael Niedermayer 已提交
4871
                }
M
Michael Niedermayer 已提交
4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910
                if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){ 
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
                        s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
                        s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb, 
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){ 
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
                        s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
                        s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb, 
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){ 
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(dir=0; dir<2; dir++){
                        for(i=0; i<2; i++){
                            j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
                            s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
                            s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
                        }
                    }
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb, 
                                 &dmin, &next_block, 0, 0);
                }
                if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4911
                    s->mv_dir = 0;
M
Michael Niedermayer 已提交
4912
                    s->mv_type = MV_TYPE_16X16;
4913 4914 4915
                    s->mb_intra= 1;
                    s->mv[0][0][0] = 0;
                    s->mv[0][0][1] = 0;
M
Michael Niedermayer 已提交
4916
                    encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb, 
4917
                                 &dmin, &next_block, 0, 0);
4918 4919 4920 4921 4922 4923
                    if(s->h263_pred || s->h263_aic){
                        if(best_s.mb_intra)
                            s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
                        else
                            ff_clean_intra_table_entries(s); //old mode?
                    }
M
Michael Niedermayer 已提交
4924
                }
4925 4926 4927 4928 4929

                if(s->flags & CODEC_FLAG_QP_RD){
                    if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
                        const int last_qp= backup_s.qscale;
                        int dquant, dir, qp, dc[6];
4930
                        DCTELEM ac[6][16];
M
Michael Niedermayer 已提交
4931
                        const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944
                        
                        assert(backup_s.dquant == 0);

                        //FIXME intra
                        s->mv_dir= best_s.mv_dir;
                        s->mv_type = MV_TYPE_16X16;
                        s->mb_intra= best_s.mb_intra;
                        s->mv[0][0][0] = best_s.mv[0][0][0];
                        s->mv[0][0][1] = best_s.mv[0][0][1];
                        s->mv[1][0][0] = best_s.mv[1][0][0];
                        s->mv[1][0][1] = best_s.mv[1][0][1];
                        
                        dir= s->pict_type == B_TYPE ? 2 : 1;
M
Michael Niedermayer 已提交
4945
                        if(last_qp + dir > s->avctx->qmax) dir= -dir;
4946 4947 4948 4949 4950
                        for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
                            qp= last_qp + dquant;
                            if(qp < s->avctx->qmin || qp > s->avctx->qmax)
                                break;
                            backup_s.dquant= dquant;
M
Michael Niedermayer 已提交
4951
                            if(s->mb_intra && s->dc_val[0]){
4952 4953 4954 4955
                                for(i=0; i<6; i++){
                                    dc[i]= s->dc_val[0][ s->block_index[i] ];
                                    memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
                                }
4956
                            }
4957

M
Michael Niedermayer 已提交
4958
                            encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb, 
M
Michael Niedermayer 已提交
4959
                                         &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4960
                            if(best_s.qscale != qp){
M
Michael Niedermayer 已提交
4961
                                if(s->mb_intra && s->dc_val[0]){
4962 4963 4964 4965
                                    for(i=0; i<6; i++){
                                        s->dc_val[0][ s->block_index[i] ]= dc[i];
                                        memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
                                    }
4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978
                                }
                                if(dir > 0 && dquant==dir){
                                    dquant= 0;
                                    dir= -dir;
                                }else
                                    break;
                            }
                        }
                        qp= best_s.qscale;
                        s->current_picture.qscale_table[xy]= qp;
                    }
                }

4979
                copy_context_after_encode(s, &best_s, -1);
4980
                
4981
                pb_bits_count= put_bits_count(&s->pb);
4982 4983 4984 4985 4986
                flush_put_bits(&s->pb);
                ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
                s->pb= backup_s.pb;
                
                if(s->data_partitioning){
4987
                    pb2_bits_count= put_bits_count(&s->pb2);
4988 4989 4990 4991
                    flush_put_bits(&s->pb2);
                    ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
                    s->pb2= backup_s.pb2;
                    
4992
                    tex_pb_bits_count= put_bits_count(&s->tex_pb);
4993 4994 4995 4996
                    flush_put_bits(&s->tex_pb);
                    ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
                    s->tex_pb= backup_s.tex_pb;
                }
4997
                s->last_bits= put_bits_count(&s->pb);
4998
               
4999 5000 5001
                if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
                    ff_h263_update_motion_val(s);
        
5002 5003 5004 5005
                if(next_block==0){ //FIXME 16 vs linesize16
                    s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad                     , s->linesize  ,16);
                    s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize    , s->uvlinesize, 8);
                    s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5006 5007 5008 5009
                }

                if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
                    MPV_decode_mb(s, s->block);
F
Fabrice Bellard 已提交
5010
            } else {
5011 5012
                int motion_x, motion_y;
                s->mv_type=MV_TYPE_16X16;
5013
                // only one MB-Type possible
5014
                
5015
                switch(mb_type){
M
Michael Niedermayer 已提交
5016
                case CANDIDATE_MB_TYPE_INTRA:
5017
                    s->mv_dir = 0;
5018
                    s->mb_intra= 1;
5019 5020
                    motion_x= s->mv[0][0][0] = 0;
                    motion_y= s->mv[0][0][1] = 0;
5021
                    break;
M
Michael Niedermayer 已提交
5022
                case CANDIDATE_MB_TYPE_INTER:
5023 5024 5025 5026
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mb_intra= 0;
                    motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
                    motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5027
                    break;
M
Michael Niedermayer 已提交
5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039
                case CANDIDATE_MB_TYPE_INTER_I:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->p_field_select_table[i][xy];
                        s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
                        s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
                    }
                    motion_x = motion_y = 0;
                    break;
                case CANDIDATE_MB_TYPE_INTER4V:
5040 5041 5042 5043
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_8X8;
                    s->mb_intra= 0;
                    for(i=0; i<4; i++){
5044 5045
                        s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
                        s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5046 5047 5048
                    }
                    motion_x= motion_y= 0;
                    break;
M
Michael Niedermayer 已提交
5049
                case CANDIDATE_MB_TYPE_DIRECT:
5050 5051
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
                    s->mb_intra= 0;
5052 5053
                    motion_x=s->b_direct_mv_table[xy][0];
                    motion_y=s->b_direct_mv_table[xy][1];
M
Michael Niedermayer 已提交
5054
                    ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5055
                    break;
M
Michael Niedermayer 已提交
5056
                case CANDIDATE_MB_TYPE_BIDIR:
5057
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5058
                    s->mb_intra= 0;
5059 5060 5061 5062 5063 5064
                    motion_x=0;
                    motion_y=0;
                    s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
                    s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
                    s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
                    s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5065
                    break;
M
Michael Niedermayer 已提交
5066
                case CANDIDATE_MB_TYPE_BACKWARD:
5067 5068 5069 5070
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mb_intra= 0;
                    motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
                    motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5071
                    break;
M
Michael Niedermayer 已提交
5072
                case CANDIDATE_MB_TYPE_FORWARD:
5073 5074 5075 5076 5077
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mb_intra= 0;
                    motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
                    motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
//                    printf(" %d %d ", motion_x, motion_y);
5078
                    break;
M
Michael Niedermayer 已提交
5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113
                case CANDIDATE_MB_TYPE_FORWARD_I:
                    s->mv_dir = MV_DIR_FORWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
                        s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
                        s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
                    }
                    motion_x=motion_y=0;
                    break;
                case CANDIDATE_MB_TYPE_BACKWARD_I:
                    s->mv_dir = MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(i=0; i<2; i++){
                        j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
                        s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
                        s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
                    }
                    motion_x=motion_y=0;
                    break;
                case CANDIDATE_MB_TYPE_BIDIR_I:
                    s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
                    s->mv_type = MV_TYPE_FIELD;
                    s->mb_intra= 0;
                    for(dir=0; dir<2; dir++){
                        for(i=0; i<2; i++){
                            j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
                            s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
                            s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
                        }
                    }
                    motion_x=motion_y=0;
                    break;
5114
                default:
5115
                    motion_x=motion_y=0; //gcc warning fix
5116
                    av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5117
                }
5118

5119
                encode_mb(s, motion_x, motion_y);
5120 5121 5122

                // RAL: Update last macrobloc type
                s->last_mv_dir = s->mv_dir;
5123 5124 5125
            
                if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
                    ff_h263_update_motion_val(s);
5126
		
5127
                MPV_decode_mb(s, s->block);
F
Fabrice Bellard 已提交
5128
            }
5129

5130 5131 5132 5133 5134
            /* clean the MV table in IPS frames for direct mode in B frames */
            if(s->mb_intra /* && I,P,S_TYPE */){
                s->p_mv_table[xy][0]=0;
                s->p_mv_table[xy][1]=0;
            }
5135 5136 5137 5138 5139 5140 5141
            
            if(s->flags&CODEC_FLAG_PSNR){
                int w= 16;
                int h= 16;

                if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
                if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
M
Michael Niedermayer 已提交
5142

M
10l  
Michael Niedermayer 已提交
5143
                s->current_picture_ptr->error[0] += sse(
5144 5145
                    s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
                    s->dest[0], w, h, s->linesize);
M
10l  
Michael Niedermayer 已提交
5146
                s->current_picture_ptr->error[1] += sse(
5147 5148
                    s, s->new_picture.data[1] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,
                    s->dest[1], w>>1, h>>1, s->uvlinesize);
M
10l  
Michael Niedermayer 已提交
5149
                s->current_picture_ptr->error[2] += sse(
5150 5151
                    s, s->new_picture    .data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,
                    s->dest[2], w>>1, h>>1, s->uvlinesize);
5152
            }
M
Maarten Daniels 已提交
5153 5154 5155 5156
            if(s->loop_filter){
                if(s->out_format == FMT_H263)
                    ff_h263_loop_filter(s);
            }
5157
//printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
F
Fabrice Bellard 已提交
5158 5159
        }
    }
5160

5161
    //not beautifull here but we must write it before flushing so it has to be here
5162
    if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
M
Michael Niedermayer 已提交
5163
        msmpeg4_encode_ext_header(s);
5164

5165 5166
    write_slice_end(s);

5167
    /* Send the last GOB if RTP */    
M
Michael Niedermayer 已提交
5168
    if (s->avctx->rtp_callback) {
5169
        int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5170
        pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5171
        /* Call the RTP callback to send the last GOB */
5172
        emms_c();
5173
        s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5174
    }
5175 5176 5177 5178 5179 5180

    return 0;
}

#define MERGE(field) dst->field += src->field; src->field=0
static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5181 5182 5183
    MERGE(me.scene_change_score);
    MERGE(me.mc_mb_var_sum_temp);
    MERGE(me.mb_var_sum_temp);
5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216
}

static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
    int i;

    MERGE(dct_count[0]); //note, the other dct vars are not part of the context
    MERGE(dct_count[1]);
    MERGE(mv_bits);
    MERGE(i_tex_bits);
    MERGE(p_tex_bits);
    MERGE(i_count);
    MERGE(f_count);
    MERGE(b_count);
    MERGE(skip_count);
    MERGE(misc_bits);
    MERGE(error_count);
    MERGE(padding_bug_score);

    if(dst->avctx->noise_reduction){
        for(i=0; i<64; i++){
            MERGE(dct_error_sum[0][i]);
            MERGE(dct_error_sum[1][i]);
        }
    }
    
    assert(put_bits_count(&src->pb) % 8 ==0);
    assert(put_bits_count(&dst->pb) % 8 ==0);
    ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
    flush_put_bits(&dst->pb);
}

static void encode_picture(MpegEncContext *s, int picture_number)
{
5217
    int i;
5218 5219 5220 5221 5222
    int bits;

    s->picture_number = picture_number;
    
    /* Reset the average MB variance */
5223 5224
    s->me.mb_var_sum_temp    =
    s->me.mc_mb_var_sum_temp = 0;
5225 5226 5227 5228

    /* we need to initialize some time vars before we can encode b-frames */
    // RAL: Condition added for MPEG1VIDEO
    if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5229
        ff_set_mpeg4_time(s, s->picture_number);  //FIXME rename and use has_b_frames or similar
5230
        
5231
    s->me.scene_change_score=0;
5232
    
5233
//    s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244
    
    if(s->pict_type==I_TYPE){
        if(s->msmpeg4_version >= 3) s->no_rounding=1;
        else                        s->no_rounding=0;
    }else if(s->pict_type!=B_TYPE){
        if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
            s->no_rounding ^= 1;          
    }
    
    s->mb_intra=0; //for the rate distoration & bit compare functions
    for(i=1; i<s->avctx->thread_count; i++){
5245
        ff_update_duplicate_context(s->thread_context[i], s);
5246
    }
5247 5248 5249

    ff_init_me(s);

5250 5251
    /* Estimate motion for every MB */
    if(s->pict_type != I_TYPE){
5252 5253
        s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
        s->lambda2= (s->lambda2* s->avctx->me_penalty_compensation + 128)>>8;
5254
        if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267
            if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
                s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
            }
        }

        s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
    }else /* if(s->pict_type == I_TYPE) */{
        /* I-Frame */
        for(i=0; i<s->mb_stride*s->mb_height; i++)
            s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
        
        if(!s->fixed_qscale){
            /* finding spatial complexity for I-frame rate control */
5268
            s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5269 5270
        }
    }
5271 5272 5273
    for(i=1; i<s->avctx->thread_count; i++){
        merge_context_after_me(s, s->thread_context[i]);
    }
5274 5275
    s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
    s->current_picture.   mb_var_sum= s->current_picture_ptr->   mb_var_sum= s->me.   mb_var_sum_temp;
5276 5277
    emms_c();

5278
    if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298
        s->pict_type= I_TYPE;
        for(i=0; i<s->mb_stride*s->mb_height; i++)
            s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
//printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
    }

    if(!s->umvplus){
        if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
            s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);

            if(s->flags & CODEC_FLAG_INTERLACED_ME){
                int a,b;
                a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
                b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
                s->f_code= FFMAX(s->f_code, FFMAX(a,b));
            }
                    
            ff_fix_long_p_mvs(s);
            ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
            if(s->flags & CODEC_FLAG_INTERLACED_ME){
5299
                int j;
5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323
                for(i=0; i<2; i++){
                    for(j=0; j<2; j++)
                        ff_fix_long_mvs(s, s->p_field_select_table[i], j, 
                                        s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
                }
            }
        }

        if(s->pict_type==B_TYPE){
            int a, b;

            a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
            b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
            s->f_code = FFMAX(a, b);

            a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
            b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
            s->b_code = FFMAX(a, b);

            ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
            ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
            ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
            ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
            if(s->flags & CODEC_FLAG_INTERLACED_ME){
5324
                int dir, j;
5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369
                for(dir=0; dir<2; dir++){
                    for(i=0; i<2; i++){
                        for(j=0; j<2; j++){
                            int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I) 
                                          : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
                            ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j, 
                                            s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
                        }
                    }
                }
            }
        }
    }

    if (!s->fixed_qscale) 
        s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr

    if(s->adaptive_quant){
        switch(s->codec_id){
        case CODEC_ID_MPEG4:
            ff_clean_mpeg4_qscales(s);
            break;
        case CODEC_ID_H263:
        case CODEC_ID_H263P:
        case CODEC_ID_FLV1:
            ff_clean_h263_qscales(s);
            break;
        }

        s->lambda= s->lambda_table[0];
        //FIXME broken
    }else
        s->lambda= s->current_picture.quality;
//printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
    update_qscale(s);
    
    if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE)) 
        s->qscale= 3; //reduce cliping problems
        
    if (s->out_format == FMT_MJPEG) {
        /* for mjpeg, we do include qscale in the matrix */
        s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
        for(i=1;i<64;i++){
            int j= s->dsp.idct_permutation[i];

5370
            s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5371 5372
        }
        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, 
5373
                       s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5374 5375 5376 5377
        s->qscale= 8;
    }
    
    //FIXME var duplication
5378
    s->current_picture_ptr->key_frame=
5379
    s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5380
    s->current_picture_ptr->pict_type=
5381 5382 5383 5384 5385 5386 5387 5388 5389 5390
    s->current_picture.pict_type= s->pict_type;

    if(s->current_picture.key_frame)
        s->picture_in_gop_number=0;

    s->last_bits= put_bits_count(&s->pb);
    switch(s->out_format) {
    case FMT_MJPEG:
        mjpeg_picture_header(s);
        break;
5391 5392 5393
    case FMT_H261:
        ff_h261_encode_picture_header(s, picture_number);
        break;
5394 5395 5396 5397 5398 5399 5400 5401 5402
    case FMT_H263:
        if (s->codec_id == CODEC_ID_WMV2) 
            ff_wmv2_encode_picture_header(s, picture_number);
        else if (s->h263_msmpeg4) 
            msmpeg4_encode_picture_header(s, picture_number);
        else if (s->h263_pred)
            mpeg4_encode_picture_header(s, picture_number);
        else if (s->codec_id == CODEC_ID_RV10) 
            rv10_encode_picture_header(s, picture_number);
M
Michael Niedermayer 已提交
5403 5404
        else if (s->codec_id == CODEC_ID_RV20) 
            rv20_encode_picture_header(s, picture_number);
5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428
        else if (s->codec_id == CODEC_ID_FLV1)
            ff_flv_encode_picture_header(s, picture_number);
        else
            h263_encode_picture_header(s, picture_number);
        break;
    case FMT_MPEG1:
        mpeg1_encode_picture_header(s, picture_number);
        break;
    case FMT_H264:
        break;
    default:
        assert(0);
    }
    bits= put_bits_count(&s->pb);
    s->header_bits= bits - s->last_bits;
        
    for(i=1; i<s->avctx->thread_count; i++){
        update_duplicate_context_after_me(s->thread_context[i], s);
    }
    s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
    for(i=1; i<s->avctx->thread_count; i++){
        merge_context_after_encode(s, s->thread_context[i]);
    }
    emms_c();
F
Fabrice Bellard 已提交
5429 5430
}

5431 5432
#endif //CONFIG_ENCODERS

M
Michael Niedermayer 已提交
5433
static void  denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5434 5435 5436
    const int intra= s->mb_intra;
    int i;

5437 5438
    s->dct_count[intra]++;

5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456
    for(i=0; i<64; i++){
        int level= block[i];

        if(level){
            if(level>0){
                s->dct_error_sum[intra][i] += level;
                level -= s->dct_offset[intra][i];
                if(level<0) level=0;
            }else{
                s->dct_error_sum[intra][i] -= level;
                level += s->dct_offset[intra][i];
                if(level>0) level=0;
            }
            block[i]= level;
        }
    }
}

5457 5458
#ifdef CONFIG_ENCODERS

M
Michael Niedermayer 已提交
5459 5460 5461 5462
static int dct_quantize_trellis_c(MpegEncContext *s, 
                        DCTELEM *block, int n,
                        int qscale, int *overflow){
    const int *qmat;
5463
    const uint8_t *scantable= s->intra_scantable.scantable;
5464
    const uint8_t *perm_scantable= s->intra_scantable.permutated;
M
Michael Niedermayer 已提交
5465 5466 5467 5468 5469 5470
    int max=0;
    unsigned int threshold1, threshold2;
    int bias=0;
    int run_tab[65];
    int level_tab[65];
    int score_tab[65];
5471 5472
    int survivor[65];
    int survivor_count;
5473 5474 5475
    int last_run=0;
    int last_level=0;
    int last_score= 0;
5476
    int last_i;
5477
    int coeff[2][64];
M
Michael Niedermayer 已提交
5478
    int coeff_count[64];
5479
    int qmul, qadd, start_i, last_non_zero, i, dc;
M
Michael Niedermayer 已提交
5480 5481 5482
    const int esc_length= s->ac_esc_length;
    uint8_t * length;
    uint8_t * last_length;
5483
    const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
M
Michael Niedermayer 已提交
5484
        
5485
    s->dsp.fdct (block);
5486 5487
    
    if(s->dct_error_sum)
M
Michael Niedermayer 已提交
5488
        s->denoise_dct(s, block);
M
Michael Niedermayer 已提交
5489 5490
    qmul= qscale*16;
    qadd= ((qscale-1)|1)*8;
5491

M
Michael Niedermayer 已提交
5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510
    if (s->mb_intra) {
        int q;
        if (!s->h263_aic) {
            if (n < 4)
                q = s->y_dc_scale;
            else
                q = s->c_dc_scale;
            q = q << 3;
        } else{
            /* For AIC we skip quant/dequant of INTRADC */
            q = 1 << 3;
            qadd=0;
        }
            
        /* note: block[0] is assumed to be positive */
        block[0] = (block[0] + (q >> 1)) / q;
        start_i = 1;
        last_non_zero = 0;
        qmat = s->q_intra_matrix[qscale];
5511
        if(s->mpeg_quant || s->out_format == FMT_MPEG1)
M
Michael Niedermayer 已提交
5512 5513 5514 5515 5516 5517 5518 5519 5520 5521
            bias= 1<<(QMAT_SHIFT-1);
        length     = s->intra_ac_vlc_length;
        last_length= s->intra_ac_vlc_last_length;
    } else {
        start_i = 0;
        last_non_zero = -1;
        qmat = s->q_inter_matrix[qscale];
        length     = s->inter_ac_vlc_length;
        last_length= s->inter_ac_vlc_last_length;
    }
5522
    last_i= start_i;
M
Michael Niedermayer 已提交
5523 5524 5525

    threshold1= (1<<QMAT_SHIFT) - bias - 1;
    threshold2= (threshold1<<1);
5526

5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537
    for(i=63; i>=start_i; i--) {
        const int j = scantable[i];
        int level = block[j] * qmat[j];

        if(((unsigned)(level+threshold1))>threshold2){
            last_non_zero = i;
            break;
        }
    }

    for(i=start_i; i<=last_non_zero; i++) {
M
Michael Niedermayer 已提交
5538
        const int j = scantable[i];
5539
        int level = block[j] * qmat[j];
M
Michael Niedermayer 已提交
5540 5541 5542 5543 5544 5545

//        if(   bias+level >= (1<<(QMAT_SHIFT - 3))
//           || bias-level >= (1<<(QMAT_SHIFT - 3))){
        if(((unsigned)(level+threshold1))>threshold2){
            if(level>0){
                level= (bias + level)>>QMAT_SHIFT;
5546 5547
                coeff[0][i]= level;
                coeff[1][i]= level-1;
5548
//                coeff[2][k]= level-2;
M
Michael Niedermayer 已提交
5549 5550
            }else{
                level= (bias - level)>>QMAT_SHIFT;
5551 5552
                coeff[0][i]= -level;
                coeff[1][i]= -level+1;
5553
//                coeff[2][k]= -level+2;
M
Michael Niedermayer 已提交
5554
            }
5555 5556
            coeff_count[i]= FFMIN(level, 2);
            assert(coeff_count[i]);
M
Michael Niedermayer 已提交
5557 5558
            max |=level;
        }else{
5559 5560
            coeff[0][i]= (level>>31)|1;
            coeff_count[i]= 1;
M
Michael Niedermayer 已提交
5561 5562 5563 5564 5565 5566 5567 5568 5569 5570
        }
    }
    
    *overflow= s->max_qcoeff < max; //overflow might have happend
    
    if(last_non_zero < start_i){
        memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
        return last_non_zero;
    }

5571 5572 5573
    score_tab[start_i]= 0;
    survivor[0]= start_i;
    survivor_count= 1;
5574
    
5575 5576 5577
    for(i=start_i; i<=last_non_zero; i++){
        int level_index, j;
        const int dct_coeff= ABS(block[ scantable[i] ]);
M
Michael Niedermayer 已提交
5578
        const int zero_distoration= dct_coeff*dct_coeff;
5579
        int best_score=256*256*256*120;
M
Michael Niedermayer 已提交
5580 5581 5582
        for(level_index=0; level_index < coeff_count[i]; level_index++){
            int distoration;
            int level= coeff[level_index][i];
M
cleanup  
Michael Niedermayer 已提交
5583
            const int alevel= ABS(level);
M
Michael Niedermayer 已提交
5584 5585 5586 5587 5588
            int unquant_coeff;
            
            assert(level);

            if(s->out_format == FMT_H263){
M
cleanup  
Michael Niedermayer 已提交
5589
                unquant_coeff= alevel*qmul + qadd;
5590
            }else{ //MPEG1
5591
                j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5592
                if(s->mb_intra){
M
cleanup  
Michael Niedermayer 已提交
5593
                        unquant_coeff = (int)(  alevel  * qscale * s->intra_matrix[j]) >> 3;
5594 5595
                        unquant_coeff =   (unquant_coeff - 1) | 1;
                }else{
M
cleanup  
Michael Niedermayer 已提交
5596
                        unquant_coeff = (((  alevel  << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5597 5598 5599 5600
                        unquant_coeff =   (unquant_coeff - 1) | 1;
                }
                unquant_coeff<<= 3;
            }
5601

5602
            distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
M
Michael Niedermayer 已提交
5603 5604
            level+=64;
            if((level&(~127)) == 0){
5605 5606
                for(j=survivor_count-1; j>=0; j--){
                    int run= i - survivor[j];
5607
                    int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
M
Michael Niedermayer 已提交
5608 5609 5610
                    score += score_tab[i-run];
                    
                    if(score < best_score){
5611
                        best_score= score;
M
Michael Niedermayer 已提交
5612 5613 5614 5615 5616 5617
                        run_tab[i+1]= run;
                        level_tab[i+1]= level-64;
                    }
                }

                if(s->out_format == FMT_H263){
5618 5619
                    for(j=survivor_count-1; j>=0; j--){
                        int run= i - survivor[j];
5620
                        int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
M
Michael Niedermayer 已提交
5621
                        score += score_tab[i-run];
5622 5623 5624 5625 5626
                        if(score < last_score){
                            last_score= score;
                            last_run= run;
                            last_level= level-64;
                            last_i= i+1;
M
Michael Niedermayer 已提交
5627 5628 5629 5630 5631
                        }
                    }
                }
            }else{
                distoration += esc_length*lambda;
5632 5633
                for(j=survivor_count-1; j>=0; j--){
                    int run= i - survivor[j];
M
Michael Niedermayer 已提交
5634 5635 5636
                    int score= distoration + score_tab[i-run];
                    
                    if(score < best_score){
5637
                        best_score= score;
M
Michael Niedermayer 已提交
5638 5639 5640 5641 5642 5643
                        run_tab[i+1]= run;
                        level_tab[i+1]= level-64;
                    }
                }

                if(s->out_format == FMT_H263){
5644 5645
                  for(j=survivor_count-1; j>=0; j--){
                        int run= i - survivor[j];
M
Michael Niedermayer 已提交
5646
                        int score= distoration + score_tab[i-run];
5647 5648 5649 5650 5651
                        if(score < last_score){
                            last_score= score;
                            last_run= run;
                            last_level= level-64;
                            last_i= i+1;
M
Michael Niedermayer 已提交
5652 5653 5654 5655 5656
                        }
                    }
                }
            }
        }
5657
        
5658 5659
        score_tab[i+1]= best_score;

5660
        //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5661 5662 5663 5664 5665 5666 5667 5668 5669 5670
        if(last_non_zero <= 27){
            for(; survivor_count; survivor_count--){
                if(score_tab[ survivor[survivor_count-1] ] <= best_score)
                    break;
            }
        }else{
            for(; survivor_count; survivor_count--){
                if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
                    break;
            }
5671
        }
5672 5673

        survivor[ survivor_count++ ]= i+1;
M
Michael Niedermayer 已提交
5674
    }
5675

M
Michael Niedermayer 已提交
5676
    if(s->out_format != FMT_H263){
5677
        last_score= 256*256*256*120;
5678
        for(i= survivor[0]; i<=last_non_zero + 1; i++){
5679
            int score= score_tab[i];
5680 5681
            if(i) score += lambda*2; //FIXME exacter?

5682 5683 5684 5685 5686 5687
            if(score < last_score){
                last_score= score;
                last_i= i;
                last_level= level_tab[i];
                last_run= run_tab[i];
            }
M
Michael Niedermayer 已提交
5688 5689
        }
    }
5690

5691
    s->coded_score[n] = last_score;
M
Michael Niedermayer 已提交
5692
    
M
cleanup  
Michael Niedermayer 已提交
5693
    dc= ABS(block[0]);
5694
    last_non_zero= last_i - 1;
M
Michael Niedermayer 已提交
5695 5696 5697 5698
    memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
    
    if(last_non_zero < start_i)
        return last_non_zero;
5699

5700 5701 5702
    if(last_non_zero == 0 && start_i == 0){
        int best_level= 0;
        int best_score= dc * dc;
5703
        
5704
        for(i=0; i<coeff_count[0]; i++){
5705
            int level= coeff[i][0];
M
cleanup  
Michael Niedermayer 已提交
5706 5707
            int alevel= ABS(level);
            int unquant_coeff, score, distortion;
5708 5709

            if(s->out_format == FMT_H263){
M
cleanup  
Michael Niedermayer 已提交
5710
                    unquant_coeff= (alevel*qmul + qadd)>>3;
5711
            }else{ //MPEG1
M
cleanup  
Michael Niedermayer 已提交
5712 5713
                    unquant_coeff = (((  alevel  << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
                    unquant_coeff =   (unquant_coeff - 1) | 1;
5714 5715 5716 5717
            }
            unquant_coeff = (unquant_coeff + 4) >> 3;
            unquant_coeff<<= 3 + 3;

M
cleanup  
Michael Niedermayer 已提交
5718
            distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5719
            level+=64;
M
cleanup  
Michael Niedermayer 已提交
5720 5721
            if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
            else                    score= distortion + esc_length*lambda;
5722

5723 5724
            if(score < best_score){
                best_score= score;
5725
                best_level= level - 64;
5726 5727 5728
            }
        }
        block[0]= best_level;
5729 5730 5731
        s->coded_score[n] = best_score - dc*dc;
        if(best_level == 0) return -1;
        else                return last_non_zero;
5732
    }
5733

5734 5735
    i= last_i;
    assert(last_level);
5736 5737

    block[ perm_scantable[last_non_zero] ]= last_level;
5738
    i -= last_run + 1;
M
Michael Niedermayer 已提交
5739
    
5740 5741
    for(; i>start_i; i -= run_tab[i] + 1){
        block[ perm_scantable[i-1] ]= level_tab[i];
M
Michael Niedermayer 已提交
5742 5743 5744 5745 5746
    }

    return last_non_zero;
}

M
Michael Niedermayer 已提交
5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772
//#define REFINE_STATS 1
static int16_t basis[64][64];

static void build_basis(uint8_t *perm){
    int i, j, x, y;
    emms_c();
    for(i=0; i<8; i++){
        for(j=0; j<8; j++){
            for(y=0; y<8; y++){
                for(x=0; x<8; x++){
                    double s= 0.25*(1<<BASIS_SHIFT);
                    int index= 8*i + j;
                    int perm_index= perm[index];
                    if(i==0) s*= sqrt(0.5);
                    if(j==0) s*= sqrt(0.5);
                    basis[perm_index][8*x + y]= lrintf(s * cos((M_PI/8.0)*i*(x+0.5)) * cos((M_PI/8.0)*j*(y+0.5)));
                }
            }
        }
    }
}

static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
                        DCTELEM *block, int16_t *weight, DCTELEM *orig,
                        int n, int qscale){
    int16_t rem[64];
5773
    DCTELEM d1[64] __align16;
M
Michael Niedermayer 已提交
5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834
    const int *qmat;
    const uint8_t *scantable= s->intra_scantable.scantable;
    const uint8_t *perm_scantable= s->intra_scantable.permutated;
//    unsigned int threshold1, threshold2;
//    int bias=0;
    int run_tab[65];
    int prev_run=0;
    int prev_level=0;
    int qmul, qadd, start_i, last_non_zero, i, dc;
    uint8_t * length;
    uint8_t * last_length;
    int lambda;
    int rle_index, run, q, sum;
#ifdef REFINE_STATS
static int count=0;
static int after_last=0;
static int to_zero=0;
static int from_zero=0;
static int raise=0;
static int lower=0;
static int messed_sign=0;
#endif

    if(basis[0][0] == 0)
        build_basis(s->dsp.idct_permutation);
    
    qmul= qscale*2;
    qadd= (qscale-1)|1;
    if (s->mb_intra) {
        if (!s->h263_aic) {
            if (n < 4)
                q = s->y_dc_scale;
            else
                q = s->c_dc_scale;
        } else{
            /* For AIC we skip quant/dequant of INTRADC */
            q = 1;
            qadd=0;
        }
        q <<= RECON_SHIFT-3;
        /* note: block[0] is assumed to be positive */
        dc= block[0]*q;
//        block[0] = (block[0] + (q >> 1)) / q;
        start_i = 1;
        qmat = s->q_intra_matrix[qscale];
//        if(s->mpeg_quant || s->out_format == FMT_MPEG1)
//            bias= 1<<(QMAT_SHIFT-1);
        length     = s->intra_ac_vlc_length;
        last_length= s->intra_ac_vlc_last_length;
    } else {
        dc= 0;
        start_i = 0;
        qmat = s->q_inter_matrix[qscale];
        length     = s->inter_ac_vlc_length;
        last_length= s->inter_ac_vlc_last_length;
    }
    last_non_zero = s->block_last_index[n];

#ifdef REFINE_STATS
{START_TIMER
#endif
5835 5836 5837
    dc += (1<<(RECON_SHIFT-1));
    for(i=0; i<64; i++){
        rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME  use orig dirrectly insteadof copying to rem[]
M
Michael Niedermayer 已提交
5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874
    }
#ifdef REFINE_STATS
STOP_TIMER("memset rem[]")}
#endif
    sum=0;
    for(i=0; i<64; i++){
        int one= 36;
        int qns=4;
        int w;

        w= ABS(weight[i]) + qns*one;
        w= 15 + (48*qns*one + w/2)/w; // 16 .. 63

        weight[i] = w;
//        w=weight[i] = (63*qns + (w/2)) / w;
         
        assert(w>0);
        assert(w<(1<<6));
        sum += w*w;
    }
    lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
#ifdef REFINE_STATS
{START_TIMER
#endif
    run=0;
    rle_index=0;
    for(i=start_i; i<=last_non_zero; i++){
        int j= perm_scantable[i];
        const int level= block[j];
        int coeff;
        
        if(level){
            if(level<0) coeff= qmul*level - qadd;
            else        coeff= qmul*level + qadd;
            run_tab[rle_index++]=run;
            run=0;

5875
            s->dsp.add_8x8basis(rem, basis[j], coeff);
M
Michael Niedermayer 已提交
5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888
        }else{
            run++;
        }
    }
#ifdef REFINE_STATS
if(last_non_zero>0){
STOP_TIMER("init rem[]")
}
}

{START_TIMER
#endif
    for(;;){
5889
        int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
M
Michael Niedermayer 已提交
5890 5891
        int best_coeff=0;
        int best_change=0;
5892
        int run2, best_unquant_change=0, analyze_gradient;
M
Michael Niedermayer 已提交
5893 5894 5895
#ifdef REFINE_STATS
{START_TIMER
#endif
5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916
        analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;

        if(analyze_gradient){
#ifdef REFINE_STATS
{START_TIMER
#endif
            for(i=0; i<64; i++){
                int w= weight[i];
            
                d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
            }
#ifdef REFINE_STATS
STOP_TIMER("rem*w*w")}
{START_TIMER
#endif
            s->dsp.fdct(d1);
#ifdef REFINE_STATS
STOP_TIMER("dct")}
#endif
        }

M
Michael Niedermayer 已提交
5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932
        if(start_i){
            const int level= block[0];
            int change, old_coeff;

            assert(s->mb_intra);
            
            old_coeff= q*level;
            
            for(change=-1; change<=1; change+=2){
                int new_level= level + change;
                int score, new_coeff;
                
                new_coeff= q*new_level;
                if(new_coeff >= 2048 || new_coeff < 0)
                    continue;

5933
                score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
M
Michael Niedermayer 已提交
5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992
                if(score<best_score){
                    best_score= score;
                    best_coeff= 0;
                    best_change= change;
                    best_unquant_change= new_coeff - old_coeff;
                }
            }
        }
        
        run=0;
        rle_index=0;
        run2= run_tab[rle_index++];
        prev_level=0;
        prev_run=0;

        for(i=start_i; i<64; i++){
            int j= perm_scantable[i];
            const int level= block[j];
            int change, old_coeff;

            if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
                break;

            if(level){
                if(level<0) old_coeff= qmul*level - qadd;
                else        old_coeff= qmul*level + qadd;
                run2= run_tab[rle_index++]; //FIXME ! maybe after last
            }else{
                old_coeff=0;
                run2--;
                assert(run2>=0 || i >= last_non_zero );
            }
            
            for(change=-1; change<=1; change+=2){
                int new_level= level + change;
                int score, new_coeff, unquant_change;
                
                score=0;
                if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
                   continue;

                if(new_level){
                    if(new_level<0) new_coeff= qmul*new_level - qadd;
                    else            new_coeff= qmul*new_level + qadd;
                    if(new_coeff >= 2048 || new_coeff <= -2048)
                        continue;
                    //FIXME check for overflow
                    
                    if(level){
                        if(level < 63 && level > -63){
                            if(i < last_non_zero)
                                score +=   length[UNI_AC_ENC_INDEX(run, new_level+64)]
                                         - length[UNI_AC_ENC_INDEX(run, level+64)];
                            else
                                score +=   last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
                                         - last_length[UNI_AC_ENC_INDEX(run, level+64)];
                        }
                    }else{
                        assert(ABS(new_level)==1);
5993 5994 5995 5996 5997 5998 5999
                        
                        if(analyze_gradient){
                            int g= d1[ scantable[i] ];
                            if(g && (g^new_level) >= 0)
                                continue;
                        }

M
Michael Niedermayer 已提交
6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055
                        if(i < last_non_zero){
                            int next_i= i + run2 + 1;
                            int next_level= block[ perm_scantable[next_i] ] + 64;
                            
                            if(next_level&(~127))
                                next_level= 0;

                            if(next_i < last_non_zero)
                                score +=   length[UNI_AC_ENC_INDEX(run, 65)]
                                         + length[UNI_AC_ENC_INDEX(run2, next_level)]
                                         - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
                            else
                                score +=  length[UNI_AC_ENC_INDEX(run, 65)]
                                        + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
                                        - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
                        }else{
                            score += last_length[UNI_AC_ENC_INDEX(run, 65)];
                            if(prev_level){
                                score +=  length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
                                        - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
                            }
                        }
                    }
                }else{
                    new_coeff=0;
                    assert(ABS(level)==1);

                    if(i < last_non_zero){
                        int next_i= i + run2 + 1;
                        int next_level= block[ perm_scantable[next_i] ] + 64;
                            
                        if(next_level&(~127))
                            next_level= 0;

                        if(next_i < last_non_zero)
                            score +=   length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
                                     - length[UNI_AC_ENC_INDEX(run2, next_level)]
                                     - length[UNI_AC_ENC_INDEX(run, 65)];
                        else
                            score +=   last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
                                     - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
                                     - length[UNI_AC_ENC_INDEX(run, 65)];
                    }else{
                        score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
                        if(prev_level){
                            score +=  last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
                                    - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
                        }
                    }
                }
                
                score *= lambda;

                unquant_change= new_coeff - old_coeff;
                assert((score < 100*lambda && score > -100*lambda) || lambda==0);
                
6056
                score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
M
Michael Niedermayer 已提交
6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129
                if(score<best_score){
                    best_score= score;
                    best_coeff= i;
                    best_change= change;
                    best_unquant_change= unquant_change;
                }
            }
            if(level){
                prev_level= level + 64;
                if(prev_level&(~127))
                    prev_level= 0;
                prev_run= run;
                run=0;
            }else{
                run++;
            }
        }
#ifdef REFINE_STATS
STOP_TIMER("iterative step")}
#endif

        if(best_change){
            int j= perm_scantable[ best_coeff ];
            
            block[j] += best_change;
            
            if(best_coeff > last_non_zero){
                last_non_zero= best_coeff;
                assert(block[j]);
#ifdef REFINE_STATS
after_last++;
#endif
            }else{
#ifdef REFINE_STATS
if(block[j]){
    if(block[j] - best_change){
        if(ABS(block[j]) > ABS(block[j] - best_change)){
            raise++;
        }else{
            lower++;
        }
    }else{
        from_zero++;
    }
}else{
    to_zero++;
}
#endif
                for(; last_non_zero>=start_i; last_non_zero--){
                    if(block[perm_scantable[last_non_zero]])
                        break;
                }
            }
#ifdef REFINE_STATS
count++;
if(256*256*256*64 % count == 0){
    printf("after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
}
#endif
            run=0;
            rle_index=0;
            for(i=start_i; i<=last_non_zero; i++){
                int j= perm_scantable[i];
                const int level= block[j];
        
                 if(level){
                     run_tab[rle_index++]=run;
                     run=0;
                 }else{
                     run++;
                 }
            }
            
6130
            s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
M
Michael Niedermayer 已提交
6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144
        }else{
            break;
        }
    }
#ifdef REFINE_STATS
if(last_non_zero>0){
STOP_TIMER("iterative search")
}
}
#endif

    return last_non_zero;
}

M
Michael Niedermayer 已提交
6145
static int dct_quantize_c(MpegEncContext *s, 
F
Fabrice Bellard 已提交
6146
                        DCTELEM *block, int n,
6147
                        int qscale, int *overflow)
F
Fabrice Bellard 已提交
6148
{
6149
    int i, j, level, last_non_zero, q, start_i;
F
Fabrice Bellard 已提交
6150
    const int *qmat;
6151
    const uint8_t *scantable= s->intra_scantable.scantable;
6152 6153 6154
    int bias;
    int max=0;
    unsigned int threshold1, threshold2;
6155

6156
    s->dsp.fdct (block);
F
Fabrice Bellard 已提交
6157

6158
    if(s->dct_error_sum)
M
Michael Niedermayer 已提交
6159
        s->denoise_dct(s, block);
6160

F
Fabrice Bellard 已提交
6161
    if (s->mb_intra) {
6162 6163 6164 6165 6166 6167 6168 6169 6170 6171
        if (!s->h263_aic) {
            if (n < 4)
                q = s->y_dc_scale;
            else
                q = s->c_dc_scale;
            q = q << 3;
        } else
            /* For AIC we skip quant/dequant of INTRADC */
            q = 1 << 3;
            
F
Fabrice Bellard 已提交
6172 6173
        /* note: block[0] is assumed to be positive */
        block[0] = (block[0] + (q >> 1)) / q;
6174
        start_i = 1;
F
Fabrice Bellard 已提交
6175
        last_non_zero = 0;
6176
        qmat = s->q_intra_matrix[qscale];
M
Michael Niedermayer 已提交
6177
        bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
F
Fabrice Bellard 已提交
6178
    } else {
6179
        start_i = 0;
F
Fabrice Bellard 已提交
6180
        last_non_zero = -1;
6181
        qmat = s->q_inter_matrix[qscale];
M
Michael Niedermayer 已提交
6182
        bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
F
Fabrice Bellard 已提交
6183
    }
M
Michael Niedermayer 已提交
6184 6185
    threshold1= (1<<QMAT_SHIFT) - bias - 1;
    threshold2= (threshold1<<1);
6186 6187 6188
    for(i=63;i>=start_i;i--) {
        j = scantable[i];
        level = block[j] * qmat[j];
F
Fabrice Bellard 已提交
6189

6190 6191 6192 6193 6194 6195 6196 6197
        if(((unsigned)(level+threshold1))>threshold2){
            last_non_zero = i;
            break;
        }else{
            block[j]=0;
        }
    }
    for(i=start_i; i<=last_non_zero; i++) {
M
Michael Niedermayer 已提交
6198
        j = scantable[i];
6199
        level = block[j] * qmat[j];
F
Fabrice Bellard 已提交
6200

M
Michael Niedermayer 已提交
6201 6202
//        if(   bias+level >= (1<<QMAT_SHIFT)
//           || bias-level >= (1<<QMAT_SHIFT)){
6203 6204
        if(((unsigned)(level+threshold1))>threshold2){
            if(level>0){
M
Michael Niedermayer 已提交
6205
                level= (bias + level)>>QMAT_SHIFT;
6206 6207
                block[j]= level;
            }else{
M
Michael Niedermayer 已提交
6208
                level= (bias - level)>>QMAT_SHIFT;
6209 6210 6211 6212 6213
                block[j]= -level;
            }
            max |=level;
        }else{
            block[j]=0;
F
Fabrice Bellard 已提交
6214 6215
        }
    }
6216 6217
    *overflow= s->max_qcoeff < max; //overflow might have happend
    
M
Michael Niedermayer 已提交
6218
    /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6219 6220
    if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
	ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
M
Michael Niedermayer 已提交
6221

F
Fabrice Bellard 已提交
6222 6223 6224
    return last_non_zero;
}

6225 6226
#endif //CONFIG_ENCODERS

6227
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, 
6228
                                   DCTELEM *block, int n, int qscale)
F
Fabrice Bellard 已提交
6229
{
M
Michael Niedermayer 已提交
6230
    int i, level, nCoeffs;
6231
    const uint16_t *quant_matrix;
F
Fabrice Bellard 已提交
6232

6233
    nCoeffs= s->block_last_index[n];
M
Michael Niedermayer 已提交
6234
    
6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252
    if (n < 4) 
        block[0] = block[0] * s->y_dc_scale;
    else
        block[0] = block[0] * s->c_dc_scale;
    /* XXX: only mpeg1 */
    quant_matrix = s->intra_matrix;
    for(i=1;i<=nCoeffs;i++) {
        int j= s->intra_scantable.permutated[i];
        level = block[j];
        if (level) {
            if (level < 0) {
                level = -level;
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
                level = (level - 1) | 1;
                level = -level;
            } else {
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
                level = (level - 1) | 1;
F
Fabrice Bellard 已提交
6253
            }
6254
            block[j] = level;
F
Fabrice Bellard 已提交
6255
        }
6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281
    }
}

static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, 
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
    const uint16_t *quant_matrix;

    nCoeffs= s->block_last_index[n];
    
    quant_matrix = s->inter_matrix;
    for(i=0; i<=nCoeffs; i++) {
        int j= s->intra_scantable.permutated[i];
        level = block[j];
        if (level) {
            if (level < 0) {
                level = -level;
                level = (((level << 1) + 1) * qscale *
                         ((int) (quant_matrix[j]))) >> 4;
                level = (level - 1) | 1;
                level = -level;
            } else {
                level = (((level << 1) + 1) * qscale *
                         ((int) (quant_matrix[j]))) >> 4;
                level = (level - 1) | 1;
F
Fabrice Bellard 已提交
6282
            }
6283
            block[j] = level;
F
Fabrice Bellard 已提交
6284 6285 6286
        }
    }
}
6287

6288
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, 
6289 6290 6291
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
6292
    const uint16_t *quant_matrix;
6293

6294 6295
    if(s->alternate_scan) nCoeffs= 63;
    else nCoeffs= s->block_last_index[n];
6296
    
6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359
    if (n < 4) 
        block[0] = block[0] * s->y_dc_scale;
    else
        block[0] = block[0] * s->c_dc_scale;
    quant_matrix = s->intra_matrix;
    for(i=1;i<=nCoeffs;i++) {
        int j= s->intra_scantable.permutated[i];
        level = block[j];
        if (level) {
            if (level < 0) {
                level = -level;
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
                level = -level;
            } else {
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
            }
            block[j] = level;
        }
    }
}

static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, 
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
    const uint16_t *quant_matrix;
    int sum=-1;

    if(s->alternate_scan) nCoeffs= 63;
    else nCoeffs= s->block_last_index[n];
    
    quant_matrix = s->inter_matrix;
    for(i=0; i<=nCoeffs; i++) {
        int j= s->intra_scantable.permutated[i];
        level = block[j];
        if (level) {
            if (level < 0) {
                level = -level;
                level = (((level << 1) + 1) * qscale *
                         ((int) (quant_matrix[j]))) >> 4;
                level = -level;
            } else {
                level = (((level << 1) + 1) * qscale *
                         ((int) (quant_matrix[j]))) >> 4;
            }
            block[j] = level;
            sum+=level;
        }
    }
    block[63]^=sum&1;
}

static void dct_unquantize_h263_intra_c(MpegEncContext *s, 
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
    int nCoeffs;
    
    assert(s->block_last_index[n]>=0);
    
    qmul = qscale << 1;
    
    if (!s->h263_aic) {
6360 6361 6362 6363
        if (n < 4) 
            block[0] = block[0] * s->y_dc_scale;
        else
            block[0] = block[0] * s->c_dc_scale;
6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379
        qadd = (qscale - 1) | 1;
    }else{
        qadd = 0;
    }
    if(s->ac_pred)
        nCoeffs=63;
    else
        nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];

    for(i=1; i<=nCoeffs; i++) {
        level = block[i];
        if (level) {
            if (level < 0) {
                level = level * qmul - qadd;
            } else {
                level = level * qmul + qadd;
6380
            }
6381
            block[i] = level;
6382 6383 6384 6385
        }
    }
}

6386
static void dct_unquantize_h263_inter_c(MpegEncContext *s, 
6387 6388 6389
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
M
Michael Niedermayer 已提交
6390
    int nCoeffs;
6391
    
6392 6393 6394 6395 6396
    assert(s->block_last_index[n]>=0);
    
    qadd = (qscale - 1) | 1;
    qmul = qscale << 1;
    
6397
    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6398

6399
    for(i=0; i<=nCoeffs; i++) {
6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410
        level = block[i];
        if (level) {
            if (level < 0) {
                level = level * qmul - qadd;
            } else {
                level = level * qmul + qadd;
            }
            block[i] = level;
        }
    }
}
F
Fabrice Bellard 已提交
6411

6412
#ifdef CONFIG_ENCODERS
F
Fabrice Bellard 已提交
6413 6414 6415 6416 6417 6418 6419 6420
AVCodec h263_encoder = {
    "h263",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6421
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
F
Fabrice Bellard 已提交
6422 6423 6424 6425 6426 6427 6428 6429 6430 6431
};

AVCodec h263p_encoder = {
    "h263p",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263P,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6432
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
F
Fabrice Bellard 已提交
6433 6434
};

6435 6436 6437 6438 6439 6440 6441 6442
AVCodec flv_encoder = {
    "flv",
    CODEC_TYPE_VIDEO,
    CODEC_ID_FLV1,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6443
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6444 6445
};

F
Fabrice Bellard 已提交
6446 6447 6448 6449 6450 6451 6452 6453
AVCodec rv10_encoder = {
    "rv10",
    CODEC_TYPE_VIDEO,
    CODEC_ID_RV10,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6454
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
F
Fabrice Bellard 已提交
6455 6456
};

M
Michael Niedermayer 已提交
6457 6458 6459 6460 6461 6462 6463 6464
AVCodec rv20_encoder = {
    "rv20",
    CODEC_TYPE_VIDEO,
    CODEC_ID_RV20,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6465
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
M
Michael Niedermayer 已提交
6466 6467
};

F
Fabrice Bellard 已提交
6468 6469
AVCodec mpeg4_encoder = {
    "mpeg4",
F
Fabrice Bellard 已提交
6470
    CODEC_TYPE_VIDEO,
F
Fabrice Bellard 已提交
6471
    CODEC_ID_MPEG4,
F
Fabrice Bellard 已提交
6472 6473 6474 6475
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6476
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6477
    .capabilities= CODEC_CAP_DELAY,
F
Fabrice Bellard 已提交
6478 6479
};

6480 6481 6482 6483 6484 6485 6486 6487
AVCodec msmpeg4v1_encoder = {
    "msmpeg4v1",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MSMPEG4V1,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6488
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6489 6490 6491 6492 6493 6494 6495 6496 6497 6498
};

AVCodec msmpeg4v2_encoder = {
    "msmpeg4v2",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MSMPEG4V2,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6499
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6500 6501 6502
};

AVCodec msmpeg4v3_encoder = {
F
Fabrice Bellard 已提交
6503 6504
    "msmpeg4",
    CODEC_TYPE_VIDEO,
6505
    CODEC_ID_MSMPEG4V3,
F
Fabrice Bellard 已提交
6506 6507 6508 6509
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6510
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
F
Fabrice Bellard 已提交
6511
};
M
Michael Niedermayer 已提交
6512 6513 6514 6515 6516 6517 6518 6519 6520

AVCodec wmv1_encoder = {
    "wmv1",
    CODEC_TYPE_VIDEO,
    CODEC_ID_WMV1,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6521
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
M
Michael Niedermayer 已提交
6522 6523
};

M
Michael Niedermayer 已提交
6524 6525 6526 6527 6528 6529 6530 6531
AVCodec mjpeg_encoder = {
    "mjpeg",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MJPEG,
    sizeof(MpegEncContext),
    MPV_encode_init,
    MPV_encode_picture,
    MPV_encode_end,
M
Michael Niedermayer 已提交
6532
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, -1},
M
Michael Niedermayer 已提交
6533
};
6534 6535

#endif //CONFIG_ENCODERS