Commit | Line | Data |
---|---|---|
21aa398f | 1 | /* |
10b9c374 | 2 | * VC-1 and WMV3 decoder |
c52ff688 | 3 | * Copyright (c) 2006-2007 Konstantin Shishkov |
be3492ec | 4 | * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer |
21aa398f | 5 | * |
b78e7197 DB |
6 | * This file is part of FFmpeg. |
7 | * | |
8 | * FFmpeg is free software; you can redistribute it and/or | |
21aa398f AB |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either | |
b78e7197 | 11 | * version 2.1 of the License, or (at your option) any later version. |
21aa398f | 12 | * |
b78e7197 | 13 | * FFmpeg is distributed in the hope that it will be useful, |
21aa398f AB |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 | * Lesser General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU Lesser General Public | |
b78e7197 | 19 | * License along with FFmpeg; if not, write to the Free Software |
5509bffa | 20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21aa398f AB |
21 | */ |
22 | ||
23 | /** | |
10b9c374 KS |
24 | * @file vc1.c |
25 | * VC-1 and WMV3 decoder | |
21aa398f | 26 | * |
21aa398f | 27 | */ |
21aa398f AB |
28 | #include "dsputil.h" |
29 | #include "avcodec.h" | |
30 | #include "mpegvideo.h" | |
22c3029d | 31 | #include "vc1.h" |
10b9c374 | 32 | #include "vc1data.h" |
be3492ec | 33 | #include "vc1acdata.h" |
5ecb0677 | 34 | #include "msmpeg4data.h" |
28296f9c | 35 | #include "unary.h" |
bf672ac7 | 36 | #include "simple_idct.h" |
0d33db8a | 37 | |
9da235c8 MN |
38 | #undef NDEBUG |
39 | #include <assert.h> | |
40 | ||
0d33db8a | 41 | #define MB_INTRA_VLC_BITS 9 |
0d33db8a | 42 | #define DC_VLC_BITS 9 |
be3492ec | 43 | #define AC_VLC_BITS 9 |
0d33db8a | 44 | static const uint16_t table_mb_intra[64][2]; |
21aa398f | 45 | |
21aa398f | 46 | |
2ce151f8 | 47 | /** |
10b9c374 KS |
48 | * Init VC-1 specific tables and VC1Context members |
49 | * @param v The VC1Context to initialize | |
2ce151f8 | 50 | * @return Status |
51 | */ | |
10b9c374 | 52 | static int vc1_init_common(VC1Context *v) |
21aa398f AB |
53 | { |
54 | static int done = 0; | |
bf2bc926 | 55 | int i = 0; |
21aa398f | 56 | |
21aa398f | 57 | v->hrd_rate = v->hrd_buffer = NULL; |
e5540b3f | 58 | |
59 | /* VLC tables */ | |
21aa398f AB |
60 | if(!done) |
61 | { | |
62 | done = 1; | |
a5c14fca KS |
63 | init_vlc(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23, |
64 | ff_vc1_bfraction_bits, 1, 1, | |
65 | ff_vc1_bfraction_codes, 1, 1, 1); | |
66 | init_vlc(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4, | |
67 | ff_vc1_norm2_bits, 1, 1, | |
68 | ff_vc1_norm2_codes, 1, 1, 1); | |
69 | init_vlc(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64, | |
70 | ff_vc1_norm6_bits, 1, 1, | |
71 | ff_vc1_norm6_codes, 2, 2, 1); | |
72 | init_vlc(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7, | |
73 | ff_vc1_imode_bits, 1, 1, | |
74 | ff_vc1_imode_codes, 1, 1, 1); | |
e5540b3f | 75 | for (i=0; i<3; i++) |
76 | { | |
a5c14fca KS |
77 | init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16, |
78 | ff_vc1_ttmb_bits[i], 1, 1, | |
79 | ff_vc1_ttmb_codes[i], 2, 2, 1); | |
80 | init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8, | |
81 | ff_vc1_ttblk_bits[i], 1, 1, | |
82 | ff_vc1_ttblk_codes[i], 1, 1, 1); | |
83 | init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15, | |
84 | ff_vc1_subblkpat_bits[i], 1, 1, | |
85 | ff_vc1_subblkpat_codes[i], 1, 1, 1); | |
e5540b3f | 86 | } |
87 | for(i=0; i<4; i++) | |
21aa398f | 88 | { |
a5c14fca KS |
89 | init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16, |
90 | ff_vc1_4mv_block_pattern_bits[i], 1, 1, | |
91 | ff_vc1_4mv_block_pattern_codes[i], 1, 1, 1); | |
92 | init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64, | |
93 | ff_vc1_cbpcy_p_bits[i], 1, 1, | |
94 | ff_vc1_cbpcy_p_codes[i], 2, 2, 1); | |
95 | init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73, | |
96 | ff_vc1_mv_diff_bits[i], 1, 1, | |
97 | ff_vc1_mv_diff_codes[i], 2, 2, 1); | |
21aa398f | 98 | } |
be3492ec | 99 | for(i=0; i<8; i++) |
a5c14fca | 100 | init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i], |
be3492ec KS |
101 | &vc1_ac_tables[i][0][1], 8, 4, |
102 | &vc1_ac_tables[i][0][0], 8, 4, 1); | |
103 | init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64, | |
104 | &ff_msmp4_mb_i_table[0][1], 4, 2, | |
105 | &ff_msmp4_mb_i_table[0][0], 4, 2, 1); | |
21aa398f AB |
106 | } |
107 | ||
e5540b3f | 108 | /* Other defaults */ |
109 | v->pq = -1; | |
110 | v->mvrange = 0; /* 7.1.1.18, p80 */ | |
111 | ||
21aa398f AB |
112 | return 0; |
113 | } | |
114 | ||
be3492ec | 115 | /***********************************************************************/ |
2ce151f8 | 116 | /** |
be3492ec KS |
117 | * @defgroup bitplane VC9 Bitplane decoding |
118 | * @see 8.7, p56 | |
119 | * @{ | |
120 | */ | |
121 | ||
122 | /** @addtogroup bitplane | |
123 | * Imode types | |
124 | * @{ | |
125 | */ | |
126 | enum Imode { | |
127 | IMODE_RAW, | |
128 | IMODE_NORM2, | |
129 | IMODE_DIFF2, | |
130 | IMODE_NORM6, | |
131 | IMODE_DIFF6, | |
132 | IMODE_ROWSKIP, | |
133 | IMODE_COLSKIP | |
134 | }; | |
135 | /** @} */ //imode defines | |
136 | ||
be3492ec KS |
137 | /** Decode rows by checking if they are skipped |
138 | * @param plane Buffer to store decoded bits | |
139 | * @param[in] width Width of this buffer | |
140 | * @param[in] height Height of this buffer | |
141 | * @param[in] stride of this buffer | |
142 | */ | |
143 | static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ | |
144 | int x, y; | |
21aa398f | 145 | |
be3492ec | 146 | for (y=0; y<height; y++){ |
5fc32c27 | 147 | if (!get_bits1(gb)) //rowskip |
be3492ec KS |
148 | memset(plane, 0, width); |
149 | else | |
150 | for (x=0; x<width; x++) | |
5fc32c27 | 151 | plane[x] = get_bits1(gb); |
be3492ec | 152 | plane += stride; |
1cf9f514 | 153 | } |
be3492ec | 154 | } |
21aa398f | 155 | |
be3492ec KS |
156 | /** Decode columns by checking if they are skipped |
157 | * @param plane Buffer to store decoded bits | |
158 | * @param[in] width Width of this buffer | |
159 | * @param[in] height Height of this buffer | |
160 | * @param[in] stride of this buffer | |
63e24954 | 161 | * @todo FIXME: Optimize |
be3492ec KS |
162 | */ |
163 | static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ | |
164 | int x, y; | |
21aa398f | 165 | |
be3492ec | 166 | for (x=0; x<width; x++){ |
5fc32c27 | 167 | if (!get_bits1(gb)) //colskip |
be3492ec KS |
168 | for (y=0; y<height; y++) |
169 | plane[y*stride] = 0; | |
170 | else | |
171 | for (y=0; y<height; y++) | |
5fc32c27 | 172 | plane[y*stride] = get_bits1(gb); |
be3492ec | 173 | plane ++; |
21aa398f | 174 | } |
21aa398f AB |
175 | } |
176 | ||
be3492ec KS |
177 | /** Decode a bitplane's bits |
178 | * @param bp Bitplane where to store the decode bits | |
179 | * @param v VC-1 context for bit reading and logging | |
2ce151f8 | 180 | * @return Status |
63e24954 | 181 | * @todo FIXME: Optimize |
2ce151f8 | 182 | */ |
87dfe848 | 183 | static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) |
21aa398f | 184 | { |
be3492ec | 185 | GetBitContext *gb = &v->s.gb; |
21aa398f | 186 | |
be3492ec | 187 | int imode, x, y, code, offset; |
87dfe848 KS |
188 | uint8_t invert, *planep = data; |
189 | int width, height, stride; | |
21aa398f | 190 | |
87dfe848 KS |
191 | width = v->s.mb_width; |
192 | height = v->s.mb_height; | |
193 | stride = v->s.mb_stride; | |
5fc32c27 | 194 | invert = get_bits1(gb); |
a5c14fca | 195 | imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1); |
21aa398f | 196 | |
87dfe848 | 197 | *raw_flag = 0; |
be3492ec | 198 | switch (imode) |
21aa398f | 199 | { |
be3492ec KS |
200 | case IMODE_RAW: |
201 | //Data is actually read in the MB layer (same for all tests == "raw") | |
87dfe848 | 202 | *raw_flag = 1; //invert ignored |
be3492ec KS |
203 | return invert; |
204 | case IMODE_DIFF2: | |
205 | case IMODE_NORM2: | |
87dfe848 | 206 | if ((height * width) & 1) |
21aa398f | 207 | { |
5fc32c27 | 208 | *planep++ = get_bits1(gb); |
be3492ec | 209 | offset = 1; |
21aa398f | 210 | } |
be3492ec KS |
211 | else offset = 0; |
212 | // decode bitplane as one long line | |
87dfe848 | 213 | for (y = offset; y < height * width; y += 2) { |
a5c14fca | 214 | code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1); |
be3492ec KS |
215 | *planep++ = code & 1; |
216 | offset++; | |
87dfe848 | 217 | if(offset == width) { |
be3492ec | 218 | offset = 0; |
87dfe848 | 219 | planep += stride - width; |
21aa398f | 220 | } |
be3492ec KS |
221 | *planep++ = code >> 1; |
222 | offset++; | |
87dfe848 | 223 | if(offset == width) { |
be3492ec | 224 | offset = 0; |
87dfe848 | 225 | planep += stride - width; |
21aa398f | 226 | } |
be3492ec KS |
227 | } |
228 | break; | |
229 | case IMODE_DIFF6: | |
230 | case IMODE_NORM6: | |
87dfe848 KS |
231 | if(!(height % 3) && (width % 3)) { // use 2x3 decoding |
232 | for(y = 0; y < height; y+= 3) { | |
233 | for(x = width & 1; x < width; x += 2) { | |
a5c14fca | 234 | code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); |
be3492ec KS |
235 | if(code < 0){ |
236 | av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); | |
237 | return -1; | |
238 | } | |
239 | planep[x + 0] = (code >> 0) & 1; | |
240 | planep[x + 1] = (code >> 1) & 1; | |
87dfe848 KS |
241 | planep[x + 0 + stride] = (code >> 2) & 1; |
242 | planep[x + 1 + stride] = (code >> 3) & 1; | |
243 | planep[x + 0 + stride * 2] = (code >> 4) & 1; | |
244 | planep[x + 1 + stride * 2] = (code >> 5) & 1; | |
be3492ec | 245 | } |
87dfe848 | 246 | planep += stride * 3; |
be3492ec | 247 | } |
87dfe848 | 248 | if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb); |
be3492ec | 249 | } else { // 3x2 |
8a66a390 | 250 | planep += (height & 1) * stride; |
87dfe848 KS |
251 | for(y = height & 1; y < height; y += 2) { |
252 | for(x = width % 3; x < width; x += 3) { | |
a5c14fca | 253 | code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); |
be3492ec KS |
254 | if(code < 0){ |
255 | av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); | |
256 | return -1; | |
257 | } | |
258 | planep[x + 0] = (code >> 0) & 1; | |
259 | planep[x + 1] = (code >> 1) & 1; | |
260 | planep[x + 2] = (code >> 2) & 1; | |
87dfe848 KS |
261 | planep[x + 0 + stride] = (code >> 3) & 1; |
262 | planep[x + 1 + stride] = (code >> 4) & 1; | |
263 | planep[x + 2 + stride] = (code >> 5) & 1; | |
be3492ec | 264 | } |
87dfe848 | 265 | planep += stride * 2; |
be3492ec | 266 | } |
87dfe848 KS |
267 | x = width % 3; |
268 | if(x) decode_colskip(data , x, height , stride, &v->s.gb); | |
269 | if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb); | |
be3492ec KS |
270 | } |
271 | break; | |
272 | case IMODE_ROWSKIP: | |
87dfe848 | 273 | decode_rowskip(data, width, height, stride, &v->s.gb); |
be3492ec KS |
274 | break; |
275 | case IMODE_COLSKIP: | |
87dfe848 | 276 | decode_colskip(data, width, height, stride, &v->s.gb); |
be3492ec KS |
277 | break; |
278 | default: break; | |
279 | } | |
280 | ||
281 | /* Applying diff operator */ | |
282 | if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) | |
283 | { | |
87dfe848 | 284 | planep = data; |
be3492ec | 285 | planep[0] ^= invert; |
87dfe848 | 286 | for (x=1; x<width; x++) |
be3492ec | 287 | planep[x] ^= planep[x-1]; |
87dfe848 | 288 | for (y=1; y<height; y++) |
be3492ec | 289 | { |
87dfe848 KS |
290 | planep += stride; |
291 | planep[0] ^= planep[-stride]; | |
292 | for (x=1; x<width; x++) | |
21aa398f | 293 | { |
87dfe848 KS |
294 | if (planep[x-1] != planep[x-stride]) planep[x] ^= invert; |
295 | else planep[x] ^= planep[x-1]; | |
21aa398f AB |
296 | } |
297 | } | |
298 | } | |
be3492ec | 299 | else if (invert) |
21aa398f | 300 | { |
87dfe848 KS |
301 | planep = data; |
302 | for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride | |
21aa398f | 303 | } |
be3492ec KS |
304 | return (imode<<1) + invert; |
305 | } | |
87dfe848 | 306 | |
be3492ec | 307 | /** @} */ //Bitplane group |
21aa398f | 308 | |
be3492ec KS |
309 | /***********************************************************************/ |
310 | /** VOP Dquant decoding | |
311 | * @param v VC-1 Context | |
312 | */ | |
313 | static int vop_dquant_decoding(VC1Context *v) | |
314 | { | |
315 | GetBitContext *gb = &v->s.gb; | |
316 | int pqdiff; | |
317 | ||
318 | //variable size | |
319 | if (v->dquant == 2) | |
320 | { | |
321 | pqdiff = get_bits(gb, 3); | |
322 | if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
323 | else v->altpq = v->pq + pqdiff + 1; | |
324 | } | |
325 | else | |
21aa398f | 326 | { |
5fc32c27 | 327 | v->dquantfrm = get_bits1(gb); |
be3492ec | 328 | if ( v->dquantfrm ) |
21aa398f | 329 | { |
be3492ec KS |
330 | v->dqprofile = get_bits(gb, 2); |
331 | switch (v->dqprofile) | |
21aa398f | 332 | { |
be3492ec KS |
333 | case DQPROFILE_SINGLE_EDGE: |
334 | case DQPROFILE_DOUBLE_EDGES: | |
335 | v->dqsbedge = get_bits(gb, 2); | |
336 | break; | |
337 | case DQPROFILE_ALL_MBS: | |
5fc32c27 | 338 | v->dqbilevel = get_bits1(gb); |
f7d2a437 KS |
339 | if(!v->dqbilevel) |
340 | v->halfpq = 0; | |
be3492ec | 341 | default: break; //Forbidden ? |
42cc17f9 | 342 | } |
3a3f1cf3 | 343 | if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) |
21aa398f | 344 | { |
be3492ec KS |
345 | pqdiff = get_bits(gb, 3); |
346 | if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
347 | else v->altpq = v->pq + pqdiff + 1; | |
21aa398f | 348 | } |
21aa398f AB |
349 | } |
350 | } | |
be3492ec KS |
351 | return 0; |
352 | } | |
21aa398f | 353 | |
be3492ec | 354 | /** Put block onto picture |
be3492ec KS |
355 | */ |
356 | static void vc1_put_block(VC1Context *v, DCTELEM block[6][64]) | |
357 | { | |
358 | uint8_t *Y; | |
359 | int ys, us, vs; | |
360 | DSPContext *dsp = &v->s.dsp; | |
361 | ||
ffb9a8b1 KS |
362 | if(v->rangeredfrm) { |
363 | int i, j, k; | |
364 | for(k = 0; k < 6; k++) | |
365 | for(j = 0; j < 8; j++) | |
366 | for(i = 0; i < 8; i++) | |
367 | block[k][i + j*8] = ((block[k][i + j*8] - 128) << 1) + 128; | |
368 | ||
369 | } | |
be3492ec KS |
370 | ys = v->s.current_picture.linesize[0]; |
371 | us = v->s.current_picture.linesize[1]; | |
372 | vs = v->s.current_picture.linesize[2]; | |
373 | Y = v->s.dest[0]; | |
374 | ||
375 | dsp->put_pixels_clamped(block[0], Y, ys); | |
376 | dsp->put_pixels_clamped(block[1], Y + 8, ys); | |
377 | Y += ys * 8; | |
378 | dsp->put_pixels_clamped(block[2], Y, ys); | |
379 | dsp->put_pixels_clamped(block[3], Y + 8, ys); | |
380 | ||
138712fe KS |
381 | if(!(v->s.flags & CODEC_FLAG_GRAY)) { |
382 | dsp->put_pixels_clamped(block[4], v->s.dest[1], us); | |
383 | dsp->put_pixels_clamped(block[5], v->s.dest[2], vs); | |
384 | } | |
be3492ec KS |
385 | } |
386 | ||
387 | /** Do motion compensation over 1 macroblock | |
388 | * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c | |
389 | */ | |
5df68893 | 390 | static void vc1_mc_1mv(VC1Context *v, int dir) |
be3492ec KS |
391 | { |
392 | MpegEncContext *s = &v->s; | |
393 | DSPContext *dsp = &v->s.dsp; | |
394 | uint8_t *srcY, *srcU, *srcV; | |
87dfe848 | 395 | int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; |
be3492ec KS |
396 | |
397 | if(!v->s.last_picture.data[0])return; | |
398 | ||
1dc1ce64 KS |
399 | mx = s->mv[dir][0][0]; |
400 | my = s->mv[dir][0][1]; | |
401 | ||
402 | // store motion vectors for further use in B frames | |
403 | if(s->pict_type == P_TYPE) { | |
404 | s->current_picture.motion_val[1][s->block_index[0]][0] = mx; | |
405 | s->current_picture.motion_val[1][s->block_index[0]][1] = my; | |
406 | } | |
87dfe848 KS |
407 | uvmx = (mx + ((mx & 3) == 3)) >> 1; |
408 | uvmy = (my + ((my & 3) == 3)) >> 1; | |
08baa3e0 KS |
409 | if(v->fastuvmc) { |
410 | uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); | |
411 | uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); | |
412 | } | |
5df68893 KS |
413 | if(!dir) { |
414 | srcY = s->last_picture.data[0]; | |
415 | srcU = s->last_picture.data[1]; | |
416 | srcV = s->last_picture.data[2]; | |
417 | } else { | |
418 | srcY = s->next_picture.data[0]; | |
419 | srcU = s->next_picture.data[1]; | |
420 | srcV = s->next_picture.data[2]; | |
421 | } | |
be3492ec | 422 | |
87dfe848 KS |
423 | src_x = s->mb_x * 16 + (mx >> 2); |
424 | src_y = s->mb_y * 16 + (my >> 2); | |
425 | uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
426 | uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
427 | ||
7c971233 KS |
428 | if(v->profile != PROFILE_ADVANCED){ |
429 | src_x = av_clip( src_x, -16, s->mb_width * 16); | |
430 | src_y = av_clip( src_y, -16, s->mb_height * 16); | |
431 | uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); | |
432 | uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); | |
433 | }else{ | |
434 | src_x = av_clip( src_x, -17, s->avctx->coded_width); | |
435 | src_y = av_clip( src_y, -18, s->avctx->coded_height + 1); | |
436 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
437 | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
438 | } | |
87dfe848 KS |
439 | |
440 | srcY += src_y * s->linesize + src_x; | |
441 | srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
442 | srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
443 | ||
138712fe KS |
444 | /* for grayscale we should not try to read from unknown area */ |
445 | if(s->flags & CODEC_FLAG_GRAY) { | |
446 | srcU = s->edge_emu_buffer + 18 * s->linesize; | |
447 | srcV = s->edge_emu_buffer + 18 * s->linesize; | |
448 | } | |
449 | ||
ffb9a8b1 | 450 | if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
8295eb30 KS |
451 | || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3 |
452 | || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){ | |
453 | uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; | |
87dfe848 | 454 | |
8295eb30 KS |
455 | srcY -= s->mspel * (1 + s->linesize); |
456 | ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2, | |
457 | src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
87dfe848 KS |
458 | srcY = s->edge_emu_buffer; |
459 | ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, | |
460 | uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
461 | ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, | |
462 | uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
463 | srcU = uvbuf; | |
464 | srcV = uvbuf + 16; | |
ffb9a8b1 KS |
465 | /* if we deal with range reduction we need to scale source blocks */ |
466 | if(v->rangeredfrm) { | |
467 | int i, j; | |
468 | uint8_t *src, *src2; | |
469 | ||
470 | src = srcY; | |
8295eb30 KS |
471 | for(j = 0; j < 17 + s->mspel*2; j++) { |
472 | for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; | |
ffb9a8b1 KS |
473 | src += s->linesize; |
474 | } | |
475 | src = srcU; src2 = srcV; | |
476 | for(j = 0; j < 9; j++) { | |
477 | for(i = 0; i < 9; i++) { | |
478 | src[i] = ((src[i] - 128) >> 1) + 128; | |
479 | src2[i] = ((src2[i] - 128) >> 1) + 128; | |
480 | } | |
481 | src += s->uvlinesize; | |
482 | src2 += s->uvlinesize; | |
483 | } | |
484 | } | |
66d0ad26 KS |
485 | /* if we deal with intensity compensation we need to scale source blocks */ |
486 | if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
487 | int i, j; | |
488 | uint8_t *src, *src2; | |
489 | ||
490 | src = srcY; | |
8295eb30 KS |
491 | for(j = 0; j < 17 + s->mspel*2; j++) { |
492 | for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]]; | |
66d0ad26 KS |
493 | src += s->linesize; |
494 | } | |
495 | src = srcU; src2 = srcV; | |
496 | for(j = 0; j < 9; j++) { | |
497 | for(i = 0; i < 9; i++) { | |
498 | src[i] = v->lutuv[src[i]]; | |
499 | src2[i] = v->lutuv[src2[i]]; | |
500 | } | |
501 | src += s->uvlinesize; | |
502 | src2 += s->uvlinesize; | |
503 | } | |
504 | } | |
8295eb30 | 505 | srcY += s->mspel * (1 + s->linesize); |
87dfe848 KS |
506 | } |
507 | ||
8295eb30 KS |
508 | if(s->mspel) { |
509 | dxy = ((my & 3) << 2) | (mx & 3); | |
510 | dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd); | |
511 | dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd); | |
512 | srcY += s->linesize * 8; | |
513 | dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd); | |
514 | dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd); | |
66ff2c1f KS |
515 | } else { // hpel mc - always used for luma |
516 | dxy = (my & 2) | ((mx & 2) >> 1); | |
87dfe848 | 517 | |
c5b32ec1 KS |
518 | if(!v->rnd) |
519 | dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
520 | else | |
521 | dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
c5b32ec1 | 522 | } |
138712fe KS |
523 | |
524 | if(s->flags & CODEC_FLAG_GRAY) return; | |
2d5eadcc | 525 | /* Chroma MC always uses qpel bilinear */ |
c5b32ec1 | 526 | uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); |
b0c8e1b8 KS |
527 | uvmx = (uvmx&3)<<1; |
528 | uvmy = (uvmy&3)<<1; | |
529 | if(!v->rnd){ | |
530 | dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
531 | dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
532 | }else{ | |
533 | dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
534 | dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
535 | } | |
21aa398f | 536 | } |
21aa398f | 537 | |
e4bf0302 KS |
538 | /** Do motion compensation for 4-MV macroblock - luminance block |
539 | */ | |
540 | static void vc1_mc_4mv_luma(VC1Context *v, int n) | |
541 | { | |
542 | MpegEncContext *s = &v->s; | |
543 | DSPContext *dsp = &v->s.dsp; | |
544 | uint8_t *srcY; | |
545 | int dxy, mx, my, src_x, src_y; | |
546 | int off; | |
547 | ||
548 | if(!v->s.last_picture.data[0])return; | |
549 | mx = s->mv[0][n][0]; | |
550 | my = s->mv[0][n][1]; | |
551 | srcY = s->last_picture.data[0]; | |
552 | ||
553 | off = s->linesize * 4 * (n&2) + (n&1) * 8; | |
554 | ||
555 | src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2); | |
556 | src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2); | |
557 | ||
7c971233 KS |
558 | if(v->profile != PROFILE_ADVANCED){ |
559 | src_x = av_clip( src_x, -16, s->mb_width * 16); | |
560 | src_y = av_clip( src_y, -16, s->mb_height * 16); | |
561 | }else{ | |
562 | src_x = av_clip( src_x, -17, s->avctx->coded_width); | |
563 | src_y = av_clip( src_y, -18, s->avctx->coded_height + 1); | |
564 | } | |
e4bf0302 KS |
565 | |
566 | srcY += src_y * s->linesize + src_x; | |
567 | ||
99f649a2 | 568 | if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
78cbfc0c KS |
569 | || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2 |
570 | || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){ | |
8295eb30 KS |
571 | srcY -= s->mspel * (1 + s->linesize); |
572 | ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2, | |
573 | src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
e4bf0302 | 574 | srcY = s->edge_emu_buffer; |
ffb9a8b1 KS |
575 | /* if we deal with range reduction we need to scale source blocks */ |
576 | if(v->rangeredfrm) { | |
577 | int i, j; | |
578 | uint8_t *src; | |
579 | ||
580 | src = srcY; | |
8295eb30 KS |
581 | for(j = 0; j < 9 + s->mspel*2; j++) { |
582 | for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; | |
ffb9a8b1 KS |
583 | src += s->linesize; |
584 | } | |
585 | } | |
99f649a2 KS |
586 | /* if we deal with intensity compensation we need to scale source blocks */ |
587 | if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
588 | int i, j; | |
589 | uint8_t *src; | |
590 | ||
591 | src = srcY; | |
592 | for(j = 0; j < 9 + s->mspel*2; j++) { | |
593 | for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]]; | |
594 | src += s->linesize; | |
595 | } | |
596 | } | |
8295eb30 | 597 | srcY += s->mspel * (1 + s->linesize); |
e4bf0302 KS |
598 | } |
599 | ||
8295eb30 KS |
600 | if(s->mspel) { |
601 | dxy = ((my & 3) << 2) | (mx & 3); | |
602 | dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd); | |
66ff2c1f KS |
603 | } else { // hpel mc - always used for luma |
604 | dxy = (my & 2) | ((mx & 2) >> 1); | |
c5b32ec1 KS |
605 | if(!v->rnd) |
606 | dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); | |
607 | else | |
608 | dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); | |
e4bf0302 KS |
609 | } |
610 | } | |
611 | ||
e4bf0302 KS |
612 | static inline int median4(int a, int b, int c, int d) |
613 | { | |
35a9cac8 | 614 | if(a < b) { |
913e93d5 KS |
615 | if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; |
616 | else return (FFMIN(b, c) + FFMAX(a, d)) / 2; | |
35a9cac8 | 617 | } else { |
913e93d5 KS |
618 | if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; |
619 | else return (FFMIN(a, c) + FFMAX(b, d)) / 2; | |
35a9cac8 | 620 | } |
e4bf0302 KS |
621 | } |
622 | ||
623 | ||
624 | /** Do motion compensation for 4-MV macroblock - both chroma blocks | |
625 | */ | |
626 | static void vc1_mc_4mv_chroma(VC1Context *v) | |
627 | { | |
628 | MpegEncContext *s = &v->s; | |
629 | DSPContext *dsp = &v->s.dsp; | |
630 | uint8_t *srcU, *srcV; | |
631 | int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y; | |
632 | int i, idx, tx = 0, ty = 0; | |
633 | int mvx[4], mvy[4], intra[4]; | |
634 | static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; | |
635 | ||
636 | if(!v->s.last_picture.data[0])return; | |
138712fe | 637 | if(s->flags & CODEC_FLAG_GRAY) return; |
e4bf0302 KS |
638 | |
639 | for(i = 0; i < 4; i++) { | |
640 | mvx[i] = s->mv[0][i][0]; | |
641 | mvy[i] = s->mv[0][i][1]; | |
642 | intra[i] = v->mb_type[0][s->block_index[i]]; | |
643 | } | |
644 | ||
645 | /* calculate chroma MV vector from four luma MVs */ | |
1ae4a8e6 | 646 | idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0]; |
e4bf0302 KS |
647 | if(!idx) { // all blocks are inter |
648 | tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]); | |
649 | ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]); | |
650 | } else if(count[idx] == 1) { // 3 inter blocks | |
651 | switch(idx) { | |
652 | case 0x1: | |
653 | tx = mid_pred(mvx[1], mvx[2], mvx[3]); | |
1ae4a8e6 | 654 | ty = mid_pred(mvy[1], mvy[2], mvy[3]); |
e4bf0302 KS |
655 | break; |
656 | case 0x2: | |
657 | tx = mid_pred(mvx[0], mvx[2], mvx[3]); | |
1ae4a8e6 | 658 | ty = mid_pred(mvy[0], mvy[2], mvy[3]); |
e4bf0302 KS |
659 | break; |
660 | case 0x4: | |
661 | tx = mid_pred(mvx[0], mvx[1], mvx[3]); | |
1ae4a8e6 | 662 | ty = mid_pred(mvy[0], mvy[1], mvy[3]); |
e4bf0302 KS |
663 | break; |
664 | case 0x8: | |
665 | tx = mid_pred(mvx[0], mvx[1], mvx[2]); | |
1ae4a8e6 | 666 | ty = mid_pred(mvy[0], mvy[1], mvy[2]); |
e4bf0302 KS |
667 | break; |
668 | } | |
669 | } else if(count[idx] == 2) { | |
670 | int t1 = 0, t2 = 0; | |
671 | for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;} | |
672 | for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;} | |
913e93d5 KS |
673 | tx = (mvx[t1] + mvx[t2]) / 2; |
674 | ty = (mvy[t1] + mvy[t2]) / 2; | |
9a44385e KS |
675 | } else { |
676 | s->current_picture.motion_val[1][s->block_index[0]][0] = 0; | |
677 | s->current_picture.motion_val[1][s->block_index[0]][1] = 0; | |
e4bf0302 | 678 | return; //no need to do MC for inter blocks |
9a44385e | 679 | } |
e4bf0302 | 680 | |
1dc1ce64 KS |
681 | s->current_picture.motion_val[1][s->block_index[0]][0] = tx; |
682 | s->current_picture.motion_val[1][s->block_index[0]][1] = ty; | |
e4bf0302 KS |
683 | uvmx = (tx + ((tx&3) == 3)) >> 1; |
684 | uvmy = (ty + ((ty&3) == 3)) >> 1; | |
08baa3e0 KS |
685 | if(v->fastuvmc) { |
686 | uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); | |
687 | uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); | |
688 | } | |
e4bf0302 KS |
689 | |
690 | uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
691 | uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
692 | ||
7c971233 KS |
693 | if(v->profile != PROFILE_ADVANCED){ |
694 | uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); | |
695 | uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); | |
696 | }else{ | |
697 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
698 | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
699 | } | |
ab475795 | 700 | |
e4bf0302 KS |
701 | srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x; |
702 | srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x; | |
99f649a2 KS |
703 | if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
704 | || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 | |
83b3df83 | 705 | || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){ |
e4bf0302 KS |
706 | ff_emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1, |
707 | uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
708 | ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1, | |
709 | uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
710 | srcU = s->edge_emu_buffer; | |
711 | srcV = s->edge_emu_buffer + 16; | |
ffb9a8b1 KS |
712 | |
713 | /* if we deal with range reduction we need to scale source blocks */ | |
714 | if(v->rangeredfrm) { | |
715 | int i, j; | |
716 | uint8_t *src, *src2; | |
717 | ||
718 | src = srcU; src2 = srcV; | |
719 | for(j = 0; j < 9; j++) { | |
720 | for(i = 0; i < 9; i++) { | |
721 | src[i] = ((src[i] - 128) >> 1) + 128; | |
722 | src2[i] = ((src2[i] - 128) >> 1) + 128; | |
723 | } | |
724 | src += s->uvlinesize; | |
725 | src2 += s->uvlinesize; | |
726 | } | |
727 | } | |
99f649a2 KS |
728 | /* if we deal with intensity compensation we need to scale source blocks */ |
729 | if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
730 | int i, j; | |
731 | uint8_t *src, *src2; | |
732 | ||
733 | src = srcU; src2 = srcV; | |
734 | for(j = 0; j < 9; j++) { | |
735 | for(i = 0; i < 9; i++) { | |
736 | src[i] = v->lutuv[src[i]]; | |
737 | src2[i] = v->lutuv[src2[i]]; | |
738 | } | |
739 | src += s->uvlinesize; | |
740 | src2 += s->uvlinesize; | |
741 | } | |
742 | } | |
e4bf0302 KS |
743 | } |
744 | ||
2d5eadcc | 745 | /* Chroma MC always uses qpel bilinear */ |
c5b32ec1 | 746 | uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); |
b0c8e1b8 KS |
747 | uvmx = (uvmx&3)<<1; |
748 | uvmy = (uvmy&3)<<1; | |
749 | if(!v->rnd){ | |
750 | dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
751 | dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
752 | }else{ | |
753 | dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
754 | dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
755 | } | |
e4bf0302 KS |
756 | } |
757 | ||
3c275f6d KS |
758 | static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb); |
759 | ||
115329f1 | 760 | /** |
2ce151f8 | 761 | * Decode Simple/Main Profiles sequence header |
762 | * @see Figure 7-8, p16-17 | |
763 | * @param avctx Codec context | |
764 | * @param gb GetBit context initialized from Codec context extra_data | |
765 | * @return Status | |
766 | */ | |
21aa398f AB |
767 | static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) |
768 | { | |
10b9c374 | 769 | VC1Context *v = avctx->priv_data; |
21aa398f | 770 | |
d429c982 | 771 | av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32)); |
21aa398f | 772 | v->profile = get_bits(gb, 2); |
9d1f80f2 | 773 | if (v->profile == PROFILE_COMPLEX) |
25a0a0a5 | 774 | { |
9d1f80f2 | 775 | av_log(avctx, AV_LOG_ERROR, "WMV3 Complex Profile is not fully supported\n"); |
25a0a0a5 | 776 | } |
21aa398f | 777 | |
7cc84d24 | 778 | if (v->profile == PROFILE_ADVANCED) |
21aa398f | 779 | { |
750e37eb CG |
780 | v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz; |
781 | v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz; | |
3c275f6d | 782 | return decode_sequence_header_adv(v, gb); |
21aa398f AB |
783 | } |
784 | else | |
21aa398f | 785 | { |
750e37eb CG |
786 | v->zz_8x4 = ff_vc1_simple_progressive_8x4_zz; |
787 | v->zz_4x8 = ff_vc1_simple_progressive_4x8_zz; | |
21aa398f AB |
788 | v->res_sm = get_bits(gb, 2); //reserved |
789 | if (v->res_sm) | |
790 | { | |
791 | av_log(avctx, AV_LOG_ERROR, | |
792 | "Reserved RES_SM=%i is forbidden\n", v->res_sm); | |
7cc84d24 | 793 | return -1; |
21aa398f AB |
794 | } |
795 | } | |
796 | ||
797 | // (fps-2)/4 (->30) | |
798 | v->frmrtq_postproc = get_bits(gb, 3); //common | |
799 | // (bitrate-32kbps)/64kbps | |
800 | v->bitrtq_postproc = get_bits(gb, 5); //common | |
5fc32c27 | 801 | v->s.loop_filter = get_bits1(gb); //common |
25a0a0a5 IK |
802 | if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) |
803 | { | |
804 | av_log(avctx, AV_LOG_ERROR, | |
805 | "LOOPFILTER shell not be enabled in simple profile\n"); | |
806 | } | |
21aa398f | 807 | |
5fc32c27 | 808 | v->res_x8 = get_bits1(gb); //reserved |
5fc32c27 AB |
809 | v->multires = get_bits1(gb); |
810 | v->res_fasttx = get_bits1(gb); | |
6cf6d0ec KS |
811 | if (!v->res_fasttx) |
812 | { | |
59e6f60a AJ |
813 | v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct; |
814 | v->s.dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add; | |
815 | v->s.dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add; | |
3a18218e | 816 | v->s.dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add; |
21aa398f AB |
817 | } |
818 | ||
5fc32c27 | 819 | v->fastuvmc = get_bits1(gb); //common |
21aa398f AB |
820 | if (!v->profile && !v->fastuvmc) |
821 | { | |
822 | av_log(avctx, AV_LOG_ERROR, | |
823 | "FASTUVMC unavailable in Simple Profile\n"); | |
824 | return -1; | |
825 | } | |
5fc32c27 | 826 | v->extended_mv = get_bits1(gb); //common |
21aa398f AB |
827 | if (!v->profile && v->extended_mv) |
828 | { | |
829 | av_log(avctx, AV_LOG_ERROR, | |
830 | "Extended MVs unavailable in Simple Profile\n"); | |
831 | return -1; | |
832 | } | |
833 | v->dquant = get_bits(gb, 2); //common | |
5fc32c27 | 834 | v->vstransform = get_bits1(gb); //common |
42cc17f9 | 835 | |
5fc32c27 | 836 | v->res_transtab = get_bits1(gb); |
6cf6d0ec | 837 | if (v->res_transtab) |
21aa398f | 838 | { |
6cf6d0ec KS |
839 | av_log(avctx, AV_LOG_ERROR, |
840 | "1 for reserved RES_TRANSTAB is forbidden\n"); | |
841 | return -1; | |
21aa398f AB |
842 | } |
843 | ||
5fc32c27 | 844 | v->overlap = get_bits1(gb); //common |
21aa398f | 845 | |
5fc32c27 AB |
846 | v->s.resync_marker = get_bits1(gb); |
847 | v->rangered = get_bits1(gb); | |
6cf6d0ec | 848 | if (v->rangered && v->profile == PROFILE_SIMPLE) |
21aa398f | 849 | { |
6cf6d0ec KS |
850 | av_log(avctx, AV_LOG_INFO, |
851 | "RANGERED should be set to 0 in simple profile\n"); | |
21aa398f AB |
852 | } |
853 | ||
0d33db8a | 854 | v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common |
21aa398f AB |
855 | v->quantizer_mode = get_bits(gb, 2); //common |
856 | ||
5fc32c27 AB |
857 | v->finterpflag = get_bits1(gb); //common |
858 | v->res_rtm_flag = get_bits1(gb); //reserved | |
6cf6d0ec | 859 | if (!v->res_rtm_flag) |
21aa398f | 860 | { |
48d3fca7 KS |
861 | // av_log(avctx, AV_LOG_ERROR, |
862 | // "0 for reserved RES_RTM_FLAG is forbidden\n"); | |
6cf6d0ec KS |
863 | av_log(avctx, AV_LOG_ERROR, |
864 | "Old WMV3 version detected, only I-frames will be decoded\n"); | |
865 | //return -1; | |
866 | } | |
351f6b4e KS |
867 | //TODO: figure out what they mean (always 0x402F) |
868 | if(!v->res_fasttx) skip_bits(gb, 16); | |
6cf6d0ec | 869 | av_log(avctx, AV_LOG_DEBUG, |
21aa398f | 870 | "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" |
e148c6e1 | 871 | "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n" |
21aa398f AB |
872 | "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n" |
873 | "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n", | |
874 | v->profile, v->frmrtq_postproc, v->bitrtq_postproc, | |
2ce151f8 | 875 | v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv, |
0d33db8a | 876 | v->rangered, v->vstransform, v->overlap, v->s.resync_marker, |
21aa398f AB |
877 | v->dquant, v->quantizer_mode, avctx->max_b_frames |
878 | ); | |
6cf6d0ec | 879 | return 0; |
21aa398f AB |
880 | } |
881 | ||
3c275f6d KS |
882 | static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) |
883 | { | |
884 | v->res_rtm_flag = 1; | |
885 | v->level = get_bits(gb, 3); | |
886 | if(v->level >= 5) | |
887 | { | |
888 | av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level); | |
889 | } | |
890 | v->chromaformat = get_bits(gb, 2); | |
891 | if (v->chromaformat != 1) | |
892 | { | |
893 | av_log(v->s.avctx, AV_LOG_ERROR, | |
894 | "Only 4:2:0 chroma format supported\n"); | |
895 | return -1; | |
896 | } | |
897 | ||
898 | // (fps-2)/4 (->30) | |
899 | v->frmrtq_postproc = get_bits(gb, 3); //common | |
900 | // (bitrate-32kbps)/64kbps | |
901 | v->bitrtq_postproc = get_bits(gb, 5); //common | |
5fc32c27 | 902 | v->postprocflag = get_bits1(gb); //common |
3c275f6d KS |
903 | |
904 | v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1; | |
905 | v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1; | |
4305a4ef KS |
906 | v->s.avctx->width = v->s.avctx->coded_width; |
907 | v->s.avctx->height = v->s.avctx->coded_height; | |
3c275f6d KS |
908 | v->broadcast = get_bits1(gb); |
909 | v->interlace = get_bits1(gb); | |
910 | v->tfcntrflag = get_bits1(gb); | |
911 | v->finterpflag = get_bits1(gb); | |
3a5729ea | 912 | skip_bits1(gb); // reserved |
8ea780d7 | 913 | |
ab475795 KS |
914 | v->s.h_edge_pos = v->s.avctx->coded_width; |
915 | v->s.v_edge_pos = v->s.avctx->coded_height; | |
916 | ||
8ea780d7 KS |
917 | av_log(v->s.avctx, AV_LOG_DEBUG, |
918 | "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" | |
919 | "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n" | |
920 | "TFCTRflag=%i, FINTERPflag=%i\n", | |
921 | v->level, v->frmrtq_postproc, v->bitrtq_postproc, | |
922 | v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace, | |
923 | v->tfcntrflag, v->finterpflag | |
924 | ); | |
925 | ||
3c275f6d KS |
926 | v->psf = get_bits1(gb); |
927 | if(v->psf) { //PsF, 6.1.13 | |
928 | av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n"); | |
929 | return -1; | |
930 | } | |
6eda6e37 | 931 | v->s.max_b_frames = v->s.avctx->max_b_frames = 7; |
3c275f6d KS |
932 | if(get_bits1(gb)) { //Display Info - decoding is not affected by it |
933 | int w, h, ar = 0; | |
f0a85d5f | 934 | av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n"); |
e7cf38e5 KS |
935 | v->s.avctx->width = v->s.width = w = get_bits(gb, 14) + 1; |
936 | v->s.avctx->height = v->s.height = h = get_bits(gb, 14) + 1; | |
f0a85d5f | 937 | av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h); |
3c275f6d KS |
938 | if(get_bits1(gb)) |
939 | ar = get_bits(gb, 4); | |
74fd63d0 | 940 | if(ar && ar < 14){ |
a5c14fca | 941 | v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar]; |
74fd63d0 | 942 | }else if(ar == 15){ |
3c275f6d KS |
943 | w = get_bits(gb, 8); |
944 | h = get_bits(gb, 8); | |
74fd63d0 | 945 | v->s.avctx->sample_aspect_ratio = (AVRational){w, h}; |
3c275f6d KS |
946 | } |
947 | ||
948 | if(get_bits1(gb)){ //framerate stuff | |
949 | if(get_bits1(gb)) { | |
f0c31621 KS |
950 | v->s.avctx->time_base.num = 32; |
951 | v->s.avctx->time_base.den = get_bits(gb, 16) + 1; | |
3c275f6d | 952 | } else { |
f0c31621 KS |
953 | int nr, dr; |
954 | nr = get_bits(gb, 8); | |
955 | dr = get_bits(gb, 4); | |
956 | if(nr && nr < 8 && dr && dr < 3){ | |
a5c14fca KS |
957 | v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1]; |
958 | v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000; | |
f0c31621 | 959 | } |
3c275f6d KS |
960 | } |
961 | } | |
962 | ||
963 | if(get_bits1(gb)){ | |
964 | v->color_prim = get_bits(gb, 8); | |
965 | v->transfer_char = get_bits(gb, 8); | |
966 | v->matrix_coef = get_bits(gb, 8); | |
967 | } | |
968 | } | |
969 | ||
970 | v->hrd_param_flag = get_bits1(gb); | |
971 | if(v->hrd_param_flag) { | |
972 | int i; | |
973 | v->hrd_num_leaky_buckets = get_bits(gb, 5); | |
3a5729ea AB |
974 | skip_bits(gb, 4); //bitrate exponent |
975 | skip_bits(gb, 4); //buffer size exponent | |
3c275f6d | 976 | for(i = 0; i < v->hrd_num_leaky_buckets; i++) { |
3a5729ea AB |
977 | skip_bits(gb, 16); //hrd_rate[n] |
978 | skip_bits(gb, 16); //hrd_buffer[n] | |
3c275f6d KS |
979 | } |
980 | } | |
981 | return 0; | |
982 | } | |
983 | ||
984 | static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb) | |
985 | { | |
986 | VC1Context *v = avctx->priv_data; | |
6eda6e37 | 987 | int i, blink, clentry, refdist; |
3c275f6d KS |
988 | |
989 | av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32)); | |
8ea780d7 | 990 | blink = get_bits1(gb); // broken link |
6eda6e37 | 991 | clentry = get_bits1(gb); // closed entry |
3c275f6d | 992 | v->panscanflag = get_bits1(gb); |
8ea780d7 | 993 | refdist = get_bits1(gb); // refdist flag |
3c275f6d KS |
994 | v->s.loop_filter = get_bits1(gb); |
995 | v->fastuvmc = get_bits1(gb); | |
996 | v->extended_mv = get_bits1(gb); | |
997 | v->dquant = get_bits(gb, 2); | |
998 | v->vstransform = get_bits1(gb); | |
999 | v->overlap = get_bits1(gb); | |
1000 | v->quantizer_mode = get_bits(gb, 2); | |
1001 | ||
1002 | if(v->hrd_param_flag){ | |
1003 | for(i = 0; i < v->hrd_num_leaky_buckets; i++) { | |
3a5729ea | 1004 | skip_bits(gb, 8); //hrd_full[n] |
3c275f6d KS |
1005 | } |
1006 | } | |
1007 | ||
1008 | if(get_bits1(gb)){ | |
1009 | avctx->coded_width = (get_bits(gb, 12)+1)<<1; | |
1010 | avctx->coded_height = (get_bits(gb, 12)+1)<<1; | |
1011 | } | |
1012 | if(v->extended_mv) | |
1013 | v->extended_dmv = get_bits1(gb); | |
1014 | if(get_bits1(gb)) { | |
1015 | av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n"); | |
1016 | skip_bits(gb, 3); // Y range, ignored for now | |
1017 | } | |
1018 | if(get_bits1(gb)) { | |
1019 | av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n"); | |
1020 | skip_bits(gb, 3); // UV range, ignored for now | |
1021 | } | |
1022 | ||
8ea780d7 KS |
1023 | av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n" |
1024 | "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n" | |
1025 | "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n" | |
1026 | "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n", | |
6eda6e37 | 1027 | blink, clentry, v->panscanflag, refdist, v->s.loop_filter, |
8ea780d7 KS |
1028 | v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode); |
1029 | ||
3c275f6d KS |
1030 | return 0; |
1031 | } | |
21aa398f | 1032 | |
be3492ec | 1033 | static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) |
21aa398f | 1034 | { |
be3492ec KS |
1035 | int pqindex, lowquant, status; |
1036 | ||
5fc32c27 | 1037 | if(v->finterpflag) v->interpfrm = get_bits1(gb); |
be3492ec KS |
1038 | skip_bits(gb, 2); //framecnt unused |
1039 | v->rangeredfrm = 0; | |
5fc32c27 AB |
1040 | if (v->rangered) v->rangeredfrm = get_bits1(gb); |
1041 | v->s.pict_type = get_bits1(gb); | |
be3492ec KS |
1042 | if (v->s.avctx->max_b_frames) { |
1043 | if (!v->s.pict_type) { | |
5fc32c27 | 1044 | if (get_bits1(gb)) v->s.pict_type = I_TYPE; |
be3492ec KS |
1045 | else v->s.pict_type = B_TYPE; |
1046 | } else v->s.pict_type = P_TYPE; | |
1047 | } else v->s.pict_type = v->s.pict_type ? P_TYPE : I_TYPE; | |
1048 | ||
1dc1ce64 | 1049 | v->bi_type = 0; |
5df68893 | 1050 | if(v->s.pict_type == B_TYPE) { |
a5c14fca KS |
1051 | v->bfraction = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1); |
1052 | v->bfraction = ff_vc1_bfraction_lut[v->bfraction]; | |
1dc1ce64 | 1053 | if(v->bfraction == 0) { |
5df68893 KS |
1054 | v->s.pict_type = BI_TYPE; |
1055 | } | |
1056 | } | |
1dc1ce64 | 1057 | if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) |
3a5729ea | 1058 | skip_bits(gb, 7); // skip buffer fullness |
be3492ec | 1059 | |
c5b32ec1 | 1060 | /* calculate RND */ |
1dc1ce64 | 1061 | if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) |
c5b32ec1 KS |
1062 | v->rnd = 1; |
1063 | if(v->s.pict_type == P_TYPE) | |
1064 | v->rnd ^= 1; | |
1065 | ||
be3492ec KS |
1066 | /* Quantizer stuff */ |
1067 | pqindex = get_bits(gb, 5); | |
95e3fdb8 | 1068 | if(!pqindex) return -1; |
be3492ec | 1069 | if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
a5c14fca | 1070 | v->pq = ff_vc1_pquant_table[0][pqindex]; |
be3492ec | 1071 | else |
a5c14fca | 1072 | v->pq = ff_vc1_pquant_table[1][pqindex]; |
be3492ec | 1073 | |
0a45801f | 1074 | v->pquantizer = 1; |
be3492ec KS |
1075 | if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
1076 | v->pquantizer = pqindex < 9; | |
0a45801f KS |
1077 | if (v->quantizer_mode == QUANT_NON_UNIFORM) |
1078 | v->pquantizer = 0; | |
be3492ec | 1079 | v->pqindex = pqindex; |
5fc32c27 | 1080 | if (pqindex < 9) v->halfpq = get_bits1(gb); |
be3492ec KS |
1081 | else v->halfpq = 0; |
1082 | if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) | |
5fc32c27 | 1083 | v->pquantizer = get_bits1(gb); |
be3492ec | 1084 | v->dquantfrm = 0; |
3c2ddb59 | 1085 | if (v->extended_mv == 1) v->mvrange = get_unary(gb, 0, 3); |
5c4b8efd KS |
1086 | v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 |
1087 | v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | |
1088 | v->range_x = 1 << (v->k_x - 1); | |
1089 | v->range_y = 1 << (v->k_y - 1); | |
1090 | if (v->profile == PROFILE_ADVANCED) | |
1091 | { | |
5fc32c27 | 1092 | if (v->postprocflag) v->postproc = get_bits1(gb); |
5c4b8efd KS |
1093 | } |
1094 | else | |
1095 | if (v->multires && v->s.pict_type != B_TYPE) v->respic = get_bits(gb, 2); | |
be3492ec | 1096 | |
9d1f80f2 | 1097 | if(v->res_x8 && (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)){ |
9abc7e0f MN |
1098 | v->x8_type = get_bits1(gb); |
1099 | }else v->x8_type = 0; | |
be3492ec KS |
1100 | //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n", |
1101 | // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm); | |
1102 | ||
6b33eed8 KS |
1103 | if(v->s.pict_type == I_TYPE || v->s.pict_type == P_TYPE) v->use_ic = 0; |
1104 | ||
be3492ec KS |
1105 | switch(v->s.pict_type) { |
1106 | case P_TYPE: | |
1107 | if (v->pq < 5) v->tt_index = 0; | |
1108 | else if(v->pq < 13) v->tt_index = 1; | |
1109 | else v->tt_index = 2; | |
1110 | ||
be3492ec | 1111 | lowquant = (v->pq > 12) ? 0 : 1; |
3c2ddb59 | 1112 | v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; |
be3492ec KS |
1113 | if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
1114 | { | |
66d0ad26 | 1115 | int scale, shift, i; |
3c2ddb59 | 1116 | v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; |
be3492ec KS |
1117 | v->lumscale = get_bits(gb, 6); |
1118 | v->lumshift = get_bits(gb, 6); | |
6b33eed8 | 1119 | v->use_ic = 1; |
66d0ad26 KS |
1120 | /* fill lookup tables for intensity compensation */ |
1121 | if(!v->lumscale) { | |
1122 | scale = -64; | |
1123 | shift = (255 - v->lumshift * 2) << 6; | |
1124 | if(v->lumshift > 31) | |
1125 | shift += 128 << 6; | |
1126 | } else { | |
1127 | scale = v->lumscale + 32; | |
1128 | if(v->lumshift > 31) | |
1129 | shift = (v->lumshift - 64) << 6; | |
1130 | else | |
1131 | shift = v->lumshift << 6; | |
1132 | } | |
1133 | for(i = 0; i < 256; i++) { | |
f66e4f5f RD |
1134 | v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6); |
1135 | v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); | |
66d0ad26 | 1136 | } |
be3492ec KS |
1137 | } |
1138 | if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN) | |
87dfe848 | 1139 | v->s.quarter_sample = 0; |
05103ed3 KS |
1140 | else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { |
1141 | if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN) | |
1142 | v->s.quarter_sample = 0; | |
1143 | else | |
1144 | v->s.quarter_sample = 1; | |
1145 | } else | |
87dfe848 | 1146 | v->s.quarter_sample = 1; |
09be55df | 1147 | v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)); |
be3492ec | 1148 | |
be3492ec KS |
1149 | if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && |
1150 | v->mv_mode2 == MV_PMODE_MIXED_MV) | |
1151 | || v->mv_mode == MV_PMODE_MIXED_MV) | |
1152 | { | |
87dfe848 | 1153 | status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v); |
be3492ec KS |
1154 | if (status < 0) return -1; |
1155 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " | |
1156 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
87dfe848 KS |
1157 | } else { |
1158 | v->mv_type_is_raw = 0; | |
1159 | memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height); | |
be3492ec | 1160 | } |
0f7344aa | 1161 | status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); |
be3492ec KS |
1162 | if (status < 0) return -1; |
1163 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
1164 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1165 | ||
1166 | /* Hopefully this is correct for P frames */ | |
a5c14fca KS |
1167 | v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables |
1168 | v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
be3492ec KS |
1169 | |
1170 | if (v->dquant) | |
1171 | { | |
1172 | av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
1173 | vop_dquant_decoding(v); | |
1174 | } | |
1175 | ||
1176 | v->ttfrm = 0; //FIXME Is that so ? | |
1177 | if (v->vstransform) | |
1178 | { | |
5fc32c27 | 1179 | v->ttmbf = get_bits1(gb); |
be3492ec KS |
1180 | if (v->ttmbf) |
1181 | { | |
a5c14fca | 1182 | v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
be3492ec | 1183 | } |
b53921aa KS |
1184 | } else { |
1185 | v->ttmbf = 1; | |
1186 | v->ttfrm = TT_8X8; | |
be3492ec KS |
1187 | } |
1188 | break; | |
1189 | case B_TYPE: | |
5df68893 KS |
1190 | if (v->pq < 5) v->tt_index = 0; |
1191 | else if(v->pq < 13) v->tt_index = 1; | |
1192 | else v->tt_index = 2; | |
1193 | ||
1194 | lowquant = (v->pq > 12) ? 0 : 1; | |
1195 | v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN; | |
1196 | v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV); | |
09be55df | 1197 | v->s.mspel = v->s.quarter_sample; |
5df68893 KS |
1198 | |
1199 | status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v); | |
1200 | if (status < 0) return -1; | |
1201 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: " | |
1202 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1203 | status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
1204 | if (status < 0) return -1; | |
1205 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
1206 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1207 | ||
1208 | v->s.mv_table_index = get_bits(gb, 2); | |
a5c14fca | 1209 | v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; |
5df68893 KS |
1210 | |
1211 | if (v->dquant) | |
1212 | { | |
1213 | av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
1214 | vop_dquant_decoding(v); | |
1215 | } | |
1216 | ||
1217 | v->ttfrm = 0; | |
1218 | if (v->vstransform) | |
1219 | { | |
5fc32c27 | 1220 | v->ttmbf = get_bits1(gb); |
5df68893 KS |
1221 | if (v->ttmbf) |
1222 | { | |
a5c14fca | 1223 | v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
5df68893 KS |
1224 | } |
1225 | } else { | |
1226 | v->ttmbf = 1; | |
1227 | v->ttfrm = TT_8X8; | |
1228 | } | |
be3492ec | 1229 | break; |
21aa398f | 1230 | } |
be3492ec | 1231 | |
8590bcc3 | 1232 | if(!v->x8_type) |
21aa398f | 1233 | { |
8590bcc3 MN |
1234 | /* AC Syntax */ |
1235 | v->c_ac_table_index = decode012(gb); | |
1236 | if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) | |
1237 | { | |
1238 | v->y_ac_table_index = decode012(gb); | |
1239 | } | |
1240 | /* DC Syntax */ | |
1241 | v->s.dc_table_index = get_bits1(gb); | |
21aa398f | 1242 | } |
be3492ec | 1243 | |
1dc1ce64 KS |
1244 | if(v->s.pict_type == BI_TYPE) { |
1245 | v->s.pict_type = B_TYPE; | |
1246 | v->bi_type = 1; | |
1247 | } | |
21aa398f AB |
1248 | return 0; |
1249 | } | |
21aa398f | 1250 | |
3c275f6d KS |
1251 | static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) |
1252 | { | |
3c275f6d KS |
1253 | int pqindex, lowquant; |
1254 | int status; | |
1255 | ||
1256 | v->p_frame_skipped = 0; | |
1257 | ||
ac91185f | 1258 | if(v->interlace){ |
93731ff2 | 1259 | v->fcm = decode012(gb); |
ac91185f KS |
1260 | if(v->fcm) return -1; // interlaced frames/fields are not implemented |
1261 | } | |
3c2ddb59 | 1262 | switch(get_unary(gb, 0, 4)) { |
3c275f6d KS |
1263 | case 0: |
1264 | v->s.pict_type = P_TYPE; | |
1265 | break; | |
1266 | case 1: | |
1267 | v->s.pict_type = B_TYPE; | |
5081f3aa | 1268 | break; |
3c275f6d KS |
1269 | case 2: |
1270 | v->s.pict_type = I_TYPE; | |
1271 | break; | |
1272 | case 3: | |
1273 | v->s.pict_type = BI_TYPE; | |
76751653 | 1274 | break; |
3c275f6d KS |
1275 | case 4: |
1276 | v->s.pict_type = P_TYPE; // skipped pic | |
1277 | v->p_frame_skipped = 1; | |
1278 | return 0; | |
1279 | } | |
1280 | if(v->tfcntrflag) | |
3a5729ea | 1281 | skip_bits(gb, 8); |
3c275f6d | 1282 | if(v->broadcast) { |
02c823d4 | 1283 | if(!v->interlace || v->psf) { |
93731ff2 | 1284 | v->rptfrm = get_bits(gb, 2); |
3c275f6d | 1285 | } else { |
93731ff2 KS |
1286 | v->tff = get_bits1(gb); |
1287 | v->rptfrm = get_bits1(gb); | |
3c275f6d KS |
1288 | } |
1289 | } | |
1290 | if(v->panscanflag) { | |
1291 | //... | |
1292 | } | |
1293 | v->rnd = get_bits1(gb); | |
1294 | if(v->interlace) | |
1295 | v->uvsamp = get_bits1(gb); | |
5fc32c27 | 1296 | if(v->finterpflag) v->interpfrm = get_bits1(gb); |
5081f3aa | 1297 | if(v->s.pict_type == B_TYPE) { |
a5c14fca KS |
1298 | v->bfraction = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1); |
1299 | v->bfraction = ff_vc1_bfraction_lut[v->bfraction]; | |
5081f3aa KS |
1300 | if(v->bfraction == 0) { |
1301 | v->s.pict_type = BI_TYPE; /* XXX: should not happen here */ | |
1302 | } | |
1303 | } | |
3c275f6d | 1304 | pqindex = get_bits(gb, 5); |
95e3fdb8 | 1305 | if(!pqindex) return -1; |
3c275f6d KS |
1306 | v->pqindex = pqindex; |
1307 | if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) | |
a5c14fca | 1308 | v->pq = ff_vc1_pquant_table[0][pqindex]; |
3c275f6d | 1309 | else |
a5c14fca | 1310 | v->pq = ff_vc1_pquant_table[1][pqindex]; |
3c275f6d KS |
1311 | |
1312 | v->pquantizer = 1; | |
1313 | if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) | |
1314 | v->pquantizer = pqindex < 9; | |
1315 | if (v->quantizer_mode == QUANT_NON_UNIFORM) | |
1316 | v->pquantizer = 0; | |
1317 | v->pqindex = pqindex; | |
5fc32c27 | 1318 | if (pqindex < 9) v->halfpq = get_bits1(gb); |
3c275f6d KS |
1319 | else v->halfpq = 0; |
1320 | if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) | |
5fc32c27 | 1321 | v->pquantizer = get_bits1(gb); |
3c275f6d | 1322 | |
674678b0 KS |
1323 | if(v->s.pict_type == I_TYPE || v->s.pict_type == P_TYPE) v->use_ic = 0; |
1324 | ||
3c275f6d KS |
1325 | switch(v->s.pict_type) { |
1326 | case I_TYPE: | |
76751653 | 1327 | case BI_TYPE: |
3c275f6d KS |
1328 | status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v); |
1329 | if (status < 0) return -1; | |
1330 | av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: " | |
1331 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1332 | v->condover = CONDOVER_NONE; | |
1333 | if(v->overlap && v->pq <= 8) { | |
1334 | v->condover = decode012(gb); | |
1335 | if(v->condover == CONDOVER_SELECT) { | |
1336 | status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v); | |
1337 | if (status < 0) return -1; | |
1338 | av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: " | |
1339 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1340 | } | |
1341 | } | |
1342 | break; | |
1343 | case P_TYPE: | |
1344 | if(v->postprocflag) | |
1345 | v->postproc = get_bits1(gb); | |
3c2ddb59 | 1346 | if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); |
3c275f6d KS |
1347 | else v->mvrange = 0; |
1348 | v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | |
1349 | v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | |
1350 | v->range_x = 1 << (v->k_x - 1); | |
1351 | v->range_y = 1 << (v->k_y - 1); | |
1352 | ||
1353 | if (v->pq < 5) v->tt_index = 0; | |
1354 | else if(v->pq < 13) v->tt_index = 1; | |
1355 | else v->tt_index = 2; | |
1356 | ||
1357 | lowquant = (v->pq > 12) ? 0 : 1; | |
3c2ddb59 | 1358 | v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; |
3c275f6d KS |
1359 | if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
1360 | { | |
1361 | int scale, shift, i; | |
3c2ddb59 | 1362 | v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; |
3c275f6d KS |
1363 | v->lumscale = get_bits(gb, 6); |
1364 | v->lumshift = get_bits(gb, 6); | |
1365 | /* fill lookup tables for intensity compensation */ | |
1366 | if(!v->lumscale) { | |
1367 | scale = -64; | |
1368 | shift = (255 - v->lumshift * 2) << 6; | |
1369 | if(v->lumshift > 31) | |
1370 | shift += 128 << 6; | |
1371 | } else { | |
1372 | scale = v->lumscale + 32; | |
1373 | if(v->lumshift > 31) | |
1374 | shift = (v->lumshift - 64) << 6; | |
1375 | else | |
1376 | shift = v->lumshift << 6; | |
1377 | } | |
1378 | for(i = 0; i < 256; i++) { | |
f66e4f5f RD |
1379 | v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6); |
1380 | v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); | |
3c275f6d | 1381 | } |
674678b0 | 1382 | v->use_ic = 1; |
3c275f6d KS |
1383 | } |
1384 | if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN) | |
1385 | v->s.quarter_sample = 0; | |
1386 | else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
1387 | if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN) | |
1388 | v->s.quarter_sample = 0; | |
1389 | else | |
1390 | v->s.quarter_sample = 1; | |
1391 | } else | |
1392 | v->s.quarter_sample = 1; | |
1393 | v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)); | |
1394 | ||
1395 | if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && | |
1396 | v->mv_mode2 == MV_PMODE_MIXED_MV) | |
1397 | || v->mv_mode == MV_PMODE_MIXED_MV) | |
1398 | { | |
1399 | status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v); | |
1400 | if (status < 0) return -1; | |
1401 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " | |
1402 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1403 | } else { | |
1404 | v->mv_type_is_raw = 0; | |
1405 | memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height); | |
1406 | } | |
1407 | status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
1408 | if (status < 0) return -1; | |
1409 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
1410 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1411 | ||
1412 | /* Hopefully this is correct for P frames */ | |
a5c14fca KS |
1413 | v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables |
1414 | v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
3c275f6d KS |
1415 | if (v->dquant) |
1416 | { | |
1417 | av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
1418 | vop_dquant_decoding(v); | |
1419 | } | |
1420 | ||
1421 | v->ttfrm = 0; //FIXME Is that so ? | |
1422 | if (v->vstransform) | |
1423 | { | |
5fc32c27 | 1424 | v->ttmbf = get_bits1(gb); |
3c275f6d KS |
1425 | if (v->ttmbf) |
1426 | { | |
a5c14fca | 1427 | v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
3c275f6d KS |
1428 | } |
1429 | } else { | |
1430 | v->ttmbf = 1; | |
1431 | v->ttfrm = TT_8X8; | |
1432 | } | |
1433 | break; | |
5081f3aa KS |
1434 | case B_TYPE: |
1435 | if(v->postprocflag) | |
1436 | v->postproc = get_bits1(gb); | |
3c2ddb59 | 1437 | if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); |
5081f3aa KS |
1438 | else v->mvrange = 0; |
1439 | v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | |
1440 | v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | |
1441 | v->range_x = 1 << (v->k_x - 1); | |
1442 | v->range_y = 1 << (v->k_y - 1); | |
1443 | ||
1444 | if (v->pq < 5) v->tt_index = 0; | |
1445 | else if(v->pq < 13) v->tt_index = 1; | |
1446 | else v->tt_index = 2; | |
1447 | ||
1448 | lowquant = (v->pq > 12) ? 0 : 1; | |
1449 | v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN; | |
1450 | v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV); | |
1451 | v->s.mspel = v->s.quarter_sample; | |
1452 | ||
1453 | status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v); | |
1454 | if (status < 0) return -1; | |
1455 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: " | |
1456 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1457 | status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
1458 | if (status < 0) return -1; | |
1459 | av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
1460 | "Imode: %i, Invert: %i\n", status>>1, status&1); | |
1461 | ||
1462 | v->s.mv_table_index = get_bits(gb, 2); | |
a5c14fca | 1463 | v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; |
5081f3aa KS |
1464 | |
1465 | if (v->dquant) | |
1466 | { | |
1467 | av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
1468 | vop_dquant_decoding(v); | |
1469 | } | |
1470 | ||
1471 | v->ttfrm = 0; | |
1472 | if (v->vstransform) | |
1473 | { | |
5fc32c27 | 1474 | v->ttmbf = get_bits1(gb); |
5081f3aa KS |
1475 | if (v->ttmbf) |
1476 | { | |
a5c14fca | 1477 | v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
5081f3aa KS |
1478 | } |
1479 | } else { | |
1480 | v->ttmbf = 1; | |
1481 | v->ttfrm = TT_8X8; | |
1482 | } | |
1483 | break; | |
3c275f6d KS |
1484 | } |
1485 | ||
1486 | /* AC Syntax */ | |
1487 | v->c_ac_table_index = decode012(gb); | |
1488 | if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) | |
1489 | { | |
1490 | v->y_ac_table_index = decode012(gb); | |
1491 | } | |
1492 | /* DC Syntax */ | |
5fc32c27 | 1493 | v->s.dc_table_index = get_bits1(gb); |
b024824b | 1494 | if ((v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) && v->dquant) { |
3c275f6d KS |
1495 | av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); |
1496 | vop_dquant_decoding(v); | |
1497 | } | |
1498 | ||
76751653 KS |
1499 | v->bi_type = 0; |
1500 | if(v->s.pict_type == BI_TYPE) { | |
1501 | v->s.pict_type = B_TYPE; | |
1502 | v->bi_type = 1; | |
1503 | } | |
3c275f6d KS |
1504 | return 0; |
1505 | } | |
1506 | ||
2ce151f8 | 1507 | /***********************************************************************/ |
1508 | /** | |
be3492ec KS |
1509 | * @defgroup block VC-1 Block-level functions |
1510 | * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | |
2ce151f8 | 1511 | * @{ |
1512 | */ | |
1513 | ||
be3492ec KS |
1514 | /** |
1515 | * @def GET_MQUANT | |
1516 | * @brief Get macroblock-level quantizer scale | |
2ce151f8 | 1517 | */ |
be3492ec KS |
1518 | #define GET_MQUANT() \ |
1519 | if (v->dquantfrm) \ | |
1520 | { \ | |
35a9cac8 | 1521 | int edges = 0; \ |
be3492ec KS |
1522 | if (v->dqprofile == DQPROFILE_ALL_MBS) \ |
1523 | { \ | |
1524 | if (v->dqbilevel) \ | |
1525 | { \ | |
5fc32c27 | 1526 | mquant = (get_bits1(gb)) ? v->altpq : v->pq; \ |
be3492ec KS |
1527 | } \ |
1528 | else \ | |
1529 | { \ | |
1530 | mqdiff = get_bits(gb, 3); \ | |
1531 | if (mqdiff != 7) mquant = v->pq + mqdiff; \ | |
1532 | else mquant = get_bits(gb, 5); \ | |
1533 | } \ | |
1534 | } \ | |
35a9cac8 KS |
1535 | if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \ |
1536 | edges = 1 << v->dqsbedge; \ | |
e4bf0302 | 1537 | else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \ |
35a9cac8 | 1538 | edges = (3 << v->dqsbedge) % 15; \ |
e4bf0302 | 1539 | else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \ |
35a9cac8 | 1540 | edges = 15; \ |
35a9cac8 KS |
1541 | if((edges&1) && !s->mb_x) \ |
1542 | mquant = v->altpq; \ | |
3a3f1cf3 | 1543 | if((edges&2) && s->first_slice_line) \ |
35a9cac8 KS |
1544 | mquant = v->altpq; \ |
1545 | if((edges&4) && s->mb_x == (s->mb_width - 1)) \ | |
1546 | mquant = v->altpq; \ | |
1547 | if((edges&8) && s->mb_y == (s->mb_height - 1)) \ | |
1548 | mquant = v->altpq; \ | |
be3492ec | 1549 | } |
2ce151f8 | 1550 | |
be3492ec KS |
1551 | /** |
1552 | * @def GET_MVDATA(_dmv_x, _dmv_y) | |
1553 | * @brief Get MV differentials | |
1554 | * @see MVDATA decoding from 8.3.5.2, p(1)20 | |
1555 | * @param _dmv_x Horizontal differential for decoded MV | |
1556 | * @param _dmv_y Vertical differential for decoded MV | |
2ce151f8 | 1557 | */ |
be3492ec | 1558 | #define GET_MVDATA(_dmv_x, _dmv_y) \ |
a5c14fca | 1559 | index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table,\ |
be3492ec KS |
1560 | VC1_MV_DIFF_VLC_BITS, 2); \ |
1561 | if (index > 36) \ | |
1562 | { \ | |
1563 | mb_has_coeffs = 1; \ | |
1564 | index -= 37; \ | |
1565 | } \ | |
1566 | else mb_has_coeffs = 0; \ | |
1567 | s->mb_intra = 0; \ | |
1568 | if (!index) { _dmv_x = _dmv_y = 0; } \ | |
1569 | else if (index == 35) \ | |
1570 | { \ | |
87dfe848 KS |
1571 | _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \ |
1572 | _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \ | |
be3492ec KS |
1573 | } \ |
1574 | else if (index == 36) \ | |
1575 | { \ | |
1576 | _dmv_x = 0; \ | |
1577 | _dmv_y = 0; \ | |
1578 | s->mb_intra = 1; \ | |
1579 | } \ | |
1580 | else \ | |
1581 | { \ | |
1582 | index1 = index%6; \ | |
87dfe848 KS |
1583 | if (!s->quarter_sample && index1 == 5) val = 1; \ |
1584 | else val = 0; \ | |
e8ba1cea KS |
1585 | if(size_table[index1] - val > 0) \ |
1586 | val = get_bits(gb, size_table[index1] - val); \ | |
1587 | else val = 0; \ | |
be3492ec KS |
1588 | sign = 0 - (val&1); \ |
1589 | _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
1590 | \ | |
1591 | index1 = index/6; \ | |
87dfe848 KS |
1592 | if (!s->quarter_sample && index1 == 5) val = 1; \ |
1593 | else val = 0; \ | |
e8ba1cea KS |
1594 | if(size_table[index1] - val > 0) \ |
1595 | val = get_bits(gb, size_table[index1] - val); \ | |
1596 | else val = 0; \ | |
be3492ec KS |
1597 | sign = 0 - (val&1); \ |
1598 | _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
1599 | } | |
21aa398f | 1600 | |
be3492ec | 1601 | /** Predict and set motion vector |
2ce151f8 | 1602 | */ |
e4bf0302 | 1603 | static inline void vc1_pred_mv(MpegEncContext *s, int n, int dmv_x, int dmv_y, int mv1, int r_x, int r_y, uint8_t* is_intra) |
0d33db8a | 1604 | { |
e4bf0302 | 1605 | int xy, wrap, off = 0; |
be3492ec KS |
1606 | int16_t *A, *B, *C; |
1607 | int px, py; | |
1608 | int sum; | |
0d33db8a | 1609 | |
be3492ec | 1610 | /* scale MV difference to be quad-pel */ |
87dfe848 KS |
1611 | dmv_x <<= 1 - s->quarter_sample; |
1612 | dmv_y <<= 1 - s->quarter_sample; | |
d29f0cd9 | 1613 | |
be3492ec | 1614 | wrap = s->b8_stride; |
e4bf0302 | 1615 | xy = s->block_index[n]; |
d29f0cd9 | 1616 | |
e4bf0302 KS |
1617 | if(s->mb_intra){ |
1618 | s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0; | |
1619 | s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0; | |
9a44385e KS |
1620 | s->current_picture.motion_val[1][xy][0] = 0; |
1621 | s->current_picture.motion_val[1][xy][1] = 0; | |
e4bf0302 KS |
1622 | if(mv1) { /* duplicate motion data for 1-MV block */ |
1623 | s->current_picture.motion_val[0][xy + 1][0] = 0; | |
1624 | s->current_picture.motion_val[0][xy + 1][1] = 0; | |
1625 | s->current_picture.motion_val[0][xy + wrap][0] = 0; | |
1626 | s->current_picture.motion_val[0][xy + wrap][1] = 0; | |
1627 | s->current_picture.motion_val[0][xy + wrap + 1][0] = 0; | |
1628 | s->current_picture.motion_val[0][xy + wrap + 1][1] = 0; | |
9a44385e KS |
1629 | s->current_picture.motion_val[1][xy + 1][0] = 0; |
1630 | s->current_picture.motion_val[1][xy + 1][1] = 0; | |
1631 | s->current_picture.motion_val[1][xy + wrap][0] = 0; | |
1632 | s->current_picture.motion_val[1][xy + wrap][1] = 0; | |
1633 | s->current_picture.motion_val[1][xy + wrap + 1][0] = 0; | |
1634 | s->current_picture.motion_val[1][xy + wrap + 1][1] = 0; | |
e4bf0302 KS |
1635 | } |
1636 | return; | |
1637 | } | |
1638 | ||
1639 | C = s->current_picture.motion_val[0][xy - 1]; | |
1640 | A = s->current_picture.motion_val[0][xy - wrap]; | |
1641 | if(mv1) | |
1642 | off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2; | |
1643 | else { | |
1644 | //in 4-MV mode different blocks have different B predictor position | |
1645 | switch(n){ | |
1646 | case 0: | |
1647 | off = (s->mb_x > 0) ? -1 : 1; | |
1648 | break; | |
1649 | case 1: | |
1650 | off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1; | |
1651 | break; | |
1652 | case 2: | |
1653 | off = 1; | |
1654 | break; | |
1655 | case 3: | |
1656 | off = -1; | |
1657 | } | |
1658 | } | |
1659 | B = s->current_picture.motion_val[0][xy - wrap + off]; | |
d29f0cd9 | 1660 | |
e4bf0302 | 1661 | if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds |
be3492ec KS |
1662 | if(s->mb_width == 1) { |
1663 | px = A[0]; | |
1664 | py = A[1]; | |
1665 | } else { | |
1666 | px = mid_pred(A[0], B[0], C[0]); | |
1667 | py = mid_pred(A[1], B[1], C[1]); | |
1668 | } | |
e4bf0302 | 1669 | } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds |
be3492ec KS |
1670 | px = C[0]; |
1671 | py = C[1]; | |
1672 | } else { | |
1673 | px = py = 0; | |
1674 | } | |
be3492ec KS |
1675 | /* Pullback MV as specified in 8.3.5.3.4 */ |
1676 | { | |
1677 | int qx, qy, X, Y; | |
ef6cc8ce KS |
1678 | qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0); |
1679 | qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0); | |
be3492ec KS |
1680 | X = (s->mb_width << 6) - 4; |
1681 | Y = (s->mb_height << 6) - 4; | |
1682 | if(mv1) { | |
1683 | if(qx + px < -60) px = -60 - qx; | |
1684 | if(qy + py < -60) py = -60 - qy; | |
1685 | } else { | |
1686 | if(qx + px < -28) px = -28 - qx; | |
1687 | if(qy + py < -28) py = -28 - qy; | |
1688 | } | |
1689 | if(qx + px > X) px = X - qx; | |
1690 | if(qy + py > Y) py = Y - qy; | |
1691 | } | |
1692 | /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | |
e4bf0302 KS |
1693 | if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) { |
1694 | if(is_intra[xy - wrap]) | |
c26abfa5 | 1695 | sum = FFABS(px) + FFABS(py); |
d29f0cd9 | 1696 | else |
c26abfa5 | 1697 | sum = FFABS(px - A[0]) + FFABS(py - A[1]); |
be3492ec KS |
1698 | if(sum > 32) { |
1699 | if(get_bits1(&s->gb)) { | |
1700 | px = A[0]; | |
1701 | py = A[1]; | |
1702 | } else { | |
1703 | px = C[0]; | |
1704 | py = C[1]; | |
1705 | } | |
1706 | } else { | |
e4bf0302 | 1707 | if(is_intra[xy - 1]) |
c26abfa5 | 1708 | sum = FFABS(px) + FFABS(py); |
be3492ec | 1709 | else |
c26abfa5 | 1710 | sum = FFABS(px - C[0]) + FFABS(py - C[1]); |
be3492ec KS |
1711 | if(sum > 32) { |
1712 | if(get_bits1(&s->gb)) { | |
1713 | px = A[0]; | |
1714 | py = A[1]; | |
1715 | } else { | |
1716 | px = C[0]; | |
1717 | py = C[1]; | |
1718 | } | |
1719 | } | |
1720 | } | |
d29f0cd9 | 1721 | } |
be3492ec | 1722 | /* store MV using signed modulus of MV range defined in 4.11 */ |
e4bf0302 KS |
1723 | s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x; |
1724 | s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y; | |
1725 | if(mv1) { /* duplicate motion data for 1-MV block */ | |
1726 | s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0]; | |
1727 | s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1]; | |
1728 | s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0]; | |
1729 | s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1]; | |
1730 | s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0]; | |
1731 | s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1]; | |
1732 | } | |
d29f0cd9 MN |
1733 | } |
1734 | ||
fb2d9140 KS |
1735 | /** Motion compensation for direct or interpolated blocks in B-frames |
1736 | */ | |
1737 | static void vc1_interp_mc(VC1Context *v) | |
1738 | { | |
1739 | MpegEncContext *s = &v->s; | |
1740 | DSPContext *dsp = &v->s.dsp; | |
1741 | uint8_t *srcY, *srcU, *srcV; | |
1742 | int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; | |
1743 | ||
1744 | if(!v->s.next_picture.data[0])return; | |
1745 | ||
1746 | mx = s->mv[1][0][0]; | |
1747 | my = s->mv[1][0][1]; | |
1748 | uvmx = (mx + ((mx & 3) == 3)) >> 1; | |
1749 | uvmy = (my + ((my & 3) == 3)) >> 1; | |
08baa3e0 KS |
1750 | if(v->fastuvmc) { |
1751 | uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1)); | |
1752 | uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1)); | |
1753 | } | |
fb2d9140 KS |
1754 | srcY = s->next_picture.data[0]; |
1755 | srcU = s->next_picture.data[1]; | |
1756 | srcV = s->next_picture.data[2]; | |
1757 | ||
1758 | src_x = s->mb_x * 16 + (mx >> 2); | |
1759 | src_y = s->mb_y * 16 + (my >> 2); | |
1760 | uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
1761 | uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
1762 | ||
7c971233 KS |
1763 | if(v->profile != PROFILE_ADVANCED){ |
1764 | src_x = av_clip( src_x, -16, s->mb_width * 16); | |
1765 | src_y = av_clip( src_y, -16, s->mb_height * 16); | |
1766 | uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); | |
1767 | uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); | |
1768 | }else{ | |
1769 | src_x = av_clip( src_x, -17, s->avctx->coded_width); | |
1770 | src_y = av_clip( src_y, -18, s->avctx->coded_height + 1); | |
1771 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
1772 | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
1773 | } | |
fb2d9140 KS |
1774 | |
1775 | srcY += src_y * s->linesize + src_x; | |
1776 | srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
1777 | srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
1778 | ||
1779 | /* for grayscale we should not try to read from unknown area */ | |
1780 | if(s->flags & CODEC_FLAG_GRAY) { | |
1781 | srcU = s->edge_emu_buffer + 18 * s->linesize; | |
1782 | srcV = s->edge_emu_buffer + 18 * s->linesize; | |
1783 | } | |
1784 | ||
1785 | if(v->rangeredfrm | |
1786 | || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 | |
1787 | || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ | |
1788 | uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; | |
1789 | ||
b116cc7f KS |
1790 | srcY -= s->mspel * (1 + s->linesize); |
1791 | ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2, | |
fb2d9140 KS |
1792 | src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); |
1793 | srcY = s->edge_emu_buffer; | |
1794 | ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, | |
1795 | uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
1796 | ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, | |
1797 | uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
1798 | srcU = uvbuf; | |
1799 | srcV = uvbuf + 16; | |
1800 | /* if we deal with range reduction we need to scale source blocks */ | |
1801 | if(v->rangeredfrm) { | |
1802 | int i, j; | |
1803 | uint8_t *src, *src2; | |
1804 | ||
1805 | src = srcY; | |
b116cc7f KS |
1806 | for(j = 0; j < 17 + s->mspel*2; j++) { |
1807 | for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; | |
fb2d9140 KS |
1808 | src += s->linesize; |
1809 | } | |
1810 | src = srcU; src2 = srcV; | |
1811 | for(j = 0; j < 9; j++) { | |
1812 | for(i = 0; i < 9; i++) { | |
1813 | src[i] = ((src[i] - 128) >> 1) + 128; | |
1814 | src2[i] = ((src2[i] - 128) >> 1) + 128; | |
1815 | } | |
1816 | src += s->uvlinesize; | |
1817 | src2 += s->uvlinesize; | |
1818 | } | |
1819 | } | |
b116cc7f | 1820 | srcY += s->mspel * (1 + s->linesize); |
fb2d9140 KS |
1821 | } |
1822 | ||
66ff2c1f KS |
1823 | mx >>= 1; |
1824 | my >>= 1; | |
1825 | dxy = ((my & 1) << 1) | (mx & 1); | |
fb2d9140 | 1826 | |
66ff2c1f | 1827 | dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); |
fb2d9140 KS |
1828 | |
1829 | if(s->flags & CODEC_FLAG_GRAY) return; | |
1830 | /* Chroma MC always uses qpel blilinear */ | |
1831 | uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); | |
c8868640 KS |
1832 | uvmx = (uvmx&3)<<1; |
1833 | uvmy = (uvmy&3)<<1; | |
1834 | dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
1835 | dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
fb2d9140 KS |
1836 | } |
1837 | ||
849f1035 | 1838 | static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs) |
1dc1ce64 KS |
1839 | { |
1840 | int n = bfrac; | |
1841 | ||
1842 | #if B_FRACTION_DEN==256 | |
1843 | if(inv) | |
1844 | n -= 256; | |
1845 | if(!qs) | |
1846 | return 2 * ((value * n + 255) >> 9); | |
1847 | return (value * n + 128) >> 8; | |
1848 | #else | |
1849 | if(inv) | |
1850 | n -= B_FRACTION_DEN; | |
1851 | if(!qs) | |
1852 | return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN)); | |
1853 | return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN; | |
1854 | #endif | |
1855 | } | |
1856 | ||
5df68893 KS |
1857 | /** Reconstruct motion vector for B-frame and do motion compensation |
1858 | */ | |
1859 | static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode) | |
1860 | { | |
6b33eed8 KS |
1861 | if(v->use_ic) { |
1862 | v->mv_mode2 = v->mv_mode; | |
1863 | v->mv_mode = MV_PMODE_INTENSITY_COMP; | |
1864 | } | |
1dc1ce64 KS |
1865 | if(direct) { |
1866 | vc1_mc_1mv(v, 0); | |
1867 | vc1_interp_mc(v); | |
6b33eed8 | 1868 | if(v->use_ic) v->mv_mode = v->mv_mode2; |
1dc1ce64 KS |
1869 | return; |
1870 | } | |
1871 | if(mode == BMV_TYPE_INTERPOLATED) { | |
1872 | vc1_mc_1mv(v, 0); | |
1873 | vc1_interp_mc(v); | |
6b33eed8 | 1874 | if(v->use_ic) v->mv_mode = v->mv_mode2; |
1dc1ce64 KS |
1875 | return; |
1876 | } | |
1877 | ||
6b33eed8 | 1878 | if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2; |
e179fbc8 | 1879 | vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD)); |
6b33eed8 | 1880 | if(v->use_ic) v->mv_mode = v->mv_mode2; |
1dc1ce64 KS |
1881 | } |
1882 | ||
1883 | static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype) | |
1884 | { | |
5df68893 | 1885 | MpegEncContext *s = &v->s; |
1dc1ce64 KS |
1886 | int xy, wrap, off = 0; |
1887 | int16_t *A, *B, *C; | |
1888 | int px, py; | |
1889 | int sum; | |
1890 | int r_x, r_y; | |
1891 | const uint8_t *is_intra = v->mb_type[0]; | |
5df68893 | 1892 | |
1dc1ce64 KS |
1893 | r_x = v->range_x; |
1894 | r_y = v->range_y; | |
5df68893 KS |
1895 | /* scale MV difference to be quad-pel */ |
1896 | dmv_x[0] <<= 1 - s->quarter_sample; | |
1897 | dmv_y[0] <<= 1 - s->quarter_sample; | |
1898 | dmv_x[1] <<= 1 - s->quarter_sample; | |
1899 | dmv_y[1] <<= 1 - s->quarter_sample; | |
1900 | ||
1dc1ce64 KS |
1901 | wrap = s->b8_stride; |
1902 | xy = s->block_index[0]; | |
fb2d9140 | 1903 | |
1dc1ce64 KS |
1904 | if(s->mb_intra) { |
1905 | s->current_picture.motion_val[0][xy][0] = | |
1906 | s->current_picture.motion_val[0][xy][1] = | |
1907 | s->current_picture.motion_val[1][xy][0] = | |
1908 | s->current_picture.motion_val[1][xy][1] = 0; | |
fb2d9140 KS |
1909 | return; |
1910 | } | |
162f412d KS |
1911 | s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample); |
1912 | s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample); | |
1913 | s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample); | |
1914 | s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample); | |
a6145615 KS |
1915 | |
1916 | /* Pullback predicted motion vectors as specified in 8.4.5.4 */ | |
1917 | 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)); | |
1918 | 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)); | |
1919 | 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)); | |
1920 | 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)); | |
1dc1ce64 KS |
1921 | if(direct) { |
1922 | s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0]; | |
1923 | s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1]; | |
1924 | s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0]; | |
1925 | s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1]; | |
5df68893 KS |
1926 | return; |
1927 | } | |
1928 | ||
162f412d | 1929 | if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) { |
1dc1ce64 KS |
1930 | C = s->current_picture.motion_val[0][xy - 2]; |
1931 | A = s->current_picture.motion_val[0][xy - wrap*2]; | |
1932 | off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; | |
1933 | B = s->current_picture.motion_val[0][xy - wrap*2 + off]; | |
1934 | ||
44942d52 | 1935 | if(!s->mb_x) C[0] = C[1] = 0; |
1dc1ce64 KS |
1936 | if(!s->first_slice_line) { // predictor A is not out of bounds |
1937 | if(s->mb_width == 1) { | |
1938 | px = A[0]; | |
1939 | py = A[1]; | |
1940 | } else { | |
1941 | px = mid_pred(A[0], B[0], C[0]); | |
1942 | py = mid_pred(A[1], B[1], C[1]); | |
1943 | } | |
1944 | } else if(s->mb_x) { // predictor C is not out of bounds | |
1945 | px = C[0]; | |
1946 | py = C[1]; | |
1947 | } else { | |
1948 | px = py = 0; | |
5df68893 | 1949 | } |
1dc1ce64 KS |
1950 | /* Pullback MV as specified in 8.3.5.3.4 */ |
1951 | { | |
1952 | int qx, qy, X, Y; | |
1953 | if(v->profile < PROFILE_ADVANCED) { | |
1954 | qx = (s->mb_x << 5); | |
1955 | qy = (s->mb_y << 5); | |
1956 | X = (s->mb_width << 5) - 4; | |
1957 | Y = (s->mb_height << 5) - 4; | |
1958 | if(qx + px < -28) px = -28 - qx; | |
1959 | if(qy + py < -28) py = -28 - qy; | |
1960 | if(qx + px > X) px = X - qx; | |
1961 | if(qy + py > Y) py = Y - qy; | |
1962 | } else { | |
1963 | qx = (s->mb_x << 6); | |
1964 | qy = (s->mb_y << 6); | |
1965 | X = (s->mb_width << 6) - 4; | |
1966 | Y = (s->mb_height << 6) - 4; | |
1967 | if(qx + px < -60) px = -60 - qx; | |
1968 | if(qy + py < -60) py = -60 - qy; | |
1969 | if(qx + px > X) px = X - qx; | |
1970 | if(qy + py > Y) py = Y - qy; | |
1971 | } | |
1972 | } | |
1973 | /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | |
1974 | if(0 && !s->first_slice_line && s->mb_x) { | |
1975 | if(is_intra[xy - wrap]) | |
c26abfa5 | 1976 | sum = FFABS(px) + FFABS(py); |
1dc1ce64 | 1977 | else |
c26abfa5 | 1978 | sum = FFABS(px - A[0]) + FFABS(py - A[1]); |
1dc1ce64 KS |
1979 | if(sum > 32) { |
1980 | if(get_bits1(&s->gb)) { | |
1981 | px = A[0]; | |
1982 | py = A[1]; | |
1983 | } else { | |
1984 | px = C[0]; | |
1985 | py = C[1]; | |
1986 | } | |
1987 | } else { | |
1988 | if(is_intra[xy - 2]) | |
c26abfa5 | 1989 | sum = FFABS(px) + FFABS(py); |
1dc1ce64 | 1990 | else |
c26abfa5 | 1991 | sum = FFABS(px - C[0]) + FFABS(py - C[1]); |
1dc1ce64 KS |
1992 | if(sum > 32) { |
1993 | if(get_bits1(&s->gb)) { | |
1994 | px = A[0]; | |
1995 | py = A[1]; | |
1996 | } else { | |
1997 | px = C[0]; | |
1998 | py = C[1]; | |
1999 | } | |
2000 | } | |
2001 | } | |
5df68893 | 2002 | } |
1dc1ce64 KS |
2003 | /* store MV using signed modulus of MV range defined in 4.11 */ |
2004 | s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x; | |
2005 | s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y; | |
5df68893 | 2006 | } |
162f412d | 2007 | if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) { |
1dc1ce64 KS |
2008 | C = s->current_picture.motion_val[1][xy - 2]; |
2009 | A = s->current_picture.motion_val[1][xy - wrap*2]; | |
2010 | off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; | |
2011 | B = s->current_picture.motion_val[1][xy - wrap*2 + off]; | |
5df68893 | 2012 | |
44942d52 | 2013 | if(!s->mb_x) C[0] = C[1] = 0; |
1dc1ce64 KS |
2014 | if(!s->first_slice_line) { // predictor A is not out of bounds |
2015 | if(s->mb_width == 1) { | |
2016 | px = A[0]; | |
2017 | py = A[1]; | |
2018 | } else { | |
2019 | px = mid_pred(A[0], B[0], C[0]); | |
2020 | py = mid_pred(A[1], B[1], C[1]); | |
2021 | } | |
2022 | } else if(s->mb_x) { // predictor C is not out of bounds | |
2023 | px = C[0]; | |
2024 | py = C[1]; | |
2025 | } else { | |
2026 | px = py = 0; | |
2027 | } | |
2028 | /* Pullback MV as specified in 8.3.5.3.4 */ | |
2029 | { | |
2030 | int qx, qy, X, Y; | |
2031 | if(v->profile < PROFILE_ADVANCED) { | |
2032 | qx = (s->mb_x << 5); | |
2033 | qy = (s->mb_y << 5); | |
2034 | X = (s->mb_width << 5) - 4; | |
2035 | Y = (s->mb_height << 5) - 4; | |
2036 | if(qx + px < -28) px = -28 - qx; | |
2037 | if(qy + py < -28) py = -28 - qy; | |
2038 | if(qx + px > X) px = X - qx; | |
2039 | if(qy + py > Y) py = Y - qy; | |
2040 | } else { | |
2041 | qx = (s->mb_x << 6); | |
2042 | qy = (s->mb_y << 6); | |
2043 | X = (s->mb_width << 6) - 4; | |
2044 | Y = (s->mb_height << 6) - 4; | |
2045 | if(qx + px < -60) px = -60 - qx; | |
2046 | if(qy + py < -60) py = -60 - qy; | |
2047 | if(qx + px > X) px = X - qx; | |
2048 | if(qy + py > Y) py = Y - qy; | |
2049 | } | |
2050 | } | |
2051 | /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | |
2052 | if(0 && !s->first_slice_line && s->mb_x) { | |
2053 | if(is_intra[xy - wrap]) | |
c26abfa5 | 2054 | sum = FFABS(px) + FFABS(py); |
1dc1ce64 | 2055 | else |
c26abfa5 | 2056 | sum = FFABS(px - A[0]) + FFABS(py - A[1]); |
1dc1ce64 KS |
2057 | if(sum > 32) { |
2058 | if(get_bits1(&s->gb)) { | |
2059 | px = A[0]; | |
2060 | py = A[1]; | |
2061 | } else { | |
2062 | px = C[0]; | |
2063 | py = C[1]; | |
2064 | } | |
2065 | } else { | |
2066 | if(is_intra[xy - 2]) | |
c26abfa5 | 2067 | sum = FFABS(px) + FFABS(py); |
1dc1ce64 | 2068 | else |
c26abfa5 | 2069 | sum = FFABS(px - C[0]) + FFABS(py - C[1]); |
1dc1ce64 KS |
2070 | if(sum > 32) { |
2071 | if(get_bits1(&s->gb)) { | |
2072 | px = A[0]; | |
2073 | py = A[1]; | |
2074 | } else { | |
2075 | px = C[0]; | |
2076 | py = C[1]; | |
2077 | } | |
2078 | } | |
2079 | } | |
2080 | } | |
2081 | /* store MV using signed modulus of MV range defined in 4.11 */ | |
5df68893 | 2082 | |
1dc1ce64 KS |
2083 | s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x; |
2084 | s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y; | |
2085 | } | |
2086 | s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0]; | |
2087 | s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1]; | |
2088 | s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0]; | |
2089 | s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1]; | |
5df68893 KS |
2090 | } |
2091 | ||
be3492ec KS |
2092 | /** Get predicted DC value for I-frames only |
2093 | * prediction dir: left=0, top=1 | |
2094 | * @param s MpegEncContext | |
2095 | * @param[in] n block index in the current MB | |
2096 | * @param dc_val_ptr Pointer to DC predictor | |
2097 | * @param dir_ptr Prediction direction for use in AC prediction | |
2ce151f8 | 2098 | */ |
be3492ec | 2099 | static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n, |
b86216de | 2100 | int16_t **dc_val_ptr, int *dir_ptr) |
21aa398f | 2101 | { |
be3492ec | 2102 | int a, b, c, wrap, pred, scale; |
b86216de | 2103 | int16_t *dc_val; |
be3492ec KS |
2104 | static const uint16_t dcpred[32] = { |
2105 | -1, 1024, 512, 341, 256, 205, 171, 146, 128, | |
2106 | 114, 102, 93, 85, 79, 73, 68, 64, | |
2107 | 60, 57, 54, 51, 49, 47, 45, 43, | |
2108 | 41, 39, 38, 37, 35, 34, 33 | |
2109 | }; | |
0d33db8a | 2110 | |
be3492ec KS |
2111 | /* find prediction - wmv3_dc_scale always used here in fact */ |
2112 | if (n < 4) scale = s->y_dc_scale; | |
2113 | else scale = s->c_dc_scale; | |
21aa398f | 2114 | |
be3492ec KS |
2115 | wrap = s->block_wrap[n]; |
2116 | dc_val= s->dc_val[0] + s->block_index[n]; | |
21aa398f | 2117 | |
be3492ec KS |
2118 | /* B A |
2119 | * C X | |
2120 | */ | |
2121 | c = dc_val[ - 1]; | |
2122 | b = dc_val[ - 1 - wrap]; | |
2123 | a = dc_val[ - wrap]; | |
21aa398f | 2124 | |
be3492ec | 2125 | if (pq < 9 || !overlap) |
21aa398f | 2126 | { |
be3492ec | 2127 | /* Set outer values */ |
d2779ecd | 2128 | if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale]; |
be3492ec | 2129 | if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale]; |
bf2bc926 | 2130 | } |
2131 | else | |
2132 | { | |
be3492ec | 2133 | /* Set outer values */ |
d2779ecd | 2134 | if (s->first_slice_line && (n!=2 && n!=3)) b=a=0; |
be3492ec | 2135 | if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0; |
21aa398f | 2136 | } |
21aa398f | 2137 | |
be3492ec KS |
2138 | if (abs(a - b) <= abs(b - c)) { |
2139 | pred = c; | |
2140 | *dir_ptr = 1;//left | |
2141 | } else { | |
2142 | pred = a; | |
2143 | *dir_ptr = 0;//top | |
21aa398f AB |
2144 | } |
2145 | ||
be3492ec KS |
2146 | /* update predictor */ |
2147 | *dc_val_ptr = &dc_val[0]; | |
2148 | return pred; | |
bf2bc926 | 2149 | } |
2150 | ||
21aa398f | 2151 | |
be3492ec KS |
2152 | /** Get predicted DC value |
2153 | * prediction dir: left=0, top=1 | |
2154 | * @param s MpegEncContext | |
2155 | * @param[in] n block index in the current MB | |
2156 | * @param dc_val_ptr Pointer to DC predictor | |
2157 | * @param dir_ptr Prediction direction for use in AC prediction | |
2ce151f8 | 2158 | */ |
be3492ec KS |
2159 | static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, |
2160 | int a_avail, int c_avail, | |
b86216de | 2161 | int16_t **dc_val_ptr, int *dir_ptr) |
21aa398f | 2162 | { |
be3492ec | 2163 | int a, b, c, wrap, pred, scale; |
b86216de | 2164 | int16_t *dc_val; |
be3492ec | 2165 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; |
50af2fd3 | 2166 | int q1, q2 = 0; |
21aa398f | 2167 | |
be3492ec KS |
2168 | /* find prediction - wmv3_dc_scale always used here in fact */ |
2169 | if (n < 4) scale = s->y_dc_scale; | |
2170 | else scale = s->c_dc_scale; | |
21aa398f | 2171 | |
be3492ec KS |
2172 | wrap = s->block_wrap[n]; |
2173 | dc_val= s->dc_val[0] + s->block_index[n]; | |
21aa398f | 2174 | |
be3492ec KS |
2175 | /* B A |
2176 | * C X | |
2177 | */ | |
2178 | c = dc_val[ - 1]; | |
2179 | b = dc_val[ - 1 - wrap]; | |
2180 | a = dc_val[ - wrap]; | |
27ed1a0d KS |
2181 | /* scale predictors if needed */ |
2182 | q1 = s->current_picture.qscale_table[mb_pos]; | |
2183 | if(c_avail && (n!= 1 && n!=3)) { | |
2184 | q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
2185 | if(q2 && q2 != q1) | |
a5c14fca | 2186 | c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; |
27ed1a0d KS |
2187 | } |
2188 | if(a_avail && (n!= 2 && n!=3)) { | |
2189 | q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
2190 | if(q2 && q2 != q1) | |
a5c14fca | 2191 | a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; |
27ed1a0d KS |
2192 | } |
2193 | if(a_avail && c_avail && (n!=3)) { | |
2194 | int off = mb_pos; | |
2195 | if(n != 1) off--; | |
2196 | if(n != 2) off -= s->mb_stride; | |
2197 | q2 = s->current_picture.qscale_table[off]; | |
2198 | if(q2 && q2 != q1) | |
a5c14fca | 2199 | b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; |
27ed1a0d | 2200 | } |
21aa398f | 2201 | |
be3492ec KS |
2202 | if(a_avail && c_avail) { |
2203 | if(abs(a - b) <= abs(b - c)) { | |
2204 | pred = c; | |
2205 | *dir_ptr = 1;//left | |
2206 | } else { | |
2207 | pred = a; | |
2208 | *dir_ptr = 0;//top | |
2209 | } | |
2210 | } else if(a_avail) { | |
2211 | pred = a; | |
2212 | *dir_ptr = 0;//top | |
2213 | } else if(c_avail) { | |
2214 | pred = c; | |
2215 | *dir_ptr = 1;//left | |
2216 | } else { | |
2217 | pred = 0; | |
2218 | *dir_ptr = 1;//left | |
21aa398f AB |
2219 | } |
2220 | ||
be3492ec KS |
2221 | /* update predictor */ |
2222 | *dc_val_ptr = &dc_val[0]; | |
2223 | return pred; | |
21aa398f | 2224 | } |
2ce151f8 | 2225 | |
21aa398f | 2226 | |
115329f1 | 2227 | /** |
be3492ec KS |
2228 | * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles |
2229 | * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | |
2ce151f8 | 2230 | * @{ |
2231 | */ | |
21aa398f | 2232 | |
be3492ec | 2233 | static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) |
21aa398f | 2234 | { |
be3492ec | 2235 | int xy, wrap, pred, a, b, c; |
21aa398f | 2236 | |
be3492ec KS |
2237 | xy = s->block_index[n]; |
2238 | wrap = s->b8_stride; | |
21aa398f | 2239 | |
be3492ec KS |
2240 | /* B C |
2241 | * A X | |
2242 | */ | |
2243 | a = s->coded_block[xy - 1 ]; | |
2244 | b = s->coded_block[xy - 1 - wrap]; | |
2245 | c = s->coded_block[xy - wrap]; | |
21aa398f | 2246 | |
be3492ec KS |
2247 | if (b == c) { |
2248 | pred = a; | |
2249 | } else { | |
2250 | pred = c; | |
21aa398f | 2251 | } |
be3492ec KS |
2252 | |
2253 | /* store value */ | |
2254 | *coded_block_ptr = &s->coded_block[xy]; | |
2255 | ||
2256 | return pred; | |
0d33db8a | 2257 | } |
2258 | ||
be3492ec KS |
2259 | /** |
2260 | * Decode one AC coefficient | |
2261 | * @param v The VC1 context | |
2262 | * @param last Last coefficient | |
2263 | * @param skip How much zero coefficients to skip | |
2264 | * @param value Decoded AC coefficient value | |
2265 | * @see 8.1.3.4 | |
2ce151f8 | 2266 | */ |
be3492ec | 2267 | static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset) |
0d33db8a | 2268 | { |
2269 | GetBitContext *gb = &v->s.gb; | |
be3492ec KS |
2270 | int index, escape, run = 0, level = 0, lst = 0; |
2271 | ||
a5c14fca | 2272 | index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); |
be3492ec KS |
2273 | if (index != vc1_ac_sizes[codingset] - 1) { |
2274 | run = vc1_index_decode_table[codingset][index][0]; | |
2275 | level = vc1_index_decode_table[codingset][index][1]; | |
2276 | lst = index >= vc1_last_decode_table[codingset]; | |
5fc32c27 | 2277 | if(get_bits1(gb)) |
be3492ec KS |
2278 | level = -level; |
2279 | } else { | |
2280 | escape = decode210(gb); | |
87dfe848 | 2281 | if (escape != 2) { |
a5c14fca | 2282 | index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); |
be3492ec KS |
2283 | run = vc1_index_decode_table[codingset][index][0]; |
2284 | level = vc1_index_decode_table[codingset][index][1]; | |
2285 | lst = index >= vc1_last_decode_table[codingset]; | |
87dfe848 KS |
2286 | if(escape == 0) { |
2287 | if(lst) | |
2288 | level += vc1_last_delta_level_table[codingset][run]; | |
2289 | else | |
2290 | level += vc1_delta_level_table[codingset][run]; | |
2291 | } else { | |
2292 | if(lst) | |
2293 | run += vc1_last_delta_run_table[codingset][level] + 1; | |
2294 | else | |
2295 | run += vc1_delta_run_table[codingset][level] + 1; | |
2296 | } | |
5fc32c27 | 2297 | if(get_bits1(gb)) |
be3492ec KS |
2298 | level = -level; |
2299 | } else { | |
2300 | int sign; | |
5fc32c27 | 2301 | lst = get_bits1(gb); |
be3492ec KS |
2302 | if(v->s.esc3_level_length == 0) { |
2303 | if(v->pq < 8 || v->dquantfrm) { // table 59 | |
2304 | v->s.esc3_level_length = get_bits(gb, 3); | |
2305 | if(!v->s.esc3_level_length) | |
2306 | v->s.esc3_level_length = get_bits(gb, 2) + 8; | |
2307 | } else { //table 60 | |
3c2ddb59 | 2308 | v->s.esc3_level_length = get_unary(gb, 1, 6) + 2; |
be3492ec KS |
2309 | } |
2310 | v->s.esc3_run_length = 3 + get_bits(gb, 2); | |
2311 | } | |
2312 | run = get_bits(gb, v->s.esc3_run_length); | |
5fc32c27 | 2313 | sign = get_bits1(gb); |
be3492ec KS |
2314 | level = get_bits(gb, v->s.esc3_level_length); |
2315 | if(sign) | |
2316 | level = -level; | |
2317 | } | |
21aa398f | 2318 | } |
7cc84d24 | 2319 | |
be3492ec KS |
2320 | *last = lst; |
2321 | *skip = run; | |
2322 | *value = level; | |
21aa398f | 2323 | } |
21aa398f | 2324 | |
be3492ec KS |
2325 | /** Decode intra block in intra frames - should be faster than decode_intra_block |
2326 | * @param v VC1Context | |
2327 | * @param block block to decode | |
2328 | * @param coded are AC coeffs present or not | |
2329 | * @param codingset set of VLC to decode data | |
2ce151f8 | 2330 | */ |
be3492ec | 2331 | static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset) |
21aa398f | 2332 | { |
0d33db8a | 2333 | GetBitContext *gb = &v->s.gb; |
be3492ec KS |
2334 | MpegEncContext *s = &v->s; |
2335 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
2336 | int run_diff, i; | |
b86216de | 2337 | int16_t *dc_val; |
be3492ec KS |
2338 | int16_t *ac_val, *ac_val2; |
2339 | int dcdiff; | |
21aa398f | 2340 | |
be3492ec KS |
2341 | /* Get DC differential */ |
2342 | if (n < 4) { | |
2343 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
2344 | } else { | |
2345 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
21aa398f | 2346 | } |
be3492ec KS |
2347 | if (dcdiff < 0){ |
2348 | av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); | |
2349 | return -1; | |
2350 | } | |
2351 | if (dcdiff) | |
21aa398f | 2352 | { |
be3492ec | 2353 | if (dcdiff == 119 /* ESC index value */) |
21aa398f | 2354 | { |
be3492ec KS |
2355 | /* TODO: Optimize */ |
2356 | if (v->pq == 1) dcdiff = get_bits(gb, 10); | |
2357 | else if (v->pq == 2) dcdiff = get_bits(gb, 9); | |
2358 | else dcdiff = get_bits(gb, 8); | |
21aa398f | 2359 | } |
be3492ec | 2360 | else |
21aa398f | 2361 | { |
be3492ec KS |
2362 | if (v->pq == 1) |
2363 | dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; | |
2364 | else if (v->pq == 2) | |
5fc32c27 | 2365 | dcdiff = (dcdiff<<1) + get_bits1(gb) - 1; |
21aa398f | 2366 | } |
5fc32c27 | 2367 | if (get_bits1(gb)) |
be3492ec | 2368 | dcdiff = -dcdiff; |
21aa398f | 2369 | } |
21aa398f | 2370 | |
be3492ec KS |
2371 | /* Prediction */ |
2372 | dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir); | |
2373 | *dc_val = dcdiff; | |
0d33db8a | 2374 | |
be3492ec | 2375 | /* Store the quantized DC coeff, used for prediction */ |
be3492ec KS |
2376 | if (n < 4) { |
2377 | block[0] = dcdiff * s->y_dc_scale; | |
2378 | } else { | |
2379 | block[0] = dcdiff * s->c_dc_scale; | |
21aa398f | 2380 | } |
be3492ec KS |
2381 | /* Skip ? */ |
2382 | run_diff = 0; | |
2383 | i = 0; | |
2384 | if (!coded) { | |
2385 | goto not_coded; | |
21aa398f | 2386 | } |
7cc84d24 | 2387 | |
be3492ec KS |
2388 | //AC Decoding |
2389 | i = 1; | |
7cc84d24 | 2390 | |
be3492ec KS |
2391 | { |
2392 | int last = 0, skip, value; | |
2393 | const int8_t *zz_table; | |
2394 | int scale; | |
2395 | int k; | |
8da75fb2 | 2396 | |
be3492ec | 2397 | scale = v->pq * 2 + v->halfpq; |
42cc17f9 | 2398 | |
be3492ec KS |
2399 | if(v->s.ac_pred) { |
2400 | if(!dc_pred_dir) | |
a5c14fca | 2401 | zz_table = ff_vc1_horizontal_zz; |
be3492ec | 2402 | else |
a5c14fca | 2403 | zz_table = ff_vc1_vertical_zz; |
be3492ec | 2404 | } else |
a5c14fca | 2405 | zz_table = ff_vc1_normal_zz; |
be3492ec KS |
2406 | |
2407 | ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
2408 | ac_val2 = ac_val; | |
2409 | if(dc_pred_dir) //left | |
2410 | ac_val -= 16; | |
2411 | else //top | |
2412 | ac_val -= 16 * s->block_wrap[n]; | |
2413 | ||
2414 | while (!last) { | |
2415 | vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
2416 | i += skip; | |
2417 | if(i > 63) | |
2418 | break; | |
2419 | block[zz_table[i++]] = value; | |
2420 | } | |
7cc84d24 | 2421 | |
be3492ec KS |
2422 | /* apply AC prediction if needed */ |
2423 | if(s->ac_pred) { | |
2424 | if(dc_pred_dir) { //left | |
2425 | for(k = 1; k < 8; k++) | |
2426 | block[k << 3] += ac_val[k]; | |
2427 | } else { //top | |
2428 | for(k = 1; k < 8; k++) | |
2429 | block[k] += ac_val[k + 8]; | |
2430 | } | |
2431 | } | |
2432 | /* save AC coeffs for further prediction */ | |
2433 | for(k = 1; k < 8; k++) { | |
2434 | ac_val2[k] = block[k << 3]; | |
2435 | ac_val2[k + 8] = block[k]; | |
2436 | } | |
42cc17f9 | 2437 | |
be3492ec KS |
2438 | /* scale AC coeffs */ |
2439 | for(k = 1; k < 64; k++) | |
2440 | if(block[k]) { | |
2441 | block[k] *= scale; | |
2442 | if(!v->pquantizer) | |
2443 | block[k] += (block[k] < 0) ? -v->pq : v->pq; | |
2444 | } | |
8da75fb2 | 2445 | |
be3492ec KS |
2446 | if(s->ac_pred) i = 63; |
2447 | } | |
2448 | ||
2449 | not_coded: | |
2450 | if(!coded) { | |
2451 | int k, scale; | |
2452 | ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
2453 | ac_val2 = ac_val; | |
2454 | ||
2455 | scale = v->pq * 2 + v->halfpq; | |
2456 | memset(ac_val2, 0, 16 * 2); | |
2457 | if(dc_pred_dir) {//left | |
2458 | ac_val -= 16; | |
2459 | if(s->ac_pred) | |
2460 | memcpy(ac_val2, ac_val, 8 * 2); | |
2461 | } else {//top | |
2462 | ac_val -= 16 * s->block_wrap[n]; | |
2463 | if(s->ac_pred) | |
2464 | memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
8da75fb2 | 2465 | } |
7cc84d24 | 2466 | |
be3492ec KS |
2467 | /* apply AC prediction if needed */ |
2468 | if(s->ac_pred) { | |
2469 | if(dc_pred_dir) { //left | |
2470 | for(k = 1; k < 8; k++) { | |
2471 | block[k << 3] = ac_val[k] * scale; | |
4b944659 | 2472 | if(!v->pquantizer && block[k << 3]) |
be3492ec KS |
2473 | block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq; |
2474 | } | |
2475 | } else { //top | |
2476 | for(k = 1; k < 8; k++) { | |
2477 | block[k] = ac_val[k + 8] * scale; | |
4b944659 | 2478 | if(!v->pquantizer && block[k]) |
be3492ec KS |
2479 | block[k] += (block[k] < 0) ? -v->pq : v->pq; |
2480 | } | |
2481 | } | |
2482 | i = 63; | |
2483 | } | |
7cc84d24 | 2484 | } |
be3492ec | 2485 | s->block_last_index[n] = i; |
7cc84d24 | 2486 | |
be3492ec | 2487 | return 0; |
7cc84d24 | 2488 | } |
2489 | ||
3c275f6d | 2490 | /** Decode intra block in intra frames - should be faster than decode_intra_block |
be3492ec KS |
2491 | * @param v VC1Context |
2492 | * @param block block to decode | |
2493 | * @param coded are AC coeffs present or not | |
be3492ec | 2494 | * @param codingset set of VLC to decode data |
7cc84d24 | 2495 | */ |
3c275f6d | 2496 | static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant) |
e5540b3f | 2497 | { |
0d33db8a | 2498 | GetBitContext *gb = &v->s.gb; |
7cc84d24 | 2499 | MpegEncContext *s = &v->s; |
be3492ec | 2500 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ |
7cc84d24 | 2501 | int run_diff, i; |
b86216de | 2502 | int16_t *dc_val; |
be3492ec KS |
2503 | int16_t *ac_val, *ac_val2; |
2504 | int dcdiff; | |
f26c2ef5 | 2505 | int a_avail = v->a_avail, c_avail = v->c_avail; |
4a5343fa KS |
2506 | int use_pred = s->ac_pred; |
2507 | int scale; | |
50af2fd3 | 2508 | int q1, q2 = 0; |
3c275f6d | 2509 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; |
be3492ec | 2510 | |
be3492ec KS |
2511 | /* Get DC differential */ |
2512 | if (n < 4) { | |
2513 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
2514 | } else { | |
2515 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
2516 | } | |
2517 | if (dcdiff < 0){ | |
2518 | av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); | |
2519 | return -1; | |
2520 | } | |
2521 | if (dcdiff) | |
2522 | { | |
2523 | if (dcdiff == 119 /* ESC index value */) | |
2524 | { | |
2525 | /* TODO: Optimize */ | |
2526 | if (mquant == 1) dcdiff = get_bits(gb, 10); | |
2527 | else if (mquant == 2) dcdiff = get_bits(gb, 9); | |
2528 | else dcdiff = get_bits(gb, 8); | |
2529 | } | |
2530 | else | |
2531 | { | |
2532 | if (mquant == 1) | |
2533 | dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; | |
2534 | else if (mquant == 2) | |
5fc32c27 | 2535 | dcdiff = (dcdiff<<1) + get_bits1(gb) - 1; |
be3492ec | 2536 | } |
5fc32c27 | 2537 | if (get_bits1(gb)) |
be3492ec KS |
2538 | dcdiff = -dcdiff; |
2539 | } | |
2540 | ||
2541 | /* Prediction */ | |
3c275f6d | 2542 | dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir); |
be3492ec KS |
2543 | *dc_val = dcdiff; |
2544 | ||
2545 | /* Store the quantized DC coeff, used for prediction */ | |
be3492ec KS |
2546 | if (n < 4) { |
2547 | block[0] = dcdiff * s->y_dc_scale; | |
2548 | } else { | |
2549 | block[0] = dcdiff * s->c_dc_scale; | |
2550 | } | |
2551 | /* Skip ? */ | |
2552 | run_diff = 0; | |
2553 | i = 0; | |
be3492ec KS |
2554 | |
2555 | //AC Decoding | |
2556 | i = 1; | |
8da75fb2 | 2557 | |
26bdc6bc | 2558 | /* check if AC is needed at all */ |
4a5343fa KS |
2559 | if(!a_avail && !c_avail) use_pred = 0; |
2560 | ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
2561 | ac_val2 = ac_val; | |
2562 | ||
a9d78ac5 | 2563 | scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0); |
4a5343fa KS |
2564 | |
2565 | if(dc_pred_dir) //left | |
2566 | ac_val -= 16; | |
2567 | else //top | |
2568 | ac_val -= 16 * s->block_wrap[n]; | |
2569 | ||
50af2fd3 | 2570 | q1 = s->current_picture.qscale_table[mb_pos]; |
b956373b KS |
2571 | if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1]; |
2572 | if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
b6661510 KS |
2573 | if(dc_pred_dir && n==1) q2 = q1; |
2574 | if(!dc_pred_dir && n==2) q2 = q1; | |
2575 | if(n==3) q2 = q1; | |
50af2fd3 | 2576 | |
4a5343fa | 2577 | if(coded) { |
be3492ec KS |
2578 | int last = 0, skip, value; |
2579 | const int8_t *zz_table; | |
be3492ec | 2580 | int k; |
be3492ec | 2581 | |
3c275f6d KS |
2582 | if(v->s.ac_pred) { |
2583 | if(!dc_pred_dir) | |
a5c14fca | 2584 | zz_table = ff_vc1_horizontal_zz; |
3c275f6d | 2585 | else |
a5c14fca | 2586 | zz_table = ff_vc1_vertical_zz; |
3c275f6d | 2587 | } else |
a5c14fca | 2588 | zz_table = ff_vc1_normal_zz; |
be3492ec | 2589 | |
be3492ec KS |
2590 | while (!last) { |
2591 | vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
2592 | i += skip; | |
2593 | if(i > 63) | |
2594 | break; | |
2595 | block[zz_table[i++]] = value; | |
e5540b3f | 2596 | } |
7cc84d24 | 2597 | |
be3492ec | 2598 | /* apply AC prediction if needed */ |
8f8d0e48 | 2599 | if(use_pred) { |
be3492ec | 2600 | /* scale predictors if needed*/ |
50af2fd3 | 2601 | if(q2 && q1!=q2) { |
25e9c7ef KS |
2602 | q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; |
2603 | q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; | |
be3492ec KS |
2604 | |
2605 | if(dc_pred_dir) { //left | |
2606 | for(k = 1; k < 8; k++) | |
a5c14fca | 2607 | block[k << 3] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
be3492ec KS |
2608 | } else { //top |
2609 | for(k = 1; k < 8; k++) | |
a5c14fca | 2610 | block[k] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
be3492ec KS |
2611 | } |
2612 | } else { | |
2613 | if(dc_pred_dir) { //left | |
2614 | for(k = 1; k < 8; k++) | |
2615 | block[k << 3] += ac_val[k]; | |
2616 | } else { //top | |
2617 | for(k = 1; k < 8; k++) | |
2618 | block[k] += ac_val[k + 8]; | |
2619 | } | |
2620 | } | |
7cc84d24 | 2621 | } |
be3492ec KS |
2622 | /* save AC coeffs for further prediction */ |
2623 | for(k = 1; k < 8; k++) { | |
2624 | ac_val2[k] = block[k << 3]; | |
2625 | ac_val2[k + 8] = block[k]; | |
e5540b3f | 2626 | } |
7cc84d24 | 2627 | |
be3492ec KS |
2628 | /* scale AC coeffs */ |
2629 | for(k = 1; k < 64; k++) | |
2630 | if(block[k]) { | |
2631 | block[k] *= scale; | |
2632 | if(!v->pquantizer) | |
2633 | block[k] += (block[k] < 0) ? -mquant : mquant; | |
2634 | } | |
7cc84d24 | 2635 | |
8f8d0e48 | 2636 | if(use_pred) i = 63; |
4a5343fa KS |
2637 | } else { // no AC coeffs |
2638 | int k; | |
8f8d0e48 | 2639 | |
be3492ec KS |
2640 | memset(ac_val2, 0, 16 * 2); |
2641 | if(dc_pred_dir) {//left | |
e4bf0302 | 2642 | if(use_pred) { |
be3492ec | 2643 | memcpy(ac_val2, ac_val, 8 * 2); |
50af2fd3 | 2644 | if(q2 && q1!=q2) { |
25e9c7ef KS |
2645 | q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; |
2646 | q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; | |
e4bf0302 | 2647 | for(k = 1; k < 8; k++) |
a5c14fca | 2648 | ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
e4bf0302 KS |
2649 | } |
2650 | } | |
be3492ec | 2651 | } else {//top |
e4bf0302 | 2652 | if(use_pred) { |
be3492ec | 2653 | memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); |
50af2fd3 | 2654 | if(q2 && q1!=q2) { |
25e9c7ef KS |
2655 | q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; |
2656 | q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; | |
e4bf0302 | 2657 | for(k = 1; k < 8; k++) |
a5c14fca | 2658 | ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
e4bf0302 KS |
2659 | } |
2660 | } | |
be3492ec | 2661 | } |
7cc84d24 | 2662 | |
be3492ec | 2663 | /* apply AC prediction if needed */ |
8f8d0e48 | 2664 | if(use_pred) { |
be3492ec KS |
2665 | if(dc_pred_dir) { //left |
2666 | for(k = 1; k < 8; k++) { | |
e4bf0302 | 2667 | block[k << 3] = ac_val2[k] * scale; |
4b944659 | 2668 | if(!v->pquantizer && block[k << 3]) |
be3492ec KS |
2669 | block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant; |
2670 | } | |
2671 | } else { //top | |
2672 | for(k = 1; k < 8; k++) { | |
e4bf0302 | 2673 | block[k] = ac_val2[k + 8] * scale; |
4b944659 | 2674 | if(!v->pquantizer && block[k]) |
be3492ec KS |
2675 | block[k] += (block[k] < 0) ? -mquant : mquant; |
2676 | } | |
2677 | } | |
2678 | i = 63; | |
7cc84d24 | 2679 | } |
2680 | } | |
7cc84d24 | 2681 | s->block_last_index[n] = i; |
be3492ec | 2682 | |
e5540b3f | 2683 | return 0; |
2684 | } | |
7cc84d24 | 2685 | |
3c275f6d KS |
2686 | /** Decode intra block in inter frames - more generic version than vc1_decode_i_block |
2687 | * @param v VC1Context | |
2688 | * @param block block to decode | |
2689 | * @param coded are AC coeffs present or not | |
2690 | * @param mquant block quantizer | |
2691 | * @param codingset set of VLC to decode data | |
2ce151f8 | 2692 | */ |
3c275f6d | 2693 | static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset) |
7cc84d24 | 2694 | { |
3c275f6d | 2695 | GetBitContext *gb = &v->s.gb; |
be3492ec | 2696 | MpegEncContext *s = &v->s; |
3c275f6d KS |
2697 | int dc_pred_dir = 0; /* Direction of the DC prediction used */ |
2698 | int run_diff, i; | |
b86216de | 2699 | int16_t *dc_val; |
3c275f6d KS |
2700 | int16_t *ac_val, *ac_val2; |
2701 | int dcdiff; | |
2702 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
2703 | int a_avail = v->a_avail, c_avail = v->c_avail; | |
2704 | int use_pred = s->ac_pred; | |
2705 | int scale; | |
2706 | int q1, q2 = 0; | |
42cc17f9 | 2707 | |
3c275f6d KS |
2708 | /* XXX: Guard against dumb values of mquant */ |
2709 | mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); | |
42cc17f9 | 2710 | |
3c275f6d KS |
2711 | /* Set DC scale - y and c use the same */ |
2712 | s->y_dc_scale = s->y_dc_scale_table[mquant]; | |
2713 | s->c_dc_scale = s->c_dc_scale_table[mquant]; | |
2714 | ||
2715 | /* Get DC differential */ | |
2716 | if (n < 4) { | |
2717 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
2718 | } else { | |
2719 | dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
2720 | } | |
2721 | if (dcdiff < 0){ | |
2722 | av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); | |
2723 | return -1; | |
2724 | } | |
2725 | if (dcdiff) | |
2726 | { | |
2727 | if (dcdiff == 119 /* ESC index value */) | |
2728 | { | |
2729 | /* TODO: Optimize */ | |
2730 | if (mquant == 1) dcdiff = get_bits(gb, 10); | |
2731 | else if (mquant == 2) dcdiff = get_bits(gb, 9); | |
2732 | else dcdiff = get_bits(gb, 8); | |
2733 | } | |
2734 | else | |
2735 | { | |
2736 | if (mquant == 1) | |
2737 | dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; | |
2738 | else if (mquant == 2) | |
5fc32c27 | 2739 | dcdiff = (dcdiff<<1) + get_bits1(gb) - 1; |
3c275f6d | 2740 | } |
5fc32c27 | 2741 | if (get_bits1(gb)) |
3c275f6d KS |
2742 | dcdiff = -dcdiff; |
2743 | } | |
2744 | ||
2745 | /* Prediction */ | |
2746 | dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir); | |
2747 | *dc_val = dcdiff; | |
2748 | ||
2749 | /* Store the quantized DC coeff, used for prediction */ | |
2750 | ||
2751 | if (n < 4) { | |
2752 | block[0] = dcdiff * s->y_dc_scale; | |
2753 | } else { | |
2754 | block[0] = dcdiff * s->c_dc_scale; | |
2755 | } | |
2756 | /* Skip ? */ | |
2757 | run_diff = 0; | |
2758 | i = 0; | |
2759 | ||
2760 | //AC Decoding | |
2761 | i = 1; | |
2762 | ||
2763 | /* check if AC is needed at all and adjust direction if needed */ | |
2764 | if(!a_avail) dc_pred_dir = 1; | |
2765 | if(!c_avail) dc_pred_dir = 0; | |
2766 | if(!a_avail && !c_avail) use_pred = 0; | |
2767 | ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
2768 | ac_val2 = ac_val; | |
2769 | ||
2770 | scale = mquant * 2 + v->halfpq; | |
2771 | ||
2772 | if(dc_pred_dir) //left | |
2773 | ac_val -= 16; | |
2774 | else //top | |
2775 | ac_val -= 16 * s->block_wrap[n]; | |
2776 | ||
2777 | q1 = s->current_picture.qscale_table[mb_pos]; | |
6f3e4e17 RD |
2778 | if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1]; |
2779 | if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
b6661510 KS |
2780 | if(dc_pred_dir && n==1) q2 = q1; |
2781 | if(!dc_pred_dir && n==2) q2 = q1; | |
2782 | if(n==3) q2 = q1; | |
3c275f6d KS |
2783 | |
2784 | if(coded) { | |
2785 | int last = 0, skip, value; | |
2786 | const int8_t *zz_table; | |
2787 | int k; | |
2788 | ||
a5c14fca | 2789 | zz_table = ff_vc1_simple_progressive_8x8_zz; |
3c275f6d KS |
2790 | |
2791 | while (!last) { | |
2792 | vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
2793 | i += skip; | |
2794 | if(i > 63) | |
2795 | break; | |
2796 | block[zz_table[i++]] = value; | |
2797 | } | |
2798 | ||
2799 | /* apply AC prediction if needed */ | |
2800 | if(use_pred) { | |
2801 | /* scale predictors if needed*/ | |
2802 | if(q2 && q1!=q2) { | |
25e9c7ef KS |
2803 | q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; |
2804 | q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; | |
3c275f6d KS |
2805 | |
2806 | if(dc_pred_dir) { //left | |
2807 | for(k = 1; k < 8; k++) | |
a5c14fca | 2808 | block[k << 3] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
3c275f6d KS |
2809 | } else { //top |
2810 | for(k = 1; k < 8; k++) | |
a5c14fca | 2811 | block[k] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
3c275f6d KS |
2812 | } |
2813 | } else { | |
2814 | if(dc_pred_dir) { //left | |
2815 | for(k = 1; k < 8; k++) | |
2816 | block[k << 3] += ac_val[k]; | |
2817 | } else { //top | |
2818 | for(k = 1; k < 8; k++) | |
2819 | block[k] += ac_val[k + 8]; | |
2820 | } | |
2821 | } | |
2822 | } | |
2823 | /* save AC coeffs for further prediction */ | |
2824 | for(k = 1; k < 8; k++) { | |
2825 | ac_val2[k] = block[k << 3]; | |
2826 | ac_val2[k + 8] = block[k]; | |
2827 | } | |
2828 | ||
2829 | /* scale AC coeffs */ | |
2830 | for(k = 1; k < 64; k++) | |
2831 | if(block[k]) { | |
2832 | block[k] *= scale; | |
2833 | if(!v->pquantizer) | |
2834 | block[k] += (block[k] < 0) ? -mquant : mquant; | |
2835 | } | |
2836 | ||
2837 | if(use_pred) i = 63; | |
2838 | } else { // no AC coeffs | |
2839 | int k; | |
2840 | ||
2841 | memset(ac_val2, 0, 16 * 2); | |
2842 | if(dc_pred_dir) {//left | |
2843 | if(use_pred) { | |
2844 | memcpy(ac_val2, ac_val, 8 * 2); | |
2845 | if(q2 && q1!=q2) { | |
25e9c7ef KS |
2846 | q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; |
2847 | q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; | |
3c275f6d | 2848 | for(k = 1; k < 8; k++) |
a5c14fca | 2849 | ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
3c275f6d KS |
2850 | } |
2851 | } | |
2852 | } else {//top | |
2853 | if(use_pred) { | |
2854 | memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
2855 | if(q2 && q1!=q2) { | |
25e9c7ef KS |
2856 | q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1; |
2857 | q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1; | |
3c275f6d | 2858 | for(k = 1; k < 8; k++) |
a5c14fca | 2859 | ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18; |
3c275f6d KS |
2860 | } |
2861 | } | |
2862 | } | |
2863 | ||
2864 | /* apply AC prediction if needed */ | |
2865 | if(use_pred) { | |
2866 | if(dc_pred_dir) { //left | |
2867 | for(k = 1; k < 8; k++) { | |
2868 | block[k << 3] = ac_val2[k] * scale; | |
2869 | if(!v->pquantizer && block[k << 3]) | |
2870 | block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant; | |
2871 | } | |
2872 | } else { //top | |
2873 | for(k = 1; k < 8; k++) { | |
2874 | block[k] = ac_val2[k + 8] * scale; | |
2875 | if(!v->pquantizer && block[k]) | |
2876 | block[k] += (block[k] < 0) ? -mquant : mquant; | |
2877 | } | |
2878 | } | |
2879 | i = 63; | |
2880 | } | |
2881 | } | |
2882 | s->block_last_index[n] = i; | |
2883 | ||
2884 | return 0; | |
2885 | } | |
2886 | ||
2887 | /** Decode P block | |
2888 | */ | |
d2e45f33 KS |
2889 | static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block, |
2890 | uint8_t *dst, int linesize, int skip_block) | |
3c275f6d KS |
2891 | { |
2892 | MpegEncContext *s = &v->s; | |
2893 | GetBitContext *gb = &s->gb; | |
2894 | int i, j; | |
2895 | int subblkpat = 0; | |
2896 | int scale, off, idx, last, skip, value; | |
2897 | int ttblk = ttmb & 7; | |
2898 | ||
2899 | if(ttmb == -1) { | |
a5c14fca | 2900 | 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)]; |
3c275f6d KS |
2901 | } |
2902 | if(ttblk == TT_4X4) { | |
a5c14fca | 2903 | subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1); |
3c275f6d KS |
2904 | } |
2905 | if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) { | |
2906 | subblkpat = decode012(gb); | |
2907 | if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits | |
2908 | if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4; | |
2909 | if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8; | |
2910 | } | |
2a2072fe | 2911 | scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0); |
3c275f6d KS |
2912 | |
2913 | // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT | |
be3492ec | 2914 | if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) { |
be3492ec | 2915 | subblkpat = 2 - (ttblk == TT_8X4_TOP); |
e9f2396e | 2916 | ttblk = TT_8X4; |
be3492ec KS |
2917 | } |
2918 | if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) { | |
be3492ec | 2919 | subblkpat = 2 - (ttblk == TT_4X8_LEFT); |
e9f2396e | 2920 | ttblk = TT_4X8; |
be3492ec | 2921 | } |
be3492ec KS |
2922 | switch(ttblk) { |
2923 | case TT_8X8: | |
2924 | i = 0; | |
2925 | last = 0; | |
2926 | while (!last) { | |
2927 | vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
2928 | i += skip; | |
2929 | if(i > 63) | |
2930 | break; | |
a5c14fca | 2931 | idx = ff_vc1_simple_progressive_8x8_zz[i++]; |
be3492ec | 2932 | block[idx] = value * scale; |
0a45801f KS |
2933 | if(!v->pquantizer) |
2934 | block[idx] += (block[idx] < 0) ? -mquant : mquant; | |
7cc84d24 | 2935 | } |
d2e45f33 KS |
2936 | if(!skip_block){ |
2937 | s->dsp.vc1_inv_trans_8x8(block); | |
2938 | s->dsp.add_pixels_clamped(block, dst, linesize); | |
2939 | } | |
be3492ec KS |
2940 | break; |
2941 | case TT_4X4: | |
2942 | for(j = 0; j < 4; j++) { | |
2943 | last = subblkpat & (1 << (3 - j)); | |
2944 | i = 0; | |
87dfe848 | 2945 | off = (j & 1) * 4 + (j & 2) * 16; |
be3492ec KS |
2946 | while (!last) { |
2947 | vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
2948 | i += skip; | |
2949 | if(i > 15) | |
2950 | break; | |
a5c14fca | 2951 | idx = ff_vc1_simple_progressive_4x4_zz[i++]; |
be3492ec | 2952 | block[idx + off] = value * scale; |
0a45801f KS |
2953 | if(!v->pquantizer) |
2954 | block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; | |
be3492ec | 2955 | } |
d2e45f33 KS |
2956 | if(!(subblkpat & (1 << (3 - j))) && !skip_block) |
2957 | s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off); | |
be3492ec KS |
2958 | } |
2959 | break; | |
2960 | case TT_8X4: | |
2961 | for(j = 0; j < 2; j++) { | |
2962 | last = subblkpat & (1 << (1 - j)); | |
2963 | i = 0; | |
2964 | off = j * 32; | |
2965 | while (!last) { | |
2966 | vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
2967 | i += skip; | |
2968 | if(i > 31) | |
2969 | break; | |
750e37eb CG |
2970 | idx = v->zz_8x4[i++]+off; |
2971 | block[idx] = value * scale; | |
0a45801f | 2972 | if(!v->pquantizer) |
750e37eb | 2973 | block[idx] += (block[idx] < 0) ? -mquant : mquant; |
be3492ec | 2974 | } |
d2e45f33 KS |
2975 | if(!(subblkpat & (1 << (1 - j))) && !skip_block) |
2976 | s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off); | |
be3492ec KS |
2977 | } |
2978 | break; | |
2979 | case TT_4X8: | |
2980 | for(j = 0; j < 2; j++) { | |
2981 | last = subblkpat & (1 << (1 - j)); | |
2982 | i = 0; | |
2983 | off = j * 4; | |
2984 | while (!last) { | |
2985 | vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
2986 | i += skip; | |
2987 | if(i > 31) | |
2988 | break; | |
750e37eb CG |
2989 | idx = v->zz_4x8[i++]+off; |
2990 | block[idx] = value * scale; | |
0a45801f | 2991 | if(!v->pquantizer) |
750e37eb | 2992 | block[idx] += (block[idx] < 0) ? -mquant : mquant; |
be3492ec | 2993 | } |
d2e45f33 KS |
2994 | if(!(subblkpat & (1 << (1 - j))) && !skip_block) |
2995 | s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off); | |
8da75fb2 | 2996 | } |
be3492ec | 2997 | break; |
7cc84d24 | 2998 | } |
2999 | return 0; | |
3000 | } | |
3001 | ||
be3492ec | 3002 | |
8da75fb2 | 3003 | /** Decode one P-frame MB (in Simple/Main profile) |
8da75fb2 | 3004 | */ |
7e84f276 | 3005 | static int vc1_decode_p_mb(VC1Context *v) |
7cc84d24 | 3006 | { |
3007 | MpegEncContext *s = &v->s; | |
3008 | GetBitContext *gb = &s->gb; | |
87dfe848 | 3009 | int i, j; |
be3492ec | 3010 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; |
7cc84d24 | 3011 | int cbp; /* cbp decoding stuff */ |
7cc84d24 | 3012 | int mqdiff, mquant; /* MB quantization */ |
8a66a390 | 3013 | int ttmb = v->ttfrm; /* MB Transform type */ |
7cc84d24 | 3014 | int status; |
7cc84d24 | 3015 | |
3016 | static const int size_table[6] = { 0, 2, 3, 4, 5, 8 }, | |
3017 | offset_table[6] = { 0, 1, 3, 7, 15, 31 }; | |
3018 | int mb_has_coeffs = 1; /* last_flag */ | |
3019 | int dmv_x, dmv_y; /* Differential MV components */ | |
3020 | int index, index1; /* LUT indices */ | |
3021 | int val, sign; /* temp values */ | |
be3492ec KS |
3022 | int first_block = 1; |
3023 | int dst_idx, off; | |
87dfe848 | 3024 | int skipped, fourmv; |
7cc84d24 | 3025 | |
8da75fb2 | 3026 | mquant = v->pq; /* Loosy initialization */ |
3027 | ||
87dfe848 KS |
3028 | if (v->mv_type_is_raw) |
3029 | fourmv = get_bits1(gb); | |
3030 | else | |
3031 | fourmv = v->mv_type_mb_plane[mb_pos]; | |
3032 | if (v->skip_is_raw) | |
3033 | skipped = get_bits1(gb); | |
3034 | else | |
0f7344aa | 3035 | skipped = v->s.mbskip_table[mb_pos]; |
87dfe848 | 3036 | |
e4bf0302 KS |
3037 | s->dsp.clear_blocks(s->block[0]); |
3038 | ||
87dfe848 | 3039 | if (!fourmv) /* 1MV mode */ |
7cc84d24 | 3040 | { |
87dfe848 | 3041 | if (!skipped) |
7cc84d24 | 3042 | { |
3043 | GET_MVDATA(dmv_x, dmv_y); | |
42cc17f9 | 3044 | |
1dc1ce64 KS |
3045 | if (s->mb_intra) { |
3046 | s->current_picture.motion_val[1][s->block_index[0]][0] = 0; | |
3047 | s->current_picture.motion_val[1][s->block_index[0]][1] = 0; | |
3048 | } | |
be3492ec | 3049 | s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16; |
e4bf0302 | 3050 | vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]); |
be3492ec | 3051 | |
8da75fb2 | 3052 | /* FIXME Set DC val for inter block ? */ |
7cc84d24 | 3053 | if (s->mb_intra && !mb_has_coeffs) |
3054 | { | |
3055 | GET_MQUANT(); | |
5fc32c27 | 3056 | s->ac_pred = get_bits1(gb); |
8da75fb2 | 3057 | cbp = 0; |
7cc84d24 | 3058 | } |
3059 | else if (mb_has_coeffs) | |
3060 | { | |
5fc32c27 | 3061 | if (s->mb_intra) s->ac_pred = get_bits1(gb); |
10b9c374 | 3062 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); |
7cc84d24 | 3063 | GET_MQUANT(); |
3064 | } | |
3065 | else | |
3066 | { | |
3067 | mquant = v->pq; | |
8da75fb2 | 3068 | cbp = 0; |
7cc84d24 | 3069 | } |
be3492ec | 3070 | s->current_picture.qscale_table[mb_pos] = mquant; |
7cc84d24 | 3071 | |
be3492ec | 3072 | if (!v->ttmbf && !s->mb_intra && mb_has_coeffs) |
a5c14fca | 3073 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, |
be3492ec | 3074 | VC1_TTMB_VLC_BITS, 2); |
5df68893 | 3075 | if(!s->mb_intra) vc1_mc_1mv(v, 0); |
be3492ec | 3076 | dst_idx = 0; |
7cc84d24 | 3077 | for (i=0; i<6; i++) |
3078 | { | |
be3492ec KS |
3079 | s->dc_val[0][s->block_index[i]] = 0; |
3080 | dst_idx += i >> 2; | |
7cc84d24 | 3081 | val = ((cbp >> (5 - i)) & 1); |
be3492ec | 3082 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
e4bf0302 | 3083 | v->mb_type[0][s->block_index[i]] = s->mb_intra; |
be3492ec | 3084 | if(s->mb_intra) { |
f26c2ef5 KS |
3085 | /* check if prediction blocks A and C are available */ |
3086 | v->a_avail = v->c_avail = 0; | |
d2779ecd | 3087 | if(i == 2 || i == 3 || !s->first_slice_line) |
e4bf0302 KS |
3088 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; |
3089 | if(i == 1 || i == 3 || s->mb_x) | |
3090 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
f26c2ef5 | 3091 | |
7e84f276 | 3092 | vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); |
138712fe | 3093 | if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; |
5ce425f7 | 3094 | s->dsp.vc1_inv_trans_8x8(s->block[i]); |
ffb9a8b1 | 3095 | if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; |
1a625dce | 3096 | s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
87dfe848 | 3097 | if(v->pq >= 9 && v->overlap) { |
87dfe848 | 3098 | if(v->c_avail) |
61f5b14a | 3099 | s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
b6fa8993 | 3100 | if(v->a_avail) |
61f5b14a | 3101 | s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
87dfe848 | 3102 | } |
be3492ec | 3103 | } else if(val) { |
d2e45f33 | 3104 | 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)); |
be3492ec KS |
3105 | if(!v->ttmbf && ttmb < 8) ttmb = -1; |
3106 | first_block = 0; | |
7cc84d24 | 3107 | } |
7cc84d24 | 3108 | } |
3109 | } | |
3110 | else //Skipped | |
3111 | { | |
be3492ec | 3112 | s->mb_intra = 0; |
92ad0d9d KS |
3113 | for(i = 0; i < 6; i++) { |
3114 | v->mb_type[0][s->block_index[i]] = 0; | |
3115 | s->dc_val[0][s->block_index[i]] = 0; | |
3116 | } | |
be3492ec | 3117 | s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP; |
e4bf0302 KS |
3118 | s->current_picture.qscale_table[mb_pos] = 0; |
3119 | vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]); | |
5df68893 | 3120 | vc1_mc_1mv(v, 0); |
7cc84d24 | 3121 | return 0; |
3122 | } | |
3123 | } //1MV mode | |
3124 | else //4MV mode | |
e4bf0302 | 3125 | { |
87dfe848 | 3126 | if (!skipped /* unskipped MB */) |
7cc84d24 | 3127 | { |
e4bf0302 KS |
3128 | int intra_count = 0, coded_inter = 0; |
3129 | int is_intra[6], is_coded[6]; | |
7cc84d24 | 3130 | /* Get CBPCY */ |
10b9c374 | 3131 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); |
e4bf0302 | 3132 | for (i=0; i<6; i++) |
7cc84d24 | 3133 | { |
3134 | val = ((cbp >> (5 - i)) & 1); | |
e4bf0302 KS |
3135 | s->dc_val[0][s->block_index[i]] = 0; |
3136 | s->mb_intra = 0; | |
3137 | if(i < 4) { | |
3138 | dmv_x = dmv_y = 0; | |
3139 | s->mb_intra = 0; | |
3140 | mb_has_coeffs = 0; | |
3141 | if(val) { | |
3142 | GET_MVDATA(dmv_x, dmv_y); | |
3143 | } | |
3144 | vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]); | |
3145 | if(!s->mb_intra) vc1_mc_4mv_luma(v, i); | |
3146 | intra_count += s->mb_intra; | |
3147 | is_intra[i] = s->mb_intra; | |
3148 | is_coded[i] = mb_has_coeffs; | |
3149 | } | |
3150 | if(i&4){ | |
3151 | is_intra[i] = (intra_count >= 3); | |
3152 | is_coded[i] = val; | |
7cc84d24 | 3153 | } |
e4bf0302 KS |
3154 | if(i == 4) vc1_mc_4mv_chroma(v); |
3155 | v->mb_type[0][s->block_index[i]] = is_intra[i]; | |
3156 | if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i]; | |
be3492ec | 3157 | } |
fdb59832 | 3158 | // if there are no coded blocks then don't do anything more |
c39e3c6f | 3159 | if(!intra_count && !coded_inter) return 0; |
e4bf0302 KS |
3160 | dst_idx = 0; |
3161 | GET_MQUANT(); | |
3162 | s->current_picture.qscale_table[mb_pos] = mquant; | |
3163 | /* test if block is intra and has pred */ | |
3164 | { | |
3165 | int intrapred = 0; | |
3166 | for(i=0; i<6; i++) | |
3167 | if(is_intra[i]) { | |
d2779ecd KS |
3168 | if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]]) |
3169 | || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) { | |
e4bf0302 KS |
3170 | intrapred = 1; |
3171 | break; | |
3172 | } | |
3173 | } | |
5fc32c27 | 3174 | if(intrapred)s->ac_pred = get_bits1(gb); |
e4bf0302 KS |
3175 | else s->ac_pred = 0; |
3176 | } | |
3177 | if (!v->ttmbf && coded_inter) | |
a5c14fca | 3178 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); |
e4bf0302 KS |
3179 | for (i=0; i<6; i++) |
3180 | { | |
3181 | dst_idx += i >> 2; | |
3182 | off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); | |
3183 | s->mb_intra = is_intra[i]; | |
3184 | if (is_intra[i]) { | |
3185 | /* check if prediction blocks A and C are available */ | |
3186 | v->a_avail = v->c_avail = 0; | |
d2779ecd | 3187 | if(i == 2 || i == 3 || !s->first_slice_line) |
e4bf0302 KS |
3188 | v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; |
3189 | if(i == 1 || i == 3 || s->mb_x) | |
3190 | v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
8da75fb2 | 3191 | |
e4bf0302 | 3192 | vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset); |
138712fe | 3193 | if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; |
5ce425f7 | 3194 | s->dsp.vc1_inv_trans_8x8(s->block[i]); |
ffb9a8b1 | 3195 | if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; |
1a625dce | 3196 | s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); |
e4bf0302 | 3197 | if(v->pq >= 9 && v->overlap) { |
e4bf0302 | 3198 | if(v->c_avail) |
61f5b14a | 3199 | s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
b6fa8993 | 3200 | if(v->a_avail) |
61f5b14a | 3201 | s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
be3492ec | 3202 | } |
e4bf0302 | 3203 | } else if(is_coded[i]) { |
d2e45f33 | 3204 | status = 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)); |
e4bf0302 KS |
3205 | if(!v->ttmbf && ttmb < 8) ttmb = -1; |
3206 | first_block = 0; | |
be3492ec | 3207 | } |
7cc84d24 | 3208 | } |
3209 | return status; | |
3210 | } | |
3211 | else //Skipped MB | |
3212 | { | |
ef6cc8ce | 3213 | s->mb_intra = 0; |
c39e3c6f | 3214 | s->current_picture.qscale_table[mb_pos] = 0; |
92ad0d9d KS |
3215 | for (i=0; i<6; i++) { |
3216 | v->mb_type[0][s->block_index[i]] = 0; | |
3217 | s->dc_val[0][s->block_index[i]] = 0; | |
3218 | } | |
7cc84d24 | 3219 | for (i=0; i<4; i++) |
3220 | { | |
e4bf0302 KS |
3221 | vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]); |
3222 | vc1_mc_4mv_luma(v, i); | |
7cc84d24 | 3223 | } |
e4bf0302 | 3224 | vc1_mc_4mv_chroma(v); |
e4bf0302 | 3225 | s->current_picture.qscale_table[mb_pos] = 0; |
7cc84d24 | 3226 | return 0; |
3227 | } | |
3228 | } | |
42cc17f9 | 3229 | |
7cc84d24 | 3230 | /* Should never happen */ |
3231 | return -1; | |
3232 | } | |
3233 | ||
5df68893 KS |
3234 | /** Decode one B-frame MB (in Main profile) |
3235 | */ | |
3236 | static void vc1_decode_b_mb(VC1Context *v) | |
3237 | { | |
3238 | MpegEncContext *s = &v->s; | |
3239 | GetBitContext *gb = &s->gb; | |
3240 | int i, j; | |
3241 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
fb2d9140 | 3242 | int cbp = 0; /* cbp decoding stuff */ |
5df68893 KS |
3243 | int mqdiff, mquant; /* MB quantization */ |
3244 | int ttmb = v->ttfrm; /* MB Transform type */ | |
3245 | ||
3246 | static const int size_table[6] = { 0, 2, 3, 4, 5, 8 }, | |
3247 | offset_table[6] = { 0, 1, 3, 7, 15, 31 }; | |
3248 | int mb_has_coeffs = 0; /* last_flag */ | |
3249 | int index, index1; /* LUT indices */ | |
3250 | int val, sign; /* temp values */ | |
3251 | int first_block = 1; | |
3252 | int dst_idx, off; | |
3253 | int skipped, direct; | |
3254 | int dmv_x[2], dmv_y[2]; | |
d1d28ddf | 3255 | int bmvtype = BMV_TYPE_BACKWARD; |
5df68893 KS |
3256 | |
3257 | mquant = v->pq; /* Loosy initialization */ | |
3258 | s->mb_intra = 0; | |
3259 | ||
3260 | if (v->dmb_is_raw) | |
3261 | direct = get_bits1(gb); | |
3262 | else | |
3263 | direct = v->direct_mb_plane[mb_pos]; | |
3264 | if (v->skip_is_raw) | |
3265 | skipped = get_bits1(gb); | |
3266 | else | |
3267 | skipped = v->s.mbskip_table[mb_pos]; | |
3268 | ||
3269 | s->dsp.clear_blocks(s->block[0]); | |
3270 | dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0; | |
3271 | for(i = 0; i < 6; i++) { | |
3272 | v->mb_type[0][s->block_index[i]] = 0; | |
3273 | s->dc_val[0][s->block_index[i]] = 0; | |
3274 | } | |
3275 | s->current_picture.qscale_table[mb_pos] = 0; | |
3276 | ||
3277 | if (!direct) { | |
3278 | if (!skipped) { | |
3279 | GET_MVDATA(dmv_x[0], dmv_y[0]); | |
fb2d9140 KS |
3280 | dmv_x[1] = dmv_x[0]; |
3281 | dmv_y[1] = dmv_y[0]; | |
5df68893 KS |
3282 | } |
3283 | if(skipped || !s->mb_intra) { | |
3284 | bmvtype = decode012(gb); | |
3285 | switch(bmvtype) { | |
3286 | case 0: | |
3287 | bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD; | |
3288 | break; | |
3289 | case 1: | |
3290 | bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD; | |
3291 | break; | |
3292 | case 2: | |
3293 | bmvtype = BMV_TYPE_INTERPOLATED; | |
162f412d | 3294 | dmv_x[0] = dmv_y[0] = 0; |
5df68893 KS |
3295 | } |
3296 | } | |
3297 | } | |
1dc1ce64 KS |
3298 | for(i = 0; i < 6; i++) |
3299 | v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
3300 | ||
5df68893 | 3301 | if (skipped) { |
1dc1ce64 KS |
3302 | if(direct) bmvtype = BMV_TYPE_INTERPOLATED; |
3303 | vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
5df68893 KS |
3304 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); |
3305 | return; | |
3306 | } | |
3307 | if (direct) { | |
3308 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); | |
3309 | GET_MQUANT(); | |
fb2d9140 KS |
3310 | s->mb_intra = 0; |
3311 | mb_has_coeffs = 0; | |
5df68893 | 3312 | s->current_picture.qscale_table[mb_pos] = mquant; |
fb2d9140 | 3313 | if(!v->ttmbf) |
a5c14fca | 3314 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); |
1dc1ce64 KS |
3315 | dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0; |
3316 | vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
5df68893 KS |
3317 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); |
3318 | } else { | |
3319 | if(!mb_has_coeffs && !s->mb_intra) { | |
3320 | /* no coded blocks - effectively skipped */ | |
1dc1ce64 | 3321 | vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); |
5df68893 KS |
3322 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); |
3323 | return; | |
3324 | } | |
3325 | if(s->mb_intra && !mb_has_coeffs) { | |
3326 | GET_MQUANT(); | |
3327 | s->current_picture.qscale_table[mb_pos] = mquant; | |
3328 | s->ac_pred = get_bits1(gb); | |
3329 | cbp = 0; | |
1dc1ce64 | 3330 | vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); |
5df68893 KS |
3331 | } else { |
3332 | if(bmvtype == BMV_TYPE_INTERPOLATED) { | |
162f412d | 3333 | GET_MVDATA(dmv_x[0], dmv_y[0]); |
5df68893 KS |
3334 | if(!mb_has_coeffs) { |
3335 | /* interpolated skipped block */ | |
1dc1ce64 | 3336 | vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); |
5df68893 KS |
3337 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); |
3338 | return; | |
3339 | } | |
3340 | } | |
1dc1ce64 KS |
3341 | vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); |
3342 | if(!s->mb_intra) { | |
5df68893 | 3343 | vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); |
1dc1ce64 | 3344 | } |
5df68893 KS |
3345 | if(s->mb_intra) |
3346 | s->ac_pred = get_bits1(gb); | |
3347 | cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); | |
3348 | GET_MQUANT(); | |
3349 | s->current_picture.qscale_table[mb_pos] = mquant; | |
3350 | if(!v->ttmbf && !s->mb_intra && mb_has_coeffs) | |
a5c14fca | 3351 | ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); |
5df68893 KS |
3352 | } |
3353 | } | |
3354 | dst_idx = 0; | |
3355 | for (i=0; i<6; i++) | |
3356 | { | |
3357 | s->dc_val[0][s->block_index[i]] = 0; | |