2 * VC-1 and WMV3 decoder
3 * Copyright (c) 2006 Konstantin Shishkov
4 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * VC-1 and WMV3 decoder
30 #include "mpegvideo.h"
32 #include "vc1acdata.h"
37 extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2];
38 extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2];
39 extern VLC ff_msmp4_dc_luma_vlc[2], ff_msmp4_dc_chroma_vlc[2];
40 #define MB_INTRA_VLC_BITS 9
41 extern VLC ff_msmp4_mb_i_vlc;
42 extern const uint16_t ff_msmp4_mb_i_table[64][2];
45 static const uint16_t table_mb_intra[64][2];
48 /** Available Profiles */
53 PROFILE_COMPLEX, ///< TODO: WMV9 specific
58 /** Sequence quantizer mode */
61 QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level
62 QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level
63 QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames
64 QUANT_UNIFORM ///< Uniform quant used for all frames
68 /** Where quant can be changed */
72 DQPROFILE_DOUBLE_EDGES,
73 DQPROFILE_SINGLE_EDGE,
78 /** @name Where quant can be changed
89 /** Which pair of edges is quantized with ALTPQUANT */
92 DQDOUBLE_BEDGE_TOPLEFT,
93 DQDOUBLE_BEDGE_TOPRIGHT,
94 DQDOUBLE_BEDGE_BOTTOMRIGHT,
95 DQDOUBLE_BEDGE_BOTTOMLEFT
99 /** MV modes for P frames */
102 MV_PMODE_1MV_HPEL_BILIN,
106 MV_PMODE_INTENSITY_COMP
110 /** @name MV types for B frames */
115 BMV_TYPE_INTERPOLATED = 3 //XXX: ??
119 /** @name Block types for P/B frames */
121 enum TransformTypes {
125 TT_8X4, //Both halves
128 TT_4X8, //Both halves
133 /** Table for conversion between TTBLK and TTMB */
134 static const int ttblk_to_tt[3][8] = {
135 { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
136 { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
137 { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
140 static const int ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
142 /** MV P mode - the 5th element is only used for mode 1 */
143 static const uint8_t mv_pmode_table[2][5] = {
144 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
145 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
147 static const uint8_t mv_pmode_table2[2][4] = {
148 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
149 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
152 /** One more frame type */
155 static const int fps_nr[5] = { 24, 25, 30, 50, 60 },
156 fps_dr[2] = { 1000, 1001 };
157 static const uint8_t pquant_table[3][32] = {
158 { /* Implicit quantizer */
159 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12,
160 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
162 { /* Explicit quantizer, pquantizer uniform */
163 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
164 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
166 { /* Explicit quantizer, pquantizer non-uniform */
167 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
168 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
172 /** @name VC-1 VLC tables and defines
173 * @todo TODO move this into the context
176 #define VC1_BFRACTION_VLC_BITS 7
177 static VLC vc1_bfraction_vlc;
178 #define VC1_IMODE_VLC_BITS 4
179 static VLC vc1_imode_vlc;
180 #define VC1_NORM2_VLC_BITS 3
181 static VLC vc1_norm2_vlc;
182 #define VC1_NORM6_VLC_BITS 9
183 static VLC vc1_norm6_vlc;
184 /* Could be optimized, one table only needs 8 bits */
185 #define VC1_TTMB_VLC_BITS 9 //12
186 static VLC vc1_ttmb_vlc[3];
187 #define VC1_MV_DIFF_VLC_BITS 9 //15
188 static VLC vc1_mv_diff_vlc[4];
189 #define VC1_CBPCY_P_VLC_BITS 9 //14
190 static VLC vc1_cbpcy_p_vlc[4];
191 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
192 static VLC vc1_4mv_block_pattern_vlc[4];
193 #define VC1_TTBLK_VLC_BITS 5
194 static VLC vc1_ttblk_vlc[3];
195 #define VC1_SUBBLKPAT_VLC_BITS 6
196 static VLC vc1_subblkpat_vlc[3];
198 static VLC vc1_ac_coeff_table[8];
202 CS_HIGH_MOT_INTRA = 0,
213 * @fixme Change size wherever another size is more efficient
214 * Many members are only used for Advanced Profile
216 typedef struct VC1Context{
221 /** Simple/Main Profile sequence header */
223 int res_sm; ///< reserved, 2b
224 int res_x8; ///< reserved
225 int multires; ///< frame-level RESPIC syntax element present
226 int res_fasttx; ///< reserved, always 1
227 int res_transtab; ///< reserved, always 0
228 int rangered; ///< RANGEREDFRM (range reduction) syntax element present
230 int res_rtm_flag; ///< reserved, set to 1
231 int reserved; ///< reserved
234 /** Advanced Profile */
236 int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer
237 int chromaformat; ///< 2bits, 2=4:2:0, only defined
238 int postprocflag; ///< Per-frame processing suggestion flag present
239 int broadcast; ///< TFF/RFF present
240 int interlace; ///< Progressive/interlaced (RPTFTM syntax element)
241 int tfcntrflag; ///< TFCNTR present
242 int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
243 int extended_dmv; ///< Additional extended dmv range at P/B frame-level
244 int color_prim; ///< 8bits, chroma coordinates of the color primaries
245 int transfer_char; ///< 8bits, Opto-electronic transfer characteristics
246 int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix
247 int hrd_param_flag; ///< Presence of Hypothetical Reference
248 ///< Decoder parameters
251 /** Sequence header data for all Profiles
252 * TODO: choose between ints, uint8_ts and monobit flags
255 int profile; ///< 2bits, Profile
256 int frmrtq_postproc; ///< 3bits,
257 int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength
258 int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple)
259 int extended_mv; ///< Ext MV in P/B (not in Simple)
260 int dquant; ///< How qscale varies with MBs, 2bits (not in Simple)
261 int vstransform; ///< variable-size [48]x[48] transform type + info
262 int overlap; ///< overlapped transforms in use
263 int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_*
264 int finterpflag; ///< INTERPFRM present
267 /** Frame decoding info for all profiles */
269 uint8_t mv_mode; ///< MV coding monde
270 uint8_t mv_mode2; ///< Secondary MV coding mode (B frames)
271 int k_x; ///< Number of bits for MVs (depends on MV range)
272 int k_y; ///< Number of bits for MVs (depends on MV range)
273 int range_x, range_y; ///< MV range
274 uint8_t pq, altpq; ///< Current/alternate frame quantizer scale
275 /** pquant parameters */
282 /** AC coding set indexes
283 * @see 8.1.1.10, p(1)10
286 int c_ac_table_index; ///< Chroma index from ACFRM element
287 int y_ac_table_index; ///< Luma index from AC2FRM element
289 int ttfrm; ///< Transform type info present at frame level
290 uint8_t ttmbf; ///< Transform type flag
291 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform
292 int codingset; ///< index of current table set from 11.8 to use for luma block decoding
293 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding
294 int pqindex; ///< raw pqindex used in coding set selection
295 int a_avail, c_avail;
296 uint8_t *mb_type_base, *mb_type[3];
299 /** Luma compensation parameters */
304 int16_t bfraction; ///< Relative position % anchors=> how to scale MVs
305 uint8_t halfpq; ///< Uniform quant over image and qp+.5
306 uint8_t respic; ///< Frame-level flag for resized images
307 int buffer_fullness; ///< HRD info
309 * -# 0 -> [-64n 63.f] x [-32, 31.f]
310 * -# 1 -> [-128, 127.f] x [-64, 63.f]
311 * -# 2 -> [-512, 511.f] x [-128, 127.f]
312 * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
315 uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use
316 VLC *cbpcy_vlc; ///< CBPCY VLC table
317 int tt_index; ///< Index for Transform Type tables
318 uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV)
319 // BitPlane direct_mb_plane; ///< bitplane for "direct" MBs
320 int mv_type_is_raw; ///< mv type mb plane is not coded
321 int skip_is_raw; ///< skip mb plane is not coded
322 uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
324 /** Frame decoding info for S/M profiles only */
326 uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
330 /** Frame decoding info for Advanced profile */
332 uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
333 uint8_t numpanscanwin;
335 uint8_t rptfrm, tff, rff;
338 uint16_t bottomrightx;
339 uint16_t bottomrighty;
342 int hrd_num_leaky_buckets;
343 uint8_t bit_rate_exponent;
344 uint8_t buffer_size_exponent;
345 // BitPlane ac_pred_plane; ///< AC prediction flags bitplane
346 // BitPlane over_flags_plane; ///< Overflags bitplane
348 uint16_t *hrd_rate, *hrd_buffer;
349 uint8_t *hrd_fullness;
350 uint8_t range_mapy_flag;
351 uint8_t range_mapuv_flag;
358 * Get unary code of limited length
359 * @fixme FIXME Slow and ugly
360 * @param gb GetBitContext
361 * @param[in] stop The bitstop value (unary code of 1's or 0's)
362 * @param[in] len Maximum length
363 * @return Unary length/index
365 static int get_prefix(GetBitContext *gb, int stop, int len)
370 for(i = 0; i < len && get_bits1(gb) != stop; i++);
372 /* int i = 0, tmp = !stop;
374 while (i != len && tmp != stop)
376 tmp = get_bits(gb, 1);
379 if (i == len && tmp != stop) return len+1;
386 UPDATE_CACHE(re, gb);
387 buf=GET_CACHE(re, gb); //Still not sure
388 if (stop) buf = ~buf;
390 log= av_log2(-buf); //FIXME: -?
392 LAST_SKIP_BITS(re, gb, log+1);
393 CLOSE_READER(re, gb);
397 LAST_SKIP_BITS(re, gb, limit);
398 CLOSE_READER(re, gb);
403 static inline int decode210(GetBitContext *gb){
409 return 2 - get_bits1(gb);
413 * Init VC-1 specific tables and VC1Context members
414 * @param v The VC1Context to initialize
417 static int vc1_init_common(VC1Context *v)
422 v->hrd_rate = v->hrd_buffer = NULL;
428 init_vlc(&vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
429 vc1_bfraction_bits, 1, 1,
430 vc1_bfraction_codes, 1, 1, 1);
431 init_vlc(&vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
432 vc1_norm2_bits, 1, 1,
433 vc1_norm2_codes, 1, 1, 1);
434 init_vlc(&vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
435 vc1_norm6_bits, 1, 1,
436 vc1_norm6_codes, 2, 2, 1);
437 init_vlc(&vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
438 vc1_imode_bits, 1, 1,
439 vc1_imode_codes, 1, 1, 1);
442 init_vlc(&vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
443 vc1_ttmb_bits[i], 1, 1,
444 vc1_ttmb_codes[i], 2, 2, 1);
445 init_vlc(&vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
446 vc1_ttblk_bits[i], 1, 1,
447 vc1_ttblk_codes[i], 1, 1, 1);
448 init_vlc(&vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
449 vc1_subblkpat_bits[i], 1, 1,
450 vc1_subblkpat_codes[i], 1, 1, 1);
454 init_vlc(&vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
455 vc1_4mv_block_pattern_bits[i], 1, 1,
456 vc1_4mv_block_pattern_codes[i], 1, 1, 1);
457 init_vlc(&vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
458 vc1_cbpcy_p_bits[i], 1, 1,
459 vc1_cbpcy_p_codes[i], 2, 2, 1);
460 init_vlc(&vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
461 vc1_mv_diff_bits[i], 1, 1,
462 vc1_mv_diff_codes[i], 2, 2, 1);
465 init_vlc(&vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
466 &vc1_ac_tables[i][0][1], 8, 4,
467 &vc1_ac_tables[i][0][0], 8, 4, 1);
468 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
469 &ff_msmp4_mb_i_table[0][1], 4, 2,
470 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
475 v->mvrange = 0; /* 7.1.1.18, p80 */
480 /***********************************************************************/
482 * @defgroup bitplane VC9 Bitplane decoding
487 /** @addtogroup bitplane
500 /** @} */ //imode defines
502 /** Decode rows by checking if they are skipped
503 * @param plane Buffer to store decoded bits
504 * @param[in] width Width of this buffer
505 * @param[in] height Height of this buffer
506 * @param[in] stride of this buffer
508 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
511 for (y=0; y<height; y++){
512 if (!get_bits(gb, 1)) //rowskip
513 memset(plane, 0, width);
515 for (x=0; x<width; x++)
516 plane[x] = get_bits(gb, 1);
521 /** Decode columns by checking if they are skipped
522 * @param plane Buffer to store decoded bits
523 * @param[in] width Width of this buffer
524 * @param[in] height Height of this buffer
525 * @param[in] stride of this buffer
526 * @fixme FIXME: Optimize
528 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
531 for (x=0; x<width; x++){
532 if (!get_bits(gb, 1)) //colskip
533 for (y=0; y<height; y++)
536 for (y=0; y<height; y++)
537 plane[y*stride] = get_bits(gb, 1);
542 /** Decode a bitplane's bits
543 * @param bp Bitplane where to store the decode bits
544 * @param v VC-1 context for bit reading and logging
546 * @fixme FIXME: Optimize
547 * @todo TODO: Decide if a struct is needed
549 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
551 GetBitContext *gb = &v->s.gb;
553 int imode, x, y, code, offset;
554 uint8_t invert, *planep = data;
555 int width, height, stride;
557 width = v->s.mb_width;
558 height = v->s.mb_height;
559 stride = v->s.mb_stride;
560 invert = get_bits(gb, 1);
561 imode = get_vlc2(gb, vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
567 //Data is actually read in the MB layer (same for all tests == "raw")
568 *raw_flag = 1; //invert ignored
572 if ((height * width) & 1)
574 *planep++ = get_bits(gb, 1);
578 // decode bitplane as one long line
579 for (y = offset; y < height * width; y += 2) {
580 code = get_vlc2(gb, vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
581 *planep++ = code & 1;
583 if(offset == width) {
585 planep += stride - width;
587 *planep++ = code >> 1;
589 if(offset == width) {
591 planep += stride - width;
597 if(!(height % 3) && (width % 3)) { // use 2x3 decoding
598 for(y = 0; y < height; y+= 3) {
599 for(x = width & 1; x < width; x += 2) {
600 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
602 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
605 planep[x + 0] = (code >> 0) & 1;
606 planep[x + 1] = (code >> 1) & 1;
607 planep[x + 0 + stride] = (code >> 2) & 1;
608 planep[x + 1 + stride] = (code >> 3) & 1;
609 planep[x + 0 + stride * 2] = (code >> 4) & 1;
610 planep[x + 1 + stride * 2] = (code >> 5) & 1;
612 planep += stride * 3;
614 if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb);
616 planep += (height & 1) * stride;
617 for(y = height & 1; y < height; y += 2) {
618 for(x = width % 3; x < width; x += 3) {
619 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
621 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
624 planep[x + 0] = (code >> 0) & 1;
625 planep[x + 1] = (code >> 1) & 1;
626 planep[x + 2] = (code >> 2) & 1;
627 planep[x + 0 + stride] = (code >> 3) & 1;
628 planep[x + 1 + stride] = (code >> 4) & 1;
629 planep[x + 2 + stride] = (code >> 5) & 1;
631 planep += stride * 2;
634 if(x) decode_colskip(data , x, height , stride, &v->s.gb);
635 if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb);
639 decode_rowskip(data, width, height, stride, &v->s.gb);
642 decode_colskip(data, width, height, stride, &v->s.gb);
647 /* Applying diff operator */
648 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
652 for (x=1; x<width; x++)
653 planep[x] ^= planep[x-1];
654 for (y=1; y<height; y++)
657 planep[0] ^= planep[-stride];
658 for (x=1; x<width; x++)
660 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
661 else planep[x] ^= planep[x-1];
668 for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride
670 return (imode<<1) + invert;
673 /** @} */ //Bitplane group
675 /***********************************************************************/
676 /** VOP Dquant decoding
677 * @param v VC-1 Context
679 static int vop_dquant_decoding(VC1Context *v)
681 GetBitContext *gb = &v->s.gb;
687 pqdiff = get_bits(gb, 3);
688 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
689 else v->altpq = v->pq + pqdiff + 1;
693 v->dquantfrm = get_bits(gb, 1);
696 v->dqprofile = get_bits(gb, 2);
697 switch (v->dqprofile)
699 case DQPROFILE_SINGLE_EDGE:
700 case DQPROFILE_DOUBLE_EDGES:
701 v->dqsbedge = get_bits(gb, 2);
703 case DQPROFILE_ALL_MBS:
704 v->dqbilevel = get_bits(gb, 1);
705 default: break; //Forbidden ?
707 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
709 pqdiff = get_bits(gb, 3);
710 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
711 else v->altpq = v->pq + pqdiff + 1;
719 /** Do inverse transform
721 static void vc1_inv_trans(DCTELEM block[64], int M, int N)
724 register int t1,t2,t3,t4,t5,t6,t7,t8;
730 for(i = 0; i < N; i++){
731 t1 = 17 * (src[0] + src[2]);
732 t2 = 17 * (src[0] - src[2]);
738 dst[0] = (t1 + t3 + t6 + 4) >> 3;
739 dst[1] = (t2 - t4 + t5 + 4) >> 3;
740 dst[2] = (t2 + t4 - t5 + 4) >> 3;
741 dst[3] = (t1 - t3 - t6 + 4) >> 3;
747 for(i = 0; i < N; i++){
748 t1 = 12 * (src[0] + src[4]);
749 t2 = 12 * (src[0] - src[4]);
750 t3 = 16 * src[2] + 6 * src[6];
751 t4 = 6 * src[2] - 16 * src[6];
758 t1 = 16 * src[1] + 15 * src[3] + 9 * src[5] + 4 * src[7];
759 t2 = 15 * src[1] - 4 * src[3] - 16 * src[5] - 9 * src[7];
760 t3 = 9 * src[1] - 16 * src[3] + 4 * src[5] + 15 * src[7];
761 t4 = 4 * src[1] - 9 * src[3] + 15 * src[5] - 16 * src[7];
763 dst[0] = (t5 + t1 + 4) >> 3;
764 dst[1] = (t6 + t2 + 4) >> 3;
765 dst[2] = (t7 + t3 + 4) >> 3;
766 dst[3] = (t8 + t4 + 4) >> 3;
767 dst[4] = (t8 - t4 + 4) >> 3;
768 dst[5] = (t7 - t3 + 4) >> 3;
769 dst[6] = (t6 - t2 + 4) >> 3;
770 dst[7] = (t5 - t1 + 4) >> 3;
780 for(i = 0; i < M; i++){
781 t1 = 17 * (src[ 0] + src[16]);
782 t2 = 17 * (src[ 0] - src[16]);
788 dst[ 0] = (t1 + t3 + t6 + 64) >> 7;
789 dst[ 8] = (t2 - t4 + t5 + 64) >> 7;
790 dst[16] = (t2 + t4 - t5 + 64) >> 7;
791 dst[24] = (t1 - t3 - t6 + 64) >> 7;
797 for(i = 0; i < M; i++){
798 t1 = 12 * (src[ 0] + src[32]);
799 t2 = 12 * (src[ 0] - src[32]);
800 t3 = 16 * src[16] + 6 * src[48];
801 t4 = 6 * src[16] - 16 * src[48];
808 t1 = 16 * src[ 8] + 15 * src[24] + 9 * src[40] + 4 * src[56];
809 t2 = 15 * src[ 8] - 4 * src[24] - 16 * src[40] - 9 * src[56];
810 t3 = 9 * src[ 8] - 16 * src[24] + 4 * src[40] + 15 * src[56];
811 t4 = 4 * src[ 8] - 9 * src[24] + 15 * src[40] - 16 * src[56];
813 dst[ 0] = (t5 + t1 + 64) >> 7;
814 dst[ 8] = (t6 + t2 + 64) >> 7;
815 dst[16] = (t7 + t3 + 64) >> 7;
816 dst[24] = (t8 + t4 + 64) >> 7;
817 dst[32] = (t8 - t4 + 64 + 1) >> 7;
818 dst[40] = (t7 - t3 + 64 + 1) >> 7;
819 dst[48] = (t6 - t2 + 64 + 1) >> 7;
820 dst[56] = (t5 - t1 + 64 + 1) >> 7;
828 /** Apply overlap transform to vertical edge
830 * @todo move to DSPContext
832 static void vc1_v_overlap(uint8_t* src, int stride)
836 for(i = 0; i < 8; i++) {
842 src[-2*stride] = clip_uint8((7*a + d + 3) >> 3);
843 src[-stride] = clip_uint8((-a + 7*b + c + d + 3) >> 3);
844 src[0] = clip_uint8((a + b + 7*c - d + 3) >> 3);
845 src[stride] = clip_uint8((a + 7*d + 3) >> 3);
850 /** Apply overlap transform to horizontal edge
852 * @todo move to DSPContext
854 static void vc1_h_overlap(uint8_t* src, int stride)
858 for(i = 0; i < 8; i++) {
864 src[-2] = clip_uint8((7*a + d + 3) >> 3);
865 src[-1] = clip_uint8((-a + 7*b + c + d + 3) >> 3);
866 src[0] = clip_uint8((a + b + 7*c - d + 3) >> 3);
867 src[1] = clip_uint8((a + 7*d + 3) >> 3);
872 /** Put block onto picture
873 * @todo move to DSPContext
875 static void vc1_put_block(VC1Context *v, DCTELEM block[6][64])
879 DSPContext *dsp = &v->s.dsp;
881 ys = v->s.current_picture.linesize[0];
882 us = v->s.current_picture.linesize[1];
883 vs = v->s.current_picture.linesize[2];
886 dsp->put_pixels_clamped(block[0], Y, ys);
887 dsp->put_pixels_clamped(block[1], Y + 8, ys);
889 dsp->put_pixels_clamped(block[2], Y, ys);
890 dsp->put_pixels_clamped(block[3], Y + 8, ys);
892 dsp->put_pixels_clamped(block[4], v->s.dest[1], us);
893 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs);
896 /* clip motion vector as specified in 8.3.6.5 */
897 #define CLIP_RANGE(mv, src, lim, bs) \
898 if(mv < -bs) mv = -bs - src * bs; \
899 if(mv > lim) mv = lim - src * bs;
901 /** Do motion compensation over 1 macroblock
902 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
904 static void vc1_mc_1mv(VC1Context *v)
906 MpegEncContext *s = &v->s;
907 DSPContext *dsp = &v->s.dsp;
908 uint8_t *srcY, *srcU, *srcV;
909 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
911 if(!v->s.last_picture.data[0])return;
915 uvmx = (mx + ((mx & 3) == 3)) >> 1;
916 uvmy = (my + ((my & 3) == 3)) >> 1;
917 srcY = s->last_picture.data[0];
918 srcU = s->last_picture.data[1];
919 srcV = s->last_picture.data[2];
921 src_x = s->mb_x * 16 + (mx >> 2);
922 src_y = s->mb_y * 16 + (my >> 2);
923 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
924 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
926 CLIP_RANGE( src_x, s->mb_x, s->mb_width * 16, 16);
927 CLIP_RANGE( src_y, s->mb_y, s->mb_height * 16, 16);
928 CLIP_RANGE(uvsrc_x, s->mb_x, s->mb_width * 8, 8);
929 CLIP_RANGE(uvsrc_y, s->mb_y, s->mb_height * 8, 8);
931 srcY += src_y * s->linesize + src_x;
932 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
933 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
935 if((v->mv_mode == MV_PMODE_INTENSITY_COMP)
936 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16
937 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
938 uint8_t *uvbuf= s->edge_emu_buffer + 18 * s->linesize;
940 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1,
941 src_x, src_y, s->h_edge_pos, s->v_edge_pos);
942 srcY = s->edge_emu_buffer;
943 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
944 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
945 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
946 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
949 /* if we deal with intensity compensation we need to scale source blocks */
950 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
955 for(j = 0; j < 17; j++) {
956 for(i = 0; i < 17; i++) src[i] = v->luty[src[i]];
959 src = srcU; src2 = srcV;
960 for(j = 0; j < 9; j++) {
961 for(i = 0; i < 9; i++) {
962 src[i] = v->lutuv[src[i]];
963 src2[i] = v->lutuv[src2[i]];
965 src += s->uvlinesize;
966 src2 += s->uvlinesize;
972 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
973 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
976 if(!s->quarter_sample) { // hpel mc
979 dxy = ((my & 1) << 1) | (mx & 1);
981 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
983 dxy = ((my & 3) << 2) | (mx & 3);
985 dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize);
989 uvdxy = ((uvmy & 1) << 1) | (uvmx & 1);
990 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8);
991 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8);
992 // dsp->put_mspel_pixels_tab[uvdxy](s->dest[1], srcU, s->uvlinesize);
993 // dsp->put_mspel_pixels_tab[uvdxy](s->dest[2], srcV, s->uvlinesize);
996 /** Do motion compensation for 4-MV macroblock - luminance block
998 static void vc1_mc_4mv_luma(VC1Context *v, int n)
1000 MpegEncContext *s = &v->s;
1001 DSPContext *dsp = &v->s.dsp;
1003 int dxy, mx, my, src_x, src_y;
1006 if(!v->s.last_picture.data[0])return;
1007 mx = s->mv[0][n][0];
1008 my = s->mv[0][n][1];
1009 srcY = s->last_picture.data[0];
1011 off = s->linesize * 4 * (n&2) + (n&1) * 8;
1013 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
1014 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
1016 CLIP_RANGE(src_x, s->mb_x, s->mb_width * 16, 16);
1017 CLIP_RANGE(src_y, s->mb_y, s->mb_height * 16, 16);
1019 srcY += src_y * s->linesize + src_x;
1021 if((unsigned)src_x > s->h_edge_pos - (mx&3) - 16
1022 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
1023 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1,
1024 src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1025 srcY = s->edge_emu_buffer;
1028 if(!s->quarter_sample) { // hpel mc
1031 dxy = ((my & 1) << 1) | (mx & 1);
1033 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
1035 dxy = ((my & 3) << 2) | (mx & 3);
1037 dsp->put_no_rnd_qpel_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize);
1041 static inline int median4(int a, int b, int c, int d)
1044 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
1045 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
1047 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
1048 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
1053 /** Do motion compensation for 4-MV macroblock - both chroma blocks
1055 static void vc1_mc_4mv_chroma(VC1Context *v)
1057 MpegEncContext *s = &v->s;
1058 DSPContext *dsp = &v->s.dsp;
1059 uint8_t *srcU, *srcV;
1060 int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y;
1061 int i, idx, tx = 0, ty = 0;
1062 int mvx[4], mvy[4], intra[4];
1063 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
1065 if(!v->s.last_picture.data[0])return;
1067 for(i = 0; i < 4; i++) {
1068 mvx[i] = s->mv[0][i][0];
1069 mvy[i] = s->mv[0][i][1];
1070 intra[i] = v->mb_type[0][s->block_index[i]];
1073 /* calculate chroma MV vector from four luma MVs */
1074 idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0];
1075 if(!idx) { // all blocks are inter
1076 tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
1077 ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
1078 } else if(count[idx] == 1) { // 3 inter blocks
1081 tx = mid_pred(mvx[1], mvx[2], mvx[3]);
1082 ty = mid_pred(mvy[1], mvy[2], mvy[3]);
1085 tx = mid_pred(mvx[0], mvx[2], mvx[3]);
1086 ty = mid_pred(mvy[0], mvy[2], mvy[3]);
1089 tx = mid_pred(mvx[0], mvx[1], mvx[3]);
1090 ty = mid_pred(mvy[0], mvy[1], mvy[3]);
1093 tx = mid_pred(mvx[0], mvx[1], mvx[2]);
1094 ty = mid_pred(mvy[0], mvy[1], mvy[2]);
1097 } else if(count[idx] == 2) {
1099 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
1100 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
1101 tx = (mvx[t1] + mvx[t2]) / 2;
1102 ty = (mvy[t1] + mvy[t2]) / 2;
1104 return; //no need to do MC for inter blocks
1106 uvmx = (tx + ((tx&3) == 3)) >> 1;
1107 uvmy = (ty + ((ty&3) == 3)) >> 1;
1109 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
1110 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
1112 CLIP_RANGE(uvsrc_x, s->mb_x, s->mb_width * 8, 8);
1113 CLIP_RANGE(uvsrc_y, s->mb_y, s->mb_height * 8, 8);
1114 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
1115 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
1116 if((unsigned)uvsrc_x > (s->h_edge_pos >> 1) - ((uvmx >> 1)&1) - 8
1117 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - ((uvmy >> 1)&1) - 8){
1118 ff_emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1,
1119 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1120 ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
1121 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1122 srcU = s->edge_emu_buffer;
1123 srcV = s->edge_emu_buffer + 16;
1127 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
1128 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
1133 uvdxy = ((uvmy & 1) << 1) | (uvmx & 1);
1134 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8);
1135 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8);
1139 * Decode Simple/Main Profiles sequence header
1140 * @see Figure 7-8, p16-17
1141 * @param avctx Codec context
1142 * @param gb GetBit context initialized from Codec context extra_data
1145 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
1147 VC1Context *v = avctx->priv_data;
1149 av_log(avctx, AV_LOG_INFO, "Header: %0X\n", show_bits(gb, 32));
1150 v->profile = get_bits(gb, 2);
1151 if (v->profile == 2)
1153 av_log(avctx, AV_LOG_ERROR, "Profile value 2 is forbidden (and WMV3 Complex Profile is unsupported)\n");
1157 if (v->profile == PROFILE_ADVANCED)
1159 v->level = get_bits(gb, 3);
1162 av_log(avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
1164 v->chromaformat = get_bits(gb, 2);
1165 if (v->chromaformat != 1)
1167 av_log(avctx, AV_LOG_ERROR,
1168 "Only 4:2:0 chroma format supported\n");
1174 v->res_sm = get_bits(gb, 2); //reserved
1177 av_log(avctx, AV_LOG_ERROR,
1178 "Reserved RES_SM=%i is forbidden\n", v->res_sm);
1184 v->frmrtq_postproc = get_bits(gb, 3); //common
1185 // (bitrate-32kbps)/64kbps
1186 v->bitrtq_postproc = get_bits(gb, 5); //common
1187 v->s.loop_filter = get_bits(gb, 1); //common
1188 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE)
1190 av_log(avctx, AV_LOG_ERROR,
1191 "LOOPFILTER shell not be enabled in simple profile\n");
1194 if (v->profile < PROFILE_ADVANCED)
1196 v->res_x8 = get_bits(gb, 1); //reserved
1199 av_log(avctx, AV_LOG_ERROR,
1200 "1 for reserved RES_X8 is forbidden\n");
1203 v->multires = get_bits(gb, 1);
1204 v->res_fasttx = get_bits(gb, 1);
1207 av_log(avctx, AV_LOG_ERROR,
1208 "0 for reserved RES_FASTTX is forbidden\n");
1213 v->fastuvmc = get_bits(gb, 1); //common
1214 if (!v->profile && !v->fastuvmc)
1216 av_log(avctx, AV_LOG_ERROR,
1217 "FASTUVMC unavailable in Simple Profile\n");
1220 v->extended_mv = get_bits(gb, 1); //common
1221 if (!v->profile && v->extended_mv)
1223 av_log(avctx, AV_LOG_ERROR,
1224 "Extended MVs unavailable in Simple Profile\n");
1227 v->dquant = get_bits(gb, 2); //common
1228 v->vstransform = get_bits(gb, 1); //common
1230 if (v->profile < PROFILE_ADVANCED)
1232 v->res_transtab = get_bits(gb, 1);
1233 if (v->res_transtab)
1235 av_log(avctx, AV_LOG_ERROR,
1236 "1 for reserved RES_TRANSTAB is forbidden\n");
1241 v->overlap = get_bits(gb, 1); //common
1243 if (v->profile < PROFILE_ADVANCED)
1245 v->s.resync_marker = get_bits(gb, 1);
1246 v->rangered = get_bits(gb, 1);
1247 if (v->rangered && v->profile == PROFILE_SIMPLE)
1249 av_log(avctx, AV_LOG_INFO,
1250 "RANGERED should be set to 0 in simple profile\n");
1254 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
1255 v->quantizer_mode = get_bits(gb, 2); //common
1257 if (v->profile < PROFILE_ADVANCED)
1259 v->finterpflag = get_bits(gb, 1); //common
1260 v->res_rtm_flag = get_bits(gb, 1); //reserved
1261 if (!v->res_rtm_flag)
1263 av_log(avctx, AV_LOG_ERROR,
1264 "0 for reserved RES_RTM_FLAG is forbidden\n");
1267 av_log(avctx, AV_LOG_DEBUG,
1268 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1269 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
1270 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
1271 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
1272 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
1273 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
1274 v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
1275 v->dquant, v->quantizer_mode, avctx->max_b_frames
1283 static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
1285 int pqindex, lowquant, status;
1287 if(v->finterpflag) v->interpfrm = get_bits(gb, 1);
1288 skip_bits(gb, 2); //framecnt unused
1290 if (v->rangered) v->rangeredfrm = get_bits(gb, 1);
1291 v->s.pict_type = get_bits(gb, 1);
1292 if (v->s.avctx->max_b_frames) {
1293 if (!v->s.pict_type) {
1294 if (get_bits(gb, 1)) v->s.pict_type = I_TYPE;
1295 else v->s.pict_type = B_TYPE;
1296 } else v->s.pict_type = P_TYPE;
1297 } else v->s.pict_type = v->s.pict_type ? P_TYPE : I_TYPE;
1299 if(v->s.pict_type == I_TYPE)
1300 get_bits(gb, 7); // skip buffer fullness
1302 /* Quantizer stuff */
1303 pqindex = get_bits(gb, 5);
1304 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1305 v->pq = pquant_table[0][pqindex];
1307 v->pq = pquant_table[v->quantizer_mode-1][pqindex];
1309 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1310 v->pquantizer = pqindex < 9;
1311 if (v->quantizer_mode == QUANT_UNIFORM || v->quantizer_mode == QUANT_NON_UNIFORM)
1312 v->pquantizer = v->quantizer_mode == QUANT_UNIFORM;
1313 v->pqindex = pqindex;
1314 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
1316 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1317 v->pquantizer = get_bits(gb, 1);
1319 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3);
1320 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1321 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1322 v->range_x = 1 << (v->k_x - 1);
1323 v->range_y = 1 << (v->k_y - 1);
1324 if (v->profile == PROFILE_ADVANCED)
1326 if (v->postprocflag) v->postproc = get_bits(gb, 1);
1329 if (v->multires && v->s.pict_type != B_TYPE) v->respic = get_bits(gb, 2);
1331 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
1332 // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
1334 //TODO: complete parsing for P/B/BI frames
1335 switch(v->s.pict_type) {
1337 if (v->pq < 5) v->tt_index = 0;
1338 else if(v->pq < 13) v->tt_index = 1;
1339 else v->tt_index = 2;
1341 lowquant = (v->pq > 12) ? 0 : 1;
1342 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
1343 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1345 int scale, shift, i;
1346 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)];
1347 v->lumscale = get_bits(gb, 6);
1348 v->lumshift = get_bits(gb, 6);
1349 /* fill lookup tables for intensity compensation */
1352 shift = (255 - v->lumshift * 2) << 6;
1353 if(v->lumshift > 31)
1356 scale = v->lumscale + 32;
1357 if(v->lumshift > 31)
1358 shift = (v->lumshift - 64) << 6;
1360 shift = v->lumshift << 6;
1362 for(i = 0; i < 256; i++) {
1363 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6);
1364 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1367 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1368 v->s.quarter_sample = 0;
1369 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1370 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
1371 v->s.quarter_sample = 0;
1373 v->s.quarter_sample = 1;
1375 v->s.quarter_sample = 1;
1377 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1378 v->mv_mode2 == MV_PMODE_MIXED_MV)
1379 || v->mv_mode == MV_PMODE_MIXED_MV)
1381 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1382 if (status < 0) return -1;
1383 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1384 "Imode: %i, Invert: %i\n", status>>1, status&1);
1386 v->mv_type_is_raw = 0;
1387 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1389 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1390 if (status < 0) return -1;
1391 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1392 "Imode: %i, Invert: %i\n", status>>1, status&1);
1394 /* Hopefully this is correct for P frames */
1395 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables
1396 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1400 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1401 vop_dquant_decoding(v);
1404 v->ttfrm = 0; //FIXME Is that so ?
1407 v->ttmbf = get_bits(gb, 1);
1410 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1419 v->c_ac_table_index = decode012(gb);
1420 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1422 v->y_ac_table_index = decode012(gb);
1425 v->s.dc_table_index = get_bits(gb, 1);
1430 /***********************************************************************/
1432 * @defgroup block VC-1 Block-level functions
1433 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1434 * @todo TODO: Integrate to MpegEncContext facilities
1440 * @brief Get macroblock-level quantizer scale
1441 * @warning XXX: qdiff to the frame quant, not previous quant ?
1442 * @fixme XXX: Don't know how to initialize mquant otherwise in last case
1444 #define GET_MQUANT() \
1448 if (v->dqprofile == DQPROFILE_ALL_MBS) \
1452 mquant = (get_bits(gb, 1)) ? v->altpq : v->pq; \
1456 mqdiff = get_bits(gb, 3); \
1457 if (mqdiff != 7) mquant = v->pq + mqdiff; \
1458 else mquant = get_bits(gb, 5); \
1461 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
1462 edges = 1 << v->dqsbedge; \
1463 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
1464 edges = (3 << v->dqsbedge) % 15; \
1465 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
1467 if((edges&1) && !s->mb_x) \
1468 mquant = v->altpq; \
1469 if((edges&2) && s->first_slice_line) \
1470 mquant = v->altpq; \
1471 if((edges&4) && s->mb_x == (s->mb_width - 1)) \
1472 mquant = v->altpq; \
1473 if((edges&8) && s->mb_y == (s->mb_height - 1)) \
1474 mquant = v->altpq; \
1478 * @def GET_MVDATA(_dmv_x, _dmv_y)
1479 * @brief Get MV differentials
1480 * @see MVDATA decoding from 8.3.5.2, p(1)20
1481 * @param _dmv_x Horizontal differential for decoded MV
1482 * @param _dmv_y Vertical differential for decoded MV
1483 * @todo TODO: Use MpegEncContext arrays to store them
1485 #define GET_MVDATA(_dmv_x, _dmv_y) \
1486 index = 1 + get_vlc2(gb, vc1_mv_diff_vlc[s->mv_table_index].table,\
1487 VC1_MV_DIFF_VLC_BITS, 2); \
1490 mb_has_coeffs = 1; \
1493 else mb_has_coeffs = 0; \
1495 if (!index) { _dmv_x = _dmv_y = 0; } \
1496 else if (index == 35) \
1498 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
1499 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
1501 else if (index == 36) \
1510 if (!s->quarter_sample && index1 == 5) val = 1; \
1512 if(size_table[index1] - val > 0) \
1513 val = get_bits(gb, size_table[index1] - val); \
1515 sign = 0 - (val&1); \
1516 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1519 if (!s->quarter_sample && index1 == 5) val = 1; \
1521 if(size_table[index1] - val > 0) \
1522 val = get_bits(gb, size_table[index1] - val); \
1524 sign = 0 - (val&1); \
1525 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1528 /** Predict and set motion vector
1530 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)
1532 int xy, wrap, off = 0;
1537 /* scale MV difference to be quad-pel */
1538 dmv_x <<= 1 - s->quarter_sample;
1539 dmv_y <<= 1 - s->quarter_sample;
1541 wrap = s->b8_stride;
1542 xy = s->block_index[n];
1545 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
1546 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
1547 if(mv1) { /* duplicate motion data for 1-MV block */
1548 s->current_picture.motion_val[0][xy + 1][0] = 0;
1549 s->current_picture.motion_val[0][xy + 1][1] = 0;
1550 s->current_picture.motion_val[0][xy + wrap][0] = 0;
1551 s->current_picture.motion_val[0][xy + wrap][1] = 0;
1552 s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
1553 s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
1558 C = s->current_picture.motion_val[0][xy - 1];
1559 A = s->current_picture.motion_val[0][xy - wrap];
1561 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1563 //in 4-MV mode different blocks have different B predictor position
1566 off = (s->mb_x > 0) ? -1 : 1;
1569 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
1578 B = s->current_picture.motion_val[0][xy - wrap + off];
1580 if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds
1581 if(s->mb_width == 1) {
1585 px = mid_pred(A[0], B[0], C[0]);
1586 py = mid_pred(A[1], B[1], C[1]);
1588 } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds
1594 /* Pullback MV as specified in 8.3.5.3.4 */
1597 qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
1598 qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
1599 X = (s->mb_width << 6) - 4;
1600 Y = (s->mb_height << 6) - 4;
1602 if(qx + px < -60) px = -60 - qx;
1603 if(qy + py < -60) py = -60 - qy;
1605 if(qx + px < -28) px = -28 - qx;
1606 if(qy + py < -28) py = -28 - qy;
1608 if(qx + px > X) px = X - qx;
1609 if(qy + py > Y) py = Y - qy;
1611 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
1612 if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) {
1613 if(is_intra[xy - wrap])
1614 sum = ABS(px) + ABS(py);
1616 sum = ABS(px - A[0]) + ABS(py - A[1]);
1618 if(get_bits1(&s->gb)) {
1626 if(is_intra[xy - 1])
1627 sum = ABS(px) + ABS(py);
1629 sum = ABS(px - C[0]) + ABS(py - C[1]);
1631 if(get_bits1(&s->gb)) {
1641 /* store MV using signed modulus of MV range defined in 4.11 */
1642 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
1643 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
1644 if(mv1) { /* duplicate motion data for 1-MV block */
1645 s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0];
1646 s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1];
1647 s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0];
1648 s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1];
1649 s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0];
1650 s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1];
1654 /** Get predicted DC value for I-frames only
1655 * prediction dir: left=0, top=1
1656 * @param s MpegEncContext
1657 * @param[in] n block index in the current MB
1658 * @param dc_val_ptr Pointer to DC predictor
1659 * @param dir_ptr Prediction direction for use in AC prediction
1661 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
1662 int16_t **dc_val_ptr, int *dir_ptr)
1664 int a, b, c, wrap, pred, scale;
1666 static const uint16_t dcpred[32] = {
1667 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
1668 114, 102, 93, 85, 79, 73, 68, 64,
1669 60, 57, 54, 51, 49, 47, 45, 43,
1670 41, 39, 38, 37, 35, 34, 33
1673 /* find prediction - wmv3_dc_scale always used here in fact */
1674 if (n < 4) scale = s->y_dc_scale;
1675 else scale = s->c_dc_scale;
1677 wrap = s->block_wrap[n];
1678 dc_val= s->dc_val[0] + s->block_index[n];
1684 b = dc_val[ - 1 - wrap];
1685 a = dc_val[ - wrap];
1687 if (pq < 9 || !overlap)
1689 /* Set outer values */
1690 if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
1691 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
1695 /* Set outer values */
1696 if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
1697 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
1700 if (abs(a - b) <= abs(b - c)) {
1708 /* update predictor */
1709 *dc_val_ptr = &dc_val[0];
1714 /** Get predicted DC value
1715 * prediction dir: left=0, top=1
1716 * @param s MpegEncContext
1717 * @param[in] n block index in the current MB
1718 * @param dc_val_ptr Pointer to DC predictor
1719 * @param dir_ptr Prediction direction for use in AC prediction
1721 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
1722 int a_avail, int c_avail,
1723 int16_t **dc_val_ptr, int *dir_ptr)
1725 int a, b, c, wrap, pred, scale;
1727 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
1730 /* find prediction - wmv3_dc_scale always used here in fact */
1731 if (n < 4) scale = s->y_dc_scale;
1732 else scale = s->c_dc_scale;
1734 wrap = s->block_wrap[n];
1735 dc_val= s->dc_val[0] + s->block_index[n];
1741 b = dc_val[ - 1 - wrap];
1742 a = dc_val[ - wrap];
1744 if(a_avail && c_avail) {
1745 if(abs(a - b) <= abs(b - c)) {
1748 q2 = s->current_picture.qscale_table[mb_pos - 1];
1752 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
1754 } else if(a_avail) {
1757 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
1758 } else if(c_avail) {
1761 q2 = s->current_picture.qscale_table[mb_pos - 1];
1767 /* scale coeffs if needed */
1768 q1 = s->current_picture.qscale_table[mb_pos];
1772 pred = (pred * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
1775 /* update predictor */
1776 *dc_val_ptr = &dc_val[0];
1782 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles
1783 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1784 * @todo TODO: Integrate to MpegEncContext facilities
1788 static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
1790 int xy, wrap, pred, a, b, c;
1792 xy = s->block_index[n];
1793 wrap = s->b8_stride;
1798 a = s->coded_block[xy - 1 ];
1799 b = s->coded_block[xy - 1 - wrap];
1800 c = s->coded_block[xy - wrap];
1809 *coded_block_ptr = &s->coded_block[xy];
1815 * Decode one AC coefficient
1816 * @param v The VC1 context
1817 * @param last Last coefficient
1818 * @param skip How much zero coefficients to skip
1819 * @param value Decoded AC coefficient value
1822 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
1824 GetBitContext *gb = &v->s.gb;
1825 int index, escape, run = 0, level = 0, lst = 0;
1827 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
1828 if (index != vc1_ac_sizes[codingset] - 1) {
1829 run = vc1_index_decode_table[codingset][index][0];
1830 level = vc1_index_decode_table[codingset][index][1];
1831 lst = index >= vc1_last_decode_table[codingset];
1835 escape = decode210(gb);
1837 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
1838 run = vc1_index_decode_table[codingset][index][0];
1839 level = vc1_index_decode_table[codingset][index][1];
1840 lst = index >= vc1_last_decode_table[codingset];
1843 level += vc1_last_delta_level_table[codingset][run];
1845 level += vc1_delta_level_table[codingset][run];
1848 run += vc1_last_delta_run_table[codingset][level] + 1;
1850 run += vc1_delta_run_table[codingset][level] + 1;
1856 lst = get_bits(gb, 1);
1857 if(v->s.esc3_level_length == 0) {
1858 if(v->pq < 8 || v->dquantfrm) { // table 59
1859 v->s.esc3_level_length = get_bits(gb, 3);
1860 if(!v->s.esc3_level_length)
1861 v->s.esc3_level_length = get_bits(gb, 2) + 8;
1863 v->s.esc3_level_length = get_prefix(gb, 1, 6) + 2;
1865 v->s.esc3_run_length = 3 + get_bits(gb, 2);
1867 run = get_bits(gb, v->s.esc3_run_length);
1868 sign = get_bits(gb, 1);
1869 level = get_bits(gb, v->s.esc3_level_length);
1880 /** Decode intra block in intra frames - should be faster than decode_intra_block
1881 * @param v VC1Context
1882 * @param block block to decode
1883 * @param coded are AC coeffs present or not
1884 * @param codingset set of VLC to decode data
1886 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
1888 GetBitContext *gb = &v->s.gb;
1889 MpegEncContext *s = &v->s;
1890 int dc_pred_dir = 0; /* Direction of the DC prediction used */
1893 int16_t *ac_val, *ac_val2;
1896 /* Get DC differential */
1898 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
1900 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
1903 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
1908 if (dcdiff == 119 /* ESC index value */)
1910 /* TODO: Optimize */
1911 if (v->pq == 1) dcdiff = get_bits(gb, 10);
1912 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
1913 else dcdiff = get_bits(gb, 8);
1918 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
1919 else if (v->pq == 2)
1920 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
1922 if (get_bits(gb, 1))
1927 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
1930 /* Store the quantized DC coeff, used for prediction */
1932 block[0] = dcdiff * s->y_dc_scale;
1934 block[0] = dcdiff * s->c_dc_scale;
1947 int last = 0, skip, value;
1948 const int8_t *zz_table;
1952 scale = v->pq * 2 + v->halfpq;
1956 zz_table = vc1_horizontal_zz;
1958 zz_table = vc1_vertical_zz;
1960 zz_table = vc1_normal_zz;
1962 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1964 if(dc_pred_dir) //left
1967 ac_val -= 16 * s->block_wrap[n];
1970 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
1974 block[zz_table[i++]] = value;
1977 /* apply AC prediction if needed */
1979 if(dc_pred_dir) { //left
1980 for(k = 1; k < 8; k++)
1981 block[k << 3] += ac_val[k];
1983 for(k = 1; k < 8; k++)
1984 block[k] += ac_val[k + 8];
1987 /* save AC coeffs for further prediction */
1988 for(k = 1; k < 8; k++) {
1989 ac_val2[k] = block[k << 3];
1990 ac_val2[k + 8] = block[k];
1993 /* scale AC coeffs */
1994 for(k = 1; k < 64; k++)
1998 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2001 if(s->ac_pred) i = 63;
2007 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2010 scale = v->pq * 2 + v->halfpq;
2011 memset(ac_val2, 0, 16 * 2);
2012 if(dc_pred_dir) {//left
2015 memcpy(ac_val2, ac_val, 8 * 2);
2017 ac_val -= 16 * s->block_wrap[n];
2019 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2022 /* apply AC prediction if needed */
2024 if(dc_pred_dir) { //left
2025 for(k = 1; k < 8; k++) {
2026 block[k << 3] = ac_val[k] * scale;
2028 block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq;
2031 for(k = 1; k < 8; k++) {
2032 block[k] = ac_val[k + 8] * scale;
2034 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2040 s->block_last_index[n] = i;
2045 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
2046 * @param v VC1Context
2047 * @param block block to decode
2048 * @param coded are AC coeffs present or not
2049 * @param mquant block quantizer
2050 * @param codingset set of VLC to decode data
2052 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
2054 GetBitContext *gb = &v->s.gb;
2055 MpegEncContext *s = &v->s;
2056 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2059 int16_t *ac_val, *ac_val2;
2061 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2062 int a_avail = v->a_avail, c_avail = v->c_avail;
2063 int use_pred = s->ac_pred;
2067 /* XXX: Guard against dumb values of mquant */
2068 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
2070 /* Set DC scale - y and c use the same */
2071 s->y_dc_scale = s->y_dc_scale_table[mquant];
2072 s->c_dc_scale = s->c_dc_scale_table[mquant];
2074 /* Get DC differential */
2076 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2078 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2081 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2086 if (dcdiff == 119 /* ESC index value */)
2088 /* TODO: Optimize */
2089 if (mquant == 1) dcdiff = get_bits(gb, 10);
2090 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2091 else dcdiff = get_bits(gb, 8);
2096 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2097 else if (mquant == 2)
2098 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
2100 if (get_bits(gb, 1))
2105 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
2108 /* Store the quantized DC coeff, used for prediction */
2111 block[0] = dcdiff * s->y_dc_scale;
2113 block[0] = dcdiff * s->c_dc_scale;
2122 /* check if AC is needed at all and adjust direction if needed */
2123 if(!a_avail) dc_pred_dir = 1;
2124 if(!c_avail) dc_pred_dir = 0;
2125 if(!a_avail && !c_avail) use_pred = 0;
2126 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2131 if(dc_pred_dir) //left
2134 ac_val -= 16 * s->block_wrap[n];
2136 q1 = s->current_picture.qscale_table[mb_pos];
2137 if(dc_pred_dir && c_avail) q2 = s->current_picture.qscale_table[mb_pos - 1];
2138 if(!dc_pred_dir && a_avail) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2139 if(n && n<4) q2 = q1;
2142 int last = 0, skip, value;
2143 const int8_t *zz_table;
2146 zz_table = vc1_simple_progressive_8x8_zz;
2149 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2153 block[zz_table[i++]] = value;
2156 /* apply AC prediction if needed */
2158 /* scale predictors if needed*/
2163 if(dc_pred_dir) { //left
2164 for(k = 1; k < 8; k++)
2165 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2167 for(k = 1; k < 8; k++)
2168 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2171 if(dc_pred_dir) { //left
2172 for(k = 1; k < 8; k++)
2173 block[k << 3] += ac_val[k];
2175 for(k = 1; k < 8; k++)
2176 block[k] += ac_val[k + 8];
2180 /* save AC coeffs for further prediction */
2181 for(k = 1; k < 8; k++) {
2182 ac_val2[k] = block[k << 3];
2183 ac_val2[k + 8] = block[k];
2186 /* scale AC coeffs */
2187 for(k = 1; k < 64; k++)
2191 block[k] += (block[k] < 0) ? -mquant : mquant;
2194 if(use_pred) i = 63;
2195 } else { // no AC coeffs
2198 memset(ac_val2, 0, 16 * 2);
2199 if(dc_pred_dir) {//left
2201 memcpy(ac_val2, ac_val, 8 * 2);
2205 for(k = 1; k < 8; k++)
2206 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2211 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2215 for(k = 1; k < 8; k++)
2216 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2221 /* apply AC prediction if needed */
2223 if(dc_pred_dir) { //left
2224 for(k = 1; k < 8; k++) {
2225 block[k << 3] = ac_val2[k] * scale;
2227 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
2230 for(k = 1; k < 8; k++) {
2231 block[k] = ac_val2[k + 8] * scale;
2233 block[k] += (block[k] < 0) ? -mquant : mquant;
2239 s->block_last_index[n] = i;
2246 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block)
2248 MpegEncContext *s = &v->s;
2249 GetBitContext *gb = &s->gb;
2252 int scale, off, idx, last, skip, value;
2253 int ttblk = ttmb & 7;
2256 ttblk = ttblk_to_tt[v->tt_index][get_vlc2(gb, vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
2258 if(ttblk == TT_4X4) {
2259 subblkpat = ~(get_vlc2(gb, vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
2261 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) {
2262 subblkpat = decode012(gb);
2263 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
2264 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
2265 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
2269 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
2270 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
2271 subblkpat = 2 - (ttblk == TT_8X4_TOP);
2274 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
2275 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
2283 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2287 idx = vc1_simple_progressive_8x8_zz[i++];
2288 block[idx] = value * scale;
2290 vc1_inv_trans(block, 8, 8);
2293 for(j = 0; j < 4; j++) {
2294 last = subblkpat & (1 << (3 - j));
2296 off = (j & 1) * 4 + (j & 2) * 16;
2298 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2302 idx = vc1_simple_progressive_4x4_zz[i++];
2303 block[idx + off] = value * scale;
2305 if(!(subblkpat & (1 << (3 - j))))
2306 vc1_inv_trans(block + off, 4, 4);
2310 for(j = 0; j < 2; j++) {
2311 last = subblkpat & (1 << (1 - j));
2315 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2319 idx = vc1_simple_progressive_8x4_zz[i++];
2320 block[idx + off] = value * scale;
2322 if(!(subblkpat & (1 << (1 - j))))
2323 vc1_inv_trans(block + off, 8, 4);
2327 for(j = 0; j < 2; j++) {
2328 last = subblkpat & (1 << (1 - j));
2332 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2336 idx = vc1_simple_progressive_4x8_zz[i++];
2337 block[idx + off] = value * scale;
2339 if(!(subblkpat & (1 << (1 - j))))
2340 vc1_inv_trans(block + off, 4, 8);
2348 /** Decode one P-frame MB (in Simple/Main profile)
2349 * @todo TODO: Extend to AP
2350 * @fixme FIXME: DC value for inter blocks not set
2352 static int vc1_decode_p_mb(VC1Context *v, DCTELEM block[6][64])
2354 MpegEncContext *s = &v->s;
2355 GetBitContext *gb = &s->gb;
2357 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2358 int cbp; /* cbp decoding stuff */
2359 int mqdiff, mquant; /* MB quantization */
2360 int ttmb = v->ttfrm; /* MB Transform type */
2363 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
2364 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
2365 int mb_has_coeffs = 1; /* last_flag */
2366 int dmv_x, dmv_y; /* Differential MV components */
2367 int index, index1; /* LUT indices */
2368 int val, sign; /* temp values */
2369 int first_block = 1;
2371 int skipped, fourmv;
2373 mquant = v->pq; /* Loosy initialization */
2375 if (v->mv_type_is_raw)
2376 fourmv = get_bits1(gb);
2378 fourmv = v->mv_type_mb_plane[mb_pos];
2380 skipped = get_bits1(gb);
2382 skipped = v->s.mbskip_table[mb_pos];
2384 s->dsp.clear_blocks(s->block[0]);
2386 if (!fourmv) /* 1MV mode */
2390 GET_MVDATA(dmv_x, dmv_y);
2392 s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
2393 vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
2395 /* FIXME Set DC val for inter block ? */
2396 if (s->mb_intra && !mb_has_coeffs)
2399 s->ac_pred = get_bits(gb, 1);
2402 else if (mb_has_coeffs)
2404 if (s->mb_intra) s->ac_pred = get_bits(gb, 1);
2405 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
2413 s->current_picture.qscale_table[mb_pos] = mquant;
2415 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
2416 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table,
2417 VC1_TTMB_VLC_BITS, 2);
2418 if(!s->mb_intra) vc1_mc_1mv(v);
2422 s->dc_val[0][s->block_index[i]] = 0;
2424 val = ((cbp >> (5 - i)) & 1);
2425 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
2426 v->mb_type[0][s->block_index[i]] = s->mb_intra;
2428 /* check if prediction blocks A and C are available */
2429 v->a_avail = v->c_avail = 0;
2430 if(i == 2 || i == 3 || !s->first_slice_line)
2431 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2432 if(i == 1 || i == 3 || s->mb_x)
2433 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2435 vc1_decode_intra_block(v, block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
2436 vc1_inv_trans(block[i], 8, 8);
2437 for(j = 0; j < 64; j++) block[i][j] += 128;
2438 s->dsp.put_pixels_clamped(block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2439 /* TODO: proper loop filtering */
2440 if(v->pq >= 9 && v->overlap) {
2442 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2444 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2447 vc1_decode_p_block(v, block[i], i, mquant, ttmb, first_block);
2448 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2450 s->dsp.add_pixels_clamped(block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2457 for(i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
2458 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
2459 s->current_picture.qscale_table[mb_pos] = 0;
2460 vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
2467 if (!skipped /* unskipped MB */)
2469 int intra_count = 0, coded_inter = 0;
2470 int is_intra[6], is_coded[6];
2472 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
2475 val = ((cbp >> (5 - i)) & 1);
2476 s->dc_val[0][s->block_index[i]] = 0;
2483 GET_MVDATA(dmv_x, dmv_y);
2485 vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
2486 if(!s->mb_intra) vc1_mc_4mv_luma(v, i);
2487 intra_count += s->mb_intra;
2488 is_intra[i] = s->mb_intra;
2489 is_coded[i] = mb_has_coeffs;
2492 is_intra[i] = (intra_count >= 3);
2495 if(i == 4) vc1_mc_4mv_chroma(v);
2496 v->mb_type[0][s->block_index[i]] = is_intra[i];
2497 if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
2499 // if there are no coded blocks then don't do anything more
2500 if(!intra_count && !coded_inter) return 0;
2503 s->current_picture.qscale_table[mb_pos] = mquant;
2504 /* test if block is intra and has pred */
2509 if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
2510 || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
2515 if(intrapred)s->ac_pred = get_bits(gb, 1);
2516 else s->ac_pred = 0;
2518 if (!v->ttmbf && coded_inter)
2519 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 12);
2523 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
2524 s->mb_intra = is_intra[i];
2526 /* check if prediction blocks A and C are available */
2527 v->a_avail = v->c_avail = 0;
2528 if(i == 2 || i == 3 || !s->first_slice_line)
2529 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2530 if(i == 1 || i == 3 || s->mb_x)
2531 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2533 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
2534 vc1_inv_trans(block[i], 8, 8);
2535 for(j = 0; j < 64; j++) block[i][j] += 128;
2536 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2537 /* TODO: proper loop filtering */
2538 if(v->pq >= 9 && v->overlap) {
2540 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2542 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2544 } else if(is_coded[i]) {
2545 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2546 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2548 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2556 for (i=0; i<6; i++) v->mb_type[0][s->block_index[i]] = 0;
2559 vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]);
2560 vc1_mc_4mv_luma(v, i);
2562 vc1_mc_4mv_chroma(v);
2563 s->current_picture.qscale_table[mb_pos] = 0;
2568 /* Should never happen */
2572 /** Decode blocks of I-frame
2574 static void vc1_decode_i_blocks(VC1Context *v)
2577 MpegEncContext *s = &v->s;
2582 /* select codingmode used for VLC tables selection */
2583 switch(v->y_ac_table_index){
2585 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2588 v->codingset = CS_HIGH_MOT_INTRA;
2591 v->codingset = CS_MID_RATE_INTRA;
2595 switch(v->c_ac_table_index){
2597 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2600 v->codingset2 = CS_HIGH_MOT_INTER;
2603 v->codingset2 = CS_MID_RATE_INTER;
2607 /* Set DC scale - y and c use the same */
2608 s->y_dc_scale = s->y_dc_scale_table[v->pq];
2609 s->c_dc_scale = s->c_dc_scale_table[v->pq];
2612 s->mb_x = s->mb_y = 0;
2614 s->first_slice_line = 1;
2615 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
2616 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
2617 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
2618 ff_init_block_index(s);
2619 ff_update_block_index(s);
2620 s->dsp.clear_blocks(s->block[0]);
2621 mb_pos = s->mb_x + s->mb_y * s->mb_width;
2622 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
2623 s->current_picture.qscale_table[mb_pos] = v->pq;
2625 // do actual MB decoding and displaying
2626 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
2627 v->s.ac_pred = get_bits(&v->s.gb, 1);
2629 for(k = 0; k < 6; k++) {
2630 val = ((cbp >> (5 - k)) & 1);
2633 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
2637 cbp |= val << (5 - k);
2639 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
2641 vc1_inv_trans(s->block[k], 8, 8);
2642 if(v->pq >= 9 && v->overlap) {
2643 for(j = 0; j < 64; j++) s->block[k][j] += 128;
2647 vc1_put_block(v, s->block);
2648 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */
2649 if(!s->first_slice_line) {
2650 vc1_v_overlap(s->dest[0], s->linesize);
2651 vc1_v_overlap(s->dest[0] + 8, s->linesize);
2652 vc1_v_overlap(s->dest[1], s->uvlinesize);
2653 vc1_v_overlap(s->dest[2], s->uvlinesize);
2655 vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2656 vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
2658 vc1_h_overlap(s->dest[0], s->linesize);
2659 vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
2660 vc1_h_overlap(s->dest[1], s->uvlinesize);
2661 vc1_h_overlap(s->dest[2], s->uvlinesize);
2663 vc1_h_overlap(s->dest[0] + 8, s->linesize);
2664 vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
2667 if(get_bits_count(&s->gb) > v->bits) {
2668 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
2672 ff_draw_horiz_band(s, s->mb_y * 16, 16);
2673 s->first_slice_line = 0;
2677 static void vc1_decode_p_blocks(VC1Context *v)
2679 MpegEncContext *s = &v->s;
2681 /* select codingmode used for VLC tables selection */
2682 switch(v->c_ac_table_index){
2684 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2687 v->codingset = CS_HIGH_MOT_INTRA;
2690 v->codingset = CS_MID_RATE_INTRA;
2694 switch(v->c_ac_table_index){
2696 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2699 v->codingset2 = CS_HIGH_MOT_INTER;
2702 v->codingset2 = CS_MID_RATE_INTER;
2706 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
2707 s->first_slice_line = 1;
2708 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
2709 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
2710 ff_init_block_index(s);
2711 ff_update_block_index(s);
2712 s->dsp.clear_blocks(s->block[0]);
2714 vc1_decode_p_mb(v, s->block);
2715 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
2716 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
2720 ff_draw_horiz_band(s, s->mb_y * 16, 16);
2721 s->first_slice_line = 0;
2725 static void vc1_decode_blocks(VC1Context *v)
2728 v->s.esc3_level_length = 0;
2730 switch(v->s.pict_type) {
2732 vc1_decode_i_blocks(v);
2735 vc1_decode_p_blocks(v);
2741 /** Initialize a VC1/WMV3 decoder
2742 * @todo TODO: Handle VC-1 IDUs (Transport level?)
2743 * @todo TODO: Decypher remaining bits in extra_data
2745 static int vc1_decode_init(AVCodecContext *avctx)
2747 VC1Context *v = avctx->priv_data;
2748 MpegEncContext *s = &v->s;
2751 if (!avctx->extradata_size || !avctx->extradata) return -1;
2752 avctx->pix_fmt = PIX_FMT_YUV420P;
2754 avctx->flags |= CODEC_FLAG_EMU_EDGE;
2755 v->s.flags |= CODEC_FLAG_EMU_EDGE;
2757 if(ff_h263_decode_init(avctx) < 0)
2759 if (vc1_init_common(v) < 0) return -1;
2761 av_log(avctx, AV_LOG_INFO, "This decoder is not supposed to produce picture. Dont report this as a bug!\n");
2762 av_log(avctx, AV_LOG_INFO, "If you see a picture, don't believe your eyes.\n");
2764 avctx->coded_width = avctx->width;
2765 avctx->coded_height = avctx->height;
2766 if (avctx->codec_id == CODEC_ID_WMV3)
2770 // looks like WMV3 has a sequence header stored in the extradata
2771 // advanced sequence header may be before the first frame
2772 // the last byte of the extradata is a version number, 1 for the
2773 // samples we can decode
2775 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
2777 if (decode_sequence_header(avctx, &gb) < 0)
2780 count = avctx->extradata_size*8 - get_bits_count(&gb);
2783 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
2784 count, get_bits(&gb, count));
2788 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
2791 avctx->has_b_frames= !!(avctx->max_b_frames);
2793 s->mb_width = (avctx->coded_width+15)>>4;
2794 s->mb_height = (avctx->coded_height+15)>>4;
2796 /* Allocate mb bitplanes */
2797 v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
2799 /* allocate block type info in that way so it could be used with s->block_index[] */
2800 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
2801 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
2802 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
2803 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
2805 /* Init coded blocks info */
2806 if (v->profile == PROFILE_ADVANCED)
2808 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
2810 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
2818 /** Decode a VC1/WMV3 frame
2819 * @todo TODO: Handle VC-1 IDUs (Transport level?)
2820 * @warning Initial try at using MpegEncContext stuff
2822 static int vc1_decode_frame(AVCodecContext *avctx,
2823 void *data, int *data_size,
2824 uint8_t *buf, int buf_size)
2826 VC1Context *v = avctx->priv_data;
2827 MpegEncContext *s = &v->s;
2828 AVFrame *pict = data;
2830 /* no supplementary picture */
2831 if (buf_size == 0) {
2832 /* special case for last picture */
2833 if (s->low_delay==0 && s->next_picture_ptr) {
2834 *pict= *(AVFrame*)s->next_picture_ptr;
2835 s->next_picture_ptr= NULL;
2837 *data_size = sizeof(AVFrame);
2843 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
2844 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
2845 int i= ff_find_unused_picture(s, 0);
2846 s->current_picture_ptr= &s->picture[i];
2849 avctx->has_b_frames= !s->low_delay;
2851 init_get_bits(&s->gb, buf, buf_size*8);
2852 // do parse frame header
2853 if(vc1_parse_frame_header(v, &s->gb) == -1)
2856 if(s->pict_type != I_TYPE && s->pict_type != P_TYPE)return -1;
2859 s->current_picture.pict_type= s->pict_type;
2860 s->current_picture.key_frame= s->pict_type == I_TYPE;
2862 /* skip B-frames if we don't have reference frames */
2863 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)) return -1;//buf_size;
2864 /* skip b frames if we are in a hurry */
2865 if(avctx->hurry_up && s->pict_type==B_TYPE) return -1;//buf_size;
2866 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
2867 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
2868 || avctx->skip_frame >= AVDISCARD_ALL)
2870 /* skip everything if we are in a hurry>=5 */
2871 if(avctx->hurry_up>=5) return -1;//buf_size;
2873 if(s->next_p_frame_damaged){
2874 if(s->pict_type==B_TYPE)
2877 s->next_p_frame_damaged=0;
2880 if(MPV_frame_start(s, avctx) < 0)
2883 ff_er_frame_start(s);
2885 v->bits = buf_size * 8;
2886 vc1_decode_blocks(v);
2887 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
2888 // if(get_bits_count(&s->gb) > buf_size * 8)
2894 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
2895 assert(s->current_picture.pict_type == s->pict_type);
2896 if (s->pict_type == B_TYPE || s->low_delay) {
2897 *pict= *(AVFrame*)s->current_picture_ptr;
2898 } else if (s->last_picture_ptr != NULL) {
2899 *pict= *(AVFrame*)s->last_picture_ptr;
2902 if(s->last_picture_ptr || s->low_delay){
2903 *data_size = sizeof(AVFrame);
2904 ff_print_debug_info(s, pict);
2907 /* Return the Picture timestamp as the frame number */
2908 /* we substract 1 because it is added on utils.c */
2909 avctx->frame_number = s->picture_number - 1;
2915 /** Close a VC1/WMV3 decoder
2916 * @warning Initial try at using MpegEncContext stuff
2918 static int vc1_decode_end(AVCodecContext *avctx)
2920 VC1Context *v = avctx->priv_data;
2922 av_freep(&v->hrd_rate);
2923 av_freep(&v->hrd_buffer);
2924 MPV_common_end(&v->s);
2925 av_freep(&v->mv_type_mb_plane);
2926 av_freep(&v->mb_type_base);
2931 AVCodec vc1_decoder = {
2944 AVCodec wmv3_decoder = {