mpegvideo.c 86.3 KB
Newer Older
F
Fabrice Bellard 已提交
1 2
/*
 * The simplest mpeg encoder (well, it was the simplest!)
F
Fabrice Bellard 已提交
3
 * Copyright (c) 2000,2001 Fabrice Bellard.
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
F
Fabrice Bellard 已提交
5
 *
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 27
/**
 * @file mpegvideo.c
 * 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 <limits.h>
F
Fabrice Bellard 已提交
38

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

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

I
Ivan Kalvachev 已提交
57 58
extern int  XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
extern void XVMC_field_end(MpegEncContext *s);
59
extern void XVMC_decode_mb(MpegEncContext *s);
I
Ivan Kalvachev 已提交
60

F
Fabrice Bellard 已提交
61 62 63 64 65 66

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

//#define DEBUG

67

M
Michael Niedermayer 已提交
68 69 70 71 72
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
};

73

M
Michael Niedermayer 已提交
74 75 76
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 已提交
77 78 79 80
    assert(p<=end);
    if(p>=end)
        return end;

M
Michael Niedermayer 已提交
81 82 83 84 85 86 87 88
    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 已提交
89 90 91
        if     (p[-1] > 1      ) p+= 3;
        else if(p[-2]          ) p+= 2;
        else if(p[-3]|(p[-1]-1)) p++;
M
Michael Niedermayer 已提交
92 93 94 95 96 97
        else{
            p++;
            break;
        }
    }

M
Michael Niedermayer 已提交
98
    p= FFMIN(p, end)-4;
99
    *state= AV_RB32(p);
M
Michael Niedermayer 已提交
100 101 102 103

    return p+4;
}

104
/* init common dct for both encoder and decoder */
105
int ff_dct_common_init(MpegEncContext *s)
F
Fabrice Bellard 已提交
106
{
107 108 109 110 111
    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;
112 113
    if(s->flags & CODEC_FLAG_BITEXACT)
        s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
114
    s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
115

116
#if defined(HAVE_MMX)
117
    MPV_common_init_mmx(s);
118
#elif defined(ARCH_ALPHA)
119
    MPV_common_init_axp(s);
120
#elif defined(HAVE_MLIB)
121
    MPV_common_init_mlib(s);
122
#elif defined(HAVE_MMI)
123
    MPV_common_init_mmi(s);
124
#elif defined(ARCH_ARMV4L)
125
    MPV_common_init_armv4l(s);
126
#elif defined(HAVE_ALTIVEC)
127
    MPV_common_init_altivec(s);
128
#elif defined(ARCH_BFIN)
129 130
    MPV_common_init_bfin(s);
#endif
131

132
    /* load & permutate scantables
133
       note: only wmv uses different ones
134
    */
M
Michael Niedermayer 已提交
135 136 137 138 139 140 141
    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 已提交
142 143
    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);
144

145 146 147
    return 0;
}

B
Benoit Fouet 已提交
148
void copy_picture(Picture *dst, Picture *src){
149 150 151 152
    *dst = *src;
    dst->type= FF_BUFFER_TYPE_COPY;
}

M
cleanup  
Michael Niedermayer 已提交
153
/**
M
Michael Niedermayer 已提交
154 155
 * allocates a Picture
 * The pixels are allocated/set by calling get_buffer() if shared=0
M
cleanup  
Michael Niedermayer 已提交
156
 */
B
Benoit Fouet 已提交
157
int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
D
Diego Biurrun 已提交
158
    const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
159
    const int mb_array_size= s->mb_stride*s->mb_height;
160 161
    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 已提交
162
    int i;
D
Daniel Kristjansson 已提交
163
    int r= -1;
164

M
Michael Niedermayer 已提交
165 166 167 168 169 170
    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]);
171

M
Michael Niedermayer 已提交
172
        r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
173

M
Michael Niedermayer 已提交
174
        if(r<0 || !pic->age || !pic->type || !pic->data[0]){
175
            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
M
Michael Niedermayer 已提交
176 177 178 179
            return -1;
        }

        if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
180
            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
D
Daniel Kristjansson 已提交
181
            s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
M
Michael Niedermayer 已提交
182 183 184 185
            return -1;
        }

        if(pic->linesize[1] != pic->linesize[2]){
D
Diego Biurrun 已提交
186
            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
D
Daniel Kristjansson 已提交
187
            s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
M
Michael Niedermayer 已提交
188 189 190 191 192
            return -1;
        }

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

M
Michael Niedermayer 已提交
195
    if(pic->qscale_table==NULL){
196
        if (s->encoding) {
197 198 199
            CHECKED_ALLOCZ(pic->mb_var   , mb_array_size * sizeof(int16_t))
            CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
            CHECKED_ALLOCZ(pic->mb_mean  , mb_array_size * sizeof(int8_t))
M
Michael Niedermayer 已提交
200
        }
M
cleanup  
Michael Niedermayer 已提交
201

202
        CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
203
        CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
204 205
        CHECKED_ALLOCZ(pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t))
        pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1;
M
Michael Niedermayer 已提交
206 207
        if(s->out_format == FMT_H264){
            for(i=0; i<2; i++){
M
Michael Niedermayer 已提交
208 209
                CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4)  * sizeof(int16_t))
                pic->motion_val[i]= pic->motion_val_base[i]+4;
210
                CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
211
            }
M
Michael Niedermayer 已提交
212
            pic->motion_subsample_log2= 2;
213
        }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
214
            for(i=0; i<2; i++){
M
Michael Niedermayer 已提交
215 216
                CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
                pic->motion_val[i]= pic->motion_val_base[i]+4;
217
                CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
M
Michael Niedermayer 已提交
218
            }
M
Michael Niedermayer 已提交
219
            pic->motion_subsample_log2= 3;
M
Michael Niedermayer 已提交
220
        }
221 222 223
        if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
            CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
        }
224
        pic->qstride= s->mb_stride;
225
        CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
M
Michael Niedermayer 已提交
226
    }
M
Michael Niedermayer 已提交
227

D
Diego Biurrun 已提交
228 229
    /* It might be nicer if the application would keep track of these
     * but it would require an API change. */
230 231 232
    memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
    s->prev_pict_types[0]= s->pict_type;
    if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
D
Diego Biurrun 已提交
233
        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.
234

M
cleanup  
Michael Niedermayer 已提交
235 236
    return 0;
fail: //for the CHECKED_ALLOCZ macro
D
Daniel Kristjansson 已提交
237 238
    if(r>=0)
        s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
M
cleanup  
Michael Niedermayer 已提交
239 240 241
    return -1;
}

M
Michael Niedermayer 已提交
242 243 244
/**
 * deallocates a picture
 */
M
cleanup  
Michael Niedermayer 已提交
245 246
static void free_picture(MpegEncContext *s, Picture *pic){
    int i;
M
Michael Niedermayer 已提交
247 248

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

M
cleanup  
Michael Niedermayer 已提交
252 253 254 255 256
    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 已提交
257
    av_freep(&pic->mb_type_base);
258
    av_freep(&pic->dct_coeff);
259
    av_freep(&pic->pan_scan);
M
Michael Niedermayer 已提交
260 261
    pic->mb_type= NULL;
    for(i=0; i<2; i++){
262
        av_freep(&pic->motion_val_base[i]);
M
Michael Niedermayer 已提交
263 264
        av_freep(&pic->ref_index[i]);
    }
265

266
    if(pic->type == FF_BUFFER_TYPE_SHARED){
M
Michael Niedermayer 已提交
267 268 269 270
        for(i=0; i<4; i++){
            pic->base[i]=
            pic->data[i]= NULL;
        }
271
        pic->type= 0;
M
cleanup  
Michael Niedermayer 已提交
272 273 274
    }
}

275 276 277
static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
    int i;

278
    // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
L
Loren Merritt 已提交
279 280
    CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*21*2); //(width + edge + align)*interlaced*MBsize*tolerance
    s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
281

D
Diego Biurrun 已提交
282
     //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
283
    CHECKED_ALLOCZ(s->me.scratchpad,  (s->width+64)*4*16*2*sizeof(uint8_t))
284 285 286 287 288 289 290 291 292
    s->rd_scratchpad=   s->me.scratchpad;
    s->b_scratchpad=    s->me.scratchpad;
    s->obmc_scratchpad= s->me.scratchpad + 16;
    if (s->encoding) {
        CHECKED_ALLOCZ(s->me.map      , ME_MAP_SIZE*sizeof(uint32_t))
        CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
        if(s->avctx->noise_reduction){
            CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
        }
293
    }
294
    CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
    s->block= s->blocks[0];

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

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

    av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
    av_freep(&s->me.scratchpad);
310 311
    s->rd_scratchpad=
    s->b_scratchpad=
312
    s->obmc_scratchpad= NULL;
313

314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
    av_freep(&s->dct_error_sum);
    av_freep(&s->me.map);
    av_freep(&s->me.score_map);
    av_freep(&s->blocks);
    s->block= NULL;
}

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

343
void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
344
    MpegEncContext bak;
345
    int i;
346 347 348 349 350
    //FIXME copy only needed parts
//START_TIMER
    backup_duplicate_context(&bak, dst);
    memcpy(dst, src, sizeof(MpegEncContext));
    backup_duplicate_context(dst, &bak);
351 352 353
    for(i=0;i<12;i++){
        dst->pblocks[i] = (short *)(&dst->block[i]);
    }
354 355 356
//STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
}

M
Michael Niedermayer 已提交
357 358 359 360
/**
 * 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 已提交
361
void MPV_common_defaults(MpegEncContext *s){
M
Michael Niedermayer 已提交
362 363 364 365 366 367 368 369 370 371 372 373
    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;
374 375 376

    s->f_code = 1;
    s->b_code = 1;
M
Michael Niedermayer 已提交
377 378 379 380 381 382 383 384 385 386
}

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

387
/**
M
Michael Niedermayer 已提交
388 389 390
 * init common structure for both encoder and decoder.
 * this assumes that some variables like width/height are already set
 */
391 392
int MPV_common_init(MpegEncContext *s)
{
393
    int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads;
394

L
Loren Merritt 已提交
395 396 397
    s->mb_height = (s->height + 15) / 16;

    if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
M
10l  
Michael Niedermayer 已提交
398 399 400 401
        av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
        return -1;
    }

402 403 404
    if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
        return -1;

405
    dsputil_init(&s->dsp, s->avctx);
406
    ff_dct_common_init(s);
407

408
    s->flags= s->avctx->flags;
409
    s->flags2= s->avctx->flags2;
410

M
cleanup  
Michael Niedermayer 已提交
411
    s->mb_width  = (s->width  + 15) / 16;
412
    s->mb_stride = s->mb_width + 1;
413 414
    s->b8_stride = s->mb_width*2 + 1;
    s->b4_stride = s->mb_width*4 + 1;
415
    mb_array_size= s->mb_height * s->mb_stride;
M
Michael Niedermayer 已提交
416
    mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
417

418 419 420 421
    /* set chroma shifts */
    avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
                                                    &(s->chroma_y_shift) );

422 423 424
    /* 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;
425 426

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

428 429 430
    s->block_wrap[0]=
    s->block_wrap[1]=
    s->block_wrap[2]=
431
    s->block_wrap[3]= s->b8_stride;
432
    s->block_wrap[4]=
433
    s->block_wrap[5]= s->mb_stride;
434

435 436
    y_size = s->b8_stride * (2 * s->mb_height + 1);
    c_size = s->mb_stride * (s->mb_height + 1);
437
    yc_size = y_size + 2 * c_size;
438

439
    /* convert fourcc to upper case */
440
    s->codec_tag=          toupper( s->avctx->codec_tag     &0xFF)
441
                        + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
442
                        + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
443
                        + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
444

445
    s->stream_codec_tag=          toupper( s->avctx->stream_codec_tag     &0xFF)
446
                               + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
447
                               + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
448 449
                               + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);

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

452 453 454 455 456 457 458
    CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
    for(y=0; y<s->mb_height; y++){
        for(x=0; x<s->mb_width; x++){
            s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
        }
    }
    s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
459

460
    if (s->encoding) {
461
        /* Allocate MV tables */
462 463 464 465 466 467 468 469 470 471 472 473
        CHECKED_ALLOCZ(s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
        CHECKED_ALLOCZ(s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t))
        s->p_mv_table           = s->p_mv_table_base            + s->mb_stride + 1;
        s->b_forw_mv_table      = s->b_forw_mv_table_base       + s->mb_stride + 1;
        s->b_back_mv_table      = s->b_back_mv_table_base       + s->mb_stride + 1;
        s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
        s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
        s->b_direct_mv_table    = s->b_direct_mv_table_base     + s->mb_stride + 1;
474

475 476 477
        if(s->msmpeg4_version){
            CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
        }
M
Michael Niedermayer 已提交
478
        CHECKED_ALLOCZ(s->avctx->stats_out, 256);
479 480

        /* Allocate MB type table */
M
Michael Niedermayer 已提交
481
        CHECKED_ALLOCZ(s->mb_type  , mb_array_size * sizeof(uint16_t)) //needed for encoding
482

483
        CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
484

485 486
        CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
        CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
487 488
        CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
        CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
489 490
        CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
        CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
491

492 493 494
        if(s->avctx->noise_reduction){
            CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
        }
495
    }
496 497
    CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))

498
    CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
499

M
Michael Niedermayer 已提交
500
    if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
501
        /* interlaced direct mode decoding tables */
M
Michael Niedermayer 已提交
502 503 504 505 506 507 508 509 510 511 512 513 514
            for(i=0; i<2; i++){
                int j, k;
                for(j=0; j<2; j++){
                    for(k=0; k<2; k++){
                        CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k]     , mv_table_size * 2 * sizeof(int16_t))
                        s->b_field_mv_table[i][j][k]    = s->b_field_mv_table_base[i][j][k]     + s->mb_stride + 1;
                    }
                    CHECKED_ALLOCZ(s->b_field_select_table[i][j]     , mb_array_size * 2 * sizeof(uint8_t))
                    CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j]     , mv_table_size * 2 * sizeof(int16_t))
                    s->p_field_mv_table[i][j]    = s->p_field_mv_table_base[i][j]     + s->mb_stride + 1;
                }
                CHECKED_ALLOCZ(s->p_field_select_table[i]      , mb_array_size * 2 * sizeof(uint8_t))
            }
F
Fabrice Bellard 已提交
515
    }
M
Michael Niedermayer 已提交
516
    if (s->out_format == FMT_H263) {
F
Fabrice Bellard 已提交
517
        /* ac values */
518 519 520
        CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
        s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
        s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
F
Fabrice Bellard 已提交
521
        s->ac_val[2] = s->ac_val[1] + c_size;
522

F
Fabrice Bellard 已提交
523
        /* cbp values */
524 525
        CHECKED_ALLOCZ(s->coded_block_base, y_size);
        s->coded_block= s->coded_block_base + s->b8_stride + 1;
526

527
        /* cbp, ac_pred, pred_dir */
528 529
        CHECKED_ALLOCZ(s->cbp_table  , mb_array_size * sizeof(uint8_t))
        CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
530
    }
531

532 533 534
    if (s->h263_pred || s->h263_plus || !s->encoding) {
        /* dc values */
        //MN: we need these for error resilience of intra-frames
535 536 537
        CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
        s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
        s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
538 539
        s->dc_val[2] = s->dc_val[1] + c_size;
        for(i=0;i<yc_size;i++)
540
            s->dc_val_base[i] = 1024;
541 542
    }

543
    /* which mb is a intra block */
544 545
    CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
    memset(s->mbintra_table, 1, mb_array_size);
546

547
    /* init macroblock skip table */
548
    CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
549
    //Note the +1 is for a quicker mpeg4 slice_end detection
550
    CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
551

552
    s->parse_context.state= -1;
553 554 555 556 557
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
       s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
       s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
       s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
    }
558

F
Fabrice Bellard 已提交
559
    s->context_initialized = 1;
560 561

    s->thread_context[0]= s;
562
    threads = s->avctx->thread_count;
563 564

    for(i=1; i<threads; i++){
565 566 567 568
        s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
        memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
    }

569
    for(i=0; i<threads; i++){
570 571 572 573 574 575
        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 已提交
576 577
    return 0;
 fail:
578
    MPV_common_end(s);
F
Fabrice Bellard 已提交
579 580 581 582 583 584
    return -1;
}

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

587 588 589 590 591 592 593
    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]);
    }

594 595 596
    av_freep(&s->parse_context.buffer);
    s->parse_context.buffer_size=0;

597
    av_freep(&s->mb_type);
598 599 600 601 602 603 604 605 606 607 608 609
    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 已提交
610 611 612 613 614 615 616 617 618 619 620 621
    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]);
    }
622

623 624 625
    av_freep(&s->dc_val_base);
    av_freep(&s->ac_val_base);
    av_freep(&s->coded_block_base);
626
    av_freep(&s->mbintra_table);
627 628
    av_freep(&s->cbp_table);
    av_freep(&s->pred_dir_table);
629

630
    av_freep(&s->mbskip_table);
631
    av_freep(&s->prev_pict_types);
632
    av_freep(&s->bitstream_buffer);
633 634
    s->allocated_bitstream_buffer_size=0;

M
Michael Niedermayer 已提交
635
    av_freep(&s->avctx->stats_out);
636
    av_freep(&s->ac_stats);
637
    av_freep(&s->error_status_table);
638
    av_freep(&s->mb_index2xy);
639
    av_freep(&s->lambda_table);
640 641
    av_freep(&s->q_intra_matrix);
    av_freep(&s->q_inter_matrix);
642 643
    av_freep(&s->q_intra_matrix16);
    av_freep(&s->q_inter_matrix16);
644 645
    av_freep(&s->input_picture);
    av_freep(&s->reordered_input_picture);
646
    av_freep(&s->dct_offset);
M
cleanup  
Michael Niedermayer 已提交
647

M
Michael Niedermayer 已提交
648 649 650 651
    if(s->picture){
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            free_picture(s, &s->picture[i]);
        }
F
Fabrice Bellard 已提交
652
    }
653
    av_freep(&s->picture);
F
Fabrice Bellard 已提交
654
    s->context_initialized = 0;
655 656 657
    s->last_picture_ptr=
    s->next_picture_ptr=
    s->current_picture_ptr= NULL;
M
Michael Niedermayer 已提交
658
    s->linesize= s->uvlinesize= 0;
659

660
    for(i=0; i<3; i++)
661
        av_freep(&s->visualization_buffer[i]);
M
Michael Niedermayer 已提交
662 663

    avcodec_default_free_buffers(s->avctx);
F
Fabrice Bellard 已提交
664 665
}

666
void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
M
Michael Niedermayer 已提交
667
{
668 669
    int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
    uint8_t index_run[MAX_RUN+1];
M
Michael Niedermayer 已提交
670 671
    int last, run, level, start, end, i;

672
    /* If table is static, we can quit if rl->max_level[0] is not NULL */
673
    if(static_store && rl->max_level[0])
674 675
        return;

M
Michael Niedermayer 已提交
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
    /* 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;
        }
699 700
        if(static_store)
            rl->max_level[last] = static_store[last];
701 702
        else
            rl->max_level[last] = av_malloc(MAX_RUN + 1);
M
Michael Niedermayer 已提交
703
        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
704 705
        if(static_store)
            rl->max_run[last] = static_store[last] + MAX_RUN + 1;
706 707
        else
            rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
M
Michael Niedermayer 已提交
708
        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
709 710
        if(static_store)
            rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
711 712
        else
            rl->index_run[last] = av_malloc(MAX_RUN + 1);
M
Michael Niedermayer 已提交
713 714 715 716
        memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
    }
}

717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
void init_vlc_rl(RLTable *rl, int use_static)
{
    int i, q;

    /* Return if static table is already initialized */
    if(use_static && rl->rl_vlc[0])
        return;

    init_vlc(&rl->vlc, 9, rl->n + 1,
             &rl->table_vlc[0][1], 4, 2,
             &rl->table_vlc[0][0], 4, 2, use_static);


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

        if(q==0){
            qmul=1;
            qadd=0;
        }
        if(use_static)
            rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
        else
            rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
        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 已提交
770
int ff_find_unused_picture(MpegEncContext *s, int shared){
M
Michael Niedermayer 已提交
771
    int i;
772

M
Michael Niedermayer 已提交
773 774
    if(shared){
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
775
            if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
M
Michael Niedermayer 已提交
776 777 778
        }
    }else{
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
779
            if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
M
Michael Niedermayer 已提交
780 781
        }
        for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
782
            if(s->picture[i].data[0]==NULL) return i;
M
Michael Niedermayer 已提交
783 784 785
        }
    }

786
    av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
787 788 789 790 791 792 793 794 795 796 797
    /* 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 ...
     */
798
    abort();
M
Michael Niedermayer 已提交
799
    return -1;
M
Michael Niedermayer 已提交
800 801
}

802 803 804 805 806 807 808 809 810 811
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;
        }
812

813 814 815 816 817 818
        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 已提交
819 820 821
/**
 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
 */
822
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
F
Fabrice Bellard 已提交
823
{
M
Michael Niedermayer 已提交
824
    int i;
M
Michael Niedermayer 已提交
825
    AVFrame *pic;
826
    s->mb_skipped = 0;
M
Michael Niedermayer 已提交
827

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

M
cleanup  
Michael Niedermayer 已提交
830
    /* mark&release old frames */
831
    if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
832
      if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
M
Michael Niedermayer 已提交
833
        avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
M
cleanup  
Michael Niedermayer 已提交
834 835 836 837 838

        /* release forgotten pictures */
        /* if(mpeg124/h263) */
        if(!s->encoding){
            for(i=0; i<MAX_PICTURE_COUNT; i++){
M
Michael Niedermayer 已提交
839
                if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
840
                    av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
841
                    avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
M
cleanup  
Michael Niedermayer 已提交
842 843
                }
            }
844
        }
845
      }
846
    }
847 848
alloc:
    if(!s->encoding){
D
Diego Biurrun 已提交
849
        /* release non reference frames */
M
Michael Niedermayer 已提交
850 851 852 853 854 855
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
            }
        }

M
Michael Niedermayer 已提交
856 857 858 859 860 861 862
        if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
            pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
        else{
            i= ff_find_unused_picture(s, 0);
            pic= (AVFrame*)&s->picture[i];
        }

863 864 865 866 867 868 869
        pic->reference= 0;
        if (!s->dropable){
            if (s->codec_id == CODEC_ID_H264)
                pic->reference = s->picture_structure;
            else if (s->pict_type != B_TYPE)
                pic->reference = 3;
        }
M
Michael Niedermayer 已提交
870

M
Michael Niedermayer 已提交
871
        pic->coded_picture_number= s->coded_picture_number++;
872

873 874
        if( alloc_picture(s, (Picture*)pic, 0) < 0)
            return -1;
875

M
Michael Niedermayer 已提交
876
        s->current_picture_ptr= (Picture*)pic;
877
        s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
878
        s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
M
cleanup  
Michael Niedermayer 已提交
879
    }
880

M
Michael Niedermayer 已提交
881
    s->current_picture_ptr->pict_type= s->pict_type;
882
//    if(s->flags && CODEC_FLAG_QSCALE)
883
  //      s->current_picture_ptr->quality= s->new_picture_ptr->quality;
884
    s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
M
Michael Niedermayer 已提交
885

886
    copy_picture(&s->current_picture, s->current_picture_ptr);
887

M
cleanup  
Michael Niedermayer 已提交
888
    if (s->pict_type != B_TYPE) {
M
Michael Niedermayer 已提交
889
        s->last_picture_ptr= s->next_picture_ptr;
890 891
        if(!s->dropable)
            s->next_picture_ptr= s->current_picture_ptr;
F
Fabrice Bellard 已提交
892
    }
893
/*    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,
894 895
        s->last_picture_ptr    ? s->last_picture_ptr->data[0] : NULL,
        s->next_picture_ptr    ? s->next_picture_ptr->data[0] : NULL,
896 897
        s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
        s->pict_type, s->dropable);*/
898

899 900
    if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
    if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
901

902
    if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && !s->dropable){
903
        av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
D
Diego Biurrun 已提交
904
        assert(s->pict_type != B_TYPE); //these should have been dropped if we don't have a reference
905 906 907 908 909
        goto alloc;
    }

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

910
    if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
M
Michael Niedermayer 已提交
911 912 913 914
        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];
915
            }
M
Michael Niedermayer 已提交
916 917 918 919 920
            s->current_picture.linesize[i] *= 2;
            s->last_picture.linesize[i] *=2;
            s->next_picture.linesize[i] *=2;
        }
    }
921

922 923 924
    s->hurry_up= s->avctx->hurry_up;
    s->error_resilience= avctx->error_resilience;

D
Diego Biurrun 已提交
925
    /* set dequantizer, we can't do it during init as it might change for mpeg4
D
Diego Biurrun 已提交
926
       and we can't do it in the header decode as init is not called for mpeg4 there yet */
927 928 929
    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 已提交
930
    }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
931 932 933 934 935 936
        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;
    }
937

938 939 940 941 942
    if(s->dct_error_sum){
        assert(s->avctx->noise_reduction && s->encoding);

        update_noise_reduction(s);
    }
943

I
Ivan Kalvachev 已提交
944 945 946 947
#ifdef HAVE_XVMC
    if(s->avctx->xvmc_acceleration)
        return XVMC_field_start(s, avctx);
#endif
948
    return 0;
F
Fabrice Bellard 已提交
949
}
950

F
Fabrice Bellard 已提交
951 952 953
/* generic function for encode/decode called after a frame has been coded/decoded */
void MPV_frame_end(MpegEncContext *s)
{
M
cleanup  
Michael Niedermayer 已提交
954
    int i;
F
Fabrice Bellard 已提交
955
    /* draw edge for correct motion prediction if outside */
I
Ivan Kalvachev 已提交
956 957 958 959 960 961
#ifdef HAVE_XVMC
//just to make sure that all data is rendered.
    if(s->avctx->xvmc_acceleration){
        XVMC_field_end(s);
    }else
#endif
962
    if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
A
Aurelien Jacobs 已提交
963 964 965
            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 已提交
966
    }
M
Michael Niedermayer 已提交
967
    emms_c();
968

M
Michael Niedermayer 已提交
969
    s->last_pict_type    = s->pict_type;
970
    s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
971 972 973
    if(s->pict_type!=B_TYPE){
        s->last_non_b_pict_type= s->pict_type;
    }
M
Michael Niedermayer 已提交
974 975
#if 0
        /* copy back current_picture variables */
M
cleanup  
Michael Niedermayer 已提交
976 977 978 979
    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;
980
        }
M
cleanup  
Michael Niedermayer 已提交
981 982
    }
    assert(i<MAX_PICTURE_COUNT);
983
#endif
M
cleanup  
Michael Niedermayer 已提交
984

M
Michael Niedermayer 已提交
985
    if(s->encoding){
D
Diego Biurrun 已提交
986
        /* release non-reference frames */
M
Michael Niedermayer 已提交
987 988 989 990 991
        for(i=0; i<MAX_PICTURE_COUNT; i++){
            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
            }
        }
M
cleanup  
Michael Niedermayer 已提交
992
    }
M
Michael Niedermayer 已提交
993 994 995 996 997 998
    // 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 已提交
999
    s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
F
Fabrice Bellard 已提交
1000 1001
}

1002 1003 1004 1005 1006 1007 1008 1009
/**
 * 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 已提交
1010
    int x, y, fr, f;
1011

1012 1013 1014 1015
    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);
1016

1017
    buf[sy*stride + sx]+= color;
1018

D
Diego Biurrun 已提交
1019
    if(FFABS(ex - sx) > FFABS(ey - sy)){
1020
        if(sx > ex){
D
Diego Biurrun 已提交
1021 1022
            FFSWAP(int, sx, ex);
            FFSWAP(int, sy, ey);
1023 1024 1025 1026 1027
        }
        buf+= sx + sy*stride;
        ex-= sx;
        f= ((ey-sy)<<16)/ex;
        for(x= 0; x <= ex; x++){
1028 1029 1030 1031
            y = (x*f)>>16;
            fr= (x*f)&0xFFFF;
            buf[ y   *stride + x]+= (color*(0x10000-fr))>>16;
            buf[(y+1)*stride + x]+= (color*         fr )>>16;
1032 1033 1034
        }
    }else{
        if(sy > ey){
D
Diego Biurrun 已提交
1035 1036
            FFSWAP(int, sx, ex);
            FFSWAP(int, sy, ey);
1037 1038 1039 1040 1041 1042
        }
        buf+= sx + sy*stride;
        ey-= sy;
        if(ey) f= ((ex-sx)<<16)/ey;
        else   f= 0;
        for(y= 0; y <= ey; y++){
1043 1044
            x = (y*f)>>16;
            fr= (y*f)&0xFFFF;
M
Fix ;;  
Michael Niedermayer 已提交
1045 1046
            buf[y*stride + x  ]+= (color*(0x10000-fr))>>16;
            buf[y*stride + x+1]+= (color*         fr )>>16;
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
        }
    }
}

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

1061 1062 1063 1064
    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);
1065

1066 1067
    dx= ex - sx;
    dy= ey - sy;
1068

1069 1070 1071 1072
    if(dx*dx + dy*dy > 3*3){
        int rx=  dx + dy;
        int ry= -dx + dy;
        int length= ff_sqrt((rx*rx + ry*ry)<<8);
1073

1074 1075 1076
        //FIXME subpixel accuracy
        rx= ROUNDED_DIV(rx*3<<4, length);
        ry= ROUNDED_DIV(ry*3<<4, length);
1077

1078 1079 1080 1081 1082 1083
        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);
}

1084 1085 1086
/**
 * prints debuging info for the given picture.
 */
1087
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1088 1089 1090 1091 1092

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

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

1094 1095 1096 1097 1098 1099 1100
        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;
1101
            case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1102
        }
1103 1104 1105 1106 1107
        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;
1108
                    av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1109 1110
                }
                if(s->avctx->debug&FF_DEBUG_QP){
1111
                    av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1112 1113 1114 1115 1116
                }
                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))
1117
                        av_log(s->avctx, AV_LOG_DEBUG, "P");
1118
                    else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1119
                        av_log(s->avctx, AV_LOG_DEBUG, "A");
1120
                    else if(IS_INTRA4x4(mb_type))
1121
                        av_log(s->avctx, AV_LOG_DEBUG, "i");
1122
                    else if(IS_INTRA16x16(mb_type))
1123
                        av_log(s->avctx, AV_LOG_DEBUG, "I");
1124
                    else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1125
                        av_log(s->avctx, AV_LOG_DEBUG, "d");
1126
                    else if(IS_DIRECT(mb_type))
1127
                        av_log(s->avctx, AV_LOG_DEBUG, "D");
1128
                    else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1129
                        av_log(s->avctx, AV_LOG_DEBUG, "g");
1130
                    else if(IS_GMC(mb_type))
1131
                        av_log(s->avctx, AV_LOG_DEBUG, "G");
1132
                    else if(IS_SKIP(mb_type))
1133
                        av_log(s->avctx, AV_LOG_DEBUG, "S");
1134
                    else if(!USES_LIST(mb_type, 1))
1135
                        av_log(s->avctx, AV_LOG_DEBUG, ">");
1136
                    else if(!USES_LIST(mb_type, 0))
1137
                        av_log(s->avctx, AV_LOG_DEBUG, "<");
1138 1139
                    else{
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1140
                        av_log(s->avctx, AV_LOG_DEBUG, "X");
1141
                    }
1142

1143 1144
                    //segmentation
                    if(IS_8X8(mb_type))
1145
                        av_log(s->avctx, AV_LOG_DEBUG, "+");
1146
                    else if(IS_16X8(mb_type))
1147
                        av_log(s->avctx, AV_LOG_DEBUG, "-");
1148
                    else if(IS_8X16(mb_type))
1149
                        av_log(s->avctx, AV_LOG_DEBUG, "|");
1150
                    else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1151
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1152
                    else
1153
                        av_log(s->avctx, AV_LOG_DEBUG, "?");
1154 1155


1156
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1157
                        av_log(s->avctx, AV_LOG_DEBUG, "=");
1158
                    else
1159
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
1160
                }
1161
//                av_log(s->avctx, AV_LOG_DEBUG, " ");
1162
            }
1163
            av_log(s->avctx, AV_LOG_DEBUG, "\n");
1164 1165
        }
    }
1166

1167
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1168 1169
        const int shift= 1 + s->quarter_sample;
        int mb_y;
1170 1171
        uint8_t *ptr;
        int i;
1172
        int h_chroma_shift, v_chroma_shift;
1173 1174
        const int width = s->avctx->width;
        const int height= s->avctx->height;
1175
        const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1176
        const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
M
100000l  
Michael Niedermayer 已提交
1177
        s->low_delay=0; //needed to see the vectors without trashing the buffers
1178

1179
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1180
        for(i=0; i<3; i++){
1181
            memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1182 1183 1184 1185
            pict->data[i]= s->visualization_buffer[i];
        }
        pict->type= FF_BUFFER_TYPE_COPY;
        ptr= pict->data[0];
1186 1187 1188 1189 1190

        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;
1191 1192 1193
                if((s->avctx->debug_mv) && pict->motion_val){
                  int type;
                  for(type=0; type<3; type++){
1194
                    int direction = 0;
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
                    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;
                    }
1209 1210 1211
                    if(!USES_LIST(pict->mb_type[mb_index], direction))
                        continue;

1212 1213 1214
                    if(IS_8X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<4; i++){
1215 1216
                        int sx= mb_x*16 + 4 + 8*(i&1);
                        int sy= mb_y*16 + 4 + 8*(i>>1);
1217
                        int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1218 1219
                        int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                        int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1220
                        draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1221 1222 1223 1224
                      }
                    }else if(IS_16X8(pict->mb_type[mb_index])){
                      int i;
                      for(i=0; i<2; i++){
1225 1226
                        int sx=mb_x*16 + 8;
                        int sy=mb_y*16 + 4 + 8*i;
1227
                        int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1228 1229
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
1230

1231 1232
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
1233

1234 1235 1236 1237 1238 1239 1240
                        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;
1241
                        int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1242 1243
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
                        int my=(pict->motion_val[direction][xy][1]>>shift);
1244

1245 1246
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
                            my*=2;
1247

1248
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1249 1250 1251 1252
                      }
                    }else{
                      int sx= mb_x*16 + 8;
                      int sy= mb_y*16 + 8;
1253
                      int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1254 1255
                      int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
                      int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1256
                      draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1257
                    }
1258
                  }
M
Michael Niedermayer 已提交
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
                }
                if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
                    uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
                    int y;
                    for(y=0; y<8; y++){
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
                    }
                }
                if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
                    int mb_type= pict->mb_type[mb_index];
                    uint64_t u,v;
                    int y;
#define COLOR(theta, r)\
u= (int)(128 + r*cos(theta*3.141592/180));\
v= (int)(128 + r*sin(theta*3.141592/180));

1276

M
Michael Niedermayer 已提交
1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318
                    u=v=128;
                    if(IS_PCM(mb_type)){
                        COLOR(120,48)
                    }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
                        COLOR(30,48)
                    }else if(IS_INTRA4x4(mb_type)){
                        COLOR(90,48)
                    }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
//                        COLOR(120,48)
                    }else if(IS_DIRECT(mb_type)){
                        COLOR(150,48)
                    }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
                        COLOR(170,48)
                    }else if(IS_GMC(mb_type)){
                        COLOR(190,48)
                    }else if(IS_SKIP(mb_type)){
//                        COLOR(180,48)
                    }else if(!USES_LIST(mb_type, 1)){
                        COLOR(240,48)
                    }else if(!USES_LIST(mb_type, 0)){
                        COLOR(0,48)
                    }else{
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
                        COLOR(300,48)
                    }

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

                    //segmentation
                    if(IS_8X8(mb_type) || IS_16X8(mb_type)){
                        *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
                        *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
                    }
                    if(IS_8X8(mb_type) || IS_8X16(mb_type)){
                        for(y=0; y<16; y++)
                            pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
                    }
1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
                    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;
                        }
                    }
1334

M
Michael Niedermayer 已提交
1335 1336 1337
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
                        // hmm
                    }
1338 1339 1340 1341 1342
                }
                s->mbskip_table[mb_index]=0;
            }
        }
    }
1343 1344
}

1345
static inline int hpel_motion_lowres(MpegEncContext *s,
M
Michael Niedermayer 已提交
1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
                                  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);
1368

M
Michael Niedermayer 已提交
1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386
    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 已提交
1387
/* apply one mpeg motion vector to the three components */
B
Benoit Fouet 已提交
1388
static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1389
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1390
                               int field_based, int bottom_field, int field_select,
B
Benoit Fouet 已提交
1391
                               uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
F
Fabrice Bellard 已提交
1392 1393
                               int motion_x, int motion_y, int h)
{
1394
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
B
Benoit Fouet 已提交
1395 1396 1397 1398 1399 1400
    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;
1401
    linesize   = s->current_picture.linesize[0] << field_based;
M
Michael Niedermayer 已提交
1402
    uvlinesize = s->current_picture.linesize[1] << field_based;
1403

B
Benoit Fouet 已提交
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
    if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
        motion_x/=2;
        motion_y/=2;
    }

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

    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));
1417

M
Michael Niedermayer 已提交
1418
    if (s->out_format == FMT_H263) {
M
Michael Niedermayer 已提交
1419 1420
        uvsx = ((motion_x>>1) & s_mask) | (sx&1);
        uvsy = ((motion_y>>1) & s_mask) | (sy&1);
M
Michael Niedermayer 已提交
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
        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));
1436
        uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
M
Michael Niedermayer 已提交
1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447
    }

    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;
1448
            if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
M
Michael Niedermayer 已提交
1449
                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1450
                ff_emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based,
M
Michael Niedermayer 已提交
1451
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1452
                ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
M
Michael Niedermayer 已提交
1453 1454 1455 1456 1457 1458
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
                ptr_cb= uvbuf;
                ptr_cr= uvbuf+16;
            }
    }

1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470
    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 已提交
1471 1472 1473
    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1474

1475
    if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
M
Michael Niedermayer 已提交
1476 1477 1478 1479 1480
        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 已提交
1481
    //FIXME h261 lowres loop filter
M
Michael Niedermayer 已提交
1482 1483
}

M
Michael Niedermayer 已提交
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
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;
1496

M
Michael Niedermayer 已提交
1497 1498 1499 1500 1501 1502 1503 1504 1505
    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);
1506

M
Michael Niedermayer 已提交
1507 1508 1509 1510
    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));
1511

M
Michael Niedermayer 已提交
1512 1513 1514 1515 1516 1517 1518 1519 1520
    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;
        }
1521
    }
M
Michael Niedermayer 已提交
1522 1523 1524
    sx <<= 2 - lowres;
    sy <<= 2 - lowres;
    pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1525

M
Michael Niedermayer 已提交
1526 1527 1528 1529 1530 1531 1532 1533
    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 已提交
1534
/**
D
Diego Biurrun 已提交
1535
 * motion compensation of a single macroblock
M
doxy  
Michael Niedermayer 已提交
1536 1537 1538 1539 1540 1541 1542 1543 1544
 * @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 已提交
1545
static inline void MPV_motion_lowres(MpegEncContext *s,
1546
                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1547
                              int dir, uint8_t **ref_picture,
B
Benoit Fouet 已提交
1548
                              h264_chroma_mc_func *pix_op)
F
Fabrice Bellard 已提交
1549
{
B
Benoit Fouet 已提交
1550
    int mx, my;
F
Fabrice Bellard 已提交
1551
    int mb_x, mb_y, i;
B
Benoit Fouet 已提交
1552 1553
    const int lowres= s->avctx->lowres;
    const int block_s= 8>>lowres;
F
Fabrice Bellard 已提交
1554 1555 1556 1557 1558 1559

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

    switch(s->mv_type) {
    case MV_TYPE_16X16:
B
Benoit Fouet 已提交
1560 1561 1562 1563
        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 已提交
1564 1565
        break;
    case MV_TYPE_8X8:
M
Michael Niedermayer 已提交
1566 1567 1568
        mx = 0;
        my = 0;
            for(i=0;i<4;i++) {
B
Benoit Fouet 已提交
1569
                hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1570
                            ref_picture[0], 0, 0,
B
Benoit Fouet 已提交
1571
                            (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
M
Michael Niedermayer 已提交
1572
                            s->width, s->height, s->linesize,
B
Benoit Fouet 已提交
1573 1574
                            s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
                            block_s, block_s, pix_op,
M
Michael Niedermayer 已提交
1575
                            s->mv[dir][i][0], s->mv[dir][i][1]);
M
Michael Niedermayer 已提交
1576 1577 1578

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

1581
        if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY))
B
Benoit Fouet 已提交
1582
            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
F
Fabrice Bellard 已提交
1583 1584 1585
        break;
    case MV_TYPE_FIELD:
        if (s->picture_structure == PICT_FRAME) {
B
Benoit Fouet 已提交
1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
            /* 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 已提交
1596
        } else {
1597 1598
            if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
                ref_picture= s->current_picture_ptr->data;
1599
            }
F
Fabrice Bellard 已提交
1600

B
Benoit Fouet 已提交
1601
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1602 1603
                        0, 0, s->field_select[dir][0],
                        ref_picture, pix_op,
B
Benoit Fouet 已提交
1604
                        s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
F
Fabrice Bellard 已提交
1605
        }
1606
        break;
M
Michael Niedermayer 已提交
1607 1608 1609
    case MV_TYPE_16X8:
        for(i=0; i<2; i++){
            uint8_t ** ref2picture;
1610

M
Michael Niedermayer 已提交
1611
            if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
1612 1613
                ref2picture= ref_picture;
            }else{
1614
                ref2picture= s->current_picture_ptr->data;
1615
            }
1616

B
Benoit Fouet 已提交
1617
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1618
                        0, 0, s->field_select[dir][i],
1619
                        ref2picture, pix_op,
B
Benoit Fouet 已提交
1620
                        s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
1621

B
Benoit Fouet 已提交
1622 1623 1624
            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;
1625
        }
F
Fabrice Bellard 已提交
1626
        break;
1627 1628
    case MV_TYPE_DMV:
        if(s->picture_structure == PICT_FRAME){
M
Michael Niedermayer 已提交
1629 1630 1631
            for(i=0; i<2; i++){
                int j;
                for(j=0; j<2; j++){
B
Benoit Fouet 已提交
1632
                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1633 1634
                                1, j, j^i,
                                ref_picture, pix_op,
B
Benoit Fouet 已提交
1635
                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
M
Michael Niedermayer 已提交
1636
                }
B
Benoit Fouet 已提交
1637
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
M
Michael Niedermayer 已提交
1638
            }
1639
        }else{
M
Michael Niedermayer 已提交
1640
            for(i=0; i<2; i++){
B
Benoit Fouet 已提交
1641
                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
M
Michael Niedermayer 已提交
1642 1643
                            0, 0, s->picture_structure != i+1,
                            ref_picture, pix_op,
B
Benoit Fouet 已提交
1644
                            s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
1645

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

M
Michael Niedermayer 已提交
1649 1650
                //opposite parity is always in the same frame if this is second field
                if(!s->first_field){
1651
                    ref_picture = s->current_picture_ptr->data;
M
Michael Niedermayer 已提交
1652
                }
1653
            }
1654 1655
        }
    break;
M
Michael Niedermayer 已提交
1656
    default: assert(0);
F
Fabrice Bellard 已提交
1657 1658 1659
    }
}

B
Benoit Fouet 已提交
1660 1661 1662
/* 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 已提交
1663
{
B
Benoit Fouet 已提交
1664 1665 1666
    s->dct_unquantize_intra(s, block, i, qscale);
    s->dsp.idct_put (dest, line_size, block);
}
1667

B
Benoit Fouet 已提交
1668 1669 1670 1671 1672 1673 1674 1675
/* 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);
    }
}
1676

1677
static inline void add_dequant_dct(MpegEncContext *s,
M
Michael Niedermayer 已提交
1678
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
M
Michael Niedermayer 已提交
1679
{
F
Fabrice Bellard 已提交
1680
    if (s->block_last_index[i] >= 0) {
1681
        s->dct_unquantize_inter(s, block, i, qscale);
1682

1683
        s->dsp.idct_add (dest, line_size, block);
F
Fabrice Bellard 已提交
1684 1685 1686
    }
}

1687 1688 1689 1690 1691
/**
 * cleans dc, ac, coded_block for the current non intra MB
 */
void ff_clean_intra_table_entries(MpegEncContext *s)
{
1692
    int wrap = s->b8_stride;
1693
    int xy = s->block_index[0];
1694 1695 1696

    s->dc_val[0][xy           ] =
    s->dc_val[0][xy + 1       ] =
1697 1698 1699
    s->dc_val[0][xy     + wrap] =
    s->dc_val[0][xy + 1 + wrap] = 1024;
    /* ac pred */
1700 1701
    memset(s->ac_val[0][xy       ], 0, 32 * sizeof(int16_t));
    memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1702 1703 1704 1705 1706 1707 1708
    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 */
1709 1710
    wrap = s->mb_stride;
    xy = s->mb_x + s->mb_y * wrap;
1711 1712 1713
    s->dc_val[1][xy] =
    s->dc_val[2][xy] = 1024;
    /* ac pred */
1714 1715
    memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
    memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1716

1717
    s->mbintra_table[xy]= 0;
1718 1719
}

F
Fabrice Bellard 已提交
1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
/* 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)
 */
1730
static av_always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
F
Fabrice Bellard 已提交
1731
{
1732
    int mb_x, mb_y;
1733
    const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
I
Ivan Kalvachev 已提交
1734 1735
#ifdef HAVE_XVMC
    if(s->avctx->xvmc_acceleration){
1736
        XVMC_decode_mb(s);//xvmc uses pblocks
I
Ivan Kalvachev 已提交
1737 1738 1739
        return;
    }
#endif
F
Fabrice Bellard 已提交
1740 1741 1742 1743

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

1744 1745 1746 1747 1748 1749 1750 1751 1752
    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 已提交
1753
    s->current_picture.qscale_table[mb_xy]= s->qscale;
1754

F
Fabrice Bellard 已提交
1755 1756
    /* update DC predictors for P macroblocks */
    if (!s->mb_intra) {
1757
        if (s->h263_pred || s->h263_aic) {
M
Michael Niedermayer 已提交
1758
            if(s->mbintra_table[mb_xy])
1759
                ff_clean_intra_table_entries(s);
F
Fabrice Bellard 已提交
1760
        } else {
1761 1762
            s->last_dc[0] =
            s->last_dc[1] =
F
Fabrice Bellard 已提交
1763 1764 1765
            s->last_dc[2] = 128 << s->intra_dc_precision;
        }
    }
1766
    else if (s->h263_pred || s->h263_aic)
M
Michael Niedermayer 已提交
1767
        s->mbintra_table[mb_xy]=1;
1768

1769
    if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
1770
        uint8_t *dest_y, *dest_cb, *dest_cr;
M
Michael Niedermayer 已提交
1771
        int dct_linesize, dct_offset;
M
Michael Niedermayer 已提交
1772 1773
        op_pixels_func (*op_pix)[4];
        qpel_mc_func (*op_qpix)[16];
1774
        const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
M
Michael Niedermayer 已提交
1775
        const int uvlinesize= s->current_picture.linesize[1];
M
Michael Niedermayer 已提交
1776 1777
        const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
1778

M
cleanup  
Michael Niedermayer 已提交
1779 1780 1781
        /* 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){
1782
            uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
M
cleanup  
Michael Niedermayer 已提交
1783
            const int age= s->current_picture.age;
M
Michael Niedermayer 已提交
1784

M
cleanup  
Michael Niedermayer 已提交
1785 1786
            assert(age);

1787 1788
            if (s->mb_skipped) {
                s->mb_skipped= 0;
M
cleanup  
Michael Niedermayer 已提交
1789
                assert(s->pict_type!=I_TYPE);
1790

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

M
cleanup  
Michael Niedermayer 已提交
1794
                /* if previous was skipped too, then nothing to do !  */
1795 1796
                if (*mbskip_ptr >= age && s->current_picture.reference){
                    return;
M
cleanup  
Michael Niedermayer 已提交
1797
                }
1798 1799 1800 1801
            } 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{
1802 1803
                *mbskip_ptr = 0; /* not skipped */
            }
M
Michael Niedermayer 已提交
1804
        }
1805

1806
        dct_linesize = linesize << s->interlaced_dct;
M
Michael Niedermayer 已提交
1807
        dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
1808

1809 1810 1811 1812 1813
        if(readable){
            dest_y=  s->dest[0];
            dest_cb= s->dest[1];
            dest_cr= s->dest[2];
        }else{
1814
            dest_y = s->b_scratchpad;
1815
            dest_cb= s->b_scratchpad+16*linesize;
1816
            dest_cr= s->b_scratchpad+32*linesize;
1817
        }
M
Michael Niedermayer 已提交
1818

F
Fabrice Bellard 已提交
1819 1820
        if (!s->mb_intra) {
            /* motion handling */
1821
            /* decoding or more than one mb_type (MC was already done otherwise) */
1822
            if(!s->encoding){
M
Michael Niedermayer 已提交
1823 1824
                if(lowres_flag){
                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
F
Fabrice Bellard 已提交
1825

M
Michael Niedermayer 已提交
1826 1827 1828 1829 1830 1831 1832 1833
                    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{
1834
                    op_qpix= s->me.qpel_put;
1835
                    if ((!s->no_rounding) || s->pict_type==B_TYPE){
M
Michael Niedermayer 已提交
1836 1837 1838 1839 1840 1841 1842
                        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;
1843
                        op_qpix= s->me.qpel_avg;
M
Michael Niedermayer 已提交
1844 1845 1846 1847
                    }
                    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);
                    }
1848
                }
F
Fabrice Bellard 已提交
1849 1850
            }

M
Michael Niedermayer 已提交
1851
            /* skip dequant / idct if we are really late ;) */
M
Michael Niedermayer 已提交
1852 1853 1854 1855 1856 1857 1858
            if(s->hurry_up>1) goto skip_idct;
            if(s->avctx->skip_idct){
                if(  (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
                   ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
                   || s->avctx->skip_idct >= AVDISCARD_ALL)
                    goto skip_idct;
            }
M
Michael Niedermayer 已提交
1859

F
Fabrice Bellard 已提交
1860
            /* add dct residue */
M
Michael Niedermayer 已提交
1861
            if(s->encoding || !(   s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
1862
                                || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
M
Michael Niedermayer 已提交
1863 1864 1865 1866
                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 已提交
1867

1868
                if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879
                    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 已提交
1880
                }
M
Michael Niedermayer 已提交
1881
            } else if(s->codec_id != CODEC_ID_WMV2){
M
Michael Niedermayer 已提交
1882 1883 1884 1885
                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 已提交
1886

1887
                if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908
                    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
            }
1909
            else if (ENABLE_WMV2) {
M
Michael Niedermayer 已提交
1910
                ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
M
Michael Niedermayer 已提交
1911
            }
F
Fabrice Bellard 已提交
1912 1913
        } else {
            /* dct only in intra block */
M
Michael Niedermayer 已提交
1914
            if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
M
Michael Niedermayer 已提交
1915 1916 1917 1918
                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);
1919

1920
                if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1921 1922 1923 1924 1925 1926 1927 1928 1929
                    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 已提交
1930
                        put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
M
Michael Niedermayer 已提交
1931 1932 1933
                    }
                }
            }else{
B
Benoit Fouet 已提交
1934 1935 1936 1937
                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]);
1938

1939
                if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
B
Benoit Fouet 已提交
1940 1941 1942 1943
                    if(s->chroma_y_shift){
                        s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
                        s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
                    }else{
1944

B
Benoit Fouet 已提交
1945 1946
                        dct_linesize = uvlinesize << s->interlaced_dct;
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
1947

B
Benoit Fouet 已提交
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
                        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
1960
            }
M
Michael Niedermayer 已提交
1961
        }
B
Benoit Fouet 已提交
1962 1963 1964 1965 1966
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);
1967
        }
M
Michael Niedermayer 已提交
1968 1969 1970
    }
}

B
Benoit Fouet 已提交
1971 1972 1973
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
    if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
    else                  MPV_decode_mb_internal(s, block, 0);
M
Michael Niedermayer 已提交
1974 1975
}

B
Benoit Fouet 已提交
1976 1977 1978 1979 1980 1981 1982 1983
/**
 *
 * @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 已提交
1984

B
Benoit Fouet 已提交
1985 1986 1987 1988
        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 已提交
1989 1990
        }

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

B
Benoit Fouet 已提交
1993 1994 1995 1996 1997 1998
        if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
            src= (AVFrame*)s->current_picture_ptr;
        else if(s->last_picture_ptr)
            src= (AVFrame*)s->last_picture_ptr;
        else
            return;
1999

B
Benoit Fouet 已提交
2000 2001 2002 2003 2004
        if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
            offset[0]=
            offset[1]=
            offset[2]=
            offset[3]= 0;
M
Michael Niedermayer 已提交
2005
        }else{
M
Fix ;;  
Michael Niedermayer 已提交
2006
            offset[0]= y * s->linesize;
B
Benoit Fouet 已提交
2007 2008 2009
            offset[1]=
            offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
            offset[3]= 0;
M
Michael Niedermayer 已提交
2010
        }
2011

B
Benoit Fouet 已提交
2012
        emms_c();
M
Michael Niedermayer 已提交
2013

B
Benoit Fouet 已提交
2014 2015 2016 2017
        s->avctx->draw_horiz_band(s->avctx, src, offset,
                                  y, s->picture_structure, h);
    }
}
2018

B
Benoit Fouet 已提交
2019 2020 2021 2022
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 已提交
2023

B
Benoit Fouet 已提交
2024 2025 2026 2027 2028 2029 2030
    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
2031

B
Benoit Fouet 已提交
2032 2033 2034
    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));
2035

B
Benoit Fouet 已提交
2036 2037 2038 2039 2040
    if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
    {
        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 已提交
2041 2042
    }
}
2043

B
Benoit Fouet 已提交
2044 2045 2046
void ff_mpeg_flush(AVCodecContext *avctx){
    int i;
    MpegEncContext *s = avctx->priv_data;
M
Michael Niedermayer 已提交
2047

B
Benoit Fouet 已提交
2048 2049
    if(s==NULL || s->picture==NULL)
        return;
M
Michael Niedermayer 已提交
2050

B
Benoit Fouet 已提交
2051 2052 2053 2054
    for(i=0; i<MAX_PICTURE_COUNT; i++){
       if(s->picture[i].data[0] && (   s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
                                    || s->picture[i].type == FF_BUFFER_TYPE_USER))
        avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
F
Fabrice Bellard 已提交
2055
    }
B
Benoit Fouet 已提交
2056
    s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2057

B
Benoit Fouet 已提交
2058
    s->mb_x= s->mb_y= 0;
M
Michael Niedermayer 已提交
2059

B
Benoit Fouet 已提交
2060 2061 2062 2063 2064 2065 2066 2067
    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 已提交
2068 2069
}

2070
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2071
                                   DCTELEM *block, int n, int qscale)
F
Fabrice Bellard 已提交
2072
{
M
Michael Niedermayer 已提交
2073
    int i, level, nCoeffs;
2074
    const uint16_t *quant_matrix;
F
Fabrice Bellard 已提交
2075

2076
    nCoeffs= s->block_last_index[n];
2077 2078

    if (n < 4)
2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095
        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 已提交
2096
            }
2097
            block[j] = level;
F
Fabrice Bellard 已提交
2098
        }
2099 2100 2101
    }
}

2102
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2103 2104 2105 2106 2107 2108
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
    const uint16_t *quant_matrix;

    nCoeffs= s->block_last_index[n];
2109

2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124
    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 已提交
2125
            }
2126
            block[j] = level;
F
Fabrice Bellard 已提交
2127 2128 2129
        }
    }
}
2130

2131
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2132 2133 2134
                                   DCTELEM *block, int n, int qscale)
{
    int i, level, nCoeffs;
2135
    const uint16_t *quant_matrix;
2136

2137 2138
    if(s->alternate_scan) nCoeffs= 63;
    else nCoeffs= s->block_last_index[n];
2139 2140

    if (n < 4)
2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160
        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;
        }
    }
}

2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193
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;
}

2194
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2195 2196 2197 2198 2199 2200 2201 2202
                                   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];
2203

2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224
    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;
}

2225
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2226 2227 2228 2229
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
    int nCoeffs;
2230

2231
    assert(s->block_last_index[n]>=0);
2232

2233
    qmul = qscale << 1;
2234

2235
    if (!s->h263_aic) {
2236
        if (n < 4)
2237 2238 2239
            block[0] = block[0] * s->y_dc_scale;
        else
            block[0] = block[0] * s->c_dc_scale;
2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255
        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;
2256
            }
2257
            block[i] = level;
2258 2259 2260 2261
        }
    }
}

2262
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2263 2264 2265
                                  DCTELEM *block, int n, int qscale)
{
    int i, level, qmul, qadd;
M
Michael Niedermayer 已提交
2266
    int nCoeffs;
2267

2268
    assert(s->block_last_index[n]>=0);
2269

2270 2271
    qadd = (qscale - 1) | 1;
    qmul = qscale << 1;
2272

2273
    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2274

2275
    for(i=0; i<=nCoeffs; i++) {
2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286
        level = block[i];
        if (level) {
            if (level < 0) {
                level = level * qmul - qadd;
            } else {
                level = level * qmul + qadd;
            }
            block[i] = level;
        }
    }
}
F
Fabrice Bellard 已提交
2287

2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303
/**
 * 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 ];
}