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
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
78 /** @} */ //Bitplane group
80 static void vc1_put_signed_blocks_clamped(VC1Context *v)
82 MpegEncContext *s = &v->s;
83 int topleft_mb_pos, top_mb_pos;
84 int stride_y, fieldtx = 0;
87 /* The put pixels loop is always one MB row behind the decoding loop,
88 * because we can only put pixels when overlap filtering is done, and
89 * for filtering of the bottom edge of a MB, we need the next MB row
91 * Within the row, the put pixels loop is also one MB col behind the
92 * decoding loop. The reason for this is again, because for filtering
93 * of the right MB edge, we need the next MB present. */
94 if (!s->first_slice_line) {
96 topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1;
97 if (v->fcm == ILACE_FRAME)
98 fieldtx = v->fieldtx_plane[topleft_mb_pos];
99 stride_y = s->linesize << fieldtx;
100 v_dist = (16 - fieldtx) >> (fieldtx == 0);
101 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
102 s->dest[0] - 16 * s->linesize - 16,
104 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
105 s->dest[0] - 16 * s->linesize - 8,
107 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
108 s->dest[0] - v_dist * s->linesize - 16,
110 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
111 s->dest[0] - v_dist * s->linesize - 8,
113 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
114 s->dest[1] - 8 * s->uvlinesize - 8,
116 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
117 s->dest[2] - 8 * s->uvlinesize - 8,
120 if (s->mb_x == s->mb_width - 1) {
121 top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
122 if (v->fcm == ILACE_FRAME)
123 fieldtx = v->fieldtx_plane[top_mb_pos];
124 stride_y = s->linesize << fieldtx;
125 v_dist = fieldtx ? 15 : 8;
126 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
127 s->dest[0] - 16 * s->linesize,
129 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
130 s->dest[0] - 16 * s->linesize + 8,
132 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
133 s->dest[0] - v_dist * s->linesize,
135 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
136 s->dest[0] - v_dist * s->linesize + 8,
138 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
139 s->dest[1] - 8 * s->uvlinesize,
141 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
142 s->dest[2] - 8 * s->uvlinesize,
147 #define inc_blk_idx(idx) do { \
149 if (idx >= v->n_allocated_blks) \
153 inc_blk_idx(v->topleft_blk_idx);
154 inc_blk_idx(v->top_blk_idx);
155 inc_blk_idx(v->left_blk_idx);
156 inc_blk_idx(v->cur_blk_idx);
159 static void vc1_loop_filter_iblk(VC1Context *v, int pq)
161 MpegEncContext *s = &v->s;
163 if (!s->first_slice_line) {
164 v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
166 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
167 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
168 for (j = 0; j < 2; j++) {
169 v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1], s->uvlinesize, pq);
171 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
174 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8 * s->linesize, s->linesize, pq);
176 if (s->mb_y == s->end_mb_y - 1) {
178 v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
179 v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
180 v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
182 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
186 static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
188 MpegEncContext *s = &v->s;
191 /* The loopfilter runs 1 row and 1 column behind the overlap filter, which
192 * means it runs two rows/cols behind the decoding loop. */
193 if (!s->first_slice_line) {
195 if (s->mb_y >= s->start_mb_y + 2) {
196 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
199 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq);
200 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq);
201 for (j = 0; j < 2; j++) {
202 v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
204 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
208 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
211 if (s->mb_x == s->mb_width - 1) {
212 if (s->mb_y >= s->start_mb_y + 2) {
213 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
216 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq);
217 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq);
218 for (j = 0; j < 2; j++) {
219 v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
221 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize, s->uvlinesize, pq);
225 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
228 if (s->mb_y == s->end_mb_y) {
231 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
232 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq);
234 for (j = 0; j < 2; j++) {
235 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
240 if (s->mb_x == s->mb_width - 1) {
242 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
243 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
245 for (j = 0; j < 2; j++) {
246 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
254 static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
256 MpegEncContext *s = &v->s;
259 if (v->condover == CONDOVER_NONE)
262 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
264 /* Within a MB, the horizontal overlap always runs before the vertical.
265 * To accomplish that, we run the H on left and internal borders of the
266 * currently decoded MB. Then, we wait for the next overlap iteration
267 * to do H overlap on the right edge of this MB, before moving over and
268 * running the V overlap. Therefore, the V overlap makes us trail by one
269 * MB col and the H overlap filter makes us trail by one MB row. This
270 * is reflected in the time at which we run the put_pixels loop. */
271 if (v->condover == CONDOVER_ALL || v->pq >= 9 || v->over_flags_plane[mb_pos]) {
272 if (s->mb_x && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
273 v->over_flags_plane[mb_pos - 1])) {
274 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][1],
275 v->block[v->cur_blk_idx][0]);
276 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][3],
277 v->block[v->cur_blk_idx][2]);
278 if (!(s->flags & CODEC_FLAG_GRAY)) {
279 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][4],
280 v->block[v->cur_blk_idx][4]);
281 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][5],
282 v->block[v->cur_blk_idx][5]);
285 v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][0],
286 v->block[v->cur_blk_idx][1]);
287 v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][2],
288 v->block[v->cur_blk_idx][3]);
290 if (s->mb_x == s->mb_width - 1) {
291 if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
292 v->over_flags_plane[mb_pos - s->mb_stride])) {
293 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][2],
294 v->block[v->cur_blk_idx][0]);
295 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][3],
296 v->block[v->cur_blk_idx][1]);
297 if (!(s->flags & CODEC_FLAG_GRAY)) {
298 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][4],
299 v->block[v->cur_blk_idx][4]);
300 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][5],
301 v->block[v->cur_blk_idx][5]);
304 v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][0],
305 v->block[v->cur_blk_idx][2]);
306 v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][1],
307 v->block[v->cur_blk_idx][3]);
310 if (s->mb_x && (v->condover == CONDOVER_ALL || v->over_flags_plane[mb_pos - 1])) {
311 if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
312 v->over_flags_plane[mb_pos - s->mb_stride - 1])) {
313 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][2],
314 v->block[v->left_blk_idx][0]);
315 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][3],
316 v->block[v->left_blk_idx][1]);
317 if (!(s->flags & CODEC_FLAG_GRAY)) {
318 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][4],
319 v->block[v->left_blk_idx][4]);
320 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][5],
321 v->block[v->left_blk_idx][5]);
324 v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][0],
325 v->block[v->left_blk_idx][2]);
326 v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][1],
327 v->block[v->left_blk_idx][3]);
331 /** Do motion compensation over 1 macroblock
332 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
334 static void vc1_mc_1mv(VC1Context *v, int dir)
336 MpegEncContext *s = &v->s;
337 DSPContext *dsp = &v->s.dsp;
338 H264ChromaContext *h264chroma = &v->h264chroma;
339 uint8_t *srcY, *srcU, *srcV;
340 int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
342 int v_edge_pos = s->v_edge_pos >> v->field_mode;
344 if ((!v->field_mode ||
345 (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) &&
346 !v->s.last_picture.f.data[0])
349 mx = s->mv[dir][0][0];
350 my = s->mv[dir][0][1];
352 // store motion vectors for further use in B frames
353 if (s->pict_type == AV_PICTURE_TYPE_P) {
354 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = mx;
355 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = my;
358 uvmx = (mx + ((mx & 3) == 3)) >> 1;
359 uvmy = (my + ((my & 3) == 3)) >> 1;
360 v->luma_mv[s->mb_x][0] = uvmx;
361 v->luma_mv[s->mb_x][1] = uvmy;
364 v->cur_field_type != v->ref_field_type[dir]) {
365 my = my - 2 + 4 * v->cur_field_type;
366 uvmy = uvmy - 2 + 4 * v->cur_field_type;
369 // fastuvmc shall be ignored for interlaced frame picture
370 if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
371 uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
372 uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
374 if (v->field_mode) { // interlaced field picture
376 if ((v->cur_field_type != v->ref_field_type[dir]) && v->second_field) {
377 srcY = s->current_picture.f.data[0];
378 srcU = s->current_picture.f.data[1];
379 srcV = s->current_picture.f.data[2];
381 srcY = s->last_picture.f.data[0];
382 srcU = s->last_picture.f.data[1];
383 srcV = s->last_picture.f.data[2];
386 srcY = s->next_picture.f.data[0];
387 srcU = s->next_picture.f.data[1];
388 srcV = s->next_picture.f.data[2];
392 srcY = s->last_picture.f.data[0];
393 srcU = s->last_picture.f.data[1];
394 srcV = s->last_picture.f.data[2];
396 srcY = s->next_picture.f.data[0];
397 srcU = s->next_picture.f.data[1];
398 srcV = s->next_picture.f.data[2];
405 src_x = s->mb_x * 16 + (mx >> 2);
406 src_y = s->mb_y * 16 + (my >> 2);
407 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
408 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
410 if (v->profile != PROFILE_ADVANCED) {
411 src_x = av_clip( src_x, -16, s->mb_width * 16);
412 src_y = av_clip( src_y, -16, s->mb_height * 16);
413 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
414 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
416 src_x = av_clip( src_x, -17, s->avctx->coded_width);
417 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
418 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
419 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
422 srcY += src_y * s->linesize + src_x;
423 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
424 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
426 if (v->field_mode && v->ref_field_type[dir]) {
427 srcY += s->current_picture_ptr->f.linesize[0];
428 srcU += s->current_picture_ptr->f.linesize[1];
429 srcV += s->current_picture_ptr->f.linesize[2];
432 /* for grayscale we should not try to read from unknown area */
433 if (s->flags & CODEC_FLAG_GRAY) {
434 srcU = s->edge_emu_buffer + 18 * s->linesize;
435 srcV = s->edge_emu_buffer + 18 * s->linesize;
438 if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
439 || s->h_edge_pos < 22 || v_edge_pos < 22
440 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3
441 || (unsigned)(src_y - 1) > v_edge_pos - (my&3) - 16 - 3) {
442 uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
444 srcY -= s->mspel * (1 + s->linesize);
445 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
446 17 + s->mspel * 2, 17 + s->mspel * 2,
447 src_x - s->mspel, src_y - s->mspel,
448 s->h_edge_pos, v_edge_pos);
449 srcY = s->edge_emu_buffer;
450 s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
451 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
452 s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
453 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
456 /* if we deal with range reduction we need to scale source blocks */
457 if (v->rangeredfrm) {
462 for (j = 0; j < 17 + s->mspel * 2; j++) {
463 for (i = 0; i < 17 + s->mspel * 2; i++)
464 src[i] = ((src[i] - 128) >> 1) + 128;
469 for (j = 0; j < 9; j++) {
470 for (i = 0; i < 9; i++) {
471 src[i] = ((src[i] - 128) >> 1) + 128;
472 src2[i] = ((src2[i] - 128) >> 1) + 128;
474 src += s->uvlinesize;
475 src2 += s->uvlinesize;
478 /* if we deal with intensity compensation we need to scale source blocks */
479 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
484 for (j = 0; j < 17 + s->mspel * 2; j++) {
485 for (i = 0; i < 17 + s->mspel * 2; i++)
486 src[i] = v->luty[src[i]];
491 for (j = 0; j < 9; j++) {
492 for (i = 0; i < 9; i++) {
493 src[i] = v->lutuv[src[i]];
494 src2[i] = v->lutuv[src2[i]];
496 src += s->uvlinesize;
497 src2 += s->uvlinesize;
500 srcY += s->mspel * (1 + s->linesize);
503 if (v->field_mode && v->second_field) {
504 off = s->current_picture_ptr->f.linesize[0];
505 off_uv = s->current_picture_ptr->f.linesize[1];
511 dxy = ((my & 3) << 2) | (mx & 3);
512 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
513 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
514 srcY += s->linesize * 8;
515 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize , srcY , s->linesize, v->rnd);
516 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
517 } else { // hpel mc - always used for luma
518 dxy = (my & 2) | ((mx & 2) >> 1);
520 dsp->put_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
522 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
525 if (s->flags & CODEC_FLAG_GRAY) return;
526 /* Chroma MC always uses qpel bilinear */
527 uvmx = (uvmx & 3) << 1;
528 uvmy = (uvmy & 3) << 1;
530 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
531 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
533 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
534 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
538 static inline int median4(int a, int b, int c, int d)
541 if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
542 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
544 if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
545 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
549 /** Do motion compensation for 4-MV macroblock - luminance block
551 static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
553 MpegEncContext *s = &v->s;
554 DSPContext *dsp = &v->s.dsp;
556 int dxy, mx, my, src_x, src_y;
558 int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
559 int v_edge_pos = s->v_edge_pos >> v->field_mode;
561 if ((!v->field_mode ||
562 (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) &&
563 !v->s.last_picture.f.data[0])
566 mx = s->mv[dir][n][0];
567 my = s->mv[dir][n][1];
571 if ((v->cur_field_type != v->ref_field_type[dir]) && v->second_field)
572 srcY = s->current_picture.f.data[0];
574 srcY = s->last_picture.f.data[0];
576 srcY = s->last_picture.f.data[0];
578 srcY = s->next_picture.f.data[0];
584 if (v->cur_field_type != v->ref_field_type[dir])
585 my = my - 2 + 4 * v->cur_field_type;
588 if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) {
589 int same_count = 0, opp_count = 0, k;
590 int chosen_mv[2][4][2], f;
592 for (k = 0; k < 4; k++) {
593 f = v->mv_f[0][s->block_index[k] + v->blocks_off];
594 chosen_mv[f][f ? opp_count : same_count][0] = s->mv[0][k][0];
595 chosen_mv[f][f ? opp_count : same_count][1] = s->mv[0][k][1];
599 f = opp_count > same_count;
600 switch (f ? opp_count : same_count) {
602 tx = median4(chosen_mv[f][0][0], chosen_mv[f][1][0],
603 chosen_mv[f][2][0], chosen_mv[f][3][0]);
604 ty = median4(chosen_mv[f][0][1], chosen_mv[f][1][1],
605 chosen_mv[f][2][1], chosen_mv[f][3][1]);
608 tx = mid_pred(chosen_mv[f][0][0], chosen_mv[f][1][0], chosen_mv[f][2][0]);
609 ty = mid_pred(chosen_mv[f][0][1], chosen_mv[f][1][1], chosen_mv[f][2][1]);
612 tx = (chosen_mv[f][0][0] + chosen_mv[f][1][0]) / 2;
613 ty = (chosen_mv[f][0][1] + chosen_mv[f][1][1]) / 2;
618 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
619 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
620 for (k = 0; k < 4; k++)
621 v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
624 if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture
626 int width = s->avctx->coded_width;
627 int height = s->avctx->coded_height >> 1;
628 qx = (s->mb_x * 16) + (mx >> 2);
629 qy = (s->mb_y * 8) + (my >> 3);
634 mx -= 4 * (qx - width);
637 else if (qy > height + 1)
638 my -= 8 * (qy - height - 1);
641 if ((v->fcm == ILACE_FRAME) && fieldmv)
642 off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
644 off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
645 if (v->field_mode && v->second_field)
646 off += s->current_picture_ptr->f.linesize[0];
648 src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
650 src_y = s->mb_y * 16 + (n & 2) * 4 + (my >> 2);
652 src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2);
654 if (v->profile != PROFILE_ADVANCED) {
655 src_x = av_clip(src_x, -16, s->mb_width * 16);
656 src_y = av_clip(src_y, -16, s->mb_height * 16);
658 src_x = av_clip(src_x, -17, s->avctx->coded_width);
659 if (v->fcm == ILACE_FRAME) {
661 src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
663 src_y = av_clip(src_y, -18, s->avctx->coded_height);
665 src_y = av_clip(src_y, -18, s->avctx->coded_height + 1);
669 srcY += src_y * s->linesize + src_x;
670 if (v->field_mode && v->ref_field_type[dir])
671 srcY += s->current_picture_ptr->f.linesize[0];
673 if (fieldmv && !(src_y & 1))
675 if (fieldmv && (src_y & 1) && src_y < 4)
677 if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
678 || s->h_edge_pos < 13 || v_edge_pos < 23
679 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2
680 || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) {
681 srcY -= s->mspel * (1 + (s->linesize << fieldmv));
682 /* check emulate edge stride and offset */
683 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
684 9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
685 src_x - s->mspel, src_y - (s->mspel << fieldmv),
686 s->h_edge_pos, v_edge_pos);
687 srcY = s->edge_emu_buffer;
688 /* if we deal with range reduction we need to scale source blocks */
689 if (v->rangeredfrm) {
694 for (j = 0; j < 9 + s->mspel * 2; j++) {
695 for (i = 0; i < 9 + s->mspel * 2; i++)
696 src[i] = ((src[i] - 128) >> 1) + 128;
697 src += s->linesize << fieldmv;
700 /* if we deal with intensity compensation we need to scale source blocks */
701 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
706 for (j = 0; j < 9 + s->mspel * 2; j++) {
707 for (i = 0; i < 9 + s->mspel * 2; i++)
708 src[i] = v->luty[src[i]];
709 src += s->linesize << fieldmv;
712 srcY += s->mspel * (1 + (s->linesize << fieldmv));
716 dxy = ((my & 3) << 2) | (mx & 3);
717 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
718 } else { // hpel mc - always used for luma
719 dxy = (my & 2) | ((mx & 2) >> 1);
721 dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
723 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
727 static av_always_inline int get_chroma_mv(int *mvx, int *mvy, int *a, int flag, int *tx, int *ty)
730 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
732 idx = ((a[3] != flag) << 3)
733 | ((a[2] != flag) << 2)
734 | ((a[1] != flag) << 1)
737 *tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
738 *ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
740 } else if (count[idx] == 1) {
743 *tx = mid_pred(mvx[1], mvx[2], mvx[3]);
744 *ty = mid_pred(mvy[1], mvy[2], mvy[3]);
747 *tx = mid_pred(mvx[0], mvx[2], mvx[3]);
748 *ty = mid_pred(mvy[0], mvy[2], mvy[3]);
751 *tx = mid_pred(mvx[0], mvx[1], mvx[3]);
752 *ty = mid_pred(mvy[0], mvy[1], mvy[3]);
755 *tx = mid_pred(mvx[0], mvx[1], mvx[2]);
756 *ty = mid_pred(mvy[0], mvy[1], mvy[2]);
759 } else if (count[idx] == 2) {
761 for (i = 0; i < 3; i++)
766 for (i = t1 + 1; i < 4; i++)
771 *tx = (mvx[t1] + mvx[t2]) / 2;
772 *ty = (mvy[t1] + mvy[t2]) / 2;
780 /** Do motion compensation for 4-MV macroblock - both chroma blocks
782 static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
784 MpegEncContext *s = &v->s;
785 H264ChromaContext *h264chroma = &v->h264chroma;
786 uint8_t *srcU, *srcV;
787 int uvmx, uvmy, uvsrc_x, uvsrc_y;
788 int k, tx = 0, ty = 0;
789 int mvx[4], mvy[4], intra[4], mv_f[4];
791 int chroma_ref_type = v->cur_field_type, off = 0;
792 int v_edge_pos = s->v_edge_pos >> v->field_mode;
794 if (!v->field_mode && !v->s.last_picture.f.data[0])
796 if (s->flags & CODEC_FLAG_GRAY)
799 for (k = 0; k < 4; k++) {
800 mvx[k] = s->mv[dir][k][0];
801 mvy[k] = s->mv[dir][k][1];
802 intra[k] = v->mb_type[0][s->block_index[k]];
804 mv_f[k] = v->mv_f[dir][s->block_index[k] + v->blocks_off];
807 /* calculate chroma MV vector from four luma MVs */
808 if (!v->field_mode || (v->field_mode && !v->numref)) {
809 valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
810 chroma_ref_type = v->reffield;
812 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
813 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
814 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
815 return; //no need to do MC for intra blocks
819 if (mv_f[0] + mv_f[1] + mv_f[2] + mv_f[3] > 2)
821 valid_count = get_chroma_mv(mvx, mvy, mv_f, dominant, &tx, &ty);
823 chroma_ref_type = !v->cur_field_type;
825 if (v->field_mode && chroma_ref_type == 1 && v->cur_field_type == 1 && !v->s.last_picture.f.data[0])
827 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
828 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
829 uvmx = (tx + ((tx & 3) == 3)) >> 1;
830 uvmy = (ty + ((ty & 3) == 3)) >> 1;
832 v->luma_mv[s->mb_x][0] = uvmx;
833 v->luma_mv[s->mb_x][1] = uvmy;
836 uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
837 uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
839 // Field conversion bias
840 if (v->cur_field_type != chroma_ref_type)
841 uvmy += 2 - 4 * chroma_ref_type;
843 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
844 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
846 if (v->profile != PROFILE_ADVANCED) {
847 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
848 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
850 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
851 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
856 if ((v->cur_field_type != chroma_ref_type) && v->cur_field_type) {
857 srcU = s->current_picture.f.data[1];
858 srcV = s->current_picture.f.data[2];
860 srcU = s->last_picture.f.data[1];
861 srcV = s->last_picture.f.data[2];
864 srcU = s->last_picture.f.data[1];
865 srcV = s->last_picture.f.data[2];
868 srcU = s->next_picture.f.data[1];
869 srcV = s->next_picture.f.data[2];
875 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
876 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
879 if (chroma_ref_type) {
880 srcU += s->current_picture_ptr->f.linesize[1];
881 srcV += s->current_picture_ptr->f.linesize[2];
883 off = v->second_field ? s->current_picture_ptr->f.linesize[1] : 0;
886 if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
887 || s->h_edge_pos < 18 || v_edge_pos < 18
888 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
889 || (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) {
890 s->vdsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize,
891 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
892 s->h_edge_pos >> 1, v_edge_pos >> 1);
893 s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
894 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
895 s->h_edge_pos >> 1, v_edge_pos >> 1);
896 srcU = s->edge_emu_buffer;
897 srcV = s->edge_emu_buffer + 16;
899 /* if we deal with range reduction we need to scale source blocks */
900 if (v->rangeredfrm) {
906 for (j = 0; j < 9; j++) {
907 for (i = 0; i < 9; i++) {
908 src[i] = ((src[i] - 128) >> 1) + 128;
909 src2[i] = ((src2[i] - 128) >> 1) + 128;
911 src += s->uvlinesize;
912 src2 += s->uvlinesize;
915 /* if we deal with intensity compensation we need to scale source blocks */
916 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
922 for (j = 0; j < 9; j++) {
923 for (i = 0; i < 9; i++) {
924 src[i] = v->lutuv[src[i]];
925 src2[i] = v->lutuv[src2[i]];
927 src += s->uvlinesize;
928 src2 += s->uvlinesize;
933 /* Chroma MC always uses qpel bilinear */
934 uvmx = (uvmx & 3) << 1;
935 uvmy = (uvmy & 3) << 1;
937 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
938 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
940 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
941 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
945 /** Do motion compensation for 4-MV field chroma macroblock (both U and V)
947 static void vc1_mc_4mv_chroma4(VC1Context *v)
949 MpegEncContext *s = &v->s;
950 H264ChromaContext *h264chroma = &v->h264chroma;
951 uint8_t *srcU, *srcV;
952 int uvsrc_x, uvsrc_y;
953 int uvmx_field[4], uvmy_field[4];
955 int fieldmv = v->blk_mv_type[s->block_index[0]];
956 static const int s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 };
957 int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks
958 int v_edge_pos = s->v_edge_pos >> 1;
960 if (!v->s.last_picture.f.data[0])
962 if (s->flags & CODEC_FLAG_GRAY)
965 for (i = 0; i < 4; i++) {
967 uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1;
970 uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF];
972 uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1;
975 for (i = 0; i < 4; i++) {
976 off = (i & 1) * 4 + ((i & 2) ? v_dist * s->uvlinesize : 0);
977 uvsrc_x = s->mb_x * 8 + (i & 1) * 4 + (uvmx_field[i] >> 2);
978 uvsrc_y = s->mb_y * 8 + ((i & 2) ? v_dist : 0) + (uvmy_field[i] >> 2);
979 // FIXME: implement proper pull-back (see vc1cropmv.c, vc1CROPMV_ChromaPullBack())
980 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
981 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
982 srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
983 srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
984 uvmx_field[i] = (uvmx_field[i] & 3) << 1;
985 uvmy_field[i] = (uvmy_field[i] & 3) << 1;
987 if (fieldmv && !(uvsrc_y & 1))
988 v_edge_pos = (s->v_edge_pos >> 1) - 1;
990 if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2)
992 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP)
993 || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv)
994 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
995 || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) {
996 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize,
997 5, (5 << fieldmv), uvsrc_x, uvsrc_y,
998 s->h_edge_pos >> 1, v_edge_pos);
999 s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
1000 5, (5 << fieldmv), uvsrc_x, uvsrc_y,
1001 s->h_edge_pos >> 1, v_edge_pos);
1002 srcU = s->edge_emu_buffer;
1003 srcV = s->edge_emu_buffer + 16;
1005 /* if we deal with intensity compensation we need to scale source blocks */
1006 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1008 uint8_t *src, *src2;
1012 for (j = 0; j < 5; j++) {
1013 for (i = 0; i < 5; i++) {
1014 src[i] = v->lutuv[src[i]];
1015 src2[i] = v->lutuv[src2[i]];
1017 src += s->uvlinesize << 1;
1018 src2 += s->uvlinesize << 1;
1023 h264chroma->put_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1024 h264chroma->put_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1026 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]);
1027 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]);
1032 /***********************************************************************/
1034 * @name VC-1 Block-level functions
1035 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1041 * @brief Get macroblock-level quantizer scale
1043 #define GET_MQUANT() \
1044 if (v->dquantfrm) { \
1046 if (v->dqprofile == DQPROFILE_ALL_MBS) { \
1047 if (v->dqbilevel) { \
1048 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
1050 mqdiff = get_bits(gb, 3); \
1052 mquant = v->pq + mqdiff; \
1054 mquant = get_bits(gb, 5); \
1057 if (v->dqprofile == DQPROFILE_SINGLE_EDGE) \
1058 edges = 1 << v->dqsbedge; \
1059 else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
1060 edges = (3 << v->dqsbedge) % 15; \
1061 else if (v->dqprofile == DQPROFILE_FOUR_EDGES) \
1063 if ((edges&1) && !s->mb_x) \
1064 mquant = v->altpq; \
1065 if ((edges&2) && s->first_slice_line) \
1066 mquant = v->altpq; \
1067 if ((edges&4) && s->mb_x == (s->mb_width - 1)) \
1068 mquant = v->altpq; \
1069 if ((edges&8) && s->mb_y == (s->mb_height - 1)) \
1070 mquant = v->altpq; \
1071 if (!mquant || mquant > 31) { \
1072 av_log(v->s.avctx, AV_LOG_ERROR, \
1073 "Overriding invalid mquant %d\n", mquant); \
1079 * @def GET_MVDATA(_dmv_x, _dmv_y)
1080 * @brief Get MV differentials
1081 * @see MVDATA decoding from 8.3.5.2, p(1)20
1082 * @param _dmv_x Horizontal differential for decoded MV
1083 * @param _dmv_y Vertical differential for decoded MV
1085 #define GET_MVDATA(_dmv_x, _dmv_y) \
1086 index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \
1087 VC1_MV_DIFF_VLC_BITS, 2); \
1089 mb_has_coeffs = 1; \
1092 mb_has_coeffs = 0; \
1095 _dmv_x = _dmv_y = 0; \
1096 } else if (index == 35) { \
1097 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
1098 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
1099 } else if (index == 36) { \
1104 index1 = index % 6; \
1105 if (!s->quarter_sample && index1 == 5) val = 1; \
1107 if (size_table[index1] - val > 0) \
1108 val = get_bits(gb, size_table[index1] - val); \
1110 sign = 0 - (val&1); \
1111 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1113 index1 = index / 6; \
1114 if (!s->quarter_sample && index1 == 5) val = 1; \
1116 if (size_table[index1] - val > 0) \
1117 val = get_bits(gb, size_table[index1] - val); \
1119 sign = 0 - (val & 1); \
1120 _dmv_y = (sign ^ ((val >> 1) + offset_table[index1])) - sign; \
1123 static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x,
1124 int *dmv_y, int *pred_flag)
1127 int extend_x = 0, extend_y = 0;
1128 GetBitContext *gb = &v->s.gb;
1131 const int* offs_tab;
1134 bits = VC1_2REF_MVDATA_VLC_BITS;
1137 bits = VC1_1REF_MVDATA_VLC_BITS;
1140 switch (v->dmvrange) {
1148 extend_x = extend_y = 1;
1151 index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
1153 *dmv_x = get_bits(gb, v->k_x);
1154 *dmv_y = get_bits(gb, v->k_y);
1157 *pred_flag = *dmv_y & 1;
1158 *dmv_y = (*dmv_y + *pred_flag) >> 1;
1160 *dmv_y = (*dmv_y + (*dmv_y & 1)) >> 1;
1165 av_assert0(index < esc);
1167 offs_tab = offset_table2;
1169 offs_tab = offset_table1;
1170 index1 = (index + 1) % 9;
1172 val = get_bits(gb, index1 + extend_x);
1173 sign = 0 -(val & 1);
1174 *dmv_x = (sign ^ ((val >> 1) + offs_tab[index1])) - sign;
1178 offs_tab = offset_table2;
1180 offs_tab = offset_table1;
1181 index1 = (index + 1) / 9;
1182 if (index1 > v->numref) {
1183 val = get_bits(gb, (index1 + (extend_y << v->numref)) >> v->numref);
1184 sign = 0 - (val & 1);
1185 *dmv_y = (sign ^ ((val >> 1) + offs_tab[index1 >> v->numref])) - sign;
1188 if (v->numref && pred_flag)
1189 *pred_flag = index1 & 1;
1193 static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int dir)
1195 int scaledvalue, refdist;
1196 int scalesame1, scalesame2;
1197 int scalezone1_x, zone1offset_x;
1198 int table_index = dir ^ v->second_field;
1200 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1201 refdist = v->refdist;
1203 refdist = dir ? v->brfd : v->frfd;
1206 scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1207 scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1208 scalezone1_x = ff_vc1_field_mvpred_scales[table_index][3][refdist];
1209 zone1offset_x = ff_vc1_field_mvpred_scales[table_index][5][refdist];
1214 if (FFABS(n) < scalezone1_x)
1215 scaledvalue = (n * scalesame1) >> 8;
1218 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x;
1220 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x;
1223 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1226 static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, int dir)
1228 int scaledvalue, refdist;
1229 int scalesame1, scalesame2;
1230 int scalezone1_y, zone1offset_y;
1231 int table_index = dir ^ v->second_field;
1233 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1234 refdist = v->refdist;
1236 refdist = dir ? v->brfd : v->frfd;
1239 scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1240 scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1241 scalezone1_y = ff_vc1_field_mvpred_scales[table_index][4][refdist];
1242 zone1offset_y = ff_vc1_field_mvpred_scales[table_index][6][refdist];
1247 if (FFABS(n) < scalezone1_y)
1248 scaledvalue = (n * scalesame1) >> 8;
1251 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y;
1253 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y;
1257 if (v->cur_field_type && !v->ref_field_type[dir])
1258 return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
1260 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1263 static av_always_inline int scaleforopp_x(VC1Context *v, int n /* MV */)
1265 int scalezone1_x, zone1offset_x;
1266 int scaleopp1, scaleopp2, brfd;
1269 brfd = FFMIN(v->brfd, 3);
1270 scalezone1_x = ff_vc1_b_field_mvpred_scales[3][brfd];
1271 zone1offset_x = ff_vc1_b_field_mvpred_scales[5][brfd];
1272 scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
1273 scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
1278 if (FFABS(n) < scalezone1_x)
1279 scaledvalue = (n * scaleopp1) >> 8;
1282 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x;
1284 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x;
1287 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1290 static av_always_inline int scaleforopp_y(VC1Context *v, int n /* MV */, int dir)
1292 int scalezone1_y, zone1offset_y;
1293 int scaleopp1, scaleopp2, brfd;
1296 brfd = FFMIN(v->brfd, 3);
1297 scalezone1_y = ff_vc1_b_field_mvpred_scales[4][brfd];
1298 zone1offset_y = ff_vc1_b_field_mvpred_scales[6][brfd];
1299 scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
1300 scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
1305 if (FFABS(n) < scalezone1_y)
1306 scaledvalue = (n * scaleopp1) >> 8;
1309 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y;
1311 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y;
1314 if (v->cur_field_type && !v->ref_field_type[dir]) {
1315 return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
1317 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1321 static av_always_inline int scaleforsame(VC1Context *v, int i, int n /* MV */,
1324 int brfd, scalesame;
1325 int hpel = 1 - v->s.quarter_sample;
1328 if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) {
1330 n = scaleforsame_y(v, i, n, dir) << hpel;
1332 n = scaleforsame_x(v, n, dir) << hpel;
1335 brfd = FFMIN(v->brfd, 3);
1336 scalesame = ff_vc1_b_field_mvpred_scales[0][brfd];
1338 n = (n * scalesame >> 8) << hpel;
1342 static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */,
1345 int refdist, scaleopp;
1346 int hpel = 1 - v->s.quarter_sample;
1349 if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
1351 n = scaleforopp_y(v, n, dir) << hpel;
1353 n = scaleforopp_x(v, n) << hpel;
1356 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1357 refdist = FFMIN(v->refdist, 3);
1359 refdist = dir ? v->brfd : v->frfd;
1360 scaleopp = ff_vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
1362 n = (n * scaleopp >> 8) << hpel;
1366 /** Predict and set motion vector
1368 static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
1369 int mv1, int r_x, int r_y, uint8_t* is_intra,
1370 int pred_flag, int dir)
1372 MpegEncContext *s = &v->s;
1373 int xy, wrap, off = 0;
1377 int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
1378 int opposite, a_f, b_f, c_f;
1379 int16_t field_predA[2];
1380 int16_t field_predB[2];
1381 int16_t field_predC[2];
1382 int a_valid, b_valid, c_valid;
1383 int hybridmv_thresh, y_bias = 0;
1385 if (v->mv_mode == MV_PMODE_MIXED_MV ||
1386 ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV)))
1390 /* scale MV difference to be quad-pel */
1391 dmv_x <<= 1 - s->quarter_sample;
1392 dmv_y <<= 1 - s->quarter_sample;
1394 wrap = s->b8_stride;
1395 xy = s->block_index[n];
1398 s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy + v->blocks_off][0] = 0;
1399 s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy + v->blocks_off][1] = 0;
1400 s->current_picture.f.motion_val[1][xy + v->blocks_off][0] = 0;
1401 s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = 0;
1402 if (mv1) { /* duplicate motion data for 1-MV block */
1403 s->current_picture.f.motion_val[0][xy + 1 + v->blocks_off][0] = 0;
1404 s->current_picture.f.motion_val[0][xy + 1 + v->blocks_off][1] = 0;
1405 s->current_picture.f.motion_val[0][xy + wrap + v->blocks_off][0] = 0;
1406 s->current_picture.f.motion_val[0][xy + wrap + v->blocks_off][1] = 0;
1407 s->current_picture.f.motion_val[0][xy + wrap + 1 + v->blocks_off][0] = 0;
1408 s->current_picture.f.motion_val[0][xy + wrap + 1 + v->blocks_off][1] = 0;
1409 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
1410 s->current_picture.f.motion_val[1][xy + 1 + v->blocks_off][0] = 0;
1411 s->current_picture.f.motion_val[1][xy + 1 + v->blocks_off][1] = 0;
1412 s->current_picture.f.motion_val[1][xy + wrap][0] = 0;
1413 s->current_picture.f.motion_val[1][xy + wrap + v->blocks_off][1] = 0;
1414 s->current_picture.f.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0;
1415 s->current_picture.f.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0;
1420 C = s->current_picture.f.motion_val[dir][xy - 1 + v->blocks_off];
1421 A = s->current_picture.f.motion_val[dir][xy - wrap + v->blocks_off];
1423 if (v->field_mode && mixedmv_pic)
1424 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
1426 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1428 //in 4-MV mode different blocks have different B predictor position
1431 off = (s->mb_x > 0) ? -1 : 1;
1434 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
1443 B = s->current_picture.f.motion_val[dir][xy - wrap + off + v->blocks_off];
1445 a_valid = !s->first_slice_line || (n == 2 || n == 3);
1446 b_valid = a_valid && (s->mb_width > 1);
1447 c_valid = s->mb_x || (n == 1 || n == 3);
1448 if (v->field_mode) {
1449 a_valid = a_valid && !is_intra[xy - wrap];
1450 b_valid = b_valid && !is_intra[xy - wrap + off];
1451 c_valid = c_valid && !is_intra[xy - 1];
1455 a_f = v->mv_f[dir][xy - wrap + v->blocks_off];
1456 num_oppfield += a_f;
1457 num_samefield += 1 - a_f;
1458 field_predA[0] = A[0];
1459 field_predA[1] = A[1];
1461 field_predA[0] = field_predA[1] = 0;
1465 b_f = v->mv_f[dir][xy - wrap + off + v->blocks_off];
1466 num_oppfield += b_f;
1467 num_samefield += 1 - b_f;
1468 field_predB[0] = B[0];
1469 field_predB[1] = B[1];
1471 field_predB[0] = field_predB[1] = 0;
1475 c_f = v->mv_f[dir][xy - 1 + v->blocks_off];
1476 num_oppfield += c_f;
1477 num_samefield += 1 - c_f;
1478 field_predC[0] = C[0];
1479 field_predC[1] = C[1];
1481 field_predC[0] = field_predC[1] = 0;
1485 if (v->field_mode) {
1487 // REFFIELD determines if the last field or the second-last field is
1488 // to be used as reference
1489 opposite = 1 - v->reffield;
1491 if (num_samefield <= num_oppfield)
1492 opposite = 1 - pred_flag;
1494 opposite = pred_flag;
1499 if (a_valid && !a_f) {
1500 field_predA[0] = scaleforopp(v, field_predA[0], 0, dir);
1501 field_predA[1] = scaleforopp(v, field_predA[1], 1, dir);
1503 if (b_valid && !b_f) {
1504 field_predB[0] = scaleforopp(v, field_predB[0], 0, dir);
1505 field_predB[1] = scaleforopp(v, field_predB[1], 1, dir);
1507 if (c_valid && !c_f) {
1508 field_predC[0] = scaleforopp(v, field_predC[0], 0, dir);
1509 field_predC[1] = scaleforopp(v, field_predC[1], 1, dir);
1511 v->mv_f[dir][xy + v->blocks_off] = 1;
1512 v->ref_field_type[dir] = !v->cur_field_type;
1514 if (a_valid && a_f) {
1515 field_predA[0] = scaleforsame(v, n, field_predA[0], 0, dir);
1516 field_predA[1] = scaleforsame(v, n, field_predA[1], 1, dir);
1518 if (b_valid && b_f) {
1519 field_predB[0] = scaleforsame(v, n, field_predB[0], 0, dir);
1520 field_predB[1] = scaleforsame(v, n, field_predB[1], 1, dir);
1522 if (c_valid && c_f) {
1523 field_predC[0] = scaleforsame(v, n, field_predC[0], 0, dir);
1524 field_predC[1] = scaleforsame(v, n, field_predC[1], 1, dir);
1526 v->mv_f[dir][xy + v->blocks_off] = 0;
1527 v->ref_field_type[dir] = v->cur_field_type;
1531 px = field_predA[0];
1532 py = field_predA[1];
1533 } else if (c_valid) {
1534 px = field_predC[0];
1535 py = field_predC[1];
1536 } else if (b_valid) {
1537 px = field_predB[0];
1538 py = field_predB[1];
1544 if (num_samefield + num_oppfield > 1) {
1545 px = mid_pred(field_predA[0], field_predB[0], field_predC[0]);
1546 py = mid_pred(field_predA[1], field_predB[1], field_predC[1]);
1549 /* Pullback MV as specified in 8.3.5.3.4 */
1550 if (!v->field_mode) {
1552 qx = (s->mb_x << 6) + ((n == 1 || n == 3) ? 32 : 0);
1553 qy = (s->mb_y << 6) + ((n == 2 || n == 3) ? 32 : 0);
1554 X = (s->mb_width << 6) - 4;
1555 Y = (s->mb_height << 6) - 4;
1557 if (qx + px < -60) px = -60 - qx;
1558 if (qy + py < -60) py = -60 - qy;
1560 if (qx + px < -28) px = -28 - qx;
1561 if (qy + py < -28) py = -28 - qy;
1563 if (qx + px > X) px = X - qx;
1564 if (qy + py > Y) py = Y - qy;
1567 if (!v->field_mode || s->pict_type != AV_PICTURE_TYPE_B) {
1568 /* Calculate hybrid prediction as specified in 8.3.5.3.5 (also 10.3.5.4.3.5) */
1569 hybridmv_thresh = 32;
1570 if (a_valid && c_valid) {
1571 if (is_intra[xy - wrap])
1572 sum = FFABS(px) + FFABS(py);
1574 sum = FFABS(px - field_predA[0]) + FFABS(py - field_predA[1]);
1575 if (sum > hybridmv_thresh) {
1576 if (get_bits1(&s->gb)) { // read HYBRIDPRED bit
1577 px = field_predA[0];
1578 py = field_predA[1];
1580 px = field_predC[0];
1581 py = field_predC[1];
1584 if (is_intra[xy - 1])
1585 sum = FFABS(px) + FFABS(py);
1587 sum = FFABS(px - field_predC[0]) + FFABS(py - field_predC[1]);
1588 if (sum > hybridmv_thresh) {
1589 if (get_bits1(&s->gb)) {
1590 px = field_predA[0];
1591 py = field_predA[1];
1593 px = field_predC[0];
1594 py = field_predC[1];
1601 if (v->field_mode && v->numref)
1603 if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0)
1605 /* store MV using signed modulus of MV range defined in 4.11 */
1606 s->mv[dir][n][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1607 s->mv[dir][n][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1] = ((py + dmv_y + r_y - y_bias) & ((r_y << 1) - 1)) - r_y + y_bias;
1608 if (mv1) { /* duplicate motion data for 1-MV block */
1609 s->current_picture.f.motion_val[dir][xy + 1 + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
1610 s->current_picture.f.motion_val[dir][xy + 1 + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
1611 s->current_picture.f.motion_val[dir][xy + wrap + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
1612 s->current_picture.f.motion_val[dir][xy + wrap + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
1613 s->current_picture.f.motion_val[dir][xy + wrap + 1 + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
1614 s->current_picture.f.motion_val[dir][xy + wrap + 1 + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
1615 v->mv_f[dir][xy + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off];
1616 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];
1620 /** Predict and set motion vector for interlaced frame picture MBs
1622 static inline void vc1_pred_mv_intfr(VC1Context *v, int n, int dmv_x, int dmv_y,
1623 int mvn, int r_x, int r_y, uint8_t* is_intra)
1625 MpegEncContext *s = &v->s;
1626 int xy, wrap, off = 0;
1627 int A[2], B[2], C[2];
1629 int a_valid = 0, b_valid = 0, c_valid = 0;
1630 int field_a, field_b, field_c; // 0: same, 1: opposit
1631 int total_valid, num_samefield, num_oppfield;
1632 int pos_c, pos_b, n_adj;
1634 wrap = s->b8_stride;
1635 xy = s->block_index[n];
1638 s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = 0;
1639 s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = 0;
1640 s->current_picture.f.motion_val[1][xy][0] = 0;
1641 s->current_picture.f.motion_val[1][xy][1] = 0;
1642 if (mvn == 1) { /* duplicate motion data for 1-MV block */
1643 s->current_picture.f.motion_val[0][xy + 1][0] = 0;
1644 s->current_picture.f.motion_val[0][xy + 1][1] = 0;
1645 s->current_picture.f.motion_val[0][xy + wrap][0] = 0;
1646 s->current_picture.f.motion_val[0][xy + wrap][1] = 0;
1647 s->current_picture.f.motion_val[0][xy + wrap + 1][0] = 0;
1648 s->current_picture.f.motion_val[0][xy + wrap + 1][1] = 0;
1649 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
1650 s->current_picture.f.motion_val[1][xy + 1][0] = 0;
1651 s->current_picture.f.motion_val[1][xy + 1][1] = 0;
1652 s->current_picture.f.motion_val[1][xy + wrap][0] = 0;
1653 s->current_picture.f.motion_val[1][xy + wrap][1] = 0;
1654 s->current_picture.f.motion_val[1][xy + wrap + 1][0] = 0;
1655 s->current_picture.f.motion_val[1][xy + wrap + 1][1] = 0;
1660 off = ((n == 0) || (n == 1)) ? 1 : -1;
1662 if (s->mb_x || (n == 1) || (n == 3)) {
1663 if ((v->blk_mv_type[xy]) // current block (MB) has a field MV
1664 || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { // or both have frame MV
1665 A[0] = s->current_picture.f.motion_val[0][xy - 1][0];
1666 A[1] = s->current_picture.f.motion_val[0][xy - 1][1];
1668 } else { // current block has frame mv and cand. has field MV (so average)
1669 A[0] = (s->current_picture.f.motion_val[0][xy - 1][0]
1670 + s->current_picture.f.motion_val[0][xy - 1 + off * wrap][0] + 1) >> 1;
1671 A[1] = (s->current_picture.f.motion_val[0][xy - 1][1]
1672 + s->current_picture.f.motion_val[0][xy - 1 + off * wrap][1] + 1) >> 1;
1675 if (!(n & 1) && v->is_intra[s->mb_x - 1]) {
1681 /* Predict B and C */
1682 B[0] = B[1] = C[0] = C[1] = 0;
1683 if (n == 0 || n == 1 || v->blk_mv_type[xy]) {
1684 if (!s->first_slice_line) {
1685 if (!v->is_intra[s->mb_x - s->mb_stride]) {
1688 pos_b = s->block_index[n_adj] - 2 * wrap;
1689 if (v->blk_mv_type[pos_b] && v->blk_mv_type[xy]) {
1690 n_adj = (n & 2) | (n & 1);
1692 B[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap][0];
1693 B[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap][1];
1694 if (v->blk_mv_type[pos_b] && !v->blk_mv_type[xy]) {
1695 B[0] = (B[0] + s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap][0] + 1) >> 1;
1696 B[1] = (B[1] + s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap][1] + 1) >> 1;
1699 if (s->mb_width > 1) {
1700 if (!v->is_intra[s->mb_x - s->mb_stride + 1]) {
1703 pos_c = s->block_index[2] - 2 * wrap + 2;
1704 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
1707 C[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap + 2][0];
1708 C[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap + 2][1];
1709 if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
1710 C[0] = (1 + C[0] + (s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap + 2][0])) >> 1;
1711 C[1] = (1 + C[1] + (s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap + 2][1])) >> 1;
1713 if (s->mb_x == s->mb_width - 1) {
1714 if (!v->is_intra[s->mb_x - s->mb_stride - 1]) {
1717 pos_c = s->block_index[3] - 2 * wrap - 2;
1718 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
1721 C[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap - 2][0];
1722 C[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap - 2][1];
1723 if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
1724 C[0] = (1 + C[0] + s->current_picture.f.motion_val[0][s->block_index[1] - 2 * wrap - 2][0]) >> 1;
1725 C[1] = (1 + C[1] + s->current_picture.f.motion_val[0][s->block_index[1] - 2 * wrap - 2][1]) >> 1;
1734 pos_b = s->block_index[1];
1736 B[0] = s->current_picture.f.motion_val[0][pos_b][0];
1737 B[1] = s->current_picture.f.motion_val[0][pos_b][1];
1738 pos_c = s->block_index[0];
1740 C[0] = s->current_picture.f.motion_val[0][pos_c][0];
1741 C[1] = s->current_picture.f.motion_val[0][pos_c][1];
1744 total_valid = a_valid + b_valid + c_valid;
1745 // check if predictor A is out of bounds
1746 if (!s->mb_x && !(n == 1 || n == 3)) {
1749 // check if predictor B is out of bounds
1750 if ((s->first_slice_line && v->blk_mv_type[xy]) || (s->first_slice_line && !(n & 2))) {
1751 B[0] = B[1] = C[0] = C[1] = 0;
1753 if (!v->blk_mv_type[xy]) {
1754 if (s->mb_width == 1) {
1758 if (total_valid >= 2) {
1759 px = mid_pred(A[0], B[0], C[0]);
1760 py = mid_pred(A[1], B[1], C[1]);
1761 } else if (total_valid) {
1762 if (a_valid) { px = A[0]; py = A[1]; }
1763 else if (b_valid) { px = B[0]; py = B[1]; }
1764 else if (c_valid) { px = C[0]; py = C[1]; }
1771 field_a = (A[1] & 4) ? 1 : 0;
1775 field_b = (B[1] & 4) ? 1 : 0;
1779 field_c = (C[1] & 4) ? 1 : 0;
1783 num_oppfield = field_a + field_b + field_c;
1784 num_samefield = total_valid - num_oppfield;
1785 if (total_valid == 3) {
1786 if ((num_samefield == 3) || (num_oppfield == 3)) {
1787 px = mid_pred(A[0], B[0], C[0]);
1788 py = mid_pred(A[1], B[1], C[1]);
1789 } else if (num_samefield >= num_oppfield) {
1790 /* take one MV from same field set depending on priority
1791 the check for B may not be necessary */
1792 px = !field_a ? A[0] : B[0];
1793 py = !field_a ? A[1] : B[1];
1795 px = field_a ? A[0] : B[0];
1796 py = field_a ? A[1] : B[1];
1798 } else if (total_valid == 2) {
1799 if (num_samefield >= num_oppfield) {
1800 if (!field_a && a_valid) {
1803 } else if (!field_b && b_valid) {
1806 } else if (c_valid) {
1811 if (field_a && a_valid) {
1814 } else if (field_b && b_valid) {
1817 } else if (c_valid) {
1822 } else if (total_valid == 1) {
1823 px = (a_valid) ? A[0] : ((b_valid) ? B[0] : C[0]);
1824 py = (a_valid) ? A[1] : ((b_valid) ? B[1] : C[1]);
1829 /* store MV using signed modulus of MV range defined in 4.11 */
1830 s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1831 s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
1832 if (mvn == 1) { /* duplicate motion data for 1-MV block */
1833 s->current_picture.f.motion_val[0][xy + 1 ][0] = s->current_picture.f.motion_val[0][xy][0];
1834 s->current_picture.f.motion_val[0][xy + 1 ][1] = s->current_picture.f.motion_val[0][xy][1];
1835 s->current_picture.f.motion_val[0][xy + wrap ][0] = s->current_picture.f.motion_val[0][xy][0];
1836 s->current_picture.f.motion_val[0][xy + wrap ][1] = s->current_picture.f.motion_val[0][xy][1];
1837 s->current_picture.f.motion_val[0][xy + wrap + 1][0] = s->current_picture.f.motion_val[0][xy][0];
1838 s->current_picture.f.motion_val[0][xy + wrap + 1][1] = s->current_picture.f.motion_val[0][xy][1];
1839 } else if (mvn == 2) { /* duplicate motion data for 2-Field MV block */
1840 s->current_picture.f.motion_val[0][xy + 1][0] = s->current_picture.f.motion_val[0][xy][0];
1841 s->current_picture.f.motion_val[0][xy + 1][1] = s->current_picture.f.motion_val[0][xy][1];
1842 s->mv[0][n + 1][0] = s->mv[0][n][0];
1843 s->mv[0][n + 1][1] = s->mv[0][n][1];
1847 /** Motion compensation for direct or interpolated blocks in B-frames
1849 static void vc1_interp_mc(VC1Context *v)
1851 MpegEncContext *s = &v->s;
1852 DSPContext *dsp = &v->s.dsp;
1853 H264ChromaContext *h264chroma = &v->h264chroma;
1854 uint8_t *srcY, *srcU, *srcV;
1855 int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
1857 int v_edge_pos = s->v_edge_pos >> v->field_mode;
1859 if (!v->field_mode && !v->s.next_picture.f.data[0])
1862 mx = s->mv[1][0][0];
1863 my = s->mv[1][0][1];
1864 uvmx = (mx + ((mx & 3) == 3)) >> 1;
1865 uvmy = (my + ((my & 3) == 3)) >> 1;
1866 if (v->field_mode) {
1867 if (v->cur_field_type != v->ref_field_type[1])
1868 my = my - 2 + 4 * v->cur_field_type;
1869 uvmy = uvmy - 2 + 4 * v->cur_field_type;
1872 uvmx = uvmx + ((uvmx < 0) ? -(uvmx & 1) : (uvmx & 1));
1873 uvmy = uvmy + ((uvmy < 0) ? -(uvmy & 1) : (uvmy & 1));
1875 srcY = s->next_picture.f.data[0];
1876 srcU = s->next_picture.f.data[1];
1877 srcV = s->next_picture.f.data[2];
1879 src_x = s->mb_x * 16 + (mx >> 2);
1880 src_y = s->mb_y * 16 + (my >> 2);
1881 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
1882 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
1884 if (v->profile != PROFILE_ADVANCED) {
1885 src_x = av_clip( src_x, -16, s->mb_width * 16);
1886 src_y = av_clip( src_y, -16, s->mb_height * 16);
1887 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
1888 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
1890 src_x = av_clip( src_x, -17, s->avctx->coded_width);
1891 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
1892 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
1893 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
1896 srcY += src_y * s->linesize + src_x;
1897 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
1898 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
1900 if (v->field_mode && v->ref_field_type[1]) {
1901 srcY += s->current_picture_ptr->f.linesize[0];
1902 srcU += s->current_picture_ptr->f.linesize[1];
1903 srcV += s->current_picture_ptr->f.linesize[2];
1906 /* for grayscale we should not try to read from unknown area */
1907 if (s->flags & CODEC_FLAG_GRAY) {
1908 srcU = s->edge_emu_buffer + 18 * s->linesize;
1909 srcV = s->edge_emu_buffer + 18 * s->linesize;
1912 if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22
1913 || (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3
1914 || (unsigned)(src_y - 1) > v_edge_pos - (my & 3) - 16 - 3) {
1915 uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
1917 srcY -= s->mspel * (1 + s->linesize);
1918 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
1919 17 + s->mspel * 2, 17 + s->mspel * 2,
1920 src_x - s->mspel, src_y - s->mspel,
1921 s->h_edge_pos, v_edge_pos);
1922 srcY = s->edge_emu_buffer;
1923 s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
1924 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1925 s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
1926 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1929 /* if we deal with range reduction we need to scale source blocks */
1930 if (v->rangeredfrm) {
1932 uint8_t *src, *src2;
1935 for (j = 0; j < 17 + s->mspel * 2; j++) {
1936 for (i = 0; i < 17 + s->mspel * 2; i++)
1937 src[i] = ((src[i] - 128) >> 1) + 128;
1942 for (j = 0; j < 9; j++) {
1943 for (i = 0; i < 9; i++) {
1944 src[i] = ((src[i] - 128) >> 1) + 128;
1945 src2[i] = ((src2[i] - 128) >> 1) + 128;
1947 src += s->uvlinesize;
1948 src2 += s->uvlinesize;
1951 srcY += s->mspel * (1 + s->linesize);
1954 if (v->field_mode && v->second_field) {
1955 off = s->current_picture_ptr->f.linesize[0];
1956 off_uv = s->current_picture_ptr->f.linesize[1];
1963 dxy = ((my & 3) << 2) | (mx & 3);
1964 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
1965 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
1966 srcY += s->linesize * 8;
1967 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize , srcY , s->linesize, v->rnd);
1968 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
1970 dxy = (my & 2) | ((mx & 2) >> 1);
1973 dsp->avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
1975 dsp->avg_no_rnd_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, 16);
1978 if (s->flags & CODEC_FLAG_GRAY) return;
1979 /* Chroma MC always uses qpel blilinear */
1980 uvmx = (uvmx & 3) << 1;
1981 uvmy = (uvmy & 3) << 1;
1983 h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
1984 h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
1986 v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
1987 v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
1991 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
1995 #if B_FRACTION_DEN==256
1999 return 2 * ((value * n + 255) >> 9);
2000 return (value * n + 128) >> 8;
2003 n -= B_FRACTION_DEN;
2005 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
2006 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
2010 /** Reconstruct motion vector for B-frame and do motion compensation
2012 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
2013 int direct, int mode)
2016 v->mv_mode2 = v->mv_mode;
2017 v->mv_mode = MV_PMODE_INTENSITY_COMP;
2023 v->mv_mode = v->mv_mode2;
2026 if (mode == BMV_TYPE_INTERPOLATED) {
2030 v->mv_mode = v->mv_mode2;
2034 if (v->use_ic && (mode == BMV_TYPE_BACKWARD))
2035 v->mv_mode = v->mv_mode2;
2036 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
2038 v->mv_mode = v->mv_mode2;
2041 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2],
2042 int direct, int mvtype)
2044 MpegEncContext *s = &v->s;
2045 int xy, wrap, off = 0;
2050 const uint8_t *is_intra = v->mb_type[0];
2054 /* scale MV difference to be quad-pel */
2055 dmv_x[0] <<= 1 - s->quarter_sample;
2056 dmv_y[0] <<= 1 - s->quarter_sample;
2057 dmv_x[1] <<= 1 - s->quarter_sample;
2058 dmv_y[1] <<= 1 - s->quarter_sample;
2060 wrap = s->b8_stride;
2061 xy = s->block_index[0];
2064 s->current_picture.f.motion_val[0][xy + v->blocks_off][0] =
2065 s->current_picture.f.motion_val[0][xy + v->blocks_off][1] =
2066 s->current_picture.f.motion_val[1][xy + v->blocks_off][0] =
2067 s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = 0;
2070 if (!v->field_mode) {
2071 s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
2072 s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
2073 s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
2074 s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
2076 /* Pullback predicted motion vectors as specified in 8.4.5.4 */
2077 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));
2078 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));
2079 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));
2080 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));
2083 s->current_picture.f.motion_val[0][xy + v->blocks_off][0] = s->mv[0][0][0];
2084 s->current_picture.f.motion_val[0][xy + v->blocks_off][1] = s->mv[0][0][1];
2085 s->current_picture.f.motion_val[1][xy + v->blocks_off][0] = s->mv[1][0][0];
2086 s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = s->mv[1][0][1];
2090 if ((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2091 C = s->current_picture.f.motion_val[0][xy - 2];
2092 A = s->current_picture.f.motion_val[0][xy - wrap * 2];
2093 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2094 B = s->current_picture.f.motion_val[0][xy - wrap * 2 + off];
2096 if (!s->mb_x) C[0] = C[1] = 0;
2097 if (!s->first_slice_line) { // predictor A is not out of bounds
2098 if (s->mb_width == 1) {
2102 px = mid_pred(A[0], B[0], C[0]);
2103 py = mid_pred(A[1], B[1], C[1]);
2105 } else if (s->mb_x) { // predictor C is not out of bounds
2111 /* Pullback MV as specified in 8.3.5.3.4 */
2114 if (v->profile < PROFILE_ADVANCED) {
2115 qx = (s->mb_x << 5);
2116 qy = (s->mb_y << 5);
2117 X = (s->mb_width << 5) - 4;
2118 Y = (s->mb_height << 5) - 4;
2119 if (qx + px < -28) px = -28 - qx;
2120 if (qy + py < -28) py = -28 - qy;
2121 if (qx + px > X) px = X - qx;
2122 if (qy + py > Y) py = Y - qy;
2124 qx = (s->mb_x << 6);
2125 qy = (s->mb_y << 6);
2126 X = (s->mb_width << 6) - 4;
2127 Y = (s->mb_height << 6) - 4;
2128 if (qx + px < -60) px = -60 - qx;
2129 if (qy + py < -60) py = -60 - qy;
2130 if (qx + px > X) px = X - qx;
2131 if (qy + py > Y) py = Y - qy;
2134 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2135 if (0 && !s->first_slice_line && s->mb_x) {
2136 if (is_intra[xy - wrap])
2137 sum = FFABS(px) + FFABS(py);
2139 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2141 if (get_bits1(&s->gb)) {
2149 if (is_intra[xy - 2])
2150 sum = FFABS(px) + FFABS(py);
2152 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2154 if (get_bits1(&s->gb)) {
2164 /* store MV using signed modulus of MV range defined in 4.11 */
2165 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
2166 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
2168 if ((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2169 C = s->current_picture.f.motion_val[1][xy - 2];
2170 A = s->current_picture.f.motion_val[1][xy - wrap * 2];
2171 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2172 B = s->current_picture.f.motion_val[1][xy - wrap * 2 + off];
2176 if (!s->first_slice_line) { // predictor A is not out of bounds
2177 if (s->mb_width == 1) {
2181 px = mid_pred(A[0], B[0], C[0]);
2182 py = mid_pred(A[1], B[1], C[1]);
2184 } else if (s->mb_x) { // predictor C is not out of bounds
2190 /* Pullback MV as specified in 8.3.5.3.4 */
2193 if (v->profile < PROFILE_ADVANCED) {
2194 qx = (s->mb_x << 5);
2195 qy = (s->mb_y << 5);
2196 X = (s->mb_width << 5) - 4;
2197 Y = (s->mb_height << 5) - 4;
2198 if (qx + px < -28) px = -28 - qx;
2199 if (qy + py < -28) py = -28 - qy;
2200 if (qx + px > X) px = X - qx;
2201 if (qy + py > Y) py = Y - qy;
2203 qx = (s->mb_x << 6);
2204 qy = (s->mb_y << 6);
2205 X = (s->mb_width << 6) - 4;
2206 Y = (s->mb_height << 6) - 4;
2207 if (qx + px < -60) px = -60 - qx;
2208 if (qy + py < -60) py = -60 - qy;
2209 if (qx + px > X) px = X - qx;
2210 if (qy + py > Y) py = Y - qy;
2213 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2214 if (0 && !s->first_slice_line && s->mb_x) {
2215 if (is_intra[xy - wrap])
2216 sum = FFABS(px) + FFABS(py);
2218 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2220 if (get_bits1(&s->gb)) {
2228 if (is_intra[xy - 2])
2229 sum = FFABS(px) + FFABS(py);
2231 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2233 if (get_bits1(&s->gb)) {
2243 /* store MV using signed modulus of MV range defined in 4.11 */
2245 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
2246 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
2248 s->current_picture.f.motion_val[0][xy][0] = s->mv[0][0][0];
2249 s->current_picture.f.motion_val[0][xy][1] = s->mv[0][0][1];
2250 s->current_picture.f.motion_val[1][xy][0] = s->mv[1][0][0];
2251 s->current_picture.f.motion_val[1][xy][1] = s->mv[1][0][1];
2254 static inline void vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, int mv1, int *pred_flag)
2256 int dir = (v->bmvtype == BMV_TYPE_BACKWARD) ? 1 : 0;
2257 MpegEncContext *s = &v->s;
2258 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2260 if (v->bmvtype == BMV_TYPE_DIRECT) {
2261 int total_opp, k, f;
2262 if (s->next_picture.f.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) {
2263 s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2264 v->bfraction, 0, s->quarter_sample);
2265 s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2266 v->bfraction, 0, s->quarter_sample);
2267 s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2268 v->bfraction, 1, s->quarter_sample);
2269 s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2270 v->bfraction, 1, s->quarter_sample);
2272 total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
2273 + v->mv_f_next[0][s->block_index[1] + v->blocks_off]
2274 + v->mv_f_next[0][s->block_index[2] + v->blocks_off]
2275 + v->mv_f_next[0][s->block_index[3] + v->blocks_off];
2276 f = (total_opp > 2) ? 1 : 0;
2278 s->mv[0][0][0] = s->mv[0][0][1] = 0;
2279 s->mv[1][0][0] = s->mv[1][0][1] = 0;
2282 v->ref_field_type[0] = v->ref_field_type[1] = v->cur_field_type ^ f;
2283 for (k = 0; k < 4; k++) {
2284 s->current_picture.f.motion_val[0][s->block_index[k] + v->blocks_off][0] = s->mv[0][0][0];
2285 s->current_picture.f.motion_val[0][s->block_index[k] + v->blocks_off][1] = s->mv[0][0][1];
2286 s->current_picture.f.motion_val[1][s->block_index[k] + v->blocks_off][0] = s->mv[1][0][0];
2287 s->current_picture.f.motion_val[1][s->block_index[k] + v->blocks_off][1] = s->mv[1][0][1];
2288 v->mv_f[0][s->block_index[k] + v->blocks_off] = f;
2289 v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
2293 if (v->bmvtype == BMV_TYPE_INTERPOLATED) {
2294 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);
2295 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);
2298 if (dir) { // backward
2299 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);
2300 if (n == 3 || mv1) {
2301 vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0], 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
2304 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);
2305 if (n == 3 || mv1) {
2306 vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1], 1, v->range_x, v->range_y, v->mb_type[0], 0, 1);
2311 /** Get predicted DC value for I-frames only
2312 * prediction dir: left=0, top=1
2313 * @param s MpegEncContext
2314 * @param overlap flag indicating that overlap filtering is used
2315 * @param pq integer part of picture quantizer
2316 * @param[in] n block index in the current MB
2317 * @param dc_val_ptr Pointer to DC predictor
2318 * @param dir_ptr Prediction direction for use in AC prediction
2320 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2321 int16_t **dc_val_ptr, int *dir_ptr)
2323 int a, b, c, wrap, pred, scale;
2325 static const uint16_t dcpred[32] = {
2326 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
2327 114, 102, 93, 85, 79, 73, 68, 64,
2328 60, 57, 54, 51, 49, 47, 45, 43,
2329 41, 39, 38, 37, 35, 34, 33
2332 /* find prediction - wmv3_dc_scale always used here in fact */
2333 if (n < 4) scale = s->y_dc_scale;
2334 else scale = s->c_dc_scale;
2336 wrap = s->block_wrap[n];
2337 dc_val = s->dc_val[0] + s->block_index[n];
2343 b = dc_val[ - 1 - wrap];
2344 a = dc_val[ - wrap];
2346 if (pq < 9 || !overlap) {
2347 /* Set outer values */
2348 if (s->first_slice_line && (n != 2 && n != 3))
2349 b = a = dcpred[scale];
2350 if (s->mb_x == 0 && (n != 1 && n != 3))
2351 b = c = dcpred[scale];
2353 /* Set outer values */
2354 if (s->first_slice_line && (n != 2 && n != 3))
2356 if (s->mb_x == 0 && (n != 1 && n != 3))
2360 if (abs(a - b) <= abs(b - c)) {
2362 *dir_ptr = 1; // left
2365 *dir_ptr = 0; // top
2368 /* update predictor */
2369 *dc_val_ptr = &dc_val[0];
2374 /** Get predicted DC value
2375 * prediction dir: left=0, top=1
2376 * @param s MpegEncContext
2377 * @param overlap flag indicating that overlap filtering is used
2378 * @param pq integer part of picture quantizer
2379 * @param[in] n block index in the current MB
2380 * @param a_avail flag indicating top block availability
2381 * @param c_avail flag indicating left block availability
2382 * @param dc_val_ptr Pointer to DC predictor
2383 * @param dir_ptr Prediction direction for use in AC prediction
2385 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2386 int a_avail, int c_avail,
2387 int16_t **dc_val_ptr, int *dir_ptr)
2389 int a, b, c, wrap, pred;
2391 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2395 wrap = s->block_wrap[n];
2396 dc_val = s->dc_val[0] + s->block_index[n];
2402 b = dc_val[ - 1 - wrap];
2403 a = dc_val[ - wrap];
2404 /* scale predictors if needed */
2405 q1 = s->current_picture.f.qscale_table[mb_pos];
2406 dqscale_index = s->y_dc_scale_table[q1] - 1;
2407 if (dqscale_index < 0)
2409 if (c_avail && (n != 1 && n != 3)) {
2410 q2 = s->current_picture.f.qscale_table[mb_pos - 1];
2412 c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2414 if (a_avail && (n != 2 && n != 3)) {
2415 q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
2417 a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2419 if (a_avail && c_avail && (n != 3)) {
2424 off -= s->mb_stride;
2425 q2 = s->current_picture.f.qscale_table[off];
2427 b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
2430 if (a_avail && c_avail) {
2431 if (abs(a - b) <= abs(b - c)) {
2433 *dir_ptr = 1; // left
2436 *dir_ptr = 0; // top
2438 } else if (a_avail) {
2440 *dir_ptr = 0; // top
2441 } else if (c_avail) {
2443 *dir_ptr = 1; // left
2446 *dir_ptr = 1; // left
2449 /* update predictor */
2450 *dc_val_ptr = &dc_val[0];
2454 /** @} */ // Block group
2457 * @name VC1 Macroblock-level functions in Simple/Main Profiles
2458 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2462 static inline int vc1_coded_block_pred(MpegEncContext * s, int n,
2463 uint8_t **coded_block_ptr)
2465 int xy, wrap, pred, a, b, c;
2467 xy = s->block_index[n];
2468 wrap = s->b8_stride;
2473 a = s->coded_block[xy - 1 ];
2474 b = s->coded_block[xy - 1 - wrap];
2475 c = s->coded_block[xy - wrap];
2484 *coded_block_ptr = &s->coded_block[xy];
2490 * Decode one AC coefficient
2491 * @param v The VC1 context
2492 * @param last Last coefficient
2493 * @param skip How much zero coefficients to skip
2494 * @param value Decoded AC coefficient value
2495 * @param codingset set of VLC to decode data
2498 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
2499 int *value, int codingset)
2501 GetBitContext *gb = &v->s.gb;
2502 int index, escape, run = 0, level = 0, lst = 0;
2504 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2505 if (index != ff_vc1_ac_sizes[codingset] - 1) {
2506 run = vc1_index_decode_table[codingset][index][0];
2507 level = vc1_index_decode_table[codingset][index][1];
2508 lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
2512 escape = decode210(gb);
2514 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2515 run = vc1_index_decode_table[codingset][index][0];
2516 level = vc1_index_decode_table[codingset][index][1];
2517 lst = index >= vc1_last_decode_table[codingset];
2520 level += vc1_last_delta_level_table[codingset][run];
2522 level += vc1_delta_level_table[codingset][run];
2525 run += vc1_last_delta_run_table[codingset][level] + 1;
2527 run += vc1_delta_run_table[codingset][level] + 1;
2533 lst = get_bits1(gb);
2534 if (v->s.esc3_level_length == 0) {
2535 if (v->pq < 8 || v->dquantfrm) { // table 59
2536 v->s.esc3_level_length = get_bits(gb, 3);
2537 if (!v->s.esc3_level_length)
2538 v->s.esc3_level_length = get_bits(gb, 2) + 8;
2539 } else { // table 60
2540 v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
2542 v->s.esc3_run_length = 3 + get_bits(gb, 2);
2544 run = get_bits(gb, v->s.esc3_run_length);
2545 sign = get_bits1(gb);
2546 level = get_bits(gb, v->s.esc3_level_length);
2557 /** Decode intra block in intra frames - should be faster than decode_intra_block
2558 * @param v VC1Context
2559 * @param block block to decode
2560 * @param[in] n subblock index
2561 * @param coded are AC coeffs present or not
2562 * @param codingset set of VLC to decode data
2564 static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
2565 int coded, int codingset)
2567 GetBitContext *gb = &v->s.gb;
2568 MpegEncContext *s = &v->s;
2569 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2572 int16_t *ac_val, *ac_val2;
2575 /* Get DC differential */
2577 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2579 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2582 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2586 if (dcdiff == 119 /* ESC index value */) {
2587 /* TODO: Optimize */
2588 if (v->pq == 1) dcdiff = get_bits(gb, 10);
2589 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
2590 else dcdiff = get_bits(gb, 8);
2593 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2594 else if (v->pq == 2)
2595 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
2602 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2605 /* Store the quantized DC coeff, used for prediction */
2607 block[0] = dcdiff * s->y_dc_scale;
2609 block[0] = dcdiff * s->c_dc_scale;
2620 int last = 0, skip, value;
2621 const uint8_t *zz_table;
2625 scale = v->pq * 2 + v->halfpq;
2629 zz_table = v->zz_8x8[2];
2631 zz_table = v->zz_8x8[3];
2633 zz_table = v->zz_8x8[1];
2635 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2637 if (dc_pred_dir) // left
2640 ac_val -= 16 * s->block_wrap[n];
2643 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2647 block[zz_table[i++]] = value;
2650 /* apply AC prediction if needed */
2652 if (dc_pred_dir) { // left
2653 for (k = 1; k < 8; k++)
2654 block[k << v->left_blk_sh] += ac_val[k];
2656 for (k = 1; k < 8; k++)
2657 block[k << v->top_blk_sh] += ac_val[k + 8];
2660 /* save AC coeffs for further prediction */
2661 for (k = 1; k < 8; k++) {
2662 ac_val2[k] = block[k << v->left_blk_sh];
2663 ac_val2[k + 8] = block[k << v->top_blk_sh];
2666 /* scale AC coeffs */
2667 for (k = 1; k < 64; k++)
2671 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2674 if (s->ac_pred) i = 63;
2680 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2684 scale = v->pq * 2 + v->halfpq;
2685 memset(ac_val2, 0, 16 * 2);
2686 if (dc_pred_dir) { // left
2689 memcpy(ac_val2, ac_val, 8 * 2);
2691 ac_val -= 16 * s->block_wrap[n];
2693 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2696 /* apply AC prediction if needed */
2698 if (dc_pred_dir) { //left
2699 for (k = 1; k < 8; k++) {
2700 block[k << v->left_blk_sh] = ac_val[k] * scale;
2701 if (!v->pquantizer && block[k << v->left_blk_sh])
2702 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
2705 for (k = 1; k < 8; k++) {
2706 block[k << v->top_blk_sh] = ac_val[k + 8] * scale;
2707 if (!v->pquantizer && block[k << v->top_blk_sh])
2708 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq;
2714 s->block_last_index[n] = i;
2719 /** Decode intra block in intra frames - should be faster than decode_intra_block
2720 * @param v VC1Context
2721 * @param block block to decode
2722 * @param[in] n subblock number
2723 * @param coded are AC coeffs present or not
2724 * @param codingset set of VLC to decode data
2725 * @param mquant quantizer value for this macroblock
2727 static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n,
2728 int coded, int codingset, int mquant)
2730 GetBitContext *gb = &v->s.gb;
2731 MpegEncContext *s = &v->s;
2732 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2734 int16_t *dc_val = NULL;
2735 int16_t *ac_val, *ac_val2;
2737 int a_avail = v->a_avail, c_avail = v->c_avail;
2738 int use_pred = s->ac_pred;
2741 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2743 /* Get DC differential */
2745 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2747 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2750 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2754 if (dcdiff == 119 /* ESC index value */) {
2755 /* TODO: Optimize */
2756 if (mquant == 1) dcdiff = get_bits(gb, 10);
2757 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2758 else dcdiff = get_bits(gb, 8);
2761 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2762 else if (mquant == 2)
2763 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
2770 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2773 /* Store the quantized DC coeff, used for prediction */
2775 block[0] = dcdiff * s->y_dc_scale;
2777 block[0] = dcdiff * s->c_dc_scale;
2783 /* check if AC is needed at all */
2784 if (!a_avail && !c_avail)
2786 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2789 scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
2791 if (dc_pred_dir) // left
2794 ac_val -= 16 * s->block_wrap[n];
2796 q1 = s->current_picture.f.qscale_table[mb_pos];
2797 if ( dc_pred_dir && c_avail && mb_pos)
2798 q2 = s->current_picture.f.qscale_table[mb_pos - 1];
2799 if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
2800 q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
2801 if ( dc_pred_dir && n == 1)
2803 if (!dc_pred_dir && n == 2)
2809 int last = 0, skip, value;
2810 const uint8_t *zz_table;
2814 if (!use_pred && v->fcm == ILACE_FRAME) {
2815 zz_table = v->zzi_8x8;
2817 if (!dc_pred_dir) // top
2818 zz_table = v->zz_8x8[2];
2820 zz_table = v->zz_8x8[3];
2823 if (v->fcm != ILACE_FRAME)
2824 zz_table = v->zz_8x8[1];
2826 zz_table = v->zzi_8x8;
2830 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2834 block[zz_table[i++]] = value;
2837 /* apply AC prediction if needed */
2839 /* scale predictors if needed*/
2840 if (q2 && q1 != q2) {
2841 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2842 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2845 return AVERROR_INVALIDDATA;
2846 if (dc_pred_dir) { // left
2847 for (k = 1; k < 8; k++)
2848 block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2850 for (k = 1; k < 8; k++)
2851 block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2854 if (dc_pred_dir) { //left
2855 for (k = 1; k < 8; k++)
2856 block[k << v->left_blk_sh] += ac_val[k];
2858 for (k = 1; k < 8; k++)
2859 block[k << v->top_blk_sh] += ac_val[k + 8];
2863 /* save AC coeffs for further prediction */
2864 for (k = 1; k < 8; k++) {
2865 ac_val2[k ] = block[k << v->left_blk_sh];
2866 ac_val2[k + 8] = block[k << v->top_blk_sh];
2869 /* scale AC coeffs */
2870 for (k = 1; k < 64; k++)
2874 block[k] += (block[k] < 0) ? -mquant : mquant;
2877 if (use_pred) i = 63;
2878 } else { // no AC coeffs
2881 memset(ac_val2, 0, 16 * 2);
2882 if (dc_pred_dir) { // left
2884 memcpy(ac_val2, ac_val, 8 * 2);
2885 if (q2 && q1 != q2) {
2886 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2887 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2889 return AVERROR_INVALIDDATA;
2890 for (k = 1; k < 8; k++)
2891 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2896 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2897 if (q2 && q1 != q2) {
2898 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2899 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2901 return AVERROR_INVALIDDATA;
2902 for (k = 1; k < 8; k++)
2903 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2908 /* apply AC prediction if needed */
2910 if (dc_pred_dir) { // left
2911 for (k = 1; k < 8; k++) {
2912 block[k << v->left_blk_sh] = ac_val2[k] * scale;
2913 if (!v->pquantizer && block[k << v->left_blk_sh])
2914 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
2917 for (k = 1; k < 8; k++) {
2918 block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
2919 if (!v->pquantizer && block[k << v->top_blk_sh])
2920 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
2926 s->block_last_index[n] = i;
2931 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
2932 * @param v VC1Context
2933 * @param block block to decode
2934 * @param[in] n subblock index
2935 * @param coded are AC coeffs present or not
2936 * @param mquant block quantizer
2937 * @param codingset set of VLC to decode data
2939 static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n,
2940 int coded, int mquant, int codingset)
2942 GetBitContext *gb = &v->s.gb;
2943 MpegEncContext *s = &v->s;
2944 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2946 int16_t *dc_val = NULL;
2947 int16_t *ac_val, *ac_val2;
2949 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2950 int a_avail = v->a_avail, c_avail = v->c_avail;
2951 int use_pred = s->ac_pred;
2955 s->dsp.clear_block(block);
2957 /* XXX: Guard against dumb values of mquant */
2958 mquant = (mquant < 1) ? 0 : ((mquant > 31) ? 31 : mquant);
2960 /* Set DC scale - y and c use the same */
2961 s->y_dc_scale = s->y_dc_scale_table[mquant];
2962 s->c_dc_scale = s->c_dc_scale_table[mquant];
2964 /* Get DC differential */
2966 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2968 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2971 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2975 if (dcdiff == 119 /* ESC index value */) {
2976 /* TODO: Optimize */
2977 if (mquant == 1) dcdiff = get_bits(gb, 10);
2978 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2979 else dcdiff = get_bits(gb, 8);
2982 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
2983 else if (mquant == 2)
2984 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
2991 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
2994 /* Store the quantized DC coeff, used for prediction */
2997 block[0] = dcdiff * s->y_dc_scale;
2999 block[0] = dcdiff * s->c_dc_scale;
3005 /* check if AC is needed at all and adjust direction if needed */
3006 if (!a_avail) dc_pred_dir = 1;
3007 if (!c_avail) dc_pred_dir = 0;
3008 if (!a_avail && !c_avail) use_pred = 0;
3009 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
3012 scale = mquant * 2 + v->halfpq;
3014 if (dc_pred_dir) //left
3017 ac_val -= 16 * s->block_wrap[n];
3019 q1 = s->current_picture.f.qscale_table[mb_pos];
3020 if (dc_pred_dir && c_avail && mb_pos)
3021 q2 = s->current_picture.f.qscale_table[mb_pos - 1];
3022 if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
3023 q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
3024 if ( dc_pred_dir && n == 1)
3026 if (!dc_pred_dir && n == 2)
3028 if (n == 3) q2 = q1;
3031 int last = 0, skip, value;
3035 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
3039 if (v->fcm == PROGRESSIVE)
3040 block[v->zz_8x8[0][i++]] = value;
3042 if (use_pred && (v->fcm == ILACE_FRAME)) {
3043 if (!dc_pred_dir) // top
3044 block[v->zz_8x8[2][i++]] = value;
3046 block[v->zz_8x8[3][i++]] = value;
3048 block[v->zzi_8x8[i++]] = value;
3053 /* apply AC prediction if needed */
3055 /* scale predictors if needed*/
3056 if (q2 && q1 != q2) {
3057 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3058 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3061 return AVERROR_INVALIDDATA;
3062 if (dc_pred_dir) { // left
3063 for (k = 1; k < 8; k++)
3064 block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3066 for (k = 1; k < 8; k++)
3067 block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3070 if (dc_pred_dir) { // left
3071 for (k = 1; k < 8; k++)
3072 block[k << v->left_blk_sh] += ac_val[k];
3074 for (k = 1; k < 8; k++)
3075 block[k << v->top_blk_sh] += ac_val[k + 8];
3079 /* save AC coeffs for further prediction */
3080 for (k = 1; k < 8; k++) {
3081 ac_val2[k ] = block[k << v->left_blk_sh];
3082 ac_val2[k + 8] = block[k << v->top_blk_sh];
3085 /* scale AC coeffs */
3086 for (k = 1; k < 64; k++)
3090 block[k] += (block[k] < 0) ? -mquant : mquant;
3093 if (use_pred) i = 63;
3094 } else { // no AC coeffs
3097 memset(ac_val2, 0, 16 * 2);
3098 if (dc_pred_dir) { // left
3100 memcpy(ac_val2, ac_val, 8 * 2);
3101 if (q2 && q1 != q2) {
3102 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3103 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3105 return AVERROR_INVALIDDATA;
3106 for (k = 1; k < 8; k++)
3107 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3112 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
3113 if (q2 && q1 != q2) {
3114 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3115 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3117 return AVERROR_INVALIDDATA;
3118 for (k = 1; k < 8; k++)
3119 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3124 /* apply AC prediction if needed */
3126 if (dc_pred_dir) { // left
3127 for (k = 1; k < 8; k++) {
3128 block[k << v->left_blk_sh] = ac_val2[k] * scale;
3129 if (!v->pquantizer && block[k << v->left_blk_sh])
3130 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
3133 for (k = 1; k < 8; k++) {
3134 block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
3135 if (!v->pquantizer && block[k << v->top_blk_sh])
3136 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
3142 s->block_last_index[n] = i;
3149 static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n,
3150 int mquant, int ttmb, int first_block,
3151 uint8_t *dst, int linesize, int skip_block,
3154 MpegEncContext *s = &v->s;
3155 GetBitContext *gb = &s->gb;
3158 int scale, off, idx, last, skip, value;
3159 int ttblk = ttmb & 7;
3162 s->dsp.clear_block(block);
3165 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)];
3167 if (ttblk == TT_4X4) {
3168 subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
3170 if ((ttblk != TT_8X8 && ttblk != TT_4X4)
3171 && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
3172 || (!v->res_rtm_flag && !first_block))) {
3173 subblkpat = decode012(gb);
3175 subblkpat ^= 3; // swap decoded pattern bits
3176 if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM)
3178 if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT)
3181 scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
3183 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
3184 if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
3185 subblkpat = 2 - (ttblk == TT_8X4_TOP);
3188 if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3189 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3198 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3203 idx = v->zz_8x8[0][i++];
3205 idx = v->zzi_8x8[i++];
3206 block[idx] = value * scale;
3208 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3212 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
3214 v->vc1dsp.vc1_inv_trans_8x8(block);
3215 s->dsp.add_pixels_clamped(block, dst, linesize);
3220 pat = ~subblkpat & 0xF;
3221 for (j = 0; j < 4; j++) {
3222 last = subblkpat & (1 << (3 - j));
3224 off = (j & 1) * 4 + (j & 2) * 16;
3226 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3231 idx = ff_vc1_simple_progressive_4x4_zz[i++];
3233 idx = ff_vc1_adv_interlaced_4x4_zz[i++];
3234 block[idx + off] = value * scale;
3236 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3238 if (!(subblkpat & (1 << (3 - j))) && !skip_block) {
3240 v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
3242 v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
3247 pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF;
3248 for (j = 0; j < 2; j++) {
3249 last = subblkpat & (1 << (1 - j));
3253 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3258 idx = v->zz_8x4[i++] + off;
3260 idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
3261 block[idx] = value * scale;
3263 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3265 if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
3267 v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off);
3269 v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off);
3274 pat = ~(subblkpat * 5) & 0xF;
3275 for (j = 0; j < 2; j++) {
3276 last = subblkpat & (1 << (1 - j));
3280 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3285 idx = v->zz_4x8[i++] + off;
3287 idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
3288 block[idx] = value * scale;
3290 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3292 if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
3294 v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off);
3296 v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
3302 *ttmb_out |= ttblk << (n * 4);
3306 /** @} */ // Macroblock group
3308 static const int size_table [6] = { 0, 2, 3, 4, 5, 8 };
3309 static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3311 static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
3313 MpegEncContext *s = &v->s;
3314 int mb_cbp = v->cbp[s->mb_x - s->mb_stride],
3315 block_cbp = mb_cbp >> (block_num * 4), bottom_cbp,
3316 mb_is_intra = v->is_intra[s->mb_x - s->mb_stride],
3317 block_is_intra = mb_is_intra >> (block_num * 4), bottom_is_intra;
3318 int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
3321 if (block_num > 3) {
3322 dst = s->dest[block_num - 3];
3324 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
3326 if (s->mb_y != s->end_mb_y || block_num < 2) {
3330 if (block_num > 3) {
3331 bottom_cbp = v->cbp[s->mb_x] >> (block_num * 4);
3332 bottom_is_intra = v->is_intra[s->mb_x] >> (block_num * 4);
3333 mv = &v->luma_mv[s->mb_x - s->mb_stride];
3334 mv_stride = s->mb_stride;
3336 bottom_cbp = (block_num < 2) ? (mb_cbp >> ((block_num + 2) * 4))
3337 : (v->cbp[s->mb_x] >> ((block_num - 2) * 4));
3338 bottom_is_intra = (block_num < 2) ? (mb_is_intra >> ((block_num + 2) * 4))
3339 : (v->is_intra[s->mb_x] >> ((block_num - 2) * 4));
3340 mv_stride = s->b8_stride;
3341 mv = &s->current_picture.f.motion_val[0][s->block_index[block_num] - 2 * mv_stride];
3344 if (bottom_is_intra & 1 || block_is_intra & 1 ||
3345 mv[0][0] != mv[mv_stride][0] || mv[0][1] != mv[mv_stride][1]) {
3346 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3348 idx = ((bottom_cbp >> 2) | block_cbp) & 3;
3350 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3353 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3355 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
3360 dst -= 4 * linesize;
3361 ttblk = (v->ttblk[s->mb_x - s->mb_stride] >> (block_num * 4)) & 0xF;
3362 if (ttblk == TT_4X4 || ttblk == TT_8X4) {
3363 idx = (block_cbp | (block_cbp >> 2)) & 3;
3365 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3368 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3370 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
3375 static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
3377 MpegEncContext *s = &v->s;
3378 int mb_cbp = v->cbp[s->mb_x - 1 - s->mb_stride],
3379 block_cbp = mb_cbp >> (block_num * 4), right_cbp,
3380 mb_is_intra = v->is_intra[s->mb_x - 1 - s->mb_stride],
3381 block_is_intra = mb_is_intra >> (block_num * 4), right_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] - 8 * linesize;
3388 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
3391 if (s->mb_x != s->mb_width || !(block_num & 5)) {
3394 if (block_num > 3) {
3395 right_cbp = v->cbp[s->mb_x - s->mb_stride] >> (block_num * 4);
3396 right_is_intra = v->is_intra[s->mb_x - s->mb_stride] >> (block_num * 4);
3397 mv = &v->luma_mv[s->mb_x - s->mb_stride - 1];
3399 right_cbp = (block_num & 1) ? (v->cbp[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4))
3400 : (mb_cbp >> ((block_num + 1) * 4));
3401 right_is_intra = (block_num & 1) ? (v->is_intra[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4))
3402 : (mb_is_intra >> ((block_num + 1) * 4));
3403 mv = &s->current_picture.f.motion_val[0][s->block_index[block_num] - s->b8_stride * 2 - 2];
3405 if (block_is_intra & 1 || right_is_intra & 1 || mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1]) {
3406 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3408 idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
3410 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3413 v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize, linesize, v->pq);
3415 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
3421 ttblk = (v->ttblk[s->mb_x - s->mb_stride - 1] >> (block_num * 4)) & 0xf;
3422 if (ttblk == TT_4X4 || ttblk == TT_4X8) {
3423 idx = (block_cbp | (block_cbp >> 1)) & 5;
3425 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3428 v->vc1dsp.vc1_h_loop_filter4(dst + linesize * 4, linesize, v->pq);
3430 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
3435 static void vc1_apply_p_loop_filter(VC1Context *v)
3437 MpegEncContext *s = &v->s;
3440 for (i = 0; i < 6; i++) {
3441 vc1_apply_p_v_loop_filter(v, i);
3444 /* V always precedes H, therefore we run H one MB before V;
3445 * at the end of a row, we catch up to complete the row */
3447 for (i = 0; i < 6; i++) {
3448 vc1_apply_p_h_loop_filter(v, i);
3450 if (s->mb_x == s->mb_width - 1) {
3452 ff_update_block_index(s);
3453 for (i = 0; i < 6; i++) {
3454 vc1_apply_p_h_loop_filter(v, i);
3460 /** Decode one P-frame MB
3462 static int vc1_decode_p_mb(VC1Context *v)
3464 MpegEncContext *s = &v->s;
3465 GetBitContext *gb = &s->gb;
3467 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3468 int cbp; /* cbp decoding stuff */
3469 int mqdiff, mquant; /* MB quantization */
3470 int ttmb = v->ttfrm; /* MB Transform type */
3472 int mb_has_coeffs = 1; /* last_flag */
3473 int dmv_x, dmv_y; /* Differential MV components */
3474 int index, index1; /* LUT indexes */
3475 int val, sign; /* temp values */
3476 int first_block = 1;
3478 int skipped, fourmv;
3479 int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
3481 mquant = v->pq; /* lossy initialization */
3483 if (v->mv_type_is_raw)
3484 fourmv = get_bits1(gb);
3486 fourmv = v->mv_type_mb_plane[mb_pos];
3488 skipped = get_bits1(gb);
3490 skipped = v->s.mbskip_table[mb_pos];
3492 if (!fourmv) { /* 1MV mode */
3494 GET_MVDATA(dmv_x, dmv_y);
3497 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
3498 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
3500 s->current_picture.f.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
3501 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3503 /* FIXME Set DC val for inter block ? */
3504 if (s->mb_intra && !mb_has_coeffs) {
3506 s->ac_pred = get_bits1(gb);
3508 } else if (mb_has_coeffs) {
3510 s->ac_pred = get_bits1(gb);
3511 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3517 s->current_picture.f.qscale_table[mb_pos] = mquant;
3519 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3520 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
3521 VC1_TTMB_VLC_BITS, 2);
3522 if (!s->mb_intra) vc1_mc_1mv(v, 0);
3524 for (i = 0; i < 6; i++) {
3525 s->dc_val[0][s->block_index[i]] = 0;
3527 val = ((cbp >> (5 - i)) & 1);
3528 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3529 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3531 /* check if prediction blocks A and C are available */
3532 v->a_avail = v->c_avail = 0;
3533 if (i == 2 || i == 3 || !s->first_slice_line)
3534 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3535 if (i == 1 || i == 3 || s->mb_x)
3536 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3538 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
3539 (i & 4) ? v->codingset2 : v->codingset);
3540 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
3542 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3544 for (j = 0; j < 64; j++)
3545 s->block[i][j] <<= 1;
3546 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3547 if (v->pq >= 9 && v->overlap) {
3549 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3551 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3553 block_cbp |= 0xF << (i << 2);
3554 block_intra |= 1 << i;
3556 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block,
3557 s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
3558 (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3559 block_cbp |= pat << (i << 2);
3560 if (!v->ttmbf && ttmb < 8)
3567 for (i = 0; i < 6; i++) {
3568 v->mb_type[0][s->block_index[i]] = 0;
3569 s->dc_val[0][s->block_index[i]] = 0;
3571 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_SKIP;
3572 s->current_picture.f.qscale_table[mb_pos] = 0;
3573 vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3576 } else { // 4MV mode
3577 if (!skipped /* unskipped MB */) {
3578 int intra_count = 0, coded_inter = 0;
3579 int is_intra[6], is_coded[6];
3581 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3582 for (i = 0; i < 6; i++) {
3583 val = ((cbp >> (5 - i)) & 1);
3584 s->dc_val[0][s->block_index[i]] = 0;
3591 GET_MVDATA(dmv_x, dmv_y);
3593 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3595 vc1_mc_4mv_luma(v, i, 0);
3596 intra_count += s->mb_intra;
3597 is_intra[i] = s->mb_intra;
3598 is_coded[i] = mb_has_coeffs;
3601 is_intra[i] = (intra_count >= 3);
3605 vc1_mc_4mv_chroma(v, 0);
3606 v->mb_type[0][s->block_index[i]] = is_intra[i];
3608 coded_inter = !is_intra[i] & is_coded[i];
3610 // if there are no coded blocks then don't do anything more
3612 if (!intra_count && !coded_inter)
3615 s->current_picture.f.qscale_table[mb_pos] = mquant;
3616 /* test if block is intra and has pred */
3619 for (i = 0; i < 6; i++)
3621 if (((!s->first_slice_line || (i == 2 || i == 3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
3622 || ((s->mb_x || (i == 1 || i == 3)) && v->mb_type[0][s->block_index[i] - 1])) {
3628 s->ac_pred = get_bits1(gb);
3632 if (!v->ttmbf && coded_inter)
3633 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3634 for (i = 0; i < 6; i++) {
3636 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3637 s->mb_intra = is_intra[i];
3639 /* check if prediction blocks A and C are available */
3640 v->a_avail = v->c_avail = 0;
3641 if (i == 2 || i == 3 || !s->first_slice_line)
3642 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3643 if (i == 1 || i == 3 || s->mb_x)
3644 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3646 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant,
3647 (i & 4) ? v->codingset2 : v->codingset);
3648 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
3650 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3652 for (j = 0; j < 64; j++)
3653 s->block[i][j] <<= 1;
3654 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off,
3655 (i & 4) ? s->uvlinesize : s->linesize);
3656 if (v->pq >= 9 && v->overlap) {
3658 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3660 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3662 block_cbp |= 0xF << (i << 2);
3663 block_intra |= 1 << i;
3664 } else if (is_coded[i]) {
3665 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
3666 first_block, s->dest[dst_idx] + off,
3667 (i & 4) ? s->uvlinesize : s->linesize,
3668 (i & 4) && (s->flags & CODEC_FLAG_GRAY),
3670 block_cbp |= pat << (i << 2);
3671 if (!v->ttmbf && ttmb < 8)
3676 } else { // skipped MB
3678 s->current_picture.f.qscale_table[mb_pos] = 0;
3679 for (i = 0; i < 6; i++) {
3680 v->mb_type[0][s->block_index[i]] = 0;
3681 s->dc_val[0][s->block_index[i]] = 0;
3683 for (i = 0; i < 4; i++) {
3684 vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3685 vc1_mc_4mv_luma(v, i, 0);
3687 vc1_mc_4mv_chroma(v, 0);
3688 s->current_picture.f.qscale_table[mb_pos] = 0;
3692 v->cbp[s->mb_x] = block_cbp;
3693 v->ttblk[s->mb_x] = block_tt;
3694 v->is_intra[s->mb_x] = block_intra;
3699 /* Decode one macroblock in an interlaced frame p picture */
3701 static int vc1_decode_p_mb_intfr(VC1Context *v)
3703 MpegEncContext *s = &v->s;
3704 GetBitContext *gb = &s->gb;
3706 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3707 int cbp = 0; /* cbp decoding stuff */
3708 int mqdiff, mquant; /* MB quantization */
3709 int ttmb = v->ttfrm; /* MB Transform type */
3711 int mb_has_coeffs = 1; /* last_flag */
3712 int dmv_x, dmv_y; /* Differential MV components */
3713 int val; /* temp value */
3714 int first_block = 1;
3716 int skipped, fourmv = 0, twomv = 0;
3717 int block_cbp = 0, pat, block_tt = 0;
3718 int idx_mbmode = 0, mvbp;
3719 int stride_y, fieldtx;
3721 mquant = v->pq; /* Lossy initialization */
3724 skipped = get_bits1(gb);
3726 skipped = v->s.mbskip_table[mb_pos];
3728 if (v->fourmvswitch)
3729 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done
3731 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line
3732 switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
3733 /* store the motion vector type in a flag (useful later) */
3734 case MV_PMODE_INTFR_4MV:
3736 v->blk_mv_type[s->block_index[0]] = 0;
3737 v->blk_mv_type[s->block_index[1]] = 0;
3738 v->blk_mv_type[s->block_index[2]] = 0;
3739 v->blk_mv_type[s->block_index[3]] = 0;
3741 case MV_PMODE_INTFR_4MV_FIELD:
3743 v->blk_mv_type[s->block_index[0]] = 1;
3744 v->blk_mv_type[s->block_index[1]] = 1;
3745 v->blk_mv_type[s->block_index[2]] = 1;
3746 v->blk_mv_type[s->block_index[3]] = 1;
3748 case MV_PMODE_INTFR_2MV_FIELD:
3750 v->blk_mv_type[s->block_index[0]] = 1;
3751 v->blk_mv_type[s->block_index[1]] = 1;
3752 v->blk_mv_type[s->block_index[2]] = 1;
3753 v->blk_mv_type[s->block_index[3]] = 1;
3755 case MV_PMODE_INTFR_1MV:
3756 v->blk_mv_type[s->block_index[0]] = 0;
3757 v->blk_mv_type[s->block_index[1]] = 0;
3758 v->blk_mv_type[s->block_index[2]] = 0;
3759 v->blk_mv_type[s->block_index[3]] = 0;
3762 if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
3763 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
3764 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
3765 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_INTRA;
3766 s->mb_intra = v->is_intra[s->mb_x] = 1;
3767 for (i = 0; i < 6; i++)
3768 v->mb_type[0][s->block_index[i]] = 1;
3769 fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
3770 mb_has_coeffs = get_bits1(gb);
3772 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3773 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
3775 s->current_picture.f.qscale_table[mb_pos] = mquant;
3776 /* Set DC scale - y and c use the same (not sure if necessary here) */
3777 s->y_dc_scale = s->y_dc_scale_table[mquant];
3778 s->c_dc_scale = s->c_dc_scale_table[mquant];
3780 for (i = 0; i < 6; i++) {
3781 s->dc_val[0][s->block_index[i]] = 0;
3783 val = ((cbp >> (5 - i)) & 1);
3784 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3785 v->a_avail = v->c_avail = 0;
3786 if (i == 2 || i == 3 || !s->first_slice_line)
3787 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3788 if (i == 1 || i == 3 || s->mb_x)
3789 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3791 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
3792 (i & 4) ? v->codingset2 : v->codingset);
3793 if ((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3794 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3796 stride_y = s->linesize << fieldtx;
3797 off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
3799 stride_y = s->uvlinesize;
3802 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
3806 } else { // inter MB
3807 mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
3809 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3810 if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
3811 v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
3813 if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV)
3814 || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) {
3815 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
3818 s->mb_intra = v->is_intra[s->mb_x] = 0;
3819 for (i = 0; i < 6; i++)
3820 v->mb_type[0][s->block_index[i]] = 0;
3821 fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1];
3822 /* for all motion vector read MVDATA and motion compensate each block */
3826 for (i = 0; i < 6; i++) {
3829 val = ((mvbp >> (3 - i)) & 1);
3831 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3833 vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
3834 vc1_mc_4mv_luma(v, i, 0);
3835 } else if (i == 4) {
3836 vc1_mc_4mv_chroma4(v);
3843 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3845 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0]);
3846 vc1_mc_4mv_luma(v, 0, 0);
3847 vc1_mc_4mv_luma(v, 1, 0);
3850 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3852 vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0]);
3853 vc1_mc_4mv_luma(v, 2, 0);
3854 vc1_mc_4mv_luma(v, 3, 0);
3855 vc1_mc_4mv_chroma4(v);
3857 mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
3860 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3862 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
3866 GET_MQUANT(); // p. 227
3867 s->current_picture.f.qscale_table[mb_pos] = mquant;
3868 if (!v->ttmbf && cbp)
3869 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3870 for (i = 0; i < 6; i++) {
3871 s->dc_val[0][s->block_index[i]] = 0;
3873 val = ((cbp >> (5 - i)) & 1);
3875 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3877 off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
3879 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
3880 first_block, s->dest[dst_idx] + off,
3881 (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
3882 (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3883 block_cbp |= pat << (i << 2);
3884 if (!v->ttmbf && ttmb < 8)
3891 s->mb_intra = v->is_intra[s->mb_x] = 0;
3892 for (i = 0; i < 6; i++) {
3893 v->mb_type[0][s->block_index[i]] = 0;
3894 s->dc_val[0][s->block_index[i]] = 0;
3896 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_SKIP;
3897 s->current_picture.f.qscale_table[mb_pos] = 0;
3898 v->blk_mv_type[s->block_index[0]] = 0;
3899 v->blk_mv_type[s->block_index[1]] = 0;
3900 v->blk_mv_type[s->block_index[2]] = 0;
3901 v->blk_mv_type[s->block_index[3]] = 0;
3902 vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
3905 if (s->mb_x == s->mb_width - 1)
3906 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
3910 static int vc1_decode_p_mb_intfi(VC1Context *v)
3912 MpegEncContext *s = &v->s;
3913 GetBitContext *gb = &s->gb;
3915 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3916 int cbp = 0; /* cbp decoding stuff */
3917 int mqdiff, mquant; /* MB quantization */
3918 int ttmb = v->ttfrm; /* MB Transform type */
3920 int mb_has_coeffs = 1; /* last_flag */
3921 int dmv_x, dmv_y; /* Differential MV components */
3922 int val; /* temp values */
3923 int first_block = 1;
3926 int block_cbp = 0, pat, block_tt = 0;
3929 mquant = v->pq; /* Lossy initialization */
3931 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
3932 if (idx_mbmode <= 1) { // intra MB
3933 s->mb_intra = v->is_intra[s->mb_x] = 1;
3934 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
3935 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
3936 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
3938 s->current_picture.f.qscale_table[mb_pos] = mquant;
3939 /* Set DC scale - y and c use the same (not sure if necessary here) */
3940 s->y_dc_scale = s->y_dc_scale_table[mquant];
3941 s->c_dc_scale = s->c_dc_scale_table[mquant];
3942 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
3943 mb_has_coeffs = idx_mbmode & 1;
3945 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
3947 for (i = 0; i < 6; i++) {
3948 s->dc_val[0][s->block_index[i]] = 0;
3949 v->mb_type[0][s->block_index[i]] = 1;
3951 val = ((cbp >> (5 - i)) & 1);
3952 v->a_avail = v->c_avail = 0;
3953 if (i == 2 || i == 3 || !s->first_slice_line)
3954 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3955 if (i == 1 || i == 3 || s->mb_x)
3956 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3958 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
3959 (i & 4) ? v->codingset2 : v->codingset);
3960 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
3962 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3963 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3964 off += v->second_field ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
3965 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
3966 // TODO: loop filter
3969 s->mb_intra = v->is_intra[s->mb_x] = 0;
3970 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
3971 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
3972 if (idx_mbmode <= 5) { // 1-MV
3973 dmv_x = dmv_y = pred_flag = 0;
3974 if (idx_mbmode & 1) {
3975 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
3977 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
3979 mb_has_coeffs = !(idx_mbmode & 2);
3981 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
3982 for (i = 0; i < 6; i++) {
3984 dmv_x = dmv_y = pred_flag = 0;
3985 val = ((v->fourmvbp >> (3 - i)) & 1);
3987 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
3989 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
3990 vc1_mc_4mv_luma(v, i, 0);
3992 vc1_mc_4mv_chroma(v, 0);
3994 mb_has_coeffs = idx_mbmode & 1;
3997 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4001 s->current_picture.f.qscale_table[mb_pos] = mquant;
4002 if (!v->ttmbf && cbp) {
4003 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4006 for (i = 0; i < 6; i++) {
4007 s->dc_val[0][s->block_index[i]] = 0;
4009 val = ((cbp >> (5 - i)) & 1);
4010 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
4011 if (v->second_field)
4012 off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
4014 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4015 first_block, s->dest[dst_idx] + off,
4016 (i & 4) ? s->uvlinesize : s->linesize,
4017 (i & 4) && (s->flags & CODEC_FLAG_GRAY),
4019 block_cbp |= pat << (i << 2);
4020 if (!v->ttmbf && ttmb < 8) ttmb = -1;
4025 if (s->mb_x == s->mb_width - 1)
4026 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
4030 /** Decode one B-frame MB (in Main profile)
4032 static void vc1_decode_b_mb(VC1Context *v)
4034 MpegEncContext *s = &v->s;
4035 GetBitContext *gb = &s->gb;
4037 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4038 int cbp = 0; /* cbp decoding stuff */
4039 int mqdiff, mquant; /* MB quantization */
4040 int ttmb = v->ttfrm; /* MB Transform type */
4041 int mb_has_coeffs = 0; /* last_flag */
4042 int index, index1; /* LUT indexes */
4043 int val, sign; /* temp values */
4044 int first_block = 1;
4046 int skipped, direct;
4047 int dmv_x[2], dmv_y[2];
4048 int bmvtype = BMV_TYPE_BACKWARD;
4050 mquant = v->pq; /* lossy initialization */
4054 direct = get_bits1(gb);
4056 direct = v->direct_mb_plane[mb_pos];
4058 skipped = get_bits1(gb);
4060 skipped = v->s.mbskip_table[mb_pos];
4062 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4063 for (i = 0; i < 6; i++) {
4064 v->mb_type[0][s->block_index[i]] = 0;
4065 s->dc_val[0][s->block_index[i]] = 0;
4067 s->current_picture.f.qscale_table[mb_pos] = 0;
4071 GET_MVDATA(dmv_x[0], dmv_y[0]);
4072 dmv_x[1] = dmv_x[0];
4073 dmv_y[1] = dmv_y[0];
4075 if (skipped || !s->mb_intra) {
4076 bmvtype = decode012(gb);
4079 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
4082 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
4085 bmvtype = BMV_TYPE_INTERPOLATED;
4086 dmv_x[0] = dmv_y[0] = 0;
4090 for (i = 0; i < 6; i++)
4091 v->mb_type[0][s->block_index[i]] = s->mb_intra;
4095 bmvtype = BMV_TYPE_INTERPOLATED;
4096 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4097 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4101 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4104 s->current_picture.f.qscale_table[mb_pos] = mquant;
4106 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4107 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
4108 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4109 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4111 if (!mb_has_coeffs && !s->mb_intra) {
4112 /* no coded blocks - effectively skipped */
4113 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4114 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4117 if (s->mb_intra && !mb_has_coeffs) {
4119 s->current_picture.f.qscale_table[mb_pos] = mquant;
4120 s->ac_pred = get_bits1(gb);
4122 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4124 if (bmvtype == BMV_TYPE_INTERPOLATED) {
4125 GET_MVDATA(dmv_x[0], dmv_y[0]);
4126 if (!mb_has_coeffs) {
4127 /* interpolated skipped block */
4128 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4129 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4133 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4135 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4138 s->ac_pred = get_bits1(gb);
4139 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4141 s->current_picture.f.qscale_table[mb_pos] = mquant;
4142 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
4143 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4147 for (i = 0; i < 6; i++) {
4148 s->dc_val[0][s->block_index[i]] = 0;
4150 val = ((cbp >> (5 - i)) & 1);
4151 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4152 v->mb_type[0][s->block_index[i]] = s->mb_intra;
4154 /* check if prediction blocks A and C are available */
4155 v->a_avail = v->c_avail = 0;
4156 if (i == 2 || i == 3 || !s->first_slice_line)
4157 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4158 if (i == 1 || i == 3 || s->mb_x)
4159 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4161 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
4162 (i & 4) ? v->codingset2 : v->codingset);
4163 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
4165 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4167 for (j = 0; j < 64; j++)
4168 s->block[i][j] <<= 1;
4169 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
4171 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4172 first_block, s->dest[dst_idx] + off,
4173 (i & 4) ? s->uvlinesize : s->linesize,
4174 (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
4175 if (!v->ttmbf && ttmb < 8)
4182 /** Decode one B-frame MB (in interlaced field B picture)
4184 static void vc1_decode_b_mb_intfi(VC1Context *v)
4186 MpegEncContext *s = &v->s;
4187 GetBitContext *gb = &s->gb;
4189 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4190 int cbp = 0; /* cbp decoding stuff */
4191 int mqdiff, mquant; /* MB quantization */
4192 int ttmb = v->ttfrm; /* MB Transform type */
4193 int mb_has_coeffs = 0; /* last_flag */
4194 int val; /* temp value */
4195 int first_block = 1;
4198 int dmv_x[2], dmv_y[2], pred_flag[2];
4199 int bmvtype = BMV_TYPE_BACKWARD;
4200 int idx_mbmode, interpmvp;
4202 mquant = v->pq; /* Lossy initialization */
4205 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
4206 if (idx_mbmode <= 1) { // intra MB
4207 s->mb_intra = v->is_intra[s->mb_x] = 1;
4208 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
4209 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
4210 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
4212 s->current_picture.f.qscale_table[mb_pos] = mquant;
4213 /* Set DC scale - y and c use the same (not sure if necessary here) */
4214 s->y_dc_scale = s->y_dc_scale_table[mquant];
4215 s->c_dc_scale = s->c_dc_scale_table[mquant];
4216 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
4217 mb_has_coeffs = idx_mbmode & 1;
4219 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
4221 for (i = 0; i < 6; i++) {
4222 s->dc_val[0][s->block_index[i]] = 0;
4224 val = ((cbp >> (5 - i)) & 1);
4225 v->mb_type[0][s->block_index[i]] = s->mb_intra;
4226 v->a_avail = v->c_avail = 0;
4227 if (i == 2 || i == 3 || !s->first_slice_line)
4228 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4229 if (i == 1 || i == 3 || s->mb_x)
4230 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4232 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
4233 (i & 4) ? v->codingset2 : v->codingset);
4234 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
4236 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4238 for (j = 0; j < 64; j++)
4239 s->block[i][j] <<= 1;
4240 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4241 off += v->second_field ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
4242 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4243 // TODO: yet to perform loop filter
4246 s->mb_intra = v->is_intra[s->mb_x] = 0;
4247 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
4248 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
4250 fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
4252 fwd = v->forward_mb_plane[mb_pos];
4253 if (idx_mbmode <= 5) { // 1-MV
4254 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4255 pred_flag[0] = pred_flag[1] = 0;
4257 bmvtype = BMV_TYPE_FORWARD;
4259 bmvtype = decode012(gb);
4262 bmvtype = BMV_TYPE_BACKWARD;
4265 bmvtype = BMV_TYPE_DIRECT;
4268 bmvtype = BMV_TYPE_INTERPOLATED;
4269 interpmvp = get_bits1(gb);
4272 v->bmvtype = bmvtype;
4273 if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) {
4274 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
4276 if (bmvtype == BMV_TYPE_INTERPOLATED && interpmvp) {
4277 get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
4279 if (bmvtype == BMV_TYPE_DIRECT) {
4280 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
4281 dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
4283 vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
4284 vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype);
4285 mb_has_coeffs = !(idx_mbmode & 2);
4288 bmvtype = BMV_TYPE_FORWARD;
4289 v->bmvtype = bmvtype;
4290 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4291 for (i = 0; i < 6; i++) {
4293 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
4294 dmv_x[1] = dmv_y[1] = pred_flag[1] = 0;
4295 val = ((v->fourmvbp >> (3 - i)) & 1);
4297 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD],
4298 &dmv_y[bmvtype == BMV_TYPE_BACKWARD],
4299 &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
4301 vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag);
4302 vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD);
4304 vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
4306 mb_has_coeffs = idx_mbmode & 1;
4309 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4313 s->current_picture.f.qscale_table[mb_pos] = mquant;
4314 if (!v->ttmbf && cbp) {
4315 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4318 for (i = 0; i < 6; i++) {
4319 s->dc_val[0][s->block_index[i]] = 0;
4321 val = ((cbp >> (5 - i)) & 1);
4322 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
4323 if (v->second_field)
4324 off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
4326 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
4327 first_block, s->dest[dst_idx] + off,
4328 (i & 4) ? s->uvlinesize : s->linesize,
4329 (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
4330 if (!v->ttmbf && ttmb < 8)
4338 /** Decode blocks of I-frame
4340 static void vc1_decode_i_blocks(VC1Context *v)
4343 MpegEncContext *s = &v->s;
4348 /* select codingmode used for VLC tables selection */
4349 switch (v->y_ac_table_index) {
4351 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4354 v->codingset = CS_HIGH_MOT_INTRA;
4357 v->codingset = CS_MID_RATE_INTRA;
4361 switch (v->c_ac_table_index) {
4363 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4366 v->codingset2 = CS_HIGH_MOT_INTER;
4369 v->codingset2 = CS_MID_RATE_INTER;
4373 /* Set DC scale - y and c use the same */
4374 s->y_dc_scale = s->y_dc_scale_table[v->pq];
4375 s->c_dc_scale = s->c_dc_scale_table[v->pq];
4378 s->mb_x = s->mb_y = 0;
4380 s->first_slice_line = 1;
4381 for (s->mb_y = 0; s->mb_y < s->end_mb_y; s->mb_y++) {
4383 ff_init_block_index(s);
4384 for (; s->mb_x < v->end_mb_x; s->mb_x++) {
4386 ff_update_block_index(s);
4387 dst[0] = s->dest[0];
4388 dst[1] = dst[0] + 8;
4389 dst[2] = s->dest[0] + s->linesize * 8;
4390 dst[3] = dst[2] + 8;
4391 dst[4] = s->dest[1];
4392 dst[5] = s->dest[2];
4393 s->dsp.clear_blocks(s->block[0]);
4394 mb_pos = s->mb_x + s->mb_y * s->mb_width;
4395 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_INTRA;
4396 s->current_picture.f.qscale_table[mb_pos] = v->pq;
4397 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
4398 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
4400 // do actual MB decoding and displaying
4401 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
4402 v->s.ac_pred = get_bits1(&v->s.gb);
4404 for (k = 0; k < 6; k++) {
4405 val = ((cbp >> (5 - k)) & 1);
4408 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
4412 cbp |= val << (5 - k);
4414 vc1_decode_i_block(v, s->block[k], k, val, (k < 4) ? v->codingset : v->codingset2);
4416 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
4418 v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
4419 if (v->pq >= 9 && v->overlap) {
4421 for (j = 0; j < 64; j++)
4422 s->block[k][j] <<= 1;
4423 s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4426 for (j = 0; j < 64; j++)
4427 s->block[k][j] = (s->block[k][j] - 64) << 1;
4428 s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4432 if (v->pq >= 9 && v->overlap) {
4434 v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
4435 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4436 if (!(s->flags & CODEC_FLAG_GRAY)) {
4437 v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
4438 v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
4441 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
4442 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
4443 if (!s->first_slice_line) {
4444 v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
4445 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
4446 if (!(s->flags & CODEC_FLAG_GRAY)) {
4447 v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
4448 v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
4451 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4452 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
4454 if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
4456 if (get_bits_count(&s->gb) > v->bits) {
4457 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR);
4458 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
4459 get_bits_count(&s->gb), v->bits);
4463 if (!v->s.loop_filter)
4464 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4466 ff_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
4468 s->first_slice_line = 0;
4470 if (v->s.loop_filter)
4471 ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
4473 /* This is intentionally mb_height and not end_mb_y - unlike in advanced
4474 * profile, these only differ are when decoding MSS2 rectangles. */
4475 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
4478 /** Decode blocks of I-frame for advanced profile
4480 static void vc1_decode_i_blocks_adv(VC1Context *v)
4483 MpegEncContext *s = &v->s;
4489 GetBitContext *gb = &s->gb;
4491 /* select codingmode used for VLC tables selection */
4492 switch (v->y_ac_table_index) {
4494 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4497 v->codingset = CS_HIGH_MOT_INTRA;
4500 v->codingset = CS_MID_RATE_INTRA;
4504 switch (v->c_ac_table_index) {
4506 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4509 v->codingset2 = CS_HIGH_MOT_INTER;
4512 v->codingset2 = CS_MID_RATE_INTER;
4517 s->mb_x = s->mb_y = 0;
4519 s->first_slice_line = 1;
4520 s->mb_y = s->start_mb_y;
4521 if (s->start_mb_y) {
4523 ff_init_block_index(s);
4524 memset(&s->coded_block[s->block_index[0] - s->b8_stride], 0,
4525 (1 + s->b8_stride) * sizeof(*s->coded_block));
4527 for (; s->mb_y < s->end_mb_y; s->mb_y++) {
4529 ff_init_block_index(s);
4530 for (;s->mb_x < s->mb_width; s->mb_x++) {
4531 int16_t (*block)[64] = v->block[v->cur_blk_idx];
4532 ff_update_block_index(s);
4533 s->dsp.clear_blocks(block[0]);
4534 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4535 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
4536 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
4537 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
4539 // do actual MB decoding and displaying
4540 if (v->fieldtx_is_raw)
4541 v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
4542 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
4543 if ( v->acpred_is_raw)
4544 v->s.ac_pred = get_bits1(&v->s.gb);
4546 v->s.ac_pred = v->acpred_plane[mb_pos];
4548 if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
4549 v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
4553 s->current_picture.f.qscale_table[mb_pos] = mquant;
4554 /* Set DC scale - y and c use the same */
4555 s->y_dc_scale = s->y_dc_scale_table[mquant];
4556 s->c_dc_scale = s->c_dc_scale_table[mquant];
4558 for (k = 0; k < 6; k++) {
4559 val = ((cbp >> (5 - k)) & 1);
4562 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
4566 cbp |= val << (5 - k);
4568 v->a_avail = !s->first_slice_line || (k == 2 || k == 3);
4569 v->c_avail = !!s->mb_x || (k == 1 || k == 3);
4571 vc1_decode_i_block_adv(v, block[k], k, val,
4572 (k < 4) ? v->codingset : v->codingset2, mquant);
4574 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
4576 v->vc1dsp.vc1_inv_trans_8x8(block[k]);
4579 vc1_smooth_overlap_filter_iblk(v);
4580 vc1_put_signed_blocks_clamped(v);
4581 if (v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
4583 if (get_bits_count(&s->gb) > v->bits) {
4584 // TODO: may need modification to handle slice coding
4585 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
4586 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
4587 get_bits_count(&s->gb), v->bits);
4591 if (!v->s.loop_filter)
4592 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4594 ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
4595 s->first_slice_line = 0;
4598 /* raw bottom MB row */
4600 ff_init_block_index(s);
4601 for (;s->mb_x < s->mb_width; s->mb_x++) {
4602 ff_update_block_index(s);
4603 vc1_put_signed_blocks_clamped(v);
4604 if (v->s.loop_filter)
4605 vc1_loop_filter_iblk_delayed(v, v->pq);
4607 if (v->s.loop_filter)
4608 ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
4609 ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
4610 (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
4613 static void vc1_decode_p_blocks(VC1Context *v)
4615 MpegEncContext *s = &v->s;
4616 int apply_loop_filter;
4618 /* select codingmode used for VLC tables selection */
4619 switch (v->c_ac_table_index) {
4621 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4624 v->codingset = CS_HIGH_MOT_INTRA;
4627 v->codingset = CS_MID_RATE_INTRA;
4631 switch (v->c_ac_table_index) {
4633 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4636 v->codingset2 = CS_HIGH_MOT_INTER;
4639 v->codingset2 = CS_MID_RATE_INTER;
4643 apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
4644 s->first_slice_line = 1;
4645 memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
4646 for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4648 ff_init_block_index(s);
4649 for (; s->mb_x < s->mb_width; s->mb_x++) {
4650 ff_update_block_index(s);
4652 if (v->fcm == ILACE_FIELD)
4653 vc1_decode_p_mb_intfi(v);
4654 else if (v->fcm == ILACE_FRAME)
4655 vc1_decode_p_mb_intfr(v);
4656 else vc1_decode_p_mb(v);
4657 if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == PROGRESSIVE)
4658 vc1_apply_p_loop_filter(v);
4659 if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4660 // TODO: may need modification to handle slice coding
4661 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
4662 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
4663 get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
4667 memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0]) * s->mb_stride);
4668 memmove(v->ttblk_base, v->ttblk, sizeof(v->ttblk_base[0]) * s->mb_stride);
4669 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
4670 memmove(v->luma_mv_base, v->luma_mv, sizeof(v->luma_mv_base[0]) * s->mb_stride);
4671 if (s->mb_y != s->start_mb_y) ff_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
4672 s->first_slice_line = 0;
4674 if (apply_loop_filter && v->fcm == PROGRESSIVE) {
4676 ff_init_block_index(s);
4677 for (; s->mb_x < s->mb_width; s->mb_x++) {
4678 ff_update_block_index(s);
4679 vc1_apply_p_loop_filter(v);
4682 if (s->end_mb_y >= s->start_mb_y)
4683 ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
4684 ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
4685 (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
4688 static void vc1_decode_b_blocks(VC1Context *v)
4690 MpegEncContext *s = &v->s;
4692 /* select codingmode used for VLC tables selection */
4693 switch (v->c_ac_table_index) {
4695 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4698 v->codingset = CS_HIGH_MOT_INTRA;
4701 v->codingset = CS_MID_RATE_INTRA;
4705 switch (v->c_ac_table_index) {
4707 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4710 v->codingset2 = CS_HIGH_MOT_INTER;
4713 v->codingset2 = CS_MID_RATE_INTER;
4717 s->first_slice_line = 1;
4718 for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4720 ff_init_block_index(s);
4721 for (; s->mb_x < s->mb_width; s->mb_x++) {
4722 ff_update_block_index(s);
4724 if (v->fcm == ILACE_FIELD)
4725 vc1_decode_b_mb_intfi(v);
4728 if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4729 // TODO: may need modification to handle slice coding
4730 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
4731 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
4732 get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
4735 if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
4737 if (!v->s.loop_filter)
4738 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4740 ff_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
4741 s->first_slice_line = 0;
4743 if (v->s.loop_filter)
4744 ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
4745 ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
4746 (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
4749 static void vc1_decode_skip_blocks(VC1Context *v)
4751 MpegEncContext *s = &v->s;
4753 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, ER_MB_END);
4754 s->first_slice_line = 1;
4755 for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4757 ff_init_block_index(s);
4758 ff_update_block_index(s);
4759 if (s->last_picture.f.data[0]) {
4760 memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
4761 memcpy(s->dest[1], s->last_picture.f.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4762 memcpy(s->dest[2], s->last_picture.f.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4764 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4765 s->first_slice_line = 0;
4767 s->pict_type = AV_PICTURE_TYPE_P;
4770 void ff_vc1_decode_blocks(VC1Context *v)
4773 v->s.esc3_level_length = 0;
4775 ff_intrax8_decode_picture(&v->x8, 2*v->pq + v->halfpq, v->pq * !v->pquantizer);
4778 v->left_blk_idx = -1;
4779 v->topleft_blk_idx = 1;
4781 switch (v->s.pict_type) {
4782 case AV_PICTURE_TYPE_I:
4783 if (v->profile == PROFILE_ADVANCED)
4784 vc1_decode_i_blocks_adv(v);
4786 vc1_decode_i_blocks(v);
4788 case AV_PICTURE_TYPE_P:
4789 if (v->p_frame_skipped)
4790 vc1_decode_skip_blocks(v);
4792 vc1_decode_p_blocks(v);
4794 case AV_PICTURE_TYPE_B:
4796 if (v->profile == PROFILE_ADVANCED)
4797 vc1_decode_i_blocks_adv(v);
4799 vc1_decode_i_blocks(v);
4801 vc1_decode_b_blocks(v);
4807 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
4811 * Transform coefficients for both sprites in 16.16 fixed point format,
4812 * in the order they appear in the bitstream:
4814 * rotation 1 (unused)
4816 * rotation 2 (unused)
4823 int effect_type, effect_flag;
4824 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
4825 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
4828 static inline int get_fp_val(GetBitContext* gb)
4830 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
4833 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
4837 switch (get_bits(gb, 2)) {
4840 c[2] = get_fp_val(gb);
4844 c[0] = c[4] = get_fp_val(gb);
4845 c[2] = get_fp_val(gb);
4848 c[0] = get_fp_val(gb);
4849 c[2] = get_fp_val(gb);
4850 c[4] = get_fp_val(gb);
4853 c[0] = get_fp_val(gb);
4854 c[1] = get_fp_val(gb);
4855 c[2] = get_fp_val(gb);
4856 c[3] = get_fp_val(gb);
4857 c[4] = get_fp_val(gb);
4860 c[5] = get_fp_val(gb);
4862 c[6] = get_fp_val(gb);
4867 static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
4869 AVCodecContext *avctx = v->s.avctx;
4872 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
4873 vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
4874 if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
4875 av_log_ask_for_sample(avctx, "Rotation coefficients are not zero");
4876 av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
4877 for (i = 0; i < 7; i++)
4878 av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
4879 sd->coefs[sprite][i] / (1<<16),
4880 (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
4881 av_log(avctx, AV_LOG_DEBUG, "\n");
4885 if (sd->effect_type = get_bits_long(gb, 30)) {
4886 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
4888 vc1_sprite_parse_transform(gb, sd->effect_params1);
4891 vc1_sprite_parse_transform(gb, sd->effect_params1);
4892 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
4895 for (i = 0; i < sd->effect_pcount1; i++)
4896 sd->effect_params1[i] = get_fp_val(gb);
4898 if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
4899 // effect 13 is simple alpha blending and matches the opacity above
4900 av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
4901 for (i = 0; i < sd->effect_pcount1; i++)
4902 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
4903 sd->effect_params1[i] / (1 << 16),
4904 (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
4905 av_log(avctx, AV_LOG_DEBUG, "\n");
4908 sd->effect_pcount2 = get_bits(gb, 16);
4909 if (sd->effect_pcount2 > 10) {
4910 av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
4912 } else if (sd->effect_pcount2) {
4914 av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
4915 while (++i < sd->effect_pcount2) {
4916 sd->effect_params2[i] = get_fp_val(gb);
4917 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
4918 sd->effect_params2[i] / (1 << 16),
4919 (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
4921 av_log(avctx, AV_LOG_DEBUG, "\n");
4924 if (sd->effect_flag = get_bits1(gb))
4925 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
4927 if (get_bits_count(gb) >= gb->size_in_bits +
4928 (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0))
4929 av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
4930 if (get_bits_count(gb) < gb->size_in_bits - 8)
4931 av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
4934 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
4936 int i, plane, row, sprite;
4937 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
4938 uint8_t* src_h[2][2];
4939 int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
4941 MpegEncContext *s = &v->s;
4943 for (i = 0; i < 2; i++) {
4944 xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
4945 xadv[i] = sd->coefs[i][0];
4946 if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
4947 xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
4949 yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
4950 yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
4952 alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
4954 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
4955 int width = v->output_width>>!!plane;
4957 for (row = 0; row < v->output_height>>!!plane; row++) {
4958 uint8_t *dst = v->sprite_output_frame.data[plane] +
4959 v->sprite_output_frame.linesize[plane] * row;
4961 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
4962 uint8_t *iplane = s->current_picture.f.data[plane];
4963 int iline = s->current_picture.f.linesize[plane];
4964 int ycoord = yoff[sprite] + yadv[sprite] * row;
4965 int yline = ycoord >> 16;
4967 ysub[sprite] = ycoord & 0xFFFF;
4969 iplane = s->last_picture.f.data[plane];
4970 iline = s->last_picture.f.linesize[plane];
4972 next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
4973 if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
4974 src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
4976 src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
4978 if (sr_cache[sprite][0] != yline) {
4979 if (sr_cache[sprite][1] == yline) {
4980 FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
4981 FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
4983 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
4984 sr_cache[sprite][0] = yline;
4987 if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
4988 v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
4989 iplane + next_line, xoff[sprite],
4990 xadv[sprite], width);
4991 sr_cache[sprite][1] = yline + 1;
4993 src_h[sprite][0] = v->sr_rows[sprite][0];
4994 src_h[sprite][1] = v->sr_rows[sprite][1];
4998 if (!v->two_sprites) {
5000 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
5002 memcpy(dst, src_h[0][0], width);
5005 if (ysub[0] && ysub[1]) {
5006 v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
5007 src_h[1][0], src_h[1][1], ysub[1], alpha, width);
5008 } else if (ysub[0]) {
5009 v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
5010 src_h[1][0], alpha, width);
5011 } else if (ysub[1]) {
5012 v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
5013 src_h[0][0], (1<<16)-1-alpha, width);
5015 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
5021 for (i = 0; i < 2; i++) {
5031 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
5033 MpegEncContext *s = &v->s;
5034 AVCodecContext *avctx = s->avctx;
5037 vc1_parse_sprites(v, gb, &sd);
5039 if (!s->current_picture.f.data[0]) {
5040 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
5044 if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f.data[0])) {
5045 av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
5049 if (v->sprite_output_frame.data[0])
5050 avctx->release_buffer(avctx, &v->sprite_output_frame);
5052 v->sprite_output_frame.buffer_hints = FF_BUFFER_HINTS_VALID;
5053 v->sprite_output_frame.reference = 0;
5054 if (ff_get_buffer(avctx, &v->sprite_output_frame) < 0) {
5055 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
5059 vc1_draw_sprites(v, &sd);
5064 static void vc1_sprite_flush(AVCodecContext *avctx)
5066 VC1Context *v = avctx->priv_data;
5067 MpegEncContext *s = &v->s;
5068 AVFrame *f = &s->current_picture.f;
5071 /* Windows Media Image codecs have a convergence interval of two keyframes.
5072 Since we can't enforce it, clear to black the missing sprite. This is
5073 wrong but it looks better than doing nothing. */
5076 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++)
5077 for (i = 0; i < v->sprite_height>>!!plane; i++)
5078 memset(f->data[plane] + i * f->linesize[plane],
5079 plane ? 128 : 0, f->linesize[plane]);
5084 av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
5086 MpegEncContext *s = &v->s;
5089 /* Allocate mb bitplanes */
5090 v->mv_type_mb_plane = av_malloc (s->mb_stride * s->mb_height);
5091 v->direct_mb_plane = av_malloc (s->mb_stride * s->mb_height);
5092 v->forward_mb_plane = av_malloc (s->mb_stride * s->mb_height);
5093 v->fieldtx_plane = av_mallocz(s->mb_stride * s->mb_height);
5094 v->acpred_plane = av_malloc (s->mb_stride * s->mb_height);
5095 v->over_flags_plane = av_malloc (s->mb_stride * s->mb_height);
5097 v->n_allocated_blks = s->mb_width + 2;
5098 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
5099 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
5100 v->cbp = v->cbp_base + s->mb_stride;
5101 v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
5102 v->ttblk = v->ttblk_base + s->mb_stride;
5103 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
5104 v->is_intra = v->is_intra_base + s->mb_stride;
5105 v->luma_mv_base = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
5106 v->luma_mv = v->luma_mv_base + s->mb_stride;
5108 /* allocate block type info in that way so it could be used with s->block_index[] */
5109 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5110 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
5111 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
5112 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
5114 /* allocate memory to store block level MV info */
5115 v->blk_mv_type_base = av_mallocz( s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5116 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
5117 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5118 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
5119 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5120 v->mv_f_last_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5121 v->mv_f_last[0] = v->mv_f_last_base + s->b8_stride + 1;
5122 v->mv_f_last[1] = v->mv_f_last[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5123 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5124 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
5125 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);
5127 /* Init coded blocks info */
5128 if (v->profile == PROFILE_ADVANCED) {
5129 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
5131 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
5135 ff_intrax8_common_init(&v->x8,s);
5137 if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5138 for (i = 0; i < 4; i++)
5139 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width))) return -1;
5142 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
5143 !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
5150 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
5153 for (i = 0; i < 64; i++) {
5154 #define transpose(x) ((x >> 3) | ((x & 7) << 3))
5155 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
5156 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
5157 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
5158 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
5159 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
5165 /** Initialize a VC1/WMV3 decoder
5166 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5167 * @todo TODO: Decypher remaining bits in extra_data
5169 static av_cold int vc1_decode_init(AVCodecContext *avctx)
5171 VC1Context *v = avctx->priv_data;
5172 MpegEncContext *s = &v->s;
5175 /* save the container output size for WMImage */
5176 v->output_width = avctx->width;
5177 v->output_height = avctx->height;
5179 if (!avctx->extradata_size || !avctx->extradata)
5181 if (!(avctx->flags & CODEC_FLAG_GRAY))
5182 avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
5184 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
5185 avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
5187 avctx->flags |= CODEC_FLAG_EMU_EDGE;
5188 v->s.flags |= CODEC_FLAG_EMU_EDGE;
5190 if (ff_vc1_init_common(v) < 0)
5192 // ensure static VLC tables are initialized
5193 if (ff_msmpeg4_decode_init(avctx) < 0)
5195 if (ff_vc1_decode_init_alloc_tables(v) < 0)
5197 // Hack to ensure the above functions will be called
5198 // again once we know all necessary settings.
5199 // That this is necessary might indicate a bug.
5200 ff_vc1_decode_end(avctx);
5202 ff_h264chroma_init(&v->h264chroma, 8);
5203 ff_vc1dsp_init(&v->vc1dsp);
5205 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
5208 // looks like WMV3 has a sequence header stored in the extradata
5209 // advanced sequence header may be before the first frame
5210 // the last byte of the extradata is a version number, 1 for the
5211 // samples we can decode
5213 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
5215 if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0)
5218 count = avctx->extradata_size*8 - get_bits_count(&gb);
5220 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
5221 count, get_bits(&gb, count));
5222 } else if (count < 0) {
5223 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
5225 } else { // VC1/WVC1/WVP2
5226 const uint8_t *start = avctx->extradata;
5227 uint8_t *end = avctx->extradata + avctx->extradata_size;
5228 const uint8_t *next;
5229 int size, buf2_size;
5230 uint8_t *buf2 = NULL;
5231 int seq_initialized = 0, ep_initialized = 0;
5233 if (avctx->extradata_size < 16) {
5234 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
5238 buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
5239 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
5241 for (; next < end; start = next) {
5242 next = find_next_marker(start + 4, end);
5243 size = next - start - 4;
5246 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
5247 init_get_bits(&gb, buf2, buf2_size * 8);
5248 switch (AV_RB32(start)) {
5249 case VC1_CODE_SEQHDR:
5250 if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0) {
5254 seq_initialized = 1;
5256 case VC1_CODE_ENTRYPOINT:
5257 if (ff_vc1_decode_entry_point(avctx, v, &gb) < 0) {
5266 if (!seq_initialized || !ep_initialized) {
5267 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
5270 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
5273 avctx->profile = v->profile;
5274 if (v->profile == PROFILE_ADVANCED)
5275 avctx->level = v->level;
5277 avctx->has_b_frames = !!avctx->max_b_frames;
5279 s->mb_width = (avctx->coded_width + 15) >> 4;
5280 s->mb_height = (avctx->coded_height + 15) >> 4;
5282 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
5283 ff_vc1_init_transposed_scantables(v);
5285 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
5290 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5291 v->sprite_width = avctx->coded_width;
5292 v->sprite_height = avctx->coded_height;
5294 avctx->coded_width = avctx->width = v->output_width;
5295 avctx->coded_height = avctx->height = v->output_height;
5297 // prevent 16.16 overflows
5298 if (v->sprite_width > 1 << 14 ||
5299 v->sprite_height > 1 << 14 ||
5300 v->output_width > 1 << 14 ||
5301 v->output_height > 1 << 14) return -1;
5306 /** Close a VC1/WMV3 decoder
5307 * @warning Initial try at using MpegEncContext stuff
5309 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
5311 VC1Context *v = avctx->priv_data;
5314 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5315 && v->sprite_output_frame.data[0])
5316 avctx->release_buffer(avctx, &v->sprite_output_frame);
5317 for (i = 0; i < 4; i++)
5318 av_freep(&v->sr_rows[i >> 1][i & 1]);
5319 av_freep(&v->hrd_rate);
5320 av_freep(&v->hrd_buffer);
5321 ff_MPV_common_end(&v->s);
5322 av_freep(&v->mv_type_mb_plane);
5323 av_freep(&v->direct_mb_plane);
5324 av_freep(&v->forward_mb_plane);
5325 av_freep(&v->fieldtx_plane);
5326 av_freep(&v->acpred_plane);
5327 av_freep(&v->over_flags_plane);
5328 av_freep(&v->mb_type_base);
5329 av_freep(&v->blk_mv_type_base);
5330 av_freep(&v->mv_f_base);
5331 av_freep(&v->mv_f_last_base);
5332 av_freep(&v->mv_f_next_base);
5333 av_freep(&v->block);
5334 av_freep(&v->cbp_base);
5335 av_freep(&v->ttblk_base);
5336 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
5337 av_freep(&v->luma_mv_base);
5338 ff_intrax8_common_end(&v->x8);
5343 /** Decode a VC1/WMV3 frame
5344 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5346 static int vc1_decode_frame(AVCodecContext *avctx, void *data,
5347 int *got_frame, AVPacket *avpkt)
5349 const uint8_t *buf = avpkt->data;
5350 int buf_size = avpkt->size, n_slices = 0, i;
5351 VC1Context *v = avctx->priv_data;
5352 MpegEncContext *s = &v->s;
5353 AVFrame *pict = data;
5354 uint8_t *buf2 = NULL;
5355 const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
5356 int mb_height, n_slices1=-1;
5361 } *slices = NULL, *tmp;
5363 v->second_field = 0;
5365 if(s->flags & CODEC_FLAG_LOW_DELAY)
5368 /* no supplementary picture */
5369 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
5370 /* special case for last picture */
5371 if (s->low_delay == 0 && s->next_picture_ptr) {
5372 *pict = s->next_picture_ptr->f;
5373 s->next_picture_ptr = NULL;
5381 if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
5382 if (v->profile < PROFILE_ADVANCED)
5383 avctx->pix_fmt = AV_PIX_FMT_VDPAU_WMV3;
5385 avctx->pix_fmt = AV_PIX_FMT_VDPAU_VC1;
5388 //for advanced profile we may need to parse and unescape data
5389 if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5391 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5393 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
5394 const uint8_t *start, *end, *next;
5398 for (start = buf, end = buf + buf_size; next < end; start = next) {
5399 next = find_next_marker(start + 4, end);
5400 size = next - start - 4;
5401 if (size <= 0) continue;
5402 switch (AV_RB32(start)) {
5403 case VC1_CODE_FRAME:
5404 if (avctx->hwaccel ||
5405 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5407 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5409 case VC1_CODE_FIELD: {
5411 if (avctx->hwaccel ||
5412 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5413 buf_start_second_field = start;
5414 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5418 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5419 if (!slices[n_slices].buf)
5421 buf_size3 = vc1_unescape_buffer(start + 4, size,
5422 slices[n_slices].buf);
5423 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5425 /* assuming that the field marker is at the exact middle,
5426 hope it's correct */
5427 slices[n_slices].mby_start = s->mb_height >> 1;
5428 n_slices1 = n_slices - 1; // index of the last slice of the first field
5432 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
5433 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5434 init_get_bits(&s->gb, buf2, buf_size2 * 8);
5435 ff_vc1_decode_entry_point(avctx, v, &s->gb);
5437 case VC1_CODE_SLICE: {
5439 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5443 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5444 if (!slices[n_slices].buf)
5446 buf_size3 = vc1_unescape_buffer(start + 4, size,
5447 slices[n_slices].buf);
5448 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5450 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
5456 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
5457 const uint8_t *divider;
5460 divider = find_next_marker(buf, buf + buf_size);
5461 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
5462 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
5464 } else { // found field marker, unescape second field
5465 if (avctx->hwaccel ||
5466 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5467 buf_start_second_field = divider;
5468 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5472 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5473 if (!slices[n_slices].buf)
5475 buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
5476 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5478 slices[n_slices].mby_start = s->mb_height >> 1;
5479 n_slices1 = n_slices - 1;
5482 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
5484 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
5486 init_get_bits(&s->gb, buf2, buf_size2*8);
5488 init_get_bits(&s->gb, buf, buf_size*8);
5490 if (v->res_sprite) {
5491 v->new_sprite = !get_bits1(&s->gb);
5492 v->two_sprites = get_bits1(&s->gb);
5493 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
5494 we're using the sprite compositor. These are intentionally kept separate
5495 so you can get the raw sprites by using the wmv3 decoder for WMVP or
5496 the vc1 one for WVP2 */
5497 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5498 if (v->new_sprite) {
5499 // switch AVCodecContext parameters to those of the sprites
5500 avctx->width = avctx->coded_width = v->sprite_width;
5501 avctx->height = avctx->coded_height = v->sprite_height;
5508 if (s->context_initialized &&
5509 (s->width != avctx->coded_width ||
5510 s->height != avctx->coded_height)) {
5511 ff_vc1_decode_end(avctx);
5514 if (!s->context_initialized) {
5515 if (ff_msmpeg4_decode_init(avctx) < 0 || ff_vc1_decode_init_alloc_tables(v) < 0)
5518 s->low_delay = !avctx->has_b_frames || v->res_sprite;
5520 if (v->profile == PROFILE_ADVANCED) {
5521 if(avctx->coded_width<=1 || avctx->coded_height<=1)
5523 s->h_edge_pos = avctx->coded_width;
5524 s->v_edge_pos = avctx->coded_height;
5528 /* We need to set current_picture_ptr before reading the header,
5529 * otherwise we cannot store anything in there. */
5530 if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
5531 int i = ff_find_unused_picture(s, 0);
5534 s->current_picture_ptr = &s->picture[i];
5537 // do parse frame header
5538 v->pic_header_flag = 0;
5539 v->first_pic_header_flag = 1;
5540 if (v->profile < PROFILE_ADVANCED) {
5541 if (ff_vc1_parse_frame_header(v, &s->gb) < 0) {
5545 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5549 v->first_pic_header_flag = 0;
5551 if (avctx->debug & FF_DEBUG_PICT_INFO)
5552 av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
5554 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5555 && s->pict_type != AV_PICTURE_TYPE_I) {
5556 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
5560 if ((s->mb_height >> v->field_mode) == 0) {
5561 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
5565 // process pulldown flags
5566 s->current_picture_ptr->f.repeat_pict = 0;
5567 // Pulldown flags are only valid when 'broadcast' has been set.
5568 // So ticks_per_frame will be 2
5571 s->current_picture_ptr->f.repeat_pict = 1;
5572 } else if (v->rptfrm) {
5574 s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
5577 // for skipping the frame
5578 s->current_picture.f.pict_type = s->pict_type;
5579 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
5581 /* skip B-frames if we don't have reference frames */
5582 if (s->last_picture_ptr == NULL && (s->pict_type == AV_PICTURE_TYPE_B || s->droppable)) {
5585 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
5586 (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
5587 avctx->skip_frame >= AVDISCARD_ALL) {
5591 if (s->next_p_frame_damaged) {
5592 if (s->pict_type == AV_PICTURE_TYPE_B)
5595 s->next_p_frame_damaged = 0;
5598 if (ff_MPV_frame_start(s, avctx) < 0) {
5602 v->s.current_picture_ptr->f.interlaced_frame = (v->fcm != PROGRESSIVE);
5603 v->s.current_picture_ptr->f.top_field_first = v->tff;
5605 s->me.qpel_put = s->dsp.put_qpel_pixels_tab;
5606 s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
5608 if ((CONFIG_VC1_VDPAU_DECODER)
5609 &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5610 ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
5611 else if (avctx->hwaccel) {
5612 if (v->field_mode && buf_start_second_field) {
5613 // decode first field
5614 s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
5615 if (avctx->hwaccel->start_frame(avctx, buf_start, buf_start_second_field - buf_start) < 0)
5617 if (avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start) < 0)
5619 if (avctx->hwaccel->end_frame(avctx) < 0)
5622 // decode second field
5623 s->gb = slices[n_slices1 + 1].gb;
5624 s->picture_structure = PICT_TOP_FIELD + v->tff;
5625 v->second_field = 1;
5626 v->pic_header_flag = 0;
5627 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5628 av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
5631 v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
5633 if (avctx->hwaccel->start_frame(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
5635 if (avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
5637 if (avctx->hwaccel->end_frame(avctx) < 0)
5640 s->picture_structure = PICT_FRAME;
5641 if (avctx->hwaccel->start_frame(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
5643 if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
5645 if (avctx->hwaccel->end_frame(avctx) < 0)
5649 if (v->fcm == ILACE_FRAME && s->pict_type == AV_PICTURE_TYPE_B)
5650 goto err; // This codepath is still incomplete thus it is disabled
5652 ff_er_frame_start(s);
5654 v->bits = buf_size * 8;
5655 v->end_mb_x = s->mb_width;
5656 if (v->field_mode) {
5658 s->current_picture.f.linesize[0] <<= 1;
5659 s->current_picture.f.linesize[1] <<= 1;
5660 s->current_picture.f.linesize[2] <<= 1;
5662 s->uvlinesize <<= 1;
5663 tmp[0] = v->mv_f_last[0];
5664 tmp[1] = v->mv_f_last[1];
5665 v->mv_f_last[0] = v->mv_f_next[0];
5666 v->mv_f_last[1] = v->mv_f_next[1];
5667 v->mv_f_next[0] = v->mv_f[0];
5668 v->mv_f_next[1] = v->mv_f[1];
5669 v->mv_f[0] = tmp[0];
5670 v->mv_f[1] = tmp[1];
5672 mb_height = s->mb_height >> v->field_mode;
5673 for (i = 0; i <= n_slices; i++) {
5674 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
5675 if (v->field_mode <= 0) {
5676 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
5677 "picture boundary (%d >= %d)\n", i,
5678 slices[i - 1].mby_start, mb_height);
5681 v->second_field = 1;
5682 v->blocks_off = s->b8_stride * (s->mb_height&~1);
5683 v->mb_off = s->mb_stride * s->mb_height >> 1;
5685 v->second_field = 0;
5690 v->pic_header_flag = 0;
5691 if (v->field_mode && i == n_slices1 + 2) {
5692 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5693 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
5696 } else if (get_bits1(&s->gb)) {
5697 v->pic_header_flag = 1;
5698 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5699 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
5704 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
5705 if (!v->field_mode || v->second_field)
5706 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
5708 if (i >= n_slices) {
5709 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
5712 s->end_mb_y = (i <= n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
5714 if (s->end_mb_y <= s->start_mb_y) {
5715 av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
5718 if (!v->p_frame_skipped && s->pict_type != AV_PICTURE_TYPE_I && !v->cbpcy_vlc) {
5719 av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
5722 ff_vc1_decode_blocks(v);
5724 s->gb = slices[i].gb;
5726 if (v->field_mode) {
5727 v->second_field = 0;
5728 if (s->pict_type == AV_PICTURE_TYPE_B) {
5729 memcpy(v->mv_f_base, v->mv_f_next_base,
5730 2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5732 s->current_picture.f.linesize[0] >>= 1;
5733 s->current_picture.f.linesize[1] >>= 1;
5734 s->current_picture.f.linesize[2] >>= 1;
5736 s->uvlinesize >>= 1;
5738 av_dlog(s->avctx, "Consumed %i/%i bits\n",
5739 get_bits_count(&s->gb), s->gb.size_in_bits);
5740 // if (get_bits_count(&s->gb) > buf_size * 8)
5742 if(s->error_occurred && s->pict_type == AV_PICTURE_TYPE_B)
5748 ff_MPV_frame_end(s);
5750 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5752 avctx->width = avctx->coded_width = v->output_width;
5753 avctx->height = avctx->coded_height = v->output_height;
5754 if (avctx->skip_frame >= AVDISCARD_NONREF)
5756 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
5757 if (vc1_decode_sprites(v, &s->gb))
5760 *pict = v->sprite_output_frame;
5763 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
5764 *pict = s->current_picture_ptr->f;
5765 } else if (s->last_picture_ptr != NULL) {
5766 *pict = s->last_picture_ptr->f;
5768 if (s->last_picture_ptr || s->low_delay) {
5770 ff_print_debug_info(s, pict);
5776 for (i = 0; i < n_slices; i++)
5777 av_free(slices[i].buf);
5783 for (i = 0; i < n_slices; i++)
5784 av_free(slices[i].buf);
5790 static const AVProfile profiles[] = {
5791 { FF_PROFILE_VC1_SIMPLE, "Simple" },
5792 { FF_PROFILE_VC1_MAIN, "Main" },
5793 { FF_PROFILE_VC1_COMPLEX, "Complex" },
5794 { FF_PROFILE_VC1_ADVANCED, "Advanced" },
5795 { FF_PROFILE_UNKNOWN },
5798 AVCodec ff_vc1_decoder = {
5800 .type = AVMEDIA_TYPE_VIDEO,
5801 .id = AV_CODEC_ID_VC1,
5802 .priv_data_size = sizeof(VC1Context),
5803 .init = vc1_decode_init,
5804 .close = ff_vc1_decode_end,
5805 .decode = vc1_decode_frame,
5806 .flush = ff_mpeg_flush,
5807 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5808 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
5809 .pix_fmts = ff_hwaccel_pixfmt_list_420,
5810 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5813 #if CONFIG_WMV3_DECODER
5814 AVCodec ff_wmv3_decoder = {
5816 .type = AVMEDIA_TYPE_VIDEO,
5817 .id = AV_CODEC_ID_WMV3,
5818 .priv_data_size = sizeof(VC1Context),
5819 .init = vc1_decode_init,
5820 .close = ff_vc1_decode_end,
5821 .decode = vc1_decode_frame,
5822 .flush = ff_mpeg_flush,
5823 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5824 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
5825 .pix_fmts = ff_hwaccel_pixfmt_list_420,
5826 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5830 #if CONFIG_WMV3_VDPAU_DECODER
5831 AVCodec ff_wmv3_vdpau_decoder = {
5832 .name = "wmv3_vdpau",
5833 .type = AVMEDIA_TYPE_VIDEO,
5834 .id = AV_CODEC_ID_WMV3,
5835 .priv_data_size = sizeof(VC1Context),
5836 .init = vc1_decode_init,
5837 .close = ff_vc1_decode_end,
5838 .decode = vc1_decode_frame,
5839 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5840 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
5841 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_WMV3, AV_PIX_FMT_NONE },
5842 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5846 #if CONFIG_VC1_VDPAU_DECODER
5847 AVCodec ff_vc1_vdpau_decoder = {
5848 .name = "vc1_vdpau",
5849 .type = AVMEDIA_TYPE_VIDEO,
5850 .id = AV_CODEC_ID_VC1,
5851 .priv_data_size = sizeof(VC1Context),
5852 .init = vc1_decode_init,
5853 .close = ff_vc1_decode_end,
5854 .decode = vc1_decode_frame,
5855 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5856 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
5857 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_VC1, AV_PIX_FMT_NONE },
5858 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5862 #if CONFIG_WMV3IMAGE_DECODER
5863 AVCodec ff_wmv3image_decoder = {
5864 .name = "wmv3image",
5865 .type = AVMEDIA_TYPE_VIDEO,
5866 .id = AV_CODEC_ID_WMV3IMAGE,
5867 .priv_data_size = sizeof(VC1Context),
5868 .init = vc1_decode_init,
5869 .close = ff_vc1_decode_end,
5870 .decode = vc1_decode_frame,
5871 .capabilities = CODEC_CAP_DR1,
5872 .flush = vc1_sprite_flush,
5873 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
5874 .pix_fmts = ff_pixfmt_list_420
5878 #if CONFIG_VC1IMAGE_DECODER
5879 AVCodec ff_vc1image_decoder = {
5881 .type = AVMEDIA_TYPE_VIDEO,
5882 .id = AV_CODEC_ID_VC1IMAGE,
5883 .priv_data_size = sizeof(VC1Context),
5884 .init = vc1_decode_init,
5885 .close = ff_vc1_decode_end,
5886 .decode = vc1_decode_frame,
5887 .capabilities = CODEC_CAP_DR1,
5888 .flush = vc1_sprite_flush,
5889 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
5890 .pix_fmts = ff_pixfmt_list_420