mpegvideo.c 89.0 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
alloc:
    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
    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);
951

952
    if(s->pict_type != FF_I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && !s->dropable && s->codec_id != CODEC_ID_H264){
953
        av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
954
        assert(s->pict_type != FF_B_TYPE); //these should have been dropped if we don't have a reference
955 956 957
        goto alloc;
    }

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

960
    if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
M
Michael Niedermayer 已提交
961 962 963 964
        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];
965
            }
M
Michael Niedermayer 已提交
966 967 968 969 970
            s->current_picture.linesize[i] *= 2;
            s->last_picture.linesize[i] *=2;
            s->next_picture.linesize[i] *=2;
        }
    }
971

972
    s->hurry_up= s->avctx->hurry_up;
973
    s->error_recognition= avctx->error_recognition;
974

D
Diego Biurrun 已提交
975
    /* set dequantizer, we can't do it during init as it might change for mpeg4
D
Diego Biurrun 已提交
976
       and we can't do it in the header decode as init is not called for mpeg4 there yet */
977 978 979
    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 已提交
980
    }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
981 982 983 984 985 986
        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;
    }
987

988 989 990 991 992
    if(s->dct_error_sum){
        assert(s->avctx->noise_reduction && s->encoding);

        update_noise_reduction(s);
    }
993

994
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
995
        return ff_xvmc_field_start(s, avctx);
996

997
    return 0;
F
Fabrice Bellard 已提交
998
}
999

F
Fabrice Bellard 已提交
1000 1001 1002
/* generic function for encode/decode called after a frame has been coded/decoded */
void MPV_frame_end(MpegEncContext *s)
{
M
cleanup  
Michael Niedermayer 已提交
1003
    int i;
F
Fabrice Bellard 已提交
1004
    /* draw edge for correct motion prediction if outside */
1005
    //just to make sure that all data is rendered.
1006
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1007
        ff_xvmc_field_end(s);
1008 1009
    }else if(!s->avctx->hwaccel
       && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1010 1011 1012 1013
       && s->unrestricted_mv
       && s->current_picture.reference
       && !s->intra_only
       && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
A
Aurelien Jacobs 已提交
1014 1015 1016
            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 已提交
1017
    }
M
Michael Niedermayer 已提交
1018
    emms_c();
1019

M
Michael Niedermayer 已提交
1020
    s->last_pict_type    = s->pict_type;
1021
    s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1022
    if(s->pict_type!=FF_B_TYPE){
1023 1024
        s->last_non_b_pict_type= s->pict_type;
    }
M
Michael Niedermayer 已提交
1025 1026
#if 0
        /* copy back current_picture variables */
M
cleanup  
Michael Niedermayer 已提交
1027 1028 1029 1030
    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;
1031
        }
M
cleanup  
Michael Niedermayer 已提交
1032 1033
    }
    assert(i<MAX_PICTURE_COUNT);
1034
#endif
M
cleanup  
Michael Niedermayer 已提交
1035

M
Michael Niedermayer 已提交
1036
    if(s->encoding){
D
Diego Biurrun 已提交
1037
        /* release non-reference frames */
M
Michael Niedermayer 已提交
1038 1039
        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*/){
1040
                free_frame_buffer(s, &s->picture[i]);
M
Michael Niedermayer 已提交
1041 1042
            }
        }
M
cleanup  
Michael Niedermayer 已提交
1043
    }
M
Michael Niedermayer 已提交
1044 1045 1046 1047 1048 1049
    // 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 已提交
1050
    s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
F
Fabrice Bellard 已提交
1051 1052
}

1053 1054 1055 1056 1057 1058 1059 1060
/**
 * 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 已提交
1061
    int x, y, fr, f;
1062

1063 1064 1065 1066
    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);
1067

1068
    buf[sy*stride + sx]+= color;
1069

D
Diego Biurrun 已提交
1070
    if(FFABS(ex - sx) > FFABS(ey - sy)){
1071
        if(sx > ex){
D
Diego Biurrun 已提交
1072 1073
            FFSWAP(int, sx, ex);
            FFSWAP(int, sy, ey);
1074 1075 1076 1077 1078
        }
        buf+= sx + sy*stride;
        ex-= sx;
        f= ((ey-sy)<<16)/ex;
        for(x= 0; x <= ex; x++){
1079 1080 1081 1082
            y = (x*f)>>16;
            fr= (x*f)&0xFFFF;
            buf[ y   *stride + x]+= (color*(0x10000-fr))>>16;
            buf[(y+1)*stride + x]+= (color*         fr )>>16;
1083 1084 1085
        }
    }else{
        if(sy > ey){
D
Diego Biurrun 已提交
1086 1087
            FFSWAP(int, sx, ex);
            FFSWAP(int, sy, ey);
1088 1089 1090 1091 1092 1093
        }
        buf+= sx + sy*stride;
        ey-= sy;
        if(ey) f= ((ex-sx)<<16)/ey;
        else   f= 0;
        for(y= 0; y <= ey; y++){
1094 1095
            x = (y*f)>>16;
            fr= (y*f)&0xFFFF;
M
Fix ;;  
Michael Niedermayer 已提交
1096 1097
            buf[y*stride + x  ]+= (color*(0x10000-fr))>>16;
            buf[y*stride + x+1]+= (color*         fr )>>16;
1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
        }
    }
}

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

1112 1113 1114 1115
    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);
1116

1117 1118
    dx= ex - sx;
    dy= ey - sy;
1119

1120 1121 1122 1123
    if(dx*dx + dy*dy > 3*3){
        int rx=  dx + dy;
        int ry= -dx + dy;
        int length= ff_sqrt((rx*rx + ry*ry)<<8);
1124

1125 1126 1127
        //FIXME subpixel accuracy
        rx= ROUNDED_DIV(rx*3<<4, length);
        ry= ROUNDED_DIV(ry*3<<4, length);
1128

1129 1130 1131 1132 1133 1134
        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);
}

1135 1136 1137
/**
 * prints debuging info for the given picture.
 */
1138
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1139

1140
    if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1141 1142 1143

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

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

1194 1195
                    //segmentation
                    if(IS_8X8(mb_type))
1196
                        av_log(s->avctx, AV_LOG_DEBUG, "+");
1197
                    else if(IS_16X8(mb_type))
1198
                        av_log(s->avctx, AV_LOG_DEBUG, "-");
1199
                    else if(IS_8X16(mb_type))
1200
                        av_log(s->avctx, AV_LOG_DEBUG, "|");
1201
                    else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1202
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1203
                    else
1204
                        av_log(s->avctx, AV_LOG_DEBUG, "?");
1205 1206


1207
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1208
                        av_log(s->avctx, AV_LOG_DEBUG, "=");
1209
                    else
1210
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1211
                }
1212
//                av_log(s->avctx, AV_LOG_DEBUG, " ");
1213
            }
1214
            av_log(s->avctx, AV_LOG_DEBUG, "\n");
1215 1216
        }
    }
1217

1218
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1219 1220
        const int shift= 1 + s->quarter_sample;
        int mb_y;
1221 1222
        uint8_t *ptr;
        int i;
1223
        int h_chroma_shift, v_chroma_shift, block_height;
1224 1225
        const int width = s->avctx->width;
        const int height= s->avctx->height;
1226
        const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1227
        const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
M
100000l  
Michael Niedermayer 已提交
1228
        s->low_delay=0; //needed to see the vectors without trashing the buffers
1229

1230
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1231
        for(i=0; i<3; i++){
1232
            memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1233 1234 1235 1236
            pict->data[i]= s->visualization_buffer[i];
        }
        pict->type= FF_BUFFER_TYPE_COPY;
        ptr= pict->data[0];
1237
        block_height = 16>>v_chroma_shift;
1238 1239 1240 1241 1242

        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;
1243 1244 1245
                if((s->avctx->debug_mv) && pict->motion_val){
                  int type;
                  for(type=0; type<3; type++){
1246
                    int direction = 0;
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
                    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;
                    }
1261 1262 1263
                    if(!USES_LIST(pict->mb_type[mb_index], direction))
                        continue;

1264 1265 1266
                    if(IS_8X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<4; i++){
1267 1268
                        int sx= mb_x*16 + 4 + 8*(i&1);
                        int sy= mb_y*16 + 4 + 8*(i>>1);
1269
                        int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1270 1271
                        int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                        int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1272
                        draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1273 1274 1275 1276
                      }
                    }else if(IS_16X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<2; i++){
1277 1278
                        int sx=mb_x*16 + 8;
                        int sy=mb_y*16 + 4 + 8*i;
1279
                        int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1280 1281
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
1282

1283 1284
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
1285

1286 1287 1288 1289 1290 1291 1292
                        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;
1293
                        int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1294 1295
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
1296

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

1300
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1301 1302 1303 1304
                      }
                    }else{
                      int sx= mb_x*16 + 8;
                      int sy= mb_y*16 + 8;
1305
                      int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1306 1307
                      int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                      int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1308
                      draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1309
                    }
1310
                  }
M
Michael Niedermayer 已提交
1311 1312 1313 1314
                }
                if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
                    uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
                    int y;
1315 1316 1317
                    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 已提交
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
                    }
                }
                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));

1328

M
Michael Niedermayer 已提交
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356
                    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;
1357 1358 1359
                    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 已提交
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
                    }

                    //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;
                    }
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385
                    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;
                        }
                    }
1386

M
Michael Niedermayer 已提交
1387 1388 1389
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
                        // hmm
                    }
1390 1391 1392 1393 1394
                }
                s->mbskip_table[mb_index]=0;
            }
        }
    }
1395 1396
}

1397
static inline int hpel_motion_lowres(MpegEncContext *s,
M
Michael Niedermayer 已提交
1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
                                  uint8_t *dest, uint8_t *src,
                                  int field_based, int field_select,
                                  int src_x, int src_y,
                                  int width, int height, int stride,
                                  int h_edge_pos, int v_edge_pos,
                                  int w, int h, h264_chroma_mc_func *pix_op,
                                  int motion_x, int motion_y)
{
    const int lowres= s->avctx->lowres;
    const int s_mask= (2<<lowres)-1;
    int emu=0;
    int sx, sy;

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

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

M
Michael Niedermayer 已提交
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438
    src += src_y * stride + src_x;

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

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

F
Fabrice Bellard 已提交
1439
/* apply one mpeg motion vector to the three components */
B
Benoit Fouet 已提交
1440
static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1441
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1442
                               int field_based, int bottom_field, int field_select,
B
Benoit Fouet 已提交
1443
                               uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
F
Fabrice Bellard 已提交
1444 1445
                               int motion_x, int motion_y, int h)
{
1446
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
B
Benoit Fouet 已提交
1447 1448 1449 1450 1451 1452
    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
    const int s_mask= (2<<lowres)-1;
    const int h_edge_pos = s->h_edge_pos >> lowres;
    const int v_edge_pos = s->v_edge_pos >> lowres;
1453
    linesize   = s->current_picture.linesize[0] << field_based;
M
Michael Niedermayer 已提交
1454
    uvlinesize = s->current_picture.linesize[1] << field_based;
1455

1456
    if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
B
Benoit Fouet 已提交
1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
        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));
    src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1469

M
Michael Niedermayer 已提交
1470
    if (s->out_format == FMT_H263) {
M
Michael Niedermayer 已提交
1471 1472
        uvsx = ((motion_x>>1) & s_mask) | (sx&1);
        uvsy = ((motion_y>>1) & s_mask) | (sy&1);
M
Michael Niedermayer 已提交
1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
        uvsrc_x = src_x>>1;
        uvsrc_y = src_y>>1;
    }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
        mx = motion_x / 4;
        my = motion_y / 4;
        uvsx = (2*mx) & s_mask;
        uvsy = (2*my) & s_mask;
        uvsrc_x = s->mb_x*block_s               + (mx >> lowres);
        uvsrc_y = s->mb_y*block_s               + (my >> lowres);
    } else {
        mx = motion_x / 2;
        my = motion_y / 2;
        uvsx = mx & s_mask;
        uvsy = my & s_mask;
        uvsrc_x = s->mb_x*block_s               + (mx >> (lowres+1));
1488
        uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
M
Michael Niedermayer 已提交
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
    }

    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;
1500
            if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
M
Michael Niedermayer 已提交
1501
                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1502
                ff_emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based,
M
Michael Niedermayer 已提交
1503
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1504
                ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
M
Michael Niedermayer 已提交
1505 1506 1507 1508 1509 1510
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
                ptr_cb= uvbuf;
                ptr_cr= uvbuf+16;
            }
    }

1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
    if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
        dest_y += s->linesize;
        dest_cb+= s->uvlinesize;
        dest_cr+= s->uvlinesize;
    }

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

M
Michael Niedermayer 已提交
1523 1524 1525
    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1526

1527
    if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
M
Michael Niedermayer 已提交
1528 1529 1530 1531 1532
        uvsx <<= 2 - lowres;
        uvsy <<= 2 - lowres;
        pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
        pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
    }
M
Michael Niedermayer 已提交
1533
    //FIXME h261 lowres loop filter
M
Michael Niedermayer 已提交
1534 1535
}

M
Michael Niedermayer 已提交
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
                                     uint8_t *dest_cb, uint8_t *dest_cr,
                                     uint8_t **ref_picture,
                                     h264_chroma_mc_func *pix_op,
                                     int mx, int my){
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
    const int s_mask= (2<<lowres)-1;
    const int h_edge_pos = s->h_edge_pos >> (lowres+1);
    const int v_edge_pos = s->v_edge_pos >> (lowres+1);
    int emu=0, src_x, src_y, offset, sx, sy;
    uint8_t *ptr;
1548

M
Michael Niedermayer 已提交
1549 1550 1551 1552 1553 1554 1555 1556 1557
    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);
1558

M
Michael Niedermayer 已提交
1559 1560 1561 1562
    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));
1563

M
Michael Niedermayer 已提交
1564 1565 1566 1567 1568 1569 1570 1571 1572
    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;
        }
1573
    }
M
Michael Niedermayer 已提交
1574 1575 1576
    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1577

M
Michael Niedermayer 已提交
1578 1579 1580 1581 1582 1583 1584 1585
    ptr = ref_picture[2] + offset;
    if(emu){
        ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
        ptr= s->edge_emu_buffer;
    }
    pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
}

M
doxy  
Michael Niedermayer 已提交
1586
/**
D
Diego Biurrun 已提交
1587
 * motion compensation of a single macroblock
M
doxy  
Michael Niedermayer 已提交
1588 1589 1590 1591 1592 1593 1594 1595 1596
 * @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 已提交
1597
static inline void MPV_motion_lowres(MpegEncContext *s,
1598
                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1599
                              int dir, uint8_t **ref_picture,
B
Benoit Fouet 已提交
1600
                              h264_chroma_mc_func *pix_op)
F
Fabrice Bellard 已提交
1601
{
B
Benoit Fouet 已提交
1602
    int mx, my;
F
Fabrice Bellard 已提交
1603
    int mb_x, mb_y, i;
B
Benoit Fouet 已提交
1604 1605
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
F
Fabrice Bellard 已提交
1606 1607 1608 1609 1610 1611

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

    switch(s->mv_type) {
    case MV_TYPE_16X16:
B
Benoit Fouet 已提交
1612 1613 1614 1615
        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                    0, 0, 0,
                    ref_picture, pix_op,
                    s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
F
Fabrice Bellard 已提交
1616 1617
        break;
    case MV_TYPE_8X8:
M
Michael Niedermayer 已提交
1618 1619 1620
        mx = 0;
        my = 0;
            for(i=0;i<4;i++) {
B
Benoit Fouet 已提交
1621
                hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1622
                            ref_picture[0], 0, 0,
B
Benoit Fouet 已提交
1623
                            (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
M
Michael Niedermayer 已提交
1624
                            s->width, s->height, s->linesize,
B
Benoit Fouet 已提交
1625 1626
                            s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
                            block_s, block_s, pix_op,
M
Michael Niedermayer 已提交
1627
                            s->mv[dir][i][0], s->mv[dir][i][1]);
M
Michael Niedermayer 已提交
1628 1629 1630

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

1633
        if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
B
Benoit Fouet 已提交
1634
            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
F
Fabrice Bellard 已提交
1635 1636 1637
        break;
    case MV_TYPE_FIELD:
        if (s->picture_structure == PICT_FRAME) {
B
Benoit Fouet 已提交
1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
            /* top field */
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        1, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
                        s->mv[dir][0][0], s->mv[dir][0][1], block_s);
            /* bottom field */
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
                        1, 1, s->field_select[dir][1],
                        ref_picture, pix_op,
                        s->mv[dir][1][0], s->mv[dir][1][1], block_s);
F
Fabrice Bellard 已提交
1648
        } else {
1649
            if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != FF_B_TYPE && !s->first_field){
1650
                ref_picture= s->current_picture_ptr->data;
1651
            }
F
Fabrice Bellard 已提交
1652

B
Benoit Fouet 已提交
1653
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1654 1655
                        0, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
B
Benoit Fouet 已提交
1656
                        s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
F
Fabrice Bellard 已提交
1657
        }
1658
        break;
M
Michael Niedermayer 已提交
1659 1660 1661
    case MV_TYPE_16X8:
        for(i=0; i<2; i++){
            uint8_t ** ref2picture;
1662

1663
            if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == FF_B_TYPE || s->first_field){
1664 1665
                ref2picture= ref_picture;
            }else{
1666
                ref2picture= s->current_picture_ptr->data;
1667
            }
1668

B
Benoit Fouet 已提交
1669
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1670
                        0, 0, s->field_select[dir][i],
1671
                        ref2picture, pix_op,
B
Benoit Fouet 已提交
1672
                        s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
1673

B
Benoit Fouet 已提交
1674 1675 1676
            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;
1677
        }
F
Fabrice Bellard 已提交
1678
        break;
1679 1680
    case MV_TYPE_DMV:
        if(s->picture_structure == PICT_FRAME){
M
Michael Niedermayer 已提交
1681 1682 1683
            for(i=0; i<2; i++){
                int j;
                for(j=0; j<2; j++){
B
Benoit Fouet 已提交
1684
                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1685 1686
                                1, j, j^i,
                                ref_picture, pix_op,
B
Benoit Fouet 已提交
1687
                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
M
Michael Niedermayer 已提交
1688
                }
B
Benoit Fouet 已提交
1689
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
M
Michael Niedermayer 已提交
1690
            }
1691
        }else{
M
Michael Niedermayer 已提交
1692
            for(i=0; i<2; i++){
B
Benoit Fouet 已提交
1693
                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1694 1695
                            0, 0, s->picture_structure != i+1,
                            ref_picture, pix_op,
B
Benoit Fouet 已提交
1696
                            s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
1697

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

M
Michael Niedermayer 已提交
1701 1702
                //opposite parity is always in the same frame if this is second field
                if(!s->first_field){
1703
                    ref_picture = s->current_picture_ptr->data;
M
Michael Niedermayer 已提交
1704
                }
1705
            }
1706 1707
        }
    break;
M
Michael Niedermayer 已提交
1708
    default: assert(0);
F
Fabrice Bellard 已提交
1709 1710 1711
    }
}

B
Benoit Fouet 已提交
1712 1713 1714
/* 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 已提交
1715
{
B
Benoit Fouet 已提交
1716 1717 1718
    s->dct_unquantize_intra(s, block, i, qscale);
    s->dsp.idct_put (dest, line_size, block);
}
1719

B
Benoit Fouet 已提交
1720 1721 1722 1723 1724 1725 1726 1727
/* 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);
    }
}
1728

1729
static inline void add_dequant_dct(MpegEncContext *s,
M
Michael Niedermayer 已提交
1730
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
M
Michael Niedermayer 已提交
1731
{
F
Fabrice Bellard 已提交
1732
    if (s->block_last_index[i] >= 0) {
1733
        s->dct_unquantize_inter(s, block, i, qscale);
1734

1735
        s->dsp.idct_add (dest, line_size, block);
F
Fabrice Bellard 已提交
1736 1737 1738
    }
}

1739 1740 1741 1742 1743
/**
 * cleans dc, ac, coded_block for the current non intra MB
 */
void ff_clean_intra_table_entries(MpegEncContext *s)
{
1744
    int wrap = s->b8_stride;
1745
    int xy = s->block_index[0];
1746 1747 1748

    s->dc_val[0][xy           ] =
    s->dc_val[0][xy + 1       ] =
1749 1750 1751
    s->dc_val[0][xy     + wrap] =
    s->dc_val[0][xy + 1 + wrap] = 1024;
    /* ac pred */
1752 1753
    memset(s->ac_val[0][xy       ], 0, 32 * sizeof(int16_t));
    memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1754 1755 1756 1757 1758 1759 1760
    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 */
1761 1762
    wrap = s->mb_stride;
    xy = s->mb_x + s->mb_y * wrap;
1763 1764 1765
    s->dc_val[1][xy] =
    s->dc_val[2][xy] = 1024;
    /* ac pred */
1766 1767
    memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
    memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1768

1769
    s->mbintra_table[xy]= 0;
1770 1771
}

F
Fabrice Bellard 已提交
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
/* 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)
 */
1782 1783
static av_always_inline
void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
K
Keiji Costantini 已提交
1784
                            int lowres_flag, int is_mpeg12)
F
Fabrice Bellard 已提交
1785
{
1786
    const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
1787
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1788
        ff_xvmc_decode_mb(s);//xvmc uses pblocks
I
Ivan Kalvachev 已提交
1789 1790
        return;
    }
F
Fabrice Bellard 已提交
1791

1792 1793 1794 1795 1796 1797 1798 1799 1800
    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 已提交
1801
    s->current_picture.qscale_table[mb_xy]= s->qscale;
1802

F
Fabrice Bellard 已提交
1803 1804
    /* update DC predictors for P macroblocks */
    if (!s->mb_intra) {
K
Keiji Costantini 已提交
1805
        if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
M
Michael Niedermayer 已提交
1806
            if(s->mbintra_table[mb_xy])
1807
                ff_clean_intra_table_entries(s);
F
Fabrice Bellard 已提交
1808
        } else {
1809 1810
            s->last_dc[0] =
            s->last_dc[1] =
F
Fabrice Bellard 已提交
1811 1812 1813
            s->last_dc[2] = 128 << s->intra_dc_precision;
        }
    }
K
Keiji Costantini 已提交
1814
    else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
M
Michael Niedermayer 已提交
1815
        s->mbintra_table[mb_xy]=1;
1816

1817
    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
1818
        uint8_t *dest_y, *dest_cb, *dest_cr;
M
Michael Niedermayer 已提交
1819
        int dct_linesize, dct_offset;
M
Michael Niedermayer 已提交
1820 1821
        op_pixels_func (*op_pix)[4];
        qpel_mc_func (*op_qpix)[16];
1822
        const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
M
Michael Niedermayer 已提交
1823
        const int uvlinesize= s->current_picture.linesize[1];
1824
        const int readable= s->pict_type != FF_B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
M
Michael Niedermayer 已提交
1825
        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
1826

M
cleanup  
Michael Niedermayer 已提交
1827 1828 1829
        /* 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){
1830
            uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
M
cleanup  
Michael Niedermayer 已提交
1831
            const int age= s->current_picture.age;
M
Michael Niedermayer 已提交
1832

M
cleanup  
Michael Niedermayer 已提交
1833 1834
            assert(age);

1835 1836
            if (s->mb_skipped) {
                s->mb_skipped= 0;
1837
                assert(s->pict_type!=FF_I_TYPE);
1838

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

M
cleanup  
Michael Niedermayer 已提交
1842
                /* if previous was skipped too, then nothing to do !  */
1843 1844
                if (*mbskip_ptr >= age && s->current_picture.reference){
                    return;
M
cleanup  
Michael Niedermayer 已提交
1845
                }
1846 1847 1848 1849
            } 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{
1850 1851
                *mbskip_ptr = 0; /* not skipped */
            }
M
Michael Niedermayer 已提交
1852
        }
1853

1854
        dct_linesize = linesize << s->interlaced_dct;
M
Michael Niedermayer 已提交
1855
        dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
1856

1857 1858 1859 1860 1861
        if(readable){
            dest_y=  s->dest[0];
            dest_cb= s->dest[1];
            dest_cr= s->dest[2];
        }else{
1862
            dest_y = s->b_scratchpad;
1863
            dest_cb= s->b_scratchpad+16*linesize;
1864
            dest_cr= s->b_scratchpad+32*linesize;
1865
        }
M
Michael Niedermayer 已提交
1866

F
Fabrice Bellard 已提交
1867 1868
        if (!s->mb_intra) {
            /* motion handling */
1869
            /* decoding or more than one mb_type (MC was already done otherwise) */
1870
            if(!s->encoding){
M
Michael Niedermayer 已提交
1871 1872
                if(lowres_flag){
                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
F
Fabrice Bellard 已提交
1873

M
Michael Niedermayer 已提交
1874 1875 1876 1877 1878 1879 1880 1881
                    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{
1882
                    op_qpix= s->me.qpel_put;
1883
                    if ((!s->no_rounding) || s->pict_type==FF_B_TYPE){
M
Michael Niedermayer 已提交
1884 1885 1886 1887 1888 1889 1890
                        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;
1891
                        op_qpix= s->me.qpel_avg;
M
Michael Niedermayer 已提交
1892 1893 1894 1895
                    }
                    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);
                    }
1896
                }
F
Fabrice Bellard 已提交
1897 1898
            }

M
Michael Niedermayer 已提交
1899
            /* skip dequant / idct if we are really late ;) */
M
Michael Niedermayer 已提交
1900 1901
            if(s->hurry_up>1) goto skip_idct;
            if(s->avctx->skip_idct){
1902 1903
                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 已提交
1904 1905 1906
                   || s->avctx->skip_idct >= AVDISCARD_ALL)
                    goto skip_idct;
            }
M
Michael Niedermayer 已提交
1907

F
Fabrice Bellard 已提交
1908
            /* add dct residue */
M
Michael Niedermayer 已提交
1909
            if(s->encoding || !(   s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
1910
                                || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
M
Michael Niedermayer 已提交
1911 1912 1913 1914
                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 已提交
1915

1916
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927
                    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 已提交
1928
                }
K
Keiji Costantini 已提交
1929
            } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
M
Michael Niedermayer 已提交
1930 1931 1932 1933
                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 已提交
1934

1935
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956
                    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
            }
1957
            else if (CONFIG_WMV2) {
M
Michael Niedermayer 已提交
1958
                ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
M
Michael Niedermayer 已提交
1959
            }
F
Fabrice Bellard 已提交
1960 1961
        } else {
            /* dct only in intra block */
M
Michael Niedermayer 已提交
1962
            if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
M
Michael Niedermayer 已提交
1963 1964 1965 1966
                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);
1967

1968
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1969 1970 1971 1972 1973 1974 1975 1976 1977
                    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 已提交
1978
                        put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
M
Michael Niedermayer 已提交
1979 1980 1981
                    }
                }
            }else{
B
Benoit Fouet 已提交
1982 1983 1984 1985
                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]);
1986

1987
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
B
Benoit Fouet 已提交
1988 1989 1990 1991
                    if(s->chroma_y_shift){
                        s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
                        s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
                    }else{
1992

B
Benoit Fouet 已提交
1993 1994
                        dct_linesize = uvlinesize << s->interlaced_dct;
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
1995

B
Benoit Fouet 已提交
1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007
                        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
2008
            }
M
Michael Niedermayer 已提交
2009
        }
B
Benoit Fouet 已提交
2010 2011 2012 2013 2014
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);
2015
        }
M
Michael Niedermayer 已提交
2016 2017 2018
    }
}

B
Benoit Fouet 已提交
2019
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2020
#if !CONFIG_SMALL
K
Keiji Costantini 已提交
2021 2022 2023 2024 2025 2026 2027
    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 已提交
2028 2029
}

B
Benoit Fouet 已提交
2030 2031 2032 2033 2034 2035 2036 2037
/**
 *
 * @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;
        int offset[4];
M
Michael Niedermayer 已提交
2038

B
Benoit Fouet 已提交
2039 2040 2041 2042
        if(s->picture_structure != PICT_FRAME){
            h <<= 1;
            y <<= 1;
            if(s->first_field  && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
M
Michael Niedermayer 已提交
2043 2044
        }

B
Benoit Fouet 已提交
2045
        h= FFMIN(h, s->avctx->height - y);
M
Michael Niedermayer 已提交
2046

2047
        if(s->pict_type==FF_B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
B
Benoit Fouet 已提交
2048 2049 2050 2051 2052
            src= (AVFrame*)s->current_picture_ptr;
        else if(s->last_picture_ptr)
            src= (AVFrame*)s->last_picture_ptr;
        else
            return;
2053

2054
        if(s->pict_type==FF_B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
B
Benoit Fouet 已提交
2055 2056 2057 2058
            offset[0]=
            offset[1]=
            offset[2]=
            offset[3]= 0;
M
Michael Niedermayer 已提交
2059
        }else{
M
Fix ;;  
Michael Niedermayer 已提交
2060
            offset[0]= y * s->linesize;
B
Benoit Fouet 已提交
2061 2062 2063
            offset[1]=
            offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
            offset[3]= 0;
M
Michael Niedermayer 已提交
2064
        }
2065

B
Benoit Fouet 已提交
2066
        emms_c();
M
Michael Niedermayer 已提交
2067

B
Benoit Fouet 已提交
2068 2069 2070 2071
        s->avctx->draw_horiz_band(s->avctx, src, offset,
                                  y, s->picture_structure, h);
    }
}
2072

B
Benoit Fouet 已提交
2073 2074 2075 2076
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 已提交
2077

B
Benoit Fouet 已提交
2078 2079 2080 2081 2082 2083 2084
    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
2085

B
Benoit Fouet 已提交
2086 2087 2088
    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));
2089

2090
    if(!(s->pict_type==FF_B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
B
Benoit Fouet 已提交
2091 2092 2093 2094
    {
        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);
M
Michael Niedermayer 已提交
2095 2096
    }
}
2097

B
Benoit Fouet 已提交
2098 2099 2100
void ff_mpeg_flush(AVCodecContext *avctx){
    int i;
    MpegEncContext *s = avctx->priv_data;
M
Michael Niedermayer 已提交
2101

B
Benoit Fouet 已提交
2102 2103
    if(s==NULL || s->picture==NULL)
        return;
M
Michael Niedermayer 已提交
2104

B
Benoit Fouet 已提交
2105 2106 2107
    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))
2108
        free_frame_buffer(s, &s->picture[i]);
F
Fabrice Bellard 已提交
2109
    }
B
Benoit Fouet 已提交
2110
    s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2111

B
Benoit Fouet 已提交
2112
    s->mb_x= s->mb_y= 0;
2113
    s->closed_gop= 0;
M
Michael Niedermayer 已提交
2114

B
Benoit Fouet 已提交
2115 2116 2117 2118 2119 2120 2121 2122
    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 已提交
2123 2124
}

2125
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2126
                                   DCTELEM *block, int n, int qscale)
F
Fabrice Bellard 已提交
2127
{
M
Michael Niedermayer 已提交
2128
    int i, level, nCoeffs;
2129
    const uint16_t *quant_matrix;
F
Fabrice Bellard 已提交
2130

2131
    nCoeffs= s->block_last_index[n];
2132 2133

    if (n < 4)
2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150
        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 已提交
2151
            }
2152
            block[j] = level;
F
Fabrice Bellard 已提交
2153
        }
2154 2155 2156
    }
}

2157
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2158 2159 2160 2161 2162 2163
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
    const uint16_t *quant_matrix;

    nCoeffs= s->block_last_index[n];
2164

2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179
    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 已提交
2180
            }
2181
            block[j] = level;
F
Fabrice Bellard 已提交
2182 2183 2184
        }
    }
}
2185

2186
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2187 2188 2189
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
2190
    const uint16_t *quant_matrix;
2191

2192 2193
    if(s->alternate_scan) nCoeffs= 63;
    else nCoeffs= s->block_last_index[n];
2194 2195

    if (n < 4)
2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215
        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;
        }
    }
}

2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248
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;
}

2249
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2250 2251 2252 2253 2254 2255 2256 2257
                                   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];
2258

2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279
    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;
}

2280
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2281 2282 2283 2284
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
    int nCoeffs;
2285

2286
    assert(s->block_last_index[n]>=0);
2287

2288
    qmul = qscale << 1;
2289

2290
    if (!s->h263_aic) {
2291
        if (n < 4)
2292 2293 2294
            block[0] = block[0] * s->y_dc_scale;
        else
            block[0] = block[0] * s->c_dc_scale;
2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310
        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;
2311
            }
2312
            block[i] = level;
2313 2314 2315 2316
        }
    }
}

2317
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2318 2319 2320
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
M
Michael Niedermayer 已提交
2321
    int nCoeffs;
2322

2323
    assert(s->block_last_index[n]>=0);
2324

2325 2326
    qadd = (qscale - 1) | 1;
    qmul = qscale << 1;
2327

2328
    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2329

2330
    for(i=0; i<=nCoeffs; i++) {
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341
        level = block[i];
        if (level) {
            if (level < 0) {
                level = level * qmul - qadd;
            } else {
                level = level * qmul + qadd;
            }
            block[i] = level;
        }
    }
}
F
Fabrice Bellard 已提交
2342

2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358
/**
 * 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 ];
}