mpegvideo.c 90.1 KB
Newer Older
F
Fabrice Bellard 已提交
1 2
/*
 * The simplest mpeg encoder (well, it was the simplest!)
3
 * Copyright (c) 2000,2001 Fabrice Bellard
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
F
Fabrice Bellard 已提交
5
 *
6 7
 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
 *
8 9 10
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
F
Fabrice Bellard 已提交
11 12
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
13
 * version 2.1 of the License, or (at your option) any later version.
F
Fabrice Bellard 已提交
14
 *
15
 * FFmpeg is distributed in the hope that it will be useful,
F
Fabrice Bellard 已提交
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
F
Fabrice Bellard 已提交
17 18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
F
Fabrice Bellard 已提交
19
 *
F
Fabrice Bellard 已提交
20
 * You should have received a copy of the GNU Lesser General Public
21
 * License along with FFmpeg; if not, write to the Free Software
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
F
Fabrice Bellard 已提交
23
 */
24

M
Michael Niedermayer 已提交
25
/**
26
 * @file libavcodec/mpegvideo.c
M
Michael Niedermayer 已提交
27
 * The simplest mpeg encoder (well, it was the simplest!).
28 29
 */

F
Fabrice Bellard 已提交
30 31 32
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
B
Benoit Fouet 已提交
33
#include "mpegvideo_common.h"
34
#include "mjpegenc.h"
35
#include "msmpeg4.h"
M
Michael Niedermayer 已提交
36
#include "faandct.h"
37
#include "xvmc_internal.h"
38
#include <limits.h>
F
Fabrice Bellard 已提交
39

40 41
//#undef NDEBUG
//#include <assert.h>
42

43
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
44
                                   DCTELEM *block, int n, int qscale);
45
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
46
                                   DCTELEM *block, int n, int qscale);
47 48
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
                                   DCTELEM *block, int n, int qscale);
49 50
static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
                                   DCTELEM *block, int n, int qscale);
51 52
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
                                   DCTELEM *block, int n, int qscale);
53
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
54
                                  DCTELEM *block, int n, int qscale);
55
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
56
                                  DCTELEM *block, int n, int qscale);
M
Michael Niedermayer 已提交
57

F
Fabrice Bellard 已提交
58 59 60 61 62 63

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

//#define DEBUG

64

M
Michael Niedermayer 已提交
65 66 67 68 69
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
};

70 71 72 73 74 75 76 77
const uint8_t ff_mpeg1_dc_scale_table[128]={
//  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
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
};

78
const enum PixelFormat ff_pixfmt_list_420[] = {
79 80 81 82 83
    PIX_FMT_YUV420P,
    PIX_FMT_NONE
};

const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = {
84
    PIX_FMT_VAAPI_VLD,
85 86 87
    PIX_FMT_YUV420P,
    PIX_FMT_NONE
};
88

M
Michael Niedermayer 已提交
89 90 91
const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
    int i;

M
Michael Niedermayer 已提交
92 93 94 95
    assert(p<=end);
    if(p>=end)
        return end;

M
Michael Niedermayer 已提交
96 97 98 99 100 101 102 103
    for(i=0; i<3; i++){
        uint32_t tmp= *state << 8;
        *state= tmp + *(p++);
        if(tmp == 0x100 || p==end)
            return p;
    }

    while(p<end){
M
Michael Niedermayer 已提交
104 105 106
        if     (p[-1] > 1      ) p+= 3;
        else if(p[-2]          ) p+= 2;
        else if(p[-3]|(p[-1]-1)) p++;
M
Michael Niedermayer 已提交
107 108 109 110 111 112
        else{
            p++;
            break;
        }
    }

M
Michael Niedermayer 已提交
113
    p= FFMIN(p, end)-4;
114
    *state= AV_RB32(p);
M
Michael Niedermayer 已提交
115 116 117 118

    return p+4;
}

119
/* init common dct for both encoder and decoder */
120
av_cold int ff_dct_common_init(MpegEncContext *s)
F
Fabrice Bellard 已提交
121
{
122 123 124 125 126
    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;
127 128
    if(s->flags & CODEC_FLAG_BITEXACT)
        s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
129
    s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
130

131
#if   HAVE_MMX
132
    MPV_common_init_mmx(s);
133
#elif ARCH_ALPHA
134
    MPV_common_init_axp(s);
135
#elif CONFIG_MLIB
136
    MPV_common_init_mlib(s);
137
#elif HAVE_MMI
138
    MPV_common_init_mmi(s);
139
#elif ARCH_ARM
M
Måns Rullgård 已提交
140
    MPV_common_init_arm(s);
141
#elif HAVE_ALTIVEC
142
    MPV_common_init_altivec(s);
143
#elif ARCH_BFIN
144 145
    MPV_common_init_bfin(s);
#endif
146

147
    /* load & permutate scantables
148
       note: only wmv uses different ones
149
    */
M
Michael Niedermayer 已提交
150 151 152 153 154 155 156
    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 已提交
157 158
    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);
159

160 161 162
    return 0;
}

163
void ff_copy_picture(Picture *dst, Picture *src){
164 165 166 167
    *dst = *src;
    dst->type= FF_BUFFER_TYPE_COPY;
}

168 169 170 171 172 173
/**
 * Releases a frame buffer
 */
static void free_frame_buffer(MpegEncContext *s, Picture *pic)
{
    s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
174
    av_freep(&pic->hwaccel_picture_private);
175 176 177 178 179 180 181 182 183
}

/**
 * Allocates a frame buffer
 */
static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
{
    int r;

184
    if (s->avctx->hwaccel) {
185
        assert(!pic->hwaccel_picture_private);
186
        if (s->avctx->hwaccel->priv_data_size) {
187 188
            pic->hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
            if (!pic->hwaccel_picture_private) {
189 190 191 192 193 194
                av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
                return -1;
            }
        }
    }

195 196 197 198
    r = s->avctx->get_buffer(s->avctx, (AVFrame*)pic);

    if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
199
        av_freep(&pic->hwaccel_picture_private);
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
        return -1;
    }

    if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) {
        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
        free_frame_buffer(s, pic);
        return -1;
    }

    if (pic->linesize[1] != pic->linesize[2]) {
        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
        free_frame_buffer(s, pic);
        return -1;
    }

    return 0;
}

M
cleanup  
Michael Niedermayer 已提交
218
/**
M
Michael Niedermayer 已提交
219 220
 * allocates a Picture
 * The pixels are allocated/set by calling get_buffer() if shared=0
M
cleanup  
Michael Niedermayer 已提交
221
 */
222
int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){
D
Diego Biurrun 已提交
223
    const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
224
    const int mb_array_size= s->mb_stride*s->mb_height;
225 226
    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 已提交
227
    int i;
D
Daniel Kristjansson 已提交
228
    int r= -1;
229

M
Michael Niedermayer 已提交
230 231 232 233 234 235
    if(shared){
        assert(pic->data[0]);
        assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
        pic->type= FF_BUFFER_TYPE_SHARED;
    }else{
        assert(!pic->data[0]);
236

237
        if (alloc_frame_buffer(s, pic) < 0)
M
Michael Niedermayer 已提交
238 239 240 241
            return -1;

        s->linesize  = pic->linesize[0];
        s->uvlinesize= pic->linesize[1];
M
cleanup  
Michael Niedermayer 已提交
242
    }
243

M
Michael Niedermayer 已提交
244
    if(pic->qscale_table==NULL){
245
        if (s->encoding) {
246 247 248
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var   , mb_array_size * sizeof(int16_t)  , fail)
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t)  , fail)
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean  , mb_array_size * sizeof(int8_t )  , fail)
M
Michael Niedermayer 已提交
249
        }
M
cleanup  
Michael Niedermayer 已提交
250

251 252 253
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t)  , fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail)
254
        pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1;
M
Michael Niedermayer 已提交
255 256
        if(s->out_format == FMT_H264){
            for(i=0; i<2; i++){
257
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4)  * sizeof(int16_t), fail)
M
Michael Niedermayer 已提交
258
                pic->motion_val[i]= pic->motion_val_base[i]+4;
259
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], b8_array_size * sizeof(uint8_t), fail)
260
            }
M
Michael Niedermayer 已提交
261
            pic->motion_subsample_log2= 2;
262
        }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
263
            for(i=0; i<2; i++){
264
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail)
M
Michael Niedermayer 已提交
265
                pic->motion_val[i]= pic->motion_val_base[i]+4;
266
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], b8_array_size * sizeof(uint8_t), fail)
M
Michael Niedermayer 已提交
267
            }
M
Michael Niedermayer 已提交
268
            pic->motion_subsample_log2= 3;
M
Michael Niedermayer 已提交
269
        }
270
        if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
271
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6, fail)
272
        }
273
        pic->qstride= s->mb_stride;
274
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->pan_scan , 1 * sizeof(AVPanScan), fail)
M
Michael Niedermayer 已提交
275
    }
M
Michael Niedermayer 已提交
276

D
Diego Biurrun 已提交
277 278
    /* It might be nicer if the application would keep track of these
     * but it would require an API change. */
279
    memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
280
    s->prev_pict_types[0]= s->dropable ? FF_B_TYPE : s->pict_type;
281
    if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == FF_B_TYPE)
D
Diego Biurrun 已提交
282
        pic->age= INT_MAX; // Skipped MBs in B-frames are quite rare in MPEG-1/2 and it is a bit tricky to skip them anyway.
283

M
cleanup  
Michael Niedermayer 已提交
284
    return 0;
285
fail: //for the FF_ALLOCZ_OR_GOTO macro
D
Daniel Kristjansson 已提交
286
    if(r>=0)
287
        free_frame_buffer(s, pic);
M
cleanup  
Michael Niedermayer 已提交
288 289 290
    return -1;
}

M
Michael Niedermayer 已提交
291 292 293
/**
 * deallocates a picture
 */
M
cleanup  
Michael Niedermayer 已提交
294 295
static void free_picture(MpegEncContext *s, Picture *pic){
    int i;
M
Michael Niedermayer 已提交
296 297

    if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
298
        free_frame_buffer(s, pic);
M
Michael Niedermayer 已提交
299 300
    }

M
cleanup  
Michael Niedermayer 已提交
301 302 303 304 305
    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 已提交
306
    av_freep(&pic->mb_type_base);
307
    av_freep(&pic->dct_coeff);
308
    av_freep(&pic->pan_scan);
M
Michael Niedermayer 已提交
309 310
    pic->mb_type= NULL;
    for(i=0; i<2; i++){
311
        av_freep(&pic->motion_val_base[i]);
M
Michael Niedermayer 已提交
312 313
        av_freep(&pic->ref_index[i]);
    }
314

315
    if(pic->type == FF_BUFFER_TYPE_SHARED){
M
Michael Niedermayer 已提交
316 317 318 319
        for(i=0; i<4; i++){
            pic->base[i]=
            pic->data[i]= NULL;
        }
320
        pic->type= 0;
M
cleanup  
Michael Niedermayer 已提交
321 322 323
    }
}

324 325 326
static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
    int i;

327
    // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
328
    FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
L
Loren Merritt 已提交
329
    s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
330

D
Diego Biurrun 已提交
331
     //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
332
    FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad,  (s->width+64)*4*16*2*sizeof(uint8_t), fail)
333
    s->me.temp=         s->me.scratchpad;
334 335 336 337
    s->rd_scratchpad=   s->me.scratchpad;
    s->b_scratchpad=    s->me.scratchpad;
    s->obmc_scratchpad= s->me.scratchpad + 16;
    if (s->encoding) {
338 339
        FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map      , ME_MAP_SIZE*sizeof(uint32_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail)
340
        if(s->avctx->noise_reduction){
341
            FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail)
342
        }
343
    }
344
    FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail)
345 346 347
    s->block= s->blocks[0];

    for(i=0;i<12;i++){
348
        s->pblocks[i] = &s->block[i];
349 350 351 352 353 354 355 356 357 358 359
    }
    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);
360
    s->me.temp=
361 362
    s->rd_scratchpad=
    s->b_scratchpad=
363
    s->obmc_scratchpad= NULL;
364

365 366 367 368 369 370 371 372 373 374 375 376
    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);
377
    COPY(me.temp);
378 379 380 381 382 383 384 385 386 387 388 389
    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);
390 391
    COPY(dct_count[0]);
    COPY(dct_count[1]);
392 393 394
#undef COPY
}

395
void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
396
    MpegEncContext bak;
397
    int i;
398 399 400 401 402
    //FIXME copy only needed parts
//START_TIMER
    backup_duplicate_context(&bak, dst);
    memcpy(dst, src, sizeof(MpegEncContext));
    backup_duplicate_context(dst, &bak);
403
    for(i=0;i<12;i++){
404
        dst->pblocks[i] = &dst->block[i];
405
    }
406 407 408
//STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
}

M
Michael Niedermayer 已提交
409 410 411 412
/**
 * 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.
 */
B
Benoit Fouet 已提交
413
void MPV_common_defaults(MpegEncContext *s){
M
Michael Niedermayer 已提交
414 415 416 417 418 419 420 421 422 423 424 425
    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;
426 427 428

    s->f_code = 1;
    s->b_code = 1;
M
Michael Niedermayer 已提交
429 430 431 432 433 434 435 436 437 438
}

/**
 * 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);
}

439
/**
M
Michael Niedermayer 已提交
440 441 442
 * init common structure for both encoder and decoder.
 * this assumes that some variables like width/height are already set
 */
443
av_cold int MPV_common_init(MpegEncContext *s)
444
{
445
    int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads;
446

447 448 449
    if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
        s->mb_height = (s->height + 31) / 32 * 2;
    else
B
Baptiste Coudurier 已提交
450
        s->mb_height = (s->height + 15) / 16;
L
Loren Merritt 已提交
451

452 453 454 455 456
    if(s->avctx->pix_fmt == PIX_FMT_NONE){
        av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n");
        return -1;
    }

L
Loren Merritt 已提交
457
    if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
M
10l  
Michael Niedermayer 已提交
458 459 460 461
        av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
        return -1;
    }

462 463 464
    if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
        return -1;

465
    dsputil_init(&s->dsp, s->avctx);
466
    ff_dct_common_init(s);
467

468
    s->flags= s->avctx->flags;
469
    s->flags2= s->avctx->flags2;
470

M
cleanup  
Michael Niedermayer 已提交
471
    s->mb_width  = (s->width  + 15) / 16;
472
    s->mb_stride = s->mb_width + 1;
473 474
    s->b8_stride = s->mb_width*2 + 1;
    s->b4_stride = s->mb_width*4 + 1;
475
    mb_array_size= s->mb_height * s->mb_stride;
M
Michael Niedermayer 已提交
476
    mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
477

478 479 480 481
    /* set chroma shifts */
    avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
                                                    &(s->chroma_y_shift) );

482 483 484
    /* 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;
485 486

    s->mb_num = s->mb_width * s->mb_height;
487

488 489 490
    s->block_wrap[0]=
    s->block_wrap[1]=
    s->block_wrap[2]=
491
    s->block_wrap[3]= s->b8_stride;
492
    s->block_wrap[4]=
493
    s->block_wrap[5]= s->mb_stride;
494

495 496
    y_size = s->b8_stride * (2 * s->mb_height + 1);
    c_size = s->mb_stride * (s->mb_height + 1);
497
    yc_size = y_size + 2 * c_size;
498

499
    /* convert fourcc to upper case */
500
    s->codec_tag=          toupper( s->avctx->codec_tag     &0xFF)
501
                        + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
502
                        + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
503
                        + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
504

505
    s->stream_codec_tag=          toupper( s->avctx->stream_codec_tag     &0xFF)
506
                               + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
507
                               + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
508 509
                               + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);

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

512
    FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
513 514 515 516 517 518
    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?
519

520
    if (s->encoding) {
521
        /* Allocate MV tables */
522 523 524 525 526 527
        FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t), fail)
528 529 530 531 532 533
        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;
534

535
        if(s->msmpeg4_version){
536
            FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
537
        }
538
        FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
539 540

        /* Allocate MB type table */
541
        FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type  , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
542

543
        FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
544

545 546 547 548 549 550
        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix  , 64*32   * sizeof(int), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix  , 64*32   * sizeof(int), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
551

552
        if(s->avctx->noise_reduction){
553
            FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
554
        }
555
    }
556
    FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, MAX_PICTURE_COUNT * sizeof(Picture), fail)
557 558 559
    for(i = 0; i < MAX_PICTURE_COUNT; i++) {
        avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
    }
560

561
    FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
562

M
Michael Niedermayer 已提交
563
    if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
564
        /* interlaced direct mode decoding tables */
M
Michael Niedermayer 已提交
565 566 567 568
            for(i=0; i<2; i++){
                int j, k;
                for(j=0; j<2; j++){
                    for(k=0; k<2; k++){
569 570
                        FF_ALLOCZ_OR_GOTO(s->avctx,    s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
                        s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
M
Michael Niedermayer 已提交
571
                    }
572 573 574
                    FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
                    FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
                    s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
M
Michael Niedermayer 已提交
575
                }
576
                FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
M
Michael Niedermayer 已提交
577
            }
F
Fabrice Bellard 已提交
578
    }
M
Michael Niedermayer 已提交
579
    if (s->out_format == FMT_H263) {
F
Fabrice Bellard 已提交
580
        /* ac values */
581
        FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
582 583
        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 已提交
584
        s->ac_val[2] = s->ac_val[1] + c_size;
585

F
Fabrice Bellard 已提交
586
        /* cbp values */
587
        FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
588
        s->coded_block= s->coded_block_base + s->b8_stride + 1;
589

590
        /* cbp, ac_pred, pred_dir */
591 592
        FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table     , mb_array_size * sizeof(uint8_t), fail)
        FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
593
    }
594

595 596 597
    if (s->h263_pred || s->h263_plus || !s->encoding) {
        /* dc values */
        //MN: we need these for error resilience of intra-frames
598
        FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
599 600
        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;
601 602
        s->dc_val[2] = s->dc_val[1] + c_size;
        for(i=0;i<yc_size;i++)
603
            s->dc_val_base[i] = 1024;
604 605
    }

606
    /* which mb is a intra block */
607
    FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
608
    memset(s->mbintra_table, 1, mb_array_size);
609

610
    /* init macroblock skip table */
611
    FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
612
    //Note the +1 is for a quicker mpeg4 slice_end detection
613
    FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
614

615
    s->parse_context.state= -1;
616 617
    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);
618 619
       s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
       s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
620
    }
621

F
Fabrice Bellard 已提交
622
    s->context_initialized = 1;
623 624

    s->thread_context[0]= s;
625
    threads = s->avctx->thread_count;
626 627

    for(i=1; i<threads; i++){
628 629 630 631
        s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
        memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
    }

632
    for(i=0; i<threads; i++){
633 634 635 636 637 638
        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 已提交
639 640
    return 0;
 fail:
641
    MPV_common_end(s);
F
Fabrice Bellard 已提交
642 643 644 645 646 647
    return -1;
}

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

650 651 652 653 654 655 656
    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]);
    }

657 658 659
    av_freep(&s->parse_context.buffer);
    s->parse_context.buffer_size=0;

660
    av_freep(&s->mb_type);
661 662 663 664 665 666 667 668 669 670 671 672
    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 已提交
673 674 675 676 677 678 679 680 681 682 683 684
    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]);
    }
685

686 687 688
    av_freep(&s->dc_val_base);
    av_freep(&s->ac_val_base);
    av_freep(&s->coded_block_base);
689
    av_freep(&s->mbintra_table);
690 691
    av_freep(&s->cbp_table);
    av_freep(&s->pred_dir_table);
692

693
    av_freep(&s->mbskip_table);
694
    av_freep(&s->prev_pict_types);
695
    av_freep(&s->bitstream_buffer);
696 697
    s->allocated_bitstream_buffer_size=0;

M
Michael Niedermayer 已提交
698
    av_freep(&s->avctx->stats_out);
699
    av_freep(&s->ac_stats);
700
    av_freep(&s->error_status_table);
701
    av_freep(&s->mb_index2xy);
702
    av_freep(&s->lambda_table);
703 704
    av_freep(&s->q_intra_matrix);
    av_freep(&s->q_inter_matrix);
705 706
    av_freep(&s->q_intra_matrix16);
    av_freep(&s->q_inter_matrix16);
707 708
    av_freep(&s->input_picture);
    av_freep(&s->reordered_input_picture);
709
    av_freep(&s->dct_offset);
M
cleanup  
Michael Niedermayer 已提交
710

M
Michael Niedermayer 已提交
711 712 713 714
    if(s->picture){
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            free_picture(s, &s->picture[i]);
        }
F
Fabrice Bellard 已提交
715
    }
716
    av_freep(&s->picture);
F
Fabrice Bellard 已提交
717
    s->context_initialized = 0;
718 719 720
    s->last_picture_ptr=
    s->next_picture_ptr=
    s->current_picture_ptr= NULL;
M
Michael Niedermayer 已提交
721
    s->linesize= s->uvlinesize= 0;
722

723
    for(i=0; i<3; i++)
724
        av_freep(&s->visualization_buffer[i]);
M
Michael Niedermayer 已提交
725 726

    avcodec_default_free_buffers(s->avctx);
F
Fabrice Bellard 已提交
727 728
}

729
void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
M
Michael Niedermayer 已提交
730
{
731 732
    int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
    uint8_t index_run[MAX_RUN+1];
M
Michael Niedermayer 已提交
733 734
    int last, run, level, start, end, i;

735
    /* If table is static, we can quit if rl->max_level[0] is not NULL */
736
    if(static_store && rl->max_level[0])
737 738
        return;

M
Michael Niedermayer 已提交
739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
    /* 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;
        }
762 763
        if(static_store)
            rl->max_level[last] = static_store[last];
764 765
        else
            rl->max_level[last] = av_malloc(MAX_RUN + 1);
M
Michael Niedermayer 已提交
766
        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
767 768
        if(static_store)
            rl->max_run[last] = static_store[last] + MAX_RUN + 1;
769 770
        else
            rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
M
Michael Niedermayer 已提交
771
        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
772 773
        if(static_store)
            rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
774 775
        else
            rl->index_run[last] = av_malloc(MAX_RUN + 1);
M
Michael Niedermayer 已提交
776 777 778 779
        memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
    }
}

780
void init_vlc_rl(RLTable *rl)
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
{
    int i, q;

    for(q=0; q<32; q++){
        int qmul= q*2;
        int qadd= (q-1)|1;

        if(q==0){
            qmul=1;
            qadd=0;
        }
        for(i=0; i<rl->vlc.table_size; i++){
            int code= rl->vlc.table[i][0];
            int len = rl->vlc.table[i][1];
            int level, run;

            if(len==0){ // illegal code
                run= 66;
                level= MAX_LEVEL;
            }else if(len<0){ //more bits needed
                run= 0;
                level= code;
            }else{
                if(code==rl->n){ //esc
                    run= 66;
                    level= 0;
                }else{
                    run=   rl->table_run  [code] + 1;
                    level= rl->table_level[code] * qmul + qadd;
                    if(code >= rl->last) run+=192;
                }
            }
            rl->rl_vlc[q][i].len= len;
            rl->rl_vlc[q][i].level= level;
            rl->rl_vlc[q][i].run= run;
        }
    }
}

M
Michael Niedermayer 已提交
820
int ff_find_unused_picture(MpegEncContext *s, int shared){
M
Michael Niedermayer 已提交
821
    int i;
822

M
Michael Niedermayer 已提交
823 824
    if(shared){
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
825
            if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
M
Michael Niedermayer 已提交
826 827 828
        }
    }else{
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
829
            if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
M
Michael Niedermayer 已提交
830 831
        }
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
832
            if(s->picture[i].data[0]==NULL) return i;
M
Michael Niedermayer 已提交
833 834 835
        }
    }

836
    av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
837 838 839 840 841 842 843 844 845 846 847
    /* We could return -1, but the codec would crash trying to draw into a
     * non-existing frame anyway. This is safer than waiting for a random crash.
     * Also the return of this is never useful, an encoder must only allocate
     * as much as allowed in the specification. This has no relationship to how
     * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
     * enough for such valid streams).
     * Plus, a decoder has to check stream validity and remove frames if too
     * many reference frames are around. Waiting for "OOM" is not correct at
     * all. Similarly, missing reference frames have to be replaced by
     * interpolated/MC frames, anything else is a bug in the codec ...
     */
848
    abort();
M
Michael Niedermayer 已提交
849
    return -1;
M
Michael Niedermayer 已提交
850 851
}

852 853 854 855 856 857 858 859 860 861
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;
        }
862

863 864 865 866 867 868
        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 已提交
869 870 871
/**
 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
 */
872
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
F
Fabrice Bellard 已提交
873
{
M
Michael Niedermayer 已提交
874
    int i;
875
    Picture *pic;
876
    s->mb_skipped = 0;
M
Michael Niedermayer 已提交
877

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

M
cleanup  
Michael Niedermayer 已提交
880
    /* mark&release old frames */
881
    if (s->pict_type != FF_B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
882
      if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
883
          free_frame_buffer(s, s->last_picture_ptr);
M
cleanup  
Michael Niedermayer 已提交
884 885 886 887 888

        /* release forgotten pictures */
        /* if(mpeg124/h263) */
        if(!s->encoding){
            for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
889
                if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
890
                    av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
891
                    free_frame_buffer(s, &s->picture[i]);
M
cleanup  
Michael Niedermayer 已提交
892 893
                }
            }
894
        }
895
      }
896
    }
897

898
    if(!s->encoding){
D
Diego Biurrun 已提交
899
        /* release non reference frames */
M
Michael Niedermayer 已提交
900 901
        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*/){
902
                free_frame_buffer(s, &s->picture[i]);
M
Michael Niedermayer 已提交
903 904 905
            }
        }

M
Michael Niedermayer 已提交
906
        if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
907
            pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
M
Michael Niedermayer 已提交
908 909
        else{
            i= ff_find_unused_picture(s, 0);
910
            pic= &s->picture[i];
M
Michael Niedermayer 已提交
911 912
        }

913 914 915 916
        pic->reference= 0;
        if (!s->dropable){
            if (s->codec_id == CODEC_ID_H264)
                pic->reference = s->picture_structure;
917
            else if (s->pict_type != FF_B_TYPE)
918 919
                pic->reference = 3;
        }
M
Michael Niedermayer 已提交
920

M
Michael Niedermayer 已提交
921
        pic->coded_picture_number= s->coded_picture_number++;
922

923
        if(ff_alloc_picture(s, pic, 0) < 0)
924
            return -1;
925

926
        s->current_picture_ptr= pic;
927
        s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
928
        s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
M
cleanup  
Michael Niedermayer 已提交
929
    }
930

M
Michael Niedermayer 已提交
931
    s->current_picture_ptr->pict_type= s->pict_type;
932
//    if(s->flags && CODEC_FLAG_QSCALE)
933
  //      s->current_picture_ptr->quality= s->new_picture_ptr->quality;
934
    s->current_picture_ptr->key_frame= s->pict_type == FF_I_TYPE;
M
Michael Niedermayer 已提交
935

936
    ff_copy_picture(&s->current_picture, s->current_picture_ptr);
937

938
    if (s->pict_type != FF_B_TYPE) {
M
Michael Niedermayer 已提交
939
        s->last_picture_ptr= s->next_picture_ptr;
940 941
        if(!s->dropable)
            s->next_picture_ptr= s->current_picture_ptr;
F
Fabrice Bellard 已提交
942
    }
943
/*    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,
944 945
        s->last_picture_ptr    ? s->last_picture_ptr->data[0] : NULL,
        s->next_picture_ptr    ? s->next_picture_ptr->data[0] : NULL,
946 947
        s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
        s->pict_type, s->dropable);*/
948

949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966
    if(s->codec_id != CODEC_ID_H264){
        if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && s->pict_type!=FF_I_TYPE){
            av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
            /* Allocate a dummy frame */
            i= ff_find_unused_picture(s, 0);
            s->last_picture_ptr= &s->picture[i];
            if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
                return -1;
        }
        if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==FF_B_TYPE){
            /* Allocate a dummy frame */
            i= ff_find_unused_picture(s, 0);
            s->next_picture_ptr= &s->picture[i];
            if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
                return -1;
        }
    }

967 968
    if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
    if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
969

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

972
    if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
M
Michael Niedermayer 已提交
973 974 975 976
        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];
977
            }
M
Michael Niedermayer 已提交
978 979 980 981 982
            s->current_picture.linesize[i] *= 2;
            s->last_picture.linesize[i] *=2;
            s->next_picture.linesize[i] *=2;
        }
    }
983

984
    s->hurry_up= s->avctx->hurry_up;
985
    s->error_recognition= avctx->error_recognition;
986

D
Diego Biurrun 已提交
987
    /* set dequantizer, we can't do it during init as it might change for mpeg4
D
Diego Biurrun 已提交
988
       and we can't do it in the header decode as init is not called for mpeg4 there yet */
989 990 991
    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 已提交
992
    }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
993 994 995 996 997 998
        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;
    }
999

1000 1001 1002 1003 1004
    if(s->dct_error_sum){
        assert(s->avctx->noise_reduction && s->encoding);

        update_noise_reduction(s);
    }
1005

1006
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1007
        return ff_xvmc_field_start(s, avctx);
1008

1009
    return 0;
F
Fabrice Bellard 已提交
1010
}
1011

F
Fabrice Bellard 已提交
1012 1013 1014
/* generic function for encode/decode called after a frame has been coded/decoded */
void MPV_frame_end(MpegEncContext *s)
{
M
cleanup  
Michael Niedermayer 已提交
1015
    int i;
F
Fabrice Bellard 已提交
1016
    /* draw edge for correct motion prediction if outside */
1017
    //just to make sure that all data is rendered.
1018
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1019
        ff_xvmc_field_end(s);
1020 1021
    }else if(!s->avctx->hwaccel
       && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1022 1023 1024 1025
       && s->unrestricted_mv
       && s->current_picture.reference
       && !s->intra_only
       && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
A
Aurelien Jacobs 已提交
1026 1027 1028
            s->dsp.draw_edges(s->current_picture.data[0], s->linesize  , s->h_edge_pos   , s->v_edge_pos   , EDGE_WIDTH  );
            s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
            s->dsp.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 已提交
1029
    }
M
Michael Niedermayer 已提交
1030
    emms_c();
1031

M
Michael Niedermayer 已提交
1032
    s->last_pict_type    = s->pict_type;
1033
    s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1034
    if(s->pict_type!=FF_B_TYPE){
1035 1036
        s->last_non_b_pict_type= s->pict_type;
    }
M
Michael Niedermayer 已提交
1037 1038
#if 0
        /* copy back current_picture variables */
M
cleanup  
Michael Niedermayer 已提交
1039 1040 1041 1042
    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;
1043
        }
M
cleanup  
Michael Niedermayer 已提交
1044 1045
    }
    assert(i<MAX_PICTURE_COUNT);
1046
#endif
M
cleanup  
Michael Niedermayer 已提交
1047

M
Michael Niedermayer 已提交
1048
    if(s->encoding){
D
Diego Biurrun 已提交
1049
        /* release non-reference frames */
M
Michael Niedermayer 已提交
1050 1051
        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*/){
1052
                free_frame_buffer(s, &s->picture[i]);
M
Michael Niedermayer 已提交
1053 1054
            }
        }
M
cleanup  
Michael Niedermayer 已提交
1055
    }
M
Michael Niedermayer 已提交
1056 1057 1058 1059 1060 1061
    // 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 已提交
1062
    s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
F
Fabrice Bellard 已提交
1063 1064
}

1065 1066 1067 1068 1069 1070 1071 1072
/**
 * 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){
M
SWAP  
Michael Niedermayer 已提交
1073
    int x, y, fr, f;
1074

1075 1076 1077 1078
    sx= av_clip(sx, 0, w-1);
    sy= av_clip(sy, 0, h-1);
    ex= av_clip(ex, 0, w-1);
    ey= av_clip(ey, 0, h-1);
1079

1080
    buf[sy*stride + sx]+= color;
1081

D
Diego Biurrun 已提交
1082
    if(FFABS(ex - sx) > FFABS(ey - sy)){
1083
        if(sx > ex){
D
Diego Biurrun 已提交
1084 1085
            FFSWAP(int, sx, ex);
            FFSWAP(int, sy, ey);
1086 1087 1088 1089 1090
        }
        buf+= sx + sy*stride;
        ex-= sx;
        f= ((ey-sy)<<16)/ex;
        for(x= 0; x <= ex; x++){
1091 1092 1093 1094
            y = (x*f)>>16;
            fr= (x*f)&0xFFFF;
            buf[ y   *stride + x]+= (color*(0x10000-fr))>>16;
            buf[(y+1)*stride + x]+= (color*         fr )>>16;
1095 1096 1097
        }
    }else{
        if(sy > ey){
D
Diego Biurrun 已提交
1098 1099
            FFSWAP(int, sx, ex);
            FFSWAP(int, sy, ey);
1100 1101 1102 1103 1104 1105
        }
        buf+= sx + sy*stride;
        ey-= sy;
        if(ey) f= ((ex-sx)<<16)/ey;
        else   f= 0;
        for(y= 0; y <= ey; y++){
1106 1107
            x = (y*f)>>16;
            fr= (y*f)&0xFFFF;
M
Fix ;;  
Michael Niedermayer 已提交
1108 1109
            buf[y*stride + x  ]+= (color*(0x10000-fr))>>16;
            buf[y*stride + x+1]+= (color*         fr )>>16;
1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
        }
    }
}

/**
 * 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
 */
1121
static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1122 1123
    int dx,dy;

1124 1125 1126 1127
    sx= av_clip(sx, -100, w+100);
    sy= av_clip(sy, -100, h+100);
    ex= av_clip(ex, -100, w+100);
    ey= av_clip(ey, -100, h+100);
1128

1129 1130
    dx= ex - sx;
    dy= ey - sy;
1131

1132 1133 1134 1135
    if(dx*dx + dy*dy > 3*3){
        int rx=  dx + dy;
        int ry= -dx + dy;
        int length= ff_sqrt((rx*rx + ry*ry)<<8);
1136

1137 1138 1139
        //FIXME subpixel accuracy
        rx= ROUNDED_DIV(rx*3<<4, length);
        ry= ROUNDED_DIV(ry*3<<4, length);
1140

1141 1142 1143 1144 1145 1146
        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);
}

1147 1148 1149
/**
 * prints debuging info for the given picture.
 */
1150
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1151

1152
    if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1153 1154 1155

    if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
        int x,y;
1156

1157 1158 1159 1160 1161 1162 1163
        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;
1164
            case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1165
        }
1166 1167 1168 1169 1170
        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;
1171
                    av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1172 1173
                }
                if(s->avctx->debug&FF_DEBUG_QP){
1174
                    av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1175 1176 1177 1178 1179
                }
                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))
1180
                        av_log(s->avctx, AV_LOG_DEBUG, "P");
1181
                    else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1182
                        av_log(s->avctx, AV_LOG_DEBUG, "A");
1183
                    else if(IS_INTRA4x4(mb_type))
1184
                        av_log(s->avctx, AV_LOG_DEBUG, "i");
1185
                    else if(IS_INTRA16x16(mb_type))
1186
                        av_log(s->avctx, AV_LOG_DEBUG, "I");
1187
                    else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1188
                        av_log(s->avctx, AV_LOG_DEBUG, "d");
1189
                    else if(IS_DIRECT(mb_type))
1190
                        av_log(s->avctx, AV_LOG_DEBUG, "D");
1191
                    else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1192
                        av_log(s->avctx, AV_LOG_DEBUG, "g");
1193
                    else if(IS_GMC(mb_type))
1194
                        av_log(s->avctx, AV_LOG_DEBUG, "G");
1195
                    else if(IS_SKIP(mb_type))
1196
                        av_log(s->avctx, AV_LOG_DEBUG, "S");
1197
                    else if(!USES_LIST(mb_type, 1))
1198
                        av_log(s->avctx, AV_LOG_DEBUG, ">");
1199
                    else if(!USES_LIST(mb_type, 0))
1200
                        av_log(s->avctx, AV_LOG_DEBUG, "<");
1201 1202
                    else{
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1203
                        av_log(s->avctx, AV_LOG_DEBUG, "X");
1204
                    }
1205

1206 1207
                    //segmentation
                    if(IS_8X8(mb_type))
1208
                        av_log(s->avctx, AV_LOG_DEBUG, "+");
1209
                    else if(IS_16X8(mb_type))
1210
                        av_log(s->avctx, AV_LOG_DEBUG, "-");
1211
                    else if(IS_8X16(mb_type))
1212
                        av_log(s->avctx, AV_LOG_DEBUG, "|");
1213
                    else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1214
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1215
                    else
1216
                        av_log(s->avctx, AV_LOG_DEBUG, "?");
1217 1218


1219
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1220
                        av_log(s->avctx, AV_LOG_DEBUG, "=");
1221
                    else
1222
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1223
                }
1224
//                av_log(s->avctx, AV_LOG_DEBUG, " ");
1225
            }
1226
            av_log(s->avctx, AV_LOG_DEBUG, "\n");
1227 1228
        }
    }
1229

1230
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1231 1232
        const int shift= 1 + s->quarter_sample;
        int mb_y;
1233 1234
        uint8_t *ptr;
        int i;
1235
        int h_chroma_shift, v_chroma_shift, block_height;
1236 1237
        const int width = s->avctx->width;
        const int height= s->avctx->height;
1238
        const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1239
        const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
M
100000l  
Michael Niedermayer 已提交
1240
        s->low_delay=0; //needed to see the vectors without trashing the buffers
1241

1242
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1243
        for(i=0; i<3; i++){
1244
            memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1245 1246 1247 1248
            pict->data[i]= s->visualization_buffer[i];
        }
        pict->type= FF_BUFFER_TYPE_COPY;
        ptr= pict->data[0];
1249
        block_height = 16>>v_chroma_shift;
1250 1251 1252 1253 1254

        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;
1255 1256 1257
                if((s->avctx->debug_mv) && pict->motion_val){
                  int type;
                  for(type=0; type<3; type++){
1258
                    int direction = 0;
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272
                    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;
                    }
1273 1274 1275
                    if(!USES_LIST(pict->mb_type[mb_index], direction))
                        continue;

1276 1277 1278
                    if(IS_8X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<4; i++){
1279 1280
                        int sx= mb_x*16 + 4 + 8*(i&1);
                        int sy= mb_y*16 + 4 + 8*(i>>1);
1281
                        int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1282 1283
                        int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                        int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1284
                        draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1285 1286 1287 1288
                      }
                    }else if(IS_16X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<2; i++){
1289 1290
                        int sx=mb_x*16 + 8;
                        int sy=mb_y*16 + 4 + 8*i;
1291
                        int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1292 1293
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
1294

1295 1296
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
1297

1298 1299 1300 1301 1302 1303 1304
                        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;
1305
                        int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1306 1307
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
1308

1309 1310
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
1311

1312
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1313 1314 1315 1316
                      }
                    }else{
                      int sx= mb_x*16 + 8;
                      int sy= mb_y*16 + 8;
1317
                      int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1318 1319
                      int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                      int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1320
                      draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1321
                    }
1322
                  }
M
Michael Niedermayer 已提交
1323 1324 1325 1326
                }
                if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
                    uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
                    int y;
1327 1328 1329
                    for(y=0; y<block_height; y++){
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
M
Michael Niedermayer 已提交
1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
                    }
                }
                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));

1340

M
Michael Niedermayer 已提交
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
                    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;
1369 1370 1371
                    for(y=0; y<block_height; y++){
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
M
Michael Niedermayer 已提交
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
                    }

                    //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;
                    }
1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397
                    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;
                        }
                    }
1398

M
Michael Niedermayer 已提交
1399 1400 1401
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
                        // hmm
                    }
1402 1403 1404 1405 1406
                }
                s->mbskip_table[mb_index]=0;
            }
        }
    }
1407 1408
}

1409
static inline int hpel_motion_lowres(MpegEncContext *s,
M
Michael Niedermayer 已提交
1410 1411 1412 1413 1414 1415 1416 1417 1418
                                  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;
1419
    const int op_index= FFMIN(lowres, 2);
M
Michael Niedermayer 已提交
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432
    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);
1433

M
Michael Niedermayer 已提交
1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
    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;
    }

1444 1445
    sx= (sx << 2) >> lowres;
    sy= (sy << 2) >> lowres;
M
Michael Niedermayer 已提交
1446 1447
    if(field_select)
        src += s->linesize;
1448
    pix_op[op_index](dest, src, stride, h, sx, sy);
M
Michael Niedermayer 已提交
1449 1450 1451
    return emu;
}

F
Fabrice Bellard 已提交
1452
/* apply one mpeg motion vector to the three components */
B
Benoit Fouet 已提交
1453
static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1454
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1455
                               int field_based, int bottom_field, int field_select,
B
Benoit Fouet 已提交
1456
                               uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1457
                               int motion_x, int motion_y, int h, int mb_y)
F
Fabrice Bellard 已提交
1458
{
1459
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
B
Benoit Fouet 已提交
1460 1461
    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
    const int lowres= s->avctx->lowres;
1462
    const int op_index= FFMIN(lowres, 2);
B
Benoit Fouet 已提交
1463 1464 1465 1466
    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;
1467
    linesize   = s->current_picture.linesize[0] << field_based;
M
Michael Niedermayer 已提交
1468
    uvlinesize = s->current_picture.linesize[1] << field_based;
1469

1470
    if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
B
Benoit Fouet 已提交
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481
        motion_x/=2;
        motion_y/=2;
    }

    if(field_based){
        motion_y += (bottom_field - field_select)*((1<<lowres)-1);
    }

    sx= motion_x & s_mask;
    sy= motion_y & s_mask;
    src_x = s->mb_x*2*block_s               + (motion_x >> (lowres+1));
1482
    src_y =(   mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1483

M
Michael Niedermayer 已提交
1484
    if (s->out_format == FMT_H263) {
M
Michael Niedermayer 已提交
1485 1486
        uvsx = ((motion_x>>1) & s_mask) | (sx&1);
        uvsy = ((motion_y>>1) & s_mask) | (sy&1);
M
Michael Niedermayer 已提交
1487 1488 1489 1490 1491 1492 1493 1494
        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);
1495
        uvsrc_y =    mb_y*block_s               + (my >> lowres);
M
Michael Niedermayer 已提交
1496 1497 1498 1499 1500 1501
    } 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));
1502
        uvsrc_y =(   mb_y*block_s>>field_based) + (my >> (lowres+1));
M
Michael Niedermayer 已提交
1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
    }

    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;
1514
            if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
M
Michael Niedermayer 已提交
1515
                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1516
                ff_emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based,
M
Michael Niedermayer 已提交
1517
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1518
                ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
M
Michael Niedermayer 已提交
1519 1520 1521 1522 1523 1524
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
                ptr_cb= uvbuf;
                ptr_cr= uvbuf+16;
            }
    }

1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
    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;
    }

1537 1538
    sx= (sx << 2) >> lowres;
    sy= (sy << 2) >> lowres;
M
Michael Niedermayer 已提交
1539
    pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1540

1541
    if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1542 1543 1544 1545
        uvsx= (uvsx << 2) >> lowres;
        uvsy= (uvsy << 2) >> lowres;
        pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
        pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
M
Michael Niedermayer 已提交
1546
    }
M
Michael Niedermayer 已提交
1547
    //FIXME h261 lowres loop filter
M
Michael Niedermayer 已提交
1548 1549
}

M
Michael Niedermayer 已提交
1550 1551 1552 1553 1554 1555
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;
1556
    const int op_index= FFMIN(lowres, 2);
M
Michael Niedermayer 已提交
1557 1558 1559 1560 1561 1562
    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;
1563

M
Michael Niedermayer 已提交
1564 1565 1566 1567 1568 1569 1570 1571 1572
    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);
1573

M
Michael Niedermayer 已提交
1574 1575 1576 1577
    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));
1578

M
Michael Niedermayer 已提交
1579 1580 1581 1582 1583 1584 1585 1586 1587
    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;
        }
1588
    }
1589 1590 1591
    sx= (sx << 2) >> lowres;
    sy= (sy << 2) >> lowres;
    pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1592

M
Michael Niedermayer 已提交
1593 1594 1595 1596 1597
    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;
    }
1598
    pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
M
Michael Niedermayer 已提交
1599 1600
}

M
doxy  
Michael Niedermayer 已提交
1601
/**
D
Diego Biurrun 已提交
1602
 * motion compensation of a single macroblock
M
doxy  
Michael Niedermayer 已提交
1603 1604 1605 1606 1607 1608 1609 1610 1611
 * @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
 */
B
Benoit Fouet 已提交
1612
static inline void MPV_motion_lowres(MpegEncContext *s,
1613
                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1614
                              int dir, uint8_t **ref_picture,
B
Benoit Fouet 已提交
1615
                              h264_chroma_mc_func *pix_op)
F
Fabrice Bellard 已提交
1616
{
B
Benoit Fouet 已提交
1617
    int mx, my;
F
Fabrice Bellard 已提交
1618
    int mb_x, mb_y, i;
B
Benoit Fouet 已提交
1619 1620
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
F
Fabrice Bellard 已提交
1621 1622 1623 1624 1625 1626

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

    switch(s->mv_type) {
    case MV_TYPE_16X16:
B
Benoit Fouet 已提交
1627 1628 1629
        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                    0, 0, 0,
                    ref_picture, pix_op,
1630
                    s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
F
Fabrice Bellard 已提交
1631 1632
        break;
    case MV_TYPE_8X8:
M
Michael Niedermayer 已提交
1633 1634 1635
        mx = 0;
        my = 0;
            for(i=0;i<4;i++) {
B
Benoit Fouet 已提交
1636
                hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1637
                            ref_picture[0], 0, 0,
B
Benoit Fouet 已提交
1638
                            (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
M
Michael Niedermayer 已提交
1639
                            s->width, s->height, s->linesize,
B
Benoit Fouet 已提交
1640 1641
                            s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
                            block_s, block_s, pix_op,
M
Michael Niedermayer 已提交
1642
                            s->mv[dir][i][0], s->mv[dir][i][1]);
M
Michael Niedermayer 已提交
1643 1644 1645

                mx += s->mv[dir][i][0];
                my += s->mv[dir][i][1];
M
Michael Niedermayer 已提交
1646
            }
M
Michael Niedermayer 已提交
1647

1648
        if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
B
Benoit Fouet 已提交
1649
            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
F
Fabrice Bellard 已提交
1650 1651 1652
        break;
    case MV_TYPE_FIELD:
        if (s->picture_structure == PICT_FRAME) {
B
Benoit Fouet 已提交
1653 1654 1655 1656
            /* top field */
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        1, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
1657
                        s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
B
Benoit Fouet 已提交
1658 1659 1660 1661
            /* bottom field */
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        1, 1, s->field_select[dir][1],
                        ref_picture, pix_op,
1662
                        s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
F
Fabrice Bellard 已提交
1663
        } else {
1664
            if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != FF_B_TYPE && !s->first_field){
1665
                ref_picture= s->current_picture_ptr->data;
1666
            }
F
Fabrice Bellard 已提交
1667

B
Benoit Fouet 已提交
1668
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1669 1670
                        0, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
1671
                        s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
F
Fabrice Bellard 已提交
1672
        }
1673
        break;
M
Michael Niedermayer 已提交
1674 1675 1676
    case MV_TYPE_16X8:
        for(i=0; i<2; i++){
            uint8_t ** ref2picture;
1677

1678
            if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == FF_B_TYPE || s->first_field){
1679 1680
                ref2picture= ref_picture;
            }else{
1681
                ref2picture= s->current_picture_ptr->data;
1682
            }
1683

B
Benoit Fouet 已提交
1684
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1685
                        0, 0, s->field_select[dir][i],
1686
                        ref2picture, pix_op,
1687
                        s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1688

B
Benoit Fouet 已提交
1689 1690 1691
            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;
1692
        }
F
Fabrice Bellard 已提交
1693
        break;
1694 1695
    case MV_TYPE_DMV:
        if(s->picture_structure == PICT_FRAME){
M
Michael Niedermayer 已提交
1696 1697 1698
            for(i=0; i<2; i++){
                int j;
                for(j=0; j<2; j++){
B
Benoit Fouet 已提交
1699
                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1700 1701
                                1, j, j^i,
                                ref_picture, pix_op,
1702
                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
M
Michael Niedermayer 已提交
1703
                }
B
Benoit Fouet 已提交
1704
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
M
Michael Niedermayer 已提交
1705
            }
1706
        }else{
M
Michael Niedermayer 已提交
1707
            for(i=0; i<2; i++){
B
Benoit Fouet 已提交
1708
                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1709 1710
                            0, 0, s->picture_structure != i+1,
                            ref_picture, pix_op,
1711
                            s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1712

M
Michael Niedermayer 已提交
1713
                // after put we make avg of the same block
B
Benoit Fouet 已提交
1714
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1715

M
Michael Niedermayer 已提交
1716 1717
                //opposite parity is always in the same frame if this is second field
                if(!s->first_field){
1718
                    ref_picture = s->current_picture_ptr->data;
M
Michael Niedermayer 已提交
1719
                }
1720
            }
1721 1722
        }
    break;
M
Michael Niedermayer 已提交
1723
    default: assert(0);
F
Fabrice Bellard 已提交
1724 1725 1726
    }
}

B
Benoit Fouet 已提交
1727 1728 1729
/* put block[] to dest[] */
static inline void put_dct(MpegEncContext *s,
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
M
Michael Niedermayer 已提交
1730
{
B
Benoit Fouet 已提交
1731 1732 1733
    s->dct_unquantize_intra(s, block, i, qscale);
    s->dsp.idct_put (dest, line_size, block);
}
1734

B
Benoit Fouet 已提交
1735 1736 1737 1738 1739 1740 1741 1742
/* add block[] to dest[] */
static inline void add_dct(MpegEncContext *s,
                           DCTELEM *block, int i, uint8_t *dest, int line_size)
{
    if (s->block_last_index[i] >= 0) {
        s->dsp.idct_add (dest, line_size, block);
    }
}
1743

1744
static inline void add_dequant_dct(MpegEncContext *s,
M
Michael Niedermayer 已提交
1745
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
M
Michael Niedermayer 已提交
1746
{
F
Fabrice Bellard 已提交
1747
    if (s->block_last_index[i] >= 0) {
1748
        s->dct_unquantize_inter(s, block, i, qscale);
1749

1750
        s->dsp.idct_add (dest, line_size, block);
F
Fabrice Bellard 已提交
1751 1752 1753
    }
}

1754 1755 1756 1757 1758
/**
 * cleans dc, ac, coded_block for the current non intra MB
 */
void ff_clean_intra_table_entries(MpegEncContext *s)
{
1759
    int wrap = s->b8_stride;
1760
    int xy = s->block_index[0];
1761 1762 1763

    s->dc_val[0][xy           ] =
    s->dc_val[0][xy + 1       ] =
1764 1765 1766
    s->dc_val[0][xy     + wrap] =
    s->dc_val[0][xy + 1 + wrap] = 1024;
    /* ac pred */
1767 1768
    memset(s->ac_val[0][xy       ], 0, 32 * sizeof(int16_t));
    memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1769 1770 1771 1772 1773 1774 1775
    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 */
1776 1777
    wrap = s->mb_stride;
    xy = s->mb_x + s->mb_y * wrap;
1778 1779 1780
    s->dc_val[1][xy] =
    s->dc_val[2][xy] = 1024;
    /* ac pred */
1781 1782
    memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
    memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1783

1784
    s->mbintra_table[xy]= 0;
1785 1786
}

F
Fabrice Bellard 已提交
1787 1788 1789 1790 1791 1792 1793 1794 1795 1796
/* 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)
 */
1797 1798
static av_always_inline
void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
K
Keiji Costantini 已提交
1799
                            int lowres_flag, int is_mpeg12)
F
Fabrice Bellard 已提交
1800
{
1801
    const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
1802
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1803
        ff_xvmc_decode_mb(s);//xvmc uses pblocks
I
Ivan Kalvachev 已提交
1804 1805
        return;
    }
F
Fabrice Bellard 已提交
1806

1807 1808 1809 1810 1811 1812 1813 1814 1815
    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 已提交
1816
    s->current_picture.qscale_table[mb_xy]= s->qscale;
1817

F
Fabrice Bellard 已提交
1818 1819
    /* update DC predictors for P macroblocks */
    if (!s->mb_intra) {
K
Keiji Costantini 已提交
1820
        if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
M
Michael Niedermayer 已提交
1821
            if(s->mbintra_table[mb_xy])
1822
                ff_clean_intra_table_entries(s);
F
Fabrice Bellard 已提交
1823
        } else {
1824 1825
            s->last_dc[0] =
            s->last_dc[1] =
F
Fabrice Bellard 已提交
1826 1827 1828
            s->last_dc[2] = 128 << s->intra_dc_precision;
        }
    }
K
Keiji Costantini 已提交
1829
    else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
M
Michael Niedermayer 已提交
1830
        s->mbintra_table[mb_xy]=1;
1831

1832
    if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==FF_B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
1833
        uint8_t *dest_y, *dest_cb, *dest_cr;
M
Michael Niedermayer 已提交
1834
        int dct_linesize, dct_offset;
M
Michael Niedermayer 已提交
1835 1836
        op_pixels_func (*op_pix)[4];
        qpel_mc_func (*op_qpix)[16];
1837
        const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
M
Michael Niedermayer 已提交
1838
        const int uvlinesize= s->current_picture.linesize[1];
1839
        const int readable= s->pict_type != FF_B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
M
Michael Niedermayer 已提交
1840
        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
1841

M
cleanup  
Michael Niedermayer 已提交
1842 1843 1844
        /* 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){
1845
            uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
M
cleanup  
Michael Niedermayer 已提交
1846
            const int age= s->current_picture.age;
M
Michael Niedermayer 已提交
1847

M
cleanup  
Michael Niedermayer 已提交
1848 1849
            assert(age);

1850 1851
            if (s->mb_skipped) {
                s->mb_skipped= 0;
1852
                assert(s->pict_type!=FF_I_TYPE);
1853

1854
                (*mbskip_ptr) ++; /* indicate that this time we skipped it */
M
Michael Niedermayer 已提交
1855 1856
                if(*mbskip_ptr >99) *mbskip_ptr= 99;

M
cleanup  
Michael Niedermayer 已提交
1857
                /* if previous was skipped too, then nothing to do !  */
1858 1859
                if (*mbskip_ptr >= age && s->current_picture.reference){
                    return;
M
cleanup  
Michael Niedermayer 已提交
1860
                }
1861 1862 1863 1864
            } 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{
1865 1866
                *mbskip_ptr = 0; /* not skipped */
            }
M
Michael Niedermayer 已提交
1867
        }
1868

1869
        dct_linesize = linesize << s->interlaced_dct;
M
Michael Niedermayer 已提交
1870
        dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
1871

1872 1873 1874 1875 1876
        if(readable){
            dest_y=  s->dest[0];
            dest_cb= s->dest[1];
            dest_cr= s->dest[2];
        }else{
1877
            dest_y = s->b_scratchpad;
1878
            dest_cb= s->b_scratchpad+16*linesize;
1879
            dest_cr= s->b_scratchpad+32*linesize;
1880
        }
M
Michael Niedermayer 已提交
1881

F
Fabrice Bellard 已提交
1882 1883
        if (!s->mb_intra) {
            /* motion handling */
1884
            /* decoding or more than one mb_type (MC was already done otherwise) */
1885
            if(!s->encoding){
M
Michael Niedermayer 已提交
1886 1887
                if(lowres_flag){
                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
F
Fabrice Bellard 已提交
1888

M
Michael Niedermayer 已提交
1889 1890 1891 1892 1893 1894 1895 1896
                    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{
1897
                    op_qpix= s->me.qpel_put;
1898
                    if ((!s->no_rounding) || s->pict_type==FF_B_TYPE){
M
Michael Niedermayer 已提交
1899 1900 1901 1902 1903 1904 1905
                        op_pix = s->dsp.put_pixels_tab;
                    }else{
                        op_pix = s->dsp.put_no_rnd_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;
1906
                        op_qpix= s->me.qpel_avg;
M
Michael Niedermayer 已提交
1907 1908 1909 1910
                    }
                    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);
                    }
1911
                }
F
Fabrice Bellard 已提交
1912 1913
            }

M
Michael Niedermayer 已提交
1914
            /* skip dequant / idct if we are really late ;) */
M
Michael Niedermayer 已提交
1915 1916
            if(s->hurry_up>1) goto skip_idct;
            if(s->avctx->skip_idct){
1917 1918
                if(  (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == FF_B_TYPE)
                   ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != FF_I_TYPE)
M
Michael Niedermayer 已提交
1919 1920 1921
                   || s->avctx->skip_idct >= AVDISCARD_ALL)
                    goto skip_idct;
            }
M
Michael Niedermayer 已提交
1922

F
Fabrice Bellard 已提交
1923
            /* add dct residue */
M
Michael Niedermayer 已提交
1924
            if(s->encoding || !(   s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
1925
                                || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
M
Michael Niedermayer 已提交
1926 1927 1928 1929
                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 已提交
1930

1931
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942
                    if (s->chroma_y_shift){
                        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);
                    }else{
                        dct_linesize >>= 1;
                        dct_offset >>=1;
                        add_dequant_dct(s, block[4], 4, dest_cb,              dct_linesize, s->chroma_qscale);
                        add_dequant_dct(s, block[5], 5, dest_cr,              dct_linesize, s->chroma_qscale);
                        add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
                        add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
                    }
M
Michael Niedermayer 已提交
1943
                }
K
Keiji Costantini 已提交
1944
            } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
M
Michael Niedermayer 已提交
1945 1946 1947 1948
                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 已提交
1949

1950
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971
                    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
            }
1972
            else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
M
Michael Niedermayer 已提交
1973
                ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
M
Michael Niedermayer 已提交
1974
            }
F
Fabrice Bellard 已提交
1975 1976
        } else {
            /* dct only in intra block */
M
Michael Niedermayer 已提交
1977
            if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
M
Michael Niedermayer 已提交
1978 1979 1980 1981
                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);
1982

1983
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1984 1985 1986 1987 1988 1989 1990 1991 1992
                    if(s->chroma_y_shift){
                        put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
                        put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
                    }else{
                        dct_offset >>=1;
                        dct_linesize >>=1;
                        put_dct(s, block[4], 4, dest_cb,              dct_linesize, s->chroma_qscale);
                        put_dct(s, block[5], 5, dest_cr,              dct_linesize, s->chroma_qscale);
                        put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
B
Benoit Fouet 已提交
1993
                        put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
M
Michael Niedermayer 已提交
1994 1995 1996
                    }
                }
            }else{
B
Benoit Fouet 已提交
1997 1998 1999 2000
                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]);
2001

2002
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
B
Benoit Fouet 已提交
2003 2004 2005 2006
                    if(s->chroma_y_shift){
                        s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
                        s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
                    }else{
2007

B
Benoit Fouet 已提交
2008 2009
                        dct_linesize = uvlinesize << s->interlaced_dct;
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2010

B
Benoit Fouet 已提交
2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
                        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
2023
            }
M
Michael Niedermayer 已提交
2024
        }
B
Benoit Fouet 已提交
2025 2026 2027 2028 2029
skip_idct:
        if(!readable){
            s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y ,   linesize,16);
            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);
2030
        }
M
Michael Niedermayer 已提交
2031 2032 2033
    }
}

B
Benoit Fouet 已提交
2034
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2035
#if !CONFIG_SMALL
K
Keiji Costantini 已提交
2036 2037 2038 2039 2040 2041 2042
    if(s->out_format == FMT_MPEG1) {
        if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
        else                 MPV_decode_mb_internal(s, block, 0, 1);
    } else
#endif
    if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
    else                  MPV_decode_mb_internal(s, block, 0, 0);
M
Michael Niedermayer 已提交
2043 2044
}

B
Benoit Fouet 已提交
2045 2046 2047 2048 2049 2050 2051
/**
 *
 * @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){
    if (s->avctx->draw_horiz_band) {
        AVFrame *src;
2052
        const int field_pic= s->picture_structure != PICT_FRAME;
B
Benoit Fouet 已提交
2053
        int offset[4];
M
Michael Niedermayer 已提交
2054

2055 2056 2057
        h= FFMIN(h, (s->avctx->height>>field_pic) - y);

        if(field_pic && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)){
B
Benoit Fouet 已提交
2058 2059
            h <<= 1;
            y <<= 1;
2060
            if(s->first_field) return;
M
Michael Niedermayer 已提交
2061 2062
        }

2063
        if(s->pict_type==FF_B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
B
Benoit Fouet 已提交
2064 2065 2066 2067 2068
            src= (AVFrame*)s->current_picture_ptr;
        else if(s->last_picture_ptr)
            src= (AVFrame*)s->last_picture_ptr;
        else
            return;
2069

2070
        if(s->pict_type==FF_B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
B
Benoit Fouet 已提交
2071 2072 2073 2074
            offset[0]=
            offset[1]=
            offset[2]=
            offset[3]= 0;
M
Michael Niedermayer 已提交
2075
        }else{
M
Fix ;;  
Michael Niedermayer 已提交
2076
            offset[0]= y * s->linesize;
B
Benoit Fouet 已提交
2077 2078 2079
            offset[1]=
            offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
            offset[3]= 0;
M
Michael Niedermayer 已提交
2080
        }
2081

B
Benoit Fouet 已提交
2082
        emms_c();
M
Michael Niedermayer 已提交
2083

B
Benoit Fouet 已提交
2084 2085 2086 2087
        s->avctx->draw_horiz_band(s->avctx, src, offset,
                                  y, s->picture_structure, h);
    }
}
2088

B
Benoit Fouet 已提交
2089 2090 2091 2092
void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
    const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
    const int uvlinesize= s->current_picture.linesize[1];
    const int mb_size= 4 - s->avctx->lowres;
M
Michael Niedermayer 已提交
2093

B
Benoit Fouet 已提交
2094 2095 2096 2097 2098 2099 2100
    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;
    //block_index is not used by mpeg2, so it is not affected by chroma_format
2101

B
Benoit Fouet 已提交
2102 2103 2104
    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));
2105

2106
    if(!(s->pict_type==FF_B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
B
Benoit Fouet 已提交
2107
    {
2108
        if(s->picture_structure==PICT_FRAME){
B
Benoit Fouet 已提交
2109 2110 2111
        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);
2112 2113 2114 2115 2116 2117
        }else{
            s->dest[0] += (s->mb_y>>1) *   linesize << mb_size;
            s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
            s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
            assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
        }
M
Michael Niedermayer 已提交
2118 2119
    }
}
2120

B
Benoit Fouet 已提交
2121 2122 2123
void ff_mpeg_flush(AVCodecContext *avctx){
    int i;
    MpegEncContext *s = avctx->priv_data;
M
Michael Niedermayer 已提交
2124

B
Benoit Fouet 已提交
2125 2126
    if(s==NULL || s->picture==NULL)
        return;
M
Michael Niedermayer 已提交
2127

B
Benoit Fouet 已提交
2128 2129 2130
    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))
2131
        free_frame_buffer(s, &s->picture[i]);
F
Fabrice Bellard 已提交
2132
    }
B
Benoit Fouet 已提交
2133
    s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2134

B
Benoit Fouet 已提交
2135
    s->mb_x= s->mb_y= 0;
2136
    s->closed_gop= 0;
M
Michael Niedermayer 已提交
2137

B
Benoit Fouet 已提交
2138 2139 2140 2141 2142 2143 2144 2145
    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;
    s->bitstream_buffer_size=0;
    s->pp_time=0;
F
Fabrice Bellard 已提交
2146 2147
}

2148
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2149
                                   DCTELEM *block, int n, int qscale)
F
Fabrice Bellard 已提交
2150
{
M
Michael Niedermayer 已提交
2151
    int i, level, nCoeffs;
2152
    const uint16_t *quant_matrix;
F
Fabrice Bellard 已提交
2153

2154
    nCoeffs= s->block_last_index[n];
2155 2156

    if (n < 4)
2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173
        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 已提交
2174
            }
2175
            block[j] = level;
F
Fabrice Bellard 已提交
2176
        }
2177 2178 2179
    }
}

2180
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2181 2182 2183 2184 2185 2186
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
    const uint16_t *quant_matrix;

    nCoeffs= s->block_last_index[n];
2187

2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202
    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 已提交
2203
            }
2204
            block[j] = level;
F
Fabrice Bellard 已提交
2205 2206 2207
        }
    }
}
2208

2209
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2210 2211 2212
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
2213
    const uint16_t *quant_matrix;
2214

2215 2216
    if(s->alternate_scan) nCoeffs= 63;
    else nCoeffs= s->block_last_index[n];
2217 2218

    if (n < 4)
2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238
        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;
        }
    }
}

2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271
static void dct_unquantize_mpeg2_intra_bitexact(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];

    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;
            sum+=level;
        }
    }
    block[63]^=sum&1;
}

2272
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2273 2274 2275 2276 2277 2278 2279 2280
                                   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];
2281

2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302
    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;
}

2303
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2304 2305 2306 2307
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
    int nCoeffs;
2308

2309
    assert(s->block_last_index[n]>=0);
2310

2311
    qmul = qscale << 1;
2312

2313
    if (!s->h263_aic) {
2314
        if (n < 4)
2315 2316 2317
            block[0] = block[0] * s->y_dc_scale;
        else
            block[0] = block[0] * s->c_dc_scale;
2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333
        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;
2334
            }
2335
            block[i] = level;
2336 2337 2338 2339
        }
    }
}

2340
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2341 2342 2343
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
M
Michael Niedermayer 已提交
2344
    int nCoeffs;
2345

2346
    assert(s->block_last_index[n]>=0);
2347

2348 2349
    qadd = (qscale - 1) | 1;
    qmul = qscale << 1;
2350

2351
    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2352

2353
    for(i=0; i<=nCoeffs; i++) {
2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
        level = block[i];
        if (level) {
            if (level < 0) {
                level = level * qmul - qadd;
            } else {
                level = level * qmul + qadd;
            }
            block[i] = level;
        }
    }
}
F
Fabrice Bellard 已提交
2365

2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381
/**
 * set qscale and update qscale dependent variables.
 */
void ff_set_qscale(MpegEncContext * s, int qscale)
{
    if (qscale < 1)
        qscale = 1;
    else if (qscale > 31)
        qscale = 31;

    s->qscale = qscale;
    s->chroma_qscale= s->chroma_qscale_table[qscale];

    s->y_dc_scale= s->y_dc_scale_table[ qscale ];
    s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
}