~ubuntu-branches/ubuntu/raring/libav/raring-security

« back to all changes in this revision

Viewing changes to .pc/post-0.7.1/0007-H.264-fix-overreads-of-qscale_table.patch/libavcodec/mpegvideo.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2011-09-28 09:18:34 UTC
  • mfrom: (1.3.7 sid)
  • Revision ID: package-import@ubuntu.com-20110928091834-w415mnuh06h4zpvc
Tags: 4:0.7.1-7ubuntu2
Revert "Convert package to include multiarch support."

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * The simplest mpeg encoder (well, it was the simplest!)
 
3
 * Copyright (c) 2000,2001 Fabrice Bellard
 
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
 
5
 *
 
6
 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
 
7
 *
 
8
 * This file is part of Libav.
 
9
 *
 
10
 * Libav is free software; you can redistribute it and/or
 
11
 * modify it under the terms of the GNU Lesser General Public
 
12
 * License as published by the Free Software Foundation; either
 
13
 * version 2.1 of the License, or (at your option) any later version.
 
14
 *
 
15
 * Libav is distributed in the hope that it will be useful,
 
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
18
 * Lesser General Public License for more details.
 
19
 *
 
20
 * You should have received a copy of the GNU Lesser General Public
 
21
 * License along with Libav; if not, write to the Free Software
 
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
23
 */
 
24
 
 
25
/**
 
26
 * @file
 
27
 * The simplest mpeg encoder (well, it was the simplest!).
 
28
 */
 
29
 
 
30
#include "libavutil/intmath.h"
 
31
#include "libavutil/imgutils.h"
 
32
#include "avcodec.h"
 
33
#include "dsputil.h"
 
34
#include "internal.h"
 
35
#include "mpegvideo.h"
 
36
#include "mpegvideo_common.h"
 
37
#include "mjpegenc.h"
 
38
#include "msmpeg4.h"
 
39
#include "faandct.h"
 
40
#include "xvmc_internal.h"
 
41
#include "thread.h"
 
42
#include <limits.h>
 
43
 
 
44
//#undef NDEBUG
 
45
//#include <assert.h>
 
46
 
 
47
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
 
48
                                   DCTELEM *block, int n, int qscale);
 
49
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
 
50
                                   DCTELEM *block, int n, int qscale);
 
51
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
 
52
                                   DCTELEM *block, int n, int qscale);
 
53
static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
 
54
                                   DCTELEM *block, int n, int qscale);
 
55
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
 
56
                                   DCTELEM *block, int n, int qscale);
 
57
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
 
58
                                  DCTELEM *block, int n, int qscale);
 
59
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
 
60
                                  DCTELEM *block, int n, int qscale);
 
61
 
 
62
 
 
63
/* enable all paranoid tests for rounding, overflows, etc... */
 
64
//#define PARANOID
 
65
 
 
66
//#define DEBUG
 
67
 
 
68
 
 
69
static const uint8_t ff_default_chroma_qscale_table[32]={
 
70
//  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
 
71
    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
 
72
};
 
73
 
 
74
const uint8_t ff_mpeg1_dc_scale_table[128]={
 
75
//  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
 
76
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
 
77
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
 
78
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
 
79
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
 
80
};
 
81
 
 
82
static const uint8_t mpeg2_dc_scale_table1[128]={
 
83
//  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
 
84
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
 
85
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
 
86
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
 
87
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
 
88
};
 
89
 
 
90
static const uint8_t mpeg2_dc_scale_table2[128]={
 
91
//  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
 
92
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 
93
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 
94
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 
95
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 
96
};
 
97
 
 
98
static const uint8_t mpeg2_dc_scale_table3[128]={
 
99
//  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
 
100
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 
101
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 
102
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 
103
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 
104
};
 
105
 
 
106
const uint8_t * const ff_mpeg2_dc_scale_table[4]={
 
107
    ff_mpeg1_dc_scale_table,
 
108
    mpeg2_dc_scale_table1,
 
109
    mpeg2_dc_scale_table2,
 
110
    mpeg2_dc_scale_table3,
 
111
};
 
112
 
 
113
const enum PixelFormat ff_pixfmt_list_420[] = {
 
114
    PIX_FMT_YUV420P,
 
115
    PIX_FMT_NONE
 
116
};
 
117
 
 
118
const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = {
 
119
    PIX_FMT_DXVA2_VLD,
 
120
    PIX_FMT_VAAPI_VLD,
 
121
    PIX_FMT_YUV420P,
 
122
    PIX_FMT_NONE
 
123
};
 
124
 
 
125
const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
 
126
    int i;
 
127
 
 
128
    assert(p<=end);
 
129
    if(p>=end)
 
130
        return end;
 
131
 
 
132
    for(i=0; i<3; i++){
 
133
        uint32_t tmp= *state << 8;
 
134
        *state= tmp + *(p++);
 
135
        if(tmp == 0x100 || p==end)
 
136
            return p;
 
137
    }
 
138
 
 
139
    while(p<end){
 
140
        if     (p[-1] > 1      ) p+= 3;
 
141
        else if(p[-2]          ) p+= 2;
 
142
        else if(p[-3]|(p[-1]-1)) p++;
 
143
        else{
 
144
            p++;
 
145
            break;
 
146
        }
 
147
    }
 
148
 
 
149
    p= FFMIN(p, end)-4;
 
150
    *state= AV_RB32(p);
 
151
 
 
152
    return p+4;
 
153
}
 
154
 
 
155
/* init common dct for both encoder and decoder */
 
156
av_cold int ff_dct_common_init(MpegEncContext *s)
 
157
{
 
158
    s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
 
159
    s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
 
160
    s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
 
161
    s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
 
162
    s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
 
163
    if(s->flags & CODEC_FLAG_BITEXACT)
 
164
        s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
 
165
    s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
 
166
 
 
167
#if   HAVE_MMX
 
168
    MPV_common_init_mmx(s);
 
169
#elif ARCH_ALPHA
 
170
    MPV_common_init_axp(s);
 
171
#elif CONFIG_MLIB
 
172
    MPV_common_init_mlib(s);
 
173
#elif HAVE_MMI
 
174
    MPV_common_init_mmi(s);
 
175
#elif ARCH_ARM
 
176
    MPV_common_init_arm(s);
 
177
#elif HAVE_ALTIVEC
 
178
    MPV_common_init_altivec(s);
 
179
#elif ARCH_BFIN
 
180
    MPV_common_init_bfin(s);
 
181
#endif
 
182
 
 
183
    /* load & permutate scantables
 
184
       note: only wmv uses different ones
 
185
    */
 
186
    if(s->alternate_scan){
 
187
        ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan);
 
188
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan);
 
189
    }else{
 
190
        ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct);
 
191
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct);
 
192
    }
 
193
    ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
 
194
    ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
 
195
 
 
196
    return 0;
 
197
}
 
198
 
 
199
void ff_copy_picture(Picture *dst, Picture *src){
 
200
    *dst = *src;
 
201
    dst->type= FF_BUFFER_TYPE_COPY;
 
202
}
 
203
 
 
204
/**
 
205
 * Release a frame buffer
 
206
 */
 
207
static void free_frame_buffer(MpegEncContext *s, Picture *pic)
 
208
{
 
209
    ff_thread_release_buffer(s->avctx, (AVFrame*)pic);
 
210
    av_freep(&pic->hwaccel_picture_private);
 
211
}
 
212
 
 
213
/**
 
214
 * Allocate a frame buffer
 
215
 */
 
216
static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
 
217
{
 
218
    int r;
 
219
 
 
220
    if (s->avctx->hwaccel) {
 
221
        assert(!pic->hwaccel_picture_private);
 
222
        if (s->avctx->hwaccel->priv_data_size) {
 
223
            pic->hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
 
224
            if (!pic->hwaccel_picture_private) {
 
225
                av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
 
226
                return -1;
 
227
            }
 
228
        }
 
229
    }
 
230
 
 
231
    r = ff_thread_get_buffer(s->avctx, (AVFrame*)pic);
 
232
 
 
233
    if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
 
234
        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
 
235
        av_freep(&pic->hwaccel_picture_private);
 
236
        return -1;
 
237
    }
 
238
 
 
239
    if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) {
 
240
        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
 
241
        free_frame_buffer(s, pic);
 
242
        return -1;
 
243
    }
 
244
 
 
245
    if (pic->linesize[1] != pic->linesize[2]) {
 
246
        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
 
247
        free_frame_buffer(s, pic);
 
248
        return -1;
 
249
    }
 
250
 
 
251
    return 0;
 
252
}
 
253
 
 
254
/**
 
255
 * allocates a Picture
 
256
 * The pixels are allocated/set by calling get_buffer() if shared=0
 
257
 */
 
258
int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){
 
259
    const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
 
260
    const int mb_array_size= s->mb_stride*s->mb_height;
 
261
    const int b8_array_size= s->b8_stride*s->mb_height*2;
 
262
    const int b4_array_size= s->b4_stride*s->mb_height*4;
 
263
    int i;
 
264
    int r= -1;
 
265
 
 
266
    if(shared){
 
267
        assert(pic->data[0]);
 
268
        assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
 
269
        pic->type= FF_BUFFER_TYPE_SHARED;
 
270
    }else{
 
271
        assert(!pic->data[0]);
 
272
 
 
273
        if (alloc_frame_buffer(s, pic) < 0)
 
274
            return -1;
 
275
 
 
276
        s->linesize  = pic->linesize[0];
 
277
        s->uvlinesize= pic->linesize[1];
 
278
    }
 
279
 
 
280
    if(pic->qscale_table==NULL){
 
281
        if (s->encoding) {
 
282
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var   , mb_array_size * sizeof(int16_t)  , fail)
 
283
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t)  , fail)
 
284
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean  , mb_array_size * sizeof(int8_t )  , fail)
 
285
        }
 
286
 
 
287
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check
 
288
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t)  , fail)
 
289
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail)
 
290
        pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1;
 
291
        if(s->out_format == FMT_H264){
 
292
            for(i=0; i<2; i++){
 
293
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4)  * sizeof(int16_t), fail)
 
294
                pic->motion_val[i]= pic->motion_val_base[i]+4;
 
295
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
 
296
            }
 
297
            pic->motion_subsample_log2= 2;
 
298
        }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
 
299
            for(i=0; i<2; i++){
 
300
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail)
 
301
                pic->motion_val[i]= pic->motion_val_base[i]+4;
 
302
                FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
 
303
            }
 
304
            pic->motion_subsample_log2= 3;
 
305
        }
 
306
        if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
 
307
            FF_ALLOCZ_OR_GOTO(s->avctx, pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6, fail)
 
308
        }
 
309
        pic->qstride= s->mb_stride;
 
310
        FF_ALLOCZ_OR_GOTO(s->avctx, pic->pan_scan , 1 * sizeof(AVPanScan), fail)
 
311
    }
 
312
 
 
313
    /* It might be nicer if the application would keep track of these
 
314
     * but it would require an API change. */
 
315
    memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
 
316
    s->prev_pict_types[0]= s->dropable ? AV_PICTURE_TYPE_B : s->pict_type;
 
317
    if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == AV_PICTURE_TYPE_B)
 
318
        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.
 
319
    pic->owner2 = NULL;
 
320
 
 
321
    return 0;
 
322
fail: //for the FF_ALLOCZ_OR_GOTO macro
 
323
    if(r>=0)
 
324
        free_frame_buffer(s, pic);
 
325
    return -1;
 
326
}
 
327
 
 
328
/**
 
329
 * deallocates a picture
 
330
 */
 
331
static void free_picture(MpegEncContext *s, Picture *pic){
 
332
    int i;
 
333
 
 
334
    if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
 
335
        free_frame_buffer(s, pic);
 
336
    }
 
337
 
 
338
    av_freep(&pic->mb_var);
 
339
    av_freep(&pic->mc_mb_var);
 
340
    av_freep(&pic->mb_mean);
 
341
    av_freep(&pic->mbskip_table);
 
342
    av_freep(&pic->qscale_table);
 
343
    av_freep(&pic->mb_type_base);
 
344
    av_freep(&pic->dct_coeff);
 
345
    av_freep(&pic->pan_scan);
 
346
    pic->mb_type= NULL;
 
347
    for(i=0; i<2; i++){
 
348
        av_freep(&pic->motion_val_base[i]);
 
349
        av_freep(&pic->ref_index[i]);
 
350
    }
 
351
 
 
352
    if(pic->type == FF_BUFFER_TYPE_SHARED){
 
353
        for(i=0; i<4; i++){
 
354
            pic->base[i]=
 
355
            pic->data[i]= NULL;
 
356
        }
 
357
        pic->type= 0;
 
358
    }
 
359
}
 
360
 
 
361
static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
 
362
    int y_size = s->b8_stride * (2 * s->mb_height + 1);
 
363
    int c_size = s->mb_stride * (s->mb_height + 1);
 
364
    int yc_size = y_size + 2 * c_size;
 
365
    int i;
 
366
 
 
367
    // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
 
368
    FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
 
369
    s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
 
370
 
 
371
     //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
 
372
    FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad,  (s->width+64)*4*16*2*sizeof(uint8_t), fail)
 
373
    s->me.temp=         s->me.scratchpad;
 
374
    s->rd_scratchpad=   s->me.scratchpad;
 
375
    s->b_scratchpad=    s->me.scratchpad;
 
376
    s->obmc_scratchpad= s->me.scratchpad + 16;
 
377
    if (s->encoding) {
 
378
        FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map      , ME_MAP_SIZE*sizeof(uint32_t), fail)
 
379
        FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail)
 
380
        if(s->avctx->noise_reduction){
 
381
            FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail)
 
382
        }
 
383
    }
 
384
    FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail)
 
385
    s->block= s->blocks[0];
 
386
 
 
387
    for(i=0;i<12;i++){
 
388
        s->pblocks[i] = &s->block[i];
 
389
    }
 
390
 
 
391
    if (s->out_format == FMT_H263) {
 
392
        /* ac values */
 
393
        FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
 
394
        s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
 
395
        s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
 
396
        s->ac_val[2] = s->ac_val[1] + c_size;
 
397
    }
 
398
 
 
399
    return 0;
 
400
fail:
 
401
    return -1; //free() through MPV_common_end()
 
402
}
 
403
 
 
404
static void free_duplicate_context(MpegEncContext *s){
 
405
    if(s==NULL) return;
 
406
 
 
407
    av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
 
408
    av_freep(&s->me.scratchpad);
 
409
    s->me.temp=
 
410
    s->rd_scratchpad=
 
411
    s->b_scratchpad=
 
412
    s->obmc_scratchpad= NULL;
 
413
 
 
414
    av_freep(&s->dct_error_sum);
 
415
    av_freep(&s->me.map);
 
416
    av_freep(&s->me.score_map);
 
417
    av_freep(&s->blocks);
 
418
    av_freep(&s->ac_val_base);
 
419
    s->block= NULL;
 
420
}
 
421
 
 
422
static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
 
423
#define COPY(a) bak->a= src->a
 
424
    COPY(allocated_edge_emu_buffer);
 
425
    COPY(edge_emu_buffer);
 
426
    COPY(me.scratchpad);
 
427
    COPY(me.temp);
 
428
    COPY(rd_scratchpad);
 
429
    COPY(b_scratchpad);
 
430
    COPY(obmc_scratchpad);
 
431
    COPY(me.map);
 
432
    COPY(me.score_map);
 
433
    COPY(blocks);
 
434
    COPY(block);
 
435
    COPY(start_mb_y);
 
436
    COPY(end_mb_y);
 
437
    COPY(me.map_generation);
 
438
    COPY(pb);
 
439
    COPY(dct_error_sum);
 
440
    COPY(dct_count[0]);
 
441
    COPY(dct_count[1]);
 
442
    COPY(ac_val_base);
 
443
    COPY(ac_val[0]);
 
444
    COPY(ac_val[1]);
 
445
    COPY(ac_val[2]);
 
446
#undef COPY
 
447
}
 
448
 
 
449
void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
 
450
    MpegEncContext bak;
 
451
    int i;
 
452
    //FIXME copy only needed parts
 
453
//START_TIMER
 
454
    backup_duplicate_context(&bak, dst);
 
455
    memcpy(dst, src, sizeof(MpegEncContext));
 
456
    backup_duplicate_context(dst, &bak);
 
457
    for(i=0;i<12;i++){
 
458
        dst->pblocks[i] = &dst->block[i];
 
459
    }
 
460
//STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
 
461
}
 
462
 
 
463
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 
464
{
 
465
    MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
 
466
 
 
467
    if(dst == src || !s1->context_initialized) return 0;
 
468
 
 
469
    //FIXME can parameters change on I-frames? in that case dst may need a reinit
 
470
    if(!s->context_initialized){
 
471
        memcpy(s, s1, sizeof(MpegEncContext));
 
472
 
 
473
        s->avctx                 = dst;
 
474
        s->picture_range_start  += MAX_PICTURE_COUNT;
 
475
        s->picture_range_end    += MAX_PICTURE_COUNT;
 
476
        s->bitstream_buffer      = NULL;
 
477
        s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
 
478
 
 
479
        MPV_common_init(s);
 
480
    }
 
481
 
 
482
    s->avctx->coded_height  = s1->avctx->coded_height;
 
483
    s->avctx->coded_width   = s1->avctx->coded_width;
 
484
    s->avctx->width         = s1->avctx->width;
 
485
    s->avctx->height        = s1->avctx->height;
 
486
 
 
487
    s->coded_picture_number = s1->coded_picture_number;
 
488
    s->picture_number       = s1->picture_number;
 
489
    s->input_picture_number = s1->input_picture_number;
 
490
 
 
491
    memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
 
492
    memcpy(&s->last_picture, &s1->last_picture, (char*)&s1->last_picture_ptr - (char*)&s1->last_picture);
 
493
 
 
494
    s->last_picture_ptr     = REBASE_PICTURE(s1->last_picture_ptr,    s, s1);
 
495
    s->current_picture_ptr  = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
 
496
    s->next_picture_ptr     = REBASE_PICTURE(s1->next_picture_ptr,    s, s1);
 
497
 
 
498
    memcpy(s->prev_pict_types, s1->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
 
499
 
 
500
    //Error/bug resilience
 
501
    s->next_p_frame_damaged = s1->next_p_frame_damaged;
 
502
    s->workaround_bugs      = s1->workaround_bugs;
 
503
 
 
504
    //MPEG4 timing info
 
505
    memcpy(&s->time_increment_bits, &s1->time_increment_bits, (char*)&s1->shape - (char*)&s1->time_increment_bits);
 
506
 
 
507
    //B-frame info
 
508
    s->max_b_frames         = s1->max_b_frames;
 
509
    s->low_delay            = s1->low_delay;
 
510
    s->dropable             = s1->dropable;
 
511
 
 
512
    //DivX handling (doesn't work)
 
513
    s->divx_packed          = s1->divx_packed;
 
514
 
 
515
    if(s1->bitstream_buffer){
 
516
        if (s1->bitstream_buffer_size + FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
 
517
            av_fast_malloc(&s->bitstream_buffer, &s->allocated_bitstream_buffer_size, s1->allocated_bitstream_buffer_size);
 
518
        s->bitstream_buffer_size  = s1->bitstream_buffer_size;
 
519
        memcpy(s->bitstream_buffer, s1->bitstream_buffer, s1->bitstream_buffer_size);
 
520
        memset(s->bitstream_buffer+s->bitstream_buffer_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 
521
    }
 
522
 
 
523
    //MPEG2/interlacing info
 
524
    memcpy(&s->progressive_sequence, &s1->progressive_sequence, (char*)&s1->rtp_mode - (char*)&s1->progressive_sequence);
 
525
 
 
526
    if(!s1->first_field){
 
527
        s->last_pict_type= s1->pict_type;
 
528
        if (s1->current_picture_ptr) s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->quality;
 
529
 
 
530
        if(s1->pict_type!=FF_B_TYPE){
 
531
            s->last_non_b_pict_type= s1->pict_type;
 
532
        }
 
533
    }
 
534
 
 
535
    return 0;
 
536
}
 
537
 
 
538
/**
 
539
 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
 
540
 * the changed fields will not depend upon the prior state of the MpegEncContext.
 
541
 */
 
542
void MPV_common_defaults(MpegEncContext *s){
 
543
    s->y_dc_scale_table=
 
544
    s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
 
545
    s->chroma_qscale_table= ff_default_chroma_qscale_table;
 
546
    s->progressive_frame= 1;
 
547
    s->progressive_sequence= 1;
 
548
    s->picture_structure= PICT_FRAME;
 
549
 
 
550
    s->coded_picture_number = 0;
 
551
    s->picture_number = 0;
 
552
    s->input_picture_number = 0;
 
553
 
 
554
    s->picture_in_gop_number = 0;
 
555
 
 
556
    s->f_code = 1;
 
557
    s->b_code = 1;
 
558
 
 
559
    s->picture_range_start = 0;
 
560
    s->picture_range_end = MAX_PICTURE_COUNT;
 
561
}
 
562
 
 
563
/**
 
564
 * sets the given MpegEncContext to defaults for decoding.
 
565
 * the changed fields will not depend upon the prior state of the MpegEncContext.
 
566
 */
 
567
void MPV_decode_defaults(MpegEncContext *s){
 
568
    MPV_common_defaults(s);
 
569
}
 
570
 
 
571
/**
 
572
 * init common structure for both encoder and decoder.
 
573
 * this assumes that some variables like width/height are already set
 
574
 */
 
575
av_cold int MPV_common_init(MpegEncContext *s)
 
576
{
 
577
    int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads;
 
578
 
 
579
    if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
 
580
        s->mb_height = (s->height + 31) / 32 * 2;
 
581
    else if (s->codec_id != CODEC_ID_H264)
 
582
        s->mb_height = (s->height + 15) / 16;
 
583
 
 
584
    if(s->avctx->pix_fmt == PIX_FMT_NONE){
 
585
        av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n");
 
586
        return -1;
 
587
    }
 
588
 
 
589
    if((s->encoding || (s->avctx->active_thread_type & FF_THREAD_SLICE)) &&
 
590
       (s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height))){
 
591
        av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
 
592
        return -1;
 
593
    }
 
594
 
 
595
    if((s->width || s->height) && av_image_check_size(s->width, s->height, 0, s->avctx))
 
596
        return -1;
 
597
 
 
598
    dsputil_init(&s->dsp, s->avctx);
 
599
    ff_dct_common_init(s);
 
600
 
 
601
    s->flags= s->avctx->flags;
 
602
    s->flags2= s->avctx->flags2;
 
603
 
 
604
    if (s->width && s->height) {
 
605
        s->mb_width  = (s->width  + 15) / 16;
 
606
        s->mb_stride = s->mb_width + 1;
 
607
        s->b8_stride = s->mb_width*2 + 1;
 
608
        s->b4_stride = s->mb_width*4 + 1;
 
609
        mb_array_size= s->mb_height * s->mb_stride;
 
610
        mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
 
611
 
 
612
        /* set chroma shifts */
 
613
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
 
614
                                      &(s->chroma_y_shift) );
 
615
 
 
616
        /* set default edge pos, will be overriden in decode_header if needed */
 
617
        s->h_edge_pos= s->mb_width*16;
 
618
        s->v_edge_pos= s->mb_height*16;
 
619
 
 
620
        s->mb_num = s->mb_width * s->mb_height;
 
621
 
 
622
        s->block_wrap[0]=
 
623
        s->block_wrap[1]=
 
624
        s->block_wrap[2]=
 
625
        s->block_wrap[3]= s->b8_stride;
 
626
        s->block_wrap[4]=
 
627
        s->block_wrap[5]= s->mb_stride;
 
628
 
 
629
        y_size = s->b8_stride * (2 * s->mb_height + 1);
 
630
        c_size = s->mb_stride * (s->mb_height + 1);
 
631
        yc_size = y_size + 2 * c_size;
 
632
 
 
633
        /* convert fourcc to upper case */
 
634
        s->codec_tag = ff_toupper4(s->avctx->codec_tag);
 
635
 
 
636
        s->stream_codec_tag = ff_toupper4(s->avctx->stream_codec_tag);
 
637
 
 
638
        s->avctx->coded_frame= (AVFrame*)&s->current_picture;
 
639
 
 
640
        FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
 
641
        for(y=0; y<s->mb_height; y++){
 
642
            for(x=0; x<s->mb_width; x++){
 
643
                s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
 
644
            }
 
645
        }
 
646
        s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
 
647
 
 
648
        if (s->encoding) {
 
649
            /* Allocate MV tables */
 
650
            FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t), fail)
 
651
            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
 
652
            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
 
653
            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
 
654
            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
 
655
            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t), fail)
 
656
            s->p_mv_table           = s->p_mv_table_base            + s->mb_stride + 1;
 
657
            s->b_forw_mv_table      = s->b_forw_mv_table_base       + s->mb_stride + 1;
 
658
            s->b_back_mv_table      = s->b_back_mv_table_base       + s->mb_stride + 1;
 
659
            s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
 
660
            s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
 
661
            s->b_direct_mv_table    = s->b_direct_mv_table_base     + s->mb_stride + 1;
 
662
 
 
663
            if(s->msmpeg4_version){
 
664
                FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
 
665
            }
 
666
            FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
 
667
 
 
668
            /* Allocate MB type table */
 
669
            FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type  , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
 
670
 
 
671
            FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
 
672
 
 
673
            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix  , 64*32   * sizeof(int), fail)
 
674
            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix  , 64*32   * sizeof(int), fail)
 
675
            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
 
676
            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
 
677
            FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
 
678
            FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
 
679
 
 
680
            if(s->avctx->noise_reduction){
 
681
                FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
 
682
            }
 
683
        }
 
684
    }
 
685
 
 
686
    s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
 
687
    FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, s->picture_count * sizeof(Picture), fail)
 
688
    for(i = 0; i < s->picture_count; i++) {
 
689
        avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
 
690
    }
 
691
 
 
692
    if (s->width && s->height) {
 
693
        FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
 
694
 
 
695
        if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
 
696
            /* interlaced direct mode decoding tables */
 
697
            for(i=0; i<2; i++){
 
698
                int j, k;
 
699
                for(j=0; j<2; j++){
 
700
                    for(k=0; k<2; k++){
 
701
                        FF_ALLOCZ_OR_GOTO(s->avctx,    s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
 
702
                        s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
 
703
                    }
 
704
                    FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
 
705
                    FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
 
706
                    s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
 
707
                }
 
708
                FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
 
709
            }
 
710
        }
 
711
        if (s->out_format == FMT_H263) {
 
712
            /* cbp values */
 
713
            FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
 
714
            s->coded_block= s->coded_block_base + s->b8_stride + 1;
 
715
 
 
716
            /* cbp, ac_pred, pred_dir */
 
717
            FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table     , mb_array_size * sizeof(uint8_t), fail)
 
718
            FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
 
719
        }
 
720
 
 
721
        if (s->h263_pred || s->h263_plus || !s->encoding) {
 
722
            /* dc values */
 
723
            //MN: we need these for error resilience of intra-frames
 
724
            FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
 
725
            s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
 
726
            s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
 
727
            s->dc_val[2] = s->dc_val[1] + c_size;
 
728
            for(i=0;i<yc_size;i++)
 
729
                s->dc_val_base[i] = 1024;
 
730
        }
 
731
 
 
732
        /* which mb is a intra block */
 
733
        FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
 
734
        memset(s->mbintra_table, 1, mb_array_size);
 
735
 
 
736
        /* init macroblock skip table */
 
737
        FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
 
738
        //Note the +1 is for a quicker mpeg4 slice_end detection
 
739
        FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
 
740
 
 
741
        s->parse_context.state= -1;
 
742
        if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
 
743
            s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
 
744
            s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
 
745
            s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
 
746
        }
 
747
    }
 
748
 
 
749
    s->context_initialized = 1;
 
750
    s->thread_context[0]= s;
 
751
 
 
752
    if (s->width && s->height) {
 
753
    if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
 
754
        threads = s->avctx->thread_count;
 
755
 
 
756
        for(i=1; i<threads; i++){
 
757
            s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
 
758
            memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
 
759
        }
 
760
 
 
761
        for(i=0; i<threads; i++){
 
762
            if(init_duplicate_context(s->thread_context[i], s) < 0)
 
763
                goto fail;
 
764
            s->thread_context[i]->start_mb_y= (s->mb_height*(i  ) + s->avctx->thread_count/2) / s->avctx->thread_count;
 
765
            s->thread_context[i]->end_mb_y  = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
 
766
        }
 
767
    } else {
 
768
        if(init_duplicate_context(s, s) < 0) goto fail;
 
769
        s->start_mb_y = 0;
 
770
        s->end_mb_y   = s->mb_height;
 
771
    }
 
772
    }
 
773
 
 
774
    return 0;
 
775
 fail:
 
776
    MPV_common_end(s);
 
777
    return -1;
 
778
}
 
779
 
 
780
/* init common structure for both encoder and decoder */
 
781
void MPV_common_end(MpegEncContext *s)
 
782
{
 
783
    int i, j, k;
 
784
 
 
785
    if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
 
786
        for(i=0; i<s->avctx->thread_count; i++){
 
787
            free_duplicate_context(s->thread_context[i]);
 
788
        }
 
789
        for(i=1; i<s->avctx->thread_count; i++){
 
790
            av_freep(&s->thread_context[i]);
 
791
        }
 
792
    } else free_duplicate_context(s);
 
793
 
 
794
    av_freep(&s->parse_context.buffer);
 
795
    s->parse_context.buffer_size=0;
 
796
 
 
797
    av_freep(&s->mb_type);
 
798
    av_freep(&s->p_mv_table_base);
 
799
    av_freep(&s->b_forw_mv_table_base);
 
800
    av_freep(&s->b_back_mv_table_base);
 
801
    av_freep(&s->b_bidir_forw_mv_table_base);
 
802
    av_freep(&s->b_bidir_back_mv_table_base);
 
803
    av_freep(&s->b_direct_mv_table_base);
 
804
    s->p_mv_table= NULL;
 
805
    s->b_forw_mv_table= NULL;
 
806
    s->b_back_mv_table= NULL;
 
807
    s->b_bidir_forw_mv_table= NULL;
 
808
    s->b_bidir_back_mv_table= NULL;
 
809
    s->b_direct_mv_table= NULL;
 
810
    for(i=0; i<2; i++){
 
811
        for(j=0; j<2; j++){
 
812
            for(k=0; k<2; k++){
 
813
                av_freep(&s->b_field_mv_table_base[i][j][k]);
 
814
                s->b_field_mv_table[i][j][k]=NULL;
 
815
            }
 
816
            av_freep(&s->b_field_select_table[i][j]);
 
817
            av_freep(&s->p_field_mv_table_base[i][j]);
 
818
            s->p_field_mv_table[i][j]=NULL;
 
819
        }
 
820
        av_freep(&s->p_field_select_table[i]);
 
821
    }
 
822
 
 
823
    av_freep(&s->dc_val_base);
 
824
    av_freep(&s->coded_block_base);
 
825
    av_freep(&s->mbintra_table);
 
826
    av_freep(&s->cbp_table);
 
827
    av_freep(&s->pred_dir_table);
 
828
 
 
829
    av_freep(&s->mbskip_table);
 
830
    av_freep(&s->prev_pict_types);
 
831
    av_freep(&s->bitstream_buffer);
 
832
    s->allocated_bitstream_buffer_size=0;
 
833
 
 
834
    av_freep(&s->avctx->stats_out);
 
835
    av_freep(&s->ac_stats);
 
836
    av_freep(&s->error_status_table);
 
837
    av_freep(&s->mb_index2xy);
 
838
    av_freep(&s->lambda_table);
 
839
    av_freep(&s->q_intra_matrix);
 
840
    av_freep(&s->q_inter_matrix);
 
841
    av_freep(&s->q_intra_matrix16);
 
842
    av_freep(&s->q_inter_matrix16);
 
843
    av_freep(&s->input_picture);
 
844
    av_freep(&s->reordered_input_picture);
 
845
    av_freep(&s->dct_offset);
 
846
 
 
847
    if(s->picture && !s->avctx->is_copy){
 
848
        for(i=0; i<s->picture_count; i++){
 
849
            free_picture(s, &s->picture[i]);
 
850
        }
 
851
    }
 
852
    av_freep(&s->picture);
 
853
    s->context_initialized = 0;
 
854
    s->last_picture_ptr=
 
855
    s->next_picture_ptr=
 
856
    s->current_picture_ptr= NULL;
 
857
    s->linesize= s->uvlinesize= 0;
 
858
 
 
859
    for(i=0; i<3; i++)
 
860
        av_freep(&s->visualization_buffer[i]);
 
861
 
 
862
    if(!(s->avctx->active_thread_type&FF_THREAD_FRAME))
 
863
        avcodec_default_free_buffers(s->avctx);
 
864
}
 
865
 
 
866
void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
 
867
{
 
868
    int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
 
869
    uint8_t index_run[MAX_RUN+1];
 
870
    int last, run, level, start, end, i;
 
871
 
 
872
    /* If table is static, we can quit if rl->max_level[0] is not NULL */
 
873
    if(static_store && rl->max_level[0])
 
874
        return;
 
875
 
 
876
    /* compute max_level[], max_run[] and index_run[] */
 
877
    for(last=0;last<2;last++) {
 
878
        if (last == 0) {
 
879
            start = 0;
 
880
            end = rl->last;
 
881
        } else {
 
882
            start = rl->last;
 
883
            end = rl->n;
 
884
        }
 
885
 
 
886
        memset(max_level, 0, MAX_RUN + 1);
 
887
        memset(max_run, 0, MAX_LEVEL + 1);
 
888
        memset(index_run, rl->n, MAX_RUN + 1);
 
889
        for(i=start;i<end;i++) {
 
890
            run = rl->table_run[i];
 
891
            level = rl->table_level[i];
 
892
            if (index_run[run] == rl->n)
 
893
                index_run[run] = i;
 
894
            if (level > max_level[run])
 
895
                max_level[run] = level;
 
896
            if (run > max_run[level])
 
897
                max_run[level] = run;
 
898
        }
 
899
        if(static_store)
 
900
            rl->max_level[last] = static_store[last];
 
901
        else
 
902
            rl->max_level[last] = av_malloc(MAX_RUN + 1);
 
903
        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
 
904
        if(static_store)
 
905
            rl->max_run[last] = static_store[last] + MAX_RUN + 1;
 
906
        else
 
907
            rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
 
908
        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
 
909
        if(static_store)
 
910
            rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
 
911
        else
 
912
            rl->index_run[last] = av_malloc(MAX_RUN + 1);
 
913
        memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
 
914
    }
 
915
}
 
916
 
 
917
void init_vlc_rl(RLTable *rl)
 
918
{
 
919
    int i, q;
 
920
 
 
921
    for(q=0; q<32; q++){
 
922
        int qmul= q*2;
 
923
        int qadd= (q-1)|1;
 
924
 
 
925
        if(q==0){
 
926
            qmul=1;
 
927
            qadd=0;
 
928
        }
 
929
        for(i=0; i<rl->vlc.table_size; i++){
 
930
            int code= rl->vlc.table[i][0];
 
931
            int len = rl->vlc.table[i][1];
 
932
            int level, run;
 
933
 
 
934
            if(len==0){ // illegal code
 
935
                run= 66;
 
936
                level= MAX_LEVEL;
 
937
            }else if(len<0){ //more bits needed
 
938
                run= 0;
 
939
                level= code;
 
940
            }else{
 
941
                if(code==rl->n){ //esc
 
942
                    run= 66;
 
943
                    level= 0;
 
944
                }else{
 
945
                    run=   rl->table_run  [code] + 1;
 
946
                    level= rl->table_level[code] * qmul + qadd;
 
947
                    if(code >= rl->last) run+=192;
 
948
                }
 
949
            }
 
950
            rl->rl_vlc[q][i].len= len;
 
951
            rl->rl_vlc[q][i].level= level;
 
952
            rl->rl_vlc[q][i].run= run;
 
953
        }
 
954
    }
 
955
}
 
956
 
 
957
void ff_release_unused_pictures(MpegEncContext *s, int remove_current)
 
958
{
 
959
    int i;
 
960
 
 
961
    /* release non reference frames */
 
962
    for(i=0; i<s->picture_count; i++){
 
963
        if(s->picture[i].data[0] && !s->picture[i].reference
 
964
           && (!s->picture[i].owner2 || s->picture[i].owner2 == s)
 
965
           && (remove_current || &s->picture[i] != s->current_picture_ptr)
 
966
           /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
 
967
            free_frame_buffer(s, &s->picture[i]);
 
968
        }
 
969
    }
 
970
}
 
971
 
 
972
int ff_find_unused_picture(MpegEncContext *s, int shared){
 
973
    int i;
 
974
 
 
975
    if(shared){
 
976
        for(i=s->picture_range_start; i<s->picture_range_end; i++){
 
977
            if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
 
978
        }
 
979
    }else{
 
980
        for(i=s->picture_range_start; i<s->picture_range_end; i++){
 
981
            if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
 
982
        }
 
983
        for(i=s->picture_range_start; i<s->picture_range_end; i++){
 
984
            if(s->picture[i].data[0]==NULL) return i;
 
985
        }
 
986
    }
 
987
 
 
988
    av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
 
989
    /* We could return -1, but the codec would crash trying to draw into a
 
990
     * non-existing frame anyway. This is safer than waiting for a random crash.
 
991
     * Also the return of this is never useful, an encoder must only allocate
 
992
     * as much as allowed in the specification. This has no relationship to how
 
993
     * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
 
994
     * enough for such valid streams).
 
995
     * Plus, a decoder has to check stream validity and remove frames if too
 
996
     * many reference frames are around. Waiting for "OOM" is not correct at
 
997
     * all. Similarly, missing reference frames have to be replaced by
 
998
     * interpolated/MC frames, anything else is a bug in the codec ...
 
999
     */
 
1000
    abort();
 
1001
    return -1;
 
1002
}
 
1003
 
 
1004
static void update_noise_reduction(MpegEncContext *s){
 
1005
    int intra, i;
 
1006
 
 
1007
    for(intra=0; intra<2; intra++){
 
1008
        if(s->dct_count[intra] > (1<<16)){
 
1009
            for(i=0; i<64; i++){
 
1010
                s->dct_error_sum[intra][i] >>=1;
 
1011
            }
 
1012
            s->dct_count[intra] >>= 1;
 
1013
        }
 
1014
 
 
1015
        for(i=0; i<64; i++){
 
1016
            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);
 
1017
        }
 
1018
    }
 
1019
}
 
1020
 
 
1021
/**
 
1022
 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
 
1023
 */
 
1024
int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
 
1025
{
 
1026
    int i;
 
1027
    Picture *pic;
 
1028
    s->mb_skipped = 0;
 
1029
 
 
1030
    assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
 
1031
 
 
1032
    /* mark&release old frames */
 
1033
    if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
 
1034
      if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
 
1035
          free_frame_buffer(s, s->last_picture_ptr);
 
1036
 
 
1037
        /* release forgotten pictures */
 
1038
        /* if(mpeg124/h263) */
 
1039
        if(!s->encoding){
 
1040
            for(i=0; i<s->picture_count; i++){
 
1041
                if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
 
1042
                    av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
 
1043
                    free_frame_buffer(s, &s->picture[i]);
 
1044
                }
 
1045
            }
 
1046
        }
 
1047
      }
 
1048
    }
 
1049
 
 
1050
    if(!s->encoding){
 
1051
        ff_release_unused_pictures(s, 1);
 
1052
 
 
1053
        if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
 
1054
            pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
 
1055
        else{
 
1056
            i= ff_find_unused_picture(s, 0);
 
1057
            pic= &s->picture[i];
 
1058
        }
 
1059
 
 
1060
        pic->reference= 0;
 
1061
        if (!s->dropable){
 
1062
            if (s->codec_id == CODEC_ID_H264)
 
1063
                pic->reference = s->picture_structure;
 
1064
            else if (s->pict_type != AV_PICTURE_TYPE_B)
 
1065
                pic->reference = 3;
 
1066
        }
 
1067
 
 
1068
        pic->coded_picture_number= s->coded_picture_number++;
 
1069
 
 
1070
        if(ff_alloc_picture(s, pic, 0) < 0)
 
1071
            return -1;
 
1072
 
 
1073
        s->current_picture_ptr= pic;
 
1074
        //FIXME use only the vars from current_pic
 
1075
        s->current_picture_ptr->top_field_first= s->top_field_first;
 
1076
        if(s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) {
 
1077
            if(s->picture_structure != PICT_FRAME)
 
1078
                s->current_picture_ptr->top_field_first= (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
 
1079
        }
 
1080
        s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
 
1081
        s->current_picture_ptr->field_picture= s->picture_structure != PICT_FRAME;
 
1082
    }
 
1083
 
 
1084
    s->current_picture_ptr->pict_type= s->pict_type;
 
1085
//    if(s->flags && CODEC_FLAG_QSCALE)
 
1086
  //      s->current_picture_ptr->quality= s->new_picture_ptr->quality;
 
1087
    s->current_picture_ptr->key_frame= s->pict_type == AV_PICTURE_TYPE_I;
 
1088
 
 
1089
    ff_copy_picture(&s->current_picture, s->current_picture_ptr);
 
1090
 
 
1091
    if (s->pict_type != AV_PICTURE_TYPE_B) {
 
1092
        s->last_picture_ptr= s->next_picture_ptr;
 
1093
        if(!s->dropable)
 
1094
            s->next_picture_ptr= s->current_picture_ptr;
 
1095
    }
 
1096
/*    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,
 
1097
        s->last_picture_ptr    ? s->last_picture_ptr->data[0] : NULL,
 
1098
        s->next_picture_ptr    ? s->next_picture_ptr->data[0] : NULL,
 
1099
        s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
 
1100
        s->pict_type, s->dropable);*/
 
1101
 
 
1102
    if(s->codec_id != CODEC_ID_H264){
 
1103
        if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) &&
 
1104
           (s->pict_type!=AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)){
 
1105
            if (s->pict_type != AV_PICTURE_TYPE_I)
 
1106
                av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
 
1107
            else if (s->picture_structure != PICT_FRAME)
 
1108
                av_log(avctx, AV_LOG_INFO, "allocate dummy last picture for field based first keyframe\n");
 
1109
 
 
1110
            /* Allocate a dummy frame */
 
1111
            i= ff_find_unused_picture(s, 0);
 
1112
            s->last_picture_ptr= &s->picture[i];
 
1113
            if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
 
1114
                return -1;
 
1115
            ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0);
 
1116
            ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 1);
 
1117
        }
 
1118
        if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==AV_PICTURE_TYPE_B){
 
1119
            /* Allocate a dummy frame */
 
1120
            i= ff_find_unused_picture(s, 0);
 
1121
            s->next_picture_ptr= &s->picture[i];
 
1122
            if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
 
1123
                return -1;
 
1124
            ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 0);
 
1125
            ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 1);
 
1126
        }
 
1127
    }
 
1128
 
 
1129
    if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
 
1130
    if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
 
1131
 
 
1132
    assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
 
1133
 
 
1134
    if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
 
1135
        int i;
 
1136
        for(i=0; i<4; i++){
 
1137
            if(s->picture_structure == PICT_BOTTOM_FIELD){
 
1138
                 s->current_picture.data[i] += s->current_picture.linesize[i];
 
1139
            }
 
1140
            s->current_picture.linesize[i] *= 2;
 
1141
            s->last_picture.linesize[i] *=2;
 
1142
            s->next_picture.linesize[i] *=2;
 
1143
        }
 
1144
    }
 
1145
 
 
1146
    s->error_recognition= avctx->error_recognition;
 
1147
 
 
1148
    /* set dequantizer, we can't do it during init as it might change for mpeg4
 
1149
       and we can't do it in the header decode as init is not called for mpeg4 there yet */
 
1150
    if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
 
1151
        s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
 
1152
        s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
 
1153
    }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
 
1154
        s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
 
1155
        s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
 
1156
    }else{
 
1157
        s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
 
1158
        s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
 
1159
    }
 
1160
 
 
1161
    if(s->dct_error_sum){
 
1162
        assert(s->avctx->noise_reduction && s->encoding);
 
1163
 
 
1164
        update_noise_reduction(s);
 
1165
    }
 
1166
 
 
1167
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
 
1168
        return ff_xvmc_field_start(s, avctx);
 
1169
 
 
1170
    return 0;
 
1171
}
 
1172
 
 
1173
/* generic function for encode/decode called after a frame has been coded/decoded */
 
1174
void MPV_frame_end(MpegEncContext *s)
 
1175
{
 
1176
    int i;
 
1177
    /* redraw edges for the frame if decoding didn't complete */
 
1178
    //just to make sure that all data is rendered.
 
1179
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
 
1180
        ff_xvmc_field_end(s);
 
1181
   }else if((s->error_count || s->encoding)
 
1182
       && !s->avctx->hwaccel
 
1183
       && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
 
1184
       && s->unrestricted_mv
 
1185
       && s->current_picture.reference
 
1186
       && !s->intra_only
 
1187
       && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
 
1188
            int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
 
1189
            int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
 
1190
            s->dsp.draw_edges(s->current_picture.data[0], s->linesize  ,
 
1191
                              s->h_edge_pos             , s->v_edge_pos,
 
1192
                              EDGE_WIDTH        , EDGE_WIDTH        , EDGE_TOP | EDGE_BOTTOM);
 
1193
            s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize,
 
1194
                              s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
 
1195
                              EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
 
1196
            s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize,
 
1197
                              s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
 
1198
                              EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
 
1199
    }
 
1200
 
 
1201
    emms_c();
 
1202
 
 
1203
    s->last_pict_type    = s->pict_type;
 
1204
    s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
 
1205
    if(s->pict_type!=AV_PICTURE_TYPE_B){
 
1206
        s->last_non_b_pict_type= s->pict_type;
 
1207
    }
 
1208
#if 0
 
1209
        /* copy back current_picture variables */
 
1210
    for(i=0; i<MAX_PICTURE_COUNT; i++){
 
1211
        if(s->picture[i].data[0] == s->current_picture.data[0]){
 
1212
            s->picture[i]= s->current_picture;
 
1213
            break;
 
1214
        }
 
1215
    }
 
1216
    assert(i<MAX_PICTURE_COUNT);
 
1217
#endif
 
1218
 
 
1219
    if(s->encoding){
 
1220
        /* release non-reference frames */
 
1221
        for(i=0; i<s->picture_count; i++){
 
1222
            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
 
1223
                free_frame_buffer(s, &s->picture[i]);
 
1224
            }
 
1225
        }
 
1226
    }
 
1227
    // clear copies, to avoid confusion
 
1228
#if 0
 
1229
    memset(&s->last_picture, 0, sizeof(Picture));
 
1230
    memset(&s->next_picture, 0, sizeof(Picture));
 
1231
    memset(&s->current_picture, 0, sizeof(Picture));
 
1232
#endif
 
1233
    s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
 
1234
 
 
1235
    if (s->codec_id != CODEC_ID_H264 && s->current_picture.reference) {
 
1236
        ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_height-1, 0);
 
1237
    }
 
1238
}
 
1239
 
 
1240
/**
 
1241
 * draws an line from (ex, ey) -> (sx, sy).
 
1242
 * @param w width of the image
 
1243
 * @param h height of the image
 
1244
 * @param stride stride/linesize of the image
 
1245
 * @param color color of the arrow
 
1246
 */
 
1247
static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
 
1248
    int x, y, fr, f;
 
1249
 
 
1250
    sx= av_clip(sx, 0, w-1);
 
1251
    sy= av_clip(sy, 0, h-1);
 
1252
    ex= av_clip(ex, 0, w-1);
 
1253
    ey= av_clip(ey, 0, h-1);
 
1254
 
 
1255
    buf[sy*stride + sx]+= color;
 
1256
 
 
1257
    if(FFABS(ex - sx) > FFABS(ey - sy)){
 
1258
        if(sx > ex){
 
1259
            FFSWAP(int, sx, ex);
 
1260
            FFSWAP(int, sy, ey);
 
1261
        }
 
1262
        buf+= sx + sy*stride;
 
1263
        ex-= sx;
 
1264
        f= ((ey-sy)<<16)/ex;
 
1265
        for(x= 0; x <= ex; x++){
 
1266
            y = (x*f)>>16;
 
1267
            fr= (x*f)&0xFFFF;
 
1268
            buf[ y   *stride + x]+= (color*(0x10000-fr))>>16;
 
1269
            buf[(y+1)*stride + x]+= (color*         fr )>>16;
 
1270
        }
 
1271
    }else{
 
1272
        if(sy > ey){
 
1273
            FFSWAP(int, sx, ex);
 
1274
            FFSWAP(int, sy, ey);
 
1275
        }
 
1276
        buf+= sx + sy*stride;
 
1277
        ey-= sy;
 
1278
        if(ey) f= ((ex-sx)<<16)/ey;
 
1279
        else   f= 0;
 
1280
        for(y= 0; y <= ey; y++){
 
1281
            x = (y*f)>>16;
 
1282
            fr= (y*f)&0xFFFF;
 
1283
            buf[y*stride + x  ]+= (color*(0x10000-fr))>>16;
 
1284
            buf[y*stride + x+1]+= (color*         fr )>>16;
 
1285
        }
 
1286
    }
 
1287
}
 
1288
 
 
1289
/**
 
1290
 * draws an arrow from (ex, ey) -> (sx, sy).
 
1291
 * @param w width of the image
 
1292
 * @param h height of the image
 
1293
 * @param stride stride/linesize of the image
 
1294
 * @param color color of the arrow
 
1295
 */
 
1296
static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
 
1297
    int dx,dy;
 
1298
 
 
1299
    sx= av_clip(sx, -100, w+100);
 
1300
    sy= av_clip(sy, -100, h+100);
 
1301
    ex= av_clip(ex, -100, w+100);
 
1302
    ey= av_clip(ey, -100, h+100);
 
1303
 
 
1304
    dx= ex - sx;
 
1305
    dy= ey - sy;
 
1306
 
 
1307
    if(dx*dx + dy*dy > 3*3){
 
1308
        int rx=  dx + dy;
 
1309
        int ry= -dx + dy;
 
1310
        int length= ff_sqrt((rx*rx + ry*ry)<<8);
 
1311
 
 
1312
        //FIXME subpixel accuracy
 
1313
        rx= ROUNDED_DIV(rx*3<<4, length);
 
1314
        ry= ROUNDED_DIV(ry*3<<4, length);
 
1315
 
 
1316
        draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
 
1317
        draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
 
1318
    }
 
1319
    draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
 
1320
}
 
1321
 
 
1322
/**
 
1323
 * prints debuging info for the given picture.
 
1324
 */
 
1325
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
 
1326
 
 
1327
    if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
 
1328
 
 
1329
    if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
 
1330
        int x,y;
 
1331
 
 
1332
        av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
 
1333
        switch (pict->pict_type) {
 
1334
            case AV_PICTURE_TYPE_I: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
 
1335
            case AV_PICTURE_TYPE_P: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
 
1336
            case AV_PICTURE_TYPE_B: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
 
1337
            case AV_PICTURE_TYPE_S: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
 
1338
            case AV_PICTURE_TYPE_SI: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
 
1339
            case AV_PICTURE_TYPE_SP: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
 
1340
        }
 
1341
        for(y=0; y<s->mb_height; y++){
 
1342
            for(x=0; x<s->mb_width; x++){
 
1343
                if(s->avctx->debug&FF_DEBUG_SKIP){
 
1344
                    int count= s->mbskip_table[x + y*s->mb_stride];
 
1345
                    if(count>9) count=9;
 
1346
                    av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
 
1347
                }
 
1348
                if(s->avctx->debug&FF_DEBUG_QP){
 
1349
                    av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
 
1350
                }
 
1351
                if(s->avctx->debug&FF_DEBUG_MB_TYPE){
 
1352
                    int mb_type= pict->mb_type[x + y*s->mb_stride];
 
1353
                    //Type & MV direction
 
1354
                    if(IS_PCM(mb_type))
 
1355
                        av_log(s->avctx, AV_LOG_DEBUG, "P");
 
1356
                    else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
 
1357
                        av_log(s->avctx, AV_LOG_DEBUG, "A");
 
1358
                    else if(IS_INTRA4x4(mb_type))
 
1359
                        av_log(s->avctx, AV_LOG_DEBUG, "i");
 
1360
                    else if(IS_INTRA16x16(mb_type))
 
1361
                        av_log(s->avctx, AV_LOG_DEBUG, "I");
 
1362
                    else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
 
1363
                        av_log(s->avctx, AV_LOG_DEBUG, "d");
 
1364
                    else if(IS_DIRECT(mb_type))
 
1365
                        av_log(s->avctx, AV_LOG_DEBUG, "D");
 
1366
                    else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
 
1367
                        av_log(s->avctx, AV_LOG_DEBUG, "g");
 
1368
                    else if(IS_GMC(mb_type))
 
1369
                        av_log(s->avctx, AV_LOG_DEBUG, "G");
 
1370
                    else if(IS_SKIP(mb_type))
 
1371
                        av_log(s->avctx, AV_LOG_DEBUG, "S");
 
1372
                    else if(!USES_LIST(mb_type, 1))
 
1373
                        av_log(s->avctx, AV_LOG_DEBUG, ">");
 
1374
                    else if(!USES_LIST(mb_type, 0))
 
1375
                        av_log(s->avctx, AV_LOG_DEBUG, "<");
 
1376
                    else{
 
1377
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
 
1378
                        av_log(s->avctx, AV_LOG_DEBUG, "X");
 
1379
                    }
 
1380
 
 
1381
                    //segmentation
 
1382
                    if(IS_8X8(mb_type))
 
1383
                        av_log(s->avctx, AV_LOG_DEBUG, "+");
 
1384
                    else if(IS_16X8(mb_type))
 
1385
                        av_log(s->avctx, AV_LOG_DEBUG, "-");
 
1386
                    else if(IS_8X16(mb_type))
 
1387
                        av_log(s->avctx, AV_LOG_DEBUG, "|");
 
1388
                    else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
 
1389
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
 
1390
                    else
 
1391
                        av_log(s->avctx, AV_LOG_DEBUG, "?");
 
1392
 
 
1393
 
 
1394
                    if(IS_INTERLACED(mb_type))
 
1395
                        av_log(s->avctx, AV_LOG_DEBUG, "=");
 
1396
                    else
 
1397
                        av_log(s->avctx, AV_LOG_DEBUG, " ");
 
1398
                }
 
1399
//                av_log(s->avctx, AV_LOG_DEBUG, " ");
 
1400
            }
 
1401
            av_log(s->avctx, AV_LOG_DEBUG, "\n");
 
1402
        }
 
1403
    }
 
1404
 
 
1405
    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
 
1406
        const int shift= 1 + s->quarter_sample;
 
1407
        int mb_y;
 
1408
        uint8_t *ptr;
 
1409
        int i;
 
1410
        int h_chroma_shift, v_chroma_shift, block_height;
 
1411
        const int width = s->avctx->width;
 
1412
        const int height= s->avctx->height;
 
1413
        const int mv_sample_log2= 4 - pict->motion_subsample_log2;
 
1414
        const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
 
1415
        s->low_delay=0; //needed to see the vectors without trashing the buffers
 
1416
 
 
1417
        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
 
1418
        for(i=0; i<3; i++){
 
1419
            memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
 
1420
            pict->data[i]= s->visualization_buffer[i];
 
1421
        }
 
1422
        pict->type= FF_BUFFER_TYPE_COPY;
 
1423
        ptr= pict->data[0];
 
1424
        block_height = 16>>v_chroma_shift;
 
1425
 
 
1426
        for(mb_y=0; mb_y<s->mb_height; mb_y++){
 
1427
            int mb_x;
 
1428
            for(mb_x=0; mb_x<s->mb_width; mb_x++){
 
1429
                const int mb_index= mb_x + mb_y*s->mb_stride;
 
1430
                if((s->avctx->debug_mv) && pict->motion_val){
 
1431
                  int type;
 
1432
                  for(type=0; type<3; type++){
 
1433
                    int direction = 0;
 
1434
                    switch (type) {
 
1435
                      case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_P))
 
1436
                                continue;
 
1437
                              direction = 0;
 
1438
                              break;
 
1439
                      case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
 
1440
                                continue;
 
1441
                              direction = 0;
 
1442
                              break;
 
1443
                      case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
 
1444
                                continue;
 
1445
                              direction = 1;
 
1446
                              break;
 
1447
                    }
 
1448
                    if(!USES_LIST(pict->mb_type[mb_index], direction))
 
1449
                        continue;
 
1450
 
 
1451
                    if(IS_8X8(pict->mb_type[mb_index])){
 
1452
                      int i;
 
1453
                      for(i=0; i<4; i++){
 
1454
                        int sx= mb_x*16 + 4 + 8*(i&1);
 
1455
                        int sy= mb_y*16 + 4 + 8*(i>>1);
 
1456
                        int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
 
1457
                        int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
 
1458
                        int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
 
1459
                        draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
 
1460
                      }
 
1461
                    }else if(IS_16X8(pict->mb_type[mb_index])){
 
1462
                      int i;
 
1463
                      for(i=0; i<2; i++){
 
1464
                        int sx=mb_x*16 + 8;
 
1465
                        int sy=mb_y*16 + 4 + 8*i;
 
1466
                        int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
 
1467
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
 
1468
                        int my=(pict->motion_val[direction][xy][1]>>shift);
 
1469
 
 
1470
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
 
1471
                            my*=2;
 
1472
 
 
1473
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
 
1474
                      }
 
1475
                    }else if(IS_8X16(pict->mb_type[mb_index])){
 
1476
                      int i;
 
1477
                      for(i=0; i<2; i++){
 
1478
                        int sx=mb_x*16 + 4 + 8*i;
 
1479
                        int sy=mb_y*16 + 8;
 
1480
                        int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
 
1481
                        int mx=(pict->motion_val[direction][xy][0]>>shift);
 
1482
                        int my=(pict->motion_val[direction][xy][1]>>shift);
 
1483
 
 
1484
                        if(IS_INTERLACED(pict->mb_type[mb_index]))
 
1485
                            my*=2;
 
1486
 
 
1487
                        draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
 
1488
                      }
 
1489
                    }else{
 
1490
                      int sx= mb_x*16 + 8;
 
1491
                      int sy= mb_y*16 + 8;
 
1492
                      int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
 
1493
                      int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
 
1494
                      int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
 
1495
                      draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
 
1496
                    }
 
1497
                  }
 
1498
                }
 
1499
                if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
 
1500
                    uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
 
1501
                    int y;
 
1502
                    for(y=0; y<block_height; y++){
 
1503
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
 
1504
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
 
1505
                    }
 
1506
                }
 
1507
                if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
 
1508
                    int mb_type= pict->mb_type[mb_index];
 
1509
                    uint64_t u,v;
 
1510
                    int y;
 
1511
#define COLOR(theta, r)\
 
1512
u= (int)(128 + r*cos(theta*3.141592/180));\
 
1513
v= (int)(128 + r*sin(theta*3.141592/180));
 
1514
 
 
1515
 
 
1516
                    u=v=128;
 
1517
                    if(IS_PCM(mb_type)){
 
1518
                        COLOR(120,48)
 
1519
                    }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
 
1520
                        COLOR(30,48)
 
1521
                    }else if(IS_INTRA4x4(mb_type)){
 
1522
                        COLOR(90,48)
 
1523
                    }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
 
1524
//                        COLOR(120,48)
 
1525
                    }else if(IS_DIRECT(mb_type)){
 
1526
                        COLOR(150,48)
 
1527
                    }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
 
1528
                        COLOR(170,48)
 
1529
                    }else if(IS_GMC(mb_type)){
 
1530
                        COLOR(190,48)
 
1531
                    }else if(IS_SKIP(mb_type)){
 
1532
//                        COLOR(180,48)
 
1533
                    }else if(!USES_LIST(mb_type, 1)){
 
1534
                        COLOR(240,48)
 
1535
                    }else if(!USES_LIST(mb_type, 0)){
 
1536
                        COLOR(0,48)
 
1537
                    }else{
 
1538
                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
 
1539
                        COLOR(300,48)
 
1540
                    }
 
1541
 
 
1542
                    u*= 0x0101010101010101ULL;
 
1543
                    v*= 0x0101010101010101ULL;
 
1544
                    for(y=0; y<block_height; y++){
 
1545
                        *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
 
1546
                        *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
 
1547
                    }
 
1548
 
 
1549
                    //segmentation
 
1550
                    if(IS_8X8(mb_type) || IS_16X8(mb_type)){
 
1551
                        *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
 
1552
                        *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
 
1553
                    }
 
1554
                    if(IS_8X8(mb_type) || IS_8X16(mb_type)){
 
1555
                        for(y=0; y<16; y++)
 
1556
                            pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
 
1557
                    }
 
1558
                    if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
 
1559
                        int dm= 1 << (mv_sample_log2-2);
 
1560
                        for(i=0; i<4; i++){
 
1561
                            int sx= mb_x*16 + 8*(i&1);
 
1562
                            int sy= mb_y*16 + 8*(i>>1);
 
1563
                            int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
 
1564
                            //FIXME bidir
 
1565
                            int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
 
1566
                            if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
 
1567
                                for(y=0; y<8; y++)
 
1568
                                    pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
 
1569
                            if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
 
1570
                                *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
 
1571
                        }
 
1572
                    }
 
1573
 
 
1574
                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
 
1575
                        // hmm
 
1576
                    }
 
1577
                }
 
1578
                s->mbskip_table[mb_index]=0;
 
1579
            }
 
1580
        }
 
1581
    }
 
1582
}
 
1583
 
 
1584
static inline int hpel_motion_lowres(MpegEncContext *s,
 
1585
                                  uint8_t *dest, uint8_t *src,
 
1586
                                  int field_based, int field_select,
 
1587
                                  int src_x, int src_y,
 
1588
                                  int width, int height, int stride,
 
1589
                                  int h_edge_pos, int v_edge_pos,
 
1590
                                  int w, int h, h264_chroma_mc_func *pix_op,
 
1591
                                  int motion_x, int motion_y)
 
1592
{
 
1593
    const int lowres= s->avctx->lowres;
 
1594
    const int op_index= FFMIN(lowres, 2);
 
1595
    const int s_mask= (2<<lowres)-1;
 
1596
    int emu=0;
 
1597
    int sx, sy;
 
1598
 
 
1599
    if(s->quarter_sample){
 
1600
        motion_x/=2;
 
1601
        motion_y/=2;
 
1602
    }
 
1603
 
 
1604
    sx= motion_x & s_mask;
 
1605
    sy= motion_y & s_mask;
 
1606
    src_x += motion_x >> (lowres+1);
 
1607
    src_y += motion_y >> (lowres+1);
 
1608
 
 
1609
    src += src_y * stride + src_x;
 
1610
 
 
1611
    if(   (unsigned)src_x > h_edge_pos                 - (!!sx) - w
 
1612
       || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
 
1613
        s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
 
1614
                            src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
 
1615
        src= s->edge_emu_buffer;
 
1616
        emu=1;
 
1617
    }
 
1618
 
 
1619
    sx= (sx << 2) >> lowres;
 
1620
    sy= (sy << 2) >> lowres;
 
1621
    if(field_select)
 
1622
        src += s->linesize;
 
1623
    pix_op[op_index](dest, src, stride, h, sx, sy);
 
1624
    return emu;
 
1625
}
 
1626
 
 
1627
/* apply one mpeg motion vector to the three components */
 
1628
static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
 
1629
                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
 
1630
                               int field_based, int bottom_field, int field_select,
 
1631
                               uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
 
1632
                               int motion_x, int motion_y, int h, int mb_y)
 
1633
{
 
1634
    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
 
1635
    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
 
1636
    const int lowres= s->avctx->lowres;
 
1637
    const int op_index= FFMIN(lowres, 2);
 
1638
    const int block_s= 8>>lowres;
 
1639
    const int s_mask= (2<<lowres)-1;
 
1640
    const int h_edge_pos = s->h_edge_pos >> lowres;
 
1641
    const int v_edge_pos = s->v_edge_pos >> lowres;
 
1642
    linesize   = s->current_picture.linesize[0] << field_based;
 
1643
    uvlinesize = s->current_picture.linesize[1] << field_based;
 
1644
 
 
1645
    if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
 
1646
        motion_x/=2;
 
1647
        motion_y/=2;
 
1648
    }
 
1649
 
 
1650
    if(field_based){
 
1651
        motion_y += (bottom_field - field_select)*((1<<lowres)-1);
 
1652
    }
 
1653
 
 
1654
    sx= motion_x & s_mask;
 
1655
    sy= motion_y & s_mask;
 
1656
    src_x = s->mb_x*2*block_s               + (motion_x >> (lowres+1));
 
1657
    src_y =(   mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
 
1658
 
 
1659
    if (s->out_format == FMT_H263) {
 
1660
        uvsx = ((motion_x>>1) & s_mask) | (sx&1);
 
1661
        uvsy = ((motion_y>>1) & s_mask) | (sy&1);
 
1662
        uvsrc_x = src_x>>1;
 
1663
        uvsrc_y = src_y>>1;
 
1664
    }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
 
1665
        mx = motion_x / 4;
 
1666
        my = motion_y / 4;
 
1667
        uvsx = (2*mx) & s_mask;
 
1668
        uvsy = (2*my) & s_mask;
 
1669
        uvsrc_x = s->mb_x*block_s               + (mx >> lowres);
 
1670
        uvsrc_y =    mb_y*block_s               + (my >> lowres);
 
1671
    } else {
 
1672
        mx = motion_x / 2;
 
1673
        my = motion_y / 2;
 
1674
        uvsx = mx & s_mask;
 
1675
        uvsy = my & s_mask;
 
1676
        uvsrc_x = s->mb_x*block_s               + (mx >> (lowres+1));
 
1677
        uvsrc_y =(   mb_y*block_s>>field_based) + (my >> (lowres+1));
 
1678
    }
 
1679
 
 
1680
    ptr_y  = ref_picture[0] + src_y * linesize + src_x;
 
1681
    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
 
1682
    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
 
1683
 
 
1684
    if(   (unsigned)src_x > h_edge_pos                 - (!!sx) - 2*block_s
 
1685
       || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
 
1686
            s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
 
1687
                             src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
 
1688
            ptr_y = s->edge_emu_buffer;
 
1689
            if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
 
1690
                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
 
1691
                s->dsp.emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based,
 
1692
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
 
1693
                s->dsp.emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
 
1694
                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
 
1695
                ptr_cb= uvbuf;
 
1696
                ptr_cr= uvbuf+16;
 
1697
            }
 
1698
    }
 
1699
 
 
1700
    if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
 
1701
        dest_y += s->linesize;
 
1702
        dest_cb+= s->uvlinesize;
 
1703
        dest_cr+= s->uvlinesize;
 
1704
    }
 
1705
 
 
1706
    if(field_select){
 
1707
        ptr_y += s->linesize;
 
1708
        ptr_cb+= s->uvlinesize;
 
1709
        ptr_cr+= s->uvlinesize;
 
1710
    }
 
1711
 
 
1712
    sx= (sx << 2) >> lowres;
 
1713
    sy= (sy << 2) >> lowres;
 
1714
    pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
 
1715
 
 
1716
    if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
 
1717
        uvsx= (uvsx << 2) >> lowres;
 
1718
        uvsy= (uvsy << 2) >> lowres;
 
1719
        pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
 
1720
        pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
 
1721
    }
 
1722
    //FIXME h261 lowres loop filter
 
1723
}
 
1724
 
 
1725
static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
 
1726
                                     uint8_t *dest_cb, uint8_t *dest_cr,
 
1727
                                     uint8_t **ref_picture,
 
1728
                                     h264_chroma_mc_func *pix_op,
 
1729
                                     int mx, int my){
 
1730
    const int lowres= s->avctx->lowres;
 
1731
    const int op_index= FFMIN(lowres, 2);
 
1732
    const int block_s= 8>>lowres;
 
1733
    const int s_mask= (2<<lowres)-1;
 
1734
    const int h_edge_pos = s->h_edge_pos >> (lowres+1);
 
1735
    const int v_edge_pos = s->v_edge_pos >> (lowres+1);
 
1736
    int emu=0, src_x, src_y, offset, sx, sy;
 
1737
    uint8_t *ptr;
 
1738
 
 
1739
    if(s->quarter_sample){
 
1740
        mx/=2;
 
1741
        my/=2;
 
1742
    }
 
1743
 
 
1744
    /* In case of 8X8, we construct a single chroma motion vector
 
1745
       with a special rounding */
 
1746
    mx= ff_h263_round_chroma(mx);
 
1747
    my= ff_h263_round_chroma(my);
 
1748
 
 
1749
    sx= mx & s_mask;
 
1750
    sy= my & s_mask;
 
1751
    src_x = s->mb_x*block_s + (mx >> (lowres+1));
 
1752
    src_y = s->mb_y*block_s + (my >> (lowres+1));
 
1753
 
 
1754
    offset = src_y * s->uvlinesize + src_x;
 
1755
    ptr = ref_picture[1] + offset;
 
1756
    if(s->flags&CODEC_FLAG_EMU_EDGE){
 
1757
        if(   (unsigned)src_x > h_edge_pos - (!!sx) - block_s
 
1758
           || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
 
1759
            s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
 
1760
            ptr= s->edge_emu_buffer;
 
1761
            emu=1;
 
1762
        }
 
1763
    }
 
1764
    sx= (sx << 2) >> lowres;
 
1765
    sy= (sy << 2) >> lowres;
 
1766
    pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
 
1767
 
 
1768
    ptr = ref_picture[2] + offset;
 
1769
    if(emu){
 
1770
        s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
 
1771
        ptr= s->edge_emu_buffer;
 
1772
    }
 
1773
    pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
 
1774
}
 
1775
 
 
1776
/**
 
1777
 * motion compensation of a single macroblock
 
1778
 * @param s context
 
1779
 * @param dest_y luma destination pointer
 
1780
 * @param dest_cb chroma cb/u destination pointer
 
1781
 * @param dest_cr chroma cr/v destination pointer
 
1782
 * @param dir direction (0->forward, 1->backward)
 
1783
 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
 
1784
 * @param pix_op halfpel motion compensation function (average or put normally)
 
1785
 * the motion vectors are taken from s->mv and the MV type from s->mv_type
 
1786
 */
 
1787
static inline void MPV_motion_lowres(MpegEncContext *s,
 
1788
                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
 
1789
                              int dir, uint8_t **ref_picture,
 
1790
                              h264_chroma_mc_func *pix_op)
 
1791
{
 
1792
    int mx, my;
 
1793
    int mb_x, mb_y, i;
 
1794
    const int lowres= s->avctx->lowres;
 
1795
    const int block_s= 8>>lowres;
 
1796
 
 
1797
    mb_x = s->mb_x;
 
1798
    mb_y = s->mb_y;
 
1799
 
 
1800
    switch(s->mv_type) {
 
1801
    case MV_TYPE_16X16:
 
1802
        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1803
                    0, 0, 0,
 
1804
                    ref_picture, pix_op,
 
1805
                    s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
 
1806
        break;
 
1807
    case MV_TYPE_8X8:
 
1808
        mx = 0;
 
1809
        my = 0;
 
1810
            for(i=0;i<4;i++) {
 
1811
                hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
 
1812
                            ref_picture[0], 0, 0,
 
1813
                            (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
 
1814
                            s->width, s->height, s->linesize,
 
1815
                            s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
 
1816
                            block_s, block_s, pix_op,
 
1817
                            s->mv[dir][i][0], s->mv[dir][i][1]);
 
1818
 
 
1819
                mx += s->mv[dir][i][0];
 
1820
                my += s->mv[dir][i][1];
 
1821
            }
 
1822
 
 
1823
        if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
 
1824
            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
 
1825
        break;
 
1826
    case MV_TYPE_FIELD:
 
1827
        if (s->picture_structure == PICT_FRAME) {
 
1828
            /* top field */
 
1829
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1830
                        1, 0, s->field_select[dir][0],
 
1831
                        ref_picture, pix_op,
 
1832
                        s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
 
1833
            /* bottom field */
 
1834
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1835
                        1, 1, s->field_select[dir][1],
 
1836
                        ref_picture, pix_op,
 
1837
                        s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
 
1838
        } else {
 
1839
            if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){
 
1840
                ref_picture= s->current_picture_ptr->data;
 
1841
            }
 
1842
 
 
1843
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1844
                        0, 0, s->field_select[dir][0],
 
1845
                        ref_picture, pix_op,
 
1846
                        s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
 
1847
        }
 
1848
        break;
 
1849
    case MV_TYPE_16X8:
 
1850
        for(i=0; i<2; i++){
 
1851
            uint8_t ** ref2picture;
 
1852
 
 
1853
            if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == AV_PICTURE_TYPE_B || s->first_field){
 
1854
                ref2picture= ref_picture;
 
1855
            }else{
 
1856
                ref2picture= s->current_picture_ptr->data;
 
1857
            }
 
1858
 
 
1859
            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1860
                        0, 0, s->field_select[dir][i],
 
1861
                        ref2picture, pix_op,
 
1862
                        s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
 
1863
 
 
1864
            dest_y += 2*block_s*s->linesize;
 
1865
            dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
 
1866
            dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
 
1867
        }
 
1868
        break;
 
1869
    case MV_TYPE_DMV:
 
1870
        if(s->picture_structure == PICT_FRAME){
 
1871
            for(i=0; i<2; i++){
 
1872
                int j;
 
1873
                for(j=0; j<2; j++){
 
1874
                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1875
                                1, j, j^i,
 
1876
                                ref_picture, pix_op,
 
1877
                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
 
1878
                }
 
1879
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
 
1880
            }
 
1881
        }else{
 
1882
            for(i=0; i<2; i++){
 
1883
                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 
1884
                            0, 0, s->picture_structure != i+1,
 
1885
                            ref_picture, pix_op,
 
1886
                            s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
 
1887
 
 
1888
                // after put we make avg of the same block
 
1889
                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
 
1890
 
 
1891
                //opposite parity is always in the same frame if this is second field
 
1892
                if(!s->first_field){
 
1893
                    ref_picture = s->current_picture_ptr->data;
 
1894
                }
 
1895
            }
 
1896
        }
 
1897
    break;
 
1898
    default: assert(0);
 
1899
    }
 
1900
}
 
1901
 
 
1902
/**
 
1903
 * find the lowest MB row referenced in the MVs
 
1904
 */
 
1905
int MPV_lowest_referenced_row(MpegEncContext *s, int dir)
 
1906
{
 
1907
    int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
 
1908
    int my, off, i, mvs;
 
1909
 
 
1910
    if (s->picture_structure != PICT_FRAME) goto unhandled;
 
1911
 
 
1912
    switch (s->mv_type) {
 
1913
        case MV_TYPE_16X16:
 
1914
            mvs = 1;
 
1915
            break;
 
1916
        case MV_TYPE_16X8:
 
1917
            mvs = 2;
 
1918
            break;
 
1919
        case MV_TYPE_8X8:
 
1920
            mvs = 4;
 
1921
            break;
 
1922
        default:
 
1923
            goto unhandled;
 
1924
    }
 
1925
 
 
1926
    for (i = 0; i < mvs; i++) {
 
1927
        my = s->mv[dir][i][1]<<qpel_shift;
 
1928
        my_max = FFMAX(my_max, my);
 
1929
        my_min = FFMIN(my_min, my);
 
1930
    }
 
1931
 
 
1932
    off = (FFMAX(-my_min, my_max) + 63) >> 6;
 
1933
 
 
1934
    return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
 
1935
unhandled:
 
1936
    return s->mb_height-1;
 
1937
}
 
1938
 
 
1939
/* put block[] to dest[] */
 
1940
static inline void put_dct(MpegEncContext *s,
 
1941
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
 
1942
{
 
1943
    s->dct_unquantize_intra(s, block, i, qscale);
 
1944
    s->dsp.idct_put (dest, line_size, block);
 
1945
}
 
1946
 
 
1947
/* add block[] to dest[] */
 
1948
static inline void add_dct(MpegEncContext *s,
 
1949
                           DCTELEM *block, int i, uint8_t *dest, int line_size)
 
1950
{
 
1951
    if (s->block_last_index[i] >= 0) {
 
1952
        s->dsp.idct_add (dest, line_size, block);
 
1953
    }
 
1954
}
 
1955
 
 
1956
static inline void add_dequant_dct(MpegEncContext *s,
 
1957
                           DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
 
1958
{
 
1959
    if (s->block_last_index[i] >= 0) {
 
1960
        s->dct_unquantize_inter(s, block, i, qscale);
 
1961
 
 
1962
        s->dsp.idct_add (dest, line_size, block);
 
1963
    }
 
1964
}
 
1965
 
 
1966
/**
 
1967
 * cleans dc, ac, coded_block for the current non intra MB
 
1968
 */
 
1969
void ff_clean_intra_table_entries(MpegEncContext *s)
 
1970
{
 
1971
    int wrap = s->b8_stride;
 
1972
    int xy = s->block_index[0];
 
1973
 
 
1974
    s->dc_val[0][xy           ] =
 
1975
    s->dc_val[0][xy + 1       ] =
 
1976
    s->dc_val[0][xy     + wrap] =
 
1977
    s->dc_val[0][xy + 1 + wrap] = 1024;
 
1978
    /* ac pred */
 
1979
    memset(s->ac_val[0][xy       ], 0, 32 * sizeof(int16_t));
 
1980
    memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
 
1981
    if (s->msmpeg4_version>=3) {
 
1982
        s->coded_block[xy           ] =
 
1983
        s->coded_block[xy + 1       ] =
 
1984
        s->coded_block[xy     + wrap] =
 
1985
        s->coded_block[xy + 1 + wrap] = 0;
 
1986
    }
 
1987
    /* chroma */
 
1988
    wrap = s->mb_stride;
 
1989
    xy = s->mb_x + s->mb_y * wrap;
 
1990
    s->dc_val[1][xy] =
 
1991
    s->dc_val[2][xy] = 1024;
 
1992
    /* ac pred */
 
1993
    memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
 
1994
    memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
 
1995
 
 
1996
    s->mbintra_table[xy]= 0;
 
1997
}
 
1998
 
 
1999
/* generic function called after a macroblock has been parsed by the
 
2000
   decoder or after it has been encoded by the encoder.
 
2001
 
 
2002
   Important variables used:
 
2003
   s->mb_intra : true if intra macroblock
 
2004
   s->mv_dir   : motion vector direction
 
2005
   s->mv_type  : motion vector type
 
2006
   s->mv       : motion vector
 
2007
   s->interlaced_dct : true if interlaced dct used (mpeg2)
 
2008
 */
 
2009
static av_always_inline
 
2010
void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
 
2011
                            int lowres_flag, int is_mpeg12)
 
2012
{
 
2013
    const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
 
2014
    if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
 
2015
        ff_xvmc_decode_mb(s);//xvmc uses pblocks
 
2016
        return;
 
2017
    }
 
2018
 
 
2019
    if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
 
2020
       /* save DCT coefficients */
 
2021
       int i,j;
 
2022
       DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
 
2023
       av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
 
2024
       for(i=0; i<6; i++){
 
2025
           for(j=0; j<64; j++){
 
2026
               *dct++ = block[i][s->dsp.idct_permutation[j]];
 
2027
               av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
 
2028
           }
 
2029
           av_log(s->avctx, AV_LOG_DEBUG, "\n");
 
2030
       }
 
2031
    }
 
2032
 
 
2033
    s->current_picture.qscale_table[mb_xy]= s->qscale;
 
2034
 
 
2035
    /* update DC predictors for P macroblocks */
 
2036
    if (!s->mb_intra) {
 
2037
        if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
 
2038
            if(s->mbintra_table[mb_xy])
 
2039
                ff_clean_intra_table_entries(s);
 
2040
        } else {
 
2041
            s->last_dc[0] =
 
2042
            s->last_dc[1] =
 
2043
            s->last_dc[2] = 128 << s->intra_dc_precision;
 
2044
        }
 
2045
    }
 
2046
    else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
 
2047
        s->mbintra_table[mb_xy]=1;
 
2048
 
 
2049
    if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==AV_PICTURE_TYPE_B) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
 
2050
        uint8_t *dest_y, *dest_cb, *dest_cr;
 
2051
        int dct_linesize, dct_offset;
 
2052
        op_pixels_func (*op_pix)[4];
 
2053
        qpel_mc_func (*op_qpix)[16];
 
2054
        const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
 
2055
        const int uvlinesize= s->current_picture.linesize[1];
 
2056
        const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
 
2057
        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
 
2058
 
 
2059
        /* avoid copy if macroblock skipped in last frame too */
 
2060
        /* skip only during decoding as we might trash the buffers during encoding a bit */
 
2061
        if(!s->encoding){
 
2062
            uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
 
2063
            const int age= s->current_picture.age;
 
2064
 
 
2065
            assert(age);
 
2066
 
 
2067
            if (s->mb_skipped) {
 
2068
                s->mb_skipped= 0;
 
2069
                assert(s->pict_type!=AV_PICTURE_TYPE_I);
 
2070
 
 
2071
                (*mbskip_ptr) ++; /* indicate that this time we skipped it */
 
2072
                if(*mbskip_ptr >99) *mbskip_ptr= 99;
 
2073
 
 
2074
                /* if previous was skipped too, then nothing to do !  */
 
2075
                if (*mbskip_ptr >= age && s->current_picture.reference){
 
2076
                    return;
 
2077
                }
 
2078
            } else if(!s->current_picture.reference){
 
2079
                (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
 
2080
                if(*mbskip_ptr >99) *mbskip_ptr= 99;
 
2081
            } else{
 
2082
                *mbskip_ptr = 0; /* not skipped */
 
2083
            }
 
2084
        }
 
2085
 
 
2086
        dct_linesize = linesize << s->interlaced_dct;
 
2087
        dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
 
2088
 
 
2089
        if(readable){
 
2090
            dest_y=  s->dest[0];
 
2091
            dest_cb= s->dest[1];
 
2092
            dest_cr= s->dest[2];
 
2093
        }else{
 
2094
            dest_y = s->b_scratchpad;
 
2095
            dest_cb= s->b_scratchpad+16*linesize;
 
2096
            dest_cr= s->b_scratchpad+32*linesize;
 
2097
        }
 
2098
 
 
2099
        if (!s->mb_intra) {
 
2100
            /* motion handling */
 
2101
            /* decoding or more than one mb_type (MC was already done otherwise) */
 
2102
            if(!s->encoding){
 
2103
 
 
2104
                if(HAVE_PTHREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
 
2105
                    if (s->mv_dir & MV_DIR_FORWARD) {
 
2106
                        ff_thread_await_progress((AVFrame*)s->last_picture_ptr, MPV_lowest_referenced_row(s, 0), 0);
 
2107
                    }
 
2108
                    if (s->mv_dir & MV_DIR_BACKWARD) {
 
2109
                        ff_thread_await_progress((AVFrame*)s->next_picture_ptr, MPV_lowest_referenced_row(s, 1), 0);
 
2110
                    }
 
2111
                }
 
2112
 
 
2113
                if(lowres_flag){
 
2114
                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
 
2115
 
 
2116
                    if (s->mv_dir & MV_DIR_FORWARD) {
 
2117
                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
 
2118
                        op_pix = s->dsp.avg_h264_chroma_pixels_tab;
 
2119
                    }
 
2120
                    if (s->mv_dir & MV_DIR_BACKWARD) {
 
2121
                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
 
2122
                    }
 
2123
                }else{
 
2124
                    op_qpix= s->me.qpel_put;
 
2125
                    if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
 
2126
                        op_pix = s->dsp.put_pixels_tab;
 
2127
                    }else{
 
2128
                        op_pix = s->dsp.put_no_rnd_pixels_tab;
 
2129
                    }
 
2130
                    if (s->mv_dir & MV_DIR_FORWARD) {
 
2131
                        MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
 
2132
                        op_pix = s->dsp.avg_pixels_tab;
 
2133
                        op_qpix= s->me.qpel_avg;
 
2134
                    }
 
2135
                    if (s->mv_dir & MV_DIR_BACKWARD) {
 
2136
                        MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
 
2137
                    }
 
2138
                }
 
2139
            }
 
2140
 
 
2141
            /* skip dequant / idct if we are really late ;) */
 
2142
            if(s->avctx->skip_idct){
 
2143
                if(  (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
 
2144
                   ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
 
2145
                   || s->avctx->skip_idct >= AVDISCARD_ALL)
 
2146
                    goto skip_idct;
 
2147
            }
 
2148
 
 
2149
            /* add dct residue */
 
2150
            if(s->encoding || !(   s->msmpeg4_version || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
 
2151
                                || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
 
2152
                add_dequant_dct(s, block[0], 0, dest_y                          , dct_linesize, s->qscale);
 
2153
                add_dequant_dct(s, block[1], 1, dest_y              + block_size, dct_linesize, s->qscale);
 
2154
                add_dequant_dct(s, block[2], 2, dest_y + dct_offset             , dct_linesize, s->qscale);
 
2155
                add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
 
2156
 
 
2157
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
 
2158
                    if (s->chroma_y_shift){
 
2159
                        add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
 
2160
                        add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
 
2161
                    }else{
 
2162
                        dct_linesize >>= 1;
 
2163
                        dct_offset >>=1;
 
2164
                        add_dequant_dct(s, block[4], 4, dest_cb,              dct_linesize, s->chroma_qscale);
 
2165
                        add_dequant_dct(s, block[5], 5, dest_cr,              dct_linesize, s->chroma_qscale);
 
2166
                        add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
 
2167
                        add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
 
2168
                    }
 
2169
                }
 
2170
            } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
 
2171
                add_dct(s, block[0], 0, dest_y                          , dct_linesize);
 
2172
                add_dct(s, block[1], 1, dest_y              + block_size, dct_linesize);
 
2173
                add_dct(s, block[2], 2, dest_y + dct_offset             , dct_linesize);
 
2174
                add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
 
2175
 
 
2176
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
 
2177
                    if(s->chroma_y_shift){//Chroma420
 
2178
                        add_dct(s, block[4], 4, dest_cb, uvlinesize);
 
2179
                        add_dct(s, block[5], 5, dest_cr, uvlinesize);
 
2180
                    }else{
 
2181
                        //chroma422
 
2182
                        dct_linesize = uvlinesize << s->interlaced_dct;
 
2183
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
 
2184
 
 
2185
                        add_dct(s, block[4], 4, dest_cb, dct_linesize);
 
2186
                        add_dct(s, block[5], 5, dest_cr, dct_linesize);
 
2187
                        add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
 
2188
                        add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
 
2189
                        if(!s->chroma_x_shift){//Chroma444
 
2190
                            add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
 
2191
                            add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
 
2192
                            add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
 
2193
                            add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
 
2194
                        }
 
2195
                    }
 
2196
                }//fi gray
 
2197
            }
 
2198
            else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
 
2199
                ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
 
2200
            }
 
2201
        } else {
 
2202
            /* dct only in intra block */
 
2203
            if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
 
2204
                put_dct(s, block[0], 0, dest_y                          , dct_linesize, s->qscale);
 
2205
                put_dct(s, block[1], 1, dest_y              + block_size, dct_linesize, s->qscale);
 
2206
                put_dct(s, block[2], 2, dest_y + dct_offset             , dct_linesize, s->qscale);
 
2207
                put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
 
2208
 
 
2209
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
 
2210
                    if(s->chroma_y_shift){
 
2211
                        put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
 
2212
                        put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
 
2213
                    }else{
 
2214
                        dct_offset >>=1;
 
2215
                        dct_linesize >>=1;
 
2216
                        put_dct(s, block[4], 4, dest_cb,              dct_linesize, s->chroma_qscale);
 
2217
                        put_dct(s, block[5], 5, dest_cr,              dct_linesize, s->chroma_qscale);
 
2218
                        put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
 
2219
                        put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
 
2220
                    }
 
2221
                }
 
2222
            }else{
 
2223
                s->dsp.idct_put(dest_y                          , dct_linesize, block[0]);
 
2224
                s->dsp.idct_put(dest_y              + block_size, dct_linesize, block[1]);
 
2225
                s->dsp.idct_put(dest_y + dct_offset             , dct_linesize, block[2]);
 
2226
                s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
 
2227
 
 
2228
                if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
 
2229
                    if(s->chroma_y_shift){
 
2230
                        s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
 
2231
                        s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
 
2232
                    }else{
 
2233
 
 
2234
                        dct_linesize = uvlinesize << s->interlaced_dct;
 
2235
                        dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
 
2236
 
 
2237
                        s->dsp.idct_put(dest_cb,              dct_linesize, block[4]);
 
2238
                        s->dsp.idct_put(dest_cr,              dct_linesize, block[5]);
 
2239
                        s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
 
2240
                        s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
 
2241
                        if(!s->chroma_x_shift){//Chroma444
 
2242
                            s->dsp.idct_put(dest_cb + 8,              dct_linesize, block[8]);
 
2243
                            s->dsp.idct_put(dest_cr + 8,              dct_linesize, block[9]);
 
2244
                            s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
 
2245
                            s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
 
2246
                        }
 
2247
                    }
 
2248
                }//gray
 
2249
            }
 
2250
        }
 
2251
skip_idct:
 
2252
        if(!readable){
 
2253
            s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y ,   linesize,16);
 
2254
            s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
 
2255
            s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
 
2256
        }
 
2257
    }
 
2258
}
 
2259
 
 
2260
void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
 
2261
#if !CONFIG_SMALL
 
2262
    if(s->out_format == FMT_MPEG1) {
 
2263
        if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
 
2264
        else                 MPV_decode_mb_internal(s, block, 0, 1);
 
2265
    } else
 
2266
#endif
 
2267
    if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
 
2268
    else                  MPV_decode_mb_internal(s, block, 0, 0);
 
2269
}
 
2270
 
 
2271
/**
 
2272
 *
 
2273
 * @param h is the normal height, this will be reduced automatically if needed for the last row
 
2274
 */
 
2275
void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
 
2276
    const int field_pic= s->picture_structure != PICT_FRAME;
 
2277
    if(field_pic){
 
2278
        h <<= 1;
 
2279
        y <<= 1;
 
2280
    }
 
2281
 
 
2282
    if (!s->avctx->hwaccel
 
2283
       && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
 
2284
       && s->unrestricted_mv
 
2285
       && s->current_picture.reference
 
2286
       && !s->intra_only
 
2287
       && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
 
2288
        int sides = 0, edge_h;
 
2289
        int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
 
2290
        int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
 
2291
        if (y==0) sides |= EDGE_TOP;
 
2292
        if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
 
2293
 
 
2294
        edge_h= FFMIN(h, s->v_edge_pos - y);
 
2295
 
 
2296
        s->dsp.draw_edges(s->current_picture_ptr->data[0] +  y         *s->linesize  , s->linesize,
 
2297
                          s->h_edge_pos        , edge_h        , EDGE_WIDTH        , EDGE_WIDTH        , sides);
 
2298
        s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
 
2299
                          s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
 
2300
        s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
 
2301
                          s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
 
2302
    }
 
2303
 
 
2304
    h= FFMIN(h, s->avctx->height - y);
 
2305
 
 
2306
    if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
 
2307
 
 
2308
    if (s->avctx->draw_horiz_band) {
 
2309
        AVFrame *src;
 
2310
        int offset[4];
 
2311
 
 
2312
        if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
 
2313
            src= (AVFrame*)s->current_picture_ptr;
 
2314
        else if(s->last_picture_ptr)
 
2315
            src= (AVFrame*)s->last_picture_ptr;
 
2316
        else
 
2317
            return;
 
2318
 
 
2319
        if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
 
2320
            offset[0]=
 
2321
            offset[1]=
 
2322
            offset[2]=
 
2323
            offset[3]= 0;
 
2324
        }else{
 
2325
            offset[0]= y * s->linesize;
 
2326
            offset[1]=
 
2327
            offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
 
2328
            offset[3]= 0;
 
2329
        }
 
2330
 
 
2331
        emms_c();
 
2332
 
 
2333
        s->avctx->draw_horiz_band(s->avctx, src, offset,
 
2334
                                  y, s->picture_structure, h);
 
2335
    }
 
2336
}
 
2337
 
 
2338
void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
 
2339
    const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
 
2340
    const int uvlinesize= s->current_picture.linesize[1];
 
2341
    const int mb_size= 4 - s->avctx->lowres;
 
2342
 
 
2343
    s->block_index[0]= s->b8_stride*(s->mb_y*2    ) - 2 + s->mb_x*2;
 
2344
    s->block_index[1]= s->b8_stride*(s->mb_y*2    ) - 1 + s->mb_x*2;
 
2345
    s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
 
2346
    s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
 
2347
    s->block_index[4]= s->mb_stride*(s->mb_y + 1)                + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
 
2348
    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;
 
2349
    //block_index is not used by mpeg2, so it is not affected by chroma_format
 
2350
 
 
2351
    s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
 
2352
    s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
 
2353
    s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
 
2354
 
 
2355
    if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
 
2356
    {
 
2357
        if(s->picture_structure==PICT_FRAME){
 
2358
        s->dest[0] += s->mb_y *   linesize << mb_size;
 
2359
        s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
 
2360
        s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
 
2361
        }else{
 
2362
            s->dest[0] += (s->mb_y>>1) *   linesize << mb_size;
 
2363
            s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
 
2364
            s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
 
2365
            assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
 
2366
        }
 
2367
    }
 
2368
}
 
2369
 
 
2370
void ff_mpeg_flush(AVCodecContext *avctx){
 
2371
    int i;
 
2372
    MpegEncContext *s = avctx->priv_data;
 
2373
 
 
2374
    if(s==NULL || s->picture==NULL)
 
2375
        return;
 
2376
 
 
2377
    for(i=0; i<s->picture_count; i++){
 
2378
       if(s->picture[i].data[0] && (   s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
 
2379
                                    || s->picture[i].type == FF_BUFFER_TYPE_USER))
 
2380
        free_frame_buffer(s, &s->picture[i]);
 
2381
    }
 
2382
    s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
 
2383
 
 
2384
    s->mb_x= s->mb_y= 0;
 
2385
    s->closed_gop= 0;
 
2386
 
 
2387
    s->parse_context.state= -1;
 
2388
    s->parse_context.frame_start_found= 0;
 
2389
    s->parse_context.overread= 0;
 
2390
    s->parse_context.overread_index= 0;
 
2391
    s->parse_context.index= 0;
 
2392
    s->parse_context.last_index= 0;
 
2393
    s->bitstream_buffer_size=0;
 
2394
    s->pp_time=0;
 
2395
}
 
2396
 
 
2397
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
 
2398
                                   DCTELEM *block, int n, int qscale)
 
2399
{
 
2400
    int i, level, nCoeffs;
 
2401
    const uint16_t *quant_matrix;
 
2402
 
 
2403
    nCoeffs= s->block_last_index[n];
 
2404
 
 
2405
    if (n < 4)
 
2406
        block[0] = block[0] * s->y_dc_scale;
 
2407
    else
 
2408
        block[0] = block[0] * s->c_dc_scale;
 
2409
    /* XXX: only mpeg1 */
 
2410
    quant_matrix = s->intra_matrix;
 
2411
    for(i=1;i<=nCoeffs;i++) {
 
2412
        int j= s->intra_scantable.permutated[i];
 
2413
        level = block[j];
 
2414
        if (level) {
 
2415
            if (level < 0) {
 
2416
                level = -level;
 
2417
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
 
2418
                level = (level - 1) | 1;
 
2419
                level = -level;
 
2420
            } else {
 
2421
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
 
2422
                level = (level - 1) | 1;
 
2423
            }
 
2424
            block[j] = level;
 
2425
        }
 
2426
    }
 
2427
}
 
2428
 
 
2429
static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
 
2430
                                   DCTELEM *block, int n, int qscale)
 
2431
{
 
2432
    int i, level, nCoeffs;
 
2433
    const uint16_t *quant_matrix;
 
2434
 
 
2435
    nCoeffs= s->block_last_index[n];
 
2436
 
 
2437
    quant_matrix = s->inter_matrix;
 
2438
    for(i=0; i<=nCoeffs; i++) {
 
2439
        int j= s->intra_scantable.permutated[i];
 
2440
        level = block[j];
 
2441
        if (level) {
 
2442
            if (level < 0) {
 
2443
                level = -level;
 
2444
                level = (((level << 1) + 1) * qscale *
 
2445
                         ((int) (quant_matrix[j]))) >> 4;
 
2446
                level = (level - 1) | 1;
 
2447
                level = -level;
 
2448
            } else {
 
2449
                level = (((level << 1) + 1) * qscale *
 
2450
                         ((int) (quant_matrix[j]))) >> 4;
 
2451
                level = (level - 1) | 1;
 
2452
            }
 
2453
            block[j] = level;
 
2454
        }
 
2455
    }
 
2456
}
 
2457
 
 
2458
static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
 
2459
                                   DCTELEM *block, int n, int qscale)
 
2460
{
 
2461
    int i, level, nCoeffs;
 
2462
    const uint16_t *quant_matrix;
 
2463
 
 
2464
    if(s->alternate_scan) nCoeffs= 63;
 
2465
    else nCoeffs= s->block_last_index[n];
 
2466
 
 
2467
    if (n < 4)
 
2468
        block[0] = block[0] * s->y_dc_scale;
 
2469
    else
 
2470
        block[0] = block[0] * s->c_dc_scale;
 
2471
    quant_matrix = s->intra_matrix;
 
2472
    for(i=1;i<=nCoeffs;i++) {
 
2473
        int j= s->intra_scantable.permutated[i];
 
2474
        level = block[j];
 
2475
        if (level) {
 
2476
            if (level < 0) {
 
2477
                level = -level;
 
2478
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
 
2479
                level = -level;
 
2480
            } else {
 
2481
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
 
2482
            }
 
2483
            block[j] = level;
 
2484
        }
 
2485
    }
 
2486
}
 
2487
 
 
2488
static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
 
2489
                                   DCTELEM *block, int n, int qscale)
 
2490
{
 
2491
    int i, level, nCoeffs;
 
2492
    const uint16_t *quant_matrix;
 
2493
    int sum=-1;
 
2494
 
 
2495
    if(s->alternate_scan) nCoeffs= 63;
 
2496
    else nCoeffs= s->block_last_index[n];
 
2497
 
 
2498
    if (n < 4)
 
2499
        block[0] = block[0] * s->y_dc_scale;
 
2500
    else
 
2501
        block[0] = block[0] * s->c_dc_scale;
 
2502
    quant_matrix = s->intra_matrix;
 
2503
    for(i=1;i<=nCoeffs;i++) {
 
2504
        int j= s->intra_scantable.permutated[i];
 
2505
        level = block[j];
 
2506
        if (level) {
 
2507
            if (level < 0) {
 
2508
                level = -level;
 
2509
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
 
2510
                level = -level;
 
2511
            } else {
 
2512
                level = (int)(level * qscale * quant_matrix[j]) >> 3;
 
2513
            }
 
2514
            block[j] = level;
 
2515
            sum+=level;
 
2516
        }
 
2517
    }
 
2518
    block[63]^=sum&1;
 
2519
}
 
2520
 
 
2521
static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
 
2522
                                   DCTELEM *block, int n, int qscale)
 
2523
{
 
2524
    int i, level, nCoeffs;
 
2525
    const uint16_t *quant_matrix;
 
2526
    int sum=-1;
 
2527
 
 
2528
    if(s->alternate_scan) nCoeffs= 63;
 
2529
    else nCoeffs= s->block_last_index[n];
 
2530
 
 
2531
    quant_matrix = s->inter_matrix;
 
2532
    for(i=0; i<=nCoeffs; i++) {
 
2533
        int j= s->intra_scantable.permutated[i];
 
2534
        level = block[j];
 
2535
        if (level) {
 
2536
            if (level < 0) {
 
2537
                level = -level;
 
2538
                level = (((level << 1) + 1) * qscale *
 
2539
                         ((int) (quant_matrix[j]))) >> 4;
 
2540
                level = -level;
 
2541
            } else {
 
2542
                level = (((level << 1) + 1) * qscale *
 
2543
                         ((int) (quant_matrix[j]))) >> 4;
 
2544
            }
 
2545
            block[j] = level;
 
2546
            sum+=level;
 
2547
        }
 
2548
    }
 
2549
    block[63]^=sum&1;
 
2550
}
 
2551
 
 
2552
static void dct_unquantize_h263_intra_c(MpegEncContext *s,
 
2553
                                  DCTELEM *block, int n, int qscale)
 
2554
{
 
2555
    int i, level, qmul, qadd;
 
2556
    int nCoeffs;
 
2557
 
 
2558
    assert(s->block_last_index[n]>=0);
 
2559
 
 
2560
    qmul = qscale << 1;
 
2561
 
 
2562
    if (!s->h263_aic) {
 
2563
        if (n < 4)
 
2564
            block[0] = block[0] * s->y_dc_scale;
 
2565
        else
 
2566
            block[0] = block[0] * s->c_dc_scale;
 
2567
        qadd = (qscale - 1) | 1;
 
2568
    }else{
 
2569
        qadd = 0;
 
2570
    }
 
2571
    if(s->ac_pred)
 
2572
        nCoeffs=63;
 
2573
    else
 
2574
        nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
 
2575
 
 
2576
    for(i=1; i<=nCoeffs; i++) {
 
2577
        level = block[i];
 
2578
        if (level) {
 
2579
            if (level < 0) {
 
2580
                level = level * qmul - qadd;
 
2581
            } else {
 
2582
                level = level * qmul + qadd;
 
2583
            }
 
2584
            block[i] = level;
 
2585
        }
 
2586
    }
 
2587
}
 
2588
 
 
2589
static void dct_unquantize_h263_inter_c(MpegEncContext *s,
 
2590
                                  DCTELEM *block, int n, int qscale)
 
2591
{
 
2592
    int i, level, qmul, qadd;
 
2593
    int nCoeffs;
 
2594
 
 
2595
    assert(s->block_last_index[n]>=0);
 
2596
 
 
2597
    qadd = (qscale - 1) | 1;
 
2598
    qmul = qscale << 1;
 
2599
 
 
2600
    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
 
2601
 
 
2602
    for(i=0; i<=nCoeffs; i++) {
 
2603
        level = block[i];
 
2604
        if (level) {
 
2605
            if (level < 0) {
 
2606
                level = level * qmul - qadd;
 
2607
            } else {
 
2608
                level = level * qmul + qadd;
 
2609
            }
 
2610
            block[i] = level;
 
2611
        }
 
2612
    }
 
2613
}
 
2614
 
 
2615
/**
 
2616
 * set qscale and update qscale dependent variables.
 
2617
 */
 
2618
void ff_set_qscale(MpegEncContext * s, int qscale)
 
2619
{
 
2620
    if (qscale < 1)
 
2621
        qscale = 1;
 
2622
    else if (qscale > 31)
 
2623
        qscale = 31;
 
2624
 
 
2625
    s->qscale = qscale;
 
2626
    s->chroma_qscale= s->chroma_qscale_table[qscale];
 
2627
 
 
2628
    s->y_dc_scale= s->y_dc_scale_table[ qscale ];
 
2629
    s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
 
2630
}
 
2631
 
 
2632
void MPV_report_decode_progress(MpegEncContext *s)
 
2633
{
 
2634
    if (s->pict_type != FF_B_TYPE && !s->partitioned_frame && !s->error_occurred)
 
2635
        ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0);
 
2636
}