~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/mpegvideo.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2012-01-12 22:23:28 UTC
  • mfrom: (0.4.7 sid)
  • mto: This revision was merged to the branch mainline in revision 76.
  • Revision ID: package-import@ubuntu.com-20120112222328-8jqdyodym3p84ygu
Tags: 2:1.0~rc4.dfsg1+svn34540-1
* New upstream snapshot
* upload to unstable

Show diffs side-by-side

added added

removed removed

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