2 * VC-1 and WMV3 decoder
3 * Copyright (c) 2011 Mashiat Sarker Shakkhar
4 * Copyright (c) 2006-2007 Konstantin Shishkov
5 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
7 * This file is part of Libav.
9 * Libav is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * Libav is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with Libav; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * VC-1 and WMV3 decoder
32 #include "mpegvideo.h"
36 #include "vc1acdata.h"
37 #include "msmpeg4data.h"
39 #include "simple_idct.h"
41 #include "vdpau_internal.h"
46 #define MB_INTRA_VLC_BITS 9
51 static const uint16_t vlc_offs[] = {
52 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436,
53 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342,
54 9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522,
55 20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980,
56 27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866,
57 29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186,
58 31714, 31746, 31778, 32306, 32340, 32372
61 // offset tables for interlaced picture MVDATA decoding
62 static const int offset_table1[9] = { 0, 1, 2, 4, 8, 16, 32, 64, 128};
63 static const int offset_table2[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255};
66 * Init VC-1 specific tables and VC1Context members
67 * @param v The VC1Context to initialize
70 static int vc1_init_common(VC1Context *v)
74 static VLC_TYPE vlc_table[32372][2];
76 v->hrd_rate = v->hrd_buffer = NULL;
81 INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
82 ff_vc1_bfraction_bits, 1, 1,
83 ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
84 INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
85 ff_vc1_norm2_bits, 1, 1,
86 ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
87 INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
88 ff_vc1_norm6_bits, 1, 1,
89 ff_vc1_norm6_codes, 2, 2, 556);
90 INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
91 ff_vc1_imode_bits, 1, 1,
92 ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
95 ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i*3+0]];
96 ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i*3+1] - vlc_offs[i*3+0];
97 init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
98 ff_vc1_ttmb_bits[i], 1, 1,
99 ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
100 ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i*3+1]];
101 ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i*3+2] - vlc_offs[i*3+1];
102 init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
103 ff_vc1_ttblk_bits[i], 1, 1,
104 ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
105 ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i*3+2]];
106 ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i*3+3] - vlc_offs[i*3+2];
107 init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
108 ff_vc1_subblkpat_bits[i], 1, 1,
109 ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
113 ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i*3+9]];
114 ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i*3+10] - vlc_offs[i*3+9];
115 init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
116 ff_vc1_4mv_block_pattern_bits[i], 1, 1,
117 ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
118 ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i*3+10]];
119 ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i*3+11] - vlc_offs[i*3+10];
120 init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
121 ff_vc1_cbpcy_p_bits[i], 1, 1,
122 ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
123 ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i*3+11]];
124 ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i*3+12] - vlc_offs[i*3+11];
125 init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
126 ff_vc1_mv_diff_bits[i], 1, 1,
127 ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
130 ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i*2+21]];
131 ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i*2+22] - vlc_offs[i*2+21];
132 init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
133 &vc1_ac_tables[i][0][1], 8, 4,
134 &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
135 /* initialize interlaced MVDATA tables (2-Ref) */
136 ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i*2+22]];
137 ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i*2+23] - vlc_offs[i*2+22];
138 init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126,
139 ff_vc1_2ref_mvdata_bits[i], 1, 1,
140 ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
142 for (i=0; i<4; i++) {
143 /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
144 ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i*3+37]];
145 ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i*3+38] - vlc_offs[i*3+37];
146 init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
147 ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1,
148 ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
149 /* initialize NON-4MV MBMODE VLC tables for the same */
150 ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i*3+38]];
151 ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i*3+39] - vlc_offs[i*3+38];
152 init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
153 ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
154 ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
155 /* initialize interlaced MVDATA tables (1-Ref) */
156 ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i*3+39]];
157 ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i*3+40] - vlc_offs[i*3+39];
158 init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72,
159 ff_vc1_1ref_mvdata_bits[i], 1, 1,
160 ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
162 for (i=0; i<4; i++) {
163 /* Initialize 2MV Block pattern VLC tables */
164 ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i+49]];
165 ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i+50] - vlc_offs[i+49];
166 init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
167 ff_vc1_2mv_block_pattern_bits[i], 1, 1,
168 ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
170 for (i=0; i<8; i++) {
171 /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
172 ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i*3+53]];
173 ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i*3+54] - vlc_offs[i*3+53];
174 init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63,
175 ff_vc1_icbpcy_p_bits[i], 1, 1,
176 ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
177 /* Initialize interlaced field picture MBMODE VLC tables */
178 ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i*3+54]];
179 ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i*3+55] - vlc_offs[i*3+54];
180 init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8,
181 ff_vc1_if_mmv_mbmode_bits[i], 1, 1,
182 ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
183 ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i*3+55]];
184 ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i*3+56] - vlc_offs[i*3+55];
185 init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6,
186 ff_vc1_if_1mv_mbmode_bits[i], 1, 1,
187 ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
194 v->mvrange = 0; /* 7.1.1.18, p80 */
199 /***********************************************************************/
201 * @name VC-1 Bitplane decoding
219 /** @} */ //imode defines
222 /** @} */ //Bitplane group
224 static void vc1_put_signed_blocks_clamped(VC1Context *v)
226 MpegEncContext *s = &v->s;
227 int topleft_mb_pos, top_mb_pos;
228 int stride_y, fieldtx;
231 /* The put pixels loop is always one MB row behind the decoding loop,
232 * because we can only put pixels when overlap filtering is done, and
233 * for filtering of the bottom edge of a MB, we need the next MB row
235 * Within the row, the put pixels loop is also one MB col behind the
236 * decoding loop. The reason for this is again, because for filtering
237 * of the right MB edge, we need the next MB present. */
238 if (!s->first_slice_line) {
240 topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1;
241 fieldtx = v->fieldtx_plane[topleft_mb_pos];
242 stride_y = (s->linesize) << fieldtx;
243 v_dist = (16 - fieldtx) >> (fieldtx == 0);
244 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
245 s->dest[0] - 16 * s->linesize - 16,
247 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
248 s->dest[0] - 16 * s->linesize - 8,
250 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
251 s->dest[0] - v_dist * s->linesize - 16,
253 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
254 s->dest[0] - v_dist * s->linesize - 8,
256 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
257 s->dest[1] - 8 * s->uvlinesize - 8,
259 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
260 s->dest[2] - 8 * s->uvlinesize - 8,
263 if (s->mb_x == s->mb_width - 1) {
264 top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
265 fieldtx = v->fieldtx_plane[top_mb_pos];
266 stride_y = s->linesize << fieldtx;
267 v_dist = fieldtx ? 15 : 8;
268 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
269 s->dest[0] - 16 * s->linesize,
271 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
272 s->dest[0] - 16 * s->linesize + 8,
274 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
275 s->dest[0] - v_dist * s->linesize,
277 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
278 s->dest[0] - v_dist * s->linesize + 8,
280 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
281 s->dest[1] - 8 * s->uvlinesize,
283 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
284 s->dest[2] - 8 * s->uvlinesize,
289 #define inc_blk_idx(idx) do { \
291 if (idx >= v->n_allocated_blks) \
295 inc_blk_idx(v->topleft_blk_idx);
296 inc_blk_idx(v->top_blk_idx);
297 inc_blk_idx(v->left_blk_idx);
298 inc_blk_idx(v->cur_blk_idx);
301 static void vc1_loop_filter_iblk(VC1Context *v, int pq)
303 MpegEncContext *s = &v->s;
305 if (!s->first_slice_line) {
306 v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
308 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize, s->linesize, pq);
309 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize+8, s->linesize, pq);
310 for(j = 0; j < 2; j++){
311 v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
313 v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1]-8*s->uvlinesize, s->uvlinesize, pq);
316 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
318 if (s->mb_y == s->end_mb_y-1) {
320 v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
321 v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
322 v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
324 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
328 static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
330 MpegEncContext *s = &v->s;
333 /* The loopfilter runs 1 row and 1 column behind the overlap filter, which
334 * means it runs two rows/cols behind the decoding loop. */
335 if (!s->first_slice_line) {
337 if (s->mb_y >= s->start_mb_y + 2) {
338 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
341 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq);
342 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq);
343 for(j = 0; j < 2; j++) {
344 v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
346 v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
350 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
353 if (s->mb_x == s->mb_width - 1) {
354 if (s->mb_y >= s->start_mb_y + 2) {
355 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
358 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq);
359 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq);
360 for(j = 0; j < 2; j++) {
361 v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize, s->uvlinesize, pq);
363 v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 16 * s->uvlinesize, s->uvlinesize, pq);
367 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
370 if (s->mb_y == s->end_mb_y) {
373 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
374 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq);
376 for(j = 0; j < 2; j++) {
377 v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
382 if (s->mb_x == s->mb_width - 1) {
384 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
385 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
387 for(j = 0; j < 2; j++) {
388 v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize, s->uvlinesize, pq);
396 static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
398 MpegEncContext *s = &v->s;
401 if (v->condover == CONDOVER_NONE)
404 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
406 /* Within a MB, the horizontal overlap always runs before the vertical.
407 * To accomplish that, we run the H on left and internal borders of the
408 * currently decoded MB. Then, we wait for the next overlap iteration
409 * to do H overlap on the right edge of this MB, before moving over and
410 * running the V overlap. Therefore, the V overlap makes us trail by one
411 * MB col and the H overlap filter makes us trail by one MB row. This
412 * is reflected in the time at which we run the put_pixels loop. */
413 if(v->condover == CONDOVER_ALL || v->pq >= 9 || v->over_flags_plane[mb_pos]) {
414 if(s->mb_x && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
415 v->over_flags_plane[mb_pos - 1])) {
416 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][1],
417 v->block[v->cur_blk_idx][0]);
418 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][3],
419 v->block[v->cur_blk_idx][2]);
420 if(!(s->flags & CODEC_FLAG_GRAY)) {
421 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][4],
422 v->block[v->cur_blk_idx][4]);
423 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][5],
424 v->block[v->cur_blk_idx][5]);
427 v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][0],
428 v->block[v->cur_blk_idx][1]);
429 v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][2],
430 v->block[v->cur_blk_idx][3]);
432 if (s->mb_x == s->mb_width - 1) {
433 if(!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
434 v->over_flags_plane[mb_pos - s->mb_stride])) {
435 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][2],
436 v->block[v->cur_blk_idx][0]);
437 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][3],
438 v->block[v->cur_blk_idx][1]);
439 if(!(s->flags & CODEC_FLAG_GRAY)) {
440 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][4],
441 v->block[v->cur_blk_idx][4]);
442 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][5],
443 v->block[v->cur_blk_idx][5]);
446 v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][0],
447 v->block[v->cur_blk_idx][2]);
448 v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][1],
449 v->block[v->cur_blk_idx][3]);
452 if (s->mb_x && (v->condover == CONDOVER_ALL || v->over_flags_plane[mb_pos - 1])) {
453 if(!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
454 v->over_flags_plane[mb_pos - s->mb_stride - 1])) {
455 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][2],
456 v->block[v->left_blk_idx][0]);
457 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][3],
458 v->block[v->left_blk_idx][1]);
459 if(!(s->flags & CODEC_FLAG_GRAY)) {
460 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][4],
461 v->block[v->left_blk_idx][4]);
462 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][5],
463 v->block[v->left_blk_idx][5]);
466 v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][0],
467 v->block[v->left_blk_idx][2]);
468 v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][1],
469 v->block[v->left_blk_idx][3]);
473 /** Do motion compensation over 1 macroblock
474 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
476 static void vc1_mc_1mv(VC1Context *v, int dir)
478 MpegEncContext *s = &v->s;
479 DSPContext *dsp = &v->s.dsp;
480 uint8_t *srcY, *srcU, *srcV;
481 int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
483 int v_edge_pos = s->v_edge_pos >> v->field_mode;
484 if (!v->field_mode && !v->s.last_picture.f.data[0])
487 mx = s->mv[dir][0][0];
488 my = s->mv[dir][0][1];
490 // store motion vectors for further use in B frames
491 if(s->pict_type == AV_PICTURE_TYPE_P) {
492 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = mx;
493 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = my;
496 uvmx = (mx + ((mx & 3) == 3)) >> 1;
497 uvmy = (my + ((my & 3) == 3)) >> 1;
498 v->luma_mv[s->mb_x][0] = uvmx;
499 v->luma_mv[s->mb_x][1] = uvmy;
502 v->cur_field_type != v->ref_field_type[dir]) {
503 my = my - 2 + 4 * v->cur_field_type;
504 uvmy = uvmy - 2 + 4 * v->cur_field_type;
507 if(v->fastuvmc && (v->fcm != 1)) { // fastuvmc shall be ignored for interlaced frame picture
508 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
509 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
511 if (v->field_mode) { // interlaced field picture
513 if ((v->cur_field_type != v->ref_field_type[dir]) && v->cur_field_type) {
514 srcY = s->current_picture.f.data[0];
515 srcU = s->current_picture.f.data[1];
516 srcV = s->current_picture.f.data[2];
518 srcY = s->last_picture.f.data[0];
519 srcU = s->last_picture.f.data[1];
520 srcV = s->last_picture.f.data[2];
523 srcY = s->next_picture.f.data[0];
524 srcU = s->next_picture.f.data[1];
525 srcV = s->next_picture.f.data[2];
529 srcY = s->last_picture.f.data[0];
530 srcU = s->last_picture.f.data[1];
531 srcV = s->last_picture.f.data[2];
533 srcY = s->next_picture.f.data[0];
534 srcU = s->next_picture.f.data[1];
535 srcV = s->next_picture.f.data[2];
539 src_x = s->mb_x * 16 + (mx >> 2);
540 src_y = s->mb_y * 16 + (my >> 2);
541 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
542 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
544 if(v->profile != PROFILE_ADVANCED){
545 src_x = av_clip( src_x, -16, s->mb_width * 16);
546 src_y = av_clip( src_y, -16, s->mb_height * 16);
547 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
548 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
550 src_x = av_clip( src_x, -17, s->avctx->coded_width);
551 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
552 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
553 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
556 srcY += src_y * s->linesize + src_x;
557 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
558 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
560 if (v->field_mode && v->ref_field_type[dir]) {
561 srcY += s->current_picture_ptr->f.linesize[0];
562 srcU += s->current_picture_ptr->f.linesize[1];
563 srcV += s->current_picture_ptr->f.linesize[2];
566 /* for grayscale we should not try to read from unknown area */
567 if(s->flags & CODEC_FLAG_GRAY) {
568 srcU = s->edge_emu_buffer + 18 * s->linesize;
569 srcV = s->edge_emu_buffer + 18 * s->linesize;
572 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
573 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
574 || (unsigned)(src_y - s->mspel) > v_edge_pos - (my&3) - 16 - s->mspel*3){
575 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
577 srcY -= s->mspel * (1 + s->linesize);
578 s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
579 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, v_edge_pos);
580 srcY = s->edge_emu_buffer;
581 s->dsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
582 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
583 s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
584 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
587 /* if we deal with range reduction we need to scale source blocks */
593 for(j = 0; j < 17 + s->mspel*2; j++) {
594 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
597 src = srcU; src2 = srcV;
598 for(j = 0; j < 9; j++) {
599 for(i = 0; i < 9; i++) {
600 src[i] = ((src[i] - 128) >> 1) + 128;
601 src2[i] = ((src2[i] - 128) >> 1) + 128;
603 src += s->uvlinesize;
604 src2 += s->uvlinesize;
607 /* if we deal with intensity compensation we need to scale source blocks */
608 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
613 for(j = 0; j < 17 + s->mspel*2; j++) {
614 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
617 src = srcU; src2 = srcV;
618 for(j = 0; j < 9; j++) {
619 for(i = 0; i < 9; i++) {
620 src[i] = v->lutuv[src[i]];
621 src2[i] = v->lutuv[src2[i]];
623 src += s->uvlinesize;
624 src2 += s->uvlinesize;
627 srcY += s->mspel * (1 + s->linesize);
630 if (v->field_mode && v->cur_field_type) {
631 off = s->current_picture_ptr->f.linesize[0];
632 off_uv = s->current_picture_ptr->f.linesize[1];
638 dxy = ((my & 3) << 2) | (mx & 3);
639 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
640 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
641 srcY += s->linesize * 8;
642 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize , srcY , s->linesize, v->rnd);
643 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
644 } else { // hpel mc - always used for luma
645 dxy = (my & 2) | ((mx & 2) >> 1);
647 dsp->put_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
649 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
652 if(s->flags & CODEC_FLAG_GRAY) return;
653 /* Chroma MC always uses qpel bilinear */
657 dsp->put_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
658 dsp->put_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
660 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
661 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
665 static inline int median4(int a, int b, int c, int d)
668 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
669 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
671 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
672 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
676 /** Do motion compensation for 4-MV macroblock - luminance block
678 static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
680 MpegEncContext *s = &v->s;
681 DSPContext *dsp = &v->s.dsp;
683 int dxy, mx, my, src_x, src_y;
685 int fieldmv = (v->fcm == 1) ? v->blk_mv_type[s->block_index[n]] : 0;
686 int v_edge_pos = s->v_edge_pos >> v->field_mode;
687 if(!v->field_mode && !v->s.last_picture.f.data[0])return;
688 mx = s->mv[dir][n][0];
689 my = s->mv[dir][n][1];
693 if ((v->cur_field_type != v->ref_field_type[dir]) && v->cur_field_type)
694 srcY = s->current_picture.f.data[0];
696 srcY = s->last_picture.f.data[0];
698 srcY = s->last_picture.f.data[0];
700 srcY = s->next_picture.f.data[0];
703 if (v->cur_field_type != v->ref_field_type[dir])
704 my = my - 2 + 4 * v->cur_field_type;
707 if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) {
708 int same_count = 0, opp_count = 0, k;
709 int chosen_mv[2][4][2], f;
711 for (k = 0; k < 4; k++) {
712 f = v->mv_f[0][s->block_index[k] + v->blocks_off];
713 chosen_mv[f][f ? opp_count : same_count][0] = s->mv[0][k][0];
714 chosen_mv[f][f ? opp_count : same_count][1] = s->mv[0][k][1];
718 f = opp_count > same_count;
719 switch (f ? opp_count : same_count) {
721 tx = median4(chosen_mv[f][0][0], chosen_mv[f][1][0], chosen_mv[f][2][0], chosen_mv[f][3][0]);
722 ty = median4(chosen_mv[f][0][1], chosen_mv[f][1][1], chosen_mv[f][2][1], chosen_mv[f][3][1]);
725 tx = mid_pred(chosen_mv[f][0][0], chosen_mv[f][1][0], chosen_mv[f][2][0]);
726 ty = mid_pred(chosen_mv[f][0][1], chosen_mv[f][1][1], chosen_mv[f][2][1]);
729 tx = (chosen_mv[f][0][0] + chosen_mv[f][1][0]) / 2;
730 ty = (chosen_mv[f][0][1] + chosen_mv[f][1][1]) / 2;
733 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
734 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
735 for (k = 0; k < 4; k++) v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
738 if (v->fcm == 1) { // not sure if needed for other types of picture
740 int width = s->avctx->coded_width;
741 int height = s->avctx->coded_height >> 1;
742 qx = (s->mb_x * 16) + (mx >> 2);
743 qy = (s->mb_y * 8) + (my >> 3);
748 mx -= 4 * (qx - width);
751 else if (qy > height + 1)
752 my -= 8 * (qy - height - 1);
755 if ((v->fcm == 1) && fieldmv)
756 off = ((n>1) ? s->linesize : 0) + (n&1) * 8;
758 off = s->linesize * 4 * (n&2) + (n&1) * 8;
759 if (v->field_mode && v->cur_field_type)
760 off += s->current_picture_ptr->f.linesize[0];
762 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
764 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
766 src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2);
768 if(v->profile != PROFILE_ADVANCED){
769 src_x = av_clip( src_x, -16, s->mb_width * 16);
770 src_y = av_clip( src_y, -16, s->mb_height * 16);
772 src_x = av_clip( src_x, -17, s->avctx->coded_width);
775 src_y = av_clip( src_y, -17, s->avctx->coded_height + 1);
777 src_y = av_clip( src_y, -18, s->avctx->coded_height);
779 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
783 srcY += src_y * s->linesize + src_x;
784 if (v->field_mode && v->ref_field_type[dir])
785 srcY += s->current_picture_ptr->f.linesize[0];
787 if (fieldmv && !(src_y & 1))
789 if (fieldmv && (src_y & 1) && src_y < 4)
791 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
792 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
793 || (unsigned)(src_y - (s->mspel<<fieldmv)) > v_edge_pos - (my&3) - ((8 + s->mspel*2)<<fieldmv)){
794 srcY -= s->mspel * (1 + (s->linesize << fieldmv));
795 /* check emulate edge stride and offset */
796 s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, (9+s->mspel*2) << fieldmv, src_x - s->mspel,
797 src_y - (s->mspel << fieldmv), s->h_edge_pos, v_edge_pos);
798 srcY = s->edge_emu_buffer;
799 /* if we deal with range reduction we need to scale source blocks */
805 for(j = 0; j < 9 + s->mspel*2; j++) {
806 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
807 src += s->linesize << fieldmv;
810 /* if we deal with intensity compensation we need to scale source blocks */
811 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
816 for(j = 0; j < 9 + s->mspel*2; j++) {
817 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]];
818 src += s->linesize << fieldmv;
821 srcY += s->mspel * (1 + (s->linesize << fieldmv));
825 dxy = ((my & 3) << 2) | (mx & 3);
826 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
827 } else { // hpel mc - always used for luma
828 dxy = (my & 2) | ((mx & 2) >> 1);
830 dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
832 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
836 static av_always_inline int get_chroma_mv(int *mvx, int *mvy, int *a, int flag, int *tx, int *ty)
839 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
840 idx = ((a[3] != flag) << 3) | ((a[2] != flag) << 2) | ((a[1] != flag) << 1) | (a[0] != flag);
842 *tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
843 *ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
845 } else if(count[idx] == 1) {
848 *tx = mid_pred(mvx[1], mvx[2], mvx[3]);
849 *ty = mid_pred(mvy[1], mvy[2], mvy[3]);
852 *tx = mid_pred(mvx[0], mvx[2], mvx[3]);
853 *ty = mid_pred(mvy[0], mvy[2], mvy[3]);
856 *tx = mid_pred(mvx[0], mvx[1], mvx[3]);
857 *ty = mid_pred(mvy[0], mvy[1], mvy[3]);
860 *tx = mid_pred(mvx[0], mvx[1], mvx[2]);
861 *ty = mid_pred(mvy[0], mvy[1], mvy[2]);
864 } else if(count[idx] == 2) {
866 for (i = 0; i < 3; i++)
871 for (i = t1 + 1; i < 4; i++)
876 *tx = (mvx[t1] + mvx[t2]) / 2;
877 *ty = (mvy[t1] + mvy[t2]) / 2;
885 /** Do motion compensation for 4-MV macroblock - both chroma blocks
887 static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
889 MpegEncContext *s = &v->s;
890 DSPContext *dsp = &v->s.dsp;
891 uint8_t *srcU, *srcV;
892 int uvmx, uvmy, uvsrc_x, uvsrc_y;
893 int k, tx = 0, ty = 0;
894 int mvx[4], mvy[4], intra[4], mv_f[4];
896 int chroma_ref_type = v->cur_field_type, off = 0;
897 int v_edge_pos = s->v_edge_pos >> v->field_mode;
899 if(!v->field_mode && !v->s.last_picture.f.data[0])return;
900 if(s->flags & CODEC_FLAG_GRAY) return;
902 for(k = 0; k < 4; k++) {
903 mvx[k] = s->mv[dir][k][0];
904 mvy[k] = s->mv[dir][k][1];
905 intra[k] = v->mb_type[0][s->block_index[k]];
907 mv_f[k] = v->mv_f[dir][s->block_index[k] + v->blocks_off];
910 /* calculate chroma MV vector from four luma MVs */
911 if (!v->field_mode || (v->field_mode && !v->numref)) {
912 valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
914 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
915 return; //no need to do MC for intra blocks
919 if (mv_f[0] + mv_f[1] + mv_f[2] + mv_f[3] > 2)
921 valid_count = get_chroma_mv(mvx, mvy, mv_f, dominant, &tx, &ty);
923 chroma_ref_type = !v->cur_field_type;
925 uvmx = (tx + ((tx&3) == 3)) >> 1;
926 uvmy = (ty + ((ty&3) == 3)) >> 1;
928 v->luma_mv[s->mb_x][0] = uvmx;
929 v->luma_mv[s->mb_x][1] = uvmy;
932 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
933 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
935 // Field conversion bias
936 if (v->cur_field_type != chroma_ref_type)
937 uvmy += 2 - 4 * chroma_ref_type;
939 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
940 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
942 if(v->profile != PROFILE_ADVANCED){
943 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
944 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
946 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
947 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
952 if ((v->cur_field_type != chroma_ref_type) && v->cur_field_type) {
953 srcU = s->current_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
954 srcV = s->current_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
956 srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
957 srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
960 srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
961 srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
964 srcU = s->next_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
965 srcV = s->next_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
969 if (chroma_ref_type) {
970 srcU += s->current_picture_ptr->f.linesize[1];
971 srcV += s->current_picture_ptr->f.linesize[2];
973 off = v->cur_field_type ? s->current_picture_ptr->f.linesize[1] : 0;
976 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
977 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
978 || (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9){
979 s->dsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1,
980 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
981 s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
982 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
983 srcU = s->edge_emu_buffer;
984 srcV = s->edge_emu_buffer + 16;
986 /* if we deal with range reduction we need to scale source blocks */
991 src = srcU; src2 = srcV;
992 for(j = 0; j < 9; j++) {
993 for(i = 0; i < 9; i++) {
994 src[i] = ((src[i] - 128) >> 1) + 128;
995 src2[i] = ((src2[i] - 128) >> 1) + 128;
997 src += s->uvlinesize;
998 src2 += s->uvlinesize;
1001 /* if we deal with intensity compensation we need to scale source blocks */
1002 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1004 uint8_t *src, *src2;
1006 src = srcU; src2 = srcV;
1007 for(j = 0; j < 9; j++) {
1008 for(i = 0; i < 9; i++) {
1009 src[i] = v->lutuv[src[i]];
1010 src2[i] = v->lutuv[src2[i]];
1012 src += s->uvlinesize;
1013 src2 += s->uvlinesize;
1018 /* Chroma MC always uses qpel bilinear */
1022 dsp->put_h264_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
1023 dsp->put_h264_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
1025 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
1026 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
1030 /** Do motion compensation for 4-MV field chroma macroblock (both U and V)
1032 static void vc1_mc_4mv_chroma4(VC1Context *v)
1034 MpegEncContext *s = &v->s;
1035 DSPContext *dsp = &v->s.dsp;
1036 uint8_t *srcU, *srcV;
1037 int uvsrc_x, uvsrc_y;
1038 int uvmx_field[4], uvmy_field[4];
1040 int fieldmv = v->blk_mv_type[s->block_index[0]];
1041 static const int s_rndtblfield[16] = {0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12};
1042 int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks
1043 int v_edge_pos = s->v_edge_pos >> 1;
1045 if (!v->s.last_picture.f.data[0]) return;
1046 if (s->flags & CODEC_FLAG_GRAY) return;
1048 for (i = 0; i < 4; i++) {
1049 tx = s->mv[0][i][0];
1050 uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1;
1051 ty = s->mv[0][i][1];
1053 uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF];
1055 uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1;
1058 for (i = 0; i < 4; i++) {
1059 off = (i & 1) * 4 + ((i & 2) ? v_dist * s->uvlinesize : 0);
1060 uvsrc_x = s->mb_x * 8 + (i & 1) * 4 + (uvmx_field[i] >> 2);
1061 uvsrc_y = s->mb_y * 8 + ((i & 2) ? v_dist : 0) + (uvmy_field[i] >> 2);
1062 // FIXME: implement proper pull-back (see vc1cropmv.c, vc1CROPMV_ChromaPullBack())
1063 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
1064 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
1065 srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
1066 srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
1067 uvmx_field[i] = (uvmx_field[i] & 3) << 1;
1068 uvmy_field[i] = (uvmy_field[i] & 3) << 1;
1070 if (fieldmv && !(uvsrc_y & 1))
1072 if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2)
1074 if((v->mv_mode == MV_PMODE_INTENSITY_COMP)
1075 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
1076 || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)){
1077 s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize, 5, (5 << fieldmv), uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos);
1078 s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 5, (5 << fieldmv), uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos);
1079 srcU = s->edge_emu_buffer;
1080 srcV = s->edge_emu_buffer + 16;
1082 /* if we deal with intensity compensation we need to scale source blocks */
1083 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1085 uint8_t *src, *src2;
1087 src = srcU; src2 = srcV;
1088 for(j = 0; j < 5; j++) {
1089 for(i = 0; i < 5; i++) {
1090 src[i] = v->lutuv[src[i]];
1091 src2[i] = v->lutuv[src2[i]];
1093 src += s->uvlinesize << 1;
1094 src2 += s->uvlinesize << 1;
1099 dsp->put_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1100 dsp->put_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
1102 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]);
1103 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]);
1108 /***********************************************************************/
1110 * @name VC-1 Block-level functions
1111 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1117 * @brief Get macroblock-level quantizer scale
1119 #define GET_MQUANT() \
1123 if (v->dqprofile == DQPROFILE_ALL_MBS) \
1127 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
1131 mqdiff = get_bits(gb, 3); \
1132 if (mqdiff != 7) mquant = v->pq + mqdiff; \
1133 else mquant = get_bits(gb, 5); \
1136 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
1137 edges = 1 << v->dqsbedge; \
1138 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
1139 edges = (3 << v->dqsbedge) % 15; \
1140 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
1142 if((edges&1) && !s->mb_x) \
1143 mquant = v->altpq; \
1144 if((edges&2) && s->first_slice_line) \
1145 mquant = v->altpq; \
1146 if((edges&4) && s->mb_x == (s->mb_width - 1)) \
1147 mquant = v->altpq; \
1148 if((edges&8) && s->mb_y == (s->mb_height - 1)) \
1149 mquant = v->altpq; \
1153 * @def GET_MVDATA(_dmv_x, _dmv_y)
1154 * @brief Get MV differentials
1155 * @see MVDATA decoding from 8.3.5.2, p(1)20
1156 * @param _dmv_x Horizontal differential for decoded MV
1157 * @param _dmv_y Vertical differential for decoded MV
1159 #define GET_MVDATA(_dmv_x, _dmv_y) \
1160 index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table,\
1161 VC1_MV_DIFF_VLC_BITS, 2); \
1164 mb_has_coeffs = 1; \
1167 else mb_has_coeffs = 0; \
1169 if (!index) { _dmv_x = _dmv_y = 0; } \
1170 else if (index == 35) \
1172 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
1173 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
1175 else if (index == 36) \
1184 if (!s->quarter_sample && index1 == 5) val = 1; \
1186 if(size_table[index1] - val > 0) \
1187 val = get_bits(gb, size_table[index1] - val); \
1189 sign = 0 - (val&1); \
1190 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1193 if (!s->quarter_sample && index1 == 5) val = 1; \
1195 if(size_table[index1] - val > 0) \
1196 val = get_bits(gb, size_table[index1] - val); \
1198 sign = 0 - (val&1); \
1199 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1202 static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x, int *dmv_y, int *pred_flag)
1205 int extend_x = 0, extend_y = 0;
1206 GetBitContext *gb = &v->s.gb;
1209 const int* offs_tab;
1212 bits = VC1_2REF_MVDATA_VLC_BITS;
1215 bits = VC1_1REF_MVDATA_VLC_BITS;
1218 switch (v->dmvrange) {
1226 extend_x = extend_y = 1;
1229 index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
1231 *dmv_x = get_bits(gb, v->k_x);
1232 *dmv_y = get_bits(gb, v->k_y);
1234 *pred_flag = *dmv_y & 1;
1235 *dmv_y = (*dmv_y + *pred_flag) >> 1;
1240 offs_tab = offset_table2;
1242 offs_tab = offset_table1;
1243 index1 = (index + 1) % 9;
1245 val = get_bits(gb, index1 + extend_x);
1246 sign = 0 -(val & 1);
1247 *dmv_x = (sign ^ ((val >> 1) + offs_tab[index1])) - sign;
1251 offs_tab = offset_table2;
1253 offs_tab = offset_table1;
1254 index1 = (index + 1) / 9;
1255 if (index1 > v->numref) {
1256 val = get_bits(gb, (index1 + (extend_y << v->numref)) >> v->numref);
1257 sign = 0 - (val & 1);
1258 *dmv_y = (sign ^ ((val >> 1) + offs_tab[index1 >> v->numref])) - sign;
1262 *pred_flag = index1 & 1;
1266 static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int dir)
1268 int scaledvalue, refdist;
1269 int scalesame1, scalesame2;
1270 int scalezone1_x, zone1offset_x;
1272 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1273 refdist = v->refdist;
1275 refdist = dir ? v->brfd : v->frfd;
1278 scalesame1 = vc1_field_mvpred_scales[v->second_field][1][refdist];
1279 scalesame2 = vc1_field_mvpred_scales[v->second_field][2][refdist];
1280 scalezone1_x = vc1_field_mvpred_scales[v->second_field][3][refdist];
1281 zone1offset_x = vc1_field_mvpred_scales[v->second_field][5][refdist];
1286 if (FFABS(n) < scalezone1_x)
1287 scaledvalue = (n * scalesame1) >> 8;
1290 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x;
1292 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x;
1295 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1298 static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, int dir)
1300 int scaledvalue, refdist;
1301 int scalesame1, scalesame2;
1302 int scalezone1_y, zone1offset_y;
1304 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1305 refdist = v->refdist;
1307 refdist = dir ? v->brfd : v->frfd;
1310 scalesame1 = vc1_field_mvpred_scales[v->second_field][1][refdist];
1311 scalesame2 = vc1_field_mvpred_scales[v->second_field][2][refdist];
1312 scalezone1_y = vc1_field_mvpred_scales[v->second_field][4][refdist];
1313 zone1offset_y = vc1_field_mvpred_scales[v->second_field][6][refdist];
1318 if (FFABS(n) < scalezone1_y)
1319 scaledvalue = (n * scalesame1) >> 8;
1322 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y;
1324 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y;
1328 if (v->cur_field_type && !v->ref_field_type[dir])
1329 return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
1331 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1334 static av_always_inline int scaleforopp_x(VC1Context *v, int n /* MV */)
1336 int scalezone1_x, zone1offset_x;
1337 int scaleopp1, scaleopp2, brfd;
1340 brfd = FFMIN(v->brfd, 3);
1341 scalezone1_x = vc1_b_field_mvpred_scales[3][brfd];
1342 zone1offset_x = vc1_b_field_mvpred_scales[5][brfd];
1343 scaleopp1 = vc1_b_field_mvpred_scales[1][brfd];
1344 scaleopp2 = vc1_b_field_mvpred_scales[2][brfd];
1349 if (FFABS(n) < scalezone1_x)
1350 scaledvalue = (n * scaleopp1) >> 8;
1353 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x;
1355 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x;
1358 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
1361 static av_always_inline int scaleforopp_y(VC1Context *v, int n /* MV */, int dir)
1363 int scalezone1_y, zone1offset_y;
1364 int scaleopp1, scaleopp2, brfd;
1367 brfd = FFMIN(v->brfd, 3);
1368 scalezone1_y = vc1_b_field_mvpred_scales[4][brfd];
1369 zone1offset_y = vc1_b_field_mvpred_scales[6][brfd];
1370 scaleopp1 = vc1_b_field_mvpred_scales[1][brfd];
1371 scaleopp2 = vc1_b_field_mvpred_scales[2][brfd];
1376 if (FFABS(n) < scalezone1_y)
1377 scaledvalue = (n * scaleopp1) >> 8;
1380 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y;
1382 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y;
1385 if (v->cur_field_type && !v->ref_field_type[dir]) {
1386 return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
1388 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
1392 static av_always_inline int scaleforsame(VC1Context *v, int i, int n /* MV */, int dim, int dir)
1394 int brfd, scalesame;
1395 if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) {
1397 return scaleforsame_y(v, i, n, dir);
1399 return scaleforsame_x(v, n, dir);
1401 brfd = FFMIN(v->brfd, 3);
1402 scalesame = vc1_b_field_mvpred_scales[0][brfd];
1403 return(n * scalesame >> 8);
1406 static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */, int dim, int dir)
1408 int refdist, scaleopp;
1409 if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
1411 return scaleforopp_y(v, n, dir);
1413 return scaleforopp_x(v, n);
1415 if (v->s.pict_type != AV_PICTURE_TYPE_B)
1416 refdist = FFMIN(v->refdist, 3);
1418 refdist = dir ? v->brfd : v->frfd;
1419 scaleopp = vc1_field_mvpred_scales[v->second_field][0][refdist];
1420 return(n * scaleopp >> 8);
1423 /** Predict and set motion vector
1425 static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y, int mv1, int r_x, int r_y, uint8_t* is_intra, int pred_flag, int dir)
1427 MpegEncContext *s = &v->s;
1428 int xy, wrap, off = 0;
1432 int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
1434 int16_t samefield_pred[2], oppfield_pred[2];
1435 int16_t samefield_predA[2], oppfield_predA[2];
1436 int16_t samefield_predB[2], oppfield_predB[2];
1437 int16_t samefield_predC[2], oppfield_predC[2];
1438 int16_t *predA, *predC;
1439 int a_valid, b_valid, c_valid;
1440 int hybridmv_thresh, y_bias = 0;
1442 if (v->mv_mode == MV_PMODE_MIXED_MV ||
1443 ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV))) mixedmv_pic = 1;
1444 else mixedmv_pic = 0;
1445 /* scale MV difference to be quad-pel */
1446 dmv_x <<= 1 - s->quarter_sample;
1447 dmv_y <<= 1 - s->quarter_sample;
1449 wrap = s->b8_stride;
1450 xy = s->block_index[n];
1453 s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy + v->blocks_off][0] = 0;
1454 s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy + v->blocks_off][1] = 0;
1455 s->current_picture.f.motion_val[1][xy + v->blocks_off][0] = 0;
1456 s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = 0;
1457 if(mv1) { /* duplicate motion data for 1-MV block */
1458 s->current_picture.f.motion_val[0][xy + 1 + v->blocks_off][0] = 0;
1459 s->current_picture.f.motion_val[0][xy + 1 + v->blocks_off][1] = 0;
1460 s->current_picture.f.motion_val[0][xy + wrap + v->blocks_off][0] = 0;
1461 s->current_picture.f.motion_val[0][xy + wrap + v->blocks_off][1] = 0;
1462 s->current_picture.f.motion_val[0][xy + wrap + 1 + v->blocks_off][0] = 0;
1463 s->current_picture.f.motion_val[0][xy + wrap + 1 + v->blocks_off][1] = 0;
1464 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
1465 s->current_picture.f.motion_val[1][xy + 1 + v->blocks_off][0] = 0;
1466 s->current_picture.f.motion_val[1][xy + 1 + v->blocks_off][1] = 0;
1467 s->current_picture.f.motion_val[1][xy + wrap][0] = 0;
1468 s->current_picture.f.motion_val[1][xy + wrap + v->blocks_off][1] = 0;
1469 s->current_picture.f.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0;
1470 s->current_picture.f.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0;
1475 C = s->current_picture.f.motion_val[dir][xy - 1 + v->blocks_off];
1476 A = s->current_picture.f.motion_val[dir][xy - wrap + v->blocks_off];
1478 if (v->field_mode && mixedmv_pic)
1479 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
1481 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1483 //in 4-MV mode different blocks have different B predictor position
1486 off = (s->mb_x > 0) ? -1 : 1;
1489 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
1498 B = s->current_picture.f.motion_val[dir][xy - wrap + off + v->blocks_off];
1500 a_valid = !s->first_slice_line || (n==2 || n==3);
1501 b_valid = a_valid && (s->mb_width > 1);
1502 c_valid = s->mb_x || (n==1 || n==3);
1503 if (v->field_mode) {
1504 a_valid = a_valid && !is_intra[xy - wrap];
1505 b_valid = b_valid && !is_intra[xy - wrap + off];
1506 c_valid = c_valid && !is_intra[xy - 1];
1510 f = v->mv_f[dir][xy - wrap + v->blocks_off];
1512 num_samefield += 1 - f;
1514 oppfield_predA[0] = A[0];
1515 oppfield_predA[1] = A[1];
1516 samefield_predA[0] = scaleforsame(v, 0, A[0], 0, dir);
1517 samefield_predA[1] = scaleforsame(v, n, A[1], 1, dir);
1519 samefield_predA[0] = A[0];
1520 samefield_predA[1] = A[1];
1522 oppfield_predA[0] = scaleforopp(v, A[0], 0, dir);
1524 oppfield_predA[1] = scaleforopp(v, A[1], 1, dir);
1527 samefield_predA[0] = samefield_predA[1] = 0;
1528 oppfield_predA[0] = oppfield_predA[1] = 0;
1531 f = v->mv_f[dir][xy - 1 + v->blocks_off];
1533 num_samefield += 1 - f;
1535 oppfield_predC[0] = C[0];
1536 oppfield_predC[1] = C[1];
1537 samefield_predC[0] = scaleforsame(v, 0, C[0], 0, dir);
1538 samefield_predC[1] = scaleforsame(v, n, C[1], 1, dir);
1540 samefield_predC[0] = C[0];
1541 samefield_predC[1] = C[1];
1543 oppfield_predC[0] = scaleforopp(v, C[0], 0, dir);
1545 oppfield_predC[1] = scaleforopp(v, C[1], 1, dir);
1548 samefield_predC[0] = samefield_predC[1] = 0;
1549 oppfield_predC[0] = oppfield_predC[1] = 0;
1552 f = v->mv_f[dir][xy - wrap + off + v->blocks_off];
1554 num_samefield += 1 - f;
1556 oppfield_predB[0] = B[0];
1557 oppfield_predB[1] = B[1];
1558 samefield_predB[0] = scaleforsame(v, 0, B[0], 0, dir);
1559 samefield_predB[1] = scaleforsame(v, n, B[1], 1, dir);
1561 samefield_predB[0] = B[0];
1562 samefield_predB[1] = B[1];
1564 oppfield_predB[0] = scaleforopp(v, B[0], 0, dir);
1566 oppfield_predB[1] = scaleforopp(v, B[1], 1, dir);
1569 samefield_predB[0] = samefield_predB[1] = 0;
1570 oppfield_predB[0] = oppfield_predB[1] = 0;
1574 samefield_pred[0] = samefield_predA[0];
1575 samefield_pred[1] = samefield_predA[1];
1576 oppfield_pred[0] = oppfield_predA[0];
1577 oppfield_pred[1] = oppfield_predA[1];
1578 } else if (c_valid) {
1579 samefield_pred[0] = samefield_predC[0];
1580 samefield_pred[1] = samefield_predC[1];
1581 oppfield_pred[0] = oppfield_predC[0];
1582 oppfield_pred[1] = oppfield_predC[1];
1583 } else if (b_valid) {
1584 samefield_pred[0] = samefield_predB[0];
1585 samefield_pred[1] = samefield_predB[1];
1586 oppfield_pred[0] = oppfield_predB[0];
1587 oppfield_pred[1] = oppfield_predB[1];
1589 samefield_pred[0] = samefield_pred[1] = 0;
1590 oppfield_pred[0] = oppfield_pred[1] = 0;
1593 if (num_samefield + num_oppfield > 1) {
1594 samefield_pred[0] = mid_pred(samefield_predA[0], samefield_predB[0], samefield_predC[0]);
1595 samefield_pred[1] = mid_pred(samefield_predA[1], samefield_predB[1], samefield_predC[1]);
1597 oppfield_pred[0] = mid_pred(oppfield_predA[0], oppfield_predB[0], oppfield_predC[0]);
1599 oppfield_pred[1] = mid_pred(oppfield_predA[1], oppfield_predB[1], oppfield_predC[1]);
1602 if (v->field_mode) {
1603 if (num_samefield <= num_oppfield)
1604 opposit = 1 - pred_flag;
1606 opposit = pred_flag;
1610 px = oppfield_pred[0];
1611 py = oppfield_pred[1];
1612 predA = oppfield_predA;
1613 predC = oppfield_predC;
1614 v->mv_f[dir][xy + v->blocks_off] = f = 1;
1615 v->ref_field_type[dir] = !v->cur_field_type;
1617 px = samefield_pred[0];
1618 py = samefield_pred[1];
1619 predA = samefield_predA;
1620 predC = samefield_predC;
1621 v->mv_f[dir][xy + v->blocks_off] = f = 0;
1622 v->ref_field_type[dir] = v->cur_field_type;
1625 /* Pullback MV as specified in 8.3.5.3.4 */
1626 if (!v->field_mode) {
1628 qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
1629 qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
1630 X = (s->mb_width << 6) - 4;
1631 Y = (s->mb_height << 6) - 4;
1633 if(qx + px < -60) px = -60 - qx;
1634 if(qy + py < -60) py = -60 - qy;
1636 if(qx + px < -28) px = -28 - qx;
1637 if(qy + py < -28) py = -28 - qy;
1639 if(qx + px > X) px = X - qx;
1640 if(qy + py > Y) py = Y - qy;
1643 if (!v->field_mode || s->pict_type != AV_PICTURE_TYPE_B) {
1644 /* Calculate hybrid prediction as specified in 8.3.5.3.5 (also 10.3.5.4.3.5) */
1645 if (v->field_mode && !s->quarter_sample)
1646 hybridmv_thresh = 16;
1648 hybridmv_thresh = 32;
1649 if (a_valid && c_valid) {
1650 if (is_intra[xy - wrap])
1651 sum = FFABS(px) + FFABS(py);
1653 sum = FFABS(px - predA[0]) + FFABS(py - predA[1]);
1654 if (sum > hybridmv_thresh) {
1655 if (get_bits1(&s->gb)) { // read HYBRIDPRED bit
1663 if (is_intra[xy - 1])
1664 sum = FFABS(px) + FFABS(py);
1666 sum = FFABS(px - predC[0]) + FFABS(py - predC[1]);
1667 if (sum > hybridmv_thresh) {
1668 if(get_bits1(&s->gb)) {
1680 if (v->field_mode && !s->quarter_sample) {
1684 if (v->field_mode && v->numref)
1686 if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0)
1688 /* store MV using signed modulus of MV range defined in 4.11 */
1689 s->mv[dir][n][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1690 s->mv[dir][n][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1] = ((py + dmv_y + r_y - y_bias) & ((r_y << 1) - 1)) - r_y + y_bias;
1691 if(mv1) { /* duplicate motion data for 1-MV block */
1692 s->current_picture.f.motion_val[dir][xy + 1 + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
1693 s->current_picture.f.motion_val[dir][xy + 1 + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
1694 s->current_picture.f.motion_val[dir][xy + wrap + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
1695 s->current_picture.f.motion_val[dir][xy + wrap + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
1696 s->current_picture.f.motion_val[dir][xy + wrap + 1 + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
1697 s->current_picture.f.motion_val[dir][xy + wrap + 1 + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
1698 v->mv_f[dir][xy + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off];
1699 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];
1703 /** Predict and set motion vector for interlaced frame picture MBs
1705 static inline void vc1_pred_mv_intfr(VC1Context *v, int n, int dmv_x, int dmv_y, int mvn, int r_x, int r_y, uint8_t* is_intra)
1707 MpegEncContext *s = &v->s;
1708 int xy, wrap, off = 0;
1709 int A[2], B[2], C[2];
1711 int a_valid = 0, b_valid = 0, c_valid = 0;
1712 int field_a, field_b, field_c; // 0: same, 1: opposit
1713 int total_valid, num_samefield, num_oppfield;
1714 int pos_c, pos_b, n_adj;
1716 wrap = s->b8_stride;
1717 xy = s->block_index[n];
1720 s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = 0;
1721 s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = 0;
1722 s->current_picture.f.motion_val[1][xy][0] = 0;
1723 s->current_picture.f.motion_val[1][xy][1] = 0;
1724 if(mvn == 1) { /* duplicate motion data for 1-MV block */
1725 s->current_picture.f.motion_val[0][xy + 1][0] = 0;
1726 s->current_picture.f.motion_val[0][xy + 1][1] = 0;
1727 s->current_picture.f.motion_val[0][xy + wrap][0] = 0;
1728 s->current_picture.f.motion_val[0][xy + wrap][1] = 0;
1729 s->current_picture.f.motion_val[0][xy + wrap + 1][0] = 0;
1730 s->current_picture.f.motion_val[0][xy + wrap + 1][1] = 0;
1731 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
1732 s->current_picture.f.motion_val[1][xy + 1][0] = 0;
1733 s->current_picture.f.motion_val[1][xy + 1][1] = 0;
1734 s->current_picture.f.motion_val[1][xy + wrap][0] = 0;
1735 s->current_picture.f.motion_val[1][xy + wrap][1] = 0;
1736 s->current_picture.f.motion_val[1][xy + wrap + 1][0] = 0;
1737 s->current_picture.f.motion_val[1][xy + wrap + 1][1] = 0;
1742 off = ((n == 0) || (n == 1)) ? 1 : -1;
1744 if (s->mb_x || (n == 1) || (n == 3)) {
1745 if ((v->blk_mv_type[xy]) // current block (MB) has a field MV
1746 || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { // or both have frame MV
1747 A[0] = s->current_picture.f.motion_val[0][xy - 1][0];
1748 A[1] = s->current_picture.f.motion_val[0][xy - 1][1];
1750 } else { // current block has frame mv and cand. has field MV (so average)
1751 A[0] = (s->current_picture.f.motion_val[0][xy - 1][0]
1752 + s->current_picture.f.motion_val[0][xy - 1 + off*wrap][0] + 1) >> 1;
1753 A[1] = (s->current_picture.f.motion_val[0][xy - 1][1]
1754 + s->current_picture.f.motion_val[0][xy - 1 + off*wrap][1] + 1) >> 1;
1757 if (!(n & 1) && v->is_intra[s->mb_x - 1]) {
1761 } else A[0] = A[1] = 0;
1762 /* Predict B and C */
1763 B[0] = B[1] = C[0] = C[1] = 0;
1764 if (n == 0 || n == 1 || v->blk_mv_type[xy]) {
1765 if (!s->first_slice_line) {
1766 if (!v->is_intra[s->mb_x - s->mb_stride]) {
1769 pos_b = s->block_index[n_adj] - 2 * wrap;
1770 if (v->blk_mv_type[pos_b] && v->blk_mv_type[xy]) {
1771 n_adj = (n & 2) | (n & 1);
1773 B[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap][0];
1774 B[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap][1];
1775 if (v->blk_mv_type[pos_b] && !v->blk_mv_type[xy]) {
1776 B[0] = (1 + B[0] + s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap][0]) >> 1;
1777 B[1] = (1 + B[1] + s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap][1]) >> 1;
1780 if (s->mb_width > 1) {
1781 if (!v->is_intra[s->mb_x - s->mb_stride + 1]) {
1784 pos_c = s->block_index[2] - 2*wrap + 2;
1785 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
1788 C[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2*wrap + 2][0];
1789 C[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2*wrap + 2][1];
1790 if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
1791 C[0] = (1 + C[0] + (s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap + 2][0])) >> 1;
1792 C[1] = (1 + C[1] + (s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap + 2][1])) >> 1;
1794 if (s->mb_x == s->mb_width - 1) {
1795 if (!v->is_intra[s->mb_x - s->mb_stride - 1]) {
1798 pos_c = s->block_index[3] - 2*wrap - 2;
1799 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
1802 C[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2*wrap - 2][0];
1803 C[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2*wrap - 2][1];
1804 if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
1805 C[0] = (1 + C[0] + s->current_picture.f.motion_val[0][s->block_index[1] - 2*wrap - 2][0]) >> 1;
1806 C[1] = (1 + C[1] + s->current_picture.f.motion_val[0][s->block_index[1] - 2*wrap - 2][1]) >> 1;
1814 pos_b = s->block_index[1];
1816 B[0] = s->current_picture.f.motion_val[0][pos_b][0];
1817 B[1] = s->current_picture.f.motion_val[0][pos_b][1];
1818 pos_c = s->block_index[0];
1820 C[0] = s->current_picture.f.motion_val[0][pos_c][0];
1821 C[1] = s->current_picture.f.motion_val[0][pos_c][1];
1824 total_valid = a_valid + b_valid + c_valid;
1825 // check if predictor A is out of bounds
1826 if (!s->mb_x && !(n==1 || n==3)) {
1829 // check if predictor B is out of bounds
1830 if ((s->first_slice_line && v->blk_mv_type[xy]) || (s->first_slice_line && !(n & 2))) {
1831 B[0] = B[1] = C[0] = C[1] = 0;
1833 if (!v->blk_mv_type[xy]) {
1834 if(s->mb_width == 1) {
1838 if (total_valid >= 2) {
1839 px = mid_pred(A[0], B[0], C[0]);
1840 py = mid_pred(A[1], B[1], C[1]);
1841 } else if (total_valid) {
1842 if (a_valid) { px = A[0]; py = A[1]; }
1843 if (b_valid) { px = B[0]; py = B[1]; }
1844 if (c_valid) { px = C[0]; py = C[1]; }
1849 field_a = (A[1] & 4) ? 1 : 0;
1853 field_b = (B[1] & 4) ? 1 : 0;
1857 field_c = (C[1] & 4) ? 1 : 0;
1861 num_oppfield = field_a + field_b + field_c;
1862 num_samefield = total_valid - num_oppfield;
1863 if (total_valid == 3) {
1864 if ((num_samefield == 3) || (num_oppfield == 3)) {
1865 px = mid_pred(A[0], B[0], C[0]);
1866 py = mid_pred(A[1], B[1], C[1]);
1867 } else if (num_samefield >= num_oppfield) {
1868 /* take one MV from same field set depending on priority
1869 the check for B may not be necessary */
1870 px = (!field_a) ? A[0] : B[0];
1871 py = (!field_a) ? A[1] : B[1];
1873 px = (field_a) ? A[0] : B[0];
1874 py = (field_a) ? A[1] : B[1];
1876 } else if (total_valid == 2) {
1877 if (num_samefield >= num_oppfield) {
1878 if (!field_a && a_valid) {
1881 } else if (!field_b && b_valid) {
1884 } else if (c_valid) {
1889 if (field_a && a_valid) {
1892 } else if (field_b && b_valid) {
1895 } else if (c_valid) {
1900 } else if (total_valid == 1) {
1901 px = (a_valid) ? A[0] : ((b_valid) ? B[0] : C[0]);
1902 py = (a_valid) ? A[1] : ((b_valid) ? B[1] : C[1]);
1906 /* store MV using signed modulus of MV range defined in 4.11 */
1907 s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1908 s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
1909 if(mvn == 1) { /* duplicate motion data for 1-MV block */
1910 s->current_picture.f.motion_val[0][xy + 1][0] = s->current_picture.f.motion_val[0][xy][0];
1911 s->current_picture.f.motion_val[0][xy + 1][1] = s->current_picture.f.motion_val[0][xy][1];
1912 s->current_picture.f.motion_val[0][xy + wrap][0] = s->current_picture.f.motion_val[0][xy][0];
1913 s->current_picture.f.motion_val[0][xy + wrap][1] = s->current_picture.f.motion_val[0][xy][1];
1914 s->current_picture.f.motion_val[0][xy + wrap + 1][0] = s->current_picture.f.motion_val[0][xy][0];
1915 s->current_picture.f.motion_val[0][xy + wrap + 1][1] = s->current_picture.f.motion_val[0][xy][1];
1916 } else if (mvn == 2) { /* duplicate motion data for 2-Field MV block */
1917 s->current_picture.f.motion_val[0][xy + 1][0] = s->current_picture.f.motion_val[0][xy][0];
1918 s->current_picture.f.motion_val[0][xy + 1][1] = s->current_picture.f.motion_val[0][xy][1];
1919 s->mv[0][n + 1][0] = s->mv[0][n][0];
1920 s->mv[0][n + 1][1] = s->mv[0][n][1];
1924 /** Motion compensation for direct or interpolated blocks in B-frames
1926 static void vc1_interp_mc(VC1Context *v)
1928 MpegEncContext *s = &v->s;
1929 DSPContext *dsp = &v->s.dsp;
1930 uint8_t *srcY, *srcU, *srcV;
1931 int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
1933 int v_edge_pos = s->v_edge_pos >> v->field_mode;
1935 if (!v->field_mode && !v->s.next_picture.f.data[0])
1938 mx = s->mv[1][0][0];
1939 my = s->mv[1][0][1];
1940 uvmx = (mx + ((mx & 3) == 3)) >> 1;
1941 uvmy = (my + ((my & 3) == 3)) >> 1;
1942 if (v->field_mode) {
1943 if (v->cur_field_type != v->ref_field_type[1])
1944 my = my - 2 + 4 * v->cur_field_type;
1945 uvmy = uvmy - 2 + 4 * v->cur_field_type;
1948 uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1));
1949 uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1));
1951 srcY = s->next_picture.f.data[0];
1952 srcU = s->next_picture.f.data[1];
1953 srcV = s->next_picture.f.data[2];
1955 src_x = s->mb_x * 16 + (mx >> 2);
1956 src_y = s->mb_y * 16 + (my >> 2);
1957 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
1958 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
1960 if(v->profile != PROFILE_ADVANCED){
1961 src_x = av_clip( src_x, -16, s->mb_width * 16);
1962 src_y = av_clip( src_y, -16, s->mb_height * 16);
1963 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
1964 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
1966 src_x = av_clip( src_x, -17, s->avctx->coded_width);
1967 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
1968 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
1969 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
1972 srcY += src_y * s->linesize + src_x;
1973 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
1974 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
1976 if (v->field_mode && v->ref_field_type[1]) {
1977 srcY += s->current_picture_ptr->f.linesize[0];
1978 srcU += s->current_picture_ptr->f.linesize[1];
1979 srcV += s->current_picture_ptr->f.linesize[2];
1982 /* for grayscale we should not try to read from unknown area */
1983 if(s->flags & CODEC_FLAG_GRAY) {
1984 srcU = s->edge_emu_buffer + 18 * s->linesize;
1985 srcV = s->edge_emu_buffer + 18 * s->linesize;
1989 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
1990 || (unsigned)(src_y - s->mspel) > v_edge_pos - (my&3) - 16 - s->mspel*3){
1991 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
1993 srcY -= s->mspel * (1 + s->linesize);
1994 s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
1995 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, v_edge_pos);
1996 srcY = s->edge_emu_buffer;
1997 s->dsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
1998 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1999 s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
2000 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
2003 /* if we deal with range reduction we need to scale source blocks */
2004 if(v->rangeredfrm) {
2006 uint8_t *src, *src2;
2009 for(j = 0; j < 17 + s->mspel*2; j++) {
2010 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
2013 src = srcU; src2 = srcV;
2014 for(j = 0; j < 9; j++) {
2015 for(i = 0; i < 9; i++) {
2016 src[i] = ((src[i] - 128) >> 1) + 128;
2017 src2[i] = ((src2[i] - 128) >> 1) + 128;
2019 src += s->uvlinesize;
2020 src2 += s->uvlinesize;
2023 srcY += s->mspel * (1 + s->linesize);
2026 if (v->field_mode && v->cur_field_type) {
2027 off = s->current_picture_ptr->f.linesize[0];
2028 off_uv = s->current_picture_ptr->f.linesize[1];
2035 dxy = ((my & 3) << 2) | (mx & 3);
2036 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
2037 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
2038 srcY += s->linesize * 8;
2039 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize , srcY , s->linesize, v->rnd);
2040 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
2042 dxy = (my & 2) | ((mx & 2) >> 1);
2045 dsp->avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
2047 dsp->avg_no_rnd_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
2050 if(s->flags & CODEC_FLAG_GRAY) return;
2051 /* Chroma MC always uses qpel blilinear */
2055 dsp->avg_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
2056 dsp->avg_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
2058 v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
2059 v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
2063 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
2067 #if B_FRACTION_DEN==256
2071 return 2 * ((value * n + 255) >> 9);
2072 return (value * n + 128) >> 8;
2075 n -= B_FRACTION_DEN;
2077 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
2078 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
2082 static av_always_inline int scale_mv_intfi(int value, int bfrac, int inv, int qs, int qs_last)
2090 return (value * n + 255) >> 9;
2092 return (value * n + 128) >> 8;
2095 /** Reconstruct motion vector for B-frame and do motion compensation
2097 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode)
2100 v->mv_mode2 = v->mv_mode;
2101 v->mv_mode = MV_PMODE_INTENSITY_COMP;
2106 if(v->use_ic) v->mv_mode = v->mv_mode2;
2109 if(mode == BMV_TYPE_INTERPOLATED) {
2112 if(v->use_ic) v->mv_mode = v->mv_mode2;
2116 if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2;
2117 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
2118 if(v->use_ic) v->mv_mode = v->mv_mode2;
2121 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype)
2123 MpegEncContext *s = &v->s;
2124 int xy, wrap, off = 0;
2129 const uint8_t *is_intra = v->mb_type[0];
2133 /* scale MV difference to be quad-pel */
2134 dmv_x[0] <<= 1 - s->quarter_sample;
2135 dmv_y[0] <<= 1 - s->quarter_sample;
2136 dmv_x[1] <<= 1 - s->quarter_sample;
2137 dmv_y[1] <<= 1 - s->quarter_sample;
2139 wrap = s->b8_stride;
2140 xy = s->block_index[0];
2143 s->current_picture.f.motion_val[0][xy + v->blocks_off][0] =
2144 s->current_picture.f.motion_val[0][xy + v->blocks_off][1] =
2145 s->current_picture.f.motion_val[1][xy + v->blocks_off][0] =
2146 s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = 0;
2149 if (!v->field_mode) {
2150 s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
2151 s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
2152 s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
2153 s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
2155 /* Pullback predicted motion vectors as specified in 8.4.5.4 */
2156 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));
2157 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));
2158 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));
2159 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));
2162 s->current_picture.f.motion_val[0][xy + v->blocks_off][0] = s->mv[0][0][0];
2163 s->current_picture.f.motion_val[0][xy + v->blocks_off][1] = s->mv[0][0][1];
2164 s->current_picture.f.motion_val[1][xy + v->blocks_off][0] = s->mv[1][0][0];
2165 s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = s->mv[1][0][1];
2169 if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2170 C = s->current_picture.f.motion_val[0][xy - 2];
2171 A = s->current_picture.f.motion_val[0][xy - wrap*2];
2172 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2173 B = s->current_picture.f.motion_val[0][xy - wrap*2 + off];
2175 if(!s->mb_x) C[0] = C[1] = 0;
2176 if(!s->first_slice_line) { // predictor A is not out of bounds
2177 if(s->mb_width == 1) {
2181 px = mid_pred(A[0], B[0], C[0]);
2182 py = mid_pred(A[1], B[1], C[1]);
2184 } else if(s->mb_x) { // predictor C is not out of bounds
2190 /* Pullback MV as specified in 8.3.5.3.4 */
2193 if(v->profile < PROFILE_ADVANCED) {
2194 qx = (s->mb_x << 5);
2195 qy = (s->mb_y << 5);
2196 X = (s->mb_width << 5) - 4;
2197 Y = (s->mb_height << 5) - 4;
2198 if(qx + px < -28) px = -28 - qx;
2199 if(qy + py < -28) py = -28 - qy;
2200 if(qx + px > X) px = X - qx;
2201 if(qy + py > Y) py = Y - qy;
2203 qx = (s->mb_x << 6);
2204 qy = (s->mb_y << 6);
2205 X = (s->mb_width << 6) - 4;
2206 Y = (s->mb_height << 6) - 4;
2207 if(qx + px < -60) px = -60 - qx;
2208 if(qy + py < -60) py = -60 - qy;
2209 if(qx + px > X) px = X - qx;
2210 if(qy + py > Y) py = Y - qy;
2213 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2214 if(0 && !s->first_slice_line && s->mb_x) {
2215 if(is_intra[xy - wrap])
2216 sum = FFABS(px) + FFABS(py);
2218 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2220 if(get_bits1(&s->gb)) {
2228 if(is_intra[xy - 2])
2229 sum = FFABS(px) + FFABS(py);
2231 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2233 if(get_bits1(&s->gb)) {
2243 /* store MV using signed modulus of MV range defined in 4.11 */
2244 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
2245 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
2247 if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2248 C = s->current_picture.f.motion_val[1][xy - 2];
2249 A = s->current_picture.f.motion_val[1][xy - wrap*2];
2250 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2251 B = s->current_picture.f.motion_val[1][xy - wrap*2 + off];
2253 if(!s->mb_x) C[0] = C[1] = 0;
2254 if(!s->first_slice_line) { // predictor A is not out of bounds
2255 if(s->mb_width == 1) {
2259 px = mid_pred(A[0], B[0], C[0]);
2260 py = mid_pred(A[1], B[1], C[1]);
2262 } else if(s->mb_x) { // predictor C is not out of bounds
2268 /* Pullback MV as specified in 8.3.5.3.4 */
2271 if(v->profile < PROFILE_ADVANCED) {
2272 qx = (s->mb_x << 5);
2273 qy = (s->mb_y << 5);
2274 X = (s->mb_width << 5) - 4;
2275 Y = (s->mb_height << 5) - 4;
2276 if(qx + px < -28) px = -28 - qx;
2277 if(qy + py < -28) py = -28 - qy;
2278 if(qx + px > X) px = X - qx;
2279 if(qy + py > Y) py = Y - qy;
2281 qx = (s->mb_x << 6);
2282 qy = (s->mb_y << 6);
2283 X = (s->mb_width << 6) - 4;
2284 Y = (s->mb_height << 6) - 4;
2285 if(qx + px < -60) px = -60 - qx;
2286 if(qy + py < -60) py = -60 - qy;
2287 if(qx + px > X) px = X - qx;
2288 if(qy + py > Y) py = Y - qy;
2291 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2292 if(0 && !s->first_slice_line && s->mb_x) {
2293 if(is_intra[xy - wrap])
2294 sum = FFABS(px) + FFABS(py);
2296 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2298 if(get_bits1(&s->gb)) {
2306 if(is_intra[xy - 2])
2307 sum = FFABS(px) + FFABS(py);
2309 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2311 if(get_bits1(&s->gb)) {
2321 /* store MV using signed modulus of MV range defined in 4.11 */
2323 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
2324 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
2326 s->current_picture.f.motion_val[0][xy][0] = s->mv[0][0][0];
2327 s->current_picture.f.motion_val[0][xy][1] = s->mv[0][0][1];
2328 s->current_picture.f.motion_val[1][xy][0] = s->mv[1][0][0];
2329 s->current_picture.f.motion_val[1][xy][1] = s->mv[1][0][1];
2332 static inline void vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, int mv1, int *pred_flag)
2334 int dir = (v->bmvtype == BMV_TYPE_BACKWARD) ? 1 : 0;
2335 MpegEncContext *s = &v->s;
2336 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2338 if (v->bmvtype == BMV_TYPE_DIRECT) {
2339 int total_opp, k, f;
2340 if (s->next_picture.f.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) {
2341 s->mv[0][0][0] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0], v->bfraction, 0, s->quarter_sample, v->qs_last);
2342 s->mv[0][0][1] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1], v->bfraction, 0, s->quarter_sample, v->qs_last);
2343 s->mv[1][0][0] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0], v->bfraction, 1, s->quarter_sample, v->qs_last);
2344 s->mv[1][0][1] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1], v->bfraction, 1, s->quarter_sample, v->qs_last);
2346 total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
2347 + v->mv_f_next[0][s->block_index[1] + v->blocks_off]
2348 + v->mv_f_next[0][s->block_index[2] + v->blocks_off]
2349 + v->mv_f_next[0][s->block_index[3] + v->blocks_off];
2350 f = (total_opp > 2) ? 1 : 0;
2352 s->mv[0][0][0] = s->mv[0][0][1] = 0;
2353 s->mv[1][0][0] = s->mv[1][0][1] = 0;
2356 v->ref_field_type[0] = v->ref_field_type[1] = v->cur_field_type ^ f;
2357 for (k = 0; k < 4; k++) {
2358 s->current_picture.f.motion_val[0][s->block_index[k] + v->blocks_off][0] = s->mv[0][0][0];
2359 s->current_picture.f.motion_val[0][s->block_index[k] + v->blocks_off][1] = s->mv[0][0][1];
2360 s->current_picture.f.motion_val[1][s->block_index[k] + v->blocks_off][0] = s->mv[1][0][0];
2361 s->current_picture.f.motion_val[1][s->block_index[k] + v->blocks_off][1] = s->mv[1][0][1];
2362 v->mv_f[0][s->block_index[k] + v->blocks_off] = f;
2363 v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
2367 if (v->bmvtype == BMV_TYPE_INTERPOLATED) {
2368 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);
2369 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);
2372 if (dir) { // backward
2373 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);
2374 if (n == 3 || mv1) {
2375 vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0], 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
2378 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);
2379 if (n == 3 || mv1) {
2380 vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1], 1, v->range_x, v->range_y, v->mb_type[0], 0, 1);
2385 /** Get predicted DC value for I-frames only
2386 * prediction dir: left=0, top=1
2387 * @param s MpegEncContext
2388 * @param overlap flag indicating that overlap filtering is used
2389 * @param pq integer part of picture quantizer
2390 * @param[in] n block index in the current MB
2391 * @param dc_val_ptr Pointer to DC predictor
2392 * @param dir_ptr Prediction direction for use in AC prediction
2394 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2395 int16_t **dc_val_ptr, int *dir_ptr)
2397 int a, b, c, wrap, pred, scale;
2399 static const uint16_t dcpred[32] = {
2400 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
2401 114, 102, 93, 85, 79, 73, 68, 64,
2402 60, 57, 54, 51, 49, 47, 45, 43,
2403 41, 39, 38, 37, 35, 34, 33
2406 /* find prediction - wmv3_dc_scale always used here in fact */
2407 if (n < 4) scale = s->y_dc_scale;
2408 else scale = s->c_dc_scale;
2410 wrap = s->block_wrap[n];
2411 dc_val= s->dc_val[0] + s->block_index[n];
2417 b = dc_val[ - 1 - wrap];
2418 a = dc_val[ - wrap];
2420 if (pq < 9 || !overlap)
2422 /* Set outer values */
2423 if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
2424 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
2428 /* Set outer values */
2429 if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
2430 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
2433 if (abs(a - b) <= abs(b - c)) {
2441 /* update predictor */
2442 *dc_val_ptr = &dc_val[0];
2447 /** Get predicted DC value
2448 * prediction dir: left=0, top=1
2449 * @param s MpegEncContext
2450 * @param overlap flag indicating that overlap filtering is used
2451 * @param pq integer part of picture quantizer
2452 * @param[in] n block index in the current MB
2453 * @param a_avail flag indicating top block availability
2454 * @param c_avail flag indicating left block availability
2455 * @param dc_val_ptr Pointer to DC predictor
2456 * @param dir_ptr Prediction direction for use in AC prediction
2458 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2459 int a_avail, int c_avail,
2460 int16_t **dc_val_ptr, int *dir_ptr)
2462 int a, b, c, wrap, pred;
2464 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2467 wrap = s->block_wrap[n];
2468 dc_val= s->dc_val[0] + s->block_index[n];
2474 b = dc_val[ - 1 - wrap];
2475 a = dc_val[ - wrap];
2476 /* scale predictors if needed */
2477 q1 = s->current_picture.f.qscale_table[mb_pos];
2478 if(c_avail && (n!= 1 && n!=3)) {
2479 q2 = s->current_picture.f.qscale_table[mb_pos - 1];
2481 c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2483 if(a_avail && (n!= 2 && n!=3)) {
2484 q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
2486 a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2488 if(a_avail && c_avail && (n!=3)) {
2491 if(n != 2) off -= s->mb_stride;
2492 q2 = s->current_picture.f.qscale_table[off];
2494 b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2497 if(a_avail && c_avail) {
2498 if(abs(a - b) <= abs(b - c)) {
2505 } else if(a_avail) {
2508 } else if(c_avail) {
2516 /* update predictor */
2517 *dc_val_ptr = &dc_val[0];
2521 /** @} */ // Block group
2524 * @name VC1 Macroblock-level functions in Simple/Main Profiles
2525 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2529 static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
2531 int xy, wrap, pred, a, b, c;
2533 xy = s->block_index[n];
2534 wrap = s->b8_stride;
2539 a = s->coded_block[xy - 1 ];
2540 b = s->coded_block[xy - 1 - wrap];
2541 c = s->coded_block[xy - wrap];
2550 *coded_block_ptr = &s->coded_block[xy];
2556 * Decode one AC coefficient
2557 * @param v The VC1 context
2558 * @param last Last coefficient
2559 * @param skip How much zero coefficients to skip
2560 * @param value Decoded AC coefficient value
2561 * @param codingset set of VLC to decode data
2564 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
2566 GetBitContext *gb = &v->s.gb;
2567 int index, escape, run = 0, level = 0, lst = 0;
2569 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2570 if (index != 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;
2577 escape = decode210(gb);
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];
2585 level += vc1_last_delta_level_table[codingset][run];
2587 level += vc1_delta_level_table[codingset][run];
2590 run += vc1_last_delta_run_table[codingset][level] + 1;
2592 run += vc1_delta_run_table[codingset][level] + 1;
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;
2605 v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
2607 v->s.esc3_run_length = 3 + get_bits(gb, 2);
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);
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
2629 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
2631 GetBitContext *gb = &v->s.gb;
2632 MpegEncContext *s = &v->s;
2633 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2636 int16_t *ac_val, *ac_val2;
2639 /* Get DC differential */
2641 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2643 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2646 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2651 if (dcdiff == 119 /* ESC index value */)
2653 /* TODO: Optimize */
2654 if (v->pq == 1) dcdiff = get_bits(gb, 10);
2655 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
2656 else dcdiff = get_bits(gb, 8);
2661 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2662 else if (v->pq == 2)
2663 dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
2670 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2673 /* Store the quantized DC coeff, used for prediction */
2675 block[0] = dcdiff * s->y_dc_scale;
2677 block[0] = dcdiff * s->c_dc_scale;
2688 int last = 0, skip, value;
2689 const uint8_t *zz_table;
2693 scale = v->pq * 2 + v->halfpq;
2697 zz_table = v->zz_8x8[2];
2699 zz_table = v->zz_8x8[3];
2701 zz_table = v->zz_8x8[1];
2703 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2705 if(dc_pred_dir) //left
2708 ac_val -= 16 * s->block_wrap[n];
2711 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2715 block[zz_table[i++]] = value;
2718 /* apply AC prediction if needed */
2720 if(dc_pred_dir) { //left
2721 for(k = 1; k < 8; k++)
2722 block[k << v->left_blk_sh] += ac_val[k];
2724 for(k = 1; k < 8; k++)
2725 block[k << v->top_blk_sh] += ac_val[k + 8];
2728 /* save AC coeffs for further prediction */
2729 for(k = 1; k < 8; k++) {
2730 ac_val2[k] = block[k << v->left_blk_sh];
2731 ac_val2[k + 8] = block[k << v->top_blk_sh];
2734 /* scale AC coeffs */
2735 for(k = 1; k < 64; k++)
2739 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2742 if(s->ac_pred) i = 63;
2748 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2752 scale = v->pq * 2 + v->halfpq;
2753 memset(ac_val2, 0, 16 * 2);
2754 if(dc_pred_dir) {//left
2757 memcpy(ac_val2, ac_val, 8 * 2);
2759 ac_val -= 16 * s->block_wrap[n];
2761 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2764 /* apply AC prediction if needed */
2766 if(dc_pred_dir) { //left
2767 for(k = 1; k < 8; k++) {
2768 block[k << v->left_blk_sh] = ac_val[k] * scale;
2769 if(!v->pquantizer && block[k << v->left_blk_sh])
2770 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
2773 for(k = 1; k < 8; k++) {
2774 block[k << v->top_blk_sh] = ac_val[k + 8] * scale;
2775 if(!v->pquantizer && block[k << v->top_blk_sh])
2776 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq;
2782 s->block_last_index[n] = i;
2787 /** Decode intra block in intra frames - should be faster than decode_intra_block
2788 * @param v VC1Context
2789 * @param block block to decode
2790 * @param[in] n subblock number
2791 * @param coded are AC coeffs present or not
2792 * @param codingset set of VLC to decode data
2793 * @param mquant quantizer value for this macroblock
2795 static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant)
2797 GetBitContext *gb = &v->s.gb;
2798 MpegEncContext *s = &v->s;
2799 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2802 int16_t *ac_val, *ac_val2;
2804 int a_avail = v->a_avail, c_avail = v->c_avail;
2805 int use_pred = s->ac_pred;
2808 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2810 /* Get DC differential */
2812 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2814 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2817 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2822 if (dcdiff == 119 /* ESC index value */)
2824 /* TODO: Optimize */
2825 if (mquant == 1) dcdiff = get_bits(gb, 10);
2826 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2827 else dcdiff = get_bits(gb, 8);
2832 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2833 else if (mquant == 2)
2834 dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
2841 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2844 /* Store the quantized DC coeff, used for prediction */
2846 block[0] = dcdiff * s->y_dc_scale;
2848 block[0] = dcdiff * s->c_dc_scale;
2854 /* check if AC is needed at all */
2855 if(!a_avail && !c_avail) use_pred = 0;
2856 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2859 scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
2861 if(dc_pred_dir) //left
2864 ac_val -= 16 * s->block_wrap[n];
2866 q1 = s->current_picture.f.qscale_table[mb_pos];
2867 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.f.qscale_table[mb_pos - 1];
2868 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
2869 if(dc_pred_dir && n==1) q2 = q1;
2870 if(!dc_pred_dir && n==2) q2 = q1;
2874 int last = 0, skip, value;
2875 const uint8_t *zz_table;
2879 if (!use_pred && v->fcm == 1) {
2880 zz_table = v->zzi_8x8;
2882 if(!dc_pred_dir) //top
2883 zz_table = v->zz_8x8[2];
2885 zz_table = v->zz_8x8[3];
2889 zz_table = v->zz_8x8[1];
2891 zz_table = v->zzi_8x8;
2895 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2899 block[zz_table[i++]] = value;
2902 /* apply AC prediction if needed */
2904 /* scale predictors if needed*/
2906 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2907 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2909 if(dc_pred_dir) { //left
2910 for(k = 1; k < 8; k++)
2911 block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2913 for(k = 1; k < 8; k++)
2914 block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2917 if(dc_pred_dir) { //left
2918 for(k = 1; k < 8; k++)
2919 block[k << v->left_blk_sh] += ac_val[k];
2921 for(k = 1; k < 8; k++)
2922 block[k << v->top_blk_sh] += ac_val[k + 8];
2926 /* save AC coeffs for further prediction */
2927 for(k = 1; k < 8; k++) {
2928 ac_val2[k ] = block[k << v->left_blk_sh];
2929 ac_val2[k + 8] = block[k << v->top_blk_sh];
2932 /* scale AC coeffs */
2933 for(k = 1; k < 64; k++)
2937 block[k] += (block[k] < 0) ? -mquant : mquant;
2940 if(use_pred) i = 63;
2941 } else { // no AC coeffs
2944 memset(ac_val2, 0, 16 * 2);
2945 if(dc_pred_dir) {//left
2947 memcpy(ac_val2, ac_val, 8 * 2);
2949 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2950 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2951 for(k = 1; k < 8; k++)
2952 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2957 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2959 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2960 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2961 for(k = 1; k < 8; k++)
2962 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2967 /* apply AC prediction if needed */
2969 if(dc_pred_dir) { //left
2970 for(k = 1; k < 8; k++) {
2971 block[k << v->left_blk_sh] = ac_val2[k] * scale;
2972 if(!v->pquantizer && block[k << v->left_blk_sh])
2973 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
2976 for(k = 1; k < 8; k++) {
2977 block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
2978 if(!v->pquantizer && block[k << v->top_blk_sh])
2979 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
2985 s->block_last_index[n] = i;
2990 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
2991 * @param v VC1Context
2992 * @param block block to decode
2993 * @param[in] n subblock index
2994 * @param coded are AC coeffs present or not
2995 * @param mquant block quantizer
2996 * @param codingset set of VLC to decode data
2998 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
3000 GetBitContext *gb = &v->s.gb;
3001 MpegEncContext *s = &v->s;
3002 int dc_pred_dir = 0; /* Direction of the DC prediction used */
3005 int16_t *ac_val, *ac_val2;
3007 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3008 int a_avail = v->a_avail, c_avail = v->c_avail;
3009 int use_pred = s->ac_pred;
3013 s->dsp.clear_block(block);
3015 /* XXX: Guard against dumb values of mquant */
3016 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
3018 /* Set DC scale - y and c use the same */
3019 s->y_dc_scale = s->y_dc_scale_table[mquant];
3020 s->c_dc_scale = s->c_dc_scale_table[mquant];
3022 /* Get DC differential */
3024 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3026 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3029 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
3034 if (dcdiff == 119 /* ESC index value */)
3036 /* TODO: Optimize */
3037 if (mquant == 1) dcdiff = get_bits(gb, 10);
3038 else if (mquant == 2) dcdiff = get_bits(gb, 9);
3039 else dcdiff = get_bits(gb, 8);
3044 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
3045 else if (mquant == 2)
3046 dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
3053 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
3056 /* Store the quantized DC coeff, used for prediction */
3059 block[0] = dcdiff * s->y_dc_scale;
3061 block[0] = dcdiff * s->c_dc_scale;
3067 /* check if AC is needed at all and adjust direction if needed */
3068 if(!a_avail) dc_pred_dir = 1;
3069 if(!c_avail) dc_pred_dir = 0;
3070 if(!a_avail && !c_avail) use_pred = 0;
3071 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
3074 scale = mquant * 2 + v->halfpq;
3076 if(dc_pred_dir) //left
3079 ac_val -= 16 * s->block_wrap[n];
3081 q1 = s->current_picture.f.qscale_table[mb_pos];
3082 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.f.qscale_table[mb_pos - 1];
3083 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
3084 if(dc_pred_dir && n==1) q2 = q1;
3085 if(!dc_pred_dir && n==2) q2 = q1;
3089 int last = 0, skip, value;
3093 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
3098 block[v->zz_8x8[0][i++]] = value;
3100 if(use_pred && (v->fcm == 1)) {
3101 if(!dc_pred_dir) //top
3102 block[v->zz_8x8[2][i++]] = value;
3104 block[v->zz_8x8[3][i++]] = value;
3106 block[v->zzi_8x8[i++]] = value;
3111 /* apply AC prediction if needed */
3113 /* scale predictors if needed*/
3115 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3116 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3118 if(dc_pred_dir) { //left
3119 for(k = 1; k < 8; k++)
3120 block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3122 for(k = 1; k < 8; k++)
3123 block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3126 if(dc_pred_dir) { //left
3127 for(k = 1; k < 8; k++)
3128 block[k << v->left_blk_sh] += ac_val[k];
3130 for(k = 1; k < 8; k++)
3131 block[k << v->top_blk_sh] += ac_val[k + 8];
3135 /* save AC coeffs for further prediction */
3136 for(k = 1; k < 8; k++) {
3137 ac_val2[k ] = block[k << v->left_blk_sh];
3138 ac_val2[k + 8] = block[k << v->top_blk_sh];
3141 /* scale AC coeffs */
3142 for(k = 1; k < 64; k++)
3146 block[k] += (block[k] < 0) ? -mquant : mquant;
3149 if(use_pred) i = 63;
3150 } else { // no AC coeffs
3153 memset(ac_val2, 0, 16 * 2);
3154 if(dc_pred_dir) {//left
3156 memcpy(ac_val2, ac_val, 8 * 2);
3158 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3159 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3160 for(k = 1; k < 8; k++)
3161 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3166 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
3168 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3169 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3170 for(k = 1; k < 8; k++)
3171 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3176 /* apply AC prediction if needed */
3178 if(dc_pred_dir) { //left
3179 for(k = 1; k < 8; k++) {
3180 block[k << v->left_blk_sh] = ac_val2[k] * scale;
3181 if(!v->pquantizer && block[k << v->left_blk_sh])
3182 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
3185 for(k = 1; k < 8; k++) {
3186 block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
3187 if(!v->pquantizer && block[k << v->top_blk_sh])
3188 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
3194 s->block_last_index[n] = i;
3201 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block,
3202 uint8_t *dst, int linesize, int skip_block, int *ttmb_out)
3204 MpegEncContext *s = &v->s;
3205 GetBitContext *gb = &s->gb;
3208 int scale, off, idx, last, skip, value;
3209 int ttblk = ttmb & 7;
3212 s->dsp.clear_block(block);
3215 ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
3217 if(ttblk == TT_4X4) {
3218 subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
3220 if((ttblk != TT_8X8 && ttblk != TT_4X4)
3221 && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
3222 || (!v->res_rtm_flag && !first_block))) {
3223 subblkpat = decode012(gb);
3224 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
3225 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
3226 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
3228 scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
3230 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
3231 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
3232 subblkpat = 2 - (ttblk == TT_8X4_TOP);
3235 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3236 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3245 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3250 idx = v->zz_8x8[0][i++];
3252 idx = v->zzi_8x8[i++];
3253 block[idx] = value * scale;
3255 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3259 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
3261 v->vc1dsp.vc1_inv_trans_8x8(block);
3262 s->dsp.add_pixels_clamped(block, dst, linesize);
3267 pat = ~subblkpat & 0xF;
3268 for(j = 0; j < 4; j++) {
3269 last = subblkpat & (1 << (3 - j));
3271 off = (j & 1) * 4 + (j & 2) * 16;
3273 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3278 idx = ff_vc1_simple_progressive_4x4_zz[i++];
3280 idx = ff_vc1_adv_interlaced_4x4_zz[i++];
3281 block[idx + off] = value * scale;
3283 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3285 if(!(subblkpat & (1 << (3 - j))) && !skip_block){
3287 v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
3289 v->vc1dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
3294 pat = ~((subblkpat & 2)*6 + (subblkpat & 1)*3) & 0xF;
3295 for(j = 0; j < 2; j++) {
3296 last = subblkpat & (1 << (1 - j));
3300 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3305 idx = v->zz_8x4[i++] + off;
3307 idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
3308 block[idx] = value * scale;
3310 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3312 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
3314 v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j*4*linesize, linesize, block + off);
3316 v->vc1dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
3321 pat = ~(subblkpat*5) & 0xF;
3322 for(j = 0; j < 2; j++) {
3323 last = subblkpat & (1 << (1 - j));
3327 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3332 idx = v->zz_4x8[i++] + off;
3334 idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
3335 block[idx] = value * scale;
3337 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3339 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
3341 v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j*4, linesize, block + off);
3343 v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
3349 *ttmb_out |= ttblk << (n * 4);
3353 /** @} */ // Macroblock group
3355 static const int size_table [6] = { 0, 2, 3, 4, 5, 8 };
3356 static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3358 static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
3360 MpegEncContext *s = &v->s;
3361 int mb_cbp = v->cbp[s->mb_x - s->mb_stride],
3362 block_cbp = mb_cbp >> (block_num * 4), bottom_cbp,
3363 mb_is_intra = v->is_intra[s->mb_x - s->mb_stride],
3364 block_is_intra = mb_is_intra >> (block_num * 4), bottom_is_intra;
3365 int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
3369 dst = s->dest[block_num - 3];
3371 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
3373 if (s->mb_y != s->end_mb_y || block_num < 2) {
3378 bottom_cbp = v->cbp[s->mb_x] >> (block_num * 4);
3379 bottom_is_intra = v->is_intra[s->mb_x] >> (block_num * 4);
3380 mv = &v->luma_mv[s->mb_x - s->mb_stride];
3381 mv_stride = s->mb_stride;
3383 bottom_cbp = (block_num < 2) ? (mb_cbp >> ((block_num + 2) * 4)) :
3384 (v->cbp[s->mb_x] >> ((block_num - 2) * 4));
3385 bottom_is_intra = (block_num < 2) ? (mb_is_intra >> ((block_num + 2) * 4)) :
3386 (v->is_intra[s->mb_x] >> ((block_num - 2) * 4));
3387 mv_stride = s->b8_stride;
3388 mv = &s->current_picture.f.motion_val[0][s->block_index[block_num] - 2 * mv_stride];
3391 if (bottom_is_intra & 1 || block_is_intra & 1 ||
3392 mv[0][0] != mv[mv_stride][0] || mv[0][1] != mv[mv_stride][1]) {
3393 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3395 idx = ((bottom_cbp >> 2) | block_cbp) & 3;
3397 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3400 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3402 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
3407 dst -= 4 * linesize;
3408 ttblk = (v->ttblk[s->mb_x - s->mb_stride] >> (block_num * 4)) & 0xf;
3409 if (ttblk == TT_4X4 || ttblk == TT_8X4) {
3410 idx = (block_cbp | (block_cbp >> 2)) & 3;
3412 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
3415 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
3417 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
3422 static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
3424 MpegEncContext *s = &v->s;
3425 int mb_cbp = v->cbp[s->mb_x - 1 - s->mb_stride],
3426 block_cbp = mb_cbp >> (block_num * 4), right_cbp,
3427 mb_is_intra = v->is_intra[s->mb_x - 1 - s->mb_stride],
3428 block_is_intra = mb_is_intra >> (block_num * 4), right_is_intra;
3429 int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
3432 if (block_num > 3) {
3433 dst = s->dest[block_num - 3] - 8 * linesize;
3435 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
3438 if (s->mb_x != s->mb_width || !(block_num & 5)) {
3442 right_cbp = v->cbp[s->mb_x - s->mb_stride] >> (block_num * 4);
3443 right_is_intra = v->is_intra[s->mb_x - s->mb_stride] >> (block_num * 4);
3444 mv = &v->luma_mv[s->mb_x - s->mb_stride - 1];
3446 right_cbp = (block_num & 1) ? (v->cbp[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4)) :
3447 (mb_cbp >> ((block_num + 1) * 4));
3448 right_is_intra = (block_num & 1) ? (v->is_intra[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4)) :
3449 (mb_is_intra >> ((block_num + 1) * 4));
3450 mv = &s->current_picture.f.motion_val[0][s->block_index[block_num] - s->b8_stride * 2 - 2];
3452 if (block_is_intra & 1 || right_is_intra & 1 || mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1]) {
3453 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3455 idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
3457 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3460 v->vc1dsp.vc1_h_loop_filter4(dst+4*linesize, linesize, v->pq);
3462 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
3468 ttblk = (v->ttblk[s->mb_x - s->mb_stride - 1] >> (block_num * 4)) & 0xf;
3469 if (ttblk == TT_4X4 || ttblk == TT_4X8) {
3470 idx = (block_cbp | (block_cbp >> 1)) & 5;
3472 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
3475 v->vc1dsp.vc1_h_loop_filter4(dst + linesize*4, linesize, v->pq);
3477 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
3482 static void vc1_apply_p_loop_filter(VC1Context *v)
3484 MpegEncContext *s = &v->s;
3487 for (i = 0; i < 6; i++) {
3488 vc1_apply_p_v_loop_filter(v, i);
3491 /* V always preceedes H, therefore we run H one MB before V;
3492 * at the end of a row, we catch up to complete the row */
3494 for (i = 0; i < 6; i++) {
3495 vc1_apply_p_h_loop_filter(v, i);
3497 if (s->mb_x == s->mb_width - 1) {
3499 ff_update_block_index(s);
3500 for (i = 0; i < 6; i++) {
3501 vc1_apply_p_h_loop_filter(v, i);
3507 /** Decode one P-frame MB
3509 static int vc1_decode_p_mb(VC1Context *v)
3511 MpegEncContext *s = &v->s;
3512 GetBitContext *gb = &s->gb;
3514 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3515 int cbp; /* cbp decoding stuff */
3516 int mqdiff, mquant; /* MB quantization */
3517 int ttmb = v->ttfrm; /* MB Transform type */
3519 int mb_has_coeffs = 1; /* last_flag */
3520 int dmv_x, dmv_y; /* Differential MV components */
3521 int index, index1; /* LUT indexes */
3522 int val, sign; /* temp values */
3523 int first_block = 1;
3525 int skipped, fourmv;
3526 int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
3528 mquant = v->pq; /* Loosy initialization */
3530 if (v->mv_type_is_raw)
3531 fourmv = get_bits1(gb);
3533 fourmv = v->mv_type_mb_plane[mb_pos];
3535 skipped = get_bits1(gb);
3537 skipped = v->s.mbskip_table[mb_pos];
3539 if (!fourmv) /* 1MV mode */
3543 GET_MVDATA(dmv_x, dmv_y);
3546 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
3547 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
3549 s->current_picture.f.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
3550 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3552 /* FIXME Set DC val for inter block ? */
3553 if (s->mb_intra && !mb_has_coeffs)
3556 s->ac_pred = get_bits1(gb);
3559 else if (mb_has_coeffs)
3562 s->ac_pred = get_bits1(gb);
3563 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3571 s->current_picture.f.qscale_table[mb_pos] = mquant;
3573 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3574 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
3575 VC1_TTMB_VLC_BITS, 2);
3576 if(!s->mb_intra) vc1_mc_1mv(v, 0);
3580 s->dc_val[0][s->block_index[i]] = 0;
3582 val = ((cbp >> (5 - i)) & 1);
3583 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3584 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3586 /* check if prediction blocks A and C are available */
3587 v->a_avail = v->c_avail = 0;
3588 if(i == 2 || i == 3 || !s->first_slice_line)
3589 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3590 if(i == 1 || i == 3 || s->mb_x)
3591 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3593 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3594 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3595 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3596 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3597 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3598 if(v->pq >= 9 && v->overlap) {
3600 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3602 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3604 block_cbp |= 0xF << (i << 2);
3605 block_intra |= 1 << i;
3607 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3608 block_cbp |= pat << (i << 2);
3609 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3617 for(i = 0; i < 6; i++) {
3618 v->mb_type[0][s->block_index[i]] = 0;
3619 s->dc_val[0][s->block_index[i]] = 0;
3621 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_SKIP;
3622 s->current_picture.f.qscale_table[mb_pos] = 0;
3623 vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3629 if (!skipped /* unskipped MB */)
3631 int intra_count = 0, coded_inter = 0;
3632 int is_intra[6], is_coded[6];
3634 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3637 val = ((cbp >> (5 - i)) & 1);
3638 s->dc_val[0][s->block_index[i]] = 0;
3645 GET_MVDATA(dmv_x, dmv_y);
3647 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3648 if(!s->mb_intra) vc1_mc_4mv_luma(v, i, 0);
3649 intra_count += s->mb_intra;
3650 is_intra[i] = s->mb_intra;
3651 is_coded[i] = mb_has_coeffs;
3654 is_intra[i] = (intra_count >= 3);
3657 if(i == 4) vc1_mc_4mv_chroma(v, 0);
3658 v->mb_type[0][s->block_index[i]] = is_intra[i];
3659 if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
3661 // if there are no coded blocks then don't do anything more
3663 if(!intra_count && !coded_inter)
3666 s->current_picture.f.qscale_table[mb_pos] = mquant;
3667 /* test if block is intra and has pred */
3672 if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
3673 || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
3678 if(intrapred)s->ac_pred = get_bits1(gb);
3679 else s->ac_pred = 0;
3681 if (!v->ttmbf && coded_inter)
3682 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3686 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3687 s->mb_intra = is_intra[i];
3689 /* check if prediction blocks A and C are available */
3690 v->a_avail = v->c_avail = 0;
3691 if(i == 2 || i == 3 || !s->first_slice_line)
3692 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3693 if(i == 1 || i == 3 || s->mb_x)
3694 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3696 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
3697 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3698 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3699 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3700 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3701 if(v->pq >= 9 && v->overlap) {
3703 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3705 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3707 block_cbp |= 0xF << (i << 2);
3708 block_intra |= 1 << i;
3709 } else if(is_coded[i]) {
3710 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3711 block_cbp |= pat << (i << 2);
3712 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3720 s->current_picture.f.qscale_table[mb_pos] = 0;
3721 for (i=0; i<6; i++) {
3722 v->mb_type[0][s->block_index[i]] = 0;
3723 s->dc_val[0][s->block_index[i]] = 0;
3727 vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
3728 vc1_mc_4mv_luma(v, i, 0);
3730 vc1_mc_4mv_chroma(v, 0);
3731 s->current_picture.f.qscale_table[mb_pos] = 0;
3735 v->cbp[s->mb_x] = block_cbp;
3736 v->ttblk[s->mb_x] = block_tt;
3737 v->is_intra[s->mb_x] = block_intra;
3742 /* Decode one macroblock in an interlaced frame p picture */
3744 static int vc1_decode_p_mb_intfr(VC1Context *v)
3746 MpegEncContext *s = &v->s;
3747 GetBitContext *gb = &s->gb;
3749 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3750 int cbp = 0; /* cbp decoding stuff */
3751 int mqdiff, mquant; /* MB quantization */
3752 int ttmb = v->ttfrm; /* MB Transform type */
3754 int mb_has_coeffs = 1; /* last_flag */
3755 int dmv_x, dmv_y; /* Differential MV components */
3756 int val; /* temp value */
3757 int first_block = 1;
3759 int skipped, fourmv = 0, twomv = 0;
3760 int block_cbp = 0, pat, block_tt = 0;
3761 int idx_mbmode = 0, mvbp;
3762 int stride_y, fieldtx;
3764 mquant = v->pq; /* Loosy initialization */
3767 skipped = get_bits1(gb);
3769 skipped = v->s.mbskip_table[mb_pos];
3771 if (v->fourmvswitch)
3772 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done
3774 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line
3775 switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
3776 /* store the motion vector type in a flag (useful later) */
3777 case MV_PMODE_INTFR_4MV:
3779 v->blk_mv_type[s->block_index[0]] = 0;
3780 v->blk_mv_type[s->block_index[1]] = 0;
3781 v->blk_mv_type[s->block_index[2]] = 0;
3782 v->blk_mv_type[s->block_index[3]] = 0;
3784 case MV_PMODE_INTFR_4MV_FIELD:
3786 v->blk_mv_type[s->block_index[0]] = 1;
3787 v->blk_mv_type[s->block_index[1]] = 1;
3788 v->blk_mv_type[s->block_index[2]] = 1;
3789 v->blk_mv_type[s->block_index[3]] = 1;
3791 case MV_PMODE_INTFR_2MV_FIELD:
3793 v->blk_mv_type[s->block_index[0]] = 1;
3794 v->blk_mv_type[s->block_index[1]] = 1;
3795 v->blk_mv_type[s->block_index[2]] = 1;
3796 v->blk_mv_type[s->block_index[3]] = 1;
3798 case MV_PMODE_INTFR_1MV:
3799 v->blk_mv_type[s->block_index[0]] = 0;
3800 v->blk_mv_type[s->block_index[1]] = 0;
3801 v->blk_mv_type[s->block_index[2]] = 0;
3802 v->blk_mv_type[s->block_index[3]] = 0;
3805 if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
3806 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
3807 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
3808 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_INTRA;
3809 s->mb_intra = v->is_intra[s->mb_x] = 1;
3810 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 1;
3811 fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
3812 mb_has_coeffs = get_bits1(gb);
3814 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3815 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
3817 s->current_picture.f.qscale_table[mb_pos] = mquant;
3818 /* Set DC scale - y and c use the same (not sure if necessary here) */
3819 s->y_dc_scale = s->y_dc_scale_table[mquant];
3820 s->c_dc_scale = s->c_dc_scale_table[mquant];
3822 for (i=0; i<6; i++) {
3823 s->dc_val[0][s->block_index[i]] = 0;
3825 val = ((cbp >> (5 - i)) & 1);
3826 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3827 v->a_avail = v->c_avail = 0;
3828 if(i == 2 || i == 3 || !s->first_slice_line)
3829 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3830 if(i == 1 || i == 3 || s->mb_x)
3831 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3833 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3834 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3835 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3837 stride_y = s->linesize << fieldtx;
3838 off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
3840 stride_y = s->uvlinesize;
3843 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
3848 mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
3850 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3851 if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
3852 v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
3854 if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV)
3855 || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) {
3856 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
3859 s->mb_intra = v->is_intra[s->mb_x] = 0;
3860 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
3861 fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1];
3862 /* for all motion vector read MVDATA and motion compensate each block */
3866 for (i=0; i<6; i++) {
3869 val = ((mvbp >> (3 - i)) & 1);
3871 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3873 vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
3874 vc1_mc_4mv_luma(v, i, 0);
3875 } else if (i == 4) {
3876 vc1_mc_4mv_chroma4(v);
3883 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3885 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0]);
3886 vc1_mc_4mv_luma(v, 0, 0);
3887 vc1_mc_4mv_luma(v, 1, 0);
3890 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3892 vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0]);
3893 vc1_mc_4mv_luma(v, 2, 0);
3894 vc1_mc_4mv_luma(v, 3, 0);
3895 vc1_mc_4mv_chroma4(v);
3897 mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
3899 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
3901 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
3905 GET_MQUANT(); // p. 227
3906 s->current_picture.f.qscale_table[mb_pos] = mquant;
3907 if (!v->ttmbf && cbp)
3908 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3909 for (i=0; i<6; i++) {
3910 s->dc_val[0][s->block_index[i]] = 0;
3912 val = ((cbp >> (5 - i)) & 1);
3914 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3916 off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
3918 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:(s->linesize << fieldtx), (i&4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
3919 block_cbp |= pat << (i << 2);
3920 if (!v->ttmbf && ttmb < 8)
3927 s->mb_intra = v->is_intra[s->mb_x] = 0;
3928 for(i = 0; i < 6; i++) {
3929 v->mb_type[0][s->block_index[i]] = 0;
3930 s->dc_val[0][s->block_index[i]] = 0;
3932 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_SKIP;
3933 s->current_picture.f.qscale_table[mb_pos] = 0;
3934 v->blk_mv_type[s->block_index[0]] = 0;
3935 v->blk_mv_type[s->block_index[1]] = 0;
3936 v->blk_mv_type[s->block_index[2]] = 0;
3937 v->blk_mv_type[s->block_index[3]] = 0;
3938 vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
3941 if (s->mb_x == s->mb_width - 1)
3942 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
3946 static int vc1_decode_p_mb_intfi(VC1Context *v)
3948 MpegEncContext *s = &v->s;
3949 GetBitContext *gb = &s->gb;
3951 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3952 int cbp = 0; /* cbp decoding stuff */
3953 int mqdiff, mquant; /* MB quantization */
3954 int ttmb = v->ttfrm; /* MB Transform type */
3956 int mb_has_coeffs = 1; /* last_flag */
3957 int dmv_x, dmv_y; /* Differential MV components */
3958 int val; /* temp values */
3959 int first_block = 1;
3962 int block_cbp = 0, pat, block_tt = 0;
3965 mquant = v->pq; /* Loosy initialization */
3967 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
3968 if (idx_mbmode <= 1) { // intra MB
3969 s->mb_intra = v->is_intra[s->mb_x] = 1;
3970 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
3971 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
3972 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
3974 s->current_picture.f.qscale_table[mb_pos] = mquant;
3975 /* Set DC scale - y and c use the same (not sure if necessary here) */
3976 s->y_dc_scale = s->y_dc_scale_table[mquant];
3977 s->c_dc_scale = s->c_dc_scale_table[mquant];
3978 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
3979 mb_has_coeffs = idx_mbmode & 1;
3981 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
3983 for (i=0; i<6; i++) {
3984 s->dc_val[0][s->block_index[i]] = 0;
3985 v->mb_type[0][s->block_index[i]] = 1;
3987 val = ((cbp >> (5 - i)) & 1);
3988 v->a_avail = v->c_avail = 0;
3989 if(i == 2 || i == 3 || !s->first_slice_line)
3990 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3991 if(i == 1 || i == 3 || s->mb_x)
3992 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3994 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3995 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3996 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
3997 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3998 off += v->cur_field_type ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
3999 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4003 s->mb_intra = v->is_intra[s->mb_x] = 0;
4004 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
4005 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
4006 if (idx_mbmode <= 5) { // 1-MV
4008 if (idx_mbmode & 1) {
4009 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
4011 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
4013 mb_has_coeffs = !(idx_mbmode & 2);
4015 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4016 for (i=0; i<6; i++) {
4018 dmv_x = dmv_y = pred_flag = 0;
4019 val = ((v->fourmvbp >> (3 - i)) & 1);
4021 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
4023 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
4024 vc1_mc_4mv_luma(v, i, 0);
4026 vc1_mc_4mv_chroma(v, 0);
4028 mb_has_coeffs = idx_mbmode & 1;
4031 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4035 s->current_picture.f.qscale_table[mb_pos] = mquant;
4036 if (!v->ttmbf && cbp) {
4037 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4040 for (i=0; i<6; i++) {
4041 s->dc_val[0][s->block_index[i]] = 0;
4043 val = ((cbp >> (5 - i)) & 1);
4044 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
4045 if (v->cur_field_type)
4046 off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
4048 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
4049 block_cbp |= pat << (i << 2);
4050 if(!v->ttmbf && ttmb < 8) ttmb = -1;
4055 if (s->mb_x == s->mb_width - 1)
4056 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
4060 /** Decode one B-frame MB (in Main profile)
4062 static void vc1_decode_b_mb(VC1Context *v)
4064 MpegEncContext *s = &v->s;
4065 GetBitContext *gb = &s->gb;
4067 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4068 int cbp = 0; /* cbp decoding stuff */
4069 int mqdiff, mquant; /* MB quantization */
4070 int ttmb = v->ttfrm; /* MB Transform type */
4071 int mb_has_coeffs = 0; /* last_flag */
4072 int index, index1; /* LUT indexes */
4073 int val, sign; /* temp values */
4074 int first_block = 1;
4076 int skipped, direct;
4077 int dmv_x[2], dmv_y[2];
4078 int bmvtype = BMV_TYPE_BACKWARD;
4080 mquant = v->pq; /* Loosy initialization */
4084 direct = get_bits1(gb);
4086 direct = v->direct_mb_plane[mb_pos];
4088 skipped = get_bits1(gb);
4090 skipped = v->s.mbskip_table[mb_pos];
4092 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4093 for(i = 0; i < 6; i++) {
4094 v->mb_type[0][s->block_index[i]] = 0;
4095 s->dc_val[0][s->block_index[i]] = 0;
4097 s->current_picture.f.qscale_table[mb_pos] = 0;
4101 GET_MVDATA(dmv_x[0], dmv_y[0]);
4102 dmv_x[1] = dmv_x[0];
4103 dmv_y[1] = dmv_y[0];
4105 if(skipped || !s->mb_intra) {
4106 bmvtype = decode012(gb);
4109 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
4112 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
4115 bmvtype = BMV_TYPE_INTERPOLATED;
4116 dmv_x[0] = dmv_y[0] = 0;
4120 for(i = 0; i < 6; i++)
4121 v->mb_type[0][s->block_index[i]] = s->mb_intra;
4124 if(direct) bmvtype = BMV_TYPE_INTERPOLATED;
4125 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4126 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4130 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4133 s->current_picture.f.qscale_table[mb_pos] = mquant;
4135 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4136 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
4137 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4138 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4140 if(!mb_has_coeffs && !s->mb_intra) {
4141 /* no coded blocks - effectively skipped */
4142 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4143 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4146 if(s->mb_intra && !mb_has_coeffs) {
4148 s->current_picture.f.qscale_table[mb_pos] = mquant;
4149 s->ac_pred = get_bits1(gb);
4151 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4153 if(bmvtype == BMV_TYPE_INTERPOLATED) {
4154 GET_MVDATA(dmv_x[0], dmv_y[0]);
4155 if(!mb_has_coeffs) {
4156 /* interpolated skipped block */
4157 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4158 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4162 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
4164 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
4167 s->ac_pred = get_bits1(gb);
4168 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4170 s->current_picture.f.qscale_table[mb_pos] = mquant;
4171 if(!v->ttmbf && !s->mb_intra && mb_has_coeffs)
4172 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4178 s->dc_val[0][s->block_index[i]] = 0;
4180 val = ((cbp >> (5 - i)) & 1);
4181 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4182 v->mb_type[0][s->block_index[i]] = s->mb_intra;
4184 /* check if prediction blocks A and C are available */
4185 v->a_avail = v->c_avail = 0;
4186 if(i == 2 || i == 3 || !s->first_slice_line)
4187 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4188 if(i == 1 || i == 3 || s->mb_x)
4189 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4191 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
4192 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
4193 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4194 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
4195 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
4197 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), NULL);
4198 if(!v->ttmbf && ttmb < 8) ttmb = -1;
4204 /** Decode one B-frame MB (in interlaced field B picture)
4206 static void vc1_decode_b_mb_intfi(VC1Context *v)
4208 MpegEncContext *s = &v->s;
4209 GetBitContext *gb = &s->gb;
4211 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4212 int cbp = 0; /* cbp decoding stuff */
4213 int mqdiff, mquant; /* MB quantization */
4214 int ttmb = v->ttfrm; /* MB Transform type */
4215 int mb_has_coeffs = 0; /* last_flag */
4216 int val; /* temp value */
4217 int first_block = 1;
4220 int dmv_x[2], dmv_y[2], pred_flag[2];
4221 int bmvtype = BMV_TYPE_BACKWARD;
4222 int idx_mbmode, interpmvp;
4224 mquant = v->pq; /* Loosy initialization */
4227 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
4228 if (idx_mbmode <= 1) { // intra MB
4229 s->mb_intra = v->is_intra[s->mb_x] = 1;
4230 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
4231 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
4232 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
4234 s->current_picture.f.qscale_table[mb_pos] = mquant;
4235 /* Set DC scale - y and c use the same (not sure if necessary here) */
4236 s->y_dc_scale = s->y_dc_scale_table[mquant];
4237 s->c_dc_scale = s->c_dc_scale_table[mquant];
4238 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
4239 mb_has_coeffs = idx_mbmode & 1;
4241 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
4243 for (i=0; i<6; i++) {
4244 s->dc_val[0][s->block_index[i]] = 0;
4246 val = ((cbp >> (5 - i)) & 1);
4247 v->mb_type[0][s->block_index[i]] = s->mb_intra;
4248 v->a_avail = v->c_avail = 0;
4249 if(i == 2 || i == 3 || !s->first_slice_line)
4250 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
4251 if(i == 1 || i == 3 || s->mb_x)
4252 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
4254 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
4255 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
4256 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
4257 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
4258 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4259 off += v->cur_field_type ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
4260 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4261 //TODO: yet to perform loop filter
4264 s->mb_intra = v->is_intra[s->mb_x] = 0;
4265 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
4266 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
4268 fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
4270 fwd = v->forward_mb_plane[mb_pos];
4271 if (idx_mbmode <= 5) { // 1-MV
4272 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
4273 pred_flag[0] = pred_flag[1] = 0;
4275 bmvtype = BMV_TYPE_FORWARD;
4277 bmvtype = decode012(gb);
4280 bmvtype = BMV_TYPE_BACKWARD;
4283 bmvtype = BMV_TYPE_DIRECT;
4286 bmvtype = BMV_TYPE_INTERPOLATED;
4287 interpmvp = get_bits1(gb);
4290 v->bmvtype = bmvtype;
4291 if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) {
4292 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
4294 if (bmvtype == BMV_TYPE_INTERPOLATED && interpmvp) {
4295 get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
4297 if (bmvtype == BMV_TYPE_DIRECT) {
4298 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
4299 dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
4301 vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
4302 vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype);
4303 mb_has_coeffs = !(idx_mbmode & 2);
4306 bmvtype = BMV_TYPE_FORWARD;
4307 v->bmvtype = bmvtype;
4308 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
4309 for (i=0; i<6; i++) {
4311 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
4312 dmv_x[1] = dmv_y[1] = pred_flag[1] = 0;
4313 val = ((v->fourmvbp >> (3 - i)) & 1);
4315 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
4317 vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag);
4318 vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD);
4320 vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
4322 mb_has_coeffs = idx_mbmode & 1;
4325 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
4329 s->current_picture.f.qscale_table[mb_pos] = mquant;
4330 if (!v->ttmbf && cbp) {
4331 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
4334 for (i=0; i<6; i++) {
4335 s->dc_val[0][s->block_index[i]] = 0;
4337 val = ((cbp >> (5 - i)) & 1);
4338 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
4339 if (v->cur_field_type)
4340 off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
4342 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), NULL);
4343 if(!v->ttmbf && ttmb < 8)
4351 /** Decode blocks of I-frame
4353 static void vc1_decode_i_blocks(VC1Context *v)
4356 MpegEncContext *s = &v->s;
4361 /* select codingmode used for VLC tables selection */
4362 switch(v->y_ac_table_index){
4364 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4367 v->codingset = CS_HIGH_MOT_INTRA;
4370 v->codingset = CS_MID_RATE_INTRA;
4374 switch(v->c_ac_table_index){
4376 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4379 v->codingset2 = CS_HIGH_MOT_INTER;
4382 v->codingset2 = CS_MID_RATE_INTER;
4386 /* Set DC scale - y and c use the same */
4387 s->y_dc_scale = s->y_dc_scale_table[v->pq];
4388 s->c_dc_scale = s->c_dc_scale_table[v->pq];
4391 s->mb_x = s->mb_y = 0;
4393 s->first_slice_line = 1;
4394 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
4396 ff_init_block_index(s);
4397 for(; s->mb_x < s->mb_width; s->mb_x++) {
4399 ff_update_block_index(s);
4400 dst[0] = s->dest[0];
4401 dst[1] = dst[0] + 8;
4402 dst[2] = s->dest[0] + s->linesize * 8;
4403 dst[3] = dst[2] + 8;
4404 dst[4] = s->dest[1];
4405 dst[5] = s->dest[2];
4406 s->dsp.clear_blocks(s->block[0]);
4407 mb_pos = s->mb_x + s->mb_y * s->mb_width;
4408 s->current_picture.f.mb_type[mb_pos] = MB_TYPE_INTRA;
4409 s->current_picture.f.qscale_table[mb_pos] = v->pq;
4410 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
4411 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
4413 // do actual MB decoding and displaying
4414 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
4415 v->s.ac_pred = get_bits1(&v->s.gb);
4417 for(k = 0; k < 6; k++) {
4418 val = ((cbp >> (5 - k)) & 1);
4421 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
4425 cbp |= val << (5 - k);
4427 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
4429 if (k > 3 && (s->flags & CODEC_FLAG_GRAY)) continue;
4430 v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
4431 if(v->pq >= 9 && v->overlap) {
4432 if (v->rangeredfrm) for(j = 0; j < 64; j++) s->block[k][j] <<= 1;
4433 s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4435 if (v->rangeredfrm) for(j = 0; j < 64; j++) s->block[k][j] = (s->block[k][j] - 64) << 1;
4436 s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4440 if(v->pq >= 9 && v->overlap) {
4442 v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
4443 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4444 if(!(s->flags & CODEC_FLAG_GRAY)) {
4445 v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
4446 v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
4449 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
4450 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
4451 if(!s->first_slice_line) {
4452 v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
4453 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
4454 if(!(s->flags & CODEC_FLAG_GRAY)) {
4455 v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
4456 v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
4459 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4460 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
4462 if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
4464 if(get_bits_count(&s->gb) > v->bits) {
4465 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
4466 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
4470 if (!v->s.loop_filter)
4471 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4473 ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
4475 s->first_slice_line = 0;
4477 if (v->s.loop_filter)
4478 ff_draw_horiz_band(s, (s->mb_height-1)*16, 16);
4479 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
4482 /** Decode blocks of I-frame for advanced profile
4484 static void vc1_decode_i_blocks_adv(VC1Context *v)
4487 MpegEncContext *s = &v->s;
4493 GetBitContext *gb = &s->gb;
4495 /* select codingmode used for VLC tables selection */
4496 switch(v->y_ac_table_index){
4498 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4501 v->codingset = CS_HIGH_MOT_INTRA;
4504 v->codingset = CS_MID_RATE_INTRA;
4508 switch(v->c_ac_table_index){
4510 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4513 v->codingset2 = CS_HIGH_MOT_INTER;
4516 v->codingset2 = CS_MID_RATE_INTER;
4521 s->mb_x = s->mb_y = 0;
4523 s->first_slice_line = 1;
4524 s->mb_y = s->start_mb_y;
4525 if (s->start_mb_y) {
4527 ff_init_block_index(s);
4528 memset(&s->coded_block[s->block_index[0]-s->b8_stride], 0,
4529 (1 + s->b8_stride) * sizeof(*s->coded_block));
4531 for(; s->mb_y < s->end_mb_y; s->mb_y++) {
4533 ff_init_block_index(s);
4534 for(;s->mb_x < s->mb_width; s->mb_x++) {
4535 DCTELEM (*block)[64] = v->block[v->cur_blk_idx];
4536 ff_update_block_index(s);
4537 s->dsp.clear_blocks(block[0]);
4538 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
4539 s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
4540 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
4541 s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
4543 // do actual MB decoding and displaying
4544 if (v->fieldtx_is_raw)
4545 v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
4546 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
4547 if( v->acpred_is_raw)
4548 v->s.ac_pred = get_bits1(&v->s.gb);
4550 v->s.ac_pred = v->acpred_plane[mb_pos];
4552 if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
4553 v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
4557 s->current_picture.f.qscale_table[mb_pos] = mquant;
4558 /* Set DC scale - y and c use the same */
4559 s->y_dc_scale = s->y_dc_scale_table[mquant];
4560 s->c_dc_scale = s->c_dc_scale_table[mquant];
4562 for(k = 0; k < 6; k++) {
4563 val = ((cbp >> (5 - k)) & 1);
4566 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
4570 cbp |= val << (5 - k);
4572 v->a_avail = !s->first_slice_line || (k==2 || k==3);
4573 v->c_avail = !!s->mb_x || (k==1 || k==3);
4575 vc1_decode_i_block_adv(v, block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);
4577 if (k > 3 && (s->flags & CODEC_FLAG_GRAY)) continue;
4578 v->vc1dsp.vc1_inv_trans_8x8(block[k]);
4581 vc1_smooth_overlap_filter_iblk(v);
4582 vc1_put_signed_blocks_clamped(v);
4583 if(v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
4585 if(get_bits_count(&s->gb) > v->bits) {
4586 // TODO: may need modification to handle slice coding
4587 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
4588 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
4592 if (!v->s.loop_filter)
4593 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4595 ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
4596 s->first_slice_line = 0;
4599 /* raw bottom MB row */
4601 ff_init_block_index(s);
4602 for(;s->mb_x < s->mb_width; s->mb_x++) {
4603 ff_update_block_index(s);
4604 vc1_put_signed_blocks_clamped(v);
4605 if(v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
4607 if (v->s.loop_filter)
4608 ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
4609 ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, (s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END));
4612 static void vc1_decode_p_blocks(VC1Context *v)
4614 MpegEncContext *s = &v->s;
4615 int apply_loop_filter;
4617 /* select codingmode used for VLC tables selection */
4618 switch(v->c_ac_table_index){
4620 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4623 v->codingset = CS_HIGH_MOT_INTRA;
4626 v->codingset = CS_MID_RATE_INTRA;
4630 switch(v->c_ac_table_index){
4632 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4635 v->codingset2 = CS_HIGH_MOT_INTER;
4638 v->codingset2 = CS_MID_RATE_INTER;
4642 apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
4643 s->first_slice_line = 1;
4644 memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
4645 for(s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4647 ff_init_block_index(s);
4648 for(; s->mb_x < s->mb_width; s->mb_x++) {
4649 ff_update_block_index(s);
4652 vc1_decode_p_mb_intfi(v);
4653 else if (v->fcm == 1)
4654 vc1_decode_p_mb_intfr(v);
4655 else vc1_decode_p_mb(v);
4656 if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == 0)
4657 vc1_apply_p_loop_filter(v);
4658 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4659 // TODO: may need modification to handle slice coding
4660 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
4661 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
4665 memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0])*s->mb_stride);
4666 memmove(v->ttblk_base, v->ttblk, sizeof(v->ttblk_base[0])*s->mb_stride);
4667 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
4668 memmove(v->luma_mv_base, v->luma_mv, sizeof(v->luma_mv_base[0])*s->mb_stride);
4669 if (s->mb_y != s->start_mb_y) ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
4670 s->first_slice_line = 0;
4672 if (apply_loop_filter) {
4674 ff_init_block_index(s);
4675 for (; s->mb_x < s->mb_width; s->mb_x++) {
4676 ff_update_block_index(s);
4677 vc1_apply_p_loop_filter(v);
4680 if (s->end_mb_y >= s->start_mb_y)
4681 ff_draw_horiz_band(s, (s->end_mb_y-1) * 16, 16);
4682 ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, (s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END));
4685 static void vc1_decode_b_blocks(VC1Context *v)
4687 MpegEncContext *s = &v->s;
4689 /* select codingmode used for VLC tables selection */
4690 switch(v->c_ac_table_index){
4692 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4695 v->codingset = CS_HIGH_MOT_INTRA;
4698 v->codingset = CS_MID_RATE_INTRA;
4702 switch(v->c_ac_table_index){
4704 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4707 v->codingset2 = CS_HIGH_MOT_INTER;
4710 v->codingset2 = CS_MID_RATE_INTER;
4714 s->first_slice_line = 1;
4715 for(s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4717 ff_init_block_index(s);
4718 for(; s->mb_x < s->mb_width; s->mb_x++) {
4719 ff_update_block_index(s);
4722 vc1_decode_b_mb_intfi(v);
4725 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4726 // TODO: may need modification to handle slice coding
4727 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
4728 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
4731 if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
4733 if (!v->s.loop_filter)
4734 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4736 ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
4737 s->first_slice_line = 0;
4739 if (v->s.loop_filter)
4740 ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
4741 ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, (s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END));
4744 static void vc1_decode_skip_blocks(VC1Context *v)
4746 MpegEncContext *s = &v->s;
4748 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END));
4749 s->first_slice_line = 1;
4750 for(s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4752 ff_init_block_index(s);
4753 ff_update_block_index(s);
4754 memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
4755 memcpy(s->dest[1], s->last_picture.f.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4756 memcpy(s->dest[2], s->last_picture.f.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4757 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4758 s->first_slice_line = 0;
4760 s->pict_type = AV_PICTURE_TYPE_P;
4763 static void vc1_decode_blocks(VC1Context *v)
4766 v->s.esc3_level_length = 0;
4768 ff_intrax8_decode_picture(&v->x8, 2*v->pq+v->halfpq, v->pq*(!v->pquantizer) );
4771 v->left_blk_idx = -1;
4772 v->topleft_blk_idx = 1;
4774 switch(v->s.pict_type) {
4775 case AV_PICTURE_TYPE_I:
4776 if(v->profile == PROFILE_ADVANCED)
4777 vc1_decode_i_blocks_adv(v);
4779 vc1_decode_i_blocks(v);
4781 case AV_PICTURE_TYPE_P:
4782 if(v->p_frame_skipped)
4783 vc1_decode_skip_blocks(v);
4785 vc1_decode_p_blocks(v);
4787 case AV_PICTURE_TYPE_B:
4789 if(v->profile == PROFILE_ADVANCED)
4790 vc1_decode_i_blocks_adv(v);
4792 vc1_decode_i_blocks(v);
4794 vc1_decode_b_blocks(v);
4800 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
4804 * Transform coefficients for both sprites in 16.16 fixed point format,
4805 * in the order they appear in the bitstream:
4807 * rotation 1 (unused)
4809 * rotation 2 (unused)
4816 int effect_type, effect_flag;
4817 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
4818 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
4821 static inline int get_fp_val(GetBitContext* gb)
4823 return (get_bits_long(gb, 30) - (1<<29)) << 1;
4826 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
4830 switch (get_bits(gb, 2)) {
4833 c[2] = get_fp_val(gb);
4837 c[0] = c[4] = get_fp_val(gb);
4838 c[2] = get_fp_val(gb);
4841 c[0] = get_fp_val(gb);
4842 c[2] = get_fp_val(gb);
4843 c[4] = get_fp_val(gb);
4846 c[0] = get_fp_val(gb);
4847 c[1] = get_fp_val(gb);
4848 c[2] = get_fp_val(gb);
4849 c[3] = get_fp_val(gb);
4850 c[4] = get_fp_val(gb);
4853 c[5] = get_fp_val(gb);
4855 c[6] = get_fp_val(gb);
4860 static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
4862 AVCodecContext *avctx = v->s.avctx;
4865 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
4866 vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
4867 if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
4868 av_log_ask_for_sample(avctx, "Rotation coefficients are not zero");
4869 av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
4870 for (i = 0; i < 7; i++)
4871 av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
4872 sd->coefs[sprite][i] / (1<<16),
4873 (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1<<16));
4874 av_log(avctx, AV_LOG_DEBUG, "\n");
4878 if (sd->effect_type = get_bits_long(gb, 30)) {
4879 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
4881 vc1_sprite_parse_transform(gb, sd->effect_params1);
4884 vc1_sprite_parse_transform(gb, sd->effect_params1);
4885 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
4888 for (i = 0; i < sd->effect_pcount1; i++)
4889 sd->effect_params1[i] = get_fp_val(gb);
4891 if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
4892 // effect 13 is simple alpha blending and matches the opacity above
4893 av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
4894 for (i = 0; i < sd->effect_pcount1; i++)
4895 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
4896 sd->effect_params1[i] / (1<<16),
4897 (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1<<16));
4898 av_log(avctx, AV_LOG_DEBUG, "\n");
4901 sd->effect_pcount2 = get_bits(gb, 16);
4902 if (sd->effect_pcount2 > 10) {
4903 av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
4905 } else if (sd->effect_pcount2) {
4907 av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
4908 while (++i < sd->effect_pcount2){
4909 sd->effect_params2[i] = get_fp_val(gb);
4910 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
4911 sd->effect_params2[i] / (1<<16),
4912 (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1<<16));
4914 av_log(avctx, AV_LOG_DEBUG, "\n");
4917 if (sd->effect_flag = get_bits1(gb))
4918 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
4920 if (get_bits_count(gb) >= gb->size_in_bits +
4921 (avctx->codec_id == CODEC_ID_WMV3IMAGE ? 64 : 0))
4922 av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
4923 if (get_bits_count(gb) < gb->size_in_bits - 8)
4924 av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
4927 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
4929 int i, plane, row, sprite;
4930 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
4931 uint8_t* src_h[2][2];
4932 int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
4934 MpegEncContext *s = &v->s;
4936 for (i = 0; i < 2; i++) {
4937 xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
4938 xadv[i] = sd->coefs[i][0];
4939 if (xadv[i] != 1<<16 || (v->sprite_width<<16) - (v->output_width<<16) - xoff[i])
4940 xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
4942 yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
4943 yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height<<16) - yoff[i]) / v->output_height);
4945 alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
4947 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
4948 int width = v->output_width>>!!plane;
4950 for (row = 0; row < v->output_height>>!!plane; row++) {
4951 uint8_t *dst = v->sprite_output_frame.data[plane] +
4952 v->sprite_output_frame.linesize[plane] * row;
4954 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
4955 uint8_t *iplane = s->current_picture.f.data[plane];
4956 int iline = s->current_picture.f.linesize[plane];
4957 int ycoord = yoff[sprite] + yadv[sprite]*row;
4958 int yline = ycoord>>16;
4959 ysub[sprite] = ycoord&0xFFFF;
4961 iplane = s->last_picture.f.data[plane];
4962 iline = s->last_picture.f.linesize[plane];
4964 if (!(xoff[sprite]&0xFFFF) && xadv[sprite] == 1<<16) {
4965 src_h[sprite][0] = iplane+(xoff[sprite]>>16)+ yline *iline;
4967 src_h[sprite][1] = iplane+(xoff[sprite]>>16)+(yline+1)*iline;
4969 if (sr_cache[sprite][0] != yline) {
4970 if (sr_cache[sprite][1] == yline) {
4971 FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
4972 FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
4974 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane+yline*iline, xoff[sprite], xadv[sprite], width);
4975 sr_cache[sprite][0] = yline;
4978 if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
4979 v->vc1dsp.sprite_h(v->sr_rows[sprite][1], iplane+(yline+1)*iline, xoff[sprite], xadv[sprite], width);
4980 sr_cache[sprite][1] = yline + 1;
4982 src_h[sprite][0] = v->sr_rows[sprite][0];
4983 src_h[sprite][1] = v->sr_rows[sprite][1];
4987 if (!v->two_sprites) {
4989 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
4991 memcpy(dst, src_h[0][0], width);
4994 if (ysub[0] && ysub[1]) {
4995 v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
4996 src_h[1][0], src_h[1][1], ysub[1], alpha, width);
4997 } else if (ysub[0]) {
4998 v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
4999 src_h[1][0], alpha, width);
5000 } else if (ysub[1]) {
5001 v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
5002 src_h[0][0], (1<<16)-1-alpha, width);
5004 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
5010 for (i = 0; i < 2; i++) {
5020 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
5022 MpegEncContext *s = &v->s;
5023 AVCodecContext *avctx = s->avctx;
5026 vc1_parse_sprites(v, gb, &sd);
5028 if (!s->current_picture.f.data[0]) {
5029 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
5033 if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f.data[0])) {
5034 av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
5038 if (v->sprite_output_frame.data[0])
5039 avctx->release_buffer(avctx, &v->sprite_output_frame);
5041 v->sprite_output_frame.buffer_hints = FF_BUFFER_HINTS_VALID;
5042 v->sprite_output_frame.reference = 0;
5043 if (avctx->get_buffer(avctx, &v->sprite_output_frame) < 0) {
5044 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
5048 vc1_draw_sprites(v, &sd);
5053 static void vc1_sprite_flush(AVCodecContext *avctx)
5055 VC1Context *v = avctx->priv_data;
5056 MpegEncContext *s = &v->s;
5057 AVFrame *f = &s->current_picture.f;
5060 /* Windows Media Image codecs have a convergence interval of two keyframes.
5061 Since we can't enforce it, clear to black the missing sprite. This is
5062 wrong but it looks better than doing nothing. */
5065 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++)
5066 for (i = 0; i < v->sprite_height>>!!plane; i++)
5067 memset(f->data[plane]+i*f->linesize[plane],
5068 plane ? 128 : 0, f->linesize[plane]);
5073 static av_cold int vc1_decode_init_alloc_tables(VC1Context *v)
5075 MpegEncContext *s = &v->s;
5078 /* Allocate mb bitplanes */
5079 v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
5080 v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height);
5081 v->forward_mb_plane = av_malloc(s->mb_stride * s->mb_height);
5082 v->fieldtx_plane = av_mallocz(s->mb_stride * s->mb_height);
5083 v->acpred_plane = av_malloc(s->mb_stride * s->mb_height);
5084 v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height);
5086 v->n_allocated_blks = s->mb_width + 2;
5087 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
5088 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
5089 v->cbp = v->cbp_base + s->mb_stride;
5090 v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
5091 v->ttblk = v->ttblk_base + s->mb_stride;
5092 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
5093 v->is_intra = v->is_intra_base + s->mb_stride;
5094 v->luma_mv_base = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
5095 v->luma_mv = v->luma_mv_base + s->mb_stride;
5097 /* allocate block type info in that way so it could be used with s->block_index[] */
5098 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5099 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
5100 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
5101 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
5103 /* allocate memory to store block level MV info */
5104 v->blk_mv_type_base = av_mallocz(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5105 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
5106 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5107 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
5108 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5109 v->mv_f_last_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5110 v->mv_f_last[0] = v->mv_f_last_base + s->b8_stride + 1;
5111 v->mv_f_last[1] = v->mv_f_last[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5112 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5113 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
5114 v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
5116 /* Init coded blocks info */
5117 if (v->profile == PROFILE_ADVANCED)
5119 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
5121 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
5125 ff_intrax8_common_init(&v->x8,s);
5127 if (s->avctx->codec_id == CODEC_ID_WMV3IMAGE || s->avctx->codec_id == CODEC_ID_VC1IMAGE) {
5128 for (i = 0; i < 4; i++)
5129 if (!(v->sr_rows[i>>1][i%2] = av_malloc(v->output_width))) return -1;
5132 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
5133 !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
5140 /** Initialize a VC1/WMV3 decoder
5141 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5142 * @todo TODO: Decypher remaining bits in extra_data
5144 static av_cold int vc1_decode_init(AVCodecContext *avctx)
5146 VC1Context *v = avctx->priv_data;
5147 MpegEncContext *s = &v->s;
5151 /* save the container output size for WMImage */
5152 v->output_width = avctx->width;
5153 v->output_height = avctx->height;
5155 if (!avctx->extradata_size || !avctx->extradata) return -1;
5156 if (!(avctx->flags & CODEC_FLAG_GRAY))
5157 avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
5159 avctx->pix_fmt = PIX_FMT_GRAY8;
5160 avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
5162 avctx->flags |= CODEC_FLAG_EMU_EDGE;
5163 v->s.flags |= CODEC_FLAG_EMU_EDGE;
5165 if(avctx->idct_algo==FF_IDCT_AUTO){
5166 avctx->idct_algo=FF_IDCT_WMV2;
5169 if (vc1_init_common(v) < 0) return -1;
5170 ff_vc1dsp_init(&v->vc1dsp);
5172 if (avctx->codec_id == CODEC_ID_WMV3 || avctx->codec_id == CODEC_ID_WMV3IMAGE)
5176 // looks like WMV3 has a sequence header stored in the extradata
5177 // advanced sequence header may be before the first frame
5178 // the last byte of the extradata is a version number, 1 for the
5179 // samples we can decode
5181 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
5183 if (vc1_decode_sequence_header(avctx, v, &gb) < 0)
5186 count = avctx->extradata_size*8 - get_bits_count(&gb);
5189 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
5190 count, get_bits(&gb, count));
5194 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
5196 } else { // VC1/WVC1/WVP2
5197 const uint8_t *start = avctx->extradata;
5198 uint8_t *end = avctx->extradata + avctx->extradata_size;
5199 const uint8_t *next;
5200 int size, buf2_size;
5201 uint8_t *buf2 = NULL;
5202 int seq_initialized = 0, ep_initialized = 0;
5204 if(avctx->extradata_size < 16) {
5205 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
5209 buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
5210 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
5212 for(; next < end; start = next){
5213 next = find_next_marker(start + 4, end);
5214 size = next - start - 4;
5215 if(size <= 0) continue;
5216 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
5217 init_get_bits(&gb, buf2, buf2_size * 8);
5218 switch(AV_RB32(start)){
5219 case VC1_CODE_SEQHDR:
5220 if(vc1_decode_sequence_header(avctx, v, &gb) < 0){
5224 seq_initialized = 1;
5226 case VC1_CODE_ENTRYPOINT:
5227 if(vc1_decode_entry_point(avctx, v, &gb) < 0){
5236 if(!seq_initialized || !ep_initialized){
5237 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
5240 v->res_sprite = (avctx->codec_tag == MKTAG('W','V','P','2'));
5243 avctx->profile = v->profile;
5244 if (v->profile == PROFILE_ADVANCED)
5245 avctx->level = v->level;
5247 avctx->has_b_frames= !!(avctx->max_b_frames);
5249 s->mb_width = (avctx->coded_width+15)>>4;
5250 s->mb_height = (avctx->coded_height+15)>>4;
5252 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
5253 for (i = 0; i < 64; i++) {
5254 #define transpose(x) ((x>>3) | ((x&7)<<3))
5255 v->zz_8x8[0][i] = transpose(wmv1_scantable[0][i]);
5256 v->zz_8x8[1][i] = transpose(wmv1_scantable[1][i]);
5257 v->zz_8x8[2][i] = transpose(wmv1_scantable[2][i]);
5258 v->zz_8x8[3][i] = transpose(wmv1_scantable[3][i]);
5259 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
5264 memcpy(v->zz_8x8, wmv1_scantable, 4*64);
5269 if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5270 v->sprite_width = avctx->coded_width;
5271 v->sprite_height = avctx->coded_height;
5273 avctx->coded_width = avctx->width = v->output_width;
5274 avctx->coded_height = avctx->height = v->output_height;
5276 // prevent 16.16 overflows
5277 if (v->sprite_width > 1<<14 ||
5278 v->sprite_height > 1<<14 ||
5279 v->output_width > 1<<14 ||
5280 v->output_height > 1<<14) return -1;
5285 /** Close a VC1/WMV3 decoder
5286 * @warning Initial try at using MpegEncContext stuff
5288 static av_cold int vc1_decode_end(AVCodecContext *avctx)
5290 VC1Context *v = avctx->priv_data;
5293 if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
5294 && v->sprite_output_frame.data[0])
5295 avctx->release_buffer(avctx, &v->sprite_output_frame);
5296 for (i = 0; i < 4; i++)
5297 av_freep(&v->sr_rows[i>>1][i%2]);
5298 av_freep(&v->hrd_rate);
5299 av_freep(&v->hrd_buffer);
5300 MPV_common_end(&v->s);
5301 av_freep(&v->mv_type_mb_plane);
5302 av_freep(&v->direct_mb_plane);
5303 av_freep(&v->forward_mb_plane);
5304 av_freep(&v->fieldtx_plane);
5305 av_freep(&v->acpred_plane);
5306 av_freep(&v->over_flags_plane);
5307 av_freep(&v->mb_type_base);
5308 av_freep(&v->blk_mv_type_base);
5309 av_freep(&v->mv_f_base);
5310 av_freep(&v->mv_f_last_base);
5311 av_freep(&v->mv_f_next_base);
5312 av_freep(&v->block);
5313 av_freep(&v->cbp_base);
5314 av_freep(&v->ttblk_base);
5315 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
5316 av_freep(&v->luma_mv_base);
5317 ff_intrax8_common_end(&v->x8);
5322 /** Decode a VC1/WMV3 frame
5323 * @todo TODO: Handle VC-1 IDUs (Transport level?)
5325 static int vc1_decode_frame(AVCodecContext *avctx,
5326 void *data, int *data_size,
5329 const uint8_t *buf = avpkt->data;
5330 int buf_size = avpkt->size, n_slices = 0, i;
5331 VC1Context *v = avctx->priv_data;
5332 MpegEncContext *s = &v->s;
5333 AVFrame *pict = data;
5334 uint8_t *buf2 = NULL;
5335 uint8_t *buf_field2 = NULL;
5336 const uint8_t *buf_start = buf;
5337 int mb_height, n_slices1;
5344 /* no supplementary picture */
5345 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
5346 /* special case for last picture */
5347 if (s->low_delay==0 && s->next_picture_ptr) {
5348 *pict= *(AVFrame*)s->next_picture_ptr;
5349 s->next_picture_ptr= NULL;
5351 *data_size = sizeof(AVFrame);
5357 if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){
5358 if (v->profile < PROFILE_ADVANCED)
5359 avctx->pix_fmt = PIX_FMT_VDPAU_WMV3;
5361 avctx->pix_fmt = PIX_FMT_VDPAU_VC1;
5364 //for advanced profile we may need to parse and unescape data
5365 if (avctx->codec_id == CODEC_ID_VC1 || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5367 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5369 if(IS_MARKER(AV_RB32(buf))){ /* frame starts with marker and needs to be parsed */
5370 const uint8_t *start, *end, *next;
5374 for(start = buf, end = buf + buf_size; next < end; start = next){
5375 next = find_next_marker(start + 4, end);
5376 size = next - start - 4;
5377 if(size <= 0) continue;
5378 switch(AV_RB32(start)){
5379 case VC1_CODE_FRAME:
5380 if (avctx->hwaccel ||
5381 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5383 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5385 case VC1_CODE_FIELD: {
5387 slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5388 if (!slices) goto err;
5389 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5390 if (!slices[n_slices].buf) goto err;
5391 buf_size3 = vc1_unescape_buffer(start + 4, size,
5392 slices[n_slices].buf);
5393 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5395 /* assuming that the field marker is at the exact middle,
5396 hope it's correct */
5397 slices[n_slices].mby_start = s->mb_height >> 1;
5398 n_slices1 = n_slices - 1; // index of the last slice of the first field
5400 // not necessary, ad hoc until I find a way to handle WVC1i
5401 buf_field2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5402 vc1_unescape_buffer(start + 4, size, buf_field2);
5405 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
5406 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5407 init_get_bits(&s->gb, buf2, buf_size2*8);
5408 vc1_decode_entry_point(avctx, v, &s->gb);
5410 case VC1_CODE_SLICE: {
5412 slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5413 if (!slices) goto err;
5414 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5415 if (!slices[n_slices].buf) goto err;
5416 buf_size3 = vc1_unescape_buffer(start + 4, size,
5417 slices[n_slices].buf);
5418 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
5420 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
5426 }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
5427 const uint8_t *divider;
5429 divider = find_next_marker(buf, buf + buf_size);
5430 if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
5431 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
5433 } else { // found field marker, unescape second field
5434 buf_field2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5435 vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, buf_field2);
5437 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
5439 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
5441 init_get_bits(&s->gb, buf2, buf_size2*8);
5443 init_get_bits(&s->gb, buf, buf_size*8);
5445 if (v->res_sprite) {
5446 v->new_sprite = !get_bits1(&s->gb);
5447 v->two_sprites = get_bits1(&s->gb);
5448 /* res_sprite means a Windows Media Image stream, CODEC_ID_*IMAGE means
5449 we're using the sprite compositor. These are intentionally kept separate
5450 so you can get the raw sprites by using the wmv3 decoder for WMVP or
5451 the vc1 one for WVP2 */
5452 if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5453 if (v->new_sprite) {
5454 // switch AVCodecContext parameters to those of the sprites
5455 avctx->width = avctx->coded_width = v->sprite_width;
5456 avctx->height = avctx->coded_height = v->sprite_height;
5463 if (s->context_initialized &&
5464 (s->width != avctx->coded_width ||
5465 s->height != avctx->coded_height)) {
5466 vc1_decode_end(avctx);
5469 if (!s->context_initialized) {
5470 if (ff_msmpeg4_decode_init(avctx) < 0 || vc1_decode_init_alloc_tables(v) < 0)
5473 s->low_delay = !avctx->has_b_frames || v->res_sprite;
5475 if (v->profile == PROFILE_ADVANCED) {
5476 s->h_edge_pos = avctx->coded_width;
5477 s->v_edge_pos = avctx->coded_height;
5481 /* We need to set current_picture_ptr before reading the header,
5482 * otherwise we cannot store anything in there. */
5483 if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
5484 int i= ff_find_unused_picture(s, 0);
5485 s->current_picture_ptr= &s->picture[i];
5488 // do parse frame header
5489 v->pic_header_flag = 0;
5490 if(v->profile < PROFILE_ADVANCED) {
5491 if(vc1_parse_frame_header(v, &s->gb) == -1) {
5495 if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
5500 if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
5501 && s->pict_type!=AV_PICTURE_TYPE_I) {
5502 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
5506 // process pulldown flags
5507 s->current_picture_ptr->f.repeat_pict = 0;
5508 // Pulldown flags are only valid when 'broadcast' has been set.
5509 // So ticks_per_frame will be 2
5512 s->current_picture_ptr->f.repeat_pict = 1;
5513 }else if (v->rptfrm){
5515 s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
5518 // for skipping the frame
5519 s->current_picture.f.pict_type = s->pict_type;
5520 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
5522 /* skip B-frames if we don't have reference frames */
5523 if(s->last_picture_ptr==NULL && (s->pict_type==AV_PICTURE_TYPE_B || s->dropable)){
5526 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==AV_PICTURE_TYPE_B)
5527 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=AV_PICTURE_TYPE_I)
5528 || avctx->skip_frame >= AVDISCARD_ALL) {
5532 if(s->next_p_frame_damaged){
5533 if(s->pict_type==AV_PICTURE_TYPE_B)
5536 s->next_p_frame_damaged=0;
5539 if(MPV_frame_start(s, avctx) < 0) {
5543 s->me.qpel_put= s->dsp.put_qpel_pixels_tab;
5544 s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;
5546 if ((CONFIG_VC1_VDPAU_DECODER)
5547 &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
5548 ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
5549 else if (avctx->hwaccel) {
5550 if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
5552 if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
5554 if (avctx->hwaccel->end_frame(avctx) < 0)
5557 ff_er_frame_start(s);
5559 v->bits = buf_size * 8;
5560 if (v->field_mode) {
5562 s->current_picture.f.linesize[0] <<= 1;
5563 s->current_picture.f.linesize[1] <<= 1;
5564 s->current_picture.f.linesize[2] <<= 1;
5566 s->uvlinesize <<= 1;
5567 tmp[0] = v->mv_f_last[0];
5568 tmp[1] = v->mv_f_last[1];
5569 v->mv_f_last[0] = v->mv_f_next[0];
5570 v->mv_f_last[1] = v->mv_f_next[1];
5571 v->mv_f_next[0] = v->mv_f[0];
5572 v->mv_f_next[1] = v->mv_f[1];
5573 v->mv_f[0] = tmp[0];
5574 v->mv_f[1] = tmp[1];
5576 mb_height = s->mb_height >> v->field_mode;
5577 for (i = 0; i <= n_slices; i++) {
5578 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
5579 v->second_field = 1;
5580 v->blocks_off = s->mb_width * s->mb_height << 1;
5581 v->mb_off = s->mb_stride * s->mb_height >> 1;
5583 v->second_field = 0;
5588 v->pic_header_flag = 0;
5589 if (v->field_mode && i == n_slices1 + 2)
5590 vc1_parse_frame_header_adv(v, &s->gb);
5591 else if (get_bits1(&s->gb)) {
5592 v->pic_header_flag = 1;
5593 vc1_parse_frame_header_adv(v, &s->gb);
5596 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
5597 if (!v->field_mode || v->second_field)
5598 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
5600 s->end_mb_y = (i == n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
5601 vc1_decode_blocks(v);
5603 s->gb = slices[i].gb;
5605 if (v->field_mode) {
5606 av_free(buf_field2);
5607 v->second_field = 0;
5610 if (s->pict_type == AV_PICTURE_TYPE_B) {
5611 memcpy(v->mv_f_base, v->mv_f_next_base,
5612 2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
5614 s->current_picture.f.linesize[0] >>= 1;
5615 s->current_picture.f.linesize[1] >>= 1;
5616 s->current_picture.f.linesize[2] >>= 1;
5618 s->uvlinesize >>= 1;
5620 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), s->gb.size_in_bits);
5621 // if(get_bits_count(&s->gb) > buf_size * 8)
5628 if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5630 avctx->width = avctx->coded_width = v->output_width;
5631 avctx->height = avctx->coded_height = v->output_height;
5632 if (avctx->skip_frame >= AVDISCARD_NONREF) goto end;
5633 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
5634 if (vc1_decode_sprites(v, &s->gb)) goto err;
5636 *pict = v->sprite_output_frame;
5637 *data_size = sizeof(AVFrame);
5640 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
5641 *pict= *(AVFrame*)s->current_picture_ptr;
5642 } else if (s->last_picture_ptr != NULL) {
5643 *pict= *(AVFrame*)s->last_picture_ptr;
5646 if(s->last_picture_ptr || s->low_delay){
5647 *data_size = sizeof(AVFrame);
5648 ff_print_debug_info(s, pict);
5655 for (i = 0; i < n_slices; i++)
5656 av_free(slices[i].buf);
5662 for (i = 0; i < n_slices; i++)
5663 av_free(slices[i].buf);
5665 av_free(buf_field2);
5670 static const AVProfile profiles[] = {
5671 { FF_PROFILE_VC1_SIMPLE, "Simple" },
5672 { FF_PROFILE_VC1_MAIN, "Main" },
5673 { FF_PROFILE_VC1_COMPLEX, "Complex" },
5674 { FF_PROFILE_VC1_ADVANCED, "Advanced" },
5675 { FF_PROFILE_UNKNOWN },
5678 AVCodec ff_vc1_decoder = {
5680 .type = AVMEDIA_TYPE_VIDEO,
5682 .priv_data_size = sizeof(VC1Context),
5683 .init = vc1_decode_init,
5684 .close = vc1_decode_end,
5685 .decode = vc1_decode_frame,
5686 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5687 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
5688 .pix_fmts = ff_hwaccel_pixfmt_list_420,
5689 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5692 #if CONFIG_WMV3_DECODER
5693 AVCodec ff_wmv3_decoder = {
5695 .type = AVMEDIA_TYPE_VIDEO,
5696 .id = CODEC_ID_WMV3,
5697 .priv_data_size = sizeof(VC1Context),
5698 .init = vc1_decode_init,
5699 .close = vc1_decode_end,
5700 .decode = vc1_decode_frame,
5701 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5702 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
5703 .pix_fmts = ff_hwaccel_pixfmt_list_420,
5704 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5708 #if CONFIG_WMV3_VDPAU_DECODER
5709 AVCodec ff_wmv3_vdpau_decoder = {
5710 .name = "wmv3_vdpau",
5711 .type = AVMEDIA_TYPE_VIDEO,
5712 .id = CODEC_ID_WMV3,
5713 .priv_data_size = sizeof(VC1Context),
5714 .init = vc1_decode_init,
5715 .close = vc1_decode_end,
5716 .decode = vc1_decode_frame,
5717 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5718 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
5719 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE},
5720 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5724 #if CONFIG_VC1_VDPAU_DECODER
5725 AVCodec ff_vc1_vdpau_decoder = {
5726 .name = "vc1_vdpau",
5727 .type = AVMEDIA_TYPE_VIDEO,
5729 .priv_data_size = sizeof(VC1Context),
5730 .init = vc1_decode_init,
5731 .close = vc1_decode_end,
5732 .decode = vc1_decode_frame,
5733 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5734 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
5735 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE},
5736 .profiles = NULL_IF_CONFIG_SMALL(profiles)
5740 #if CONFIG_WMV3IMAGE_DECODER
5741 AVCodec ff_wmv3image_decoder = {
5742 .name = "wmv3image",
5743 .type = AVMEDIA_TYPE_VIDEO,
5744 .id = CODEC_ID_WMV3IMAGE,
5745 .priv_data_size = sizeof(VC1Context),
5746 .init = vc1_decode_init,
5747 .close = vc1_decode_end,
5748 .decode = vc1_decode_frame,
5749 .capabilities = CODEC_CAP_DR1,
5750 .flush = vc1_sprite_flush,
5751 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
5752 .pix_fmts = ff_pixfmt_list_420
5756 #if CONFIG_VC1IMAGE_DECODER
5757 AVCodec ff_vc1image_decoder = {
5759 .type = AVMEDIA_TYPE_VIDEO,
5760 .id = CODEC_ID_VC1IMAGE,
5761 .priv_data_size = sizeof(VC1Context),
5762 .init = vc1_decode_init,
5763 .close = vc1_decode_end,
5764 .decode = vc1_decode_frame,
5765 .capabilities = CODEC_CAP_DR1,
5766 .flush = vc1_sprite_flush,
5767 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
5768 .pix_fmts = ff_pixfmt_list_420