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
7 * This file is part of FFmpeg.
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.
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.
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
26 * VC-1 and WMV3 decoder
31 #include "error_resilience.h"
32 #include "mpegvideo.h"
34 #include "h264chroma.h"
37 #include "vc1acdata.h"
38 #include "msmpeg4data.h"
41 #include "vdpau_internal.h"
42 #include "libavutil/avassert.h"
47 #define MB_INTRA_VLC_BITS 9
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 };
55 /***********************************************************************/
57 * @name VC-1 Bitplane decoding
75 /** @} */ //imode defines
77 static void init_block_index(VC1Context *v)
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];
88 /** @} */ //Bitplane group
90 static void vc1_put_signed_blocks_clamped(VC1Context *v)
92 MpegEncContext *s = &v->s;
93 int topleft_mb_pos, top_mb_pos;
94 int stride_y, fieldtx = 0;
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
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) {
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,
114 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
115 s->dest[0] - 16 * s->linesize - 8,
117 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
118 s->dest[0] - v_dist * s->linesize - 16,
120 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
121 s->dest[0] - v_dist * s->linesize - 8,
123 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
124 s->dest[1] - 8 * s->uvlinesize - 8,
126 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
127 s->dest[2] - 8 * s->uvlinesize - 8,
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,
139 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
140 s->dest[0] - 16 * s->linesize + 8,
142 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
143 s->dest[0] - v_dist * s->linesize,
145 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
146 s->dest[0] - v_dist * s->linesize + 8,
148 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
149 s->dest[1] - 8 * s->uvlinesize,
151 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
152 s->dest[2] - 8 * s->uvlinesize,
157 #define inc_blk_idx(idx) do { \
159 if (idx >= v->n_allocated_blks) \
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);
169 static void vc1_loop_filter_iblk(VC1Context *v, int pq)
171 MpegEncContext *s = &v->s;
173 if (!s->first_slice_line) {
174 v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
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);
181 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
184 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8 * s->linesize, s->linesize, pq);
186 if (s->mb_y == s->end_mb_y - 1) {
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);
192 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
196 static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
198 MpegEncContext *s = &v->s;
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) {
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);
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);
214 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
218 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
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);
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);
231 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize, s->uvlinesize, pq);
235 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
238 if (s->mb_y == s->end_mb_y) {
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);
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);
250 if (s->mb_x == s->mb_width - 1) {
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);
255 for (j = 0; j < 2; j++) {
256 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
264 static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
266 MpegEncContext *s = &v->s;
269 if (v->condover == CONDOVER_NONE)
272 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
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]);
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]);
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]);
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]);
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]);
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]);
341 /** Do motion compensation over 1 macroblock
342 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
344 static void vc1_mc_1mv(VC1Context *v, int dir)
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;
352 uint8_t (*luty)[256], (*lutuv)[256];
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])
360 mx = s->mv[dir][0][0];
361 my = s->mv[dir][0][1];
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;
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;
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;
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));
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];
393 lutuv = v->curr_lutuv;
394 use_ic = v->curr_use_ic;
396 srcY = s->last_picture.f.data[0];
397 srcU = s->last_picture.f.data[1];
398 srcV = s->last_picture.f.data[2];
400 lutuv = v->last_lutuv;
401 use_ic = v->last_use_ic;
404 srcY = s->next_picture.f.data[0];
405 srcU = s->next_picture.f.data[1];
406 srcV = s->next_picture.f.data[2];
408 lutuv = v->next_lutuv;
409 use_ic = v->next_use_ic;
412 if (!srcY || !srcU) {
413 av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n");
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);
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);
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);
434 srcY += src_y * s->linesize + src_x;
435 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
436 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
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];
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;
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;
456 srcY -= s->mspel * (1 + s->linesize);
457 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, 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);
471 /* if we deal with range reduction we need to scale source blocks */
472 if (v->rangeredfrm) {
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;
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;
489 src += s->uvlinesize;
490 src2 += s->uvlinesize;
493 /* if we deal with intensity compensation we need to scale source blocks */
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]];
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]];
513 src += s->uvlinesize;
514 src2 += s->uvlinesize;
517 srcY += s->mspel * (1 + s->linesize);
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);
530 s->hdsp.put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
532 s->hdsp.put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
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;
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);
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);
548 static inline int median4(int a, int b, int c, int d)
551 if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
552 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
554 if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
555 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
559 /** Do motion compensation for 4-MV macroblock - luminance block
561 static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg)
563 MpegEncContext *s = &v->s;
565 int dxy, mx, my, src_x, src_y;
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];
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])
577 mx = s->mv[dir][n][0];
578 my = s->mv[dir][n][1];
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];
584 use_ic = v->curr_use_ic;
586 srcY = s->last_picture.f.data[0];
588 use_ic = v->last_use_ic;
591 srcY = s->next_picture.f.data[0];
593 use_ic = v->next_use_ic;
597 av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n");
602 if (v->cur_field_type != v->ref_field_type[dir])
603 my = my - 2 + 4 * v->cur_field_type;
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;
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];
617 f = opp_count > same_count;
618 switch (f ? opp_count : same_count) {
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]);
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]);
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;
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;
642 if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture
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;
650 qx = (s->mb_x * 16) + (mx >> 2);
651 qy = (s->mb_y * 8) + (my >> 3);
656 mx -= 4 * (qx - width);
659 else if (qy > height + 1)
660 my -= 8 * (qy - height - 1);
663 if ((v->fcm == ILACE_FRAME) && fieldmv)
664 off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
666 off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
668 src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
670 src_y = s->mb_y * 16 + (n & 2) * 4 + (my >> 2);
672 src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2);
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);
678 src_x = av_clip(src_x, -17, s->avctx->coded_width);
679 if (v->fcm == ILACE_FRAME) {
681 src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
683 src_y = av_clip(src_y, -18, s->avctx->coded_height);
685 src_y = av_clip(src_y, -18, s->avctx->coded_height + 1);
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];
693 if (fieldmv && !(src_y & 1))
695 if (fieldmv && (src_y & 1) && src_y < 4)
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) {
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;
720 /* if we deal with intensity compensation we need to scale source blocks */
726 for (j = 0; j < 9 + s->mspel * 2; j++) {
727 int f = v->field_mode ? v->ref_field_type[dir] : (((j<<fieldmv)+src_y - (s->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;
733 srcY += s->mspel * (1 + (s->linesize << fieldmv));
737 dxy = ((my & 3) << 2) | (mx & 3);
739 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
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);
745 s->hdsp.put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
747 s->hdsp.put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
751 static av_always_inline int get_chroma_mv(int *mvx, int *mvy, int *a, int flag, int *tx, int *ty)
754 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
756 idx = ((a[3] != flag) << 3)
757 | ((a[2] != flag) << 2)
758 | ((a[1] != flag) << 1)
761 *tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
762 *ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
764 } else if (count[idx] == 1) {
767 *tx = mid_pred(mvx[1], mvx[2], mvx[3]);
768 *ty = mid_pred(mvy[1], mvy[2], mvy[3]);
771 *tx = mid_pred(mvx[0], mvx[2], mvx[3]);
772 *ty = mid_pred(mvy[0], mvy[2], mvy[3]);
775 *tx = mid_pred(mvx[0], mvx[1], mvx[3]);
776 *ty = mid_pred(mvy[0], mvy[1], mvy[3]);
779 *tx = mid_pred(mvx[0], mvx[1], mvx[2]);
780 *ty = mid_pred(mvy[0], mvy[1], mvy[2]);
783 } else if (count[idx] == 2) {
785 for (i = 0; i < 3; i++)
790 for (i = t1 + 1; i < 4; i++)
795 *tx = (mvx[t1] + mvx[t2]) / 2;
796 *ty = (mvy[t1] + mvy[t2]) / 2;
804 /** Do motion compensation for 4-MV macroblock - both chroma blocks
806 static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
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];
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];
820 if (!v->field_mode && !v->s.last_picture.f.data[0])
822 if (s->flags & CODEC_FLAG_GRAY)
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]];
830 mv_f[k] = v->mv_f[dir][s->block_index[k] + v->blocks_off];
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;
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
845 if (mv_f[0] + mv_f[1] + mv_f[2] + mv_f[3] > 2)
847 valid_count = get_chroma_mv(mvx, mvy, mv_f, dominant, &tx, &ty);
849 chroma_ref_type = !v->cur_field_type;
851 if (v->field_mode && chroma_ref_type == 1 && v->cur_field_type == 1 && !v->s.last_picture.f.data[0])
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;
858 v->luma_mv[s->mb_x][0] = uvmx;
859 v->luma_mv[s->mb_x][1] = uvmy;
862 uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
863 uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
865 // Field conversion bias
866 if (v->cur_field_type != chroma_ref_type)
867 uvmy += 2 - 4 * chroma_ref_type;
869 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
870 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
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);
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);
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;
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;
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;
900 av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n");
904 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
905 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
908 if (chroma_ref_type) {
909 srcU += s->current_picture_ptr->f.linesize[1];
910 srcV += s->current_picture_ptr->f.linesize[2];
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;
927 /* if we deal with range reduction we need to scale source blocks */
928 if (v->rangeredfrm) {
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;
939 src += s->uvlinesize;
940 src2 += s->uvlinesize;
943 /* if we deal with intensity compensation we need to scale source blocks */
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]];
956 src += s->uvlinesize;
957 src2 += s->uvlinesize;
962 /* Chroma MC always uses qpel bilinear */
963 uvmx = (uvmx & 3) << 1;
964 uvmy = (uvmy & 3) << 1;
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);
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);
974 /** Do motion compensation for 4-MV interlaced frame chroma macroblock (both U and V)
976 static void vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg)
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];
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;
989 uint8_t (*lutuv)[256];
991 if (s->flags & CODEC_FLAG_GRAY)
994 for (i = 0; i < 4; i++) {
995 int d = i < 2 ? dir: dir2;
997 uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1;
1000 uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF];
1002 uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1;
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;
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;
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;
1030 if (fieldmv && !(uvsrc_y & 1))
1031 v_edge_pos = (s->v_edge_pos >> 1) - 1;
1033 if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2)
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;
1048 /* if we deal with intensity compensation we need to scale source blocks */
1051 uint8_t *src, *src2;
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]];
1061 src += s->uvlinesize << fieldmv;
1062 src2 += s->uvlinesize << fieldmv;
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]);
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]);
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]);
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]);
1086 /***********************************************************************/
1088 * @name VC-1 Block-level functions
1089 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1095 * @brief Get macroblock-level quantizer scale
1097 #define GET_MQUANT() \
1098 if (v->dquantfrm) { \
1100 if (v->dqprofile == DQPROFILE_ALL_MBS) { \
1101 if (v->dqbilevel) { \
1102 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
1104 mqdiff = get_bits(gb, 3); \
1106 mquant = v->pq + mqdiff; \
1108 mquant = get_bits(gb, 5); \
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) \
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); \
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
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); \
1143 mb_has_coeffs = 1; \
1146 mb_has_coeffs = 0; \
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) { \
1158 index1 = index % 6; \
1159 if (!s->quarter_sample && index1 == 5) val = 1; \
1161 if (size_table[index1] - val > 0) \
1162 val = get_bits(gb, size_table[index1] - val); \
1164 sign = 0 - (val&1); \
1165 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1167 index1 = index / 6; \
1168 if (!s->quarter_sample && index1 == 5) val = 1; \
1170 if (size_table[index1] - val > 0) \
1171 val = get_bits(gb, size_table[index1] - val); \
1173 sign = 0 - (val & 1); \
1174 _dmv_y = (sign ^ ((val >> 1) + offset_table[index1])) - sign; \
1177 static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x,
1178 int *dmv_y, int *pred_flag)
1181 int extend_x = 0, extend_y = 0;
1182 GetBitContext *gb = &v->s.gb;
1185 const int* offs_tab;
1188 bits = VC1_2REF_MVDATA_VLC_BITS;
1191 bits = VC1_1REF_MVDATA_VLC_BITS;
1194 switch (v->dmvrange) {
1202 extend_x = extend_y = 1;
1205 index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
1207 *dmv_x = get_bits(gb, v->k_x);
1208 *dmv_y = get_bits(gb, v->k_y);
1211 *pred_flag = *dmv_y & 1;
1212 *dmv_y = (*dmv_y + *pred_flag) >> 1;
1214 *dmv_y = (*dmv_y + (*dmv_y & 1)) >> 1;
1219 av_assert0(index < esc);
1221 offs_tab = offset_table2;
1223 offs_tab = offset_table1;
1224 index1 = (index + 1) % 9;
1226 val = get_bits(gb, index1 + extend_x);
1227 sign = 0 -(val & 1);
1228 *dmv_x = (sign ^ ((val >> 1) + offs_tab[index1])) - sign;
1232 offs_tab = offset_table2;
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;
1242 if (v->numref && pred_flag)
1243 *pred_flag = index1 & 1;
1247 static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int dir)
1249 int scaledvalue, refdist;
1250 int scalesame1, scalesame2;
1251 int scalezone1_x, zone1offset_x;
1252 int table_index = dir ^ v->second_field;
1254 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1255 refdist = v->refdist;
1257 refdist = dir ? v->brfd : v->frfd;
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];
1268 if (FFABS(n) < scalezone1_x)
1269 scaledvalue = (n * scalesame1) >> 8;
1272 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x;
1274 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x;
1277 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1280 static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, int dir)
1282 int scaledvalue, refdist;
1283 int scalesame1, scalesame2;
1284 int scalezone1_y, zone1offset_y;
1285 int table_index = dir ^ v->second_field;
1287 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1288 refdist = v->refdist;
1290 refdist = dir ? v->brfd : v->frfd;
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];
1301 if (FFABS(n) < scalezone1_y)
1302 scaledvalue = (n * scalesame1) >> 8;
1305 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y;
1307 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y;
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);
1314 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1317 static av_always_inline int scaleforopp_x(VC1Context *v, int n /* MV */)
1319 int scalezone1_x, zone1offset_x;
1320 int scaleopp1, scaleopp2, brfd;
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];
1332 if (FFABS(n) < scalezone1_x)
1333 scaledvalue = (n * scaleopp1) >> 8;
1336 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x;
1338 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x;
1341 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1344 static av_always_inline int scaleforopp_y(VC1Context *v, int n /* MV */, int dir)
1346 int scalezone1_y, zone1offset_y;
1347 int scaleopp1, scaleopp2, brfd;
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];
1359 if (FFABS(n) < scalezone1_y)
1360 scaledvalue = (n * scaleopp1) >> 8;
1363 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y;
1365 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y;
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);
1371 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1375 static av_always_inline int scaleforsame(VC1Context *v, int i, int n /* MV */,
1378 int brfd, scalesame;
1379 int hpel = 1 - v->s.quarter_sample;
1382 if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) {
1384 n = scaleforsame_y(v, i, n, dir) << hpel;
1386 n = scaleforsame_x(v, n, dir) << hpel;
1389 brfd = FFMIN(v->brfd, 3);
1390 scalesame = ff_vc1_b_field_mvpred_scales[0][brfd];
1392 n = (n * scalesame >> 8) << hpel;
1396 static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */,
1399 int refdist, scaleopp;
1400 int hpel = 1 - v->s.quarter_sample;
1403 if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
1405 n = scaleforopp_y(v, n, dir) << hpel;
1407 n = scaleforopp_x(v, n) << hpel;
1410 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1411 refdist = FFMIN(v->refdist, 3);
1413 refdist = dir ? v->brfd : v->frfd;
1414 scaleopp = ff_vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
1416 n = (n * scaleopp >> 8) << hpel;
1420 /** Predict and set motion vector
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)
1426 MpegEncContext *s = &v->s;
1427 int xy, wrap, off = 0;
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;
1439 if (v->mv_mode == MV_PMODE_MIXED_MV ||
1440 ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV)))
1444 /* scale MV difference to be quad-pel */
1445 dmv_x <<= 1 - s->quarter_sample;
1446 dmv_y <<= 1 - s->quarter_sample;
1448 wrap = s->b8_stride;
1449 xy = s->block_index[n];
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;
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];
1477 if (v->field_mode && mixedmv_pic)
1478 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
1480 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1482 //in 4-MV mode different blocks have different B predictor position
1485 off = (s->mb_x > 0) ? -1 : 1;
1488 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
1497 B = s->current_picture.motion_val[dir][xy - wrap + off + v->blocks_off];
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];
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];
1515 field_predA[0] = field_predA[1] = 0;
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];
1525 field_predB[0] = field_predB[1] = 0;
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];
1535 field_predC[0] = field_predC[1] = 0;
1539 if (v->field_mode) {
1541 // REFFIELD determines if the last field or the second-last field is
1542 // to be used as reference
1543 opposite = 1 - v->reffield;
1545 if (num_samefield <= num_oppfield)
1546 opposite = 1 - pred_flag;
1548 opposite = pred_flag;
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);
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);
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);
1565 v->mv_f[dir][xy + v->blocks_off] = 1;
1566 v->ref_field_type[dir] = !v->cur_field_type;
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);
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);
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);
1580 v->mv_f[dir][xy + v->blocks_off] = 0;
1581 v->ref_field_type[dir] = v->cur_field_type;
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];
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]);
1603 /* Pullback MV as specified in 8.3.5.3.4 */
1604 if (!v->field_mode) {
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;
1611 if (qx + px < -60) px = -60 - qx;
1612 if (qy + py < -60) py = -60 - qy;
1614 if (qx + px < -28) px = -28 - qx;
1615 if (qy + py < -28) py = -28 - qy;
1617 if (qx + px > X) px = X - qx;
1618 if (qy + py > Y) py = Y - qy;
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);
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];
1634 px = field_predC[0];
1635 py = field_predC[1];
1638 if (is_intra[xy - 1])
1639 sum = FFABS(px) + FFABS(py);
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];
1647 px = field_predC[0];
1648 py = field_predC[1];
1655 if (v->field_mode && v->numref)
1657 if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0)
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];
1674 /** Predict and set motion vector for interlaced frame picture MBs
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)
1679 MpegEncContext *s = &v->s;
1680 int xy, wrap, off = 0;
1681 int A[2], B[2], C[2];
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;
1688 wrap = s->b8_stride;
1689 xy = s->block_index[n];
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;
1714 off = ((n == 0) || (n == 1)) ? 1 : -1;
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];
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;
1729 if (!(n & 1) && v->is_intra[s->mb_x - 1]) {
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]) {
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);
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;
1753 if (s->mb_width > 1) {
1754 if (!v->is_intra[s->mb_x - s->mb_stride + 1]) {
1757 pos_c = s->block_index[2] - 2 * wrap + 2;
1758 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
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;
1767 if (s->mb_x == s->mb_width - 1) {
1768 if (!v->is_intra[s->mb_x - s->mb_stride - 1]) {
1771 pos_c = s->block_index[3] - 2 * wrap - 2;
1772 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
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;
1788 pos_b = s->block_index[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];
1794 C[0] = s->current_picture.motion_val[dir][pos_c][0];
1795 C[1] = s->current_picture.motion_val[dir][pos_c][1];
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)) {
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;
1807 if (!v->blk_mv_type[xy]) {
1808 if (s->mb_width == 1) {
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]; }
1823 field_a = (A[1] & 4) ? 1 : 0;
1827 field_b = (B[1] & 4) ? 1 : 0;
1831 field_c = (C[1] & 4) ? 1 : 0;
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];
1847 px = field_a ? A[0] : B[0];
1848 py = field_a ? A[1] : B[1];
1850 } else if (total_valid == 2) {
1851 if (num_samefield >= num_oppfield) {
1852 if (!field_a && a_valid) {
1855 } else if (!field_b && b_valid) {
1858 } else /*if (c_valid)*/ {
1859 av_assert1(c_valid);
1862 } /*else px = py = 0;*/
1864 if (field_a && a_valid) {
1867 } else /*if (field_b && b_valid)*/ {
1868 av_assert1(field_b && b_valid);
1871 } /*else if (c_valid) {
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]);
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];
1900 /** Motion compensation for direct or interpolated blocks in B-frames
1902 static void vc1_interp_mc(VC1Context *v)
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;
1909 int v_edge_pos = s->v_edge_pos >> v->field_mode;
1910 int use_ic = v->next_use_ic;
1912 if (!v->field_mode && !v->s.next_picture.f.data[0])
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;
1925 uvmx = uvmx + ((uvmx < 0) ? -(uvmx & 1) : (uvmx & 1));
1926 uvmy = uvmy + ((uvmy < 0) ? -(uvmy & 1) : (uvmy & 1));
1928 srcY = s->next_picture.f.data[0];
1929 srcU = s->next_picture.f.data[1];
1930 srcV = s->next_picture.f.data[2];
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);
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);
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);
1949 srcY += src_y * s->linesize + src_x;
1950 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
1951 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
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];
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;
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;
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);
1984 /* if we deal with range reduction we need to scale source blocks */
1985 if (v->rangeredfrm) {
1987 uint8_t *src, *src2;
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;
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;
2002 src += s->uvlinesize;
2003 src2 += s->uvlinesize;
2008 uint8_t (*luty )[256] = v->next_luty;
2009 uint8_t (*lutuv)[256] = v->next_lutuv;
2011 uint8_t *src, *src2;
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]];
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]];
2028 src += s->uvlinesize;
2029 src2 += s->uvlinesize;
2032 srcY += s->mspel * (1 + s->linesize);
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);
2046 dxy = (my & 2) | ((mx & 2) >> 1);
2049 s->hdsp.avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
2051 s->hdsp.avg_no_rnd_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, 16);
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;
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);
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);
2067 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
2071 #if B_FRACTION_DEN==256
2075 return 2 * ((value * n + 255) >> 9);
2076 return (value * n + 128) >> 8;
2079 n -= B_FRACTION_DEN;
2081 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
2082 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
2086 /** Reconstruct motion vector for B-frame and do motion compensation
2088 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
2089 int direct, int mode)
2096 if (mode == BMV_TYPE_INTERPOLATED) {
2102 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
2105 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2],
2106 int direct, int mvtype)
2108 MpegEncContext *s = &v->s;
2109 int xy, wrap, off = 0;
2114 const uint8_t *is_intra = v->mb_type[0];
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;
2124 wrap = s->b8_stride;
2125 xy = s->block_index[0];
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;
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);
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));
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];
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];
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) {
2166 px = mid_pred(A[0], B[0], C[0]);
2167 py = mid_pred(A[1], B[1], C[1]);
2169 } else if (s->mb_x) { // predictor C is not out of bounds
2175 /* Pullback MV as specified in 8.3.5.3.4 */
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;
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;
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);
2203 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2205 if (get_bits1(&s->gb)) {
2213 if (is_intra[xy - 2])
2214 sum = FFABS(px) + FFABS(py);
2216 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2218 if (get_bits1(&s->gb)) {
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;
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];
2240 if (!s->first_slice_line) { // predictor A is not out of bounds
2241 if (s->mb_width == 1) {
2245 px = mid_pred(A[0], B[0], C[0]);
2246 py = mid_pred(A[1], B[1], C[1]);
2248 } else if (s->mb_x) { // predictor C is not out of bounds
2254 /* Pullback MV as specified in 8.3.5.3.4 */
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;
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;
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);
2282 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2284 if (get_bits1(&s->gb)) {
2292 if (is_intra[xy - 2])
2293 sum = FFABS(px) + FFABS(py);
2295 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2297 if (get_bits1(&s->gb)) {
2307 /* store MV using signed modulus of MV range defined in 4.11 */
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;
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];
2318 static inline void vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, int mv1, int *pred_flag)
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;
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);
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;
2342 s->mv[0][0][0] = s->mv[0][0][1] = 0;
2343 s->mv[1][0][0] = s->mv[1][0][1] = 0;
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;
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);
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);
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);
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
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)
2387 int a, b, c, wrap, pred, scale;
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
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;
2400 wrap = s->block_wrap[n];
2401 dc_val = s->dc_val[0] + s->block_index[n];
2407 b = dc_val[ - 1 - wrap];
2408 a = dc_val[ - wrap];
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];
2417 /* Set outer values */
2418 if (s->first_slice_line && (n != 2 && n != 3))
2420 if (s->mb_x == 0 && (n != 1 && n != 3))
2424 if (abs(a - b) <= abs(b - c)) {
2426 *dir_ptr = 1; // left
2429 *dir_ptr = 0; // top
2432 /* update predictor */
2433 *dc_val_ptr = &dc_val[0];
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
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)
2453 int a, b, c, wrap, pred;
2455 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2459 wrap = s->block_wrap[n];
2460 dc_val = s->dc_val[0] + s->block_index[n];
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)
2473 if (c_avail && (n != 1 && n != 3)) {
2474 q2 = s->current_picture.qscale_table[mb_pos - 1];
2476 c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2478 if (a_avail && (n != 2 && n != 3)) {
2479 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2481 a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2483 if (a_avail && c_avail && (n != 3)) {
2488 off -= s->mb_stride;
2489 q2 = s->current_picture.qscale_table[off];
2491 b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2494 if (a_avail && c_avail) {
2495 if (abs(a - b) <= abs(b - c)) {
2497 *dir_ptr = 1; // left
2500 *dir_ptr = 0; // top
2502 } else if (a_avail) {
2504 *dir_ptr = 0; // top
2505 } else if (c_avail) {
2507 *dir_ptr = 1; // left
2510 *dir_ptr = 1; // left
2513 /* update predictor */
2514 *dc_val_ptr = &dc_val[0];
2518 /** @} */ // Block group
2521 * @name VC1 Macroblock-level functions in Simple/Main Profiles
2522 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2526 static inline int vc1_coded_block_pred(MpegEncContext * s, int n,
2527 uint8_t **coded_block_ptr)
2529 int xy, wrap, pred, a, b, c;
2531 xy = s->block_index[n];
2532 wrap = s->b8_stride;
2537 a = s->coded_block[xy - 1 ];
2538 b = s->coded_block[xy - 1 - wrap];
2539 c = s->coded_block[xy - wrap];
2548 *coded_block_ptr = &s->coded_block[xy];
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
2562 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
2563 int *value, int codingset)
2565 GetBitContext *gb = &v->s.gb;
2566 int index, escape, run = 0, level = 0, lst = 0;
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;
2576 escape = decode210(gb);
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];
2584 level += vc1_last_delta_level_table[codingset][run];
2586 level += vc1_delta_level_table[codingset][run];
2589 run += vc1_last_delta_run_table[codingset][level] + 1;
2591 run += vc1_delta_run_table[codingset][level] + 1;
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;
2606 v->s.esc3_run_length = 3 + get_bits(gb, 2);
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);
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
2628 static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
2629 int coded, int codingset)
2631 GetBitContext *gb = &v->s.gb;
2632 MpegEncContext *s = &v->s;
2633 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2636 int16_t *ac_val, *ac_val2;
2639 /* Get DC differential */
2641 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2643 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2646 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
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);
2657 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2658 else if (v->pq == 2)
2659 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
2666 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2669 /* Store the quantized DC coeff, used for prediction */
2671 block[0] = dcdiff * s->y_dc_scale;
2673 block[0] = dcdiff * s->c_dc_scale;
2684 int last = 0, skip, value;
2685 const uint8_t *zz_table;
2689 scale = v->pq * 2 + v->halfpq;
2693 zz_table = v->zz_8x8[2];
2695 zz_table = v->zz_8x8[3];
2697 zz_table = v->zz_8x8[1];
2699 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2701 if (dc_pred_dir) // left
2704 ac_val -= 16 * s->block_wrap[n];
2707 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2711 block[zz_table[i++]] = value;
2714 /* apply AC prediction if needed */
2716 if (dc_pred_dir) { // left
2717 for (k = 1; k < 8; k++)
2718 block[k << v->left_blk_sh] += ac_val[k];
2720 for (k = 1; k < 8; k++)
2721 block[k << v->top_blk_sh] += ac_val[k + 8];
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];
2730 /* scale AC coeffs */
2731 for (k = 1; k < 64; k++)
2735 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2738 if (s->ac_pred) i = 63;
2744 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2748 scale = v->pq * 2 + v->halfpq;
2749 memset(ac_val2, 0, 16 * 2);
2750 if (dc_pred_dir) { // left
2753 memcpy(ac_val2, ac_val, 8 * 2);
2755 ac_val -= 16 * s->block_wrap[n];
2757 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2760 /* apply AC prediction if needed */
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;
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;
2778 s->block_last_index[n] = i;
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
2791 static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n,
2792 int coded, int codingset, int mquant)
2794 GetBitContext *gb = &v->s.gb;
2795 MpegEncContext *s = &v->s;
2796 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2798 int16_t *dc_val = NULL;
2799 int16_t *ac_val, *ac_val2;
2801 int a_avail = v->a_avail, c_avail = v->c_avail;
2802 int use_pred = s->ac_pred;
2805 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2807 /* Get DC differential */
2809 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2811 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2814 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
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);
2825 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2826 else if (mquant == 2)
2827 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
2834 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2837 /* Store the quantized DC coeff, used for prediction */
2839 block[0] = dcdiff * s->y_dc_scale;
2841 block[0] = dcdiff * s->c_dc_scale;
2847 /* check if AC is needed at all */
2848 if (!a_avail && !c_avail)
2850 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2853 scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
2855 if (dc_pred_dir) // left
2858 ac_val -= 16 * s->block_wrap[n];
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)
2867 if (!dc_pred_dir && n == 2)
2873 int last = 0, skip, value;
2874 const uint8_t *zz_table;
2878 if (!use_pred && v->fcm == ILACE_FRAME) {
2879 zz_table = v->zzi_8x8;
2881 if (!dc_pred_dir) // top
2882 zz_table = v->zz_8x8[2];
2884 zz_table = v->zz_8x8[3];
2887 if (v->fcm != ILACE_FRAME)
2888 zz_table = v->zz_8x8[1];
2890 zz_table = v->zzi_8x8;
2894 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2898 block[zz_table[i++]] = value;
2901 /* apply AC prediction if needed */
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;
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;
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;
2918 if (dc_pred_dir) { //left
2919 for (k = 1; k < 8; k++)
2920 block[k << v->left_blk_sh] += ac_val[k];
2922 for (k = 1; k < 8; k++)
2923 block[k << v->top_blk_sh] += ac_val[k + 8];
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];
2933 /* scale AC coeffs */
2934 for (k = 1; k < 64; k++)
2938 block[k] += (block[k] < 0) ? -mquant : mquant;
2941 if (use_pred) i = 63;
2942 } else { // no AC coeffs
2945 memset(ac_val2, 0, 16 * 2);
2946 if (dc_pred_dir) { // left
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;
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;
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;
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;
2972 /* apply AC prediction if needed */
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;
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;
2990 s->block_last_index[n] = i;
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
3003 static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n,
3004 int coded, int mquant, int codingset)
3006 GetBitContext *gb = &v->s.gb;
3007 MpegEncContext *s = &v->s;
3008 int dc_pred_dir = 0; /* Direction of the DC prediction used */
3010 int16_t *dc_val = NULL;
3011 int16_t *ac_val, *ac_val2;
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;
3019 s->dsp.clear_block(block);
3021 /* XXX: Guard against dumb values of mquant */
3022 mquant = (mquant < 1) ? 0 : ((mquant > 31) ? 31 : mquant);
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];
3028 /* Get DC differential */
3030 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3032 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3035 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
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);
3046 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
3047 else if (mquant == 2)
3048 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
3055 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
3058 /* Store the quantized DC coeff, used for prediction */
3061 block[0] = dcdiff * s->y_dc_scale;
3063 block[0] = dcdiff * s->c_dc_scale;
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;
3076 scale = mquant * 2 + v->halfpq;
3078 if (dc_pred_dir) //left
3081 ac_val -= 16 * s->block_wrap[n];
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)
3090 if (!dc_pred_dir && n == 2)
3092 if (n == 3) q2 = q1;
3095 int last = 0, skip, value;
3099 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
3103 if (v->fcm == PROGRESSIVE)
3104 block[v->zz_8x8[0][i++]] = value;
3106 if (use_pred && (v->fcm == ILACE_FRAME)) {
3107 if (!dc_pred_dir) // top
3108 block[v->zz_8x8[2][i++]] = value;
3110 block[v->zz_8x8[3][i++]] = value;
3112 block[v->zzi_8x8[i++]] = value;
3117 /* apply AC prediction if needed */
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;
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;
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;
3134 if (dc_pred_dir) { // left
3135 for (k = 1; k < 8; k++)
3136 block[k << v->left_blk_sh] += ac_val[k];
3138 for (k = 1; k < 8; k++)
3139 block[k << v->top_blk_sh] += ac_val[k + 8];
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];
3149 /* scale AC coeffs */
3150 for (k = 1; k < 64; k++)
3154 block[k] += (block[k] < 0) ? -mquant : mquant;
3157 if (use_pred) i = 63;
3158 } else { // no AC coeffs
3161 memset(ac_val2, 0, 16 * 2);
3162 if (dc_pred_dir) { // left
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;
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;
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;
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;
3188 /* apply AC prediction if needed */
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;
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;
3206 s->block_last_index[n] = i;
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,
3218 MpegEncContext *s = &v->s;
3219 GetBitContext *gb = &s->gb;
3222 int scale, off, idx, last, skip, value;
3223 int ttblk = ttmb & 7;
3226 s->dsp.clear_block(block);
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)];
3231 if (ttblk == TT_4X4) {
3232 subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
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);
3239 subblkpat ^= 3; // swap decoded pattern bits
3240 if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM)
3242 if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT)
3245 scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
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);
3252 if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3253 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3262 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3267 idx = v->zz_8x8[0][i++];
3269 idx = v->zzi_8x8[i++];
3270 block[idx] = value * scale;
3272 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3276 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
3278 v->vc1dsp.vc1_inv_trans_8x8(block);
3279 s->dsp.add_pixels_clamped(block, dst, linesize);
3284 pat = ~subblkpat & 0xF;
3285 for (j = 0; j < 4; j++) {
3286 last = subblkpat & (1 << (3 - j));
3288 off = (j & 1) * 4 + (j & 2) * 16;
3290 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3295 idx = ff_vc1_simple_progressive_4x4_zz[i++];
3297 idx = ff_vc1_adv_interlaced_4x4_zz[i++];
3298 block[idx + off] = value * scale;
3300 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3302 if (!(subblkpat & (1 << (3 - j))) && !skip_block) {
3304 v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
3306 v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
3311 pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF;
3312 for (j = 0; j < 2; j++) {
3313 last = subblkpat & (1 << (1 - j));
3317 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3322 idx = v->zz_8x4[i++] + off;
3324 idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
3325 block[idx] = value * scale;
3327 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3329 if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
3331 v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off);
3333 v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off);
3338 pat = ~(subblkpat * 5) & 0xF;
3339 for (j = 0; j < 2; j++) {
3340 last = subblkpat & (1 << (1 - j));
3344 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3349 idx = v->zz_4x8[i++] + off;
3351 idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
3352 block[idx] = value * scale;
3354 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3356 if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
3358 v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off);
3360 v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
3366 *ttmb_out |= ttblk << (n * 4);
3370 /** @} */ // Macroblock group
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 };
3375 static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
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;
3385 if (block_num > 3) {
3386 dst = s->dest[block_num - 3];
3388 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
3390 if (s->mb_y != s->end_mb_y || block_num < 2) {
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;
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];
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);
3412 idx = ((bottom_cbp >> 2) | block_cbp) & 3;
3414 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3417 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3419 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
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;
3429 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3432 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3434 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
3439 static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
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;
3449 if (block_num > 3) {
3450 dst = s->dest[block_num - 3] - 8 * linesize;
3452 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
3455 if (s->mb_x != s->mb_width || !(block_num & 5)) {
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];
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];
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);
3472 idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
3474 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3477 v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize, linesize, v->pq);
3479 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
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;
3489 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3492 v->vc1dsp.vc1_h_loop_filter4(dst + linesize * 4, linesize, v->pq);
3494 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
3499 static void vc1_apply_p_loop_filter(VC1Context *v)
3501 MpegEncContext *s = &v->s;
3504 for (i = 0; i < 6; i++) {
3505 vc1_apply_p_v_loop_filter(v, i);
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 */
3511 for (i = 0; i < 6; i++) {
3512 vc1_apply_p_h_loop_filter(v, i);
3514 if (s->mb_x == s->mb_width - 1) {
3516 ff_update_block_index(s);
3517 for (i = 0; i < 6; i++) {
3518 vc1_apply_p_h_loop_filter(v, i);
3524 /** Decode one P-frame MB
3526 static int vc1_decode_p_mb(VC1Context *v)
3528 MpegEncContext *s = &v->s;
3529 GetBitContext *gb = &s->gb;
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 */
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;
3542 int skipped, fourmv;
3543 int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
3545 mquant = v->pq; /* lossy initialization */
3547 if (v->mv_type_is_raw)
3548 fourmv = get_bits1(gb);
3550 fourmv = v->mv_type_mb_plane[mb_pos];
3552 skipped = get_bits1(gb);
3554 skipped = v->s.mbskip_table[mb_pos];
3556 if (!fourmv) { /* 1MV mode */
3558 GET_MVDATA(dmv_x, dmv_y);
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;
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);
3567 /* FIXME Set DC val for inter block ? */
3568 if (s->mb_intra && !mb_has_coeffs) {
3570 s->ac_pred = get_bits1(gb);
3572 } else if (mb_has_coeffs) {
3574 s->ac_pred = get_bits1(gb);
3575 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3581 s->current_picture.qscale_table[mb_pos] = mquant;
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);
3588 for (i = 0; i < 6; i++) {
3589 s->dc_val[0][s->block_index[i]] = 0;
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;
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];
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))
3606 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
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) {
3613 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3615 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3617 block_cbp |= 0xF << (i << 2);
3618 block_intra |= 1 << i;
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)
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;
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);
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];
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;
3655 GET_MVDATA(dmv_x, dmv_y);
3657 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
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;
3665 is_intra[i] = (intra_count >= 3);
3669 vc1_mc_4mv_chroma(v, 0);
3670 v->mb_type[0][s->block_index[i]] = is_intra[i];
3672 coded_inter = !is_intra[i] & is_coded[i];
3674 // if there are no coded blocks then don't do anything more
3676 if (!intra_count && !coded_inter)
3679 s->current_picture.qscale_table[mb_pos] = mquant;
3680 /* test if block is intra and has pred */
3683 for (i = 0; i < 6; 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])) {
3692 s->ac_pred = get_bits1(gb);
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++) {
3700 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3701 s->mb_intra = 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];
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))
3714 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
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) {
3722 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3724 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
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),
3734 block_cbp |= pat << (i << 2);
3735 if (!v->ttmbf && ttmb < 8)
3740 } else { // skipped MB
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;
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);
3751 vc1_mc_4mv_chroma(v, 0);
3752 s->current_picture.qscale_table[mb_pos] = 0;
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;
3763 /* Decode one macroblock in an interlaced frame p picture */
3765 static int vc1_decode_p_mb_intfr(VC1Context *v)
3767 MpegEncContext *s = &v->s;
3768 GetBitContext *gb = &s->gb;
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 */
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;
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;
3785 mquant = v->pq; /* Lossy initialization */
3788 skipped = get_bits1(gb);
3790 skipped = v->s.mbskip_table[mb_pos];
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
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:
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;
3805 case MV_PMODE_INTFR_4MV_FIELD:
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;
3812 case MV_PMODE_INTFR_2MV_FIELD:
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;
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;
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;
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);
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);
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];
3846 for (i = 0; i < 6; i++) {
3847 s->dc_val[0][s->block_index[i]] = 0;
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];
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]);
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;
3865 stride_y = s->uvlinesize;
3868 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
3872 } else { // inter MB
3873 mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
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);
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);
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 */
3892 for (i = 0; i < 6; i++) {
3895 val = ((mvbp >> (3 - i)) & 1);
3897 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
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);
3909 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
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);
3916 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
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);
3923 mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
3926 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3928 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
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;
3939 val = ((cbp >> (5 - i)) & 1);
3941 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3943 off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
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)
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;
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);
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);
3976 static int vc1_decode_p_mb_intfi(VC1Context *v)
3978 MpegEncContext *s = &v->s;
3979 GetBitContext *gb = &s->gb;
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 */
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;
3992 int block_cbp = 0, pat, block_tt = 0;
3995 mquant = v->pq; /* Lossy initialization */
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;
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;
4011 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
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;
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];
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))
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
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);
4042 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
4044 mb_has_coeffs = !(idx_mbmode & 2);
4046 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4047 for (i = 0; i < 6; i++) {
4049 dmv_x = dmv_y = pred_flag = 0;
4050 val = ((v->fourmvbp >> (3 - i)) & 1);
4052 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
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);
4057 vc1_mc_4mv_chroma(v, 0);
4059 mb_has_coeffs = idx_mbmode & 1;
4062 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
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);
4071 for (i = 0; i < 6; i++) {
4072 s->dc_val[0][s->block_index[i]] = 0;
4074 val = ((cbp >> (5 - i)) & 1);
4075 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
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),
4082 block_cbp |= pat << (i << 2);
4083 if (!v->ttmbf && ttmb < 8) ttmb = -1;
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);
4093 /** Decode one B-frame MB (in Main profile)
4095 static void vc1_decode_b_mb(VC1Context *v)
4097 MpegEncContext *s = &v->s;
4098 GetBitContext *gb = &s->gb;
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;
4109 int skipped, direct;
4110 int dmv_x[2], dmv_y[2];
4111 int bmvtype = BMV_TYPE_BACKWARD;
4113 mquant = v->pq; /* lossy initialization */
4117 direct = get_bits1(gb);
4119 direct = v->direct_mb_plane[mb_pos];
4121 skipped = get_bits1(gb);
4123 skipped = v->s.mbskip_table[mb_pos];
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;
4130 s->current_picture.qscale_table[mb_pos] = 0;
4134 GET_MVDATA(dmv_x[0], dmv_y[0]);
4135 dmv_x[1] = dmv_x[0];
4136 dmv_y[1] = dmv_y[0];
4138 if (skipped || !s->mb_intra) {
4139 bmvtype = decode012(gb);
4142 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
4145 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
4148 bmvtype = BMV_TYPE_INTERPOLATED;
4149 dmv_x[0] = dmv_y[0] = 0;
4153 for (i = 0; i < 6; i++)
4154 v->mb_type[0][s->block_index[i]] = s->mb_intra;
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);
4164 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4167 s->current_picture.qscale_table[mb_pos] = mquant;
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);
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);
4180 if (s->mb_intra && !mb_has_coeffs) {
4182 s->current_picture.qscale_table[mb_pos] = mquant;
4183 s->ac_pred = get_bits1(gb);
4185 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
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);
4196 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4198 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4201 s->ac_pred = get_bits1(gb);
4202 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
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);
4210 for (i = 0; i < 6; i++) {
4211 s->dc_val[0][s->block_index[i]] = 0;
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;
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];
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))
4228 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
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);
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)
4245 /** Decode one B-frame MB (in interlaced field B picture)
4247 static void vc1_decode_b_mb_intfi(VC1Context *v)
4249 MpegEncContext *s = &v->s;
4250 GetBitContext *gb = &s->gb;
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;
4261 int dmv_x[2], dmv_y[2], pred_flag[2];
4262 int bmvtype = BMV_TYPE_BACKWARD;
4265 mquant = v->pq; /* Lossy initialization */
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;
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;
4282 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
4284 for (i = 0; i < 6; i++) {
4285 s->dc_val[0][s->block_index[i]] = 0;
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];
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))
4299 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
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
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;
4312 fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
4314 fwd = v->forward_mb_plane[mb_pos];
4315 if (idx_mbmode <= 5) { // 1-MV
4317 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4318 pred_flag[0] = pred_flag[1] = 0;
4320 bmvtype = BMV_TYPE_FORWARD;
4322 bmvtype = decode012(gb);
4325 bmvtype = BMV_TYPE_BACKWARD;
4328 bmvtype = BMV_TYPE_DIRECT;
4331 bmvtype = BMV_TYPE_INTERPOLATED;
4332 interpmvp = get_bits1(gb);
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]);
4340 get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
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;
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);
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++) {
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);
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]);
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);
4367 vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
4369 mb_has_coeffs = idx_mbmode & 1;
4372 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
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);
4381 for (i = 0; i < 6; i++) {
4382 s->dc_val[0][s->block_index[i]] = 0;
4384 val = ((cbp >> (5 - i)) & 1);
4385 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
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)
4399 /** Decode one B-frame MB (in interlaced frame B picture)
4401 static int vc1_decode_b_mb_intfr(VC1Context *v)
4403 MpegEncContext *s = &v->s;
4404 GetBitContext *gb = &s->gb;
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;
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;
4423 mquant = v->pq; /* Lossy initialization */
4426 skipped = get_bits1(gb);
4428 skipped = v->s.mbskip_table[mb_pos];
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) {
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;
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;
4447 direct = get_bits1(gb);
4449 direct = v->direct_mb_plane[mb_pos];
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);
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);
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];
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];
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;
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);
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);
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];
4501 for (i = 0; i < 6; i++) {
4502 s->dc_val[0][s->block_index[i]] = 0;
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];
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))
4516 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
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;
4521 stride_y = s->uvlinesize;
4524 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
4527 s->mb_intra = v->is_intra[s->mb_x] = 0;
4529 if (skipped || !s->mb_intra) {
4530 bmvtype = decode012(gb);
4533 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
4536 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
4539 bmvtype = BMV_TYPE_INTERPOLATED;
4543 if (twomv && bmvtype != BMV_TYPE_INTERPOLATED)
4544 mvsw = get_bits1(gb);
4547 if (!skipped) { // inter MB
4548 mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3];
4550 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
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);
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 */
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);
4570 vc1_mc_4mv_chroma4(v, 0, 0, 0);
4571 vc1_mc_4mv_chroma4(v, 1, 1, 1);
4576 } else if (twomv && bmvtype == BMV_TYPE_INTERPOLATED) {
4578 for (i = 0; i < 4; i++) {
4581 val = ((mvbp >> (3 - i)) & 1);
4583 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 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);
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) {
4596 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4598 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
4603 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
4605 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 1);
4608 dir = bmvtype == BMV_TYPE_BACKWARD;
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);
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);
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];
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);
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);
4641 dir = bmvtype == BMV_TYPE_BACKWARD;
4643 mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2];
4646 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
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];
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;
4669 val = ((cbp >> (5 - i)) & 1);
4671 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4673 off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
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)
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;
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;
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);
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);
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];
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];
4731 if (direct || bmvtype == BMV_TYPE_INTERPOLATED) {
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;
4743 /** Decode blocks of I-frame
4745 static void vc1_decode_i_blocks(VC1Context *v)
4748 MpegEncContext *s = &v->s;
4753 /* select codingmode used for VLC tables selection */
4754 switch (v->y_ac_table_index) {
4756 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4759 v->codingset = CS_HIGH_MOT_INTRA;
4762 v->codingset = CS_MID_RATE_INTRA;
4766 switch (v->c_ac_table_index) {
4768 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4771 v->codingset2 = CS_HIGH_MOT_INTER;
4774 v->codingset2 = CS_MID_RATE_INTER;
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];
4783 s->mb_x = s->mb_y = 0;
4785 s->first_slice_line = 1;
4786 for (s->mb_y = 0; s->mb_y < s->end_mb_y; s->mb_y++) {
4788 init_block_index(v);
4789 for (; s->mb_x < v->end_mb_x; s->mb_x++) {
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;
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);
4809 for (k = 0; k < 6; k++) {
4810 val = ((cbp >> (5 - k)) & 1);
4813 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
4817 cbp |= val << (5 - k);
4819 vc1_decode_i_block(v, s->block[k], k, val, (k < 4) ? v->codingset : v->codingset2);
4821 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
4823 v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
4824 if (v->pq >= 9 && v->overlap) {
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);
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);
4837 if (v->pq >= 9 && v->overlap) {
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);
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);
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);
4859 if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
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);
4868 if (!v->s.loop_filter)
4869 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
4871 ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
4873 s->first_slice_line = 0;
4875 if (v->s.loop_filter)
4876 ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
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);
4883 /** Decode blocks of I-frame for advanced profile
4885 static void vc1_decode_i_blocks_adv(VC1Context *v)
4888 MpegEncContext *s = &v->s;
4894 GetBitContext *gb = &s->gb;
4896 /* select codingmode used for VLC tables selection */
4897 switch (v->y_ac_table_index) {
4899 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4902 v->codingset = CS_HIGH_MOT_INTRA;
4905 v->codingset = CS_MID_RATE_INTRA;
4909 switch (v->c_ac_table_index) {
4911 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4914 v->codingset2 = CS_HIGH_MOT_INTER;
4917 v->codingset2 = CS_MID_RATE_INTER;
4922 s->mb_x = s->mb_y = 0;
4924 s->first_slice_line = 1;
4925 s->mb_y = s->start_mb_y;
4926 if (s->start_mb_y) {
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));
4932 for (; s->mb_y < s->end_mb_y; s->mb_y++) {
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;
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);
4951 v->s.ac_pred = v->acpred_plane[mb_pos];
4953 if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
4954 v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
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];
4963 for (k = 0; k < 6; k++) {
4964 val = ((cbp >> (5 - k)) & 1);
4967 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
4971 cbp |= val << (5 - k);
4973 v->a_avail = !s->first_slice_line || (k == 2 || k == 3);
4974 v->c_avail = !!s->mb_x || (k == 1 || k == 3);
4976 vc1_decode_i_block_adv(v, block[k], k, val,
4977 (k < 4) ? v->codingset : v->codingset2, mquant);
4979 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
4981 v->vc1dsp.vc1_inv_trans_8x8(block[k]);
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);
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);
4996 if (!v->s.loop_filter)
4997 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
4999 ff_mpeg_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
5000 s->first_slice_line = 0;
5003 /* raw bottom MB row */
5005 init_block_index(v);
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);
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);
5019 static void vc1_decode_p_blocks(VC1Context *v)
5021 MpegEncContext *s = &v->s;
5022 int apply_loop_filter;
5024 /* select codingmode used for VLC tables selection */
5025 switch (v->c_ac_table_index) {
5027 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
5030 v->codingset = CS_HIGH_MOT_INTRA;
5033 v->codingset = CS_MID_RATE_INTRA;
5037 switch (v->c_ac_table_index) {
5039 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
5042 v->codingset2 = CS_HIGH_MOT_INTER;
5045 v->codingset2 = CS_MID_RATE_INTER;
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++) {
5055 init_block_index(v);
5056 for (; s->mb_x < s->mb_width; s->mb_x++) {
5057 ff_update_block_index(s);
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);
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;
5081 if (apply_loop_filter) {
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);
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);
5095 static void vc1_decode_b_blocks(VC1Context *v)
5097 MpegEncContext *s = &v->s;
5099 /* select codingmode used for VLC tables selection */
5100 switch (v->c_ac_table_index) {
5102 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
5105 v->codingset = CS_HIGH_MOT_INTRA;
5108 v->codingset = CS_MID_RATE_INTRA;
5112 switch (v->c_ac_table_index) {
5114 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
5117 v->codingset2 = CS_HIGH_MOT_INTER;
5120 v->codingset2 = CS_MID_RATE_INTER;
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++) {
5127 init_block_index(v);
5128 for (; s->mb_x < s->mb_width; s->mb_x++) {
5129 ff_update_block_index(s);
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);
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);
5144 if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
5146 if (!v->s.loop_filter)
5147 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
5149 ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
5150 s->first_slice_line = 0;
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);
5158 static void vc1_decode_skip_blocks(VC1Context *v)
5160 MpegEncContext *s = &v->s;
5162 if (!v->s.last_picture.f.data[0])
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++) {
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;
5177 s->pict_type = AV_PICTURE_TYPE_P;
5180 void ff_vc1_decode_blocks(VC1Context *v)
5183 v->s.esc3_level_length = 0;
5185 ff_intrax8_decode_picture(&v->x8, 2*v->pq + v->halfpq, v->pq * !v->pquantizer);
5188 v->left_blk_idx = -1;
5189 v->topleft_blk_idx = 1;
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);
5196 vc1_decode_i_blocks(v);
5198 case AV_PICTURE_TYPE_P:
5199 if (v->p_frame_skipped)
5200 vc1_decode_skip_blocks(v);
5202 vc1_decode_p_blocks(v);
5204 case AV_PICTURE_TYPE_B:
5206 if (v->profile == PROFILE_ADVANCED)
5207 vc1_decode_i_blocks_adv(v);
5209 vc1_decode_i_blocks(v);
5211 vc1_decode_b_blocks(v);
5217 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
5221 * Transform coefficients for both sprites in 16.16 fixed point format,
5222 * in the order they appear in the bitstream:
5224 * rotation 1 (unused)
5226 * rotation 2 (unused)
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
5238 static inline int get_fp_val(GetBitContext* gb)
5240 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
5243 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
5247 switch (get_bits(gb, 2)) {
5250 c[2] = get_fp_val(gb);
5254 c[0] = c[4] = get_fp_val(gb);
5255 c[2] = get_fp_val(gb);
5258 c[0] = get_fp_val(gb);
5259 c[2] = get_fp_val(gb);
5260 c[4] = get_fp_val(gb);
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);
5270 c[5] = get_fp_val(gb);
5272 c[6] = get_fp_val(gb);
5277 static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
5279 AVCodecContext *avctx = v->s.avctx;
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");
5295 if (sd->effect_type = get_bits_long(gb, 30)) {
5296 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
5298 vc1_sprite_parse_transform(gb, sd->effect_params1);
5301 vc1_sprite_parse_transform(gb, sd->effect_params1);
5302 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
5305 for (i = 0; i < sd->effect_pcount1; i++)
5306 sd->effect_params1[i] = get_fp_val(gb);
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");
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");
5322 } else if (sd->effect_pcount2) {
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));
5331 av_log(avctx, AV_LOG_DEBUG, "\n");
5334 if (sd->effect_flag = get_bits1(gb))
5335 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
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");
5344 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
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;
5351 MpegEncContext *s = &v->s;
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);
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);
5362 alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
5364 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
5365 int width = v->output_width>>!!plane;
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;
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;
5377 ysub[sprite] = ycoord & 0xFFFF;
5379 iplane = s->last_picture.f.data[plane];
5380 iline = s->last_picture.f.linesize[plane];
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;
5386 src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
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]);
5393 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
5394 sr_cache[sprite][0] = yline;
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;
5403 src_h[sprite][0] = v->sr_rows[sprite][0];
5404 src_h[sprite][1] = v->sr_rows[sprite][1];
5408 if (!v->two_sprites) {
5410 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
5412 memcpy(dst, src_h[0][0], width);
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);
5425 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
5431 for (i = 0; i < 2; i++) {
5441 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
5444 MpegEncContext *s = &v->s;
5445 AVCodecContext *avctx = s->avctx;
5448 vc1_parse_sprites(v, gb, &sd);
5450 if (!s->current_picture.f.data[0]) {
5451 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
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");
5460 av_frame_unref(&v->sprite_output_frame);
5461 if ((ret = ff_get_buffer(avctx, &v->sprite_output_frame, 0)) < 0)
5464 vc1_draw_sprites(v, &sd);
5469 static void vc1_sprite_flush(AVCodecContext *avctx)
5471 VC1Context *v = avctx->priv_data;
5472 MpegEncContext *s = &v->s;
5473 AVFrame *f = &s->current_picture.f;
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. */
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]);
5489 av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
5491 MpegEncContext *s = &v->s;
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);
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;
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);
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);
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)
5533 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
5537 ff_intrax8_common_init(&v->x8,s);
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);
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 ||
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);
5564 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
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]);
5579 /** Initialize a VC1/WMV3 decoder
5580 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5581 * @todo TODO: Decypher remaining bits in extra_data
5583 static av_cold int vc1_decode_init(AVCodecContext *avctx)
5585 VC1Context *v = avctx->priv_data;
5586 MpegEncContext *s = &v->s;
5590 /* save the container output size for WMImage */
5591 v->output_width = avctx->width;
5592 v->output_height = avctx->height;
5594 if (!avctx->extradata_size || !avctx->extradata)
5596 if (!(avctx->flags & CODEC_FLAG_GRAY))
5597 avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
5599 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
5600 avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
5602 avctx->flags |= CODEC_FLAG_EMU_EDGE;
5603 v->s.flags |= CODEC_FLAG_EMU_EDGE;
5605 if ((ret = ff_vc1_init_common(v)) < 0)
5607 // ensure static VLC tables are initialized
5608 if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
5610 if ((ret = ff_vc1_decode_init_alloc_tables(v)) < 0)
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);
5617 ff_h264chroma_init(&v->h264chroma, 8);
5618 ff_vc1dsp_init(&v->vc1dsp);
5620 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
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
5628 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
5630 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
5633 count = avctx->extradata_size*8 - get_bits_count(&gb);
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);
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;
5648 if (avctx->extradata_size < 16) {
5649 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
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
5656 for (; next < end; start = next) {
5657 next = find_next_marker(start + 4, end);
5658 size = next - start - 4;
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) {
5669 seq_initialized = 1;
5671 case VC1_CODE_ENTRYPOINT:
5672 if ((ret = ff_vc1_decode_entry_point(avctx, v, &gb)) < 0) {
5681 if (!seq_initialized || !ep_initialized) {
5682 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
5685 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
5688 avctx->profile = v->profile;
5689 if (v->profile == PROFILE_ADVANCED)
5690 avctx->level = v->level;
5692 avctx->has_b_frames = !!avctx->max_b_frames;
5694 s->mb_width = (avctx->coded_width + 15) >> 4;
5695 s->mb_height = (avctx->coded_height + 15) >> 4;
5697 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
5698 ff_vc1_init_transposed_scantables(v);
5700 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
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;
5709 avctx->coded_width = avctx->width = v->output_width;
5710 avctx->coded_height = avctx->height = v->output_height;
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;
5718 if ((v->sprite_width&1) || (v->sprite_height&1)) {
5719 avpriv_request_sample(avctx, "odd sprites support");
5720 return AVERROR_PATCHWELCOME;
5726 /** Close a VC1/WMV3 decoder
5727 * @warning Initial try at using MpegEncContext stuff
5729 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
5731 VC1Context *v = avctx->priv_data;
5734 av_frame_unref(&v->sprite_output_frame);
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);
5761 /** Decode a VC1/WMV3 frame
5762 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5764 static int vc1_decode_frame(AVCodecContext *avctx, void *data,
5765 int *got_frame, AVPacket *avpkt)
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;
5779 } *slices = NULL, *tmp;
5781 v->second_field = 0;
5783 if(s->flags & CODEC_FLAG_LOW_DELAY)
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)
5792 s->next_picture_ptr = NULL;
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;
5804 avctx->pix_fmt = AV_PIX_FMT_VDPAU_VC1;
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) {
5810 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5812 return AVERROR(ENOMEM);
5814 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
5815 const uint8_t *start, *end, *next;
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)
5828 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5830 case VC1_CODE_FIELD: {
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));
5839 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5840 if (!slices[n_slices].buf)
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,
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
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);
5858 case VC1_CODE_SLICE: {
5860 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5864 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5865 if (!slices[n_slices].buf)
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,
5871 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
5877 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
5878 const uint8_t *divider;
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");
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));
5893 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5894 if (!slices[n_slices].buf)
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,
5899 slices[n_slices].mby_start = s->mb_height >> 1;
5900 n_slices1 = n_slices - 1;
5903 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
5905 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
5907 init_get_bits(&s->gb, buf2, buf_size2*8);
5909 init_get_bits(&s->gb, buf, buf_size*8);
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;
5929 if (s->context_initialized &&
5930 (s->width != avctx->coded_width ||
5931 s->height != avctx->coded_height)) {
5932 ff_vc1_decode_end(avctx);
5935 if (!s->context_initialized) {
5936 if (ff_msmpeg4_decode_init(avctx) < 0)
5938 if (ff_vc1_decode_init_alloc_tables(v) < 0) {
5939 ff_MPV_common_end(s);
5943 s->low_delay = !avctx->has_b_frames || v->res_sprite;
5945 if (v->profile == PROFILE_ADVANCED) {
5946 if(avctx->coded_width<=1 || avctx->coded_height<=1)
5948 s->h_edge_pos = avctx->coded_width;
5949 s->v_edge_pos = avctx->coded_height;
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);
5959 s->current_picture_ptr = &s->picture[i];
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) {
5970 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5974 v->first_pic_header_flag = 0;
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));
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");
5985 if ((s->mb_height >> v->field_mode) == 0) {
5986 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
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
5996 s->current_picture_ptr->f.repeat_pict = 1;
5997 } else if (v->rptfrm) {
5999 s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
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;
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)) {
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) {
6016 if (s->next_p_frame_damaged) {
6017 if (s->pict_type == AV_PICTURE_TYPE_B)
6020 s->next_p_frame_damaged = 0;
6023 if (ff_MPV_frame_start(s, avctx) < 0) {
6027 v->s.current_picture_ptr->f.interlaced_frame = (v->fcm != PROGRESSIVE);
6028 v->s.current_picture_ptr->f.top_field_first = v->tff;
6030 s->me.qpel_put = s->dsp.put_qpel_pixels_tab;
6031 s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
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);
6039 ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
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)
6047 if (avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start) < 0)
6049 if (avctx->hwaccel->end_frame(avctx) < 0)
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");
6061 v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
6063 if (avctx->hwaccel->start_frame(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
6065 if (avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
6067 if (avctx->hwaccel->end_frame(avctx) < 0)
6070 s->picture_structure = PICT_FRAME;
6071 if (avctx->hwaccel->start_frame(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
6073 if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
6075 if (avctx->hwaccel->end_frame(avctx) < 0)
6081 ff_mpeg_er_frame_start(s);
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;
6090 s->uvlinesize <<= 1;
6092 mb_height = s->mb_height >> v->field_mode;
6094 av_assert0 (mb_height > 0);
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);
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;
6108 v->second_field = 0;
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)
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)
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);
6137 if (i >= n_slices) {
6138 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
6141 s->end_mb_y = (i <= n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
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);
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");
6151 ff_vc1_decode_blocks(v);
6153 s->gb = slices[i].gb;
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;
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]);
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)
6171 if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B)
6174 ff_er_frame_end(&s->er);
6177 ff_MPV_frame_end(s);
6179 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
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)
6185 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
6186 if (vc1_decode_sprites(v, &s->gb))
6189 if ((ret = av_frame_ref(pict, &v->sprite_output_frame)) < 0)
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)
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)
6200 ff_print_debug_info(s, s->last_picture_ptr, pict);
6202 if (s->last_picture_ptr || s->low_delay) {
6209 for (i = 0; i < n_slices; i++)
6210 av_free(slices[i].buf);
6216 for (i = 0; i < n_slices; i++)
6217 av_free(slices[i].buf);
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 },
6231 static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
6233 AV_PIX_FMT_DXVA2_VLD,
6236 AV_PIX_FMT_VAAPI_VLD,
6245 AVCodec ff_vc1_decoder = {
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)
6260 #if CONFIG_WMV3_DECODER
6261 AVCodec ff_wmv3_decoder = {
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)
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)
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)
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
6325 #if CONFIG_VC1IMAGE_DECODER
6326 AVCodec ff_vc1image_decoder = {
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