~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-10-01 00:22:07 UTC
  • mfrom: (1.3.8 sid)
  • Revision ID: package-import@ubuntu.com-20111001002207-tnxz39i0rwr5ufy9
Tags: 4:0.7.2-1ubuntu1
* Merge from debian, remaining changes:
  - don't build against libfaad, libdirac, librtmp and libopenjpeg,
    lame, xvid, x264  (all in universe)
  - not installing into multiarch directories
* This new upstream release has basically merged in all 70 patches that
  are present in 4:0.7.1-7ubuntu2, plus some additional, similarily
  focused ones.

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
 
}