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 file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
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.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * VC-1 and WMV3 decoder
32 #include "mpegvideo.h"
34 #include "vc1acdata.h"
39 extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2];
40 extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2];
41 extern VLC ff_msmp4_dc_luma_vlc[2], ff_msmp4_dc_chroma_vlc[2];
42 #define MB_INTRA_VLC_BITS 9
43 extern VLC ff_msmp4_mb_i_vlc;
44 extern const uint16_t ff_msmp4_mb_i_table[64][2];
47 static const uint16_t table_mb_intra[64][2];
49 /** Markers used if VC-1 AP frame data */
52 VC1_CODE_RES0 = 0x00000100,
53 VC1_CODE_ENDOFSEQ = 0x0000010A,
62 /** Available Profiles */
67 PROFILE_COMPLEX, ///< TODO: WMV9 specific
72 /** Sequence quantizer mode */
75 QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level
76 QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level
77 QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames
78 QUANT_UNIFORM ///< Uniform quant used for all frames
82 /** Where quant can be changed */
86 DQPROFILE_DOUBLE_EDGES,
87 DQPROFILE_SINGLE_EDGE,
92 /** @name Where quant can be changed
103 /** Which pair of edges is quantized with ALTPQUANT */
106 DQDOUBLE_BEDGE_TOPLEFT,
107 DQDOUBLE_BEDGE_TOPRIGHT,
108 DQDOUBLE_BEDGE_BOTTOMRIGHT,
109 DQDOUBLE_BEDGE_BOTTOMLEFT
113 /** MV modes for P frames */
116 MV_PMODE_1MV_HPEL_BILIN,
120 MV_PMODE_INTENSITY_COMP
124 /** @name MV types for B frames */
129 BMV_TYPE_INTERPOLATED
133 /** @name Block types for P/B frames */
135 enum TransformTypes {
139 TT_8X4, //Both halves
142 TT_4X8, //Both halves
147 /** Table for conversion between TTBLK and TTMB */
148 static const int ttblk_to_tt[3][8] = {
149 { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
150 { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
151 { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
154 static const int ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
156 /** MV P mode - the 5th element is only used for mode 1 */
157 static const uint8_t mv_pmode_table[2][5] = {
158 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
159 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
161 static const uint8_t mv_pmode_table2[2][4] = {
162 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
163 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
166 /** One more frame type */
169 static const int fps_nr[5] = { 24, 25, 30, 50, 60 },
170 fps_dr[2] = { 1000, 1001 };
171 static const uint8_t pquant_table[3][32] = {
172 { /* Implicit quantizer */
173 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12,
174 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
176 { /* Explicit quantizer, pquantizer uniform */
177 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
178 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
180 { /* Explicit quantizer, pquantizer non-uniform */
181 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
182 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
186 /** @name VC-1 VLC tables and defines
187 * @todo TODO move this into the context
190 #define VC1_BFRACTION_VLC_BITS 7
191 static VLC vc1_bfraction_vlc;
192 #define VC1_IMODE_VLC_BITS 4
193 static VLC vc1_imode_vlc;
194 #define VC1_NORM2_VLC_BITS 3
195 static VLC vc1_norm2_vlc;
196 #define VC1_NORM6_VLC_BITS 9
197 static VLC vc1_norm6_vlc;
198 /* Could be optimized, one table only needs 8 bits */
199 #define VC1_TTMB_VLC_BITS 9 //12
200 static VLC vc1_ttmb_vlc[3];
201 #define VC1_MV_DIFF_VLC_BITS 9 //15
202 static VLC vc1_mv_diff_vlc[4];
203 #define VC1_CBPCY_P_VLC_BITS 9 //14
204 static VLC vc1_cbpcy_p_vlc[4];
205 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
206 static VLC vc1_4mv_block_pattern_vlc[4];
207 #define VC1_TTBLK_VLC_BITS 5
208 static VLC vc1_ttblk_vlc[3];
209 #define VC1_SUBBLKPAT_VLC_BITS 6
210 static VLC vc1_subblkpat_vlc[3];
212 static VLC vc1_ac_coeff_table[8];
216 CS_HIGH_MOT_INTRA = 0,
226 /** @name Overlap conditions for Advanced Profile */
237 * @fixme Change size wherever another size is more efficient
238 * Many members are only used for Advanced Profile
240 typedef struct VC1Context{
245 /** Simple/Main Profile sequence header */
247 int res_sm; ///< reserved, 2b
248 int res_x8; ///< reserved
249 int multires; ///< frame-level RESPIC syntax element present
250 int res_fasttx; ///< reserved, always 1
251 int res_transtab; ///< reserved, always 0
252 int rangered; ///< RANGEREDFRM (range reduction) syntax element present
254 int res_rtm_flag; ///< reserved, set to 1
255 int reserved; ///< reserved
258 /** Advanced Profile */
260 int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer
261 int chromaformat; ///< 2bits, 2=4:2:0, only defined
262 int postprocflag; ///< Per-frame processing suggestion flag present
263 int broadcast; ///< TFF/RFF present
264 int interlace; ///< Progressive/interlaced (RPTFTM syntax element)
265 int tfcntrflag; ///< TFCNTR present
266 int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
267 int extended_dmv; ///< Additional extended dmv range at P/B frame-level
268 int color_prim; ///< 8bits, chroma coordinates of the color primaries
269 int transfer_char; ///< 8bits, Opto-electronic transfer characteristics
270 int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix
271 int hrd_param_flag; ///< Presence of Hypothetical Reference
272 ///< Decoder parameters
273 int psf; ///< Progressive Segmented Frame
276 /** Sequence header data for all Profiles
277 * TODO: choose between ints, uint8_ts and monobit flags
280 int profile; ///< 2bits, Profile
281 int frmrtq_postproc; ///< 3bits,
282 int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength
283 int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple)
284 int extended_mv; ///< Ext MV in P/B (not in Simple)
285 int dquant; ///< How qscale varies with MBs, 2bits (not in Simple)
286 int vstransform; ///< variable-size [48]x[48] transform type + info
287 int overlap; ///< overlapped transforms in use
288 int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_*
289 int finterpflag; ///< INTERPFRM present
292 /** Frame decoding info for all profiles */
294 uint8_t mv_mode; ///< MV coding monde
295 uint8_t mv_mode2; ///< Secondary MV coding mode (B frames)
296 int k_x; ///< Number of bits for MVs (depends on MV range)
297 int k_y; ///< Number of bits for MVs (depends on MV range)
298 int range_x, range_y; ///< MV range
299 uint8_t pq, altpq; ///< Current/alternate frame quantizer scale
300 /** pquant parameters */
307 /** AC coding set indexes
308 * @see 8.1.1.10, p(1)10
311 int c_ac_table_index; ///< Chroma index from ACFRM element
312 int y_ac_table_index; ///< Luma index from AC2FRM element
314 int ttfrm; ///< Transform type info present at frame level
315 uint8_t ttmbf; ///< Transform type flag
316 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform
317 int codingset; ///< index of current table set from 11.8 to use for luma block decoding
318 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding
319 int pqindex; ///< raw pqindex used in coding set selection
320 int a_avail, c_avail;
321 uint8_t *mb_type_base, *mb_type[3];
324 /** Luma compensation parameters */
329 int16_t bfraction; ///< Relative position % anchors=> how to scale MVs
330 uint8_t halfpq; ///< Uniform quant over image and qp+.5
331 uint8_t respic; ///< Frame-level flag for resized images
332 int buffer_fullness; ///< HRD info
334 * -# 0 -> [-64n 63.f] x [-32, 31.f]
335 * -# 1 -> [-128, 127.f] x [-64, 63.f]
336 * -# 2 -> [-512, 511.f] x [-128, 127.f]
337 * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
340 uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use
341 VLC *cbpcy_vlc; ///< CBPCY VLC table
342 int tt_index; ///< Index for Transform Type tables
343 uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV)
344 uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs
345 int mv_type_is_raw; ///< mv type mb plane is not coded
346 int dmb_is_raw; ///< direct mb plane is raw
347 int skip_is_raw; ///< skip mb plane is not coded
348 uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
349 int use_ic; ///< use intensity compensation in B-frames
350 int rnd; ///< rounding control
352 /** Frame decoding info for S/M profiles only */
354 uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
358 /** Frame decoding info for Advanced profile */
360 uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
361 uint8_t numpanscanwin;
363 uint8_t rptfrm, tff, rff;
366 uint16_t bottomrightx;
367 uint16_t bottomrighty;
370 int hrd_num_leaky_buckets;
371 uint8_t bit_rate_exponent;
372 uint8_t buffer_size_exponent;
373 uint8_t* acpred_plane; ///< AC prediction flags bitplane
375 uint8_t* over_flags_plane; ///< Overflags bitplane
378 uint16_t *hrd_rate, *hrd_buffer;
379 uint8_t *hrd_fullness;
380 uint8_t range_mapy_flag;
381 uint8_t range_mapuv_flag;
391 * Get unary code of limited length
392 * @fixme FIXME Slow and ugly
393 * @param gb GetBitContext
394 * @param[in] stop The bitstop value (unary code of 1's or 0's)
395 * @param[in] len Maximum length
396 * @return Unary length/index
398 static int get_prefix(GetBitContext *gb, int stop, int len)
403 for(i = 0; i < len && get_bits1(gb) != stop; i++);
405 /* int i = 0, tmp = !stop;
407 while (i != len && tmp != stop)
409 tmp = get_bits(gb, 1);
412 if (i == len && tmp != stop) return len+1;
419 UPDATE_CACHE(re, gb);
420 buf=GET_CACHE(re, gb); //Still not sure
421 if (stop) buf = ~buf;
423 log= av_log2(-buf); //FIXME: -?
425 LAST_SKIP_BITS(re, gb, log+1);
426 CLOSE_READER(re, gb);
430 LAST_SKIP_BITS(re, gb, limit);
431 CLOSE_READER(re, gb);
436 static inline int decode210(GetBitContext *gb){
442 return 2 - get_bits1(gb);
446 * Init VC-1 specific tables and VC1Context members
447 * @param v The VC1Context to initialize
450 static int vc1_init_common(VC1Context *v)
455 v->hrd_rate = v->hrd_buffer = NULL;
461 init_vlc(&vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
462 vc1_bfraction_bits, 1, 1,
463 vc1_bfraction_codes, 1, 1, 1);
464 init_vlc(&vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
465 vc1_norm2_bits, 1, 1,
466 vc1_norm2_codes, 1, 1, 1);
467 init_vlc(&vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
468 vc1_norm6_bits, 1, 1,
469 vc1_norm6_codes, 2, 2, 1);
470 init_vlc(&vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
471 vc1_imode_bits, 1, 1,
472 vc1_imode_codes, 1, 1, 1);
475 init_vlc(&vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
476 vc1_ttmb_bits[i], 1, 1,
477 vc1_ttmb_codes[i], 2, 2, 1);
478 init_vlc(&vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
479 vc1_ttblk_bits[i], 1, 1,
480 vc1_ttblk_codes[i], 1, 1, 1);
481 init_vlc(&vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
482 vc1_subblkpat_bits[i], 1, 1,
483 vc1_subblkpat_codes[i], 1, 1, 1);
487 init_vlc(&vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
488 vc1_4mv_block_pattern_bits[i], 1, 1,
489 vc1_4mv_block_pattern_codes[i], 1, 1, 1);
490 init_vlc(&vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
491 vc1_cbpcy_p_bits[i], 1, 1,
492 vc1_cbpcy_p_codes[i], 2, 2, 1);
493 init_vlc(&vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
494 vc1_mv_diff_bits[i], 1, 1,
495 vc1_mv_diff_codes[i], 2, 2, 1);
498 init_vlc(&vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
499 &vc1_ac_tables[i][0][1], 8, 4,
500 &vc1_ac_tables[i][0][0], 8, 4, 1);
501 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
502 &ff_msmp4_mb_i_table[0][1], 4, 2,
503 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
508 v->mvrange = 0; /* 7.1.1.18, p80 */
513 /***********************************************************************/
515 * @defgroup bitplane VC9 Bitplane decoding
520 /** @addtogroup bitplane
533 /** @} */ //imode defines
535 /** Decode rows by checking if they are skipped
536 * @param plane Buffer to store decoded bits
537 * @param[in] width Width of this buffer
538 * @param[in] height Height of this buffer
539 * @param[in] stride of this buffer
541 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
544 for (y=0; y<height; y++){
545 if (!get_bits(gb, 1)) //rowskip
546 memset(plane, 0, width);
548 for (x=0; x<width; x++)
549 plane[x] = get_bits(gb, 1);
554 /** Decode columns by checking if they are skipped
555 * @param plane Buffer to store decoded bits
556 * @param[in] width Width of this buffer
557 * @param[in] height Height of this buffer
558 * @param[in] stride of this buffer
559 * @fixme FIXME: Optimize
561 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
564 for (x=0; x<width; x++){
565 if (!get_bits(gb, 1)) //colskip
566 for (y=0; y<height; y++)
569 for (y=0; y<height; y++)
570 plane[y*stride] = get_bits(gb, 1);
575 /** Decode a bitplane's bits
576 * @param bp Bitplane where to store the decode bits
577 * @param v VC-1 context for bit reading and logging
579 * @fixme FIXME: Optimize
581 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
583 GetBitContext *gb = &v->s.gb;
585 int imode, x, y, code, offset;
586 uint8_t invert, *planep = data;
587 int width, height, stride;
589 width = v->s.mb_width;
590 height = v->s.mb_height;
591 stride = v->s.mb_stride;
592 invert = get_bits(gb, 1);
593 imode = get_vlc2(gb, vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
599 //Data is actually read in the MB layer (same for all tests == "raw")
600 *raw_flag = 1; //invert ignored
604 if ((height * width) & 1)
606 *planep++ = get_bits(gb, 1);
610 // decode bitplane as one long line
611 for (y = offset; y < height * width; y += 2) {
612 code = get_vlc2(gb, vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
613 *planep++ = code & 1;
615 if(offset == width) {
617 planep += stride - width;
619 *planep++ = code >> 1;
621 if(offset == width) {
623 planep += stride - width;
629 if(!(height % 3) && (width % 3)) { // use 2x3 decoding
630 for(y = 0; y < height; y+= 3) {
631 for(x = width & 1; x < width; x += 2) {
632 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
634 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
637 planep[x + 0] = (code >> 0) & 1;
638 planep[x + 1] = (code >> 1) & 1;
639 planep[x + 0 + stride] = (code >> 2) & 1;
640 planep[x + 1 + stride] = (code >> 3) & 1;
641 planep[x + 0 + stride * 2] = (code >> 4) & 1;
642 planep[x + 1 + stride * 2] = (code >> 5) & 1;
644 planep += stride * 3;
646 if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb);
648 planep += (height & 1) * stride;
649 for(y = height & 1; y < height; y += 2) {
650 for(x = width % 3; x < width; x += 3) {
651 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
653 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
656 planep[x + 0] = (code >> 0) & 1;
657 planep[x + 1] = (code >> 1) & 1;
658 planep[x + 2] = (code >> 2) & 1;
659 planep[x + 0 + stride] = (code >> 3) & 1;
660 planep[x + 1 + stride] = (code >> 4) & 1;
661 planep[x + 2 + stride] = (code >> 5) & 1;
663 planep += stride * 2;
666 if(x) decode_colskip(data , x, height , stride, &v->s.gb);
667 if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb);
671 decode_rowskip(data, width, height, stride, &v->s.gb);
674 decode_colskip(data, width, height, stride, &v->s.gb);
679 /* Applying diff operator */
680 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
684 for (x=1; x<width; x++)
685 planep[x] ^= planep[x-1];
686 for (y=1; y<height; y++)
689 planep[0] ^= planep[-stride];
690 for (x=1; x<width; x++)
692 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
693 else planep[x] ^= planep[x-1];
700 for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride
702 return (imode<<1) + invert;
705 /** @} */ //Bitplane group
707 /***********************************************************************/
708 /** VOP Dquant decoding
709 * @param v VC-1 Context
711 static int vop_dquant_decoding(VC1Context *v)
713 GetBitContext *gb = &v->s.gb;
719 pqdiff = get_bits(gb, 3);
720 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
721 else v->altpq = v->pq + pqdiff + 1;
725 v->dquantfrm = get_bits(gb, 1);
728 v->dqprofile = get_bits(gb, 2);
729 switch (v->dqprofile)
731 case DQPROFILE_SINGLE_EDGE:
732 case DQPROFILE_DOUBLE_EDGES:
733 v->dqsbedge = get_bits(gb, 2);
735 case DQPROFILE_ALL_MBS:
736 v->dqbilevel = get_bits(gb, 1);
737 default: break; //Forbidden ?
739 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
741 pqdiff = get_bits(gb, 3);
742 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
743 else v->altpq = v->pq + pqdiff + 1;
750 /** Put block onto picture
752 static void vc1_put_block(VC1Context *v, DCTELEM block[6][64])
756 DSPContext *dsp = &v->s.dsp;
760 for(k = 0; k < 6; k++)
761 for(j = 0; j < 8; j++)
762 for(i = 0; i < 8; i++)
763 block[k][i + j*8] = ((block[k][i + j*8] - 128) << 1) + 128;
766 ys = v->s.current_picture.linesize[0];
767 us = v->s.current_picture.linesize[1];
768 vs = v->s.current_picture.linesize[2];
771 dsp->put_pixels_clamped(block[0], Y, ys);
772 dsp->put_pixels_clamped(block[1], Y + 8, ys);
774 dsp->put_pixels_clamped(block[2], Y, ys);
775 dsp->put_pixels_clamped(block[3], Y + 8, ys);
777 if(!(v->s.flags & CODEC_FLAG_GRAY)) {
778 dsp->put_pixels_clamped(block[4], v->s.dest[1], us);
779 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs);
783 /** Do motion compensation over 1 macroblock
784 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
786 static void vc1_mc_1mv(VC1Context *v, int dir)
788 MpegEncContext *s = &v->s;
789 DSPContext *dsp = &v->s.dsp;
790 uint8_t *srcY, *srcU, *srcV;
791 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
793 if(!v->s.last_picture.data[0])return;
795 mx = s->mv[dir][0][0];
796 my = s->mv[dir][0][1];
798 // store motion vectors for further use in B frames
799 if(s->pict_type == P_TYPE) {
800 s->current_picture.motion_val[1][s->block_index[0]][0] = mx;
801 s->current_picture.motion_val[1][s->block_index[0]][1] = my;
803 uvmx = (mx + ((mx & 3) == 3)) >> 1;
804 uvmy = (my + ((my & 3) == 3)) >> 1;
806 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
807 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
810 srcY = s->last_picture.data[0];
811 srcU = s->last_picture.data[1];
812 srcV = s->last_picture.data[2];
814 srcY = s->next_picture.data[0];
815 srcU = s->next_picture.data[1];
816 srcV = s->next_picture.data[2];
819 src_x = s->mb_x * 16 + (mx >> 2);
820 src_y = s->mb_y * 16 + (my >> 2);
821 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
822 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
824 src_x = clip( src_x, -16, s->mb_width * 16);
825 src_y = clip( src_y, -16, s->mb_height * 16);
826 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8);
827 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
829 srcY += src_y * s->linesize + src_x;
830 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
831 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
833 /* for grayscale we should not try to read from unknown area */
834 if(s->flags & CODEC_FLAG_GRAY) {
835 srcU = s->edge_emu_buffer + 18 * s->linesize;
836 srcV = s->edge_emu_buffer + 18 * s->linesize;
839 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
840 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
841 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
842 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
844 srcY -= s->mspel * (1 + s->linesize);
845 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
846 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
847 srcY = s->edge_emu_buffer;
848 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
849 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
850 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
851 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
854 /* if we deal with range reduction we need to scale source blocks */
860 for(j = 0; j < 17 + s->mspel*2; j++) {
861 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
864 src = srcU; src2 = srcV;
865 for(j = 0; j < 9; j++) {
866 for(i = 0; i < 9; i++) {
867 src[i] = ((src[i] - 128) >> 1) + 128;
868 src2[i] = ((src2[i] - 128) >> 1) + 128;
870 src += s->uvlinesize;
871 src2 += s->uvlinesize;
874 /* if we deal with intensity compensation we need to scale source blocks */
875 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
880 for(j = 0; j < 17 + s->mspel*2; j++) {
881 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
884 src = srcU; src2 = srcV;
885 for(j = 0; j < 9; j++) {
886 for(i = 0; i < 9; i++) {
887 src[i] = v->lutuv[src[i]];
888 src2[i] = v->lutuv[src2[i]];
890 src += s->uvlinesize;
891 src2 += s->uvlinesize;
894 srcY += s->mspel * (1 + s->linesize);
898 dxy = ((my & 3) << 2) | (mx & 3);
899 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
900 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
901 srcY += s->linesize * 8;
902 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
903 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
904 } else { // hpel mc - always used for luma
905 dxy = (my & 2) | ((mx & 2) >> 1);
908 dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
910 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
913 if(s->flags & CODEC_FLAG_GRAY) return;
914 /* Chroma MC always uses qpel bilinear */
915 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
919 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
920 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
922 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
923 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
927 /** Do motion compensation for 4-MV macroblock - luminance block
929 static void vc1_mc_4mv_luma(VC1Context *v, int n)
931 MpegEncContext *s = &v->s;
932 DSPContext *dsp = &v->s.dsp;
934 int dxy, mx, my, src_x, src_y;
937 if(!v->s.last_picture.data[0])return;
940 srcY = s->last_picture.data[0];
942 off = s->linesize * 4 * (n&2) + (n&1) * 8;
944 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
945 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
947 src_x = clip( src_x, -16, s->mb_width * 16);
948 src_y = clip( src_y, -16, s->mb_height * 16);
950 srcY += src_y * s->linesize + src_x;
952 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
953 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
954 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){
955 srcY -= s->mspel * (1 + s->linesize);
956 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2,
957 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
958 srcY = s->edge_emu_buffer;
959 /* if we deal with range reduction we need to scale source blocks */
965 for(j = 0; j < 9 + s->mspel*2; j++) {
966 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
970 /* if we deal with intensity compensation we need to scale source blocks */
971 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
976 for(j = 0; j < 9 + s->mspel*2; j++) {
977 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]];
981 srcY += s->mspel * (1 + s->linesize);
985 dxy = ((my & 3) << 2) | (mx & 3);
986 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
987 } else { // hpel mc - always used for luma
988 dxy = (my & 2) | ((mx & 2) >> 1);
990 dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
992 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
996 static inline int median4(int a, int b, int c, int d)
999 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
1000 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
1002 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
1003 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
1008 /** Do motion compensation for 4-MV macroblock - both chroma blocks
1010 static void vc1_mc_4mv_chroma(VC1Context *v)
1012 MpegEncContext *s = &v->s;
1013 DSPContext *dsp = &v->s.dsp;
1014 uint8_t *srcU, *srcV;
1015 int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y;
1016 int i, idx, tx = 0, ty = 0;
1017 int mvx[4], mvy[4], intra[4];
1018 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
1020 if(!v->s.last_picture.data[0])return;
1021 if(s->flags & CODEC_FLAG_GRAY) return;
1023 for(i = 0; i < 4; i++) {
1024 mvx[i] = s->mv[0][i][0];
1025 mvy[i] = s->mv[0][i][1];
1026 intra[i] = v->mb_type[0][s->block_index[i]];
1029 /* calculate chroma MV vector from four luma MVs */
1030 idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0];
1031 if(!idx) { // all blocks are inter
1032 tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
1033 ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
1034 } else if(count[idx] == 1) { // 3 inter blocks
1037 tx = mid_pred(mvx[1], mvx[2], mvx[3]);
1038 ty = mid_pred(mvy[1], mvy[2], mvy[3]);
1041 tx = mid_pred(mvx[0], mvx[2], mvx[3]);
1042 ty = mid_pred(mvy[0], mvy[2], mvy[3]);
1045 tx = mid_pred(mvx[0], mvx[1], mvx[3]);
1046 ty = mid_pred(mvy[0], mvy[1], mvy[3]);
1049 tx = mid_pred(mvx[0], mvx[1], mvx[2]);
1050 ty = mid_pred(mvy[0], mvy[1], mvy[2]);
1053 } else if(count[idx] == 2) {
1055 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
1056 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
1057 tx = (mvx[t1] + mvx[t2]) / 2;
1058 ty = (mvy[t1] + mvy[t2]) / 2;
1060 return; //no need to do MC for inter blocks
1062 s->current_picture.motion_val[1][s->block_index[0]][0] = tx;
1063 s->current_picture.motion_val[1][s->block_index[0]][1] = ty;
1064 uvmx = (tx + ((tx&3) == 3)) >> 1;
1065 uvmy = (ty + ((ty&3) == 3)) >> 1;
1067 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
1068 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
1071 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
1072 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
1074 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8);
1075 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
1076 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
1077 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
1078 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1079 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
1080 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){
1081 ff_emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1,
1082 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1083 ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
1084 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1085 srcU = s->edge_emu_buffer;
1086 srcV = s->edge_emu_buffer + 16;
1088 /* if we deal with range reduction we need to scale source blocks */
1089 if(v->rangeredfrm) {
1091 uint8_t *src, *src2;
1093 src = srcU; src2 = srcV;
1094 for(j = 0; j < 9; j++) {
1095 for(i = 0; i < 9; i++) {
1096 src[i] = ((src[i] - 128) >> 1) + 128;
1097 src2[i] = ((src2[i] - 128) >> 1) + 128;
1099 src += s->uvlinesize;
1100 src2 += s->uvlinesize;
1103 /* if we deal with intensity compensation we need to scale source blocks */
1104 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1106 uint8_t *src, *src2;
1108 src = srcU; src2 = srcV;
1109 for(j = 0; j < 9; j++) {
1110 for(i = 0; i < 9; i++) {
1111 src[i] = v->lutuv[src[i]];
1112 src2[i] = v->lutuv[src2[i]];
1114 src += s->uvlinesize;
1115 src2 += s->uvlinesize;
1120 /* Chroma MC always uses qpel bilinear */
1121 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
1125 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
1126 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
1128 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
1129 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
1133 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
1136 * Decode Simple/Main Profiles sequence header
1137 * @see Figure 7-8, p16-17
1138 * @param avctx Codec context
1139 * @param gb GetBit context initialized from Codec context extra_data
1142 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
1144 VC1Context *v = avctx->priv_data;
1146 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32));
1147 v->profile = get_bits(gb, 2);
1148 if (v->profile == 2)
1150 av_log(avctx, AV_LOG_ERROR, "Profile value 2 is forbidden (and WMV3 Complex Profile is unsupported)\n");
1154 if (v->profile == PROFILE_ADVANCED)
1156 return decode_sequence_header_adv(v, gb);
1160 v->res_sm = get_bits(gb, 2); //reserved
1163 av_log(avctx, AV_LOG_ERROR,
1164 "Reserved RES_SM=%i is forbidden\n", v->res_sm);
1170 v->frmrtq_postproc = get_bits(gb, 3); //common
1171 // (bitrate-32kbps)/64kbps
1172 v->bitrtq_postproc = get_bits(gb, 5); //common
1173 v->s.loop_filter = get_bits(gb, 1); //common
1174 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE)
1176 av_log(avctx, AV_LOG_ERROR,
1177 "LOOPFILTER shell not be enabled in simple profile\n");
1180 v->res_x8 = get_bits(gb, 1); //reserved
1183 av_log(avctx, AV_LOG_ERROR,
1184 "1 for reserved RES_X8 is forbidden\n");
1187 v->multires = get_bits(gb, 1);
1188 v->res_fasttx = get_bits(gb, 1);
1191 av_log(avctx, AV_LOG_ERROR,
1192 "0 for reserved RES_FASTTX is forbidden\n");
1196 v->fastuvmc = get_bits(gb, 1); //common
1197 if (!v->profile && !v->fastuvmc)
1199 av_log(avctx, AV_LOG_ERROR,
1200 "FASTUVMC unavailable in Simple Profile\n");
1203 v->extended_mv = get_bits(gb, 1); //common
1204 if (!v->profile && v->extended_mv)
1206 av_log(avctx, AV_LOG_ERROR,
1207 "Extended MVs unavailable in Simple Profile\n");
1210 v->dquant = get_bits(gb, 2); //common
1211 v->vstransform = get_bits(gb, 1); //common
1213 v->res_transtab = get_bits(gb, 1);
1214 if (v->res_transtab)
1216 av_log(avctx, AV_LOG_ERROR,
1217 "1 for reserved RES_TRANSTAB is forbidden\n");
1221 v->overlap = get_bits(gb, 1); //common
1223 v->s.resync_marker = get_bits(gb, 1);
1224 v->rangered = get_bits(gb, 1);
1225 if (v->rangered && v->profile == PROFILE_SIMPLE)
1227 av_log(avctx, AV_LOG_INFO,
1228 "RANGERED should be set to 0 in simple profile\n");
1231 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
1232 v->quantizer_mode = get_bits(gb, 2); //common
1234 v->finterpflag = get_bits(gb, 1); //common
1235 v->res_rtm_flag = get_bits(gb, 1); //reserved
1236 if (!v->res_rtm_flag)
1238 // av_log(avctx, AV_LOG_ERROR,
1239 // "0 for reserved RES_RTM_FLAG is forbidden\n");
1240 av_log(avctx, AV_LOG_ERROR,
1241 "Old WMV3 version detected, only I-frames will be decoded\n");
1244 av_log(avctx, AV_LOG_DEBUG,
1245 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1246 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
1247 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
1248 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
1249 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
1250 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
1251 v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
1252 v->dquant, v->quantizer_mode, avctx->max_b_frames
1257 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
1259 v->res_rtm_flag = 1;
1260 v->level = get_bits(gb, 3);
1263 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
1265 v->chromaformat = get_bits(gb, 2);
1266 if (v->chromaformat != 1)
1268 av_log(v->s.avctx, AV_LOG_ERROR,
1269 "Only 4:2:0 chroma format supported\n");
1274 v->frmrtq_postproc = get_bits(gb, 3); //common
1275 // (bitrate-32kbps)/64kbps
1276 v->bitrtq_postproc = get_bits(gb, 5); //common
1277 v->postprocflag = get_bits(gb, 1); //common
1279 v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1;
1280 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
1281 v->s.avctx->width = v->s.avctx->coded_width;
1282 v->s.avctx->height = v->s.avctx->coded_height;
1283 v->broadcast = get_bits1(gb);
1284 v->interlace = get_bits1(gb);
1286 av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced mode not supported (yet)\n");
1289 v->tfcntrflag = get_bits1(gb);
1290 v->finterpflag = get_bits1(gb);
1291 get_bits1(gb); // reserved
1293 av_log(v->s.avctx, AV_LOG_DEBUG,
1294 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1295 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
1296 "TFCTRflag=%i, FINTERPflag=%i\n",
1297 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
1298 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
1299 v->tfcntrflag, v->finterpflag
1302 v->psf = get_bits1(gb);
1303 if(v->psf) { //PsF, 6.1.13
1304 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
1307 v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
1308 if(get_bits1(gb)) { //Display Info - decoding is not affected by it
1310 av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
1311 v->s.avctx->width = v->s.width = w = get_bits(gb, 14) + 1;
1312 v->s.avctx->height = v->s.height = h = get_bits(gb, 14) + 1;
1313 av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
1315 ar = get_bits(gb, 4);
1317 v->s.avctx->sample_aspect_ratio = vc1_pixel_aspect[ar];
1319 w = get_bits(gb, 8);
1320 h = get_bits(gb, 8);
1321 v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
1324 if(get_bits1(gb)){ //framerate stuff
1326 v->s.avctx->time_base.num = 32;
1327 v->s.avctx->time_base.den = get_bits(gb, 16) + 1;
1330 nr = get_bits(gb, 8);
1331 dr = get_bits(gb, 4);
1332 if(nr && nr < 8 && dr && dr < 3){
1333 v->s.avctx->time_base.num = fps_dr[dr - 1];
1334 v->s.avctx->time_base.den = fps_nr[nr - 1] * 1000;
1340 v->color_prim = get_bits(gb, 8);
1341 v->transfer_char = get_bits(gb, 8);
1342 v->matrix_coef = get_bits(gb, 8);
1346 v->hrd_param_flag = get_bits1(gb);
1347 if(v->hrd_param_flag) {
1349 v->hrd_num_leaky_buckets = get_bits(gb, 5);
1350 get_bits(gb, 4); //bitrate exponent
1351 get_bits(gb, 4); //buffer size exponent
1352 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
1353 get_bits(gb, 16); //hrd_rate[n]
1354 get_bits(gb, 16); //hrd_buffer[n]
1360 static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb)
1362 VC1Context *v = avctx->priv_data;
1363 int i, blink, clentry, refdist;
1365 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
1366 blink = get_bits1(gb); // broken link
1367 clentry = get_bits1(gb); // closed entry
1368 v->panscanflag = get_bits1(gb);
1369 refdist = get_bits1(gb); // refdist flag
1370 v->s.loop_filter = get_bits1(gb);
1371 v->fastuvmc = get_bits1(gb);
1372 v->extended_mv = get_bits1(gb);
1373 v->dquant = get_bits(gb, 2);
1374 v->vstransform = get_bits1(gb);
1375 v->overlap = get_bits1(gb);
1376 v->quantizer_mode = get_bits(gb, 2);
1378 if(v->hrd_param_flag){
1379 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
1380 get_bits(gb, 8); //hrd_full[n]
1385 avctx->coded_width = (get_bits(gb, 12)+1)<<1;
1386 avctx->coded_height = (get_bits(gb, 12)+1)<<1;
1389 v->extended_dmv = get_bits1(gb);
1391 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
1392 skip_bits(gb, 3); // Y range, ignored for now
1395 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
1396 skip_bits(gb, 3); // UV range, ignored for now
1399 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
1400 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
1401 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
1402 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
1403 blink, clentry, v->panscanflag, refdist, v->s.loop_filter,
1404 v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
1409 static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
1411 int pqindex, lowquant, status;
1413 if(v->finterpflag) v->interpfrm = get_bits(gb, 1);
1414 skip_bits(gb, 2); //framecnt unused
1416 if (v->rangered) v->rangeredfrm = get_bits(gb, 1);
1417 v->s.pict_type = get_bits(gb, 1);
1418 if (v->s.avctx->max_b_frames) {
1419 if (!v->s.pict_type) {
1420 if (get_bits(gb, 1)) v->s.pict_type = I_TYPE;
1421 else v->s.pict_type = B_TYPE;
1422 } else v->s.pict_type = P_TYPE;
1423 } else v->s.pict_type = v->s.pict_type ? P_TYPE : I_TYPE;
1426 if(v->s.pict_type == B_TYPE) {
1427 v->bfraction = get_vlc2(gb, vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
1428 v->bfraction = vc1_bfraction_lut[v->bfraction];
1429 if(v->bfraction == 0) {
1430 v->s.pict_type = BI_TYPE;
1433 if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1434 get_bits(gb, 7); // skip buffer fullness
1437 if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1439 if(v->s.pict_type == P_TYPE)
1442 /* Quantizer stuff */
1443 pqindex = get_bits(gb, 5);
1444 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1445 v->pq = pquant_table[0][pqindex];
1447 v->pq = pquant_table[1][pqindex];
1450 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1451 v->pquantizer = pqindex < 9;
1452 if (v->quantizer_mode == QUANT_NON_UNIFORM)
1454 v->pqindex = pqindex;
1455 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
1457 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1458 v->pquantizer = get_bits(gb, 1);
1460 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3);
1461 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1462 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1463 v->range_x = 1 << (v->k_x - 1);
1464 v->range_y = 1 << (v->k_y - 1);
1465 if (v->profile == PROFILE_ADVANCED)
1467 if (v->postprocflag) v->postproc = get_bits(gb, 1);
1470 if (v->multires && v->s.pict_type != B_TYPE) v->respic = get_bits(gb, 2);
1472 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
1473 // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
1475 if(v->s.pict_type == I_TYPE || v->s.pict_type == P_TYPE) v->use_ic = 0;
1477 switch(v->s.pict_type) {
1479 if (v->pq < 5) v->tt_index = 0;
1480 else if(v->pq < 13) v->tt_index = 1;
1481 else v->tt_index = 2;
1483 lowquant = (v->pq > 12) ? 0 : 1;
1484 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
1485 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1487 int scale, shift, i;
1488 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)];
1489 v->lumscale = get_bits(gb, 6);
1490 v->lumshift = get_bits(gb, 6);
1492 /* fill lookup tables for intensity compensation */
1495 shift = (255 - v->lumshift * 2) << 6;
1496 if(v->lumshift > 31)
1499 scale = v->lumscale + 32;
1500 if(v->lumshift > 31)
1501 shift = (v->lumshift - 64) << 6;
1503 shift = v->lumshift << 6;
1505 for(i = 0; i < 256; i++) {
1506 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6);
1507 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1510 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1511 v->s.quarter_sample = 0;
1512 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1513 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
1514 v->s.quarter_sample = 0;
1516 v->s.quarter_sample = 1;
1518 v->s.quarter_sample = 1;
1519 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));
1521 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1522 v->mv_mode2 == MV_PMODE_MIXED_MV)
1523 || v->mv_mode == MV_PMODE_MIXED_MV)
1525 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1526 if (status < 0) return -1;
1527 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1528 "Imode: %i, Invert: %i\n", status>>1, status&1);
1530 v->mv_type_is_raw = 0;
1531 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1533 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1534 if (status < 0) return -1;
1535 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1536 "Imode: %i, Invert: %i\n", status>>1, status&1);
1538 /* Hopefully this is correct for P frames */
1539 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables
1540 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1544 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1545 vop_dquant_decoding(v);
1548 v->ttfrm = 0; //FIXME Is that so ?
1551 v->ttmbf = get_bits(gb, 1);
1554 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1562 if (v->pq < 5) v->tt_index = 0;
1563 else if(v->pq < 13) v->tt_index = 1;
1564 else v->tt_index = 2;
1566 lowquant = (v->pq > 12) ? 0 : 1;
1567 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
1568 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1569 v->s.mspel = v->s.quarter_sample;
1571 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1572 if (status < 0) return -1;
1573 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1574 "Imode: %i, Invert: %i\n", status>>1, status&1);
1575 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1576 if (status < 0) return -1;
1577 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1578 "Imode: %i, Invert: %i\n", status>>1, status&1);
1580 v->s.mv_table_index = get_bits(gb, 2);
1581 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1585 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1586 vop_dquant_decoding(v);
1592 v->ttmbf = get_bits(gb, 1);
1595 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1605 v->c_ac_table_index = decode012(gb);
1606 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1608 v->y_ac_table_index = decode012(gb);
1611 v->s.dc_table_index = get_bits(gb, 1);
1613 if(v->s.pict_type == BI_TYPE) {
1614 v->s.pict_type = B_TYPE;
1620 static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
1622 int pqindex, lowquant;
1625 v->p_frame_skipped = 0;
1628 v->fcm = decode012(gb);
1629 switch(get_prefix(gb, 0, 4)) {
1631 v->s.pict_type = P_TYPE;
1634 v->s.pict_type = B_TYPE;
1637 v->s.pict_type = I_TYPE;
1640 v->s.pict_type = BI_TYPE;
1643 v->s.pict_type = P_TYPE; // skipped pic
1644 v->p_frame_skipped = 1;
1650 if(!v->interlace || v->psf) {
1651 v->rptfrm = get_bits(gb, 2);
1653 v->tff = get_bits1(gb);
1654 v->rptfrm = get_bits1(gb);
1657 if(v->panscanflag) {
1660 v->rnd = get_bits1(gb);
1662 v->uvsamp = get_bits1(gb);
1663 if(v->finterpflag) v->interpfrm = get_bits(gb, 1);
1664 if(v->s.pict_type == B_TYPE) {
1665 v->bfraction = get_vlc2(gb, vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
1666 v->bfraction = vc1_bfraction_lut[v->bfraction];
1667 if(v->bfraction == 0) {
1668 v->s.pict_type = BI_TYPE; /* XXX: should not happen here */
1671 pqindex = get_bits(gb, 5);
1672 v->pqindex = pqindex;
1673 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1674 v->pq = pquant_table[0][pqindex];
1676 v->pq = pquant_table[1][pqindex];
1679 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1680 v->pquantizer = pqindex < 9;
1681 if (v->quantizer_mode == QUANT_NON_UNIFORM)
1683 v->pqindex = pqindex;
1684 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
1686 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1687 v->pquantizer = get_bits(gb, 1);
1689 switch(v->s.pict_type) {
1692 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
1693 if (status < 0) return -1;
1694 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
1695 "Imode: %i, Invert: %i\n", status>>1, status&1);
1696 v->condover = CONDOVER_NONE;
1697 if(v->overlap && v->pq <= 8) {
1698 v->condover = decode012(gb);
1699 if(v->condover == CONDOVER_SELECT) {
1700 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
1701 if (status < 0) return -1;
1702 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
1703 "Imode: %i, Invert: %i\n", status>>1, status&1);
1709 v->postproc = get_bits1(gb);
1710 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3);
1711 else v->mvrange = 0;
1712 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1713 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1714 v->range_x = 1 << (v->k_x - 1);
1715 v->range_y = 1 << (v->k_y - 1);
1717 if (v->pq < 5) v->tt_index = 0;
1718 else if(v->pq < 13) v->tt_index = 1;
1719 else v->tt_index = 2;
1721 lowquant = (v->pq > 12) ? 0 : 1;
1722 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
1723 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1725 int scale, shift, i;
1726 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)];
1727 v->lumscale = get_bits(gb, 6);
1728 v->lumshift = get_bits(gb, 6);
1729 /* fill lookup tables for intensity compensation */
1732 shift = (255 - v->lumshift * 2) << 6;
1733 if(v->lumshift > 31)
1736 scale = v->lumscale + 32;
1737 if(v->lumshift > 31)
1738 shift = (v->lumshift - 64) << 6;
1740 shift = v->lumshift << 6;
1742 for(i = 0; i < 256; i++) {
1743 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6);
1744 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1747 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1748 v->s.quarter_sample = 0;
1749 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1750 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
1751 v->s.quarter_sample = 0;
1753 v->s.quarter_sample = 1;
1755 v->s.quarter_sample = 1;
1756 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));
1758 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1759 v->mv_mode2 == MV_PMODE_MIXED_MV)
1760 || v->mv_mode == MV_PMODE_MIXED_MV)
1762 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1763 if (status < 0) return -1;
1764 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1765 "Imode: %i, Invert: %i\n", status>>1, status&1);
1767 v->mv_type_is_raw = 0;
1768 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1770 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1771 if (status < 0) return -1;
1772 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1773 "Imode: %i, Invert: %i\n", status>>1, status&1);
1775 /* Hopefully this is correct for P frames */
1776 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables
1777 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1780 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1781 vop_dquant_decoding(v);
1784 v->ttfrm = 0; //FIXME Is that so ?
1787 v->ttmbf = get_bits(gb, 1);
1790 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1799 v->postproc = get_bits1(gb);
1800 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3);
1801 else v->mvrange = 0;
1802 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1803 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1804 v->range_x = 1 << (v->k_x - 1);
1805 v->range_y = 1 << (v->k_y - 1);
1807 if (v->pq < 5) v->tt_index = 0;
1808 else if(v->pq < 13) v->tt_index = 1;
1809 else v->tt_index = 2;
1811 lowquant = (v->pq > 12) ? 0 : 1;
1812 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
1813 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1814 v->s.mspel = v->s.quarter_sample;
1816 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1817 if (status < 0) return -1;
1818 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1819 "Imode: %i, Invert: %i\n", status>>1, status&1);
1820 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1821 if (status < 0) return -1;
1822 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1823 "Imode: %i, Invert: %i\n", status>>1, status&1);
1825 v->s.mv_table_index = get_bits(gb, 2);
1826 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1830 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1831 vop_dquant_decoding(v);
1837 v->ttmbf = get_bits(gb, 1);
1840 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1850 v->c_ac_table_index = decode012(gb);
1851 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1853 v->y_ac_table_index = decode012(gb);
1856 v->s.dc_table_index = get_bits(gb, 1);
1857 if ((v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) && v->dquant) {
1858 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1859 vop_dquant_decoding(v);
1863 if(v->s.pict_type == BI_TYPE) {
1864 v->s.pict_type = B_TYPE;
1870 /***********************************************************************/
1872 * @defgroup block VC-1 Block-level functions
1873 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1879 * @brief Get macroblock-level quantizer scale
1881 #define GET_MQUANT() \
1885 if (v->dqprofile == DQPROFILE_ALL_MBS) \
1889 mquant = (get_bits(gb, 1)) ? v->altpq : v->pq; \
1893 mqdiff = get_bits(gb, 3); \
1894 if (mqdiff != 7) mquant = v->pq + mqdiff; \
1895 else mquant = get_bits(gb, 5); \
1898 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
1899 edges = 1 << v->dqsbedge; \
1900 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
1901 edges = (3 << v->dqsbedge) % 15; \
1902 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
1904 if((edges&1) && !s->mb_x) \
1905 mquant = v->altpq; \
1906 if((edges&2) && s->first_slice_line) \
1907 mquant = v->altpq; \
1908 if((edges&4) && s->mb_x == (s->mb_width - 1)) \
1909 mquant = v->altpq; \
1910 if((edges&8) && s->mb_y == (s->mb_height - 1)) \
1911 mquant = v->altpq; \
1915 * @def GET_MVDATA(_dmv_x, _dmv_y)
1916 * @brief Get MV differentials
1917 * @see MVDATA decoding from 8.3.5.2, p(1)20
1918 * @param _dmv_x Horizontal differential for decoded MV
1919 * @param _dmv_y Vertical differential for decoded MV
1921 #define GET_MVDATA(_dmv_x, _dmv_y) \
1922 index = 1 + get_vlc2(gb, vc1_mv_diff_vlc[s->mv_table_index].table,\
1923 VC1_MV_DIFF_VLC_BITS, 2); \
1926 mb_has_coeffs = 1; \
1929 else mb_has_coeffs = 0; \
1931 if (!index) { _dmv_x = _dmv_y = 0; } \
1932 else if (index == 35) \
1934 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
1935 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
1937 else if (index == 36) \
1946 if (!s->quarter_sample && index1 == 5) val = 1; \
1948 if(size_table[index1] - val > 0) \
1949 val = get_bits(gb, size_table[index1] - val); \
1951 sign = 0 - (val&1); \
1952 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1955 if (!s->quarter_sample && index1 == 5) val = 1; \
1957 if(size_table[index1] - val > 0) \
1958 val = get_bits(gb, size_table[index1] - val); \
1960 sign = 0 - (val&1); \
1961 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1964 /** Predict and set motion vector
1966 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)
1968 int xy, wrap, off = 0;
1973 /* scale MV difference to be quad-pel */
1974 dmv_x <<= 1 - s->quarter_sample;
1975 dmv_y <<= 1 - s->quarter_sample;
1977 wrap = s->b8_stride;
1978 xy = s->block_index[n];
1981 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
1982 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
1983 if(mv1) { /* duplicate motion data for 1-MV block */
1984 s->current_picture.motion_val[0][xy + 1][0] = 0;
1985 s->current_picture.motion_val[0][xy + 1][1] = 0;
1986 s->current_picture.motion_val[0][xy + wrap][0] = 0;
1987 s->current_picture.motion_val[0][xy + wrap][1] = 0;
1988 s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
1989 s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
1994 C = s->current_picture.motion_val[0][xy - 1];
1995 A = s->current_picture.motion_val[0][xy - wrap];
1997 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1999 //in 4-MV mode different blocks have different B predictor position
2002 off = (s->mb_x > 0) ? -1 : 1;
2005 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
2014 B = s->current_picture.motion_val[0][xy - wrap + off];
2016 if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds
2017 if(s->mb_width == 1) {
2021 px = mid_pred(A[0], B[0], C[0]);
2022 py = mid_pred(A[1], B[1], C[1]);
2024 } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds
2030 /* Pullback MV as specified in 8.3.5.3.4 */
2033 qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
2034 qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
2035 X = (s->mb_width << 6) - 4;
2036 Y = (s->mb_height << 6) - 4;
2038 if(qx + px < -60) px = -60 - qx;
2039 if(qy + py < -60) py = -60 - qy;
2041 if(qx + px < -28) px = -28 - qx;
2042 if(qy + py < -28) py = -28 - qy;
2044 if(qx + px > X) px = X - qx;
2045 if(qy + py > Y) py = Y - qy;
2047 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2048 if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) {
2049 if(is_intra[xy - wrap])
2050 sum = FFABS(px) + FFABS(py);
2052 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2054 if(get_bits1(&s->gb)) {
2062 if(is_intra[xy - 1])
2063 sum = FFABS(px) + FFABS(py);
2065 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2067 if(get_bits1(&s->gb)) {
2077 /* store MV using signed modulus of MV range defined in 4.11 */
2078 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
2079 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
2080 if(mv1) { /* duplicate motion data for 1-MV block */
2081 s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0];
2082 s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1];
2083 s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0];
2084 s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1];
2085 s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0];
2086 s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1];
2090 /** Motion compensation for direct or interpolated blocks in B-frames
2092 static void vc1_interp_mc(VC1Context *v)
2094 MpegEncContext *s = &v->s;
2095 DSPContext *dsp = &v->s.dsp;
2096 uint8_t *srcY, *srcU, *srcV;
2097 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
2099 if(!v->s.next_picture.data[0])return;
2101 mx = s->mv[1][0][0];
2102 my = s->mv[1][0][1];
2103 uvmx = (mx + ((mx & 3) == 3)) >> 1;
2104 uvmy = (my + ((my & 3) == 3)) >> 1;
2106 uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1));
2107 uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1));
2109 srcY = s->next_picture.data[0];
2110 srcU = s->next_picture.data[1];
2111 srcV = s->next_picture.data[2];
2113 src_x = s->mb_x * 16 + (mx >> 2);
2114 src_y = s->mb_y * 16 + (my >> 2);
2115 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
2116 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
2118 src_x = clip( src_x, -16, s->mb_width * 16);
2119 src_y = clip( src_y, -16, s->mb_height * 16);
2120 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8);
2121 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
2123 srcY += src_y * s->linesize + src_x;
2124 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
2125 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
2127 /* for grayscale we should not try to read from unknown area */
2128 if(s->flags & CODEC_FLAG_GRAY) {
2129 srcU = s->edge_emu_buffer + 18 * s->linesize;
2130 srcV = s->edge_emu_buffer + 18 * s->linesize;
2134 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16
2135 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
2136 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
2138 srcY -= s->mspel * (1 + s->linesize);
2139 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
2140 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
2141 srcY = s->edge_emu_buffer;
2142 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
2143 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
2144 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
2145 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
2148 /* if we deal with range reduction we need to scale source blocks */
2149 if(v->rangeredfrm) {
2151 uint8_t *src, *src2;
2154 for(j = 0; j < 17 + s->mspel*2; j++) {
2155 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
2158 src = srcU; src2 = srcV;
2159 for(j = 0; j < 9; j++) {
2160 for(i = 0; i < 9; i++) {
2161 src[i] = ((src[i] - 128) >> 1) + 128;
2162 src2[i] = ((src2[i] - 128) >> 1) + 128;
2164 src += s->uvlinesize;
2165 src2 += s->uvlinesize;
2168 srcY += s->mspel * (1 + s->linesize);
2173 dxy = ((my & 1) << 1) | (mx & 1);
2175 dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
2177 if(s->flags & CODEC_FLAG_GRAY) return;
2178 /* Chroma MC always uses qpel blilinear */
2179 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
2182 dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
2183 dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
2186 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
2190 #if B_FRACTION_DEN==256
2194 return 2 * ((value * n + 255) >> 9);
2195 return (value * n + 128) >> 8;
2198 n -= B_FRACTION_DEN;
2200 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
2201 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
2205 /** Reconstruct motion vector for B-frame and do motion compensation
2207 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode)
2210 v->mv_mode2 = v->mv_mode;
2211 v->mv_mode = MV_PMODE_INTENSITY_COMP;
2216 if(v->use_ic) v->mv_mode = v->mv_mode2;
2219 if(mode == BMV_TYPE_INTERPOLATED) {
2222 if(v->use_ic) v->mv_mode = v->mv_mode2;
2226 if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2;
2227 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
2228 if(v->use_ic) v->mv_mode = v->mv_mode2;
2231 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype)
2233 MpegEncContext *s = &v->s;
2234 int xy, wrap, off = 0;
2239 const uint8_t *is_intra = v->mb_type[0];
2243 /* scale MV difference to be quad-pel */
2244 dmv_x[0] <<= 1 - s->quarter_sample;
2245 dmv_y[0] <<= 1 - s->quarter_sample;
2246 dmv_x[1] <<= 1 - s->quarter_sample;
2247 dmv_y[1] <<= 1 - s->quarter_sample;
2249 wrap = s->b8_stride;
2250 xy = s->block_index[0];
2253 s->current_picture.motion_val[0][xy][0] =
2254 s->current_picture.motion_val[0][xy][1] =
2255 s->current_picture.motion_val[1][xy][0] =
2256 s->current_picture.motion_val[1][xy][1] = 0;
2259 s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
2260 s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
2261 s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
2262 s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
2264 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
2265 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
2266 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
2267 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2271 if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2272 C = s->current_picture.motion_val[0][xy - 2];
2273 A = s->current_picture.motion_val[0][xy - wrap*2];
2274 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2275 B = s->current_picture.motion_val[0][xy - wrap*2 + off];
2277 if(!s->first_slice_line) { // predictor A is not out of bounds
2278 if(s->mb_width == 1) {
2282 px = mid_pred(A[0], B[0], C[0]);
2283 py = mid_pred(A[1], B[1], C[1]);
2285 } else if(s->mb_x) { // predictor C is not out of bounds
2291 /* Pullback MV as specified in 8.3.5.3.4 */
2294 if(v->profile < PROFILE_ADVANCED) {
2295 qx = (s->mb_x << 5);
2296 qy = (s->mb_y << 5);
2297 X = (s->mb_width << 5) - 4;
2298 Y = (s->mb_height << 5) - 4;
2299 if(qx + px < -28) px = -28 - qx;
2300 if(qy + py < -28) py = -28 - qy;
2301 if(qx + px > X) px = X - qx;
2302 if(qy + py > Y) py = Y - qy;
2304 qx = (s->mb_x << 6);
2305 qy = (s->mb_y << 6);
2306 X = (s->mb_width << 6) - 4;
2307 Y = (s->mb_height << 6) - 4;
2308 if(qx + px < -60) px = -60 - qx;
2309 if(qy + py < -60) py = -60 - qy;
2310 if(qx + px > X) px = X - qx;
2311 if(qy + py > Y) py = Y - qy;
2314 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2315 if(0 && !s->first_slice_line && s->mb_x) {
2316 if(is_intra[xy - wrap])
2317 sum = FFABS(px) + FFABS(py);
2319 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2321 if(get_bits1(&s->gb)) {
2329 if(is_intra[xy - 2])
2330 sum = FFABS(px) + FFABS(py);
2332 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2334 if(get_bits1(&s->gb)) {
2344 /* store MV using signed modulus of MV range defined in 4.11 */
2345 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
2346 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
2348 if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2349 C = s->current_picture.motion_val[1][xy - 2];
2350 A = s->current_picture.motion_val[1][xy - wrap*2];
2351 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2352 B = s->current_picture.motion_val[1][xy - wrap*2 + off];
2354 if(!s->first_slice_line) { // predictor A is not out of bounds
2355 if(s->mb_width == 1) {
2359 px = mid_pred(A[0], B[0], C[0]);
2360 py = mid_pred(A[1], B[1], C[1]);
2362 } else if(s->mb_x) { // predictor C is not out of bounds
2368 /* Pullback MV as specified in 8.3.5.3.4 */
2371 if(v->profile < PROFILE_ADVANCED) {
2372 qx = (s->mb_x << 5);
2373 qy = (s->mb_y << 5);
2374 X = (s->mb_width << 5) - 4;
2375 Y = (s->mb_height << 5) - 4;
2376 if(qx + px < -28) px = -28 - qx;
2377 if(qy + py < -28) py = -28 - qy;
2378 if(qx + px > X) px = X - qx;
2379 if(qy + py > Y) py = Y - qy;
2381 qx = (s->mb_x << 6);
2382 qy = (s->mb_y << 6);
2383 X = (s->mb_width << 6) - 4;
2384 Y = (s->mb_height << 6) - 4;
2385 if(qx + px < -60) px = -60 - qx;
2386 if(qy + py < -60) py = -60 - qy;
2387 if(qx + px > X) px = X - qx;
2388 if(qy + py > Y) py = Y - qy;
2391 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2392 if(0 && !s->first_slice_line && s->mb_x) {
2393 if(is_intra[xy - wrap])
2394 sum = FFABS(px) + FFABS(py);
2396 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2398 if(get_bits1(&s->gb)) {
2406 if(is_intra[xy - 2])
2407 sum = FFABS(px) + FFABS(py);
2409 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2411 if(get_bits1(&s->gb)) {
2421 /* store MV using signed modulus of MV range defined in 4.11 */
2423 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
2424 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
2426 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
2427 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
2428 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
2429 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2432 /** Get predicted DC value for I-frames only
2433 * prediction dir: left=0, top=1
2434 * @param s MpegEncContext
2435 * @param[in] n block index in the current MB
2436 * @param dc_val_ptr Pointer to DC predictor
2437 * @param dir_ptr Prediction direction for use in AC prediction
2439 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2440 int16_t **dc_val_ptr, int *dir_ptr)
2442 int a, b, c, wrap, pred, scale;
2444 static const uint16_t dcpred[32] = {
2445 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
2446 114, 102, 93, 85, 79, 73, 68, 64,
2447 60, 57, 54, 51, 49, 47, 45, 43,
2448 41, 39, 38, 37, 35, 34, 33
2451 /* find prediction - wmv3_dc_scale always used here in fact */
2452 if (n < 4) scale = s->y_dc_scale;
2453 else scale = s->c_dc_scale;
2455 wrap = s->block_wrap[n];
2456 dc_val= s->dc_val[0] + s->block_index[n];
2462 b = dc_val[ - 1 - wrap];
2463 a = dc_val[ - wrap];
2465 if (pq < 9 || !overlap)
2467 /* Set outer values */
2468 if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
2469 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
2473 /* Set outer values */
2474 if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
2475 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
2478 if (abs(a - b) <= abs(b - c)) {
2486 /* update predictor */
2487 *dc_val_ptr = &dc_val[0];
2492 /** Get predicted DC value
2493 * prediction dir: left=0, top=1
2494 * @param s MpegEncContext
2495 * @param[in] n block index in the current MB
2496 * @param dc_val_ptr Pointer to DC predictor
2497 * @param dir_ptr Prediction direction for use in AC prediction
2499 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2500 int a_avail, int c_avail,
2501 int16_t **dc_val_ptr, int *dir_ptr)
2503 int a, b, c, wrap, pred, scale;
2505 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2508 /* find prediction - wmv3_dc_scale always used here in fact */
2509 if (n < 4) scale = s->y_dc_scale;
2510 else scale = s->c_dc_scale;
2512 wrap = s->block_wrap[n];
2513 dc_val= s->dc_val[0] + s->block_index[n];
2519 b = dc_val[ - 1 - wrap];
2520 a = dc_val[ - wrap];
2521 /* scale predictors if needed */
2522 q1 = s->current_picture.qscale_table[mb_pos];
2523 if(c_avail && (n!= 1 && n!=3)) {
2524 q2 = s->current_picture.qscale_table[mb_pos - 1];
2526 c = (c * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2528 if(a_avail && (n!= 2 && n!=3)) {
2529 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2531 a = (a * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2533 if(a_avail && c_avail && (n!=3)) {
2536 if(n != 2) off -= s->mb_stride;
2537 q2 = s->current_picture.qscale_table[off];
2539 b = (b * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2542 if(a_avail && c_avail) {
2543 if(abs(a - b) <= abs(b - c)) {
2550 } else if(a_avail) {
2553 } else if(c_avail) {
2561 /* update predictor */
2562 *dc_val_ptr = &dc_val[0];
2568 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles
2569 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2573 static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
2575 int xy, wrap, pred, a, b, c;
2577 xy = s->block_index[n];
2578 wrap = s->b8_stride;
2583 a = s->coded_block[xy - 1 ];
2584 b = s->coded_block[xy - 1 - wrap];
2585 c = s->coded_block[xy - wrap];
2594 *coded_block_ptr = &s->coded_block[xy];
2600 * Decode one AC coefficient
2601 * @param v The VC1 context
2602 * @param last Last coefficient
2603 * @param skip How much zero coefficients to skip
2604 * @param value Decoded AC coefficient value
2607 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
2609 GetBitContext *gb = &v->s.gb;
2610 int index, escape, run = 0, level = 0, lst = 0;
2612 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2613 if (index != vc1_ac_sizes[codingset] - 1) {
2614 run = vc1_index_decode_table[codingset][index][0];
2615 level = vc1_index_decode_table[codingset][index][1];
2616 lst = index >= vc1_last_decode_table[codingset];
2620 escape = decode210(gb);
2622 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2623 run = vc1_index_decode_table[codingset][index][0];
2624 level = vc1_index_decode_table[codingset][index][1];
2625 lst = index >= vc1_last_decode_table[codingset];
2628 level += vc1_last_delta_level_table[codingset][run];
2630 level += vc1_delta_level_table[codingset][run];
2633 run += vc1_last_delta_run_table[codingset][level] + 1;
2635 run += vc1_delta_run_table[codingset][level] + 1;
2641 lst = get_bits(gb, 1);
2642 if(v->s.esc3_level_length == 0) {
2643 if(v->pq < 8 || v->dquantfrm) { // table 59
2644 v->s.esc3_level_length = get_bits(gb, 3);
2645 if(!v->s.esc3_level_length)
2646 v->s.esc3_level_length = get_bits(gb, 2) + 8;
2648 v->s.esc3_level_length = get_prefix(gb, 1, 6) + 2;
2650 v->s.esc3_run_length = 3 + get_bits(gb, 2);
2652 run = get_bits(gb, v->s.esc3_run_length);
2653 sign = get_bits(gb, 1);
2654 level = get_bits(gb, v->s.esc3_level_length);
2665 /** Decode intra block in intra frames - should be faster than decode_intra_block
2666 * @param v VC1Context
2667 * @param block block to decode
2668 * @param coded are AC coeffs present or not
2669 * @param codingset set of VLC to decode data
2671 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
2673 GetBitContext *gb = &v->s.gb;
2674 MpegEncContext *s = &v->s;
2675 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2678 int16_t *ac_val, *ac_val2;
2681 /* Get DC differential */
2683 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2685 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2688 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2693 if (dcdiff == 119 /* ESC index value */)
2695 /* TODO: Optimize */
2696 if (v->pq == 1) dcdiff = get_bits(gb, 10);
2697 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
2698 else dcdiff = get_bits(gb, 8);
2703 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2704 else if (v->pq == 2)
2705 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
2707 if (get_bits(gb, 1))
2712 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2715 /* Store the quantized DC coeff, used for prediction */
2717 block[0] = dcdiff * s->y_dc_scale;
2719 block[0] = dcdiff * s->c_dc_scale;
2732 int last = 0, skip, value;
2733 const int8_t *zz_table;
2737 scale = v->pq * 2 + v->halfpq;
2741 zz_table = vc1_horizontal_zz;
2743 zz_table = vc1_vertical_zz;
2745 zz_table = vc1_normal_zz;
2747 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2749 if(dc_pred_dir) //left
2752 ac_val -= 16 * s->block_wrap[n];
2755 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2759 block[zz_table[i++]] = value;
2762 /* apply AC prediction if needed */
2764 if(dc_pred_dir) { //left
2765 for(k = 1; k < 8; k++)
2766 block[k << 3] += ac_val[k];
2768 for(k = 1; k < 8; k++)
2769 block[k] += ac_val[k + 8];
2772 /* save AC coeffs for further prediction */
2773 for(k = 1; k < 8; k++) {
2774 ac_val2[k] = block[k << 3];
2775 ac_val2[k + 8] = block[k];
2778 /* scale AC coeffs */
2779 for(k = 1; k < 64; k++)
2783 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2786 if(s->ac_pred) i = 63;
2792 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2795 scale = v->pq * 2 + v->halfpq;
2796 memset(ac_val2, 0, 16 * 2);
2797 if(dc_pred_dir) {//left
2800 memcpy(ac_val2, ac_val, 8 * 2);
2802 ac_val -= 16 * s->block_wrap[n];
2804 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2807 /* apply AC prediction if needed */
2809 if(dc_pred_dir) { //left
2810 for(k = 1; k < 8; k++) {
2811 block[k << 3] = ac_val[k] * scale;
2812 if(!v->pquantizer && block[k << 3])
2813 block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq;
2816 for(k = 1; k < 8; k++) {
2817 block[k] = ac_val[k + 8] * scale;
2818 if(!v->pquantizer && block[k])
2819 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2825 s->block_last_index[n] = i;
2830 /** Decode intra block in intra frames - should be faster than decode_intra_block
2831 * @param v VC1Context
2832 * @param block block to decode
2833 * @param coded are AC coeffs present or not
2834 * @param codingset set of VLC to decode data
2836 static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant)
2838 GetBitContext *gb = &v->s.gb;
2839 MpegEncContext *s = &v->s;
2840 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2843 int16_t *ac_val, *ac_val2;
2845 int a_avail = v->a_avail, c_avail = v->c_avail;
2846 int use_pred = s->ac_pred;
2849 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2851 /* Get DC differential */
2853 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2855 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2858 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2863 if (dcdiff == 119 /* ESC index value */)
2865 /* TODO: Optimize */
2866 if (mquant == 1) dcdiff = get_bits(gb, 10);
2867 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2868 else dcdiff = get_bits(gb, 8);
2873 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2874 else if (mquant == 2)
2875 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
2877 if (get_bits(gb, 1))
2882 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2885 /* Store the quantized DC coeff, used for prediction */
2887 block[0] = dcdiff * s->y_dc_scale;
2889 block[0] = dcdiff * s->c_dc_scale;
2898 /* check if AC is needed at all and adjust direction if needed */
2899 if(!a_avail) dc_pred_dir = 1;
2900 if(!c_avail) dc_pred_dir = 0;
2901 if(!a_avail && !c_avail) use_pred = 0;
2902 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2905 scale = mquant * 2 + v->halfpq;
2907 if(dc_pred_dir) //left
2910 ac_val -= 16 * s->block_wrap[n];
2912 q1 = s->current_picture.qscale_table[mb_pos];
2913 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
2914 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2915 if(n && n<4) q2 = q1;
2918 int last = 0, skip, value;
2919 const int8_t *zz_table;
2924 zz_table = vc1_horizontal_zz;
2926 zz_table = vc1_vertical_zz;
2928 zz_table = vc1_normal_zz;
2931 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2935 block[zz_table[i++]] = value;
2938 /* apply AC prediction if needed */
2940 /* scale predictors if needed*/
2942 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2943 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2945 if(dc_pred_dir) { //left
2946 for(k = 1; k < 8; k++)
2947 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2949 for(k = 1; k < 8; k++)
2950 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2953 if(dc_pred_dir) { //left
2954 for(k = 1; k < 8; k++)
2955 block[k << 3] += ac_val[k];
2957 for(k = 1; k < 8; k++)
2958 block[k] += ac_val[k + 8];
2962 /* save AC coeffs for further prediction */
2963 for(k = 1; k < 8; k++) {
2964 ac_val2[k] = block[k << 3];
2965 ac_val2[k + 8] = block[k];
2968 /* scale AC coeffs */
2969 for(k = 1; k < 64; k++)
2973 block[k] += (block[k] < 0) ? -mquant : mquant;
2976 if(use_pred) i = 63;
2977 } else { // no AC coeffs
2980 memset(ac_val2, 0, 16 * 2);
2981 if(dc_pred_dir) {//left
2983 memcpy(ac_val2, ac_val, 8 * 2);
2985 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2986 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2987 for(k = 1; k < 8; k++)
2988 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2993 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2995 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2996 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2997 for(k = 1; k < 8; k++)
2998 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3003 /* apply AC prediction if needed */
3005 if(dc_pred_dir) { //left
3006 for(k = 1; k < 8; k++) {
3007 block[k << 3] = ac_val2[k] * scale;
3008 if(!v->pquantizer && block[k << 3])
3009 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
3012 for(k = 1; k < 8; k++) {
3013 block[k] = ac_val2[k + 8] * scale;
3014 if(!v->pquantizer && block[k])
3015 block[k] += (block[k] < 0) ? -mquant : mquant;
3021 s->block_last_index[n] = i;
3026 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
3027 * @param v VC1Context
3028 * @param block block to decode
3029 * @param coded are AC coeffs present or not
3030 * @param mquant block quantizer
3031 * @param codingset set of VLC to decode data
3033 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
3035 GetBitContext *gb = &v->s.gb;
3036 MpegEncContext *s = &v->s;
3037 int dc_pred_dir = 0; /* Direction of the DC prediction used */
3040 int16_t *ac_val, *ac_val2;
3042 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3043 int a_avail = v->a_avail, c_avail = v->c_avail;
3044 int use_pred = s->ac_pred;
3048 /* XXX: Guard against dumb values of mquant */
3049 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
3051 /* Set DC scale - y and c use the same */
3052 s->y_dc_scale = s->y_dc_scale_table[mquant];
3053 s->c_dc_scale = s->c_dc_scale_table[mquant];
3055 /* Get DC differential */
3057 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3059 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3062 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
3067 if (dcdiff == 119 /* ESC index value */)
3069 /* TODO: Optimize */
3070 if (mquant == 1) dcdiff = get_bits(gb, 10);
3071 else if (mquant == 2) dcdiff = get_bits(gb, 9);
3072 else dcdiff = get_bits(gb, 8);
3077 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
3078 else if (mquant == 2)
3079 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
3081 if (get_bits(gb, 1))
3086 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
3089 /* Store the quantized DC coeff, used for prediction */
3092 block[0] = dcdiff * s->y_dc_scale;
3094 block[0] = dcdiff * s->c_dc_scale;
3103 /* check if AC is needed at all and adjust direction if needed */
3104 if(!a_avail) dc_pred_dir = 1;
3105 if(!c_avail) dc_pred_dir = 0;
3106 if(!a_avail && !c_avail) use_pred = 0;
3107 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
3110 scale = mquant * 2 + v->halfpq;
3112 if(dc_pred_dir) //left
3115 ac_val -= 16 * s->block_wrap[n];
3117 q1 = s->current_picture.qscale_table[mb_pos];
3118 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
3119 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
3120 if(n && n<4) q2 = q1;
3123 int last = 0, skip, value;
3124 const int8_t *zz_table;
3127 zz_table = vc1_simple_progressive_8x8_zz;
3130 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
3134 block[zz_table[i++]] = value;
3137 /* apply AC prediction if needed */
3139 /* scale predictors if needed*/
3141 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3142 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3144 if(dc_pred_dir) { //left
3145 for(k = 1; k < 8; k++)
3146 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3148 for(k = 1; k < 8; k++)
3149 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3152 if(dc_pred_dir) { //left
3153 for(k = 1; k < 8; k++)
3154 block[k << 3] += ac_val[k];
3156 for(k = 1; k < 8; k++)
3157 block[k] += ac_val[k + 8];
3161 /* save AC coeffs for further prediction */
3162 for(k = 1; k < 8; k++) {
3163 ac_val2[k] = block[k << 3];
3164 ac_val2[k + 8] = block[k];
3167 /* scale AC coeffs */
3168 for(k = 1; k < 64; k++)
3172 block[k] += (block[k] < 0) ? -mquant : mquant;
3175 if(use_pred) i = 63;
3176 } else { // no AC coeffs
3179 memset(ac_val2, 0, 16 * 2);
3180 if(dc_pred_dir) {//left
3182 memcpy(ac_val2, ac_val, 8 * 2);
3184 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3185 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3186 for(k = 1; k < 8; k++)
3187 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3192 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
3194 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3195 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3196 for(k = 1; k < 8; k++)
3197 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3202 /* apply AC prediction if needed */
3204 if(dc_pred_dir) { //left
3205 for(k = 1; k < 8; k++) {
3206 block[k << 3] = ac_val2[k] * scale;
3207 if(!v->pquantizer && block[k << 3])
3208 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
3211 for(k = 1; k < 8; k++) {
3212 block[k] = ac_val2[k + 8] * scale;
3213 if(!v->pquantizer && block[k])
3214 block[k] += (block[k] < 0) ? -mquant : mquant;
3220 s->block_last_index[n] = i;
3227 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block)
3229 MpegEncContext *s = &v->s;
3230 GetBitContext *gb = &s->gb;
3233 int scale, off, idx, last, skip, value;
3234 int ttblk = ttmb & 7;
3237 ttblk = ttblk_to_tt[v->tt_index][get_vlc2(gb, vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
3239 if(ttblk == TT_4X4) {
3240 subblkpat = ~(get_vlc2(gb, vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
3242 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) {
3243 subblkpat = decode012(gb);
3244 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
3245 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
3246 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
3248 scale = 2 * mquant + v->halfpq;
3250 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
3251 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
3252 subblkpat = 2 - (ttblk == TT_8X4_TOP);
3255 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3256 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3264 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3268 idx = vc1_simple_progressive_8x8_zz[i++];
3269 block[idx] = value * scale;
3271 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3273 s->dsp.vc1_inv_trans_8x8(block);
3276 for(j = 0; j < 4; j++) {
3277 last = subblkpat & (1 << (3 - j));
3279 off = (j & 1) * 4 + (j & 2) * 16;
3281 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3285 idx = vc1_simple_progressive_4x4_zz[i++];
3286 block[idx + off] = value * scale;
3288 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3290 if(!(subblkpat & (1 << (3 - j))))
3291 s->dsp.vc1_inv_trans_4x4(block, j);
3295 for(j = 0; j < 2; j++) {
3296 last = subblkpat & (1 << (1 - j));
3300 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3304 if(v->profile < PROFILE_ADVANCED)
3305 idx = vc1_simple_progressive_8x4_zz[i++];
3307 idx = vc1_adv_progressive_8x4_zz[i++];
3308 block[idx + off] = value * scale;
3310 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3312 if(!(subblkpat & (1 << (1 - j))))
3313 s->dsp.vc1_inv_trans_8x4(block, j);
3317 for(j = 0; j < 2; j++) {
3318 last = subblkpat & (1 << (1 - j));
3322 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3326 if(v->profile < PROFILE_ADVANCED)
3327 idx = vc1_simple_progressive_4x8_zz[i++];
3329 idx = vc1_adv_progressive_4x8_zz[i++];
3330 block[idx + off] = value * scale;
3332 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3334 if(!(subblkpat & (1 << (1 - j))))
3335 s->dsp.vc1_inv_trans_4x8(block, j);
3343 /** Decode one P-frame MB (in Simple/Main profile)
3345 static int vc1_decode_p_mb(VC1Context *v)
3347 MpegEncContext *s = &v->s;
3348 GetBitContext *gb = &s->gb;
3350 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3351 int cbp; /* cbp decoding stuff */
3352 int mqdiff, mquant; /* MB quantization */
3353 int ttmb = v->ttfrm; /* MB Transform type */
3356 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
3357 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3358 int mb_has_coeffs = 1; /* last_flag */
3359 int dmv_x, dmv_y; /* Differential MV components */
3360 int index, index1; /* LUT indices */
3361 int val, sign; /* temp values */
3362 int first_block = 1;
3364 int skipped, fourmv;
3366 mquant = v->pq; /* Loosy initialization */
3368 if (v->mv_type_is_raw)
3369 fourmv = get_bits1(gb);
3371 fourmv = v->mv_type_mb_plane[mb_pos];
3373 skipped = get_bits1(gb);
3375 skipped = v->s.mbskip_table[mb_pos];
3377 s->dsp.clear_blocks(s->block[0]);
3379 if (!fourmv) /* 1MV mode */
3383 GET_MVDATA(dmv_x, dmv_y);
3386 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3387 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3389 s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
3390 vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
3392 /* FIXME Set DC val for inter block ? */
3393 if (s->mb_intra && !mb_has_coeffs)
3396 s->ac_pred = get_bits(gb, 1);
3399 else if (mb_has_coeffs)
3401 if (s->mb_intra) s->ac_pred = get_bits(gb, 1);
3402 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3410 s->current_picture.qscale_table[mb_pos] = mquant;
3412 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3413 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table,
3414 VC1_TTMB_VLC_BITS, 2);
3415 if(!s->mb_intra) vc1_mc_1mv(v, 0);
3419 s->dc_val[0][s->block_index[i]] = 0;
3421 val = ((cbp >> (5 - i)) & 1);
3422 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3423 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3425 /* check if prediction blocks A and C are available */
3426 v->a_avail = v->c_avail = 0;
3427 if(i == 2 || i == 3 || !s->first_slice_line)
3428 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3429 if(i == 1 || i == 3 || s->mb_x)
3430 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3432 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3433 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3434 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3435 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3436 for(j = 0; j < 64; j++) s->block[i][j] += 128;
3437 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3438 if(v->pq >= 9 && v->overlap) {
3440 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3442 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3445 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
3446 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3448 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
3449 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3456 for(i = 0; i < 6; i++) {
3457 v->mb_type[0][s->block_index[i]] = 0;
3458 s->dc_val[0][s->block_index[i]] = 0;
3460 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
3461 s->current_picture.qscale_table[mb_pos] = 0;
3462 vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
3469 if (!skipped /* unskipped MB */)
3471 int intra_count = 0, coded_inter = 0;
3472 int is_intra[6], is_coded[6];
3474 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3477 val = ((cbp >> (5 - i)) & 1);
3478 s->dc_val[0][s->block_index[i]] = 0;
3485 GET_MVDATA(dmv_x, dmv_y);
3487 vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
3488 if(!s->mb_intra) vc1_mc_4mv_luma(v, i);
3489 intra_count += s->mb_intra;
3490 is_intra[i] = s->mb_intra;
3491 is_coded[i] = mb_has_coeffs;
3494 is_intra[i] = (intra_count >= 3);
3497 if(i == 4) vc1_mc_4mv_chroma(v);
3498 v->mb_type[0][s->block_index[i]] = is_intra[i];
3499 if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
3501 // if there are no coded blocks then don't do anything more
3502 if(!intra_count && !coded_inter) return 0;
3505 s->current_picture.qscale_table[mb_pos] = mquant;
3506 /* test if block is intra and has pred */
3511 if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
3512 || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
3517 if(intrapred)s->ac_pred = get_bits(gb, 1);
3518 else s->ac_pred = 0;
3520 if (!v->ttmbf && coded_inter)
3521 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3525 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3526 s->mb_intra = is_intra[i];
3528 /* check if prediction blocks A and C are available */
3529 v->a_avail = v->c_avail = 0;
3530 if(i == 2 || i == 3 || !s->first_slice_line)
3531 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3532 if(i == 1 || i == 3 || s->mb_x)
3533 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3535 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
3536 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3537 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3538 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3539 for(j = 0; j < 64; j++) s->block[i][j] += 128;
3540 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3541 if(v->pq >= 9 && v->overlap) {
3543 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3545 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3547 } else if(is_coded[i]) {
3548 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
3549 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3551 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
3552 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3560 s->current_picture.qscale_table[mb_pos] = 0;
3561 for (i=0; i<6; i++) {
3562 v->mb_type[0][s->block_index[i]] = 0;
3563 s->dc_val[0][s->block_index[i]] = 0;
3567 vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]);
3568 vc1_mc_4mv_luma(v, i);
3570 vc1_mc_4mv_chroma(v);
3571 s->current_picture.qscale_table[mb_pos] = 0;
3576 /* Should never happen */
3580 /** Decode one B-frame MB (in Main profile)
3582 static void vc1_decode_b_mb(VC1Context *v)
3584 MpegEncContext *s = &v->s;
3585 GetBitContext *gb = &s->gb;
3587 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3588 int cbp = 0; /* cbp decoding stuff */
3589 int mqdiff, mquant; /* MB quantization */
3590 int ttmb = v->ttfrm; /* MB Transform type */
3592 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
3593 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3594 int mb_has_coeffs = 0; /* last_flag */
3595 int index, index1; /* LUT indices */
3596 int val, sign; /* temp values */
3597 int first_block = 1;
3599 int skipped, direct;
3600 int dmv_x[2], dmv_y[2];
3601 int bmvtype = BMV_TYPE_BACKWARD;
3603 mquant = v->pq; /* Loosy initialization */
3607 direct = get_bits1(gb);
3609 direct = v->direct_mb_plane[mb_pos];
3611 skipped = get_bits1(gb);
3613 skipped = v->s.mbskip_table[mb_pos];
3615 s->dsp.clear_blocks(s->block[0]);
3616 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
3617 for(i = 0; i < 6; i++) {
3618 v->mb_type[0][s->block_index[i]] = 0;
3619 s->dc_val[0][s->block_index[i]] = 0;
3621 s->current_picture.qscale_table[mb_pos] = 0;
3625 GET_MVDATA(dmv_x[0], dmv_y[0]);
3626 dmv_x[1] = dmv_x[0];
3627 dmv_y[1] = dmv_y[0];
3629 if(skipped || !s->mb_intra) {
3630 bmvtype = decode012(gb);
3633 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
3636 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
3639 bmvtype = BMV_TYPE_INTERPOLATED;
3640 dmv_x[0] = dmv_y[0] = 0;
3644 for(i = 0; i < 6; i++)
3645 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3648 if(direct) bmvtype = BMV_TYPE_INTERPOLATED;
3649 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3650 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3654 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3658 s->current_picture.qscale_table[mb_pos] = mquant;
3660 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3661 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
3662 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3663 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3665 if(!mb_has_coeffs && !s->mb_intra) {
3666 /* no coded blocks - effectively skipped */
3667 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3668 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3671 if(s->mb_intra && !mb_has_coeffs) {
3673 s->current_picture.qscale_table[mb_pos] = mquant;
3674 s->ac_pred = get_bits1(gb);
3676 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3678 if(bmvtype == BMV_TYPE_INTERPOLATED) {
3679 GET_MVDATA(dmv_x[0], dmv_y[0]);
3680 if(!mb_has_coeffs) {
3681 /* interpolated skipped block */
3682 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3683 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3687 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3689 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3692 s->ac_pred = get_bits1(gb);
3693 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3695 s->current_picture.qscale_table[mb_pos] = mquant;
3696 if(!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3697 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3703 s->dc_val[0][s->block_index[i]] = 0;
3705 val = ((cbp >> (5 - i)) & 1);
3706 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3707 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3709 /* check if prediction blocks A and C are available */
3710 v->a_avail = v->c_avail = 0;
3711 if(i == 2 || i == 3 || !s->first_slice_line)
3712 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3713 if(i == 1 || i == 3 || s->mb_x)
3714 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3716 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3717 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3718 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3719 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3720 for(j = 0; j < 64; j++) s->block[i][j] += 128;
3721 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3723 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
3724 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3726 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
3727 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3732 /** Decode blocks of I-frame
3734 static void vc1_decode_i_blocks(VC1Context *v)
3737 MpegEncContext *s = &v->s;
3742 /* select codingmode used for VLC tables selection */
3743 switch(v->y_ac_table_index){
3745 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
3748 v->codingset = CS_HIGH_MOT_INTRA;
3751 v->codingset = CS_MID_RATE_INTRA;
3755 switch(v->c_ac_table_index){
3757 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
3760 v->codingset2 = CS_HIGH_MOT_INTER;
3763 v->codingset2 = CS_MID_RATE_INTER;
3767 /* Set DC scale - y and c use the same */
3768 s->y_dc_scale = s->y_dc_scale_table[v->pq];
3769 s->c_dc_scale = s->c_dc_scale_table[v->pq];
3772 s->mb_x = s->mb_y = 0;
3774 s->first_slice_line = 1;
3775 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3776 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
3777 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
3778 ff_init_block_index(s);
3779 ff_update_block_index(s);
3780 s->dsp.clear_blocks(s->block[0]);
3781 mb_pos = s->mb_x + s->mb_y * s->mb_width;
3782 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
3783 s->current_picture.qscale_table[mb_pos] = v->pq;
3784 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3785 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3787 // do actual MB decoding and displaying
3788 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
3789 v->s.ac_pred = get_bits(&v->s.gb, 1);
3791 for(k = 0; k < 6; k++) {
3792 val = ((cbp >> (5 - k)) & 1);
3795 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
3799 cbp |= val << (5 - k);
3801 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
3803 s->dsp.vc1_inv_trans_8x8(s->block[k]);
3804 if(v->pq >= 9 && v->overlap) {
3805 for(j = 0; j < 64; j++) s->block[k][j] += 128;
3809 vc1_put_block(v, s->block);
3810 if(v->pq >= 9 && v->overlap) {
3812 s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
3813 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3814 if(!(s->flags & CODEC_FLAG_GRAY)) {
3815 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
3816 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
3819 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
3820 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3821 if(!s->first_slice_line) {
3822 s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
3823 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3824 if(!(s->flags & CODEC_FLAG_GRAY)) {
3825 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
3826 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3829 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3830 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3833 if(get_bits_count(&s->gb) > v->bits) {
3834 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
3838 ff_draw_horiz_band(s, s->mb_y * 16, 16);
3839 s->first_slice_line = 0;
3843 /** Decode blocks of I-frame for advanced profile
3845 static void vc1_decode_i_blocks_adv(VC1Context *v)
3848 MpegEncContext *s = &v->s;
3855 GetBitContext *gb = &s->gb;
3857 /* select codingmode used for VLC tables selection */
3858 switch(v->y_ac_table_index){
3860 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
3863 v->codingset = CS_HIGH_MOT_INTRA;
3866 v->codingset = CS_MID_RATE_INTRA;
3870 switch(v->c_ac_table_index){
3872 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
3875 v->codingset2 = CS_HIGH_MOT_INTER;
3878 v->codingset2 = CS_MID_RATE_INTER;
3883 s->mb_x = s->mb_y = 0;
3885 s->first_slice_line = 1;
3886 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3887 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
3888 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
3889 ff_init_block_index(s);
3890 ff_update_block_index(s);
3891 s->dsp.clear_blocks(s->block[0]);
3892 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3893 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
3894 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3895 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3897 // do actual MB decoding and displaying
3898 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
3899 if(v->acpred_is_raw)
3900 v->s.ac_pred = get_bits(&v->s.gb, 1);
3902 v->s.ac_pred = v->acpred_plane[mb_pos];
3904 if(v->condover == CONDOVER_SELECT) {
3905 if(v->overflg_is_raw)
3906 overlap = get_bits(&v->s.gb, 1);
3908 overlap = v->over_flags_plane[mb_pos];
3910 overlap = (v->condover == CONDOVER_ALL);
3914 s->current_picture.qscale_table[mb_pos] = mquant;
3915 /* Set DC scale - y and c use the same */
3916 s->y_dc_scale = s->y_dc_scale_table[mquant];
3917 s->c_dc_scale = s->c_dc_scale_table[mquant];
3919 for(k = 0; k < 6; k++) {
3920 val = ((cbp >> (5 - k)) & 1);
3923 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
3927 cbp |= val << (5 - k);
3929 v->a_avail = !s->first_slice_line || (k==2 || k==3);
3930 v->c_avail = !!s->mb_x || (k==1 || k==3);
3932 vc1_decode_i_block_adv(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);
3934 s->dsp.vc1_inv_trans_8x8(s->block[k]);
3935 for(j = 0; j < 64; j++) s->block[k][j] += 128;
3938 vc1_put_block(v, s->block);
3941 s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
3942 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3943 if(!(s->flags & CODEC_FLAG_GRAY)) {
3944 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
3945 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
3948 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
3949 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3950 if(!s->first_slice_line) {
3951 s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
3952 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3953 if(!(s->flags & CODEC_FLAG_GRAY)) {
3954 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
3955 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3958 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3959 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3962 if(get_bits_count(&s->gb) > v->bits) {
3963 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
3967 ff_draw_horiz_band(s, s->mb_y * 16, 16);
3968 s->first_slice_line = 0;
3972 static void vc1_decode_p_blocks(VC1Context *v)
3974 MpegEncContext *s = &v->s;
3976 /* select codingmode used for VLC tables selection */
3977 switch(v->c_ac_table_index){
3979 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
3982 v->codingset = CS_HIGH_MOT_INTRA;
3985 v->codingset = CS_MID_RATE_INTRA;
3989 switch(v->c_ac_table_index){
3991 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
3994 v->codingset2 = CS_HIGH_MOT_INTER;
3997 v->codingset2 = CS_MID_RATE_INTER;
4001 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
4002 s->first_slice_line = 1;
4003 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
4004 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
4005 ff_init_block_index(s);
4006 ff_update_block_index(s);
4007 s->dsp.clear_blocks(s->block[0]);
4010 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4011 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);
4015 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4016 s->first_slice_line = 0;
4020 static void vc1_decode_b_blocks(VC1Context *v)
4022 MpegEncContext *s = &v->s;
4024 /* select codingmode used for VLC tables selection */
4025 switch(v->c_ac_table_index){
4027 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4030 v->codingset = CS_HIGH_MOT_INTRA;
4033 v->codingset = CS_MID_RATE_INTRA;
4037 switch(v->c_ac_table_index){
4039 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4042 v->codingset2 = CS_HIGH_MOT_INTER;
4045 v->codingset2 = CS_MID_RATE_INTER;
4049 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
4050 s->first_slice_line = 1;
4051 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
4052 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
4053 ff_init_block_index(s);
4054 ff_update_block_index(s);
4055 s->dsp.clear_blocks(s->block[0]);
4058 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4059 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);
4063 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4064 s->first_slice_line = 0;
4068 static void vc1_decode_skip_blocks(VC1Context *v)
4070 MpegEncContext *s = &v->s;
4072 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
4073 s->first_slice_line = 1;
4074 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
4076 ff_init_block_index(s);
4077 ff_update_block_index(s);
4078 memcpy(s->dest[0], s->last_picture.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
4079 memcpy(s->dest[1], s->last_picture.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4080 memcpy(s->dest[2], s->last_picture.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4081 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4082 s->first_slice_line = 0;
4084 s->pict_type = P_TYPE;
4087 static void vc1_decode_blocks(VC1Context *v)
4090 v->s.esc3_level_length = 0;
4092 switch(v->s.pict_type) {
4094 if(v->profile == PROFILE_ADVANCED)
4095 vc1_decode_i_blocks_adv(v);
4097 vc1_decode_i_blocks(v);
4100 if(v->p_frame_skipped)
4101 vc1_decode_skip_blocks(v);
4103 vc1_decode_p_blocks(v);
4107 if(v->profile == PROFILE_ADVANCED)
4108 vc1_decode_i_blocks_adv(v);
4110 vc1_decode_i_blocks(v);
4112 vc1_decode_b_blocks(v);
4117 #define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0)
4119 /** Find VC-1 marker in buffer
4120 * @return position where next marker starts or end of buffer if no marker found
4122 static av_always_inline uint8_t* find_next_marker(uint8_t *src, uint8_t *end)
4124 uint32_t mrk = 0xFFFFFFFF;
4126 if(end-src < 4) return end;
4128 mrk = (mrk << 8) | *src++;
4135 static av_always_inline int vc1_unescape_buffer(uint8_t *src, int size, uint8_t *dst)
4140 for(dsize = 0; dsize < size; dsize++) *dst++ = *src++;
4143 for(i = 0; i < size; i++, src++) {
4144 if(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) {
4145 dst[dsize++] = src[1];
4149 dst[dsize++] = *src;
4154 /** Initialize a VC1/WMV3 decoder
4155 * @todo TODO: Handle VC-1 IDUs (Transport level?)
4156 * @todo TODO: Decypher remaining bits in extra_data
4158 static int vc1_decode_init(AVCodecContext *avctx)
4160 VC1Context *v = avctx->priv_data;
4161 MpegEncContext *s = &v->s;
4164 if (!avctx->extradata_size || !avctx->extradata) return -1;
4165 if (!(avctx->flags & CODEC_FLAG_GRAY))
4166 avctx->pix_fmt = PIX_FMT_YUV420P;
4168 avctx->pix_fmt = PIX_FMT_GRAY8;
4170 avctx->flags |= CODEC_FLAG_EMU_EDGE;
4171 v->s.flags |= CODEC_FLAG_EMU_EDGE;
4173 if(ff_h263_decode_init(avctx) < 0)
4175 if (vc1_init_common(v) < 0) return -1;
4177 avctx->coded_width = avctx->width;
4178 avctx->coded_height = avctx->height;
4179 if (avctx->codec_id == CODEC_ID_WMV3)
4183 // looks like WMV3 has a sequence header stored in the extradata
4184 // advanced sequence header may be before the first frame
4185 // the last byte of the extradata is a version number, 1 for the
4186 // samples we can decode
4188 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
4190 if (decode_sequence_header(avctx, &gb) < 0)
4193 count = avctx->extradata_size*8 - get_bits_count(&gb);
4196 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
4197 count, get_bits(&gb, count));
4201 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
4203 } else { // VC1/WVC1
4204 uint8_t *start = avctx->extradata, *end = avctx->extradata + avctx->extradata_size;
4205 uint8_t *next; int size, buf2_size;
4206 uint8_t *buf2 = NULL;
4207 int seq_inited = 0, ep_inited = 0;
4209 if(avctx->extradata_size < 16) {
4210 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
4214 buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
4215 if(start[0]) start++; // in WVC1 extradata first byte is its size
4217 for(; next < end; start = next){
4218 next = find_next_marker(start + 4, end);
4219 size = next - start - 4;
4220 if(size <= 0) continue;
4221 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
4222 init_get_bits(&gb, buf2, buf2_size * 8);
4223 switch(AV_RB32(start)){
4224 case VC1_CODE_SEQHDR:
4225 if(decode_sequence_header(avctx, &gb) < 0){
4231 case VC1_CODE_ENTRYPOINT:
4232 if(decode_entry_point(avctx, &gb) < 0){
4241 if(!seq_inited || !ep_inited){
4242 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
4246 avctx->has_b_frames= !!(avctx->max_b_frames);
4247 s->low_delay = !avctx->has_b_frames;
4249 s->mb_width = (avctx->coded_width+15)>>4;
4250 s->mb_height = (avctx->coded_height+15)>>4;
4252 /* Allocate mb bitplanes */
4253 v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
4254 v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height);
4255 v->acpred_plane = av_malloc(s->mb_stride * s->mb_height);
4256 v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height);
4258 /* allocate block type info in that way so it could be used with s->block_index[] */
4259 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
4260 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
4261 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
4262 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
4264 /* Init coded blocks info */
4265 if (v->profile == PROFILE_ADVANCED)
4267 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
4269 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
4277 /** Decode a VC1/WMV3 frame
4278 * @todo TODO: Handle VC-1 IDUs (Transport level?)
4280 static int vc1_decode_frame(AVCodecContext *avctx,
4281 void *data, int *data_size,
4282 uint8_t *buf, int buf_size)
4284 VC1Context *v = avctx->priv_data;
4285 MpegEncContext *s = &v->s;
4286 AVFrame *pict = data;
4287 uint8_t *buf2 = NULL;
4289 /* no supplementary picture */
4290 if (buf_size == 0) {
4291 /* special case for last picture */
4292 if (s->low_delay==0 && s->next_picture_ptr) {
4293 *pict= *(AVFrame*)s->next_picture_ptr;
4294 s->next_picture_ptr= NULL;
4296 *data_size = sizeof(AVFrame);
4302 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
4303 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
4304 int i= ff_find_unused_picture(s, 0);
4305 s->current_picture_ptr= &s->picture[i];
4308 //for advanced profile we may need to parse and unescape data
4309 if (avctx->codec_id == CODEC_ID_VC1) {
4311 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
4313 if(IS_MARKER(AV_RB32(buf))){ /* frame starts with marker and needs to be parsed */
4314 uint8_t *dst = buf2, *start, *end, *next;
4318 for(start = buf, end = buf + buf_size; next < end; start = next){
4319 next = find_next_marker(start + 4, end);
4320 size = next - start - 4;
4321 if(size <= 0) continue;
4322 switch(AV_RB32(start)){
4323 case VC1_CODE_FRAME:
4324 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
4326 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
4327 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
4328 init_get_bits(&s->gb, buf2, buf_size2*8);
4329 decode_entry_point(avctx, &s->gb);
4331 case VC1_CODE_SLICE:
4332 av_log(avctx, AV_LOG_ERROR, "Sliced decoding is not implemented (yet)\n");
4337 }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
4340 divider = find_next_marker(buf, buf + buf_size);
4341 if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
4342 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
4346 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
4348 av_free(buf2);return -1;
4350 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
4352 init_get_bits(&s->gb, buf2, buf_size2*8);
4354 init_get_bits(&s->gb, buf, buf_size*8);
4355 // do parse frame header
4356 if(v->profile < PROFILE_ADVANCED) {
4357 if(vc1_parse_frame_header(v, &s->gb) == -1) {
4362 if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
4368 if(s->pict_type != I_TYPE && !v->res_rtm_flag){
4374 s->current_picture.pict_type= s->pict_type;
4375 s->current_picture.key_frame= s->pict_type == I_TYPE;
4377 /* skip B-frames if we don't have reference frames */
4378 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)){
4380 return -1;//buf_size;
4382 /* skip b frames if we are in a hurry */
4383 if(avctx->hurry_up && s->pict_type==B_TYPE) return -1;//buf_size;
4384 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
4385 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
4386 || avctx->skip_frame >= AVDISCARD_ALL) {
4390 /* skip everything if we are in a hurry>=5 */
4391 if(avctx->hurry_up>=5) {
4393 return -1;//buf_size;
4396 if(s->next_p_frame_damaged){
4397 if(s->pict_type==B_TYPE)
4400 s->next_p_frame_damaged=0;
4403 if(MPV_frame_start(s, avctx) < 0) {
4408 ff_er_frame_start(s);
4410 v->bits = buf_size * 8;
4411 vc1_decode_blocks(v);
4412 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
4413 // if(get_bits_count(&s->gb) > buf_size * 8)
4419 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
4420 assert(s->current_picture.pict_type == s->pict_type);
4421 if (s->pict_type == B_TYPE || s->low_delay) {
4422 *pict= *(AVFrame*)s->current_picture_ptr;
4423 } else if (s->last_picture_ptr != NULL) {
4424 *pict= *(AVFrame*)s->last_picture_ptr;
4427 if(s->last_picture_ptr || s->low_delay){
4428 *data_size = sizeof(AVFrame);
4429 ff_print_debug_info(s, pict);
4432 /* Return the Picture timestamp as the frame number */
4433 /* we substract 1 because it is added on utils.c */
4434 avctx->frame_number = s->picture_number - 1;
4441 /** Close a VC1/WMV3 decoder
4442 * @warning Initial try at using MpegEncContext stuff
4444 static int vc1_decode_end(AVCodecContext *avctx)
4446 VC1Context *v = avctx->priv_data;
4448 av_freep(&v->hrd_rate);
4449 av_freep(&v->hrd_buffer);
4450 MPV_common_end(&v->s);
4451 av_freep(&v->mv_type_mb_plane);
4452 av_freep(&v->direct_mb_plane);
4453 av_freep(&v->acpred_plane);
4454 av_freep(&v->over_flags_plane);
4455 av_freep(&v->mb_type_base);
4460 AVCodec vc1_decoder = {
4473 AVCodec wmv3_decoder = {
4486 #ifdef CONFIG_VC1_PARSER
4488 * finds the end of the current frame in the bitstream.
4489 * @return the position of the first byte of the next frame, or -1
4491 static int vc1_find_frame_end(ParseContext *pc, const uint8_t *buf,
4496 pic_found= pc->frame_start_found;
4501 for(i=0; i<buf_size; i++){
4502 state= (state<<8) | buf[i];
4503 if(state == VC1_CODE_FRAME || state == VC1_CODE_FIELD){
4512 /* EOF considered as end of frame */
4515 for(; i<buf_size; i++){
4516 state= (state<<8) | buf[i];
4517 if(IS_MARKER(state) && state != VC1_CODE_FIELD && state != VC1_CODE_SLICE){
4518 pc->frame_start_found=0;
4524 pc->frame_start_found= pic_found;
4526 return END_NOT_FOUND;
4529 static int vc1_parse(AVCodecParserContext *s,
4530 AVCodecContext *avctx,
4531 uint8_t **poutbuf, int *poutbuf_size,
4532 const uint8_t *buf, int buf_size)
4534 ParseContext *pc = s->priv_data;
4537 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
4540 next= vc1_find_frame_end(pc, buf, buf_size);
4542 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
4548 *poutbuf = (uint8_t *)buf;
4549 *poutbuf_size = buf_size;
4553 int vc1_split(AVCodecContext *avctx,
4554 const uint8_t *buf, int buf_size)
4559 for(i=0; i<buf_size; i++){
4560 state= (state<<8) | buf[i];
4561 if(IS_MARKER(state) && state != VC1_CODE_SEQHDR && state != VC1_CODE_ENTRYPOINT)
4567 AVCodecParser vc1_parser = {
4569 sizeof(ParseContext1),
4575 #endif /* CONFIG_VC1_PARSER */