Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * VC-1 and WMV3 decoder
3
 * Copyright (c) 2011 Mashiat Sarker Shakkhar
4
 * Copyright (c) 2006-2007 Konstantin Shishkov
5
 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6
 *
7
 * This file is part of FFmpeg.
8
 *
9
 * FFmpeg is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public
11
 * License as published by the Free Software Foundation; either
12
 * version 2.1 of the License, or (at your option) any later version.
13
 *
14
 * FFmpeg is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public
20
 * License along with FFmpeg; if not, write to the Free Software
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
 */
23
 
24
/**
25
 * @file
26
 * VC-1 and WMV3 decoder
27
 */
28
 
29
#include "internal.h"
30
#include "avcodec.h"
31
#include "error_resilience.h"
32
#include "mpegvideo.h"
33
#include "h263.h"
34
#include "h264chroma.h"
35
#include "vc1.h"
36
#include "vc1data.h"
37
#include "vc1acdata.h"
38
#include "msmpeg4data.h"
39
#include "unary.h"
40
#include "mathops.h"
41
#include "vdpau_internal.h"
42
#include "libavutil/avassert.h"
43
 
44
#undef NDEBUG
45
#include 
46
 
47
#define MB_INTRA_VLC_BITS 9
48
#define DC_VLC_BITS 9
49
 
50
 
51
// offset tables for interlaced picture MVDATA decoding
52
static const int offset_table1[9] = {  0,  1,  2,  4,  8, 16, 32,  64, 128 };
53
static const int offset_table2[9] = {  0,  1,  3,  7, 15, 31, 63, 127, 255 };
54
 
55
/***********************************************************************/
56
/**
57
 * @name VC-1 Bitplane decoding
58
 * @see 8.7, p56
59
 * @{
60
 */
61
 
62
/**
63
 * Imode types
64
 * @{
65
 */
66
enum Imode {
67
    IMODE_RAW,
68
    IMODE_NORM2,
69
    IMODE_DIFF2,
70
    IMODE_NORM6,
71
    IMODE_DIFF6,
72
    IMODE_ROWSKIP,
73
    IMODE_COLSKIP
74
};
75
/** @} */ //imode defines
76
 
77
static void init_block_index(VC1Context *v)
78
{
79
    MpegEncContext *s = &v->s;
80
    ff_init_block_index(s);
81
    if (v->field_mode && !(v->second_field ^ v->tff)) {
82
        s->dest[0] += s->current_picture_ptr->f.linesize[0];
83
        s->dest[1] += s->current_picture_ptr->f.linesize[1];
84
        s->dest[2] += s->current_picture_ptr->f.linesize[2];
85
    }
86
}
87
 
88
/** @} */ //Bitplane group
89
 
90
static void vc1_put_signed_blocks_clamped(VC1Context *v)
91
{
92
    MpegEncContext *s = &v->s;
93
    int topleft_mb_pos, top_mb_pos;
94
    int stride_y, fieldtx = 0;
95
    int v_dist;
96
 
97
    /* The put pixels loop is always one MB row behind the decoding loop,
98
     * because we can only put pixels when overlap filtering is done, and
99
     * for filtering of the bottom edge of a MB, we need the next MB row
100
     * present as well.
101
     * Within the row, the put pixels loop is also one MB col behind the
102
     * decoding loop. The reason for this is again, because for filtering
103
     * of the right MB edge, we need the next MB present. */
104
    if (!s->first_slice_line) {
105
        if (s->mb_x) {
106
            topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1;
107
            if (v->fcm == ILACE_FRAME)
108
                fieldtx = v->fieldtx_plane[topleft_mb_pos];
109
            stride_y       = s->linesize << fieldtx;
110
            v_dist         = (16 - fieldtx) >> (fieldtx == 0);
111
            s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
112
                                             s->dest[0] - 16 * s->linesize - 16,
113
                                             stride_y);
114
            s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
115
                                             s->dest[0] - 16 * s->linesize - 8,
116
                                             stride_y);
117
            s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
118
                                             s->dest[0] - v_dist * s->linesize - 16,
119
                                             stride_y);
120
            s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
121
                                             s->dest[0] - v_dist * s->linesize - 8,
122
                                             stride_y);
123
            s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
124
                                             s->dest[1] - 8 * s->uvlinesize - 8,
125
                                             s->uvlinesize);
126
            s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
127
                                             s->dest[2] - 8 * s->uvlinesize - 8,
128
                                             s->uvlinesize);
129
        }
130
        if (s->mb_x == s->mb_width - 1) {
131
            top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
132
            if (v->fcm == ILACE_FRAME)
133
                fieldtx = v->fieldtx_plane[top_mb_pos];
134
            stride_y   = s->linesize << fieldtx;
135
            v_dist     = fieldtx ? 15 : 8;
136
            s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
137
                                             s->dest[0] - 16 * s->linesize,
138
                                             stride_y);
139
            s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
140
                                             s->dest[0] - 16 * s->linesize + 8,
141
                                             stride_y);
142
            s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
143
                                             s->dest[0] - v_dist * s->linesize,
144
                                             stride_y);
145
            s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
146
                                             s->dest[0] - v_dist * s->linesize + 8,
147
                                             stride_y);
148
            s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
149
                                             s->dest[1] - 8 * s->uvlinesize,
150
                                             s->uvlinesize);
151
            s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
152
                                             s->dest[2] - 8 * s->uvlinesize,
153
                                             s->uvlinesize);
154
        }
155
    }
156
 
157
#define inc_blk_idx(idx) do { \
158
        idx++; \
159
        if (idx >= v->n_allocated_blks) \
160
            idx = 0; \
161
    } while (0)
162
 
163
    inc_blk_idx(v->topleft_blk_idx);
164
    inc_blk_idx(v->top_blk_idx);
165
    inc_blk_idx(v->left_blk_idx);
166
    inc_blk_idx(v->cur_blk_idx);
167
}
168
 
169
static void vc1_loop_filter_iblk(VC1Context *v, int pq)
170
{
171
    MpegEncContext *s = &v->s;
172
    int j;
173
    if (!s->first_slice_line) {
174
        v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
175
        if (s->mb_x)
176
            v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
177
        v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
178
        for (j = 0; j < 2; j++) {
179
            v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1], s->uvlinesize, pq);
180
            if (s->mb_x)
181
                v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
182
        }
183
    }
184
    v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8 * s->linesize, s->linesize, pq);
185
 
186
    if (s->mb_y == s->end_mb_y - 1) {
187
        if (s->mb_x) {
188
            v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
189
            v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
190
            v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
191
        }
192
        v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
193
    }
194
}
195
 
196
static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
197
{
198
    MpegEncContext *s = &v->s;
199
    int j;
200
 
201
    /* The loopfilter runs 1 row and 1 column behind the overlap filter, which
202
     * means it runs two rows/cols behind the decoding loop. */
203
    if (!s->first_slice_line) {
204
        if (s->mb_x) {
205
            if (s->mb_y >= s->start_mb_y + 2) {
206
                v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
207
 
208
                if (s->mb_x >= 2)
209
                    v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq);
210
                v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq);
211
                for (j = 0; j < 2; j++) {
212
                    v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
213
                    if (s->mb_x >= 2) {
214
                        v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
215
                    }
216
                }
217
            }
218
            v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
219
        }
220
 
221
        if (s->mb_x == s->mb_width - 1) {
222
            if (s->mb_y >= s->start_mb_y + 2) {
223
                v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
224
 
225
                if (s->mb_x)
226
                    v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq);
227
                v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq);
228
                for (j = 0; j < 2; j++) {
229
                    v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
230
                    if (s->mb_x >= 2) {
231
                        v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize, s->uvlinesize, pq);
232
                    }
233
                }
234
            }
235
            v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
236
        }
237
 
238
        if (s->mb_y == s->end_mb_y) {
239
            if (s->mb_x) {
240
                if (s->mb_x >= 2)
241
                    v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
242
                v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq);
243
                if (s->mb_x >= 2) {
244
                    for (j = 0; j < 2; j++) {
245
                        v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
246
                    }
247
                }
248
            }
249
 
250
            if (s->mb_x == s->mb_width - 1) {
251
                if (s->mb_x)
252
                    v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
253
                v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
254
                if (s->mb_x) {
255
                    for (j = 0; j < 2; j++) {
256
                        v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
257
                    }
258
                }
259
            }
260
        }
261
    }
262
}
263
 
264
static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
265
{
266
    MpegEncContext *s = &v->s;
267
    int mb_pos;
268
 
269
    if (v->condover == CONDOVER_NONE)
270
        return;
271
 
272
    mb_pos = s->mb_x + s->mb_y * s->mb_stride;
273
 
274
    /* Within a MB, the horizontal overlap always runs before the vertical.
275
     * To accomplish that, we run the H on left and internal borders of the
276
     * currently decoded MB. Then, we wait for the next overlap iteration
277
     * to do H overlap on the right edge of this MB, before moving over and
278
     * running the V overlap. Therefore, the V overlap makes us trail by one
279
     * MB col and the H overlap filter makes us trail by one MB row. This
280
     * is reflected in the time at which we run the put_pixels loop. */
281
    if (v->condover == CONDOVER_ALL || v->pq >= 9 || v->over_flags_plane[mb_pos]) {
282
        if (s->mb_x && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
283
                        v->over_flags_plane[mb_pos - 1])) {
284
            v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][1],
285
                                      v->block[v->cur_blk_idx][0]);
286
            v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][3],
287
                                      v->block[v->cur_blk_idx][2]);
288
            if (!(s->flags & CODEC_FLAG_GRAY)) {
289
                v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][4],
290
                                          v->block[v->cur_blk_idx][4]);
291
                v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][5],
292
                                          v->block[v->cur_blk_idx][5]);
293
            }
294
        }
295
        v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][0],
296
                                  v->block[v->cur_blk_idx][1]);
297
        v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][2],
298
                                  v->block[v->cur_blk_idx][3]);
299
 
300
        if (s->mb_x == s->mb_width - 1) {
301
            if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
302
                                         v->over_flags_plane[mb_pos - s->mb_stride])) {
303
                v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][2],
304
                                          v->block[v->cur_blk_idx][0]);
305
                v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][3],
306
                                          v->block[v->cur_blk_idx][1]);
307
                if (!(s->flags & CODEC_FLAG_GRAY)) {
308
                    v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][4],
309
                                              v->block[v->cur_blk_idx][4]);
310
                    v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][5],
311
                                              v->block[v->cur_blk_idx][5]);
312
                }
313
            }
314
            v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][0],
315
                                      v->block[v->cur_blk_idx][2]);
316
            v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][1],
317
                                      v->block[v->cur_blk_idx][3]);
318
        }
319
    }
320
    if (s->mb_x && (v->condover == CONDOVER_ALL || v->over_flags_plane[mb_pos - 1])) {
321
        if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
322
                                     v->over_flags_plane[mb_pos - s->mb_stride - 1])) {
323
            v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][2],
324
                                      v->block[v->left_blk_idx][0]);
325
            v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][3],
326
                                      v->block[v->left_blk_idx][1]);
327
            if (!(s->flags & CODEC_FLAG_GRAY)) {
328
                v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][4],
329
                                          v->block[v->left_blk_idx][4]);
330
                v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][5],
331
                                          v->block[v->left_blk_idx][5]);
332
            }
333
        }
334
        v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][0],
335
                                  v->block[v->left_blk_idx][2]);
336
        v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][1],
337
                                  v->block[v->left_blk_idx][3]);
338
    }
339
}
340
 
341
/** Do motion compensation over 1 macroblock
342
 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
343
 */
344
static void vc1_mc_1mv(VC1Context *v, int dir)
345
{
346
    MpegEncContext *s = &v->s;
347
    H264ChromaContext *h264chroma = &v->h264chroma;
348
    uint8_t *srcY, *srcU, *srcV;
349
    int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
350
    int v_edge_pos = s->v_edge_pos >> v->field_mode;
351
    int i;
352
    uint8_t (*luty)[256], (*lutuv)[256];
353
    int use_ic;
354
 
355
    if ((!v->field_mode ||
356
         (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) &&
357
        !v->s.last_picture.f.data[0])
358
        return;
359
 
360
    mx = s->mv[dir][0][0];
361
    my = s->mv[dir][0][1];
362
 
363
    // store motion vectors for further use in B frames
364
    if (s->pict_type == AV_PICTURE_TYPE_P) {
365
        for (i = 0; i < 4; i++) {
366
            s->current_picture.motion_val[1][s->block_index[i] + v->blocks_off][0] = mx;
367
            s->current_picture.motion_val[1][s->block_index[i] + v->blocks_off][1] = my;
368
        }
369
    }
370
 
371
    uvmx = (mx + ((mx & 3) == 3)) >> 1;
372
    uvmy = (my + ((my & 3) == 3)) >> 1;
373
    v->luma_mv[s->mb_x][0] = uvmx;
374
    v->luma_mv[s->mb_x][1] = uvmy;
375
 
376
    if (v->field_mode &&
377
        v->cur_field_type != v->ref_field_type[dir]) {
378
        my   = my   - 2 + 4 * v->cur_field_type;
379
        uvmy = uvmy - 2 + 4 * v->cur_field_type;
380
    }
381
 
382
    // fastuvmc shall be ignored for interlaced frame picture
383
    if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
384
        uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
385
        uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
386
    }
387
    if (!dir) {
388
        if (v->field_mode && (v->cur_field_type != v->ref_field_type[dir]) && v->second_field) {
389
            srcY = s->current_picture.f.data[0];
390
            srcU = s->current_picture.f.data[1];
391
            srcV = s->current_picture.f.data[2];
392
            luty  = v->curr_luty;
393
            lutuv = v->curr_lutuv;
394
            use_ic = v->curr_use_ic;
395
        } else {
396
            srcY = s->last_picture.f.data[0];
397
            srcU = s->last_picture.f.data[1];
398
            srcV = s->last_picture.f.data[2];
399
            luty  = v->last_luty;
400
            lutuv = v->last_lutuv;
401
            use_ic = v->last_use_ic;
402
        }
403
    } else {
404
        srcY = s->next_picture.f.data[0];
405
        srcU = s->next_picture.f.data[1];
406
        srcV = s->next_picture.f.data[2];
407
        luty  = v->next_luty;
408
        lutuv = v->next_lutuv;
409
        use_ic = v->next_use_ic;
410
    }
411
 
412
    if (!srcY || !srcU) {
413
        av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n");
414
        return;
415
    }
416
 
417
    src_x   = s->mb_x * 16 + (mx   >> 2);
418
    src_y   = s->mb_y * 16 + (my   >> 2);
419
    uvsrc_x = s->mb_x *  8 + (uvmx >> 2);
420
    uvsrc_y = s->mb_y *  8 + (uvmy >> 2);
421
 
422
    if (v->profile != PROFILE_ADVANCED) {
423
        src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
424
        src_y   = av_clip(  src_y, -16, s->mb_height * 16);
425
        uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
426
        uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
427
    } else {
428
        src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
429
        src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
430
        uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
431
        uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
432
    }
433
 
434
    srcY += src_y   * s->linesize   + src_x;
435
    srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
436
    srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
437
 
438
    if (v->field_mode && v->ref_field_type[dir]) {
439
        srcY += s->current_picture_ptr->f.linesize[0];
440
        srcU += s->current_picture_ptr->f.linesize[1];
441
        srcV += s->current_picture_ptr->f.linesize[2];
442
    }
443
 
444
    /* for grayscale we should not try to read from unknown area */
445
    if (s->flags & CODEC_FLAG_GRAY) {
446
        srcU = s->edge_emu_buffer + 18 * s->linesize;
447
        srcV = s->edge_emu_buffer + 18 * s->linesize;
448
    }
449
 
450
    if (v->rangeredfrm || use_ic
451
        || s->h_edge_pos < 22 || v_edge_pos < 22
452
        || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3
453
        || (unsigned)(src_y - 1)        > v_edge_pos    - (my&3) - 16 - 3) {
454
        uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
455
 
456
        srcY -= s->mspel * (1 + s->linesize);
457
        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize,
458
                                 srcY, s->linesize,
459
                                 17 + s->mspel * 2, 17 + s->mspel * 2,
460
                                 src_x - s->mspel, src_y - s->mspel,
461
                                 s->h_edge_pos, v_edge_pos);
462
        srcY = s->edge_emu_buffer;
463
        s->vdsp.emulated_edge_mc(uvbuf, s->uvlinesize, srcU, s->uvlinesize,
464
                                 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
465
                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
466
        s->vdsp.emulated_edge_mc(uvbuf + 16, s->uvlinesize, srcV, s->uvlinesize,
467
                                 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
468
                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
469
        srcU = uvbuf;
470
        srcV = uvbuf + 16;
471
        /* if we deal with range reduction we need to scale source blocks */
472
        if (v->rangeredfrm) {
473
            int i, j;
474
            uint8_t *src, *src2;
475
 
476
            src = srcY;
477
            for (j = 0; j < 17 + s->mspel * 2; j++) {
478
                for (i = 0; i < 17 + s->mspel * 2; i++)
479
                    src[i] = ((src[i] - 128) >> 1) + 128;
480
                src += s->linesize;
481
            }
482
            src  = srcU;
483
            src2 = srcV;
484
            for (j = 0; j < 9; j++) {
485
                for (i = 0; i < 9; i++) {
486
                    src[i]  = ((src[i]  - 128) >> 1) + 128;
487
                    src2[i] = ((src2[i] - 128) >> 1) + 128;
488
                }
489
                src  += s->uvlinesize;
490
                src2 += s->uvlinesize;
491
            }
492
        }
493
        /* if we deal with intensity compensation we need to scale source blocks */
494
        if (use_ic) {
495
            int i, j;
496
            uint8_t *src, *src2;
497
 
498
            src = srcY;
499
            for (j = 0; j < 17 + s->mspel * 2; j++) {
500
                int f = v->field_mode ? v->ref_field_type[dir] : ((j + src_y - s->mspel) & 1) ;
501
                for (i = 0; i < 17 + s->mspel * 2; i++)
502
                    src[i] = luty[f][src[i]];
503
                src += s->linesize;
504
            }
505
            src  = srcU;
506
            src2 = srcV;
507
            for (j = 0; j < 9; j++) {
508
                int f = v->field_mode ? v->ref_field_type[dir] : ((j + uvsrc_y) & 1);
509
                for (i = 0; i < 9; i++) {
510
                    src[i]  = lutuv[f][src[i]];
511
                    src2[i] = lutuv[f][src2[i]];
512
                }
513
                src  += s->uvlinesize;
514
                src2 += s->uvlinesize;
515
            }
516
        }
517
        srcY += s->mspel * (1 + s->linesize);
518
    }
519
 
520
    if (s->mspel) {
521
        dxy = ((my & 3) << 2) | (mx & 3);
522
        v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0]    , srcY    , s->linesize, v->rnd);
523
        v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
524
        srcY += s->linesize * 8;
525
        v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize    , srcY    , s->linesize, v->rnd);
526
        v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
527
    } else { // hpel mc - always used for luma
528
        dxy = (my & 2) | ((mx & 2) >> 1);
529
        if (!v->rnd)
530
            s->hdsp.put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
531
        else
532
            s->hdsp.put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
533
    }
534
 
535
    if (s->flags & CODEC_FLAG_GRAY) return;
536
    /* Chroma MC always uses qpel bilinear */
537
    uvmx = (uvmx & 3) << 1;
538
    uvmy = (uvmy & 3) << 1;
539
    if (!v->rnd) {
540
        h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
541
        h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
542
    } else {
543
        v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
544
        v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
545
    }
546
}
547
 
548
static inline int median4(int a, int b, int c, int d)
549
{
550
    if (a < b) {
551
        if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
552
        else       return (FFMIN(b, c) + FFMAX(a, d)) / 2;
553
    } else {
554
        if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
555
        else       return (FFMIN(a, c) + FFMAX(b, d)) / 2;
556
    }
557
}
558
 
559
/** Do motion compensation for 4-MV macroblock - luminance block
560
 */
561
static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg)
562
{
563
    MpegEncContext *s = &v->s;
564
    uint8_t *srcY;
565
    int dxy, mx, my, src_x, src_y;
566
    int off;
567
    int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
568
    int v_edge_pos = s->v_edge_pos >> v->field_mode;
569
    uint8_t (*luty)[256];
570
    int use_ic;
571
 
572
    if ((!v->field_mode ||
573
         (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) &&
574
        !v->s.last_picture.f.data[0])
575
        return;
576
 
577
    mx = s->mv[dir][n][0];
578
    my = s->mv[dir][n][1];
579
 
580
    if (!dir) {
581
        if (v->field_mode && (v->cur_field_type != v->ref_field_type[dir]) && v->second_field) {
582
            srcY = s->current_picture.f.data[0];
583
            luty = v->curr_luty;
584
            use_ic = v->curr_use_ic;
585
        } else {
586
            srcY = s->last_picture.f.data[0];
587
            luty = v->last_luty;
588
            use_ic = v->last_use_ic;
589
        }
590
    } else {
591
        srcY = s->next_picture.f.data[0];
592
        luty = v->next_luty;
593
        use_ic = v->next_use_ic;
594
    }
595
 
596
    if (!srcY) {
597
        av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n");
598
        return;
599
    }
600
 
601
    if (v->field_mode) {
602
        if (v->cur_field_type != v->ref_field_type[dir])
603
            my = my - 2 + 4 * v->cur_field_type;
604
    }
605
 
606
    if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) {
607
        int same_count = 0, opp_count = 0, k;
608
        int chosen_mv[2][4][2], f;
609
        int tx, ty;
610
        for (k = 0; k < 4; k++) {
611
            f = v->mv_f[0][s->block_index[k] + v->blocks_off];
612
            chosen_mv[f][f ? opp_count : same_count][0] = s->mv[0][k][0];
613
            chosen_mv[f][f ? opp_count : same_count][1] = s->mv[0][k][1];
614
            opp_count  += f;
615
            same_count += 1 - f;
616
        }
617
        f = opp_count > same_count;
618
        switch (f ? opp_count : same_count) {
619
        case 4:
620
            tx = median4(chosen_mv[f][0][0], chosen_mv[f][1][0],
621
                         chosen_mv[f][2][0], chosen_mv[f][3][0]);
622
            ty = median4(chosen_mv[f][0][1], chosen_mv[f][1][1],
623
                         chosen_mv[f][2][1], chosen_mv[f][3][1]);
624
            break;
625
        case 3:
626
            tx = mid_pred(chosen_mv[f][0][0], chosen_mv[f][1][0], chosen_mv[f][2][0]);
627
            ty = mid_pred(chosen_mv[f][0][1], chosen_mv[f][1][1], chosen_mv[f][2][1]);
628
            break;
629
        case 2:
630
            tx = (chosen_mv[f][0][0] + chosen_mv[f][1][0]) / 2;
631
            ty = (chosen_mv[f][0][1] + chosen_mv[f][1][1]) / 2;
632
            break;
633
        default:
634
            av_assert0(0);
635
        }
636
        s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
637
        s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
638
        for (k = 0; k < 4; k++)
639
            v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
640
    }
641
 
642
    if (v->fcm == ILACE_FRAME) {  // not sure if needed for other types of picture
643
        int qx, qy;
644
        int width  = s->avctx->coded_width;
645
        int height = s->avctx->coded_height >> 1;
646
        if (s->pict_type == AV_PICTURE_TYPE_P) {
647
            s->current_picture.motion_val[1][s->block_index[n] + v->blocks_off][0] = mx;
648
            s->current_picture.motion_val[1][s->block_index[n] + v->blocks_off][1] = my;
649
        }
650
        qx = (s->mb_x * 16) + (mx >> 2);
651
        qy = (s->mb_y *  8) + (my >> 3);
652
 
653
        if (qx < -17)
654
            mx -= 4 * (qx + 17);
655
        else if (qx > width)
656
            mx -= 4 * (qx - width);
657
        if (qy < -18)
658
            my -= 8 * (qy + 18);
659
        else if (qy > height + 1)
660
            my -= 8 * (qy - height - 1);
661
    }
662
 
663
    if ((v->fcm == ILACE_FRAME) && fieldmv)
664
        off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
665
    else
666
        off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
667
 
668
    src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
669
    if (!fieldmv)
670
        src_y = s->mb_y * 16 + (n & 2) * 4 + (my >> 2);
671
    else
672
        src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2);
673
 
674
    if (v->profile != PROFILE_ADVANCED) {
675
        src_x = av_clip(src_x, -16, s->mb_width  * 16);
676
        src_y = av_clip(src_y, -16, s->mb_height * 16);
677
    } else {
678
        src_x = av_clip(src_x, -17, s->avctx->coded_width);
679
        if (v->fcm == ILACE_FRAME) {
680
            if (src_y & 1)
681
                src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
682
            else
683
                src_y = av_clip(src_y, -18, s->avctx->coded_height);
684
        } else {
685
            src_y = av_clip(src_y, -18, s->avctx->coded_height + 1);
686
        }
687
    }
688
 
689
    srcY += src_y * s->linesize + src_x;
690
    if (v->field_mode && v->ref_field_type[dir])
691
        srcY += s->current_picture_ptr->f.linesize[0];
692
 
693
    if (fieldmv && !(src_y & 1))
694
        v_edge_pos--;
695
    if (fieldmv && (src_y & 1) && src_y < 4)
696
        src_y--;
697
    if (v->rangeredfrm || use_ic
698
        || s->h_edge_pos < 13 || v_edge_pos < 23
699
        || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2
700
        || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) {
701
        srcY -= s->mspel * (1 + (s->linesize << fieldmv));
702
        /* check emulate edge stride and offset */
703
        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize, srcY, s->linesize,
704
                                 9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
705
                                 src_x - s->mspel, src_y - (s->mspel << fieldmv),
706
                                 s->h_edge_pos, v_edge_pos);
707
        srcY = s->edge_emu_buffer;
708
        /* if we deal with range reduction we need to scale source blocks */
709
        if (v->rangeredfrm) {
710
            int i, j;
711
            uint8_t *src;
712
 
713
            src = srcY;
714
            for (j = 0; j < 9 + s->mspel * 2; j++) {
715
                for (i = 0; i < 9 + s->mspel * 2; i++)
716
                    src[i] = ((src[i] - 128) >> 1) + 128;
717
                src += s->linesize << fieldmv;
718
            }
719
        }
720
        /* if we deal with intensity compensation we need to scale source blocks */
721
        if (use_ic) {
722
            int i, j;
723
            uint8_t *src;
724
 
725
            src = srcY;
726
            for (j = 0; j < 9 + s->mspel * 2; j++) {
727
                int f = v->field_mode ? v->ref_field_type[dir] : (((j<mspel << fieldmv)) & 1);
728
                for (i = 0; i < 9 + s->mspel * 2; i++)
729
                    src[i] = luty[f][src[i]];
730
                src += s->linesize << fieldmv;
731
            }
732
        }
733
        srcY += s->mspel * (1 + (s->linesize << fieldmv));
734
    }
735
 
736
    if (s->mspel) {
737
        dxy = ((my & 3) << 2) | (mx & 3);
738
        if (avg)
739
            v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
740
        else
741
            v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
742
    } else { // hpel mc - always used for luma
743
        dxy = (my & 2) | ((mx & 2) >> 1);
744
        if (!v->rnd)
745
            s->hdsp.put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
746
        else
747
            s->hdsp.put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
748
    }
749
}
750
 
751
static av_always_inline int get_chroma_mv(int *mvx, int *mvy, int *a, int flag, int *tx, int *ty)
752
{
753
    int idx, i;
754
    static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
755
 
756
    idx =  ((a[3] != flag) << 3)
757
         | ((a[2] != flag) << 2)
758
         | ((a[1] != flag) << 1)
759
         |  (a[0] != flag);
760
    if (!idx) {
761
        *tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
762
        *ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
763
        return 4;
764
    } else if (count[idx] == 1) {
765
        switch (idx) {
766
        case 0x1:
767
            *tx = mid_pred(mvx[1], mvx[2], mvx[3]);
768
            *ty = mid_pred(mvy[1], mvy[2], mvy[3]);
769
            return 3;
770
        case 0x2:
771
            *tx = mid_pred(mvx[0], mvx[2], mvx[3]);
772
            *ty = mid_pred(mvy[0], mvy[2], mvy[3]);
773
            return 3;
774
        case 0x4:
775
            *tx = mid_pred(mvx[0], mvx[1], mvx[3]);
776
            *ty = mid_pred(mvy[0], mvy[1], mvy[3]);
777
            return 3;
778
        case 0x8:
779
            *tx = mid_pred(mvx[0], mvx[1], mvx[2]);
780
            *ty = mid_pred(mvy[0], mvy[1], mvy[2]);
781
            return 3;
782
        }
783
    } else if (count[idx] == 2) {
784
        int t1 = 0, t2 = 0;
785
        for (i = 0; i < 3; i++)
786
            if (!a[i]) {
787
                t1 = i;
788
                break;
789
            }
790
        for (i = t1 + 1; i < 4; i++)
791
            if (!a[i]) {
792
                t2 = i;
793
                break;
794
            }
795
        *tx = (mvx[t1] + mvx[t2]) / 2;
796
        *ty = (mvy[t1] + mvy[t2]) / 2;
797
        return 2;
798
    } else {
799
        return 0;
800
    }
801
    return -1;
802
}
803
 
804
/** Do motion compensation for 4-MV macroblock - both chroma blocks
805
 */
806
static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
807
{
808
    MpegEncContext *s = &v->s;
809
    H264ChromaContext *h264chroma = &v->h264chroma;
810
    uint8_t *srcU, *srcV;
811
    int uvmx, uvmy, uvsrc_x, uvsrc_y;
812
    int k, tx = 0, ty = 0;
813
    int mvx[4], mvy[4], intra[4], mv_f[4];
814
    int valid_count;
815
    int chroma_ref_type = v->cur_field_type;
816
    int v_edge_pos = s->v_edge_pos >> v->field_mode;
817
    uint8_t (*lutuv)[256];
818
    int use_ic;
819
 
820
    if (!v->field_mode && !v->s.last_picture.f.data[0])
821
        return;
822
    if (s->flags & CODEC_FLAG_GRAY)
823
        return;
824
 
825
    for (k = 0; k < 4; k++) {
826
        mvx[k] = s->mv[dir][k][0];
827
        mvy[k] = s->mv[dir][k][1];
828
        intra[k] = v->mb_type[0][s->block_index[k]];
829
        if (v->field_mode)
830
            mv_f[k] = v->mv_f[dir][s->block_index[k] + v->blocks_off];
831
    }
832
 
833
    /* calculate chroma MV vector from four luma MVs */
834
    if (!v->field_mode || (v->field_mode && !v->numref)) {
835
        valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
836
        chroma_ref_type = v->reffield;
837
        if (!valid_count) {
838
            s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
839
            s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
840
            v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
841
            return; //no need to do MC for intra blocks
842
        }
843
    } else {
844
        int dominant = 0;
845
        if (mv_f[0] + mv_f[1] + mv_f[2] + mv_f[3] > 2)
846
            dominant = 1;
847
        valid_count = get_chroma_mv(mvx, mvy, mv_f, dominant, &tx, &ty);
848
        if (dominant)
849
            chroma_ref_type = !v->cur_field_type;
850
    }
851
    if (v->field_mode && chroma_ref_type == 1 && v->cur_field_type == 1 && !v->s.last_picture.f.data[0])
852
        return;
853
    s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
854
    s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
855
    uvmx = (tx + ((tx & 3) == 3)) >> 1;
856
    uvmy = (ty + ((ty & 3) == 3)) >> 1;
857
 
858
    v->luma_mv[s->mb_x][0] = uvmx;
859
    v->luma_mv[s->mb_x][1] = uvmy;
860
 
861
    if (v->fastuvmc) {
862
        uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
863
        uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
864
    }
865
    // Field conversion bias
866
    if (v->cur_field_type != chroma_ref_type)
867
        uvmy += 2 - 4 * chroma_ref_type;
868
 
869
    uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
870
    uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
871
 
872
    if (v->profile != PROFILE_ADVANCED) {
873
        uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width  * 8);
874
        uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
875
    } else {
876
        uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width  >> 1);
877
        uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
878
    }
879
 
880
    if (!dir) {
881
        if (v->field_mode && (v->cur_field_type != chroma_ref_type) && v->second_field) {
882
            srcU = s->current_picture.f.data[1];
883
            srcV = s->current_picture.f.data[2];
884
            lutuv = v->curr_lutuv;
885
            use_ic = v->curr_use_ic;
886
        } else {
887
            srcU = s->last_picture.f.data[1];
888
            srcV = s->last_picture.f.data[2];
889
            lutuv = v->last_lutuv;
890
            use_ic = v->last_use_ic;
891
        }
892
    } else {
893
        srcU = s->next_picture.f.data[1];
894
        srcV = s->next_picture.f.data[2];
895
        lutuv = v->next_lutuv;
896
        use_ic = v->next_use_ic;
897
    }
898
 
899
    if (!srcU) {
900
        av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n");
901
        return;
902
    }
903
 
904
    srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
905
    srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
906
 
907
    if (v->field_mode) {
908
        if (chroma_ref_type) {
909
            srcU += s->current_picture_ptr->f.linesize[1];
910
            srcV += s->current_picture_ptr->f.linesize[2];
911
        }
912
    }
913
 
914
    if (v->rangeredfrm || use_ic
915
        || s->h_edge_pos < 18 || v_edge_pos < 18
916
        || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
917
        || (unsigned)uvsrc_y > (v_edge_pos    >> 1) - 9) {
918
        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->uvlinesize, srcU,
919
                                 s->uvlinesize, 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
920
                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
921
        s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, s->uvlinesize, srcV,
922
                                 s->uvlinesize, 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
923
                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
924
        srcU = s->edge_emu_buffer;
925
        srcV = s->edge_emu_buffer + 16;
926
 
927
        /* if we deal with range reduction we need to scale source blocks */
928
        if (v->rangeredfrm) {
929
            int i, j;
930
            uint8_t *src, *src2;
931
 
932
            src  = srcU;
933
            src2 = srcV;
934
            for (j = 0; j < 9; j++) {
935
                for (i = 0; i < 9; i++) {
936
                    src[i]  = ((src[i]  - 128) >> 1) + 128;
937
                    src2[i] = ((src2[i] - 128) >> 1) + 128;
938
                }
939
                src  += s->uvlinesize;
940
                src2 += s->uvlinesize;
941
            }
942
        }
943
        /* if we deal with intensity compensation we need to scale source blocks */
944
        if (use_ic) {
945
            int i, j;
946
            uint8_t *src, *src2;
947
 
948
            src  = srcU;
949
            src2 = srcV;
950
            for (j = 0; j < 9; j++) {
951
                int f = v->field_mode ? chroma_ref_type : ((j + uvsrc_y) & 1);
952
                for (i = 0; i < 9; i++) {
953
                    src[i]  = lutuv[f][src[i]];
954
                    src2[i] = lutuv[f][src2[i]];
955
                }
956
                src  += s->uvlinesize;
957
                src2 += s->uvlinesize;
958
            }
959
        }
960
    }
961
 
962
    /* Chroma MC always uses qpel bilinear */
963
    uvmx = (uvmx & 3) << 1;
964
    uvmy = (uvmy & 3) << 1;
965
    if (!v->rnd) {
966
        h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
967
        h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
968
    } else {
969
        v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
970
        v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
971
    }
972
}
973
 
974
/** Do motion compensation for 4-MV interlaced frame chroma macroblock (both U and V)
975
 */
976
static void vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg)
977
{
978
    MpegEncContext *s = &v->s;
979
    H264ChromaContext *h264chroma = &v->h264chroma;
980
    uint8_t *srcU, *srcV;
981
    int uvsrc_x, uvsrc_y;
982
    int uvmx_field[4], uvmy_field[4];
983
    int i, off, tx, ty;
984
    int fieldmv = v->blk_mv_type[s->block_index[0]];
985
    static const int s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 };
986
    int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks
987
    int v_edge_pos = s->v_edge_pos >> 1;
988
    int use_ic;
989
    uint8_t (*lutuv)[256];
990
 
991
    if (s->flags & CODEC_FLAG_GRAY)
992
        return;
993
 
994
    for (i = 0; i < 4; i++) {
995
        int d = i < 2 ? dir: dir2;
996
        tx = s->mv[d][i][0];
997
        uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1;
998
        ty = s->mv[d][i][1];
999
        if (fieldmv)
1000
            uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF];
1001
        else
1002
            uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1;
1003
    }
1004
 
1005
    for (i = 0; i < 4; i++) {
1006
        off = (i & 1) * 4 + ((i & 2) ? v_dist * s->uvlinesize : 0);
1007
        uvsrc_x = s->mb_x * 8 +  (i & 1) * 4           + (uvmx_field[i] >> 2);
1008
        uvsrc_y = s->mb_y * 8 + ((i & 2) ? v_dist : 0) + (uvmy_field[i] >> 2);
1009
        // FIXME: implement proper pull-back (see vc1cropmv.c, vc1CROPMV_ChromaPullBack())
1010
        uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width  >> 1);
1011
        uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
1012
        if (i < 2 ? dir : dir2) {
1013
            srcU = s->next_picture.f.data[1];
1014
            srcV = s->next_picture.f.data[2];
1015
            lutuv  = v->next_lutuv;
1016
            use_ic = v->next_use_ic;
1017
        } else {
1018
            srcU = s->last_picture.f.data[1];
1019
            srcV = s->last_picture.f.data[2];
1020
            lutuv  = v->last_lutuv;
1021
            use_ic = v->last_use_ic;
1022
        }
1023
        if (!srcU)
1024
            return;
1025
        srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
1026
        srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
1027
        uvmx_field[i] = (uvmx_field[i] & 3) << 1;
1028
        uvmy_field[i] = (uvmy_field[i] & 3) << 1;
1029
 
1030
        if (fieldmv && !(uvsrc_y & 1))
1031
            v_edge_pos = (s->v_edge_pos >> 1) - 1;
1032
 
1033
        if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2)
1034
            uvsrc_y--;
1035
        if (use_ic
1036
            || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv)
1037
            || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
1038
            || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) {
1039
            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->uvlinesize, srcU,
1040
                                     s->uvlinesize, 5, (5 << fieldmv), uvsrc_x,
1041
                                     uvsrc_y, s->h_edge_pos >> 1, v_edge_pos);
1042
            s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, s->uvlinesize, srcV,
1043
                                     s->uvlinesize, 5, (5 << fieldmv), uvsrc_x,
1044
                                     uvsrc_y, s->h_edge_pos >> 1, v_edge_pos);
1045
            srcU = s->edge_emu_buffer;
1046
            srcV = s->edge_emu_buffer + 16;
1047
 
1048
            /* if we deal with intensity compensation we need to scale source blocks */
1049
            if (use_ic) {
1050
                int i, j;
1051
                uint8_t *src, *src2;
1052
 
1053
                src  = srcU;
1054
                src2 = srcV;
1055
                for (j = 0; j < 5; j++) {
1056
                    int f = (uvsrc_y + (j << fieldmv)) & 1;
1057
                    for (i = 0; i < 5; i++) {
1058
                        src[i]  = lutuv[f][src[i]];
1059
                        src2[i] = lutuv[f][src2[i]];
1060
                    }
1061
                    src  += s->uvlinesize << fieldmv;
1062
                    src2 += s->uvlinesize << fieldmv;
1063
                }
1064
            }
1065
        }
1066
        if (avg) {
1067
            if (!v->rnd) {
1068
                h264chroma->avg_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1069
                h264chroma->avg_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1070
            } else {
1071
                v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1072
                v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1073
            }
1074
        } else {
1075
            if (!v->rnd) {
1076
                h264chroma->put_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1077
                h264chroma->put_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1078
            } else {
1079
                v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1080
                v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1081
            }
1082
        }
1083
    }
1084
}
1085
 
1086
/***********************************************************************/
1087
/**
1088
 * @name VC-1 Block-level functions
1089
 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1090
 * @{
1091
 */
1092
 
1093
/**
1094
 * @def GET_MQUANT
1095
 * @brief Get macroblock-level quantizer scale
1096
 */
1097
#define GET_MQUANT()                                           \
1098
    if (v->dquantfrm) {                                        \
1099
        int edges = 0;                                         \
1100
        if (v->dqprofile == DQPROFILE_ALL_MBS) {               \
1101
            if (v->dqbilevel) {                                \
1102
                mquant = (get_bits1(gb)) ? v->altpq : v->pq;   \
1103
            } else {                                           \
1104
                mqdiff = get_bits(gb, 3);                      \
1105
                if (mqdiff != 7)                               \
1106
                    mquant = v->pq + mqdiff;                   \
1107
                else                                           \
1108
                    mquant = get_bits(gb, 5);                  \
1109
            }                                                  \
1110
        }                                                      \
1111
        if (v->dqprofile == DQPROFILE_SINGLE_EDGE)             \
1112
            edges = 1 << v->dqsbedge;                          \
1113
        else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES)       \
1114
            edges = (3 << v->dqsbedge) % 15;                   \
1115
        else if (v->dqprofile == DQPROFILE_FOUR_EDGES)         \
1116
            edges = 15;                                        \
1117
        if ((edges&1) && !s->mb_x)                             \
1118
            mquant = v->altpq;                                 \
1119
        if ((edges&2) && s->first_slice_line)                  \
1120
            mquant = v->altpq;                                 \
1121
        if ((edges&4) && s->mb_x == (s->mb_width - 1))         \
1122
            mquant = v->altpq;                                 \
1123
        if ((edges&8) && s->mb_y == (s->mb_height - 1))        \
1124
            mquant = v->altpq;                                 \
1125
        if (!mquant || mquant > 31) {                          \
1126
            av_log(v->s.avctx, AV_LOG_ERROR,                   \
1127
                   "Overriding invalid mquant %d\n", mquant);  \
1128
            mquant = 1;                                        \
1129
        }                                                      \
1130
    }
1131
 
1132
/**
1133
 * @def GET_MVDATA(_dmv_x, _dmv_y)
1134
 * @brief Get MV differentials
1135
 * @see MVDATA decoding from 8.3.5.2, p(1)20
1136
 * @param _dmv_x Horizontal differential for decoded MV
1137
 * @param _dmv_y Vertical differential for decoded MV
1138
 */
1139
#define GET_MVDATA(_dmv_x, _dmv_y)                                      \
1140
    index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \
1141
                         VC1_MV_DIFF_VLC_BITS, 2);                      \
1142
    if (index > 36) {                                                   \
1143
        mb_has_coeffs = 1;                                              \
1144
        index -= 37;                                                    \
1145
    } else                                                              \
1146
        mb_has_coeffs = 0;                                              \
1147
    s->mb_intra = 0;                                                    \
1148
    if (!index) {                                                       \
1149
        _dmv_x = _dmv_y = 0;                                            \
1150
    } else if (index == 35) {                                           \
1151
        _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample);          \
1152
        _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample);          \
1153
    } else if (index == 36) {                                           \
1154
        _dmv_x = 0;                                                     \
1155
        _dmv_y = 0;                                                     \
1156
        s->mb_intra = 1;                                                \
1157
    } else {                                                            \
1158
        index1 = index % 6;                                             \
1159
        if (!s->quarter_sample && index1 == 5) val = 1;                 \
1160
        else                                   val = 0;                 \
1161
        if (size_table[index1] - val > 0)                               \
1162
            val = get_bits(gb, size_table[index1] - val);               \
1163
        else                                   val = 0;                 \
1164
        sign = 0 - (val&1);                                             \
1165
        _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign;     \
1166
                                                                        \
1167
        index1 = index / 6;                                             \
1168
        if (!s->quarter_sample && index1 == 5) val = 1;                 \
1169
        else                                   val = 0;                 \
1170
        if (size_table[index1] - val > 0)                               \
1171
            val = get_bits(gb, size_table[index1] - val);               \
1172
        else                                   val = 0;                 \
1173
        sign = 0 - (val & 1);                                           \
1174
        _dmv_y = (sign ^ ((val >> 1) + offset_table[index1])) - sign;   \
1175
    }
1176
 
1177
static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x,
1178
                                                   int *dmv_y, int *pred_flag)
1179
{
1180
    int index, index1;
1181
    int extend_x = 0, extend_y = 0;
1182
    GetBitContext *gb = &v->s.gb;
1183
    int bits, esc;
1184
    int val, sign;
1185
    const int* offs_tab;
1186
 
1187
    if (v->numref) {
1188
        bits = VC1_2REF_MVDATA_VLC_BITS;
1189
        esc  = 125;
1190
    } else {
1191
        bits = VC1_1REF_MVDATA_VLC_BITS;
1192
        esc  = 71;
1193
    }
1194
    switch (v->dmvrange) {
1195
    case 1:
1196
        extend_x = 1;
1197
        break;
1198
    case 2:
1199
        extend_y = 1;
1200
        break;
1201
    case 3:
1202
        extend_x = extend_y = 1;
1203
        break;
1204
    }
1205
    index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
1206
    if (index == esc) {
1207
        *dmv_x = get_bits(gb, v->k_x);
1208
        *dmv_y = get_bits(gb, v->k_y);
1209
        if (v->numref) {
1210
            if (pred_flag) {
1211
                *pred_flag = *dmv_y & 1;
1212
                *dmv_y     = (*dmv_y + *pred_flag) >> 1;
1213
            } else {
1214
                *dmv_y     = (*dmv_y + (*dmv_y & 1)) >> 1;
1215
            }
1216
        }
1217
    }
1218
    else {
1219
        av_assert0(index < esc);
1220
        if (extend_x)
1221
            offs_tab = offset_table2;
1222
        else
1223
            offs_tab = offset_table1;
1224
        index1 = (index + 1) % 9;
1225
        if (index1 != 0) {
1226
            val    = get_bits(gb, index1 + extend_x);
1227
            sign   = 0 -(val & 1);
1228
            *dmv_x = (sign ^ ((val >> 1) + offs_tab[index1])) - sign;
1229
        } else
1230
            *dmv_x = 0;
1231
        if (extend_y)
1232
            offs_tab = offset_table2;
1233
        else
1234
            offs_tab = offset_table1;
1235
        index1 = (index + 1) / 9;
1236
        if (index1 > v->numref) {
1237
            val    = get_bits(gb, (index1 + (extend_y << v->numref)) >> v->numref);
1238
            sign   = 0 - (val & 1);
1239
            *dmv_y = (sign ^ ((val >> 1) + offs_tab[index1 >> v->numref])) - sign;
1240
        } else
1241
            *dmv_y = 0;
1242
        if (v->numref && pred_flag)
1243
            *pred_flag = index1 & 1;
1244
    }
1245
}
1246
 
1247
static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int dir)
1248
{
1249
    int scaledvalue, refdist;
1250
    int scalesame1, scalesame2;
1251
    int scalezone1_x, zone1offset_x;
1252
    int table_index = dir ^ v->second_field;
1253
 
1254
    if (v->s.pict_type != AV_PICTURE_TYPE_B)
1255
        refdist = v->refdist;
1256
    else
1257
        refdist = dir ? v->brfd : v->frfd;
1258
    if (refdist > 3)
1259
        refdist = 3;
1260
    scalesame1    = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1261
    scalesame2    = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1262
    scalezone1_x  = ff_vc1_field_mvpred_scales[table_index][3][refdist];
1263
    zone1offset_x = ff_vc1_field_mvpred_scales[table_index][5][refdist];
1264
 
1265
    if (FFABS(n) > 255)
1266
        scaledvalue = n;
1267
    else {
1268
        if (FFABS(n) < scalezone1_x)
1269
            scaledvalue = (n * scalesame1) >> 8;
1270
        else {
1271
            if (n < 0)
1272
                scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x;
1273
            else
1274
                scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x;
1275
        }
1276
    }
1277
    return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1278
}
1279
 
1280
static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, int dir)
1281
{
1282
    int scaledvalue, refdist;
1283
    int scalesame1, scalesame2;
1284
    int scalezone1_y, zone1offset_y;
1285
    int table_index = dir ^ v->second_field;
1286
 
1287
    if (v->s.pict_type != AV_PICTURE_TYPE_B)
1288
        refdist = v->refdist;
1289
    else
1290
        refdist = dir ? v->brfd : v->frfd;
1291
    if (refdist > 3)
1292
        refdist = 3;
1293
    scalesame1    = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1294
    scalesame2    = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1295
    scalezone1_y  = ff_vc1_field_mvpred_scales[table_index][4][refdist];
1296
    zone1offset_y = ff_vc1_field_mvpred_scales[table_index][6][refdist];
1297
 
1298
    if (FFABS(n) > 63)
1299
        scaledvalue = n;
1300
    else {
1301
        if (FFABS(n) < scalezone1_y)
1302
            scaledvalue = (n * scalesame1) >> 8;
1303
        else {
1304
            if (n < 0)
1305
                scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y;
1306
            else
1307
                scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y;
1308
        }
1309
    }
1310
 
1311
    if (v->cur_field_type && !v->ref_field_type[dir])
1312
        return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
1313
    else
1314
        return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1315
}
1316
 
1317
static av_always_inline int scaleforopp_x(VC1Context *v, int n /* MV */)
1318
{
1319
    int scalezone1_x, zone1offset_x;
1320
    int scaleopp1, scaleopp2, brfd;
1321
    int scaledvalue;
1322
 
1323
    brfd = FFMIN(v->brfd, 3);
1324
    scalezone1_x  = ff_vc1_b_field_mvpred_scales[3][brfd];
1325
    zone1offset_x = ff_vc1_b_field_mvpred_scales[5][brfd];
1326
    scaleopp1     = ff_vc1_b_field_mvpred_scales[1][brfd];
1327
    scaleopp2     = ff_vc1_b_field_mvpred_scales[2][brfd];
1328
 
1329
    if (FFABS(n) > 255)
1330
        scaledvalue = n;
1331
    else {
1332
        if (FFABS(n) < scalezone1_x)
1333
            scaledvalue = (n * scaleopp1) >> 8;
1334
        else {
1335
            if (n < 0)
1336
                scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x;
1337
            else
1338
                scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x;
1339
        }
1340
    }
1341
    return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1342
}
1343
 
1344
static av_always_inline int scaleforopp_y(VC1Context *v, int n /* MV */, int dir)
1345
{
1346
    int scalezone1_y, zone1offset_y;
1347
    int scaleopp1, scaleopp2, brfd;
1348
    int scaledvalue;
1349
 
1350
    brfd = FFMIN(v->brfd, 3);
1351
    scalezone1_y  = ff_vc1_b_field_mvpred_scales[4][brfd];
1352
    zone1offset_y = ff_vc1_b_field_mvpred_scales[6][brfd];
1353
    scaleopp1     = ff_vc1_b_field_mvpred_scales[1][brfd];
1354
    scaleopp2     = ff_vc1_b_field_mvpred_scales[2][brfd];
1355
 
1356
    if (FFABS(n) > 63)
1357
        scaledvalue = n;
1358
    else {
1359
        if (FFABS(n) < scalezone1_y)
1360
            scaledvalue = (n * scaleopp1) >> 8;
1361
        else {
1362
            if (n < 0)
1363
                scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y;
1364
            else
1365
                scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y;
1366
        }
1367
    }
1368
    if (v->cur_field_type && !v->ref_field_type[dir]) {
1369
        return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
1370
    } else {
1371
        return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1372
    }
1373
}
1374
 
1375
static av_always_inline int scaleforsame(VC1Context *v, int i, int n /* MV */,
1376
                                         int dim, int dir)
1377
{
1378
    int brfd, scalesame;
1379
    int hpel = 1 - v->s.quarter_sample;
1380
 
1381
    n >>= hpel;
1382
    if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) {
1383
        if (dim)
1384
            n = scaleforsame_y(v, i, n, dir) << hpel;
1385
        else
1386
            n = scaleforsame_x(v, n, dir) << hpel;
1387
        return n;
1388
    }
1389
    brfd      = FFMIN(v->brfd, 3);
1390
    scalesame = ff_vc1_b_field_mvpred_scales[0][brfd];
1391
 
1392
    n = (n * scalesame >> 8) << hpel;
1393
    return n;
1394
}
1395
 
1396
static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */,
1397
                                        int dim, int dir)
1398
{
1399
    int refdist, scaleopp;
1400
    int hpel = 1 - v->s.quarter_sample;
1401
 
1402
    n >>= hpel;
1403
    if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
1404
        if (dim)
1405
            n = scaleforopp_y(v, n, dir) << hpel;
1406
        else
1407
            n = scaleforopp_x(v, n) << hpel;
1408
        return n;
1409
    }
1410
    if (v->s.pict_type != AV_PICTURE_TYPE_B)
1411
        refdist = FFMIN(v->refdist, 3);
1412
    else
1413
        refdist = dir ? v->brfd : v->frfd;
1414
    scaleopp = ff_vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
1415
 
1416
    n = (n * scaleopp >> 8) << hpel;
1417
    return n;
1418
}
1419
 
1420
/** Predict and set motion vector
1421
 */
1422
static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
1423
                               int mv1, int r_x, int r_y, uint8_t* is_intra,
1424
                               int pred_flag, int dir)
1425
{
1426
    MpegEncContext *s = &v->s;
1427
    int xy, wrap, off = 0;
1428
    int16_t *A, *B, *C;
1429
    int px, py;
1430
    int sum;
1431
    int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
1432
    int opposite, a_f, b_f, c_f;
1433
    int16_t field_predA[2];
1434
    int16_t field_predB[2];
1435
    int16_t field_predC[2];
1436
    int a_valid, b_valid, c_valid;
1437
    int hybridmv_thresh, y_bias = 0;
1438
 
1439
    if (v->mv_mode == MV_PMODE_MIXED_MV ||
1440
        ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV)))
1441
        mixedmv_pic = 1;
1442
    else
1443
        mixedmv_pic = 0;
1444
    /* scale MV difference to be quad-pel */
1445
    dmv_x <<= 1 - s->quarter_sample;
1446
    dmv_y <<= 1 - s->quarter_sample;
1447
 
1448
    wrap = s->b8_stride;
1449
    xy   = s->block_index[n];
1450
 
1451
    if (s->mb_intra) {
1452
        s->mv[0][n][0] = s->current_picture.motion_val[0][xy + v->blocks_off][0] = 0;
1453
        s->mv[0][n][1] = s->current_picture.motion_val[0][xy + v->blocks_off][1] = 0;
1454
        s->current_picture.motion_val[1][xy + v->blocks_off][0] = 0;
1455
        s->current_picture.motion_val[1][xy + v->blocks_off][1] = 0;
1456
        if (mv1) { /* duplicate motion data for 1-MV block */
1457
            s->current_picture.motion_val[0][xy + 1 + v->blocks_off][0]        = 0;
1458
            s->current_picture.motion_val[0][xy + 1 + v->blocks_off][1]        = 0;
1459
            s->current_picture.motion_val[0][xy + wrap + v->blocks_off][0]     = 0;
1460
            s->current_picture.motion_val[0][xy + wrap + v->blocks_off][1]     = 0;
1461
            s->current_picture.motion_val[0][xy + wrap + 1 + v->blocks_off][0] = 0;
1462
            s->current_picture.motion_val[0][xy + wrap + 1 + v->blocks_off][1] = 0;
1463
            v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
1464
            s->current_picture.motion_val[1][xy + 1 + v->blocks_off][0]        = 0;
1465
            s->current_picture.motion_val[1][xy + 1 + v->blocks_off][1]        = 0;
1466
            s->current_picture.motion_val[1][xy + wrap][0]                     = 0;
1467
            s->current_picture.motion_val[1][xy + wrap + v->blocks_off][1]     = 0;
1468
            s->current_picture.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0;
1469
            s->current_picture.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0;
1470
        }
1471
        return;
1472
    }
1473
 
1474
    C = s->current_picture.motion_val[dir][xy -    1 + v->blocks_off];
1475
    A = s->current_picture.motion_val[dir][xy - wrap + v->blocks_off];
1476
    if (mv1) {
1477
        if (v->field_mode && mixedmv_pic)
1478
            off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
1479
        else
1480
            off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1481
    } else {
1482
        //in 4-MV mode different blocks have different B predictor position
1483
        switch (n) {
1484
        case 0:
1485
            off = (s->mb_x > 0) ? -1 : 1;
1486
            break;
1487
        case 1:
1488
            off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
1489
            break;
1490
        case 2:
1491
            off = 1;
1492
            break;
1493
        case 3:
1494
            off = -1;
1495
        }
1496
    }
1497
    B = s->current_picture.motion_val[dir][xy - wrap + off + v->blocks_off];
1498
 
1499
    a_valid = !s->first_slice_line || (n == 2 || n == 3);
1500
    b_valid = a_valid && (s->mb_width > 1);
1501
    c_valid = s->mb_x || (n == 1 || n == 3);
1502
    if (v->field_mode) {
1503
        a_valid = a_valid && !is_intra[xy - wrap];
1504
        b_valid = b_valid && !is_intra[xy - wrap + off];
1505
        c_valid = c_valid && !is_intra[xy - 1];
1506
    }
1507
 
1508
    if (a_valid) {
1509
        a_f = v->mv_f[dir][xy - wrap + v->blocks_off];
1510
        num_oppfield  += a_f;
1511
        num_samefield += 1 - a_f;
1512
        field_predA[0] = A[0];
1513
        field_predA[1] = A[1];
1514
    } else {
1515
        field_predA[0] = field_predA[1] = 0;
1516
        a_f = 0;
1517
    }
1518
    if (b_valid) {
1519
        b_f = v->mv_f[dir][xy - wrap + off + v->blocks_off];
1520
        num_oppfield  += b_f;
1521
        num_samefield += 1 - b_f;
1522
        field_predB[0] = B[0];
1523
        field_predB[1] = B[1];
1524
    } else {
1525
        field_predB[0] = field_predB[1] = 0;
1526
        b_f = 0;
1527
    }
1528
    if (c_valid) {
1529
        c_f = v->mv_f[dir][xy - 1 + v->blocks_off];
1530
        num_oppfield  += c_f;
1531
        num_samefield += 1 - c_f;
1532
        field_predC[0] = C[0];
1533
        field_predC[1] = C[1];
1534
    } else {
1535
        field_predC[0] = field_predC[1] = 0;
1536
        c_f = 0;
1537
    }
1538
 
1539
    if (v->field_mode) {
1540
        if (!v->numref)
1541
            // REFFIELD determines if the last field or the second-last field is
1542
            // to be used as reference
1543
            opposite = 1 - v->reffield;
1544
        else {
1545
            if (num_samefield <= num_oppfield)
1546
                opposite = 1 - pred_flag;
1547
            else
1548
                opposite = pred_flag;
1549
        }
1550
    } else
1551
        opposite = 0;
1552
    if (opposite) {
1553
        if (a_valid && !a_f) {
1554
            field_predA[0] = scaleforopp(v, field_predA[0], 0, dir);
1555
            field_predA[1] = scaleforopp(v, field_predA[1], 1, dir);
1556
        }
1557
        if (b_valid && !b_f) {
1558
            field_predB[0] = scaleforopp(v, field_predB[0], 0, dir);
1559
            field_predB[1] = scaleforopp(v, field_predB[1], 1, dir);
1560
        }
1561
        if (c_valid && !c_f) {
1562
            field_predC[0] = scaleforopp(v, field_predC[0], 0, dir);
1563
            field_predC[1] = scaleforopp(v, field_predC[1], 1, dir);
1564
        }
1565
        v->mv_f[dir][xy + v->blocks_off] = 1;
1566
        v->ref_field_type[dir] = !v->cur_field_type;
1567
    } else {
1568
        if (a_valid && a_f) {
1569
            field_predA[0] = scaleforsame(v, n, field_predA[0], 0, dir);
1570
            field_predA[1] = scaleforsame(v, n, field_predA[1], 1, dir);
1571
        }
1572
        if (b_valid && b_f) {
1573
            field_predB[0] = scaleforsame(v, n, field_predB[0], 0, dir);
1574
            field_predB[1] = scaleforsame(v, n, field_predB[1], 1, dir);
1575
        }
1576
        if (c_valid && c_f) {
1577
            field_predC[0] = scaleforsame(v, n, field_predC[0], 0, dir);
1578
            field_predC[1] = scaleforsame(v, n, field_predC[1], 1, dir);
1579
        }
1580
        v->mv_f[dir][xy + v->blocks_off] = 0;
1581
        v->ref_field_type[dir] = v->cur_field_type;
1582
    }
1583
 
1584
    if (a_valid) {
1585
        px = field_predA[0];
1586
        py = field_predA[1];
1587
    } else if (c_valid) {
1588
        px = field_predC[0];
1589
        py = field_predC[1];
1590
    } else if (b_valid) {
1591
        px = field_predB[0];
1592
        py = field_predB[1];
1593
    } else {
1594
        px = 0;
1595
        py = 0;
1596
    }
1597
 
1598
    if (num_samefield + num_oppfield > 1) {
1599
        px = mid_pred(field_predA[0], field_predB[0], field_predC[0]);
1600
        py = mid_pred(field_predA[1], field_predB[1], field_predC[1]);
1601
    }
1602
 
1603
    /* Pullback MV as specified in 8.3.5.3.4 */
1604
    if (!v->field_mode) {
1605
        int qx, qy, X, Y;
1606
        qx = (s->mb_x << 6) + ((n == 1 || n == 3) ? 32 : 0);
1607
        qy = (s->mb_y << 6) + ((n == 2 || n == 3) ? 32 : 0);
1608
        X  = (s->mb_width  << 6) - 4;
1609
        Y  = (s->mb_height << 6) - 4;
1610
        if (mv1) {
1611
            if (qx + px < -60) px = -60 - qx;
1612
            if (qy + py < -60) py = -60 - qy;
1613
        } else {
1614
            if (qx + px < -28) px = -28 - qx;
1615
            if (qy + py < -28) py = -28 - qy;
1616
        }
1617
        if (qx + px > X) px = X - qx;
1618
        if (qy + py > Y) py = Y - qy;
1619
    }
1620
 
1621
    if (!v->field_mode || s->pict_type != AV_PICTURE_TYPE_B) {
1622
        /* Calculate hybrid prediction as specified in 8.3.5.3.5 (also 10.3.5.4.3.5) */
1623
        hybridmv_thresh = 32;
1624
        if (a_valid && c_valid) {
1625
            if (is_intra[xy - wrap])
1626
                sum = FFABS(px) + FFABS(py);
1627
            else
1628
                sum = FFABS(px - field_predA[0]) + FFABS(py - field_predA[1]);
1629
            if (sum > hybridmv_thresh) {
1630
                if (get_bits1(&s->gb)) {     // read HYBRIDPRED bit
1631
                    px = field_predA[0];
1632
                    py = field_predA[1];
1633
                } else {
1634
                    px = field_predC[0];
1635
                    py = field_predC[1];
1636
                }
1637
            } else {
1638
                if (is_intra[xy - 1])
1639
                    sum = FFABS(px) + FFABS(py);
1640
                else
1641
                    sum = FFABS(px - field_predC[0]) + FFABS(py - field_predC[1]);
1642
                if (sum > hybridmv_thresh) {
1643
                    if (get_bits1(&s->gb)) {
1644
                        px = field_predA[0];
1645
                        py = field_predA[1];
1646
                    } else {
1647
                        px = field_predC[0];
1648
                        py = field_predC[1];
1649
                    }
1650
                }
1651
            }
1652
        }
1653
    }
1654
 
1655
    if (v->field_mode && v->numref)
1656
        r_y >>= 1;
1657
    if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0)
1658
        y_bias = 1;
1659
    /* store MV using signed modulus of MV range defined in 4.11 */
1660
    s->mv[dir][n][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1661
    s->mv[dir][n][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1] = ((py + dmv_y + r_y - y_bias) & ((r_y << 1) - 1)) - r_y + y_bias;
1662
    if (mv1) { /* duplicate motion data for 1-MV block */
1663
        s->current_picture.motion_val[dir][xy +    1 +     v->blocks_off][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0];
1664
        s->current_picture.motion_val[dir][xy +    1 +     v->blocks_off][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1];
1665
        s->current_picture.motion_val[dir][xy + wrap +     v->blocks_off][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0];
1666
        s->current_picture.motion_val[dir][xy + wrap +     v->blocks_off][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1];
1667
        s->current_picture.motion_val[dir][xy + wrap + 1 + v->blocks_off][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0];
1668
        s->current_picture.motion_val[dir][xy + wrap + 1 + v->blocks_off][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1];
1669
        v->mv_f[dir][xy +    1 + v->blocks_off] = v->mv_f[dir][xy +            v->blocks_off];
1670
        v->mv_f[dir][xy + wrap + v->blocks_off] = v->mv_f[dir][xy + wrap + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off];
1671
    }
1672
}
1673
 
1674
/** Predict and set motion vector for interlaced frame picture MBs
1675
 */
1676
static inline void vc1_pred_mv_intfr(VC1Context *v, int n, int dmv_x, int dmv_y,
1677
                                     int mvn, int r_x, int r_y, uint8_t* is_intra, int dir)
1678
{
1679
    MpegEncContext *s = &v->s;
1680
    int xy, wrap, off = 0;
1681
    int A[2], B[2], C[2];
1682
    int px = 0, py = 0;
1683
    int a_valid = 0, b_valid = 0, c_valid = 0;
1684
    int field_a, field_b, field_c; // 0: same, 1: opposit
1685
    int total_valid, num_samefield, num_oppfield;
1686
    int pos_c, pos_b, n_adj;
1687
 
1688
    wrap = s->b8_stride;
1689
    xy = s->block_index[n];
1690
 
1691
    if (s->mb_intra) {
1692
        s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
1693
        s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
1694
        s->current_picture.motion_val[1][xy][0] = 0;
1695
        s->current_picture.motion_val[1][xy][1] = 0;
1696
        if (mvn == 1) { /* duplicate motion data for 1-MV block */
1697
            s->current_picture.motion_val[0][xy + 1][0]        = 0;
1698
            s->current_picture.motion_val[0][xy + 1][1]        = 0;
1699
            s->current_picture.motion_val[0][xy + wrap][0]     = 0;
1700
            s->current_picture.motion_val[0][xy + wrap][1]     = 0;
1701
            s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
1702
            s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
1703
            v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
1704
            s->current_picture.motion_val[1][xy + 1][0]        = 0;
1705
            s->current_picture.motion_val[1][xy + 1][1]        = 0;
1706
            s->current_picture.motion_val[1][xy + wrap][0]     = 0;
1707
            s->current_picture.motion_val[1][xy + wrap][1]     = 0;
1708
            s->current_picture.motion_val[1][xy + wrap + 1][0] = 0;
1709
            s->current_picture.motion_val[1][xy + wrap + 1][1] = 0;
1710
        }
1711
        return;
1712
    }
1713
 
1714
    off = ((n == 0) || (n == 1)) ? 1 : -1;
1715
    /* predict A */
1716
    if (s->mb_x || (n == 1) || (n == 3)) {
1717
        if ((v->blk_mv_type[xy]) // current block (MB) has a field MV
1718
            || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { // or both have frame MV
1719
            A[0] = s->current_picture.motion_val[dir][xy - 1][0];
1720
            A[1] = s->current_picture.motion_val[dir][xy - 1][1];
1721
            a_valid = 1;
1722
        } else { // current block has frame mv and cand. has field MV (so average)
1723
            A[0] = (s->current_picture.motion_val[dir][xy - 1][0]
1724
                    + s->current_picture.motion_val[dir][xy - 1 + off * wrap][0] + 1) >> 1;
1725
            A[1] = (s->current_picture.motion_val[dir][xy - 1][1]
1726
                    + s->current_picture.motion_val[dir][xy - 1 + off * wrap][1] + 1) >> 1;
1727
            a_valid = 1;
1728
        }
1729
        if (!(n & 1) && v->is_intra[s->mb_x - 1]) {
1730
            a_valid = 0;
1731
            A[0] = A[1] = 0;
1732
        }
1733
    } else
1734
        A[0] = A[1] = 0;
1735
    /* Predict B and C */
1736
    B[0] = B[1] = C[0] = C[1] = 0;
1737
    if (n == 0 || n == 1 || v->blk_mv_type[xy]) {
1738
        if (!s->first_slice_line) {
1739
            if (!v->is_intra[s->mb_x - s->mb_stride]) {
1740
                b_valid = 1;
1741
                n_adj   = n | 2;
1742
                pos_b   = s->block_index[n_adj] - 2 * wrap;
1743
                if (v->blk_mv_type[pos_b] && v->blk_mv_type[xy]) {
1744
                    n_adj = (n & 2) | (n & 1);
1745
                }
1746
                B[0] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap][0];
1747
                B[1] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap][1];
1748
                if (v->blk_mv_type[pos_b] && !v->blk_mv_type[xy]) {
1749
                    B[0] = (B[0] + s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap][0] + 1) >> 1;
1750
                    B[1] = (B[1] + s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap][1] + 1) >> 1;
1751
                }
1752
            }
1753
            if (s->mb_width > 1) {
1754
                if (!v->is_intra[s->mb_x - s->mb_stride + 1]) {
1755
                    c_valid = 1;
1756
                    n_adj   = 2;
1757
                    pos_c   = s->block_index[2] - 2 * wrap + 2;
1758
                    if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
1759
                        n_adj = n & 2;
1760
                    }
1761
                    C[0] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap + 2][0];
1762
                    C[1] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap + 2][1];
1763
                    if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
1764
                        C[0] = (1 + C[0] + (s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap + 2][0])) >> 1;
1765
                        C[1] = (1 + C[1] + (s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap + 2][1])) >> 1;
1766
                    }
1767
                    if (s->mb_x == s->mb_width - 1) {
1768
                        if (!v->is_intra[s->mb_x - s->mb_stride - 1]) {
1769
                            c_valid = 1;
1770
                            n_adj   = 3;
1771
                            pos_c   = s->block_index[3] - 2 * wrap - 2;
1772
                            if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
1773
                                n_adj = n | 1;
1774
                            }
1775
                            C[0] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap - 2][0];
1776
                            C[1] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap - 2][1];
1777
                            if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
1778
                                C[0] = (1 + C[0] + s->current_picture.motion_val[dir][s->block_index[1] - 2 * wrap - 2][0]) >> 1;
1779
                                C[1] = (1 + C[1] + s->current_picture.motion_val[dir][s->block_index[1] - 2 * wrap - 2][1]) >> 1;
1780
                            }
1781
                        } else
1782
                            c_valid = 0;
1783
                    }
1784
                }
1785
            }
1786
        }
1787
    } else {
1788
        pos_b   = s->block_index[1];
1789
        b_valid = 1;
1790
        B[0]    = s->current_picture.motion_val[dir][pos_b][0];
1791
        B[1]    = s->current_picture.motion_val[dir][pos_b][1];
1792
        pos_c   = s->block_index[0];
1793
        c_valid = 1;
1794
        C[0]    = s->current_picture.motion_val[dir][pos_c][0];
1795
        C[1]    = s->current_picture.motion_val[dir][pos_c][1];
1796
    }
1797
 
1798
    total_valid = a_valid + b_valid + c_valid;
1799
    // check if predictor A is out of bounds
1800
    if (!s->mb_x && !(n == 1 || n == 3)) {
1801
        A[0] = A[1] = 0;
1802
    }
1803
    // check if predictor B is out of bounds
1804
    if ((s->first_slice_line && v->blk_mv_type[xy]) || (s->first_slice_line && !(n & 2))) {
1805
        B[0] = B[1] = C[0] = C[1] = 0;
1806
    }
1807
    if (!v->blk_mv_type[xy]) {
1808
        if (s->mb_width == 1) {
1809
            px = B[0];
1810
            py = B[1];
1811
        } else {
1812
            if (total_valid >= 2) {
1813
                px = mid_pred(A[0], B[0], C[0]);
1814
                py = mid_pred(A[1], B[1], C[1]);
1815
            } else if (total_valid) {
1816
                if      (a_valid) { px = A[0]; py = A[1]; }
1817
                else if (b_valid) { px = B[0]; py = B[1]; }
1818
                else              { px = C[0]; py = C[1]; }
1819
            }
1820
        }
1821
    } else {
1822
        if (a_valid)
1823
            field_a = (A[1] & 4) ? 1 : 0;
1824
        else
1825
            field_a = 0;
1826
        if (b_valid)
1827
            field_b = (B[1] & 4) ? 1 : 0;
1828
        else
1829
            field_b = 0;
1830
        if (c_valid)
1831
            field_c = (C[1] & 4) ? 1 : 0;
1832
        else
1833
            field_c = 0;
1834
 
1835
        num_oppfield  = field_a + field_b + field_c;
1836
        num_samefield = total_valid - num_oppfield;
1837
        if (total_valid == 3) {
1838
            if ((num_samefield == 3) || (num_oppfield == 3)) {
1839
                px = mid_pred(A[0], B[0], C[0]);
1840
                py = mid_pred(A[1], B[1], C[1]);
1841
            } else if (num_samefield >= num_oppfield) {
1842
                /* take one MV from same field set depending on priority
1843
                the check for B may not be necessary */
1844
                px = !field_a ? A[0] : B[0];
1845
                py = !field_a ? A[1] : B[1];
1846
            } else {
1847
                px =  field_a ? A[0] : B[0];
1848
                py =  field_a ? A[1] : B[1];
1849
            }
1850
        } else if (total_valid == 2) {
1851
            if (num_samefield >= num_oppfield) {
1852
                if (!field_a && a_valid) {
1853
                    px = A[0];
1854
                    py = A[1];
1855
                } else if (!field_b && b_valid) {
1856
                    px = B[0];
1857
                    py = B[1];
1858
                } else /*if (c_valid)*/ {
1859
                    av_assert1(c_valid);
1860
                    px = C[0];
1861
                    py = C[1];
1862
                } /*else px = py = 0;*/
1863
            } else {
1864
                if (field_a && a_valid) {
1865
                    px = A[0];
1866
                    py = A[1];
1867
                } else /*if (field_b && b_valid)*/ {
1868
                    av_assert1(field_b && b_valid);
1869
                    px = B[0];
1870
                    py = B[1];
1871
                } /*else if (c_valid) {
1872
                    px = C[0];
1873
                    py = C[1];
1874
                }*/
1875
            }
1876
        } else if (total_valid == 1) {
1877
            px = (a_valid) ? A[0] : ((b_valid) ? B[0] : C[0]);
1878
            py = (a_valid) ? A[1] : ((b_valid) ? B[1] : C[1]);
1879
        }
1880
    }
1881
 
1882
    /* store MV using signed modulus of MV range defined in 4.11 */
1883
    s->mv[dir][n][0] = s->current_picture.motion_val[dir][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1884
    s->mv[dir][n][1] = s->current_picture.motion_val[dir][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
1885
    if (mvn == 1) { /* duplicate motion data for 1-MV block */
1886
        s->current_picture.motion_val[dir][xy +    1    ][0] = s->current_picture.motion_val[dir][xy][0];
1887
        s->current_picture.motion_val[dir][xy +    1    ][1] = s->current_picture.motion_val[dir][xy][1];
1888
        s->current_picture.motion_val[dir][xy + wrap    ][0] = s->current_picture.motion_val[dir][xy][0];
1889
        s->current_picture.motion_val[dir][xy + wrap    ][1] = s->current_picture.motion_val[dir][xy][1];
1890
        s->current_picture.motion_val[dir][xy + wrap + 1][0] = s->current_picture.motion_val[dir][xy][0];
1891
        s->current_picture.motion_val[dir][xy + wrap + 1][1] = s->current_picture.motion_val[dir][xy][1];
1892
    } else if (mvn == 2) { /* duplicate motion data for 2-Field MV block */
1893
        s->current_picture.motion_val[dir][xy + 1][0] = s->current_picture.motion_val[dir][xy][0];
1894
        s->current_picture.motion_val[dir][xy + 1][1] = s->current_picture.motion_val[dir][xy][1];
1895
        s->mv[dir][n + 1][0] = s->mv[dir][n][0];
1896
        s->mv[dir][n + 1][1] = s->mv[dir][n][1];
1897
    }
1898
}
1899
 
1900
/** Motion compensation for direct or interpolated blocks in B-frames
1901
 */
1902
static void vc1_interp_mc(VC1Context *v)
1903
{
1904
    MpegEncContext *s = &v->s;
1905
    H264ChromaContext *h264chroma = &v->h264chroma;
1906
    uint8_t *srcY, *srcU, *srcV;
1907
    int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
1908
    int off, off_uv;
1909
    int v_edge_pos = s->v_edge_pos >> v->field_mode;
1910
    int use_ic = v->next_use_ic;
1911
 
1912
    if (!v->field_mode && !v->s.next_picture.f.data[0])
1913
        return;
1914
 
1915
    mx   = s->mv[1][0][0];
1916
    my   = s->mv[1][0][1];
1917
    uvmx = (mx + ((mx & 3) == 3)) >> 1;
1918
    uvmy = (my + ((my & 3) == 3)) >> 1;
1919
    if (v->field_mode) {
1920
        if (v->cur_field_type != v->ref_field_type[1])
1921
            my   = my   - 2 + 4 * v->cur_field_type;
1922
            uvmy = uvmy - 2 + 4 * v->cur_field_type;
1923
    }
1924
    if (v->fastuvmc) {
1925
        uvmx = uvmx + ((uvmx < 0) ? -(uvmx & 1) : (uvmx & 1));
1926
        uvmy = uvmy + ((uvmy < 0) ? -(uvmy & 1) : (uvmy & 1));
1927
    }
1928
    srcY = s->next_picture.f.data[0];
1929
    srcU = s->next_picture.f.data[1];
1930
    srcV = s->next_picture.f.data[2];
1931
 
1932
    src_x   = s->mb_x * 16 + (mx   >> 2);
1933
    src_y   = s->mb_y * 16 + (my   >> 2);
1934
    uvsrc_x = s->mb_x *  8 + (uvmx >> 2);
1935
    uvsrc_y = s->mb_y *  8 + (uvmy >> 2);
1936
 
1937
    if (v->profile != PROFILE_ADVANCED) {
1938
        src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
1939
        src_y   = av_clip(  src_y, -16, s->mb_height * 16);
1940
        uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
1941
        uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
1942
    } else {
1943
        src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
1944
        src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
1945
        uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
1946
        uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
1947
    }
1948
 
1949
    srcY += src_y   * s->linesize   + src_x;
1950
    srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
1951
    srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
1952
 
1953
    if (v->field_mode && v->ref_field_type[1]) {
1954
        srcY += s->current_picture_ptr->f.linesize[0];
1955
        srcU += s->current_picture_ptr->f.linesize[1];
1956
        srcV += s->current_picture_ptr->f.linesize[2];
1957
    }
1958
 
1959
    /* for grayscale we should not try to read from unknown area */
1960
    if (s->flags & CODEC_FLAG_GRAY) {
1961
        srcU = s->edge_emu_buffer + 18 * s->linesize;
1962
        srcV = s->edge_emu_buffer + 18 * s->linesize;
1963
    }
1964
 
1965
    if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22 || use_ic
1966
        || (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3
1967
        || (unsigned)(src_y - 1) > v_edge_pos    - (my & 3) - 16 - 3) {
1968
        uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
1969
 
1970
        srcY -= s->mspel * (1 + s->linesize);
1971
        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize, srcY, s->linesize,
1972
                                 17 + s->mspel * 2, 17 + s->mspel * 2,
1973
                                 src_x - s->mspel, src_y - s->mspel,
1974
                                 s->h_edge_pos, v_edge_pos);
1975
        srcY = s->edge_emu_buffer;
1976
        s->vdsp.emulated_edge_mc(uvbuf, s->uvlinesize, srcU, s->uvlinesize,
1977
                                 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
1978
                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
1979
        s->vdsp.emulated_edge_mc(uvbuf + 16, s->uvlinesize, srcV, s->uvlinesize,
1980
                                 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
1981
                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
1982
        srcU = uvbuf;
1983
        srcV = uvbuf + 16;
1984
        /* if we deal with range reduction we need to scale source blocks */
1985
        if (v->rangeredfrm) {
1986
            int i, j;
1987
            uint8_t *src, *src2;
1988
 
1989
            src = srcY;
1990
            for (j = 0; j < 17 + s->mspel * 2; j++) {
1991
                for (i = 0; i < 17 + s->mspel * 2; i++)
1992
                    src[i] = ((src[i] - 128) >> 1) + 128;
1993
                src += s->linesize;
1994
            }
1995
            src = srcU;
1996
            src2 = srcV;
1997
            for (j = 0; j < 9; j++) {
1998
                for (i = 0; i < 9; i++) {
1999
                    src[i]  = ((src[i]  - 128) >> 1) + 128;
2000
                    src2[i] = ((src2[i] - 128) >> 1) + 128;
2001
                }
2002
                src  += s->uvlinesize;
2003
                src2 += s->uvlinesize;
2004
            }
2005
        }
2006
 
2007
        if (use_ic) {
2008
            uint8_t (*luty )[256] = v->next_luty;
2009
            uint8_t (*lutuv)[256] = v->next_lutuv;
2010
            int i, j;
2011
            uint8_t *src, *src2;
2012
 
2013
            src = srcY;
2014
            for (j = 0; j < 17 + s->mspel * 2; j++) {
2015
                int f = v->field_mode ? v->ref_field_type[1] : ((j+src_y - s->mspel) & 1);
2016
                for (i = 0; i < 17 + s->mspel * 2; i++)
2017
                    src[i] = luty[f][src[i]];
2018
                src += s->linesize;
2019
            }
2020
            src  = srcU;
2021
            src2 = srcV;
2022
            for (j = 0; j < 9; j++) {
2023
                int f = v->field_mode ? v->ref_field_type[1] : ((j+uvsrc_y) & 1);
2024
                for (i = 0; i < 9; i++) {
2025
                    src[i]  = lutuv[f][src[i]];
2026
                    src2[i] = lutuv[f][src2[i]];
2027
                }
2028
                src  += s->uvlinesize;
2029
                src2 += s->uvlinesize;
2030
            }
2031
        }
2032
        srcY += s->mspel * (1 + s->linesize);
2033
    }
2034
 
2035
    off    = 0;
2036
    off_uv = 0;
2037
 
2038
    if (s->mspel) {
2039
        dxy = ((my & 3) << 2) | (mx & 3);
2040
        v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off    , srcY    , s->linesize, v->rnd);
2041
        v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
2042
        srcY += s->linesize * 8;
2043
        v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize    , srcY    , s->linesize, v->rnd);
2044
        v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
2045
    } else { // hpel mc
2046
        dxy = (my & 2) | ((mx & 2) >> 1);
2047
 
2048
        if (!v->rnd)
2049
            s->hdsp.avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
2050
        else
2051
            s->hdsp.avg_no_rnd_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, 16);
2052
    }
2053
 
2054
    if (s->flags & CODEC_FLAG_GRAY) return;
2055
    /* Chroma MC always uses qpel blilinear */
2056
    uvmx = (uvmx & 3) << 1;
2057
    uvmy = (uvmy & 3) << 1;
2058
    if (!v->rnd) {
2059
        h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
2060
        h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
2061
    } else {
2062
        v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
2063
        v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
2064
    }
2065
}
2066
 
2067
static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
2068
{
2069
    int n = bfrac;
2070
 
2071
#if B_FRACTION_DEN==256
2072
    if (inv)
2073
        n -= 256;
2074
    if (!qs)
2075
        return 2 * ((value * n + 255) >> 9);
2076
    return (value * n + 128) >> 8;
2077
#else
2078
    if (inv)
2079
        n -= B_FRACTION_DEN;
2080
    if (!qs)
2081
        return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
2082
    return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
2083
#endif
2084
}
2085
 
2086
/** Reconstruct motion vector for B-frame and do motion compensation
2087
 */
2088
static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
2089
                            int direct, int mode)
2090
{
2091
    if (direct) {
2092
        vc1_mc_1mv(v, 0);
2093
        vc1_interp_mc(v);
2094
        return;
2095
    }
2096
    if (mode == BMV_TYPE_INTERPOLATED) {
2097
        vc1_mc_1mv(v, 0);
2098
        vc1_interp_mc(v);
2099
        return;
2100
    }
2101
 
2102
    vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
2103
}
2104
 
2105
static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2],
2106
                                 int direct, int mvtype)
2107
{
2108
    MpegEncContext *s = &v->s;
2109
    int xy, wrap, off = 0;
2110
    int16_t *A, *B, *C;
2111
    int px, py;
2112
    int sum;
2113
    int r_x, r_y;
2114
    const uint8_t *is_intra = v->mb_type[0];
2115
 
2116
    r_x = v->range_x;
2117
    r_y = v->range_y;
2118
    /* scale MV difference to be quad-pel */
2119
    dmv_x[0] <<= 1 - s->quarter_sample;
2120
    dmv_y[0] <<= 1 - s->quarter_sample;
2121
    dmv_x[1] <<= 1 - s->quarter_sample;
2122
    dmv_y[1] <<= 1 - s->quarter_sample;
2123
 
2124
    wrap = s->b8_stride;
2125
    xy = s->block_index[0];
2126
 
2127
    if (s->mb_intra) {
2128
        s->current_picture.motion_val[0][xy + v->blocks_off][0] =
2129
        s->current_picture.motion_val[0][xy + v->blocks_off][1] =
2130
        s->current_picture.motion_val[1][xy + v->blocks_off][0] =
2131
        s->current_picture.motion_val[1][xy + v->blocks_off][1] = 0;
2132
        return;
2133
    }
2134
    if (!v->field_mode) {
2135
        s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
2136
        s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
2137
        s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
2138
        s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
2139
 
2140
        /* Pullback predicted motion vectors as specified in 8.4.5.4 */
2141
        s->mv[0][0][0] = av_clip(s->mv[0][0][0], -60 - (s->mb_x << 6), (s->mb_width  << 6) - 4 - (s->mb_x << 6));
2142
        s->mv[0][0][1] = av_clip(s->mv[0][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
2143
        s->mv[1][0][0] = av_clip(s->mv[1][0][0], -60 - (s->mb_x << 6), (s->mb_width  << 6) - 4 - (s->mb_x << 6));
2144
        s->mv[1][0][1] = av_clip(s->mv[1][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
2145
    }
2146
    if (direct) {
2147
        s->current_picture.motion_val[0][xy + v->blocks_off][0] = s->mv[0][0][0];
2148
        s->current_picture.motion_val[0][xy + v->blocks_off][1] = s->mv[0][0][1];
2149
        s->current_picture.motion_val[1][xy + v->blocks_off][0] = s->mv[1][0][0];
2150
        s->current_picture.motion_val[1][xy + v->blocks_off][1] = s->mv[1][0][1];
2151
        return;
2152
    }
2153
 
2154
    if ((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2155
        C   = s->current_picture.motion_val[0][xy - 2];
2156
        A   = s->current_picture.motion_val[0][xy - wrap * 2];
2157
        off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2158
        B   = s->current_picture.motion_val[0][xy - wrap * 2 + off];
2159
 
2160
        if (!s->mb_x) C[0] = C[1] = 0;
2161
        if (!s->first_slice_line) { // predictor A is not out of bounds
2162
            if (s->mb_width == 1) {
2163
                px = A[0];
2164
                py = A[1];
2165
            } else {
2166
                px = mid_pred(A[0], B[0], C[0]);
2167
                py = mid_pred(A[1], B[1], C[1]);
2168
            }
2169
        } else if (s->mb_x) { // predictor C is not out of bounds
2170
            px = C[0];
2171
            py = C[1];
2172
        } else {
2173
            px = py = 0;
2174
        }
2175
        /* Pullback MV as specified in 8.3.5.3.4 */
2176
        {
2177
            int qx, qy, X, Y;
2178
            if (v->profile < PROFILE_ADVANCED) {
2179
                qx = (s->mb_x << 5);
2180
                qy = (s->mb_y << 5);
2181
                X  = (s->mb_width  << 5) - 4;
2182
                Y  = (s->mb_height << 5) - 4;
2183
                if (qx + px < -28) px = -28 - qx;
2184
                if (qy + py < -28) py = -28 - qy;
2185
                if (qx + px > X) px = X - qx;
2186
                if (qy + py > Y) py = Y - qy;
2187
            } else {
2188
                qx = (s->mb_x << 6);
2189
                qy = (s->mb_y << 6);
2190
                X  = (s->mb_width  << 6) - 4;
2191
                Y  = (s->mb_height << 6) - 4;
2192
                if (qx + px < -60) px = -60 - qx;
2193
                if (qy + py < -60) py = -60 - qy;
2194
                if (qx + px > X) px = X - qx;
2195
                if (qy + py > Y) py = Y - qy;
2196
            }
2197
        }
2198
        /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2199
        if (0 && !s->first_slice_line && s->mb_x) {
2200
            if (is_intra[xy - wrap])
2201
                sum = FFABS(px) + FFABS(py);
2202
            else
2203
                sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2204
            if (sum > 32) {
2205
                if (get_bits1(&s->gb)) {
2206
                    px = A[0];
2207
                    py = A[1];
2208
                } else {
2209
                    px = C[0];
2210
                    py = C[1];
2211
                }
2212
            } else {
2213
                if (is_intra[xy - 2])
2214
                    sum = FFABS(px) + FFABS(py);
2215
                else
2216
                    sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2217
                if (sum > 32) {
2218
                    if (get_bits1(&s->gb)) {
2219
                        px = A[0];
2220
                        py = A[1];
2221
                    } else {
2222
                        px = C[0];
2223
                        py = C[1];
2224
                    }
2225
                }
2226
            }
2227
        }
2228
        /* store MV using signed modulus of MV range defined in 4.11 */
2229
        s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
2230
        s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
2231
    }
2232
    if ((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2233
        C   = s->current_picture.motion_val[1][xy - 2];
2234
        A   = s->current_picture.motion_val[1][xy - wrap * 2];
2235
        off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2236
        B   = s->current_picture.motion_val[1][xy - wrap * 2 + off];
2237
 
2238
        if (!s->mb_x)
2239
            C[0] = C[1] = 0;
2240
        if (!s->first_slice_line) { // predictor A is not out of bounds
2241
            if (s->mb_width == 1) {
2242
                px = A[0];
2243
                py = A[1];
2244
            } else {
2245
                px = mid_pred(A[0], B[0], C[0]);
2246
                py = mid_pred(A[1], B[1], C[1]);
2247
            }
2248
        } else if (s->mb_x) { // predictor C is not out of bounds
2249
            px = C[0];
2250
            py = C[1];
2251
        } else {
2252
            px = py = 0;
2253
        }
2254
        /* Pullback MV as specified in 8.3.5.3.4 */
2255
        {
2256
            int qx, qy, X, Y;
2257
            if (v->profile < PROFILE_ADVANCED) {
2258
                qx = (s->mb_x << 5);
2259
                qy = (s->mb_y << 5);
2260
                X  = (s->mb_width  << 5) - 4;
2261
                Y  = (s->mb_height << 5) - 4;
2262
                if (qx + px < -28) px = -28 - qx;
2263
                if (qy + py < -28) py = -28 - qy;
2264
                if (qx + px > X) px = X - qx;
2265
                if (qy + py > Y) py = Y - qy;
2266
            } else {
2267
                qx = (s->mb_x << 6);
2268
                qy = (s->mb_y << 6);
2269
                X  = (s->mb_width  << 6) - 4;
2270
                Y  = (s->mb_height << 6) - 4;
2271
                if (qx + px < -60) px = -60 - qx;
2272
                if (qy + py < -60) py = -60 - qy;
2273
                if (qx + px > X) px = X - qx;
2274
                if (qy + py > Y) py = Y - qy;
2275
            }
2276
        }
2277
        /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2278
        if (0 && !s->first_slice_line && s->mb_x) {
2279
            if (is_intra[xy - wrap])
2280
                sum = FFABS(px) + FFABS(py);
2281
            else
2282
                sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2283
            if (sum > 32) {
2284
                if (get_bits1(&s->gb)) {
2285
                    px = A[0];
2286
                    py = A[1];
2287
                } else {
2288
                    px = C[0];
2289
                    py = C[1];
2290
                }
2291
            } else {
2292
                if (is_intra[xy - 2])
2293
                    sum = FFABS(px) + FFABS(py);
2294
                else
2295
                    sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2296
                if (sum > 32) {
2297
                    if (get_bits1(&s->gb)) {
2298
                        px = A[0];
2299
                        py = A[1];
2300
                    } else {
2301
                        px = C[0];
2302
                        py = C[1];
2303
                    }
2304
                }
2305
            }
2306
        }
2307
        /* store MV using signed modulus of MV range defined in 4.11 */
2308
 
2309
        s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
2310
        s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
2311
    }
2312
    s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
2313
    s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
2314
    s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
2315
    s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2316
}
2317
 
2318
static inline void vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, int mv1, int *pred_flag)
2319
{
2320
    int dir = (v->bmvtype == BMV_TYPE_BACKWARD) ? 1 : 0;
2321
    MpegEncContext *s = &v->s;
2322
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2323
 
2324
    if (v->bmvtype == BMV_TYPE_DIRECT) {
2325
        int total_opp, k, f;
2326
        if (s->next_picture.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) {
2327
            s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][0],
2328
                                      v->bfraction, 0, s->quarter_sample);
2329
            s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][1],
2330
                                      v->bfraction, 0, s->quarter_sample);
2331
            s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][0],
2332
                                      v->bfraction, 1, s->quarter_sample);
2333
            s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][1],
2334
                                      v->bfraction, 1, s->quarter_sample);
2335
 
2336
            total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
2337
                      + v->mv_f_next[0][s->block_index[1] + v->blocks_off]
2338
                      + v->mv_f_next[0][s->block_index[2] + v->blocks_off]
2339
                      + v->mv_f_next[0][s->block_index[3] + v->blocks_off];
2340
            f = (total_opp > 2) ? 1 : 0;
2341
        } else {
2342
            s->mv[0][0][0] = s->mv[0][0][1] = 0;
2343
            s->mv[1][0][0] = s->mv[1][0][1] = 0;
2344
            f = 0;
2345
        }
2346
        v->ref_field_type[0] = v->ref_field_type[1] = v->cur_field_type ^ f;
2347
        for (k = 0; k < 4; k++) {
2348
            s->current_picture.motion_val[0][s->block_index[k] + v->blocks_off][0] = s->mv[0][0][0];
2349
            s->current_picture.motion_val[0][s->block_index[k] + v->blocks_off][1] = s->mv[0][0][1];
2350
            s->current_picture.motion_val[1][s->block_index[k] + v->blocks_off][0] = s->mv[1][0][0];
2351
            s->current_picture.motion_val[1][s->block_index[k] + v->blocks_off][1] = s->mv[1][0][1];
2352
            v->mv_f[0][s->block_index[k] + v->blocks_off] = f;
2353
            v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
2354
        }
2355
        return;
2356
    }
2357
    if (v->bmvtype == BMV_TYPE_INTERPOLATED) {
2358
        vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0],   1, v->range_x, v->range_y, v->mb_type[0], pred_flag[0], 0);
2359
        vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1],   1, v->range_x, v->range_y, v->mb_type[0], pred_flag[1], 1);
2360
        return;
2361
    }
2362
    if (dir) { // backward
2363
        vc1_pred_mv(v, n, dmv_x[1], dmv_y[1], mv1, v->range_x, v->range_y, v->mb_type[0], pred_flag[1], 1);
2364
        if (n == 3 || mv1) {
2365
            vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0],   1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
2366
        }
2367
    } else { // forward
2368
        vc1_pred_mv(v, n, dmv_x[0], dmv_y[0], mv1, v->range_x, v->range_y, v->mb_type[0], pred_flag[0], 0);
2369
        if (n == 3 || mv1) {
2370
            vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1],   1, v->range_x, v->range_y, v->mb_type[0], 0, 1);
2371
        }
2372
    }
2373
}
2374
 
2375
/** Get predicted DC value for I-frames only
2376
 * prediction dir: left=0, top=1
2377
 * @param s MpegEncContext
2378
 * @param overlap flag indicating that overlap filtering is used
2379
 * @param pq integer part of picture quantizer
2380
 * @param[in] n block index in the current MB
2381
 * @param dc_val_ptr Pointer to DC predictor
2382
 * @param dir_ptr Prediction direction for use in AC prediction
2383
 */
2384
static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2385
                                int16_t **dc_val_ptr, int *dir_ptr)
2386
{
2387
    int a, b, c, wrap, pred, scale;
2388
    int16_t *dc_val;
2389
    static const uint16_t dcpred[32] = {
2390
        -1, 1024,  512,  341,  256,  205,  171,  146,  128,
2391
             114,  102,   93,   85,   79,   73,   68,   64,
2392
              60,   57,   54,   51,   49,   47,   45,   43,
2393
              41,   39,   38,   37,   35,   34,   33
2394
    };
2395
 
2396
    /* find prediction - wmv3_dc_scale always used here in fact */
2397
    if (n < 4) scale = s->y_dc_scale;
2398
    else       scale = s->c_dc_scale;
2399
 
2400
    wrap   = s->block_wrap[n];
2401
    dc_val = s->dc_val[0] + s->block_index[n];
2402
 
2403
    /* B A
2404
     * C X
2405
     */
2406
    c = dc_val[ - 1];
2407
    b = dc_val[ - 1 - wrap];
2408
    a = dc_val[ - wrap];
2409
 
2410
    if (pq < 9 || !overlap) {
2411
        /* Set outer values */
2412
        if (s->first_slice_line && (n != 2 && n != 3))
2413
            b = a = dcpred[scale];
2414
        if (s->mb_x == 0 && (n != 1 && n != 3))
2415
            b = c = dcpred[scale];
2416
    } else {
2417
        /* Set outer values */
2418
        if (s->first_slice_line && (n != 2 && n != 3))
2419
            b = a = 0;
2420
        if (s->mb_x == 0 && (n != 1 && n != 3))
2421
            b = c = 0;
2422
    }
2423
 
2424
    if (abs(a - b) <= abs(b - c)) {
2425
        pred     = c;
2426
        *dir_ptr = 1; // left
2427
    } else {
2428
        pred     = a;
2429
        *dir_ptr = 0; // top
2430
    }
2431
 
2432
    /* update predictor */
2433
    *dc_val_ptr = &dc_val[0];
2434
    return pred;
2435
}
2436
 
2437
 
2438
/** Get predicted DC value
2439
 * prediction dir: left=0, top=1
2440
 * @param s MpegEncContext
2441
 * @param overlap flag indicating that overlap filtering is used
2442
 * @param pq integer part of picture quantizer
2443
 * @param[in] n block index in the current MB
2444
 * @param a_avail flag indicating top block availability
2445
 * @param c_avail flag indicating left block availability
2446
 * @param dc_val_ptr Pointer to DC predictor
2447
 * @param dir_ptr Prediction direction for use in AC prediction
2448
 */
2449
static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2450
                              int a_avail, int c_avail,
2451
                              int16_t **dc_val_ptr, int *dir_ptr)
2452
{
2453
    int a, b, c, wrap, pred;
2454
    int16_t *dc_val;
2455
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2456
    int q1, q2 = 0;
2457
    int dqscale_index;
2458
 
2459
    wrap = s->block_wrap[n];
2460
    dc_val = s->dc_val[0] + s->block_index[n];
2461
 
2462
    /* B A
2463
     * C X
2464
     */
2465
    c = dc_val[ - 1];
2466
    b = dc_val[ - 1 - wrap];
2467
    a = dc_val[ - wrap];
2468
    /* scale predictors if needed */
2469
    q1 = s->current_picture.qscale_table[mb_pos];
2470
    dqscale_index = s->y_dc_scale_table[q1] - 1;
2471
    if (dqscale_index < 0)
2472
        return 0;
2473
    if (c_avail && (n != 1 && n != 3)) {
2474
        q2 = s->current_picture.qscale_table[mb_pos - 1];
2475
        if (q2 && q2 != q1)
2476
            c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2477
    }
2478
    if (a_avail && (n != 2 && n != 3)) {
2479
        q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2480
        if (q2 && q2 != q1)
2481
            a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2482
    }
2483
    if (a_avail && c_avail && (n != 3)) {
2484
        int off = mb_pos;
2485
        if (n != 1)
2486
            off--;
2487
        if (n != 2)
2488
            off -= s->mb_stride;
2489
        q2 = s->current_picture.qscale_table[off];
2490
        if (q2 && q2 != q1)
2491
            b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2492
    }
2493
 
2494
    if (a_avail && c_avail) {
2495
        if (abs(a - b) <= abs(b - c)) {
2496
            pred     = c;
2497
            *dir_ptr = 1; // left
2498
        } else {
2499
            pred     = a;
2500
            *dir_ptr = 0; // top
2501
        }
2502
    } else if (a_avail) {
2503
        pred     = a;
2504
        *dir_ptr = 0; // top
2505
    } else if (c_avail) {
2506
        pred     = c;
2507
        *dir_ptr = 1; // left
2508
    } else {
2509
        pred     = 0;
2510
        *dir_ptr = 1; // left
2511
    }
2512
 
2513
    /* update predictor */
2514
    *dc_val_ptr = &dc_val[0];
2515
    return pred;
2516
}
2517
 
2518
/** @} */ // Block group
2519
 
2520
/**
2521
 * @name VC1 Macroblock-level functions in Simple/Main Profiles
2522
 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2523
 * @{
2524
 */
2525
 
2526
static inline int vc1_coded_block_pred(MpegEncContext * s, int n,
2527
                                       uint8_t **coded_block_ptr)
2528
{
2529
    int xy, wrap, pred, a, b, c;
2530
 
2531
    xy   = s->block_index[n];
2532
    wrap = s->b8_stride;
2533
 
2534
    /* B C
2535
     * A X
2536
     */
2537
    a = s->coded_block[xy - 1       ];
2538
    b = s->coded_block[xy - 1 - wrap];
2539
    c = s->coded_block[xy     - wrap];
2540
 
2541
    if (b == c) {
2542
        pred = a;
2543
    } else {
2544
        pred = c;
2545
    }
2546
 
2547
    /* store value */
2548
    *coded_block_ptr = &s->coded_block[xy];
2549
 
2550
    return pred;
2551
}
2552
 
2553
/**
2554
 * Decode one AC coefficient
2555
 * @param v The VC1 context
2556
 * @param last Last coefficient
2557
 * @param skip How much zero coefficients to skip
2558
 * @param value Decoded AC coefficient value
2559
 * @param codingset set of VLC to decode data
2560
 * @see 8.1.3.4
2561
 */
2562
static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
2563
                                int *value, int codingset)
2564
{
2565
    GetBitContext *gb = &v->s.gb;
2566
    int index, escape, run = 0, level = 0, lst = 0;
2567
 
2568
    index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2569
    if (index != ff_vc1_ac_sizes[codingset] - 1) {
2570
        run   = vc1_index_decode_table[codingset][index][0];
2571
        level = vc1_index_decode_table[codingset][index][1];
2572
        lst   = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
2573
        if (get_bits1(gb))
2574
            level = -level;
2575
    } else {
2576
        escape = decode210(gb);
2577
        if (escape != 2) {
2578
            index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2579
            run   = vc1_index_decode_table[codingset][index][0];
2580
            level = vc1_index_decode_table[codingset][index][1];
2581
            lst   = index >= vc1_last_decode_table[codingset];
2582
            if (escape == 0) {
2583
                if (lst)
2584
                    level += vc1_last_delta_level_table[codingset][run];
2585
                else
2586
                    level += vc1_delta_level_table[codingset][run];
2587
            } else {
2588
                if (lst)
2589
                    run += vc1_last_delta_run_table[codingset][level] + 1;
2590
                else
2591
                    run += vc1_delta_run_table[codingset][level] + 1;
2592
            }
2593
            if (get_bits1(gb))
2594
                level = -level;
2595
        } else {
2596
            int sign;
2597
            lst = get_bits1(gb);
2598
            if (v->s.esc3_level_length == 0) {
2599
                if (v->pq < 8 || v->dquantfrm) { // table 59
2600
                    v->s.esc3_level_length = get_bits(gb, 3);
2601
                    if (!v->s.esc3_level_length)
2602
                        v->s.esc3_level_length = get_bits(gb, 2) + 8;
2603
                } else { // table 60
2604
                    v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
2605
                }
2606
                v->s.esc3_run_length = 3 + get_bits(gb, 2);
2607
            }
2608
            run   = get_bits(gb, v->s.esc3_run_length);
2609
            sign  = get_bits1(gb);
2610
            level = get_bits(gb, v->s.esc3_level_length);
2611
            if (sign)
2612
                level = -level;
2613
        }
2614
    }
2615
 
2616
    *last  = lst;
2617
    *skip  = run;
2618
    *value = level;
2619
}
2620
 
2621
/** Decode intra block in intra frames - should be faster than decode_intra_block
2622
 * @param v VC1Context
2623
 * @param block block to decode
2624
 * @param[in] n subblock index
2625
 * @param coded are AC coeffs present or not
2626
 * @param codingset set of VLC to decode data
2627
 */
2628
static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
2629
                              int coded, int codingset)
2630
{
2631
    GetBitContext *gb = &v->s.gb;
2632
    MpegEncContext *s = &v->s;
2633
    int dc_pred_dir = 0; /* Direction of the DC prediction used */
2634
    int i;
2635
    int16_t *dc_val;
2636
    int16_t *ac_val, *ac_val2;
2637
    int dcdiff;
2638
 
2639
    /* Get DC differential */
2640
    if (n < 4) {
2641
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2642
    } else {
2643
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2644
    }
2645
    if (dcdiff < 0) {
2646
        av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2647
        return -1;
2648
    }
2649
    if (dcdiff) {
2650
        if (dcdiff == 119 /* ESC index value */) {
2651
            /* TODO: Optimize */
2652
            if (v->pq == 1)      dcdiff = get_bits(gb, 10);
2653
            else if (v->pq == 2) dcdiff = get_bits(gb, 9);
2654
            else                 dcdiff = get_bits(gb, 8);
2655
        } else {
2656
            if (v->pq == 1)
2657
                dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2658
            else if (v->pq == 2)
2659
                dcdiff = (dcdiff << 1) + get_bits1(gb)   - 1;
2660
        }
2661
        if (get_bits1(gb))
2662
            dcdiff = -dcdiff;
2663
    }
2664
 
2665
    /* Prediction */
2666
    dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2667
    *dc_val = dcdiff;
2668
 
2669
    /* Store the quantized DC coeff, used for prediction */
2670
    if (n < 4) {
2671
        block[0] = dcdiff * s->y_dc_scale;
2672
    } else {
2673
        block[0] = dcdiff * s->c_dc_scale;
2674
    }
2675
    /* Skip ? */
2676
    if (!coded) {
2677
        goto not_coded;
2678
    }
2679
 
2680
    // AC Decoding
2681
    i = 1;
2682
 
2683
    {
2684
        int last = 0, skip, value;
2685
        const uint8_t *zz_table;
2686
        int scale;
2687
        int k;
2688
 
2689
        scale = v->pq * 2 + v->halfpq;
2690
 
2691
        if (v->s.ac_pred) {
2692
            if (!dc_pred_dir)
2693
                zz_table = v->zz_8x8[2];
2694
            else
2695
                zz_table = v->zz_8x8[3];
2696
        } else
2697
            zz_table = v->zz_8x8[1];
2698
 
2699
        ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
2700
        ac_val2 = ac_val;
2701
        if (dc_pred_dir) // left
2702
            ac_val -= 16;
2703
        else // top
2704
            ac_val -= 16 * s->block_wrap[n];
2705
 
2706
        while (!last) {
2707
            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2708
            i += skip;
2709
            if (i > 63)
2710
                break;
2711
            block[zz_table[i++]] = value;
2712
        }
2713
 
2714
        /* apply AC prediction if needed */
2715
        if (s->ac_pred) {
2716
            if (dc_pred_dir) { // left
2717
                for (k = 1; k < 8; k++)
2718
                    block[k << v->left_blk_sh] += ac_val[k];
2719
            } else { // top
2720
                for (k = 1; k < 8; k++)
2721
                    block[k << v->top_blk_sh] += ac_val[k + 8];
2722
            }
2723
        }
2724
        /* save AC coeffs for further prediction */
2725
        for (k = 1; k < 8; k++) {
2726
            ac_val2[k]     = block[k << v->left_blk_sh];
2727
            ac_val2[k + 8] = block[k << v->top_blk_sh];
2728
        }
2729
 
2730
        /* scale AC coeffs */
2731
        for (k = 1; k < 64; k++)
2732
            if (block[k]) {
2733
                block[k] *= scale;
2734
                if (!v->pquantizer)
2735
                    block[k] += (block[k] < 0) ? -v->pq : v->pq;
2736
            }
2737
 
2738
        if (s->ac_pred) i = 63;
2739
    }
2740
 
2741
not_coded:
2742
    if (!coded) {
2743
        int k, scale;
2744
        ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
2745
        ac_val2 = ac_val;
2746
 
2747
        i = 0;
2748
        scale = v->pq * 2 + v->halfpq;
2749
        memset(ac_val2, 0, 16 * 2);
2750
        if (dc_pred_dir) { // left
2751
            ac_val -= 16;
2752
            if (s->ac_pred)
2753
                memcpy(ac_val2, ac_val, 8 * 2);
2754
        } else { // top
2755
            ac_val -= 16 * s->block_wrap[n];
2756
            if (s->ac_pred)
2757
                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2758
        }
2759
 
2760
        /* apply AC prediction if needed */
2761
        if (s->ac_pred) {
2762
            if (dc_pred_dir) { //left
2763
                for (k = 1; k < 8; k++) {
2764
                    block[k << v->left_blk_sh] = ac_val[k] * scale;
2765
                    if (!v->pquantizer && block[k << v->left_blk_sh])
2766
                        block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
2767
                }
2768
            } else { // top
2769
                for (k = 1; k < 8; k++) {
2770
                    block[k << v->top_blk_sh] = ac_val[k + 8] * scale;
2771
                    if (!v->pquantizer && block[k << v->top_blk_sh])
2772
                        block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq;
2773
                }
2774
            }
2775
            i = 63;
2776
        }
2777
    }
2778
    s->block_last_index[n] = i;
2779
 
2780
    return 0;
2781
}
2782
 
2783
/** Decode intra block in intra frames - should be faster than decode_intra_block
2784
 * @param v VC1Context
2785
 * @param block block to decode
2786
 * @param[in] n subblock number
2787
 * @param coded are AC coeffs present or not
2788
 * @param codingset set of VLC to decode data
2789
 * @param mquant quantizer value for this macroblock
2790
 */
2791
static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n,
2792
                                  int coded, int codingset, int mquant)
2793
{
2794
    GetBitContext *gb = &v->s.gb;
2795
    MpegEncContext *s = &v->s;
2796
    int dc_pred_dir = 0; /* Direction of the DC prediction used */
2797
    int i;
2798
    int16_t *dc_val = NULL;
2799
    int16_t *ac_val, *ac_val2;
2800
    int dcdiff;
2801
    int a_avail = v->a_avail, c_avail = v->c_avail;
2802
    int use_pred = s->ac_pred;
2803
    int scale;
2804
    int q1, q2 = 0;
2805
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2806
 
2807
    /* Get DC differential */
2808
    if (n < 4) {
2809
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2810
    } else {
2811
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2812
    }
2813
    if (dcdiff < 0) {
2814
        av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2815
        return -1;
2816
    }
2817
    if (dcdiff) {
2818
        if (dcdiff == 119 /* ESC index value */) {
2819
            /* TODO: Optimize */
2820
            if (mquant == 1)      dcdiff = get_bits(gb, 10);
2821
            else if (mquant == 2) dcdiff = get_bits(gb, 9);
2822
            else                  dcdiff = get_bits(gb, 8);
2823
        } else {
2824
            if (mquant == 1)
2825
                dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2826
            else if (mquant == 2)
2827
                dcdiff = (dcdiff << 1) + get_bits1(gb)   - 1;
2828
        }
2829
        if (get_bits1(gb))
2830
            dcdiff = -dcdiff;
2831
    }
2832
 
2833
    /* Prediction */
2834
    dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2835
    *dc_val = dcdiff;
2836
 
2837
    /* Store the quantized DC coeff, used for prediction */
2838
    if (n < 4) {
2839
        block[0] = dcdiff * s->y_dc_scale;
2840
    } else {
2841
        block[0] = dcdiff * s->c_dc_scale;
2842
    }
2843
 
2844
    //AC Decoding
2845
    i = 1;
2846
 
2847
    /* check if AC is needed at all */
2848
    if (!a_avail && !c_avail)
2849
        use_pred = 0;
2850
    ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
2851
    ac_val2 = ac_val;
2852
 
2853
    scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
2854
 
2855
    if (dc_pred_dir) // left
2856
        ac_val -= 16;
2857
    else // top
2858
        ac_val -= 16 * s->block_wrap[n];
2859
 
2860
    q1 = s->current_picture.qscale_table[mb_pos];
2861
    if ( dc_pred_dir && c_avail && mb_pos)
2862
        q2 = s->current_picture.qscale_table[mb_pos - 1];
2863
    if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
2864
        q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2865
    if ( dc_pred_dir && n == 1)
2866
        q2 = q1;
2867
    if (!dc_pred_dir && n == 2)
2868
        q2 = q1;
2869
    if (n == 3)
2870
        q2 = q1;
2871
 
2872
    if (coded) {
2873
        int last = 0, skip, value;
2874
        const uint8_t *zz_table;
2875
        int k;
2876
 
2877
        if (v->s.ac_pred) {
2878
            if (!use_pred && v->fcm == ILACE_FRAME) {
2879
                zz_table = v->zzi_8x8;
2880
            } else {
2881
                if (!dc_pred_dir) // top
2882
                    zz_table = v->zz_8x8[2];
2883
                else // left
2884
                    zz_table = v->zz_8x8[3];
2885
            }
2886
        } else {
2887
            if (v->fcm != ILACE_FRAME)
2888
                zz_table = v->zz_8x8[1];
2889
            else
2890
                zz_table = v->zzi_8x8;
2891
        }
2892
 
2893
        while (!last) {
2894
            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2895
            i += skip;
2896
            if (i > 63)
2897
                break;
2898
            block[zz_table[i++]] = value;
2899
        }
2900
 
2901
        /* apply AC prediction if needed */
2902
        if (use_pred) {
2903
            /* scale predictors if needed*/
2904
            if (q2 && q1 != q2) {
2905
                q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2906
                q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2907
 
2908
                if (q1 < 1)
2909
                    return AVERROR_INVALIDDATA;
2910
                if (dc_pred_dir) { // left
2911
                    for (k = 1; k < 8; k++)
2912
                        block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2913
                } else { // top
2914
                    for (k = 1; k < 8; k++)
2915
                        block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2916
                }
2917
            } else {
2918
                if (dc_pred_dir) { //left
2919
                    for (k = 1; k < 8; k++)
2920
                        block[k << v->left_blk_sh] += ac_val[k];
2921
                } else { //top
2922
                    for (k = 1; k < 8; k++)
2923
                        block[k << v->top_blk_sh] += ac_val[k + 8];
2924
                }
2925
            }
2926
        }
2927
        /* save AC coeffs for further prediction */
2928
        for (k = 1; k < 8; k++) {
2929
            ac_val2[k    ] = block[k << v->left_blk_sh];
2930
            ac_val2[k + 8] = block[k << v->top_blk_sh];
2931
        }
2932
 
2933
        /* scale AC coeffs */
2934
        for (k = 1; k < 64; k++)
2935
            if (block[k]) {
2936
                block[k] *= scale;
2937
                if (!v->pquantizer)
2938
                    block[k] += (block[k] < 0) ? -mquant : mquant;
2939
            }
2940
 
2941
        if (use_pred) i = 63;
2942
    } else { // no AC coeffs
2943
        int k;
2944
 
2945
        memset(ac_val2, 0, 16 * 2);
2946
        if (dc_pred_dir) { // left
2947
            if (use_pred) {
2948
                memcpy(ac_val2, ac_val, 8 * 2);
2949
                if (q2 && q1 != q2) {
2950
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2951
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2952
                    if (q1 < 1)
2953
                        return AVERROR_INVALIDDATA;
2954
                    for (k = 1; k < 8; k++)
2955
                        ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2956
                }
2957
            }
2958
        } else { // top
2959
            if (use_pred) {
2960
                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2961
                if (q2 && q1 != q2) {
2962
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2963
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2964
                    if (q1 < 1)
2965
                        return AVERROR_INVALIDDATA;
2966
                    for (k = 1; k < 8; k++)
2967
                        ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2968
                }
2969
            }
2970
        }
2971
 
2972
        /* apply AC prediction if needed */
2973
        if (use_pred) {
2974
            if (dc_pred_dir) { // left
2975
                for (k = 1; k < 8; k++) {
2976
                    block[k << v->left_blk_sh] = ac_val2[k] * scale;
2977
                    if (!v->pquantizer && block[k << v->left_blk_sh])
2978
                        block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
2979
                }
2980
            } else { // top
2981
                for (k = 1; k < 8; k++) {
2982
                    block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
2983
                    if (!v->pquantizer && block[k << v->top_blk_sh])
2984
                        block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
2985
                }
2986
            }
2987
            i = 63;
2988
        }
2989
    }
2990
    s->block_last_index[n] = i;
2991
 
2992
    return 0;
2993
}
2994
 
2995
/** Decode intra block in inter frames - more generic version than vc1_decode_i_block
2996
 * @param v VC1Context
2997
 * @param block block to decode
2998
 * @param[in] n subblock index
2999
 * @param coded are AC coeffs present or not
3000
 * @param mquant block quantizer
3001
 * @param codingset set of VLC to decode data
3002
 */
3003
static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n,
3004
                                  int coded, int mquant, int codingset)
3005
{
3006
    GetBitContext *gb = &v->s.gb;
3007
    MpegEncContext *s = &v->s;
3008
    int dc_pred_dir = 0; /* Direction of the DC prediction used */
3009
    int i;
3010
    int16_t *dc_val = NULL;
3011
    int16_t *ac_val, *ac_val2;
3012
    int dcdiff;
3013
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3014
    int a_avail = v->a_avail, c_avail = v->c_avail;
3015
    int use_pred = s->ac_pred;
3016
    int scale;
3017
    int q1, q2 = 0;
3018
 
3019
    s->dsp.clear_block(block);
3020
 
3021
    /* XXX: Guard against dumb values of mquant */
3022
    mquant = (mquant < 1) ? 0 : ((mquant > 31) ? 31 : mquant);
3023
 
3024
    /* Set DC scale - y and c use the same */
3025
    s->y_dc_scale = s->y_dc_scale_table[mquant];
3026
    s->c_dc_scale = s->c_dc_scale_table[mquant];
3027
 
3028
    /* Get DC differential */
3029
    if (n < 4) {
3030
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3031
    } else {
3032
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3033
    }
3034
    if (dcdiff < 0) {
3035
        av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
3036
        return -1;
3037
    }
3038
    if (dcdiff) {
3039
        if (dcdiff == 119 /* ESC index value */) {
3040
            /* TODO: Optimize */
3041
            if (mquant == 1)      dcdiff = get_bits(gb, 10);
3042
            else if (mquant == 2) dcdiff = get_bits(gb, 9);
3043
            else                  dcdiff = get_bits(gb, 8);
3044
        } else {
3045
            if (mquant == 1)
3046
                dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
3047
            else if (mquant == 2)
3048
                dcdiff = (dcdiff << 1) + get_bits1(gb)   - 1;
3049
        }
3050
        if (get_bits1(gb))
3051
            dcdiff = -dcdiff;
3052
    }
3053
 
3054
    /* Prediction */
3055
    dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
3056
    *dc_val = dcdiff;
3057
 
3058
    /* Store the quantized DC coeff, used for prediction */
3059
 
3060
    if (n < 4) {
3061
        block[0] = dcdiff * s->y_dc_scale;
3062
    } else {
3063
        block[0] = dcdiff * s->c_dc_scale;
3064
    }
3065
 
3066
    //AC Decoding
3067
    i = 1;
3068
 
3069
    /* check if AC is needed at all and adjust direction if needed */
3070
    if (!a_avail) dc_pred_dir = 1;
3071
    if (!c_avail) dc_pred_dir = 0;
3072
    if (!a_avail && !c_avail) use_pred = 0;
3073
    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
3074
    ac_val2 = ac_val;
3075
 
3076
    scale = mquant * 2 + v->halfpq;
3077
 
3078
    if (dc_pred_dir) //left
3079
        ac_val -= 16;
3080
    else //top
3081
        ac_val -= 16 * s->block_wrap[n];
3082
 
3083
    q1 = s->current_picture.qscale_table[mb_pos];
3084
    if (dc_pred_dir && c_avail && mb_pos)
3085
        q2 = s->current_picture.qscale_table[mb_pos - 1];
3086
    if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
3087
        q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
3088
    if ( dc_pred_dir && n == 1)
3089
        q2 = q1;
3090
    if (!dc_pred_dir && n == 2)
3091
        q2 = q1;
3092
    if (n == 3) q2 = q1;
3093
 
3094
    if (coded) {
3095
        int last = 0, skip, value;
3096
        int k;
3097
 
3098
        while (!last) {
3099
            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
3100
            i += skip;
3101
            if (i > 63)
3102
                break;
3103
            if (v->fcm == PROGRESSIVE)
3104
                block[v->zz_8x8[0][i++]] = value;
3105
            else {
3106
                if (use_pred && (v->fcm == ILACE_FRAME)) {
3107
                    if (!dc_pred_dir) // top
3108
                        block[v->zz_8x8[2][i++]] = value;
3109
                    else // left
3110
                        block[v->zz_8x8[3][i++]] = value;
3111
                } else {
3112
                    block[v->zzi_8x8[i++]] = value;
3113
                }
3114
            }
3115
        }
3116
 
3117
        /* apply AC prediction if needed */
3118
        if (use_pred) {
3119
            /* scale predictors if needed*/
3120
            if (q2 && q1 != q2) {
3121
                q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3122
                q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3123
 
3124
                if (q1 < 1)
3125
                    return AVERROR_INVALIDDATA;
3126
                if (dc_pred_dir) { // left
3127
                    for (k = 1; k < 8; k++)
3128
                        block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3129
                } else { //top
3130
                    for (k = 1; k < 8; k++)
3131
                        block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3132
                }
3133
            } else {
3134
                if (dc_pred_dir) { // left
3135
                    for (k = 1; k < 8; k++)
3136
                        block[k << v->left_blk_sh] += ac_val[k];
3137
                } else { // top
3138
                    for (k = 1; k < 8; k++)
3139
                        block[k << v->top_blk_sh] += ac_val[k + 8];
3140
                }
3141
            }
3142
        }
3143
        /* save AC coeffs for further prediction */
3144
        for (k = 1; k < 8; k++) {
3145
            ac_val2[k    ] = block[k << v->left_blk_sh];
3146
            ac_val2[k + 8] = block[k << v->top_blk_sh];
3147
        }
3148
 
3149
        /* scale AC coeffs */
3150
        for (k = 1; k < 64; k++)
3151
            if (block[k]) {
3152
                block[k] *= scale;
3153
                if (!v->pquantizer)
3154
                    block[k] += (block[k] < 0) ? -mquant : mquant;
3155
            }
3156
 
3157
        if (use_pred) i = 63;
3158
    } else { // no AC coeffs
3159
        int k;
3160
 
3161
        memset(ac_val2, 0, 16 * 2);
3162
        if (dc_pred_dir) { // left
3163
            if (use_pred) {
3164
                memcpy(ac_val2, ac_val, 8 * 2);
3165
                if (q2 && q1 != q2) {
3166
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3167
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3168
                    if (q1 < 1)
3169
                        return AVERROR_INVALIDDATA;
3170
                    for (k = 1; k < 8; k++)
3171
                        ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3172
                }
3173
            }
3174
        } else { // top
3175
            if (use_pred) {
3176
                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
3177
                if (q2 && q1 != q2) {
3178
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3179
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3180
                    if (q1 < 1)
3181
                        return AVERROR_INVALIDDATA;
3182
                    for (k = 1; k < 8; k++)
3183
                        ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3184
                }
3185
            }
3186
        }
3187
 
3188
        /* apply AC prediction if needed */
3189
        if (use_pred) {
3190
            if (dc_pred_dir) { // left
3191
                for (k = 1; k < 8; k++) {
3192
                    block[k << v->left_blk_sh] = ac_val2[k] * scale;
3193
                    if (!v->pquantizer && block[k << v->left_blk_sh])
3194
                        block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
3195
                }
3196
            } else { // top
3197
                for (k = 1; k < 8; k++) {
3198
                    block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
3199
                    if (!v->pquantizer && block[k << v->top_blk_sh])
3200
                        block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
3201
                }
3202
            }
3203
            i = 63;
3204
        }
3205
    }
3206
    s->block_last_index[n] = i;
3207
 
3208
    return 0;
3209
}
3210
 
3211
/** Decode P block
3212
 */
3213
static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n,
3214
                              int mquant, int ttmb, int first_block,
3215
                              uint8_t *dst, int linesize, int skip_block,
3216
                              int *ttmb_out)
3217
{
3218
    MpegEncContext *s = &v->s;
3219
    GetBitContext *gb = &s->gb;
3220
    int i, j;
3221
    int subblkpat = 0;
3222
    int scale, off, idx, last, skip, value;
3223
    int ttblk = ttmb & 7;
3224
    int pat = 0;
3225
 
3226
    s->dsp.clear_block(block);
3227
 
3228
    if (ttmb == -1) {
3229
        ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
3230
    }
3231
    if (ttblk == TT_4X4) {
3232
        subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
3233
    }
3234
    if ((ttblk != TT_8X8 && ttblk != TT_4X4)
3235
        && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
3236
            || (!v->res_rtm_flag && !first_block))) {
3237
        subblkpat = decode012(gb);
3238
        if (subblkpat)
3239
            subblkpat ^= 3; // swap decoded pattern bits
3240
        if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM)
3241
            ttblk = TT_8X4;
3242
        if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT)
3243
            ttblk = TT_4X8;
3244
    }
3245
    scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
3246
 
3247
    // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
3248
    if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
3249
        subblkpat = 2 - (ttblk == TT_8X4_TOP);
3250
        ttblk     = TT_8X4;
3251
    }
3252
    if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3253
        subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3254
        ttblk     = TT_4X8;
3255
    }
3256
    switch (ttblk) {
3257
    case TT_8X8:
3258
        pat  = 0xF;
3259
        i    = 0;
3260
        last = 0;
3261
        while (!last) {
3262
            vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3263
            i += skip;
3264
            if (i > 63)
3265
                break;
3266
            if (!v->fcm)
3267
                idx = v->zz_8x8[0][i++];
3268
            else
3269
                idx = v->zzi_8x8[i++];
3270
            block[idx] = value * scale;
3271
            if (!v->pquantizer)
3272
                block[idx] += (block[idx] < 0) ? -mquant : mquant;
3273
        }
3274
        if (!skip_block) {
3275
            if (i == 1)
3276
                v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
3277
            else {
3278
                v->vc1dsp.vc1_inv_trans_8x8(block);
3279
                s->dsp.add_pixels_clamped(block, dst, linesize);
3280
            }
3281
        }
3282
        break;
3283
    case TT_4X4:
3284
        pat = ~subblkpat & 0xF;
3285
        for (j = 0; j < 4; j++) {
3286
            last = subblkpat & (1 << (3 - j));
3287
            i    = 0;
3288
            off  = (j & 1) * 4 + (j & 2) * 16;
3289
            while (!last) {
3290
                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3291
                i += skip;
3292
                if (i > 15)
3293
                    break;
3294
                if (!v->fcm)
3295
                    idx = ff_vc1_simple_progressive_4x4_zz[i++];
3296
                else
3297
                    idx = ff_vc1_adv_interlaced_4x4_zz[i++];
3298
                block[idx + off] = value * scale;
3299
                if (!v->pquantizer)
3300
                    block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3301
            }
3302
            if (!(subblkpat & (1 << (3 - j))) && !skip_block) {
3303
                if (i == 1)
3304
                    v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
3305
                else
3306
                    v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) *  2 * linesize, linesize, block + off);
3307
            }
3308
        }
3309
        break;
3310
    case TT_8X4:
3311
        pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF;
3312
        for (j = 0; j < 2; j++) {
3313
            last = subblkpat & (1 << (1 - j));
3314
            i    = 0;
3315
            off  = j * 32;
3316
            while (!last) {
3317
                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3318
                i += skip;
3319
                if (i > 31)
3320
                    break;
3321
                if (!v->fcm)
3322
                    idx = v->zz_8x4[i++] + off;
3323
                else
3324
                    idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
3325
                block[idx] = value * scale;
3326
                if (!v->pquantizer)
3327
                    block[idx] += (block[idx] < 0) ? -mquant : mquant;
3328
            }
3329
            if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
3330
                if (i == 1)
3331
                    v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off);
3332
                else
3333
                    v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off);
3334
            }
3335
        }
3336
        break;
3337
    case TT_4X8:
3338
        pat = ~(subblkpat * 5) & 0xF;
3339
        for (j = 0; j < 2; j++) {
3340
            last = subblkpat & (1 << (1 - j));
3341
            i    = 0;
3342
            off  = j * 4;
3343
            while (!last) {
3344
                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3345
                i += skip;
3346
                if (i > 31)
3347
                    break;
3348
                if (!v->fcm)
3349
                    idx = v->zz_4x8[i++] + off;
3350
                else
3351
                    idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
3352
                block[idx] = value * scale;
3353
                if (!v->pquantizer)
3354
                    block[idx] += (block[idx] < 0) ? -mquant : mquant;
3355
            }
3356
            if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
3357
                if (i == 1)
3358
                    v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off);
3359
                else
3360
                    v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
3361
            }
3362
        }
3363
        break;
3364
    }
3365
    if (ttmb_out)
3366
        *ttmb_out |= ttblk << (n * 4);
3367
    return pat;
3368
}
3369
 
3370
/** @} */ // Macroblock group
3371
 
3372
static const int size_table  [6] = { 0, 2, 3, 4,  5,  8 };
3373
static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3374
 
3375
static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
3376
{
3377
    MpegEncContext *s  = &v->s;
3378
    int mb_cbp         = v->cbp[s->mb_x - s->mb_stride],
3379
        block_cbp      = mb_cbp      >> (block_num * 4), bottom_cbp,
3380
        mb_is_intra    = v->is_intra[s->mb_x - s->mb_stride],
3381
        block_is_intra = mb_is_intra >> (block_num * 4), bottom_is_intra;
3382
    int idx, linesize  = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
3383
    uint8_t *dst;
3384
 
3385
    if (block_num > 3) {
3386
        dst      = s->dest[block_num - 3];
3387
    } else {
3388
        dst      = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
3389
    }
3390
    if (s->mb_y != s->end_mb_y || block_num < 2) {
3391
        int16_t (*mv)[2];
3392
        int mv_stride;
3393
 
3394
        if (block_num > 3) {
3395
            bottom_cbp      = v->cbp[s->mb_x]      >> (block_num * 4);
3396
            bottom_is_intra = v->is_intra[s->mb_x] >> (block_num * 4);
3397
            mv              = &v->luma_mv[s->mb_x - s->mb_stride];
3398
            mv_stride       = s->mb_stride;
3399
        } else {
3400
            bottom_cbp      = (block_num < 2) ? (mb_cbp               >> ((block_num + 2) * 4))
3401
                                              : (v->cbp[s->mb_x]      >> ((block_num - 2) * 4));
3402
            bottom_is_intra = (block_num < 2) ? (mb_is_intra          >> ((block_num + 2) * 4))
3403
                                              : (v->is_intra[s->mb_x] >> ((block_num - 2) * 4));
3404
            mv_stride       = s->b8_stride;
3405
            mv              = &s->current_picture.motion_val[0][s->block_index[block_num] - 2 * mv_stride];
3406
        }
3407
 
3408
        if (bottom_is_intra & 1 || block_is_intra & 1 ||
3409
            mv[0][0] != mv[mv_stride][0] || mv[0][1] != mv[mv_stride][1]) {
3410
            v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3411
        } else {
3412
            idx = ((bottom_cbp >> 2) | block_cbp) & 3;
3413
            if (idx == 3) {
3414
                v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3415
            } else if (idx) {
3416
                if (idx == 1)
3417
                    v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3418
                else
3419
                    v->vc1dsp.vc1_v_loop_filter4(dst,     linesize, v->pq);
3420
            }
3421
        }
3422
    }
3423
 
3424
    dst -= 4 * linesize;
3425
    ttblk = (v->ttblk[s->mb_x - s->mb_stride] >> (block_num * 4)) & 0xF;
3426
    if (ttblk == TT_4X4 || ttblk == TT_8X4) {
3427
        idx = (block_cbp | (block_cbp >> 2)) & 3;
3428
        if (idx == 3) {
3429
            v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3430
        } else if (idx) {
3431
            if (idx == 1)
3432
                v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3433
            else
3434
                v->vc1dsp.vc1_v_loop_filter4(dst,     linesize, v->pq);
3435
        }
3436
    }
3437
}
3438
 
3439
static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
3440
{
3441
    MpegEncContext *s  = &v->s;
3442
    int mb_cbp         = v->cbp[s->mb_x - 1 - s->mb_stride],
3443
        block_cbp      = mb_cbp      >> (block_num * 4), right_cbp,
3444
        mb_is_intra    = v->is_intra[s->mb_x - 1 - s->mb_stride],
3445
        block_is_intra = mb_is_intra >> (block_num * 4), right_is_intra;
3446
    int idx, linesize  = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
3447
    uint8_t *dst;
3448
 
3449
    if (block_num > 3) {
3450
        dst = s->dest[block_num - 3] - 8 * linesize;
3451
    } else {
3452
        dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
3453
    }
3454
 
3455
    if (s->mb_x != s->mb_width || !(block_num & 5)) {
3456
        int16_t (*mv)[2];
3457
 
3458
        if (block_num > 3) {
3459
            right_cbp      = v->cbp[s->mb_x - s->mb_stride] >> (block_num * 4);
3460
            right_is_intra = v->is_intra[s->mb_x - s->mb_stride] >> (block_num * 4);
3461
            mv             = &v->luma_mv[s->mb_x - s->mb_stride - 1];
3462
        } else {
3463
            right_cbp      = (block_num & 1) ? (v->cbp[s->mb_x - s->mb_stride]      >> ((block_num - 1) * 4))
3464
                                             : (mb_cbp                              >> ((block_num + 1) * 4));
3465
            right_is_intra = (block_num & 1) ? (v->is_intra[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4))
3466
                                             : (mb_is_intra                         >> ((block_num + 1) * 4));
3467
            mv             = &s->current_picture.motion_val[0][s->block_index[block_num] - s->b8_stride * 2 - 2];
3468
        }
3469
        if (block_is_intra & 1 || right_is_intra & 1 || mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1]) {
3470
            v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3471
        } else {
3472
            idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
3473
            if (idx == 5) {
3474
                v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3475
            } else if (idx) {
3476
                if (idx == 1)
3477
                    v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize, linesize, v->pq);
3478
                else
3479
                    v->vc1dsp.vc1_h_loop_filter4(dst,                linesize, v->pq);
3480
            }
3481
        }
3482
    }
3483
 
3484
    dst -= 4;
3485
    ttblk = (v->ttblk[s->mb_x - s->mb_stride - 1] >> (block_num * 4)) & 0xf;
3486
    if (ttblk == TT_4X4 || ttblk == TT_4X8) {
3487
        idx = (block_cbp | (block_cbp >> 1)) & 5;
3488
        if (idx == 5) {
3489
            v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3490
        } else if (idx) {
3491
            if (idx == 1)
3492
                v->vc1dsp.vc1_h_loop_filter4(dst + linesize * 4, linesize, v->pq);
3493
            else
3494
                v->vc1dsp.vc1_h_loop_filter4(dst,                linesize, v->pq);
3495
        }
3496
    }
3497
}
3498
 
3499
static void vc1_apply_p_loop_filter(VC1Context *v)
3500
{
3501
    MpegEncContext *s = &v->s;
3502
    int i;
3503
 
3504
    for (i = 0; i < 6; i++) {
3505
        vc1_apply_p_v_loop_filter(v, i);
3506
    }
3507
 
3508
    /* V always precedes H, therefore we run H one MB before V;
3509
     * at the end of a row, we catch up to complete the row */
3510
    if (s->mb_x) {
3511
        for (i = 0; i < 6; i++) {
3512
            vc1_apply_p_h_loop_filter(v, i);
3513
        }
3514
        if (s->mb_x == s->mb_width - 1) {
3515
            s->mb_x++;
3516
            ff_update_block_index(s);
3517
            for (i = 0; i < 6; i++) {
3518
                vc1_apply_p_h_loop_filter(v, i);
3519
            }
3520
        }
3521
    }
3522
}
3523
 
3524
/** Decode one P-frame MB
3525
 */
3526
static int vc1_decode_p_mb(VC1Context *v)
3527
{
3528
    MpegEncContext *s = &v->s;
3529
    GetBitContext *gb = &s->gb;
3530
    int i, j;
3531
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3532
    int cbp; /* cbp decoding stuff */
3533
    int mqdiff, mquant; /* MB quantization */
3534
    int ttmb = v->ttfrm; /* MB Transform type */
3535
 
3536
    int mb_has_coeffs = 1; /* last_flag */
3537
    int dmv_x, dmv_y; /* Differential MV components */
3538
    int index, index1; /* LUT indexes */
3539
    int val, sign; /* temp values */
3540
    int first_block = 1;
3541
    int dst_idx, off;
3542
    int skipped, fourmv;
3543
    int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
3544
 
3545
    mquant = v->pq; /* lossy initialization */
3546
 
3547
    if (v->mv_type_is_raw)
3548
        fourmv = get_bits1(gb);
3549
    else
3550
        fourmv = v->mv_type_mb_plane[mb_pos];
3551
    if (v->skip_is_raw)
3552
        skipped = get_bits1(gb);
3553
    else
3554
        skipped = v->s.mbskip_table[mb_pos];
3555
 
3556
    if (!fourmv) { /* 1MV mode */
3557
        if (!skipped) {
3558
            GET_MVDATA(dmv_x, dmv_y);
3559
 
3560
            if (s->mb_intra) {
3561
                s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3562
                s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3563
            }
3564
            s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
3565
            vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3566
 
3567
            /* FIXME Set DC val for inter block ? */
3568
            if (s->mb_intra && !mb_has_coeffs) {
3569
                GET_MQUANT();
3570
                s->ac_pred = get_bits1(gb);
3571
                cbp        = 0;
3572
            } else if (mb_has_coeffs) {
3573
                if (s->mb_intra)
3574
                    s->ac_pred = get_bits1(gb);
3575
                cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3576
                GET_MQUANT();
3577
            } else {
3578
                mquant = v->pq;
3579
                cbp    = 0;
3580
            }
3581
            s->current_picture.qscale_table[mb_pos] = mquant;
3582
 
3583
            if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3584
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
3585
                                VC1_TTMB_VLC_BITS, 2);
3586
            if (!s->mb_intra) vc1_mc_1mv(v, 0);
3587
            dst_idx = 0;
3588
            for (i = 0; i < 6; i++) {
3589
                s->dc_val[0][s->block_index[i]] = 0;
3590
                dst_idx += i >> 2;
3591
                val = ((cbp >> (5 - i)) & 1);
3592
                off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3593
                v->mb_type[0][s->block_index[i]] = s->mb_intra;
3594
                if (s->mb_intra) {
3595
                    /* check if prediction blocks A and C are available */
3596
                    v->a_avail = v->c_avail = 0;
3597
                    if (i == 2 || i == 3 || !s->first_slice_line)
3598
                        v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3599
                    if (i == 1 || i == 3 || s->mb_x)
3600
                        v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3601
 
3602
                    vc1_decode_intra_block(v, s->block[i], i, val, mquant,
3603
                                           (i & 4) ? v->codingset2 : v->codingset);
3604
                    if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
3605
                        continue;
3606
                    v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3607
                    if (v->rangeredfrm)
3608
                        for (j = 0; j < 64; j++)
3609
                            s->block[i][j] <<= 1;
3610
                    s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3611
                    if (v->pq >= 9 && v->overlap) {
3612
                        if (v->c_avail)
3613
                            v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3614
                        if (v->a_avail)
3615
                            v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3616
                    }
3617
                    block_cbp   |= 0xF << (i << 2);
3618
                    block_intra |= 1 << i;
3619
                } else if (val) {
3620
                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block,
3621
                                             s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
3622
                                             (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3623
                    block_cbp |= pat << (i << 2);
3624
                    if (!v->ttmbf && ttmb < 8)
3625
                        ttmb = -1;
3626
                    first_block = 0;
3627
                }
3628
            }
3629
        } else { // skipped
3630
            s->mb_intra = 0;
3631
            for (i = 0; i < 6; i++) {
3632
                v->mb_type[0][s->block_index[i]] = 0;
3633
                s->dc_val[0][s->block_index[i]]  = 0;
3634
            }
3635
            s->current_picture.mb_type[mb_pos]      = MB_TYPE_SKIP;
3636
            s->current_picture.qscale_table[mb_pos] = 0;
3637
            vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3638
            vc1_mc_1mv(v, 0);
3639
        }
3640
    } else { // 4MV mode
3641
        if (!skipped /* unskipped MB */) {
3642
            int intra_count = 0, coded_inter = 0;
3643
            int is_intra[6], is_coded[6];
3644
            /* Get CBPCY */
3645
            cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3646
            for (i = 0; i < 6; i++) {
3647
                val = ((cbp >> (5 - i)) & 1);
3648
                s->dc_val[0][s->block_index[i]] = 0;
3649
                s->mb_intra                     = 0;
3650
                if (i < 4) {
3651
                    dmv_x = dmv_y = 0;
3652
                    s->mb_intra   = 0;
3653
                    mb_has_coeffs = 0;
3654
                    if (val) {
3655
                        GET_MVDATA(dmv_x, dmv_y);
3656
                    }
3657
                    vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3658
                    if (!s->mb_intra)
3659
                        vc1_mc_4mv_luma(v, i, 0, 0);
3660
                    intra_count += s->mb_intra;
3661
                    is_intra[i]  = s->mb_intra;
3662
                    is_coded[i]  = mb_has_coeffs;
3663
                }
3664
                if (i & 4) {
3665
                    is_intra[i] = (intra_count >= 3);
3666
                    is_coded[i] = val;
3667
                }
3668
                if (i == 4)
3669
                    vc1_mc_4mv_chroma(v, 0);
3670
                v->mb_type[0][s->block_index[i]] = is_intra[i];
3671
                if (!coded_inter)
3672
                    coded_inter = !is_intra[i] & is_coded[i];
3673
            }
3674
            // if there are no coded blocks then don't do anything more
3675
            dst_idx = 0;
3676
            if (!intra_count && !coded_inter)
3677
                goto end;
3678
            GET_MQUANT();
3679
            s->current_picture.qscale_table[mb_pos] = mquant;
3680
            /* test if block is intra and has pred */
3681
            {
3682
                int intrapred = 0;
3683
                for (i = 0; i < 6; i++)
3684
                    if (is_intra[i]) {
3685
                        if (((!s->first_slice_line || (i == 2 || i == 3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
3686
                            || ((s->mb_x || (i == 1 || i == 3)) && v->mb_type[0][s->block_index[i] - 1])) {
3687
                            intrapred = 1;
3688
                            break;
3689
                        }
3690
                    }
3691
                if (intrapred)
3692
                    s->ac_pred = get_bits1(gb);
3693
                else
3694
                    s->ac_pred = 0;
3695
            }
3696
            if (!v->ttmbf && coded_inter)
3697
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3698
            for (i = 0; i < 6; i++) {
3699
                dst_idx    += i >> 2;
3700
                off         = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3701
                s->mb_intra = is_intra[i];
3702
                if (is_intra[i]) {
3703
                    /* check if prediction blocks A and C are available */
3704
                    v->a_avail = v->c_avail = 0;
3705
                    if (i == 2 || i == 3 || !s->first_slice_line)
3706
                        v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3707
                    if (i == 1 || i == 3 || s->mb_x)
3708
                        v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3709
 
3710
                    vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant,
3711
                                           (i & 4) ? v->codingset2 : v->codingset);
3712
                    if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
3713
                        continue;
3714
                    v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3715
                    if (v->rangeredfrm)
3716
                        for (j = 0; j < 64; j++)
3717
                            s->block[i][j] <<= 1;
3718
                    s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off,
3719
                                                     (i & 4) ? s->uvlinesize : s->linesize);
3720
                    if (v->pq >= 9 && v->overlap) {
3721
                        if (v->c_avail)
3722
                            v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3723
                        if (v->a_avail)
3724
                            v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3725
                    }
3726
                    block_cbp   |= 0xF << (i << 2);
3727
                    block_intra |= 1 << i;
3728
                } else if (is_coded[i]) {
3729
                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
3730
                                             first_block, s->dest[dst_idx] + off,
3731
                                             (i & 4) ? s->uvlinesize : s->linesize,
3732
                                             (i & 4) && (s->flags & CODEC_FLAG_GRAY),
3733
                                             &block_tt);
3734
                    block_cbp |= pat << (i << 2);
3735
                    if (!v->ttmbf && ttmb < 8)
3736
                        ttmb = -1;
3737
                    first_block = 0;
3738
                }
3739
            }
3740
        } else { // skipped MB
3741
            s->mb_intra                               = 0;
3742
            s->current_picture.qscale_table[mb_pos] = 0;
3743
            for (i = 0; i < 6; i++) {
3744
                v->mb_type[0][s->block_index[i]] = 0;
3745
                s->dc_val[0][s->block_index[i]]  = 0;
3746
            }
3747
            for (i = 0; i < 4; i++) {
3748
                vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3749
                vc1_mc_4mv_luma(v, i, 0, 0);
3750
            }
3751
            vc1_mc_4mv_chroma(v, 0);
3752
            s->current_picture.qscale_table[mb_pos] = 0;
3753
        }
3754
    }
3755
end:
3756
    v->cbp[s->mb_x]      = block_cbp;
3757
    v->ttblk[s->mb_x]    = block_tt;
3758
    v->is_intra[s->mb_x] = block_intra;
3759
 
3760
    return 0;
3761
}
3762
 
3763
/* Decode one macroblock in an interlaced frame p picture */
3764
 
3765
static int vc1_decode_p_mb_intfr(VC1Context *v)
3766
{
3767
    MpegEncContext *s = &v->s;
3768
    GetBitContext *gb = &s->gb;
3769
    int i;
3770
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3771
    int cbp = 0; /* cbp decoding stuff */
3772
    int mqdiff, mquant; /* MB quantization */
3773
    int ttmb = v->ttfrm; /* MB Transform type */
3774
 
3775
    int mb_has_coeffs = 1; /* last_flag */
3776
    int dmv_x, dmv_y; /* Differential MV components */
3777
    int val; /* temp value */
3778
    int first_block = 1;
3779
    int dst_idx, off;
3780
    int skipped, fourmv = 0, twomv = 0;
3781
    int block_cbp = 0, pat, block_tt = 0;
3782
    int idx_mbmode = 0, mvbp;
3783
    int stride_y, fieldtx;
3784
 
3785
    mquant = v->pq; /* Lossy initialization */
3786
 
3787
    if (v->skip_is_raw)
3788
        skipped = get_bits1(gb);
3789
    else
3790
        skipped = v->s.mbskip_table[mb_pos];
3791
    if (!skipped) {
3792
        if (v->fourmvswitch)
3793
            idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done
3794
        else
3795
            idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line
3796
        switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
3797
        /* store the motion vector type in a flag (useful later) */
3798
        case MV_PMODE_INTFR_4MV:
3799
            fourmv = 1;
3800
            v->blk_mv_type[s->block_index[0]] = 0;
3801
            v->blk_mv_type[s->block_index[1]] = 0;
3802
            v->blk_mv_type[s->block_index[2]] = 0;
3803
            v->blk_mv_type[s->block_index[3]] = 0;
3804
            break;
3805
        case MV_PMODE_INTFR_4MV_FIELD:
3806
            fourmv = 1;
3807
            v->blk_mv_type[s->block_index[0]] = 1;
3808
            v->blk_mv_type[s->block_index[1]] = 1;
3809
            v->blk_mv_type[s->block_index[2]] = 1;
3810
            v->blk_mv_type[s->block_index[3]] = 1;
3811
            break;
3812
        case MV_PMODE_INTFR_2MV_FIELD:
3813
            twomv = 1;
3814
            v->blk_mv_type[s->block_index[0]] = 1;
3815
            v->blk_mv_type[s->block_index[1]] = 1;
3816
            v->blk_mv_type[s->block_index[2]] = 1;
3817
            v->blk_mv_type[s->block_index[3]] = 1;
3818
            break;
3819
        case MV_PMODE_INTFR_1MV:
3820
            v->blk_mv_type[s->block_index[0]] = 0;
3821
            v->blk_mv_type[s->block_index[1]] = 0;
3822
            v->blk_mv_type[s->block_index[2]] = 0;
3823
            v->blk_mv_type[s->block_index[3]] = 0;
3824
            break;
3825
        }
3826
        if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
3827
            for (i = 0; i < 4; i++) {
3828
                s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
3829
                s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
3830
            }
3831
            s->current_picture.mb_type[mb_pos]                     = MB_TYPE_INTRA;
3832
            s->mb_intra = v->is_intra[s->mb_x] = 1;
3833
            for (i = 0; i < 6; i++)
3834
                v->mb_type[0][s->block_index[i]] = 1;
3835
            fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
3836
            mb_has_coeffs = get_bits1(gb);
3837
            if (mb_has_coeffs)
3838
                cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3839
            v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
3840
            GET_MQUANT();
3841
            s->current_picture.qscale_table[mb_pos] = mquant;
3842
            /* Set DC scale - y and c use the same (not sure if necessary here) */
3843
            s->y_dc_scale = s->y_dc_scale_table[mquant];
3844
            s->c_dc_scale = s->c_dc_scale_table[mquant];
3845
            dst_idx = 0;
3846
            for (i = 0; i < 6; i++) {
3847
                s->dc_val[0][s->block_index[i]] = 0;
3848
                dst_idx += i >> 2;
3849
                val = ((cbp >> (5 - i)) & 1);
3850
                v->mb_type[0][s->block_index[i]] = s->mb_intra;
3851
                v->a_avail = v->c_avail = 0;
3852
                if (i == 2 || i == 3 || !s->first_slice_line)
3853
                    v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3854
                if (i == 1 || i == 3 || s->mb_x)
3855
                    v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3856
 
3857
                vc1_decode_intra_block(v, s->block[i], i, val, mquant,
3858
                                       (i & 4) ? v->codingset2 : v->codingset);
3859
                if ((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3860
                v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3861
                if (i < 4) {
3862
                    stride_y = s->linesize << fieldtx;
3863
                    off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
3864
                } else {
3865
                    stride_y = s->uvlinesize;
3866
                    off = 0;
3867
                }
3868
                s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
3869
                //TODO: loop filter
3870
            }
3871
 
3872
        } else { // inter MB
3873
            mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
3874
            if (mb_has_coeffs)
3875
                cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3876
            if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
3877
                v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
3878
            } else {
3879
                if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV)
3880
                    || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) {
3881
                    v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
3882
                }
3883
            }
3884
            s->mb_intra = v->is_intra[s->mb_x] = 0;
3885
            for (i = 0; i < 6; i++)
3886
                v->mb_type[0][s->block_index[i]] = 0;
3887
            fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1];
3888
            /* for all motion vector read MVDATA and motion compensate each block */
3889
            dst_idx = 0;
3890
            if (fourmv) {
3891
                mvbp = v->fourmvbp;
3892
                for (i = 0; i < 6; i++) {
3893
                    if (i < 4) {
3894
                        dmv_x = dmv_y = 0;
3895
                        val   = ((mvbp >> (3 - i)) & 1);
3896
                        if (val) {
3897
                            get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3898
                        }
3899
                        vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0);
3900
                        vc1_mc_4mv_luma(v, i, 0, 0);
3901
                    } else if (i == 4) {
3902
                        vc1_mc_4mv_chroma4(v, 0, 0, 0);
3903
                    }
3904
                }
3905
            } else if (twomv) {
3906
                mvbp  = v->twomvbp;
3907
                dmv_x = dmv_y = 0;
3908
                if (mvbp & 2) {
3909
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3910
                }
3911
                vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], 0);
3912
                vc1_mc_4mv_luma(v, 0, 0, 0);
3913
                vc1_mc_4mv_luma(v, 1, 0, 0);
3914
                dmv_x = dmv_y = 0;
3915
                if (mvbp & 1) {
3916
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3917
                }
3918
                vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], 0);
3919
                vc1_mc_4mv_luma(v, 2, 0, 0);
3920
                vc1_mc_4mv_luma(v, 3, 0, 0);
3921
                vc1_mc_4mv_chroma4(v, 0, 0, 0);
3922
            } else {
3923
                mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
3924
                dmv_x = dmv_y = 0;
3925
                if (mvbp) {
3926
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3927
                }
3928
                vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
3929
                vc1_mc_1mv(v, 0);
3930
            }
3931
            if (cbp)
3932
                GET_MQUANT();  // p. 227
3933
            s->current_picture.qscale_table[mb_pos] = mquant;
3934
            if (!v->ttmbf && cbp)
3935
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3936
            for (i = 0; i < 6; i++) {
3937
                s->dc_val[0][s->block_index[i]] = 0;
3938
                dst_idx += i >> 2;
3939
                val = ((cbp >> (5 - i)) & 1);
3940
                if (!fieldtx)
3941
                    off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3942
                else
3943
                    off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
3944
                if (val) {
3945
                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
3946
                                             first_block, s->dest[dst_idx] + off,
3947
                                             (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
3948
                                             (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3949
                    block_cbp |= pat << (i << 2);
3950
                    if (!v->ttmbf && ttmb < 8)
3951
                        ttmb = -1;
3952
                    first_block = 0;
3953
                }
3954
            }
3955
        }
3956
    } else { // skipped
3957
        s->mb_intra = v->is_intra[s->mb_x] = 0;
3958
        for (i = 0; i < 6; i++) {
3959
            v->mb_type[0][s->block_index[i]] = 0;
3960
            s->dc_val[0][s->block_index[i]] = 0;
3961
        }
3962
        s->current_picture.mb_type[mb_pos]      = MB_TYPE_SKIP;
3963
        s->current_picture.qscale_table[mb_pos] = 0;
3964
        v->blk_mv_type[s->block_index[0]] = 0;
3965
        v->blk_mv_type[s->block_index[1]] = 0;
3966
        v->blk_mv_type[s->block_index[2]] = 0;
3967
        v->blk_mv_type[s->block_index[3]] = 0;
3968
        vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0);
3969
        vc1_mc_1mv(v, 0);
3970
    }
3971
    if (s->mb_x == s->mb_width - 1)
3972
        memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
3973
    return 0;
3974
}
3975
 
3976
static int vc1_decode_p_mb_intfi(VC1Context *v)
3977
{
3978
    MpegEncContext *s = &v->s;
3979
    GetBitContext *gb = &s->gb;
3980
    int i;
3981
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3982
    int cbp = 0; /* cbp decoding stuff */
3983
    int mqdiff, mquant; /* MB quantization */
3984
    int ttmb = v->ttfrm; /* MB Transform type */
3985
 
3986
    int mb_has_coeffs = 1; /* last_flag */
3987
    int dmv_x, dmv_y; /* Differential MV components */
3988
    int val; /* temp values */
3989
    int first_block = 1;
3990
    int dst_idx, off;
3991
    int pred_flag = 0;
3992
    int block_cbp = 0, pat, block_tt = 0;
3993
    int idx_mbmode = 0;
3994
 
3995
    mquant = v->pq; /* Lossy initialization */
3996
 
3997
    idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
3998
    if (idx_mbmode <= 1) { // intra MB
3999
        s->mb_intra = v->is_intra[s->mb_x] = 1;
4000
        s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
4001
        s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
4002
        s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
4003
        GET_MQUANT();
4004
        s->current_picture.qscale_table[mb_pos] = mquant;
4005
        /* Set DC scale - y and c use the same (not sure if necessary here) */
4006
        s->y_dc_scale = s->y_dc_scale_table[mquant];
4007
        s->c_dc_scale = s->c_dc_scale_table[mquant];
4008
        v->s.ac_pred  = v->acpred_plane[mb_pos] = get_bits1(gb);
4009
        mb_has_coeffs = idx_mbmode & 1;
4010
        if (mb_has_coeffs)
4011
            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
4012
        dst_idx = 0;
4013
        for (i = 0; i < 6; i++) {
4014
            s->dc_val[0][s->block_index[i]]  = 0;
4015
            v->mb_type[0][s->block_index[i]] = 1;
4016
            dst_idx += i >> 2;
4017
            val = ((cbp >> (5 - i)) & 1);
4018
            v->a_avail = v->c_avail = 0;
4019
            if (i == 2 || i == 3 || !s->first_slice_line)
4020
                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4021
            if (i == 1 || i == 3 || s->mb_x)
4022
                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4023
 
4024
            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
4025
                                   (i & 4) ? v->codingset2 : v->codingset);
4026
            if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
4027
                continue;
4028
            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4029
            off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4030
            s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4031
            // TODO: loop filter
4032
        }
4033
    } else {
4034
        s->mb_intra = v->is_intra[s->mb_x] = 0;
4035
        s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
4036
        for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
4037
        if (idx_mbmode <= 5) { // 1-MV
4038
            dmv_x = dmv_y = pred_flag = 0;
4039
            if (idx_mbmode & 1) {
4040
                get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
4041
            }
4042
            vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
4043
            vc1_mc_1mv(v, 0);
4044
            mb_has_coeffs = !(idx_mbmode & 2);
4045
        } else { // 4-MV
4046
            v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4047
            for (i = 0; i < 6; i++) {
4048
                if (i < 4) {
4049
                    dmv_x = dmv_y = pred_flag = 0;
4050
                    val   = ((v->fourmvbp >> (3 - i)) & 1);
4051
                    if (val) {
4052
                        get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
4053
                    }
4054
                    vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
4055
                    vc1_mc_4mv_luma(v, i, 0, 0);
4056
                } else if (i == 4)
4057
                    vc1_mc_4mv_chroma(v, 0);
4058
            }
4059
            mb_has_coeffs = idx_mbmode & 1;
4060
        }
4061
        if (mb_has_coeffs)
4062
            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4063
        if (cbp) {
4064
            GET_MQUANT();
4065
        }
4066
        s->current_picture.qscale_table[mb_pos] = mquant;
4067
        if (!v->ttmbf && cbp) {
4068
            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4069
        }
4070
        dst_idx = 0;
4071
        for (i = 0; i < 6; i++) {
4072
            s->dc_val[0][s->block_index[i]] = 0;
4073
            dst_idx += i >> 2;
4074
            val = ((cbp >> (5 - i)) & 1);
4075
            off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
4076
            if (val) {
4077
                pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4078
                                         first_block, s->dest[dst_idx] + off,
4079
                                         (i & 4) ? s->uvlinesize : s->linesize,
4080
                                         (i & 4) && (s->flags & CODEC_FLAG_GRAY),
4081
                                         &block_tt);
4082
                block_cbp |= pat << (i << 2);
4083
                if (!v->ttmbf && ttmb < 8) ttmb = -1;
4084
                first_block = 0;
4085
            }
4086
        }
4087
    }
4088
    if (s->mb_x == s->mb_width - 1)
4089
        memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
4090
    return 0;
4091
}
4092
 
4093
/** Decode one B-frame MB (in Main profile)
4094
 */
4095
static void vc1_decode_b_mb(VC1Context *v)
4096
{
4097
    MpegEncContext *s = &v->s;
4098
    GetBitContext *gb = &s->gb;
4099
    int i, j;
4100
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4101
    int cbp = 0; /* cbp decoding stuff */
4102
    int mqdiff, mquant; /* MB quantization */
4103
    int ttmb = v->ttfrm; /* MB Transform type */
4104
    int mb_has_coeffs = 0; /* last_flag */
4105
    int index, index1; /* LUT indexes */
4106
    int val, sign; /* temp values */
4107
    int first_block = 1;
4108
    int dst_idx, off;
4109
    int skipped, direct;
4110
    int dmv_x[2], dmv_y[2];
4111
    int bmvtype = BMV_TYPE_BACKWARD;
4112
 
4113
    mquant      = v->pq; /* lossy initialization */
4114
    s->mb_intra = 0;
4115
 
4116
    if (v->dmb_is_raw)
4117
        direct = get_bits1(gb);
4118
    else
4119
        direct = v->direct_mb_plane[mb_pos];
4120
    if (v->skip_is_raw)
4121
        skipped = get_bits1(gb);
4122
    else
4123
        skipped = v->s.mbskip_table[mb_pos];
4124
 
4125
    dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4126
    for (i = 0; i < 6; i++) {
4127
        v->mb_type[0][s->block_index[i]] = 0;
4128
        s->dc_val[0][s->block_index[i]]  = 0;
4129
    }
4130
    s->current_picture.qscale_table[mb_pos] = 0;
4131
 
4132
    if (!direct) {
4133
        if (!skipped) {
4134
            GET_MVDATA(dmv_x[0], dmv_y[0]);
4135
            dmv_x[1] = dmv_x[0];
4136
            dmv_y[1] = dmv_y[0];
4137
        }
4138
        if (skipped || !s->mb_intra) {
4139
            bmvtype = decode012(gb);
4140
            switch (bmvtype) {
4141
            case 0:
4142
                bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
4143
                break;
4144
            case 1:
4145
                bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
4146
                break;
4147
            case 2:
4148
                bmvtype  = BMV_TYPE_INTERPOLATED;
4149
                dmv_x[0] = dmv_y[0] = 0;
4150
            }
4151
        }
4152
    }
4153
    for (i = 0; i < 6; i++)
4154
        v->mb_type[0][s->block_index[i]] = s->mb_intra;
4155
 
4156
    if (skipped) {
4157
        if (direct)
4158
            bmvtype = BMV_TYPE_INTERPOLATED;
4159
        vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4160
        vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4161
        return;
4162
    }
4163
    if (direct) {
4164
        cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4165
        GET_MQUANT();
4166
        s->mb_intra = 0;
4167
        s->current_picture.qscale_table[mb_pos] = mquant;
4168
        if (!v->ttmbf)
4169
            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4170
        dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
4171
        vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4172
        vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4173
    } else {
4174
        if (!mb_has_coeffs && !s->mb_intra) {
4175
            /* no coded blocks - effectively skipped */
4176
            vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4177
            vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4178
            return;
4179
        }
4180
        if (s->mb_intra && !mb_has_coeffs) {
4181
            GET_MQUANT();
4182
            s->current_picture.qscale_table[mb_pos] = mquant;
4183
            s->ac_pred = get_bits1(gb);
4184
            cbp = 0;
4185
            vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4186
        } else {
4187
            if (bmvtype == BMV_TYPE_INTERPOLATED) {
4188
                GET_MVDATA(dmv_x[0], dmv_y[0]);
4189
                if (!mb_has_coeffs) {
4190
                    /* interpolated skipped block */
4191
                    vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4192
                    vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4193
                    return;
4194
                }
4195
            }
4196
            vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4197
            if (!s->mb_intra) {
4198
                vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4199
            }
4200
            if (s->mb_intra)
4201
                s->ac_pred = get_bits1(gb);
4202
            cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4203
            GET_MQUANT();
4204
            s->current_picture.qscale_table[mb_pos] = mquant;
4205
            if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
4206
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4207
        }
4208
    }
4209
    dst_idx = 0;
4210
    for (i = 0; i < 6; i++) {
4211
        s->dc_val[0][s->block_index[i]] = 0;
4212
        dst_idx += i >> 2;
4213
        val = ((cbp >> (5 - i)) & 1);
4214
        off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4215
        v->mb_type[0][s->block_index[i]] = s->mb_intra;
4216
        if (s->mb_intra) {
4217
            /* check if prediction blocks A and C are available */
4218
            v->a_avail = v->c_avail = 0;
4219
            if (i == 2 || i == 3 || !s->first_slice_line)
4220
                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4221
            if (i == 1 || i == 3 || s->mb_x)
4222
                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4223
 
4224
            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
4225
                                   (i & 4) ? v->codingset2 : v->codingset);
4226
            if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
4227
                continue;
4228
            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4229
            if (v->rangeredfrm)
4230
                for (j = 0; j < 64; j++)
4231
                    s->block[i][j] <<= 1;
4232
            s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
4233
        } else if (val) {
4234
            vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4235
                               first_block, s->dest[dst_idx] + off,
4236
                               (i & 4) ? s->uvlinesize : s->linesize,
4237
                               (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
4238
            if (!v->ttmbf && ttmb < 8)
4239
                ttmb = -1;
4240
            first_block = 0;
4241
        }
4242
    }
4243
}
4244
 
4245
/** Decode one B-frame MB (in interlaced field B picture)
4246
 */
4247
static void vc1_decode_b_mb_intfi(VC1Context *v)
4248
{
4249
    MpegEncContext *s = &v->s;
4250
    GetBitContext *gb = &s->gb;
4251
    int i, j;
4252
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4253
    int cbp = 0; /* cbp decoding stuff */
4254
    int mqdiff, mquant; /* MB quantization */
4255
    int ttmb = v->ttfrm; /* MB Transform type */
4256
    int mb_has_coeffs = 0; /* last_flag */
4257
    int val; /* temp value */
4258
    int first_block = 1;
4259
    int dst_idx, off;
4260
    int fwd;
4261
    int dmv_x[2], dmv_y[2], pred_flag[2];
4262
    int bmvtype = BMV_TYPE_BACKWARD;
4263
    int idx_mbmode;
4264
 
4265
    mquant      = v->pq; /* Lossy initialization */
4266
    s->mb_intra = 0;
4267
 
4268
    idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
4269
    if (idx_mbmode <= 1) { // intra MB
4270
        s->mb_intra = v->is_intra[s->mb_x] = 1;
4271
        s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
4272
        s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
4273
        s->current_picture.mb_type[mb_pos + v->mb_off]         = MB_TYPE_INTRA;
4274
        GET_MQUANT();
4275
        s->current_picture.qscale_table[mb_pos] = mquant;
4276
        /* Set DC scale - y and c use the same (not sure if necessary here) */
4277
        s->y_dc_scale = s->y_dc_scale_table[mquant];
4278
        s->c_dc_scale = s->c_dc_scale_table[mquant];
4279
        v->s.ac_pred  = v->acpred_plane[mb_pos] = get_bits1(gb);
4280
        mb_has_coeffs = idx_mbmode & 1;
4281
        if (mb_has_coeffs)
4282
            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
4283
        dst_idx = 0;
4284
        for (i = 0; i < 6; i++) {
4285
            s->dc_val[0][s->block_index[i]] = 0;
4286
            dst_idx += i >> 2;
4287
            val = ((cbp >> (5 - i)) & 1);
4288
            v->mb_type[0][s->block_index[i]] = s->mb_intra;
4289
            v->a_avail                       = v->c_avail = 0;
4290
            if (i == 2 || i == 3 || !s->first_slice_line)
4291
                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4292
            if (i == 1 || i == 3 || s->mb_x)
4293
                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4294
 
4295
            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
4296
                                   (i & 4) ? v->codingset2 : v->codingset);
4297
            if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
4298
                continue;
4299
            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4300
            if (v->rangeredfrm)
4301
                for (j = 0; j < 64; j++)
4302
                    s->block[i][j] <<= 1;
4303
            off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4304
            s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4305
            // TODO: yet to perform loop filter
4306
        }
4307
    } else {
4308
        s->mb_intra = v->is_intra[s->mb_x] = 0;
4309
        s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
4310
        for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
4311
        if (v->fmb_is_raw)
4312
            fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
4313
        else
4314
            fwd = v->forward_mb_plane[mb_pos];
4315
        if (idx_mbmode <= 5) { // 1-MV
4316
            int interpmvp = 0;
4317
            dmv_x[0]     = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4318
            pred_flag[0] = pred_flag[1] = 0;
4319
            if (fwd)
4320
                bmvtype = BMV_TYPE_FORWARD;
4321
            else {
4322
                bmvtype = decode012(gb);
4323
                switch (bmvtype) {
4324
                case 0:
4325
                    bmvtype = BMV_TYPE_BACKWARD;
4326
                    break;
4327
                case 1:
4328
                    bmvtype = BMV_TYPE_DIRECT;
4329
                    break;
4330
                case 2:
4331
                    bmvtype   = BMV_TYPE_INTERPOLATED;
4332
                    interpmvp = get_bits1(gb);
4333
                }
4334
            }
4335
            v->bmvtype = bmvtype;
4336
            if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) {
4337
                get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
4338
            }
4339
            if (interpmvp) {
4340
                get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
4341
            }
4342
            if (bmvtype == BMV_TYPE_DIRECT) {
4343
                dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
4344
                dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
4345
            }
4346
            vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
4347
            vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype);
4348
            mb_has_coeffs = !(idx_mbmode & 2);
4349
        } else { // 4-MV
4350
            if (fwd)
4351
                bmvtype = BMV_TYPE_FORWARD;
4352
            v->bmvtype  = bmvtype;
4353
            v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4354
            for (i = 0; i < 6; i++) {
4355
                if (i < 4) {
4356
                    dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
4357
                    dmv_x[1] = dmv_y[1] = pred_flag[1] = 0;
4358
                    val = ((v->fourmvbp >> (3 - i)) & 1);
4359
                    if (val) {
4360
                        get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD],
4361
                                                 &dmv_y[bmvtype == BMV_TYPE_BACKWARD],
4362
                                             &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
4363
                    }
4364
                    vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag);
4365
                    vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD, 0);
4366
                } else if (i == 4)
4367
                    vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
4368
            }
4369
            mb_has_coeffs = idx_mbmode & 1;
4370
        }
4371
        if (mb_has_coeffs)
4372
            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4373
        if (cbp) {
4374
            GET_MQUANT();
4375
        }
4376
        s->current_picture.qscale_table[mb_pos] = mquant;
4377
        if (!v->ttmbf && cbp) {
4378
            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4379
        }
4380
        dst_idx = 0;
4381
        for (i = 0; i < 6; i++) {
4382
            s->dc_val[0][s->block_index[i]] = 0;
4383
            dst_idx += i >> 2;
4384
            val = ((cbp >> (5 - i)) & 1);
4385
            off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
4386
            if (val) {
4387
                vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4388
                                   first_block, s->dest[dst_idx] + off,
4389
                                   (i & 4) ? s->uvlinesize : s->linesize,
4390
                                   (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
4391
                if (!v->ttmbf && ttmb < 8)
4392
                    ttmb = -1;
4393
                first_block = 0;
4394
            }
4395
        }
4396
    }
4397
}
4398
 
4399
/** Decode one B-frame MB (in interlaced frame B picture)
4400
 */
4401
static int vc1_decode_b_mb_intfr(VC1Context *v)
4402
{
4403
    MpegEncContext *s = &v->s;
4404
    GetBitContext *gb = &s->gb;
4405
    int i, j;
4406
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4407
    int cbp = 0; /* cbp decoding stuff */
4408
    int mqdiff, mquant; /* MB quantization */
4409
    int ttmb = v->ttfrm; /* MB Transform type */
4410
    int mvsw = 0; /* motion vector switch */
4411
    int mb_has_coeffs = 1; /* last_flag */
4412
    int dmv_x, dmv_y; /* Differential MV components */
4413
    int val; /* temp value */
4414
    int first_block = 1;
4415
    int dst_idx, off;
4416
    int skipped, direct, twomv = 0;
4417
    int block_cbp = 0, pat, block_tt = 0;
4418
    int idx_mbmode = 0, mvbp;
4419
    int stride_y, fieldtx;
4420
    int bmvtype = BMV_TYPE_BACKWARD;
4421
    int dir, dir2;
4422
 
4423
    mquant = v->pq; /* Lossy initialization */
4424
    s->mb_intra = 0;
4425
    if (v->skip_is_raw)
4426
        skipped = get_bits1(gb);
4427
    else
4428
        skipped = v->s.mbskip_table[mb_pos];
4429
 
4430
    if (!skipped) {
4431
        idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2);
4432
        if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
4433
            twomv = 1;
4434
            v->blk_mv_type[s->block_index[0]] = 1;
4435
            v->blk_mv_type[s->block_index[1]] = 1;
4436
            v->blk_mv_type[s->block_index[2]] = 1;
4437
            v->blk_mv_type[s->block_index[3]] = 1;
4438
        } else {
4439
            v->blk_mv_type[s->block_index[0]] = 0;
4440
            v->blk_mv_type[s->block_index[1]] = 0;
4441
            v->blk_mv_type[s->block_index[2]] = 0;
4442
            v->blk_mv_type[s->block_index[3]] = 0;
4443
        }
4444
    }
4445
 
4446
    if (v->dmb_is_raw)
4447
        direct = get_bits1(gb);
4448
    else
4449
        direct = v->direct_mb_plane[mb_pos];
4450
 
4451
    if (direct) {
4452
        s->mv[0][0][0] = s->current_picture.motion_val[0][s->block_index[0]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][0], v->bfraction, 0, s->quarter_sample);
4453
        s->mv[0][0][1] = s->current_picture.motion_val[0][s->block_index[0]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][1], v->bfraction, 0, s->quarter_sample);
4454
        s->mv[1][0][0] = s->current_picture.motion_val[1][s->block_index[0]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][0], v->bfraction, 1, s->quarter_sample);
4455
        s->mv[1][0][1] = s->current_picture.motion_val[1][s->block_index[0]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][1], v->bfraction, 1, s->quarter_sample);
4456
 
4457
        if (twomv) {
4458
            s->mv[0][2][0] = s->current_picture.motion_val[0][s->block_index[2]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][0], v->bfraction, 0, s->quarter_sample);
4459
            s->mv[0][2][1] = s->current_picture.motion_val[0][s->block_index[2]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][1], v->bfraction, 0, s->quarter_sample);
4460
            s->mv[1][2][0] = s->current_picture.motion_val[1][s->block_index[2]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][0], v->bfraction, 1, s->quarter_sample);
4461
            s->mv[1][2][1] = s->current_picture.motion_val[1][s->block_index[2]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][1], v->bfraction, 1, s->quarter_sample);
4462
 
4463
            for (i = 1; i < 4; i += 2) {
4464
                s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = s->mv[0][i-1][0];
4465
                s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = s->mv[0][i-1][1];
4466
                s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = s->mv[1][i-1][0];
4467
                s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = s->mv[1][i-1][1];
4468
            }
4469
        } else {
4470
            for (i = 1; i < 4; i++) {
4471
                s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = s->mv[0][0][0];
4472
                s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = s->mv[0][0][1];
4473
                s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = s->mv[1][0][0];
4474
                s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = s->mv[1][0][1];
4475
            }
4476
        }
4477
    }
4478
 
4479
    if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
4480
        for (i = 0; i < 4; i++) {
4481
            s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = 0;
4482
            s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = 0;
4483
            s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
4484
            s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
4485
        }
4486
        s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
4487
        s->mb_intra = v->is_intra[s->mb_x] = 1;
4488
        for (i = 0; i < 6; i++)
4489
            v->mb_type[0][s->block_index[i]] = 1;
4490
        fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
4491
        mb_has_coeffs = get_bits1(gb);
4492
        if (mb_has_coeffs)
4493
            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4494
        v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
4495
        GET_MQUANT();
4496
        s->current_picture.qscale_table[mb_pos] = mquant;
4497
        /* Set DC scale - y and c use the same (not sure if necessary here) */
4498
        s->y_dc_scale = s->y_dc_scale_table[mquant];
4499
        s->c_dc_scale = s->c_dc_scale_table[mquant];
4500
        dst_idx = 0;
4501
        for (i = 0; i < 6; i++) {
4502
            s->dc_val[0][s->block_index[i]] = 0;
4503
            dst_idx += i >> 2;
4504
            val = ((cbp >> (5 - i)) & 1);
4505
            v->mb_type[0][s->block_index[i]] = s->mb_intra;
4506
            v->a_avail = v->c_avail = 0;
4507
            if (i == 2 || i == 3 || !s->first_slice_line)
4508
                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4509
            if (i == 1 || i == 3 || s->mb_x)
4510
                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4511
 
4512
            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
4513
                                   (i & 4) ? v->codingset2 : v->codingset);
4514
            if (i > 3 && (s->flags & CODEC_FLAG_GRAY))
4515
                continue;
4516
            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4517
            if (i < 4) {
4518
                stride_y = s->linesize << fieldtx;
4519
                off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
4520
            } else {
4521
                stride_y = s->uvlinesize;
4522
                off = 0;
4523
            }
4524
            s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
4525
        }
4526
    } else {
4527
        s->mb_intra = v->is_intra[s->mb_x] = 0;
4528
        if (!direct) {
4529
            if (skipped || !s->mb_intra) {
4530
                bmvtype = decode012(gb);
4531
                switch (bmvtype) {
4532
                case 0:
4533
                    bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
4534
                    break;
4535
                case 1:
4536
                    bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
4537
                    break;
4538
                case 2:
4539
                    bmvtype  = BMV_TYPE_INTERPOLATED;
4540
                }
4541
            }
4542
 
4543
            if (twomv && bmvtype != BMV_TYPE_INTERPOLATED)
4544
                mvsw = get_bits1(gb);
4545
        }
4546
 
4547
        if (!skipped) { // inter MB
4548
            mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3];
4549
            if (mb_has_coeffs)
4550
                cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4551
            if (!direct) {
4552
                if (bmvtype == BMV_TYPE_INTERPOLATED && twomv) {
4553
                    v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4554
                } else if (bmvtype == BMV_TYPE_INTERPOLATED || twomv) {
4555
                    v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
4556
                }
4557
            }
4558
 
4559
            for (i = 0; i < 6; i++)
4560
                v->mb_type[0][s->block_index[i]] = 0;
4561
            fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[0][idx_mbmode][1];
4562
            /* for all motion vector read MVDATA and motion compensate each block */
4563
            dst_idx = 0;
4564
            if (direct) {
4565
                if (twomv) {
4566
                    for (i = 0; i < 4; i++) {
4567
                        vc1_mc_4mv_luma(v, i, 0, 0);
4568
                        vc1_mc_4mv_luma(v, i, 1, 1);
4569
                    }
4570
                    vc1_mc_4mv_chroma4(v, 0, 0, 0);
4571
                    vc1_mc_4mv_chroma4(v, 1, 1, 1);
4572
                } else {
4573
                    vc1_mc_1mv(v, 0);
4574
                    vc1_interp_mc(v);
4575
                }
4576
            } else if (twomv && bmvtype == BMV_TYPE_INTERPOLATED) {
4577
                mvbp = v->fourmvbp;
4578
                for (i = 0; i < 4; i++) {
4579
                    dir = i==1 || i==3;
4580
                    dmv_x = dmv_y = 0;
4581
                    val = ((mvbp >> (3 - i)) & 1);
4582
                    if (val)
4583
                        get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4584
                    j = i > 1 ? 2 : 0;
4585
                    vc1_pred_mv_intfr(v, j, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir);
4586
                    vc1_mc_4mv_luma(v, j, dir, dir);
4587
                    vc1_mc_4mv_luma(v, j+1, dir, dir);
4588
                }
4589
 
4590
                vc1_mc_4mv_chroma4(v, 0, 0, 0);
4591
                vc1_mc_4mv_chroma4(v, 1, 1, 1);
4592
            } else if (bmvtype == BMV_TYPE_INTERPOLATED) {
4593
                mvbp = v->twomvbp;
4594
                dmv_x = dmv_y = 0;
4595
                if (mvbp & 2)
4596
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4597
 
4598
                vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
4599
                vc1_mc_1mv(v, 0);
4600
 
4601
                dmv_x = dmv_y = 0;
4602
                if (mvbp & 1)
4603
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4604
 
4605
                vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 1);
4606
                vc1_interp_mc(v);
4607
            } else if (twomv) {
4608
                dir = bmvtype == BMV_TYPE_BACKWARD;
4609
                dir2 = dir;
4610
                if (mvsw)
4611
                    dir2 = !dir;
4612
                mvbp = v->twomvbp;
4613
                dmv_x = dmv_y = 0;
4614
                if (mvbp & 2)
4615
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4616
                vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir);
4617
 
4618
                dmv_x = dmv_y = 0;
4619
                if (mvbp & 1)
4620
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4621
                vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir2);
4622
 
4623
                if (mvsw) {
4624
                    for (i = 0; i < 2; i++) {
4625
                        s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->current_picture.motion_val[dir][s->block_index[i+2]][0] = s->current_picture.motion_val[dir][s->block_index[i]][0];
4626
                        s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->current_picture.motion_val[dir][s->block_index[i+2]][1] = s->current_picture.motion_val[dir][s->block_index[i]][1];
4627
                        s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->current_picture.motion_val[dir2][s->block_index[i]][0] = s->current_picture.motion_val[dir2][s->block_index[i+2]][0];
4628
                        s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->current_picture.motion_val[dir2][s->block_index[i]][1] = s->current_picture.motion_val[dir2][s->block_index[i+2]][1];
4629
                    }
4630
                } else {
4631
                    vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, v->mb_type[0], !dir);
4632
                    vc1_pred_mv_intfr(v, 2, 0, 0, 2, v->range_x, v->range_y, v->mb_type[0], !dir);
4633
                }
4634
 
4635
                vc1_mc_4mv_luma(v, 0, dir, 0);
4636
                vc1_mc_4mv_luma(v, 1, dir, 0);
4637
                vc1_mc_4mv_luma(v, 2, dir2, 0);
4638
                vc1_mc_4mv_luma(v, 3, dir2, 0);
4639
                vc1_mc_4mv_chroma4(v, dir, dir2, 0);
4640
            } else {
4641
                dir = bmvtype == BMV_TYPE_BACKWARD;
4642
 
4643
                mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2];
4644
                dmv_x = dmv_y = 0;
4645
                if (mvbp)
4646
                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4647
 
4648
                vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], dir);
4649
                v->blk_mv_type[s->block_index[0]] = 1;
4650
                v->blk_mv_type[s->block_index[1]] = 1;
4651
                v->blk_mv_type[s->block_index[2]] = 1;
4652
                v->blk_mv_type[s->block_index[3]] = 1;
4653
                vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, 0, !dir);
4654
                for (i = 0; i < 2; i++) {
4655
                    s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->current_picture.motion_val[!dir][s->block_index[i+2]][0] = s->current_picture.motion_val[!dir][s->block_index[i]][0];
4656
                    s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->current_picture.motion_val[!dir][s->block_index[i+2]][1] = s->current_picture.motion_val[!dir][s->block_index[i]][1];
4657
                }
4658
                vc1_mc_1mv(v, dir);
4659
            }
4660
 
4661
            if (cbp)
4662
                GET_MQUANT();  // p. 227
4663
            s->current_picture.qscale_table[mb_pos] = mquant;
4664
            if (!v->ttmbf && cbp)
4665
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4666
            for (i = 0; i < 6; i++) {
4667
                s->dc_val[0][s->block_index[i]] = 0;
4668
                dst_idx += i >> 2;
4669
                val = ((cbp >> (5 - i)) & 1);
4670
                if (!fieldtx)
4671
                    off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4672
                else
4673
                    off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
4674
                if (val) {
4675
                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4676
                                             first_block, s->dest[dst_idx] + off,
4677
                                             (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
4678
                                             (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
4679
                    block_cbp |= pat << (i << 2);
4680
                    if (!v->ttmbf && ttmb < 8)
4681
                        ttmb = -1;
4682
                    first_block = 0;
4683
                }
4684
            }
4685
 
4686
        } else { // skipped
4687
            dir = 0;
4688
            for (i = 0; i < 6; i++) {
4689
                v->mb_type[0][s->block_index[i]] = 0;
4690
                s->dc_val[0][s->block_index[i]] = 0;
4691
            }
4692
            s->current_picture.mb_type[mb_pos]      = MB_TYPE_SKIP;
4693
            s->current_picture.qscale_table[mb_pos] = 0;
4694
            v->blk_mv_type[s->block_index[0]] = 0;
4695
            v->blk_mv_type[s->block_index[1]] = 0;
4696
            v->blk_mv_type[s->block_index[2]] = 0;
4697
            v->blk_mv_type[s->block_index[3]] = 0;
4698
 
4699
            if (!direct) {
4700
                if (bmvtype == BMV_TYPE_INTERPOLATED) {
4701
                    vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0);
4702
                    vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 1);
4703
                } else {
4704
                    dir = bmvtype == BMV_TYPE_BACKWARD;
4705
                    vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], dir);
4706
                    if (mvsw) {
4707
                        int dir2 = dir;
4708
                        if (mvsw)
4709
                            dir2 = !dir;
4710
                        for (i = 0; i < 2; i++) {
4711
                            s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->current_picture.motion_val[dir][s->block_index[i+2]][0] = s->current_picture.motion_val[dir][s->block_index[i]][0];
4712
                            s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->current_picture.motion_val[dir][s->block_index[i+2]][1] = s->current_picture.motion_val[dir][s->block_index[i]][1];
4713
                            s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->current_picture.motion_val[dir2][s->block_index[i]][0] = s->current_picture.motion_val[dir2][s->block_index[i+2]][0];
4714
                            s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->current_picture.motion_val[dir2][s->block_index[i]][1] = s->current_picture.motion_val[dir2][s->block_index[i+2]][1];
4715
                        }
4716
                    } else {
4717
                        v->blk_mv_type[s->block_index[0]] = 1;
4718
                        v->blk_mv_type[s->block_index[1]] = 1;
4719
                        v->blk_mv_type[s->block_index[2]] = 1;
4720
                        v->blk_mv_type[s->block_index[3]] = 1;
4721
                        vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, 0, !dir);
4722
                        for (i = 0; i < 2; i++) {
4723
                            s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->current_picture.motion_val[!dir][s->block_index[i+2]][0] = s->current_picture.motion_val[!dir][s->block_index[i]][0];
4724
                            s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->current_picture.motion_val[!dir][s->block_index[i+2]][1] = s->current_picture.motion_val[!dir][s->block_index[i]][1];
4725
                        }
4726
                    }
4727
                }
4728
            }
4729
 
4730
            vc1_mc_1mv(v, dir);
4731
            if (direct || bmvtype == BMV_TYPE_INTERPOLATED) {
4732
                vc1_interp_mc(v);
4733
            }
4734
        }
4735
    }
4736
    if (s->mb_x == s->mb_width - 1)
4737
        memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
4738
    v->cbp[s->mb_x]      = block_cbp;
4739
    v->ttblk[s->mb_x]    = block_tt;
4740
    return 0;
4741
}
4742
 
4743
/** Decode blocks of I-frame
4744
 */
4745
static void vc1_decode_i_blocks(VC1Context *v)
4746
{
4747
    int k, j;
4748
    MpegEncContext *s = &v->s;
4749
    int cbp, val;
4750
    uint8_t *coded_val;
4751
    int mb_pos;
4752
 
4753
    /* select codingmode used for VLC tables selection */
4754
    switch (v->y_ac_table_index) {
4755
    case 0:
4756
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4757
        break;
4758
    case 1:
4759
        v->codingset = CS_HIGH_MOT_INTRA;
4760
        break;
4761
    case 2:
4762
        v->codingset = CS_MID_RATE_INTRA;
4763
        break;
4764
    }
4765
 
4766
    switch (v->c_ac_table_index) {
4767
    case 0:
4768
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4769
        break;
4770
    case 1:
4771
        v->codingset2 = CS_HIGH_MOT_INTER;
4772
        break;
4773
    case 2:
4774
        v->codingset2 = CS_MID_RATE_INTER;
4775
        break;
4776
    }
4777
 
4778
    /* Set DC scale - y and c use the same */
4779
    s->y_dc_scale = s->y_dc_scale_table[v->pq];
4780
    s->c_dc_scale = s->c_dc_scale_table[v->pq];
4781
 
4782
    //do frame decode
4783
    s->mb_x = s->mb_y = 0;
4784
    s->mb_intra         = 1;
4785
    s->first_slice_line = 1;
4786
    for (s->mb_y = 0; s->mb_y < s->end_mb_y; s->mb_y++) {
4787
        s->mb_x = 0;
4788
        init_block_index(v);
4789
        for (; s->mb_x < v->end_mb_x; s->mb_x++) {
4790
            uint8_t *dst[6];
4791
            ff_update_block_index(s);
4792
            dst[0] = s->dest[0];
4793
            dst[1] = dst[0] + 8;
4794
            dst[2] = s->dest[0] + s->linesize * 8;
4795
            dst[3] = dst[2] + 8;
4796
            dst[4] = s->dest[1];
4797
            dst[5] = s->dest[2];
4798
            s->dsp.clear_blocks(s->block[0]);
4799
            mb_pos = s->mb_x + s->mb_y * s->mb_width;
4800
            s->current_picture.mb_type[mb_pos]                     = MB_TYPE_INTRA;
4801
            s->current_picture.qscale_table[mb_pos]                = v->pq;
4802
            s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
4803
            s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
4804
 
4805
            // do actual MB decoding and displaying
4806
            cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
4807
            v->s.ac_pred = get_bits1(&v->s.gb);
4808
 
4809
            for (k = 0; k < 6; k++) {
4810
                val = ((cbp >> (5 - k)) & 1);
4811
 
4812
                if (k < 4) {
4813
                    int pred   = vc1_coded_block_pred(&v->s, k, &coded_val);
4814
                    val        = val ^ pred;
4815
                    *coded_val = val;
4816
                }
4817
                cbp |= val << (5 - k);
4818
 
4819
                vc1_decode_i_block(v, s->block[k], k, val, (k < 4) ? v->codingset : v->codingset2);
4820
 
4821
                if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
4822
                    continue;
4823
                v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
4824
                if (v->pq >= 9 && v->overlap) {
4825
                    if (v->rangeredfrm)
4826
                        for (j = 0; j < 64; j++)
4827
                            s->block[k][j] <<= 1;
4828
                    s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4829
                } else {
4830
                    if (v->rangeredfrm)
4831
                        for (j = 0; j < 64; j++)
4832
                            s->block[k][j] = (s->block[k][j] - 64) << 1;
4833
                    s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4834
                }
4835
            }
4836
 
4837
            if (v->pq >= 9 && v->overlap) {
4838
                if (s->mb_x) {
4839
                    v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
4840
                    v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4841
                    if (!(s->flags & CODEC_FLAG_GRAY)) {
4842
                        v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
4843
                        v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
4844
                    }
4845
                }
4846
                v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
4847
                v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
4848
                if (!s->first_slice_line) {
4849
                    v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
4850
                    v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
4851
                    if (!(s->flags & CODEC_FLAG_GRAY)) {
4852
                        v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
4853
                        v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
4854
                    }
4855
                }
4856
                v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4857
                v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
4858
            }
4859
            if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
4860
 
4861
            if (get_bits_count(&s->gb) > v->bits) {
4862
                ff_er_add_slice(&s->er, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR);
4863
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
4864
                       get_bits_count(&s->gb), v->bits);
4865
                return;
4866
            }
4867
        }
4868
        if (!v->s.loop_filter)
4869
            ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
4870
        else if (s->mb_y)
4871
            ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
4872
 
4873
        s->first_slice_line = 0;
4874
    }
4875
    if (v->s.loop_filter)
4876
        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
4877
 
4878
    /* This is intentionally mb_height and not end_mb_y - unlike in advanced
4879
     * profile, these only differ are when decoding MSS2 rectangles. */
4880
    ff_er_add_slice(&s->er, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
4881
}
4882
 
4883
/** Decode blocks of I-frame for advanced profile
4884
 */
4885
static void vc1_decode_i_blocks_adv(VC1Context *v)
4886
{
4887
    int k;
4888
    MpegEncContext *s = &v->s;
4889
    int cbp, val;
4890
    uint8_t *coded_val;
4891
    int mb_pos;
4892
    int mquant = v->pq;
4893
    int mqdiff;
4894
    GetBitContext *gb = &s->gb;
4895
 
4896
    /* select codingmode used for VLC tables selection */
4897
    switch (v->y_ac_table_index) {
4898
    case 0:
4899
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4900
        break;
4901
    case 1:
4902
        v->codingset = CS_HIGH_MOT_INTRA;
4903
        break;
4904
    case 2:
4905
        v->codingset = CS_MID_RATE_INTRA;
4906
        break;
4907
    }
4908
 
4909
    switch (v->c_ac_table_index) {
4910
    case 0:
4911
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4912
        break;
4913
    case 1:
4914
        v->codingset2 = CS_HIGH_MOT_INTER;
4915
        break;
4916
    case 2:
4917
        v->codingset2 = CS_MID_RATE_INTER;
4918
        break;
4919
    }
4920
 
4921
    // do frame decode
4922
    s->mb_x             = s->mb_y = 0;
4923
    s->mb_intra         = 1;
4924
    s->first_slice_line = 1;
4925
    s->mb_y             = s->start_mb_y;
4926
    if (s->start_mb_y) {
4927
        s->mb_x = 0;
4928
        init_block_index(v);
4929
        memset(&s->coded_block[s->block_index[0] - s->b8_stride], 0,
4930
               (1 + s->b8_stride) * sizeof(*s->coded_block));
4931
    }
4932
    for (; s->mb_y < s->end_mb_y; s->mb_y++) {
4933
        s->mb_x = 0;
4934
        init_block_index(v);
4935
        for (;s->mb_x < s->mb_width; s->mb_x++) {
4936
            int16_t (*block)[64] = v->block[v->cur_blk_idx];
4937
            ff_update_block_index(s);
4938
            s->dsp.clear_blocks(block[0]);
4939
            mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4940
            s->current_picture.mb_type[mb_pos + v->mb_off]                         = MB_TYPE_INTRA;
4941
            s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
4942
            s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
4943
 
4944
            // do actual MB decoding and displaying
4945
            if (v->fieldtx_is_raw)
4946
                v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
4947
            cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
4948
            if ( v->acpred_is_raw)
4949
                v->s.ac_pred = get_bits1(&v->s.gb);
4950
            else
4951
                v->s.ac_pred = v->acpred_plane[mb_pos];
4952
 
4953
            if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
4954
                v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
4955
 
4956
            GET_MQUANT();
4957
 
4958
            s->current_picture.qscale_table[mb_pos] = mquant;
4959
            /* Set DC scale - y and c use the same */
4960
            s->y_dc_scale = s->y_dc_scale_table[mquant];
4961
            s->c_dc_scale = s->c_dc_scale_table[mquant];
4962
 
4963
            for (k = 0; k < 6; k++) {
4964
                val = ((cbp >> (5 - k)) & 1);
4965
 
4966
                if (k < 4) {
4967
                    int pred   = vc1_coded_block_pred(&v->s, k, &coded_val);
4968
                    val        = val ^ pred;
4969
                    *coded_val = val;
4970
                }
4971
                cbp |= val << (5 - k);
4972
 
4973
                v->a_avail = !s->first_slice_line || (k == 2 || k == 3);
4974
                v->c_avail = !!s->mb_x || (k == 1 || k == 3);
4975
 
4976
                vc1_decode_i_block_adv(v, block[k], k, val,
4977
                                       (k < 4) ? v->codingset : v->codingset2, mquant);
4978
 
4979
                if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
4980
                    continue;
4981
                v->vc1dsp.vc1_inv_trans_8x8(block[k]);
4982
            }
4983
 
4984
            vc1_smooth_overlap_filter_iblk(v);
4985
            vc1_put_signed_blocks_clamped(v);
4986
            if (v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
4987
 
4988
            if (get_bits_count(&s->gb) > v->bits) {
4989
                // TODO: may need modification to handle slice coding
4990
                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
4991
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
4992
                       get_bits_count(&s->gb), v->bits);
4993
                return;
4994
            }
4995
        }
4996
        if (!v->s.loop_filter)
4997
            ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
4998
        else if (s->mb_y)
4999
            ff_mpeg_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
5000
        s->first_slice_line = 0;
5001
    }
5002
 
5003
    /* raw bottom MB row */
5004
    s->mb_x = 0;
5005
    init_block_index(v);
5006
 
5007
    for (;s->mb_x < s->mb_width; s->mb_x++) {
5008
        ff_update_block_index(s);
5009
        vc1_put_signed_blocks_clamped(v);
5010
        if (v->s.loop_filter)
5011
            vc1_loop_filter_iblk_delayed(v, v->pq);
5012
    }
5013
    if (v->s.loop_filter)
5014
        ff_mpeg_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
5015
    ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
5016
                    (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
5017
}
5018
 
5019
static void vc1_decode_p_blocks(VC1Context *v)
5020
{
5021
    MpegEncContext *s = &v->s;
5022
    int apply_loop_filter;
5023
 
5024
    /* select codingmode used for VLC tables selection */
5025
    switch (v->c_ac_table_index) {
5026
    case 0:
5027
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
5028
        break;
5029
    case 1:
5030
        v->codingset = CS_HIGH_MOT_INTRA;
5031
        break;
5032
    case 2:
5033
        v->codingset = CS_MID_RATE_INTRA;
5034
        break;
5035
    }
5036
 
5037
    switch (v->c_ac_table_index) {
5038
    case 0:
5039
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
5040
        break;
5041
    case 1:
5042
        v->codingset2 = CS_HIGH_MOT_INTER;
5043
        break;
5044
    case 2:
5045
        v->codingset2 = CS_MID_RATE_INTER;
5046
        break;
5047
    }
5048
 
5049
    apply_loop_filter   = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY) &&
5050
                          v->fcm == PROGRESSIVE;
5051
    s->first_slice_line = 1;
5052
    memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
5053
    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
5054
        s->mb_x = 0;
5055
        init_block_index(v);
5056
        for (; s->mb_x < s->mb_width; s->mb_x++) {
5057
            ff_update_block_index(s);
5058
 
5059
            if (v->fcm == ILACE_FIELD)
5060
                vc1_decode_p_mb_intfi(v);
5061
            else if (v->fcm == ILACE_FRAME)
5062
                vc1_decode_p_mb_intfr(v);
5063
            else vc1_decode_p_mb(v);
5064
            if (s->mb_y != s->start_mb_y && apply_loop_filter)
5065
                vc1_apply_p_loop_filter(v);
5066
            if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
5067
                // TODO: may need modification to handle slice coding
5068
                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
5069
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
5070
                       get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
5071
                return;
5072
            }
5073
        }
5074
        memmove(v->cbp_base,      v->cbp,      sizeof(v->cbp_base[0])      * s->mb_stride);
5075
        memmove(v->ttblk_base,    v->ttblk,    sizeof(v->ttblk_base[0])    * s->mb_stride);
5076
        memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
5077
        memmove(v->luma_mv_base,  v->luma_mv,  sizeof(v->luma_mv_base[0])  * s->mb_stride);
5078
        if (s->mb_y != s->start_mb_y) ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
5079
        s->first_slice_line = 0;
5080
    }
5081
    if (apply_loop_filter) {
5082
        s->mb_x = 0;
5083
        init_block_index(v);
5084
        for (; s->mb_x < s->mb_width; s->mb_x++) {
5085
            ff_update_block_index(s);
5086
            vc1_apply_p_loop_filter(v);
5087
        }
5088
    }
5089
    if (s->end_mb_y >= s->start_mb_y)
5090
        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
5091
    ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
5092
                    (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
5093
}
5094
 
5095
static void vc1_decode_b_blocks(VC1Context *v)
5096
{
5097
    MpegEncContext *s = &v->s;
5098
 
5099
    /* select codingmode used for VLC tables selection */
5100
    switch (v->c_ac_table_index) {
5101
    case 0:
5102
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
5103
        break;
5104
    case 1:
5105
        v->codingset = CS_HIGH_MOT_INTRA;
5106
        break;
5107
    case 2:
5108
        v->codingset = CS_MID_RATE_INTRA;
5109
        break;
5110
    }
5111
 
5112
    switch (v->c_ac_table_index) {
5113
    case 0:
5114
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
5115
        break;
5116
    case 1:
5117
        v->codingset2 = CS_HIGH_MOT_INTER;
5118
        break;
5119
    case 2:
5120
        v->codingset2 = CS_MID_RATE_INTER;
5121
        break;
5122
    }
5123
 
5124
    s->first_slice_line = 1;
5125
    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
5126
        s->mb_x = 0;
5127
        init_block_index(v);
5128
        for (; s->mb_x < s->mb_width; s->mb_x++) {
5129
            ff_update_block_index(s);
5130
 
5131
            if (v->fcm == ILACE_FIELD)
5132
                vc1_decode_b_mb_intfi(v);
5133
            else if (v->fcm == ILACE_FRAME)
5134
                vc1_decode_b_mb_intfr(v);
5135
            else
5136
                vc1_decode_b_mb(v);
5137
            if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
5138
                // TODO: may need modification to handle slice coding
5139
                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
5140
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
5141
                       get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
5142
                return;
5143
            }
5144
            if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
5145
        }
5146
        if (!v->s.loop_filter)
5147
            ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
5148
        else if (s->mb_y)
5149
            ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
5150
        s->first_slice_line = 0;
5151
    }
5152
    if (v->s.loop_filter)
5153
        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
5154
    ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
5155
                    (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
5156
}
5157
 
5158
static void vc1_decode_skip_blocks(VC1Context *v)
5159
{
5160
    MpegEncContext *s = &v->s;
5161
 
5162
    if (!v->s.last_picture.f.data[0])
5163
        return;
5164
 
5165
    ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, ER_MB_END);
5166
    s->first_slice_line = 1;
5167
    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
5168
        s->mb_x = 0;
5169
        init_block_index(v);
5170
        ff_update_block_index(s);
5171
        memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize,   s->linesize   * 16);
5172
        memcpy(s->dest[1], s->last_picture.f.data[1] + s->mb_y *  8 * s->uvlinesize, s->uvlinesize *  8);
5173
        memcpy(s->dest[2], s->last_picture.f.data[2] + s->mb_y *  8 * s->uvlinesize, s->uvlinesize *  8);
5174
        ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
5175
        s->first_slice_line = 0;
5176
    }
5177
    s->pict_type = AV_PICTURE_TYPE_P;
5178
}
5179
 
5180
void ff_vc1_decode_blocks(VC1Context *v)
5181
{
5182
 
5183
    v->s.esc3_level_length = 0;
5184
    if (v->x8_type) {
5185
        ff_intrax8_decode_picture(&v->x8, 2*v->pq + v->halfpq, v->pq * !v->pquantizer);
5186
    } else {
5187
        v->cur_blk_idx     =  0;
5188
        v->left_blk_idx    = -1;
5189
        v->topleft_blk_idx =  1;
5190
        v->top_blk_idx     =  2;
5191
        switch (v->s.pict_type) {
5192
        case AV_PICTURE_TYPE_I:
5193
            if (v->profile == PROFILE_ADVANCED)
5194
                vc1_decode_i_blocks_adv(v);
5195
            else
5196
                vc1_decode_i_blocks(v);
5197
            break;
5198
        case AV_PICTURE_TYPE_P:
5199
            if (v->p_frame_skipped)
5200
                vc1_decode_skip_blocks(v);
5201
            else
5202
                vc1_decode_p_blocks(v);
5203
            break;
5204
        case AV_PICTURE_TYPE_B:
5205
            if (v->bi_type) {
5206
                if (v->profile == PROFILE_ADVANCED)
5207
                    vc1_decode_i_blocks_adv(v);
5208
                else
5209
                    vc1_decode_i_blocks(v);
5210
            } else
5211
                vc1_decode_b_blocks(v);
5212
            break;
5213
        }
5214
    }
5215
}
5216
 
5217
#if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
5218
 
5219
typedef struct {
5220
    /**
5221
     * Transform coefficients for both sprites in 16.16 fixed point format,
5222
     * in the order they appear in the bitstream:
5223
     *  x scale
5224
     *  rotation 1 (unused)
5225
     *  x offset
5226
     *  rotation 2 (unused)
5227
     *  y scale
5228
     *  y offset
5229
     *  alpha
5230
     */
5231
    int coefs[2][7];
5232
 
5233
    int effect_type, effect_flag;
5234
    int effect_pcount1, effect_pcount2;   ///< amount of effect parameters stored in effect_params
5235
    int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
5236
} SpriteData;
5237
 
5238
static inline int get_fp_val(GetBitContext* gb)
5239
{
5240
    return (get_bits_long(gb, 30) - (1 << 29)) << 1;
5241
}
5242
 
5243
static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
5244
{
5245
    c[1] = c[3] = 0;
5246
 
5247
    switch (get_bits(gb, 2)) {
5248
    case 0:
5249
        c[0] = 1 << 16;
5250
        c[2] = get_fp_val(gb);
5251
        c[4] = 1 << 16;
5252
        break;
5253
    case 1:
5254
        c[0] = c[4] = get_fp_val(gb);
5255
        c[2] = get_fp_val(gb);
5256
        break;
5257
    case 2:
5258
        c[0] = get_fp_val(gb);
5259
        c[2] = get_fp_val(gb);
5260
        c[4] = get_fp_val(gb);
5261
        break;
5262
    case 3:
5263
        c[0] = get_fp_val(gb);
5264
        c[1] = get_fp_val(gb);
5265
        c[2] = get_fp_val(gb);
5266
        c[3] = get_fp_val(gb);
5267
        c[4] = get_fp_val(gb);
5268
        break;
5269
    }
5270
    c[5] = get_fp_val(gb);
5271
    if (get_bits1(gb))
5272
        c[6] = get_fp_val(gb);
5273
    else
5274
        c[6] = 1 << 16;
5275
}
5276
 
5277
static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
5278
{
5279
    AVCodecContext *avctx = v->s.avctx;
5280
    int sprite, i;
5281
 
5282
    for (sprite = 0; sprite <= v->two_sprites; sprite++) {
5283
        vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
5284
        if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
5285
            avpriv_request_sample(avctx, "Non-zero rotation coefficients");
5286
        av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
5287
        for (i = 0; i < 7; i++)
5288
            av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
5289
                   sd->coefs[sprite][i] / (1<<16),
5290
                   (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
5291
        av_log(avctx, AV_LOG_DEBUG, "\n");
5292
    }
5293
 
5294
    skip_bits(gb, 2);
5295
    if (sd->effect_type = get_bits_long(gb, 30)) {
5296
        switch (sd->effect_pcount1 = get_bits(gb, 4)) {
5297
        case 7:
5298
            vc1_sprite_parse_transform(gb, sd->effect_params1);
5299
            break;
5300
        case 14:
5301
            vc1_sprite_parse_transform(gb, sd->effect_params1);
5302
            vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
5303
            break;
5304
        default:
5305
            for (i = 0; i < sd->effect_pcount1; i++)
5306
                sd->effect_params1[i] = get_fp_val(gb);
5307
        }
5308
        if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
5309
            // effect 13 is simple alpha blending and matches the opacity above
5310
            av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
5311
            for (i = 0; i < sd->effect_pcount1; i++)
5312
                av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
5313
                       sd->effect_params1[i] / (1 << 16),
5314
                       (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
5315
            av_log(avctx, AV_LOG_DEBUG, "\n");
5316
        }
5317
 
5318
        sd->effect_pcount2 = get_bits(gb, 16);
5319
        if (sd->effect_pcount2 > 10) {
5320
            av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
5321
            return;
5322
        } else if (sd->effect_pcount2) {
5323
            i = -1;
5324
            av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
5325
            while (++i < sd->effect_pcount2) {
5326
                sd->effect_params2[i] = get_fp_val(gb);
5327
                av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
5328
                       sd->effect_params2[i] / (1 << 16),
5329
                       (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
5330
            }
5331
            av_log(avctx, AV_LOG_DEBUG, "\n");
5332
        }
5333
    }
5334
    if (sd->effect_flag = get_bits1(gb))
5335
        av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
5336
 
5337
    if (get_bits_count(gb) >= gb->size_in_bits +
5338
       (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0))
5339
        av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
5340
    if (get_bits_count(gb) < gb->size_in_bits - 8)
5341
        av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
5342
}
5343
 
5344
static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
5345
{
5346
    int i, plane, row, sprite;
5347
    int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
5348
    uint8_t* src_h[2][2];
5349
    int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
5350
    int ysub[2];
5351
    MpegEncContext *s = &v->s;
5352
 
5353
    for (i = 0; i < 2; i++) {
5354
        xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
5355
        xadv[i] = sd->coefs[i][0];
5356
        if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
5357
            xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
5358
 
5359
        yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
5360
        yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
5361
    }
5362
    alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
5363
 
5364
    for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
5365
        int width = v->output_width>>!!plane;
5366
 
5367
        for (row = 0; row < v->output_height>>!!plane; row++) {
5368
            uint8_t *dst = v->sprite_output_frame.data[plane] +
5369
                           v->sprite_output_frame.linesize[plane] * row;
5370
 
5371
            for (sprite = 0; sprite <= v->two_sprites; sprite++) {
5372
                uint8_t *iplane = s->current_picture.f.data[plane];
5373
                int      iline  = s->current_picture.f.linesize[plane];
5374
                int      ycoord = yoff[sprite] + yadv[sprite] * row;
5375
                int      yline  = ycoord >> 16;
5376
                int      next_line;
5377
                ysub[sprite] = ycoord & 0xFFFF;
5378
                if (sprite) {
5379
                    iplane = s->last_picture.f.data[plane];
5380
                    iline  = s->last_picture.f.linesize[plane];
5381
                }
5382
                next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
5383
                if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
5384
                        src_h[sprite][0] = iplane + (xoff[sprite] >> 16) +  yline      * iline;
5385
                    if (ysub[sprite])
5386
                        src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
5387
                } else {
5388
                    if (sr_cache[sprite][0] != yline) {
5389
                        if (sr_cache[sprite][1] == yline) {
5390
                            FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
5391
                            FFSWAP(int,        sr_cache[sprite][0],   sr_cache[sprite][1]);
5392
                        } else {
5393
                            v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
5394
                            sr_cache[sprite][0] = yline;
5395
                        }
5396
                    }
5397
                    if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
5398
                        v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
5399
                                           iplane + next_line, xoff[sprite],
5400
                                           xadv[sprite], width);
5401
                        sr_cache[sprite][1] = yline + 1;
5402
                    }
5403
                    src_h[sprite][0] = v->sr_rows[sprite][0];
5404
                    src_h[sprite][1] = v->sr_rows[sprite][1];
5405
                }
5406
            }
5407
 
5408
            if (!v->two_sprites) {
5409
                if (ysub[0]) {
5410
                    v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
5411
                } else {
5412
                    memcpy(dst, src_h[0][0], width);
5413
                }
5414
            } else {
5415
                if (ysub[0] && ysub[1]) {
5416
                    v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
5417
                                                       src_h[1][0], src_h[1][1], ysub[1], alpha, width);
5418
                } else if (ysub[0]) {
5419
                    v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
5420
                                                       src_h[1][0], alpha, width);
5421
                } else if (ysub[1]) {
5422
                    v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
5423
                                                       src_h[0][0], (1<<16)-1-alpha, width);
5424
                } else {
5425
                    v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
5426
                }
5427
            }
5428
        }
5429
 
5430
        if (!plane) {
5431
            for (i = 0; i < 2; i++) {
5432
                xoff[i] >>= 1;
5433
                yoff[i] >>= 1;
5434
            }
5435
        }
5436
 
5437
    }
5438
}
5439
 
5440
 
5441
static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
5442
{
5443
    int ret;
5444
    MpegEncContext *s     = &v->s;
5445
    AVCodecContext *avctx = s->avctx;
5446
    SpriteData sd;
5447
 
5448
    vc1_parse_sprites(v, gb, &sd);
5449
 
5450
    if (!s->current_picture.f.data[0]) {
5451
        av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
5452
        return -1;
5453
    }
5454
 
5455
    if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f.data[0])) {
5456
        av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
5457
        v->two_sprites = 0;
5458
    }
5459
 
5460
    av_frame_unref(&v->sprite_output_frame);
5461
    if ((ret = ff_get_buffer(avctx, &v->sprite_output_frame, 0)) < 0)
5462
        return ret;
5463
 
5464
    vc1_draw_sprites(v, &sd);
5465
 
5466
    return 0;
5467
}
5468
 
5469
static void vc1_sprite_flush(AVCodecContext *avctx)
5470
{
5471
    VC1Context *v     = avctx->priv_data;
5472
    MpegEncContext *s = &v->s;
5473
    AVFrame *f = &s->current_picture.f;
5474
    int plane, i;
5475
 
5476
    /* Windows Media Image codecs have a convergence interval of two keyframes.
5477
       Since we can't enforce it, clear to black the missing sprite. This is
5478
       wrong but it looks better than doing nothing. */
5479
 
5480
    if (f->data[0])
5481
        for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++)
5482
            for (i = 0; i < v->sprite_height>>!!plane; i++)
5483
                memset(f->data[plane] + i * f->linesize[plane],
5484
                       plane ? 128 : 0, f->linesize[plane]);
5485
}
5486
 
5487
#endif
5488
 
5489
av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
5490
{
5491
    MpegEncContext *s = &v->s;
5492
    int i;
5493
 
5494
    /* Allocate mb bitplanes */
5495
    v->mv_type_mb_plane = av_malloc (s->mb_stride * s->mb_height);
5496
    v->direct_mb_plane  = av_malloc (s->mb_stride * s->mb_height);
5497
    v->forward_mb_plane = av_malloc (s->mb_stride * s->mb_height);
5498
    v->fieldtx_plane    = av_mallocz(s->mb_stride * s->mb_height);
5499
    v->acpred_plane     = av_malloc (s->mb_stride * s->mb_height);
5500
    v->over_flags_plane = av_malloc (s->mb_stride * s->mb_height);
5501
 
5502
    v->n_allocated_blks = s->mb_width + 2;
5503
    v->block            = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
5504
    v->cbp_base         = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
5505
    v->cbp              = v->cbp_base + s->mb_stride;
5506
    v->ttblk_base       = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
5507
    v->ttblk            = v->ttblk_base + s->mb_stride;
5508
    v->is_intra_base    = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
5509
    v->is_intra         = v->is_intra_base + s->mb_stride;
5510
    v->luma_mv_base     = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
5511
    v->luma_mv          = v->luma_mv_base + s->mb_stride;
5512
 
5513
    /* allocate block type info in that way so it could be used with s->block_index[] */
5514
    v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5515
    v->mb_type[0]   = v->mb_type_base + s->b8_stride + 1;
5516
    v->mb_type[1]   = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
5517
    v->mb_type[2]   = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
5518
 
5519
    /* allocate memory to store block level MV info */
5520
    v->blk_mv_type_base = av_mallocz(     s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5521
    v->blk_mv_type      = v->blk_mv_type_base + s->b8_stride + 1;
5522
    v->mv_f_base        = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5523
    v->mv_f[0]          = v->mv_f_base + s->b8_stride + 1;
5524
    v->mv_f[1]          = v->mv_f[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5525
    v->mv_f_next_base   = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5526
    v->mv_f_next[0]     = v->mv_f_next_base + s->b8_stride + 1;
5527
    v->mv_f_next[1]     = v->mv_f_next[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5528
 
5529
    /* Init coded blocks info */
5530
    if (v->profile == PROFILE_ADVANCED) {
5531
//        if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
5532
//            return -1;
5533
//        if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
5534
//            return -1;
5535
    }
5536
 
5537
    ff_intrax8_common_init(&v->x8,s);
5538
 
5539
    if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5540
        for (i = 0; i < 4; i++)
5541
            if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width)))
5542
                return AVERROR(ENOMEM);
5543
    }
5544
 
5545
    if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
5546
        !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
5547
        !v->mb_type_base) {
5548
        av_freep(&v->mv_type_mb_plane);
5549
        av_freep(&v->direct_mb_plane);
5550
        av_freep(&v->acpred_plane);
5551
        av_freep(&v->over_flags_plane);
5552
        av_freep(&v->block);
5553
        av_freep(&v->cbp_base);
5554
        av_freep(&v->ttblk_base);
5555
        av_freep(&v->is_intra_base);
5556
        av_freep(&v->luma_mv_base);
5557
        av_freep(&v->mb_type_base);
5558
        return AVERROR(ENOMEM);
5559
    }
5560
 
5561
    return 0;
5562
}
5563
 
5564
av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
5565
{
5566
    int i;
5567
    for (i = 0; i < 64; i++) {
5568
#define transpose(x) ((x >> 3) | ((x & 7) << 3))
5569
        v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
5570
        v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
5571
        v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
5572
        v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
5573
        v->zzi_8x8[i]   = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
5574
    }
5575
    v->left_blk_sh = 0;
5576
    v->top_blk_sh  = 3;
5577
}
5578
 
5579
/** Initialize a VC1/WMV3 decoder
5580
 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5581
 * @todo TODO: Decypher remaining bits in extra_data
5582
 */
5583
static av_cold int vc1_decode_init(AVCodecContext *avctx)
5584
{
5585
    VC1Context *v = avctx->priv_data;
5586
    MpegEncContext *s = &v->s;
5587
    GetBitContext gb;
5588
    int ret;
5589
 
5590
    /* save the container output size for WMImage */
5591
    v->output_width  = avctx->width;
5592
    v->output_height = avctx->height;
5593
 
5594
    if (!avctx->extradata_size || !avctx->extradata)
5595
        return -1;
5596
    if (!(avctx->flags & CODEC_FLAG_GRAY))
5597
        avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
5598
    else
5599
        avctx->pix_fmt = AV_PIX_FMT_GRAY8;
5600
    avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
5601
    v->s.avctx = avctx;
5602
    avctx->flags |= CODEC_FLAG_EMU_EDGE;
5603
    v->s.flags   |= CODEC_FLAG_EMU_EDGE;
5604
 
5605
    if ((ret = ff_vc1_init_common(v)) < 0)
5606
        return ret;
5607
    // ensure static VLC tables are initialized
5608
    if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
5609
        return ret;
5610
    if ((ret = ff_vc1_decode_init_alloc_tables(v)) < 0)
5611
        return ret;
5612
    // Hack to ensure the above functions will be called
5613
    // again once we know all necessary settings.
5614
    // That this is necessary might indicate a bug.
5615
    ff_vc1_decode_end(avctx);
5616
 
5617
    ff_h264chroma_init(&v->h264chroma, 8);
5618
    ff_vc1dsp_init(&v->vc1dsp);
5619
 
5620
    if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
5621
        int count = 0;
5622
 
5623
        // looks like WMV3 has a sequence header stored in the extradata
5624
        // advanced sequence header may be before the first frame
5625
        // the last byte of the extradata is a version number, 1 for the
5626
        // samples we can decode
5627
 
5628
        init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
5629
 
5630
        if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
5631
          return ret;
5632
 
5633
        count = avctx->extradata_size*8 - get_bits_count(&gb);
5634
        if (count > 0) {
5635
            av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
5636
                   count, get_bits(&gb, count));
5637
        } else if (count < 0) {
5638
            av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
5639
        }
5640
    } else { // VC1/WVC1/WVP2
5641
        const uint8_t *start = avctx->extradata;
5642
        uint8_t *end = avctx->extradata + avctx->extradata_size;
5643
        const uint8_t *next;
5644
        int size, buf2_size;
5645
        uint8_t *buf2 = NULL;
5646
        int seq_initialized = 0, ep_initialized = 0;
5647
 
5648
        if (avctx->extradata_size < 16) {
5649
            av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
5650
            return -1;
5651
        }
5652
 
5653
        buf2  = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
5654
        start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
5655
        next  = start;
5656
        for (; next < end; start = next) {
5657
            next = find_next_marker(start + 4, end);
5658
            size = next - start - 4;
5659
            if (size <= 0)
5660
                continue;
5661
            buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
5662
            init_get_bits(&gb, buf2, buf2_size * 8);
5663
            switch (AV_RB32(start)) {
5664
            case VC1_CODE_SEQHDR:
5665
                if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0) {
5666
                    av_free(buf2);
5667
                    return ret;
5668
                }
5669
                seq_initialized = 1;
5670
                break;
5671
            case VC1_CODE_ENTRYPOINT:
5672
                if ((ret = ff_vc1_decode_entry_point(avctx, v, &gb)) < 0) {
5673
                    av_free(buf2);
5674
                    return ret;
5675
                }
5676
                ep_initialized = 1;
5677
                break;
5678
            }
5679
        }
5680
        av_free(buf2);
5681
        if (!seq_initialized || !ep_initialized) {
5682
            av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
5683
            return -1;
5684
        }
5685
        v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
5686
    }
5687
 
5688
    avctx->profile = v->profile;
5689
    if (v->profile == PROFILE_ADVANCED)
5690
        avctx->level = v->level;
5691
 
5692
    avctx->has_b_frames = !!avctx->max_b_frames;
5693
 
5694
    s->mb_width  = (avctx->coded_width  + 15) >> 4;
5695
    s->mb_height = (avctx->coded_height + 15) >> 4;
5696
 
5697
    if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
5698
        ff_vc1_init_transposed_scantables(v);
5699
    } else {
5700
        memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
5701
        v->left_blk_sh = 3;
5702
        v->top_blk_sh  = 0;
5703
    }
5704
 
5705
    if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5706
        v->sprite_width  = avctx->coded_width;
5707
        v->sprite_height = avctx->coded_height;
5708
 
5709
        avctx->coded_width  = avctx->width  = v->output_width;
5710
        avctx->coded_height = avctx->height = v->output_height;
5711
 
5712
        // prevent 16.16 overflows
5713
        if (v->sprite_width  > 1 << 14 ||
5714
            v->sprite_height > 1 << 14 ||
5715
            v->output_width  > 1 << 14 ||
5716
            v->output_height > 1 << 14) return -1;
5717
 
5718
        if ((v->sprite_width&1) || (v->sprite_height&1)) {
5719
            avpriv_request_sample(avctx, "odd sprites support");
5720
            return AVERROR_PATCHWELCOME;
5721
        }
5722
    }
5723
    return 0;
5724
}
5725
 
5726
/** Close a VC1/WMV3 decoder
5727
 * @warning Initial try at using MpegEncContext stuff
5728
 */
5729
av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
5730
{
5731
    VC1Context *v = avctx->priv_data;
5732
    int i;
5733
 
5734
    av_frame_unref(&v->sprite_output_frame);
5735
 
5736
    for (i = 0; i < 4; i++)
5737
        av_freep(&v->sr_rows[i >> 1][i & 1]);
5738
    av_freep(&v->hrd_rate);
5739
    av_freep(&v->hrd_buffer);
5740
    ff_MPV_common_end(&v->s);
5741
    av_freep(&v->mv_type_mb_plane);
5742
    av_freep(&v->direct_mb_plane);
5743
    av_freep(&v->forward_mb_plane);
5744
    av_freep(&v->fieldtx_plane);
5745
    av_freep(&v->acpred_plane);
5746
    av_freep(&v->over_flags_plane);
5747
    av_freep(&v->mb_type_base);
5748
    av_freep(&v->blk_mv_type_base);
5749
    av_freep(&v->mv_f_base);
5750
    av_freep(&v->mv_f_next_base);
5751
    av_freep(&v->block);
5752
    av_freep(&v->cbp_base);
5753
    av_freep(&v->ttblk_base);
5754
    av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
5755
    av_freep(&v->luma_mv_base);
5756
    ff_intrax8_common_end(&v->x8);
5757
    return 0;
5758
}
5759
 
5760
 
5761
/** Decode a VC1/WMV3 frame
5762
 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5763
 */
5764
static int vc1_decode_frame(AVCodecContext *avctx, void *data,
5765
                            int *got_frame, AVPacket *avpkt)
5766
{
5767
    const uint8_t *buf = avpkt->data;
5768
    int buf_size = avpkt->size, n_slices = 0, i, ret;
5769
    VC1Context *v = avctx->priv_data;
5770
    MpegEncContext *s = &v->s;
5771
    AVFrame *pict = data;
5772
    uint8_t *buf2 = NULL;
5773
    const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
5774
    int mb_height, n_slices1=-1;
5775
    struct {
5776
        uint8_t *buf;
5777
        GetBitContext gb;
5778
        int mby_start;
5779
    } *slices = NULL, *tmp;
5780
 
5781
    v->second_field = 0;
5782
 
5783
    if(s->flags & CODEC_FLAG_LOW_DELAY)
5784
        s->low_delay = 1;
5785
 
5786
    /* no supplementary picture */
5787
    if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
5788
        /* special case for last picture */
5789
        if (s->low_delay == 0 && s->next_picture_ptr) {
5790
            if ((ret = av_frame_ref(pict, &s->next_picture_ptr->f)) < 0)
5791
                return ret;
5792
            s->next_picture_ptr = NULL;
5793
 
5794
            *got_frame = 1;
5795
        }
5796
 
5797
        return buf_size;
5798
    }
5799
 
5800
    if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
5801
        if (v->profile < PROFILE_ADVANCED)
5802
            avctx->pix_fmt = AV_PIX_FMT_VDPAU_WMV3;
5803
        else
5804
            avctx->pix_fmt = AV_PIX_FMT_VDPAU_VC1;
5805
    }
5806
 
5807
    //for advanced profile we may need to parse and unescape data
5808
    if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5809
        int buf_size2 = 0;
5810
        buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5811
        if (!buf2)
5812
            return AVERROR(ENOMEM);
5813
 
5814
        if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
5815
            const uint8_t *start, *end, *next;
5816
            int size;
5817
 
5818
            next = buf;
5819
            for (start = buf, end = buf + buf_size; next < end; start = next) {
5820
                next = find_next_marker(start + 4, end);
5821
                size = next - start - 4;
5822
                if (size <= 0) continue;
5823
                switch (AV_RB32(start)) {
5824
                case VC1_CODE_FRAME:
5825
                    if (avctx->hwaccel ||
5826
                        s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5827
                        buf_start = start;
5828
                    buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5829
                    break;
5830
                case VC1_CODE_FIELD: {
5831
                    int buf_size3;
5832
                    if (avctx->hwaccel ||
5833
                        s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5834
                        buf_start_second_field = start;
5835
                    tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5836
                    if (!tmp)
5837
                        goto err;
5838
                    slices = tmp;
5839
                    slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5840
                    if (!slices[n_slices].buf)
5841
                        goto err;
5842
                    buf_size3 = vc1_unescape_buffer(start + 4, size,
5843
                                                    slices[n_slices].buf);
5844
                    init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5845
                                  buf_size3 << 3);
5846
                    /* assuming that the field marker is at the exact middle,
5847
                       hope it's correct */
5848
                    slices[n_slices].mby_start = s->mb_height >> 1;
5849
                    n_slices1 = n_slices - 1; // index of the last slice of the first field
5850
                    n_slices++;
5851
                    break;
5852
                }
5853
                case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
5854
                    buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5855
                    init_get_bits(&s->gb, buf2, buf_size2 * 8);
5856
                    ff_vc1_decode_entry_point(avctx, v, &s->gb);
5857
                    break;
5858
                case VC1_CODE_SLICE: {
5859
                    int buf_size3;
5860
                    tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5861
                    if (!tmp)
5862
                        goto err;
5863
                    slices = tmp;
5864
                    slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5865
                    if (!slices[n_slices].buf)
5866
                        goto err;
5867
                    buf_size3 = vc1_unescape_buffer(start + 4, size,
5868
                                                    slices[n_slices].buf);
5869
                    init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5870
                                  buf_size3 << 3);
5871
                    slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
5872
                    n_slices++;
5873
                    break;
5874
                }
5875
                }
5876
            }
5877
        } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
5878
            const uint8_t *divider;
5879
            int buf_size3;
5880
 
5881
            divider = find_next_marker(buf, buf + buf_size);
5882
            if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
5883
                av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
5884
                goto err;
5885
            } else { // found field marker, unescape second field
5886
                if (avctx->hwaccel ||
5887
                    s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5888
                    buf_start_second_field = divider;
5889
                tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5890
                if (!tmp)
5891
                    goto err;
5892
                slices = tmp;
5893
                slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5894
                if (!slices[n_slices].buf)
5895
                    goto err;
5896
                buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
5897
                init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5898
                              buf_size3 << 3);
5899
                slices[n_slices].mby_start = s->mb_height >> 1;
5900
                n_slices1 = n_slices - 1;
5901
                n_slices++;
5902
            }
5903
            buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
5904
        } else {
5905
            buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
5906
        }
5907
        init_get_bits(&s->gb, buf2, buf_size2*8);
5908
    } else
5909
        init_get_bits(&s->gb, buf, buf_size*8);
5910
 
5911
    if (v->res_sprite) {
5912
        v->new_sprite  = !get_bits1(&s->gb);
5913
        v->two_sprites =  get_bits1(&s->gb);
5914
        /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
5915
           we're using the sprite compositor. These are intentionally kept separate
5916
           so you can get the raw sprites by using the wmv3 decoder for WMVP or
5917
           the vc1 one for WVP2 */
5918
        if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5919
            if (v->new_sprite) {
5920
                // switch AVCodecContext parameters to those of the sprites
5921
                avctx->width  = avctx->coded_width  = v->sprite_width;
5922
                avctx->height = avctx->coded_height = v->sprite_height;
5923
            } else {
5924
                goto image;
5925
            }
5926
        }
5927
    }
5928
 
5929
    if (s->context_initialized &&
5930
        (s->width  != avctx->coded_width ||
5931
         s->height != avctx->coded_height)) {
5932
        ff_vc1_decode_end(avctx);
5933
    }
5934
 
5935
    if (!s->context_initialized) {
5936
        if (ff_msmpeg4_decode_init(avctx) < 0)
5937
            goto err;
5938
        if (ff_vc1_decode_init_alloc_tables(v) < 0) {
5939
            ff_MPV_common_end(s);
5940
            goto err;
5941
        }
5942
 
5943
        s->low_delay = !avctx->has_b_frames || v->res_sprite;
5944
 
5945
        if (v->profile == PROFILE_ADVANCED) {
5946
            if(avctx->coded_width<=1 || avctx->coded_height<=1)
5947
                goto err;
5948
            s->h_edge_pos = avctx->coded_width;
5949
            s->v_edge_pos = avctx->coded_height;
5950
        }
5951
    }
5952
 
5953
    /* We need to set current_picture_ptr before reading the header,
5954
     * otherwise we cannot store anything in there. */
5955
    if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
5956
        int i = ff_find_unused_picture(s, 0);
5957
        if (i < 0)
5958
            goto err;
5959
        s->current_picture_ptr = &s->picture[i];
5960
    }
5961
 
5962
    // do parse frame header
5963
    v->pic_header_flag = 0;
5964
    v->first_pic_header_flag = 1;
5965
    if (v->profile < PROFILE_ADVANCED) {
5966
        if (ff_vc1_parse_frame_header(v, &s->gb) < 0) {
5967
            goto err;
5968
        }
5969
    } else {
5970
        if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5971
            goto err;
5972
        }
5973
    }
5974
    v->first_pic_header_flag = 0;
5975
 
5976
    if (avctx->debug & FF_DEBUG_PICT_INFO)
5977
        av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
5978
 
5979
    if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5980
        && s->pict_type != AV_PICTURE_TYPE_I) {
5981
        av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
5982
        goto err;
5983
    }
5984
 
5985
    if ((s->mb_height >> v->field_mode) == 0) {
5986
        av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
5987
        goto err;
5988
    }
5989
 
5990
    // process pulldown flags
5991
    s->current_picture_ptr->f.repeat_pict = 0;
5992
    // Pulldown flags are only valid when 'broadcast' has been set.
5993
    // So ticks_per_frame will be 2
5994
    if (v->rff) {
5995
        // repeat field
5996
        s->current_picture_ptr->f.repeat_pict = 1;
5997
    } else if (v->rptfrm) {
5998
        // repeat frames
5999
        s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
6000
    }
6001
 
6002
    // for skipping the frame
6003
    s->current_picture.f.pict_type = s->pict_type;
6004
    s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
6005
 
6006
    /* skip B-frames if we don't have reference frames */
6007
    if (s->last_picture_ptr == NULL && (s->pict_type == AV_PICTURE_TYPE_B || s->droppable)) {
6008
        goto err;
6009
    }
6010
    if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
6011
        (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
6012
         avctx->skip_frame >= AVDISCARD_ALL) {
6013
        goto end;
6014
    }
6015
 
6016
    if (s->next_p_frame_damaged) {
6017
        if (s->pict_type == AV_PICTURE_TYPE_B)
6018
            goto end;
6019
        else
6020
            s->next_p_frame_damaged = 0;
6021
    }
6022
 
6023
    if (ff_MPV_frame_start(s, avctx) < 0) {
6024
        goto err;
6025
    }
6026
 
6027
    v->s.current_picture_ptr->f.interlaced_frame = (v->fcm != PROGRESSIVE);
6028
    v->s.current_picture_ptr->f.top_field_first  = v->tff;
6029
 
6030
    s->me.qpel_put = s->dsp.put_qpel_pixels_tab;
6031
    s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
6032
 
6033
    if ((CONFIG_VC1_VDPAU_DECODER)
6034
        &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
6035
        if (v->field_mode && buf_start_second_field) {
6036
            ff_vdpau_vc1_decode_picture(s, buf_start, buf_start_second_field - buf_start);
6037
            ff_vdpau_vc1_decode_picture(s, buf_start_second_field, (buf + buf_size) - buf_start_second_field);
6038
        } else {
6039
            ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
6040
        }
6041
    } else if (avctx->hwaccel) {
6042
        if (v->field_mode && buf_start_second_field) {
6043
            // decode first field
6044
            s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
6045
            if (avctx->hwaccel->start_frame(avctx, buf_start, buf_start_second_field - buf_start) < 0)
6046
                goto err;
6047
            if (avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start) < 0)
6048
                goto err;
6049
            if (avctx->hwaccel->end_frame(avctx) < 0)
6050
                goto err;
6051
 
6052
            // decode second field
6053
            s->gb = slices[n_slices1 + 1].gb;
6054
            s->picture_structure = PICT_TOP_FIELD + v->tff;
6055
            v->second_field = 1;
6056
            v->pic_header_flag = 0;
6057
            if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
6058
                av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
6059
                goto err;
6060
            }
6061
            v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
6062
 
6063
            if (avctx->hwaccel->start_frame(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
6064
                goto err;
6065
            if (avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
6066
                goto err;
6067
            if (avctx->hwaccel->end_frame(avctx) < 0)
6068
                goto err;
6069
        } else {
6070
            s->picture_structure = PICT_FRAME;
6071
            if (avctx->hwaccel->start_frame(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
6072
                goto err;
6073
            if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
6074
                goto err;
6075
            if (avctx->hwaccel->end_frame(avctx) < 0)
6076
                goto err;
6077
        }
6078
    } else {
6079
        int header_ret = 0;
6080
 
6081
        ff_mpeg_er_frame_start(s);
6082
 
6083
        v->bits = buf_size * 8;
6084
        v->end_mb_x = s->mb_width;
6085
        if (v->field_mode) {
6086
            s->current_picture.f.linesize[0] <<= 1;
6087
            s->current_picture.f.linesize[1] <<= 1;
6088
            s->current_picture.f.linesize[2] <<= 1;
6089
            s->linesize                      <<= 1;
6090
            s->uvlinesize                    <<= 1;
6091
        }
6092
        mb_height = s->mb_height >> v->field_mode;
6093
 
6094
        av_assert0 (mb_height > 0);
6095
 
6096
        for (i = 0; i <= n_slices; i++) {
6097
            if (i > 0 &&  slices[i - 1].mby_start >= mb_height) {
6098
                if (v->field_mode <= 0) {
6099
                    av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
6100
                           "picture boundary (%d >= %d)\n", i,
6101
                           slices[i - 1].mby_start, mb_height);
6102
                    continue;
6103
                }
6104
                v->second_field = 1;
6105
                v->blocks_off   = s->b8_stride * (s->mb_height&~1);
6106
                v->mb_off       = s->mb_stride * s->mb_height >> 1;
6107
            } else {
6108
                v->second_field = 0;
6109
                v->blocks_off   = 0;
6110
                v->mb_off       = 0;
6111
            }
6112
            if (i) {
6113
                v->pic_header_flag = 0;
6114
                if (v->field_mode && i == n_slices1 + 2) {
6115
                    if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
6116
                        av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
6117
                        if (avctx->err_recognition & AV_EF_EXPLODE)
6118
                            goto err;
6119
                        continue;
6120
                    }
6121
                } else if (get_bits1(&s->gb)) {
6122
                    v->pic_header_flag = 1;
6123
                    if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
6124
                        av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
6125
                        if (avctx->err_recognition & AV_EF_EXPLODE)
6126
                            goto err;
6127
                        continue;
6128
                    }
6129
                }
6130
            }
6131
            if (header_ret < 0)
6132
                continue;
6133
            s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
6134
            if (!v->field_mode || v->second_field)
6135
                s->end_mb_y = (i == n_slices     ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
6136
            else {
6137
                if (i >= n_slices) {
6138
                    av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
6139
                    continue;
6140
                }
6141
                s->end_mb_y = (i <= n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
6142
            }
6143
            if (s->end_mb_y <= s->start_mb_y) {
6144
                av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
6145
                continue;
6146
            }
6147
            if (!v->p_frame_skipped && s->pict_type != AV_PICTURE_TYPE_I && !v->cbpcy_vlc) {
6148
                av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
6149
                continue;
6150
            }
6151
            ff_vc1_decode_blocks(v);
6152
            if (i != n_slices)
6153
                s->gb = slices[i].gb;
6154
        }
6155
        if (v->field_mode) {
6156
            v->second_field = 0;
6157
            s->current_picture.f.linesize[0] >>= 1;
6158
            s->current_picture.f.linesize[1] >>= 1;
6159
            s->current_picture.f.linesize[2] >>= 1;
6160
            s->linesize                      >>= 1;
6161
            s->uvlinesize                    >>= 1;
6162
            if (v->s.pict_type != AV_PICTURE_TYPE_BI && v->s.pict_type != AV_PICTURE_TYPE_B) {
6163
                FFSWAP(uint8_t *, v->mv_f_next[0], v->mv_f[0]);
6164
                FFSWAP(uint8_t *, v->mv_f_next[1], v->mv_f[1]);
6165
            }
6166
        }
6167
        av_dlog(s->avctx, "Consumed %i/%i bits\n",
6168
                get_bits_count(&s->gb), s->gb.size_in_bits);
6169
//  if (get_bits_count(&s->gb) > buf_size * 8)
6170
//      return -1;
6171
        if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B)
6172
            goto err;
6173
        if (!v->field_mode)
6174
            ff_er_frame_end(&s->er);
6175
    }
6176
 
6177
    ff_MPV_frame_end(s);
6178
 
6179
    if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
6180
image:
6181
        avctx->width  = avctx->coded_width  = v->output_width;
6182
        avctx->height = avctx->coded_height = v->output_height;
6183
        if (avctx->skip_frame >= AVDISCARD_NONREF)
6184
            goto end;
6185
#if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
6186
        if (vc1_decode_sprites(v, &s->gb))
6187
            goto err;
6188
#endif
6189
        if ((ret = av_frame_ref(pict, &v->sprite_output_frame)) < 0)
6190
            goto err;
6191
        *got_frame = 1;
6192
    } else {
6193
        if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
6194
            if ((ret = av_frame_ref(pict, &s->current_picture_ptr->f)) < 0)
6195
                goto err;
6196
            ff_print_debug_info(s, s->current_picture_ptr, pict);
6197
        } else if (s->last_picture_ptr != NULL) {
6198
            if ((ret = av_frame_ref(pict, &s->last_picture_ptr->f)) < 0)
6199
                goto err;
6200
            ff_print_debug_info(s, s->last_picture_ptr, pict);
6201
        }
6202
        if (s->last_picture_ptr || s->low_delay) {
6203
            *got_frame = 1;
6204
        }
6205
    }
6206
 
6207
end:
6208
    av_free(buf2);
6209
    for (i = 0; i < n_slices; i++)
6210
        av_free(slices[i].buf);
6211
    av_free(slices);
6212
    return buf_size;
6213
 
6214
err:
6215
    av_free(buf2);
6216
    for (i = 0; i < n_slices; i++)
6217
        av_free(slices[i].buf);
6218
    av_free(slices);
6219
    return -1;
6220
}
6221
 
6222
 
6223
static const AVProfile profiles[] = {
6224
    { FF_PROFILE_VC1_SIMPLE,   "Simple"   },
6225
    { FF_PROFILE_VC1_MAIN,     "Main"     },
6226
    { FF_PROFILE_VC1_COMPLEX,  "Complex"  },
6227
    { FF_PROFILE_VC1_ADVANCED, "Advanced" },
6228
    { FF_PROFILE_UNKNOWN },
6229
};
6230
 
6231
static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
6232
#if CONFIG_DXVA2
6233
    AV_PIX_FMT_DXVA2_VLD,
6234
#endif
6235
#if CONFIG_VAAPI
6236
    AV_PIX_FMT_VAAPI_VLD,
6237
#endif
6238
#if CONFIG_VDPAU
6239
    AV_PIX_FMT_VDPAU,
6240
#endif
6241
    AV_PIX_FMT_YUV420P,
6242
    AV_PIX_FMT_NONE
6243
};
6244
 
6245
AVCodec ff_vc1_decoder = {
6246
    .name           = "vc1",
6247
    .long_name      = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
6248
    .type           = AVMEDIA_TYPE_VIDEO,
6249
    .id             = AV_CODEC_ID_VC1,
6250
    .priv_data_size = sizeof(VC1Context),
6251
    .init           = vc1_decode_init,
6252
    .close          = ff_vc1_decode_end,
6253
    .decode         = vc1_decode_frame,
6254
    .flush          = ff_mpeg_flush,
6255
    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
6256
    .pix_fmts       = vc1_hwaccel_pixfmt_list_420,
6257
    .profiles       = NULL_IF_CONFIG_SMALL(profiles)
6258
};
6259
 
6260
#if CONFIG_WMV3_DECODER
6261
AVCodec ff_wmv3_decoder = {
6262
    .name           = "wmv3",
6263
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
6264
    .type           = AVMEDIA_TYPE_VIDEO,
6265
    .id             = AV_CODEC_ID_WMV3,
6266
    .priv_data_size = sizeof(VC1Context),
6267
    .init           = vc1_decode_init,
6268
    .close          = ff_vc1_decode_end,
6269
    .decode         = vc1_decode_frame,
6270
    .flush          = ff_mpeg_flush,
6271
    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
6272
    .pix_fmts       = vc1_hwaccel_pixfmt_list_420,
6273
    .profiles       = NULL_IF_CONFIG_SMALL(profiles)
6274
};
6275
#endif
6276
 
6277
#if CONFIG_WMV3_VDPAU_DECODER
6278
AVCodec ff_wmv3_vdpau_decoder = {
6279
    .name           = "wmv3_vdpau",
6280
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
6281
    .type           = AVMEDIA_TYPE_VIDEO,
6282
    .id             = AV_CODEC_ID_WMV3,
6283
    .priv_data_size = sizeof(VC1Context),
6284
    .init           = vc1_decode_init,
6285
    .close          = ff_vc1_decode_end,
6286
    .decode         = vc1_decode_frame,
6287
    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
6288
    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_WMV3, AV_PIX_FMT_NONE },
6289
    .profiles       = NULL_IF_CONFIG_SMALL(profiles)
6290
};
6291
#endif
6292
 
6293
#if CONFIG_VC1_VDPAU_DECODER
6294
AVCodec ff_vc1_vdpau_decoder = {
6295
    .name           = "vc1_vdpau",
6296
    .long_name      = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
6297
    .type           = AVMEDIA_TYPE_VIDEO,
6298
    .id             = AV_CODEC_ID_VC1,
6299
    .priv_data_size = sizeof(VC1Context),
6300
    .init           = vc1_decode_init,
6301
    .close          = ff_vc1_decode_end,
6302
    .decode         = vc1_decode_frame,
6303
    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
6304
    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_VC1, AV_PIX_FMT_NONE },
6305
    .profiles       = NULL_IF_CONFIG_SMALL(profiles)
6306
};
6307
#endif
6308
 
6309
#if CONFIG_WMV3IMAGE_DECODER
6310
AVCodec ff_wmv3image_decoder = {
6311
    .name           = "wmv3image",
6312
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
6313
    .type           = AVMEDIA_TYPE_VIDEO,
6314
    .id             = AV_CODEC_ID_WMV3IMAGE,
6315
    .priv_data_size = sizeof(VC1Context),
6316
    .init           = vc1_decode_init,
6317
    .close          = ff_vc1_decode_end,
6318
    .decode         = vc1_decode_frame,
6319
    .capabilities   = CODEC_CAP_DR1,
6320
    .flush          = vc1_sprite_flush,
6321
    .pix_fmts       = ff_pixfmt_list_420
6322
};
6323
#endif
6324
 
6325
#if CONFIG_VC1IMAGE_DECODER
6326
AVCodec ff_vc1image_decoder = {
6327
    .name           = "vc1image",
6328
    .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
6329
    .type           = AVMEDIA_TYPE_VIDEO,
6330
    .id             = AV_CODEC_ID_VC1IMAGE,
6331
    .priv_data_size = sizeof(VC1Context),
6332
    .init           = vc1_decode_init,
6333
    .close          = ff_vc1_decode_end,
6334
    .decode         = vc1_decode_frame,
6335
    .capabilities   = CODEC_CAP_DR1,
6336
    .flush          = vc1_sprite_flush,
6337
    .pix_fmts       = ff_pixfmt_list_420
6338
};
6339
#endif