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