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_ESCAPE = 0x00000103,
54 VC1_CODE_ENDOFSEQ = 0x0000010A,
63 /** Available Profiles */
68 PROFILE_COMPLEX, ///< TODO: WMV9 specific
73 /** Sequence quantizer mode */
76 QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level
77 QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level
78 QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames
79 QUANT_UNIFORM ///< Uniform quant used for all frames
83 /** Where quant can be changed */
87 DQPROFILE_DOUBLE_EDGES,
88 DQPROFILE_SINGLE_EDGE,
93 /** @name Where quant can be changed
100 DQSINGLE_BEDGE_BOTTOM
104 /** Which pair of edges is quantized with ALTPQUANT */
107 DQDOUBLE_BEDGE_TOPLEFT,
108 DQDOUBLE_BEDGE_TOPRIGHT,
109 DQDOUBLE_BEDGE_BOTTOMRIGHT,
110 DQDOUBLE_BEDGE_BOTTOMLEFT
114 /** MV modes for P frames */
117 MV_PMODE_1MV_HPEL_BILIN,
121 MV_PMODE_INTENSITY_COMP
125 /** @name MV types for B frames */
130 BMV_TYPE_INTERPOLATED
134 /** @name Block types for P/B frames */
136 enum TransformTypes {
140 TT_8X4, //Both halves
143 TT_4X8, //Both halves
148 /** Table for conversion between TTBLK and TTMB */
149 static const int ttblk_to_tt[3][8] = {
150 { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
151 { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
152 { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
155 static const int ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
157 /** MV P mode - the 5th element is only used for mode 1 */
158 static const uint8_t mv_pmode_table[2][5] = {
159 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
160 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
162 static const uint8_t mv_pmode_table2[2][4] = {
163 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
164 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
167 /** One more frame type */
170 static const int fps_nr[5] = { 24, 25, 30, 50, 60 },
171 fps_dr[2] = { 1000, 1001 };
172 static const uint8_t pquant_table[3][32] = {
173 { /* Implicit quantizer */
174 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12,
175 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
177 { /* Explicit quantizer, pquantizer uniform */
178 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
179 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
181 { /* Explicit quantizer, pquantizer non-uniform */
182 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
183 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
187 /** @name VC-1 VLC tables and defines
188 * @todo TODO move this into the context
191 #define VC1_BFRACTION_VLC_BITS 7
192 static VLC vc1_bfraction_vlc;
193 #define VC1_IMODE_VLC_BITS 4
194 static VLC vc1_imode_vlc;
195 #define VC1_NORM2_VLC_BITS 3
196 static VLC vc1_norm2_vlc;
197 #define VC1_NORM6_VLC_BITS 9
198 static VLC vc1_norm6_vlc;
199 /* Could be optimized, one table only needs 8 bits */
200 #define VC1_TTMB_VLC_BITS 9 //12
201 static VLC vc1_ttmb_vlc[3];
202 #define VC1_MV_DIFF_VLC_BITS 9 //15
203 static VLC vc1_mv_diff_vlc[4];
204 #define VC1_CBPCY_P_VLC_BITS 9 //14
205 static VLC vc1_cbpcy_p_vlc[4];
206 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
207 static VLC vc1_4mv_block_pattern_vlc[4];
208 #define VC1_TTBLK_VLC_BITS 5
209 static VLC vc1_ttblk_vlc[3];
210 #define VC1_SUBBLKPAT_VLC_BITS 6
211 static VLC vc1_subblkpat_vlc[3];
213 static VLC vc1_ac_coeff_table[8];
217 CS_HIGH_MOT_INTRA = 0,
227 /** @name Overlap conditions for Advanced Profile */
238 * @fixme Change size wherever another size is more efficient
239 * Many members are only used for Advanced Profile
241 typedef struct VC1Context{
246 /** Simple/Main Profile sequence header */
248 int res_sm; ///< reserved, 2b
249 int res_x8; ///< reserved
250 int multires; ///< frame-level RESPIC syntax element present
251 int res_fasttx; ///< reserved, always 1
252 int res_transtab; ///< reserved, always 0
253 int rangered; ///< RANGEREDFRM (range reduction) syntax element present
255 int res_rtm_flag; ///< reserved, set to 1
256 int reserved; ///< reserved
259 /** Advanced Profile */
261 int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer
262 int chromaformat; ///< 2bits, 2=4:2:0, only defined
263 int postprocflag; ///< Per-frame processing suggestion flag present
264 int broadcast; ///< TFF/RFF present
265 int interlace; ///< Progressive/interlaced (RPTFTM syntax element)
266 int tfcntrflag; ///< TFCNTR present
267 int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
268 int extended_dmv; ///< Additional extended dmv range at P/B frame-level
269 int color_prim; ///< 8bits, chroma coordinates of the color primaries
270 int transfer_char; ///< 8bits, Opto-electronic transfer characteristics
271 int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix
272 int hrd_param_flag; ///< Presence of Hypothetical Reference
273 ///< Decoder parameters
274 int psf; ///< Progressive Segmented Frame
277 /** Sequence header data for all Profiles
278 * TODO: choose between ints, uint8_ts and monobit flags
281 int profile; ///< 2bits, Profile
282 int frmrtq_postproc; ///< 3bits,
283 int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength
284 int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple)
285 int extended_mv; ///< Ext MV in P/B (not in Simple)
286 int dquant; ///< How qscale varies with MBs, 2bits (not in Simple)
287 int vstransform; ///< variable-size [48]x[48] transform type + info
288 int overlap; ///< overlapped transforms in use
289 int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_*
290 int finterpflag; ///< INTERPFRM present
293 /** Frame decoding info for all profiles */
295 uint8_t mv_mode; ///< MV coding monde
296 uint8_t mv_mode2; ///< Secondary MV coding mode (B frames)
297 int k_x; ///< Number of bits for MVs (depends on MV range)
298 int k_y; ///< Number of bits for MVs (depends on MV range)
299 int range_x, range_y; ///< MV range
300 uint8_t pq, altpq; ///< Current/alternate frame quantizer scale
301 /** pquant parameters */
308 /** AC coding set indexes
309 * @see 8.1.1.10, p(1)10
312 int c_ac_table_index; ///< Chroma index from ACFRM element
313 int y_ac_table_index; ///< Luma index from AC2FRM element
315 int ttfrm; ///< Transform type info present at frame level
316 uint8_t ttmbf; ///< Transform type flag
317 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform
318 int codingset; ///< index of current table set from 11.8 to use for luma block decoding
319 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding
320 int pqindex; ///< raw pqindex used in coding set selection
321 int a_avail, c_avail;
322 uint8_t *mb_type_base, *mb_type[3];
325 /** Luma compensation parameters */
330 int16_t bfraction; ///< Relative position % anchors=> how to scale MVs
331 uint8_t halfpq; ///< Uniform quant over image and qp+.5
332 uint8_t respic; ///< Frame-level flag for resized images
333 int buffer_fullness; ///< HRD info
335 * -# 0 -> [-64n 63.f] x [-32, 31.f]
336 * -# 1 -> [-128, 127.f] x [-64, 63.f]
337 * -# 2 -> [-512, 511.f] x [-128, 127.f]
338 * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
341 uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use
342 VLC *cbpcy_vlc; ///< CBPCY VLC table
343 int tt_index; ///< Index for Transform Type tables
344 uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV)
345 uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs
346 int mv_type_is_raw; ///< mv type mb plane is not coded
347 int dmb_is_raw; ///< direct mb plane is raw
348 int skip_is_raw; ///< skip mb plane is not coded
349 uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
350 int use_ic; ///< use intensity compensation in B-frames
351 int rnd; ///< rounding control
353 /** Frame decoding info for S/M profiles only */
355 uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
359 /** Frame decoding info for Advanced profile */
361 uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
362 uint8_t numpanscanwin;
364 uint8_t rptfrm, tff, rff;
367 uint16_t bottomrightx;
368 uint16_t bottomrighty;
371 int hrd_num_leaky_buckets;
372 uint8_t bit_rate_exponent;
373 uint8_t buffer_size_exponent;
374 uint8_t* acpred_plane; ///< AC prediction flags bitplane
376 uint8_t* over_flags_plane; ///< Overflags bitplane
379 uint16_t *hrd_rate, *hrd_buffer;
380 uint8_t *hrd_fullness;
381 uint8_t range_mapy_flag;
382 uint8_t range_mapuv_flag;
392 * Get unary code of limited length
393 * @fixme FIXME Slow and ugly
394 * @param gb GetBitContext
395 * @param[in] stop The bitstop value (unary code of 1's or 0's)
396 * @param[in] len Maximum length
397 * @return Unary length/index
399 static int get_prefix(GetBitContext *gb, int stop, int len)
404 for(i = 0; i < len && get_bits1(gb) != stop; i++);
406 /* int i = 0, tmp = !stop;
408 while (i != len && tmp != stop)
410 tmp = get_bits(gb, 1);
413 if (i == len && tmp != stop) return len+1;
420 UPDATE_CACHE(re, gb);
421 buf=GET_CACHE(re, gb); //Still not sure
422 if (stop) buf = ~buf;
424 log= av_log2(-buf); //FIXME: -?
426 LAST_SKIP_BITS(re, gb, log+1);
427 CLOSE_READER(re, gb);
431 LAST_SKIP_BITS(re, gb, limit);
432 CLOSE_READER(re, gb);
437 static inline int decode210(GetBitContext *gb){
443 return 2 - get_bits1(gb);
447 * Init VC-1 specific tables and VC1Context members
448 * @param v The VC1Context to initialize
451 static int vc1_init_common(VC1Context *v)
456 v->hrd_rate = v->hrd_buffer = NULL;
462 init_vlc(&vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
463 vc1_bfraction_bits, 1, 1,
464 vc1_bfraction_codes, 1, 1, 1);
465 init_vlc(&vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
466 vc1_norm2_bits, 1, 1,
467 vc1_norm2_codes, 1, 1, 1);
468 init_vlc(&vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
469 vc1_norm6_bits, 1, 1,
470 vc1_norm6_codes, 2, 2, 1);
471 init_vlc(&vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
472 vc1_imode_bits, 1, 1,
473 vc1_imode_codes, 1, 1, 1);
476 init_vlc(&vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
477 vc1_ttmb_bits[i], 1, 1,
478 vc1_ttmb_codes[i], 2, 2, 1);
479 init_vlc(&vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
480 vc1_ttblk_bits[i], 1, 1,
481 vc1_ttblk_codes[i], 1, 1, 1);
482 init_vlc(&vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
483 vc1_subblkpat_bits[i], 1, 1,
484 vc1_subblkpat_codes[i], 1, 1, 1);
488 init_vlc(&vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
489 vc1_4mv_block_pattern_bits[i], 1, 1,
490 vc1_4mv_block_pattern_codes[i], 1, 1, 1);
491 init_vlc(&vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
492 vc1_cbpcy_p_bits[i], 1, 1,
493 vc1_cbpcy_p_codes[i], 2, 2, 1);
494 init_vlc(&vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
495 vc1_mv_diff_bits[i], 1, 1,
496 vc1_mv_diff_codes[i], 2, 2, 1);
499 init_vlc(&vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
500 &vc1_ac_tables[i][0][1], 8, 4,
501 &vc1_ac_tables[i][0][0], 8, 4, 1);
502 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
503 &ff_msmp4_mb_i_table[0][1], 4, 2,
504 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
509 v->mvrange = 0; /* 7.1.1.18, p80 */
514 /***********************************************************************/
516 * @defgroup bitplane VC9 Bitplane decoding
521 /** @addtogroup bitplane
534 /** @} */ //imode defines
536 /** Decode rows by checking if they are skipped
537 * @param plane Buffer to store decoded bits
538 * @param[in] width Width of this buffer
539 * @param[in] height Height of this buffer
540 * @param[in] stride of this buffer
542 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
545 for (y=0; y<height; y++){
546 if (!get_bits(gb, 1)) //rowskip
547 memset(plane, 0, width);
549 for (x=0; x<width; x++)
550 plane[x] = get_bits(gb, 1);
555 /** Decode columns by checking if they are skipped
556 * @param plane Buffer to store decoded bits
557 * @param[in] width Width of this buffer
558 * @param[in] height Height of this buffer
559 * @param[in] stride of this buffer
560 * @fixme FIXME: Optimize
562 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
565 for (x=0; x<width; x++){
566 if (!get_bits(gb, 1)) //colskip
567 for (y=0; y<height; y++)
570 for (y=0; y<height; y++)
571 plane[y*stride] = get_bits(gb, 1);
576 /** Decode a bitplane's bits
577 * @param bp Bitplane where to store the decode bits
578 * @param v VC-1 context for bit reading and logging
580 * @fixme FIXME: Optimize
582 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
584 GetBitContext *gb = &v->s.gb;
586 int imode, x, y, code, offset;
587 uint8_t invert, *planep = data;
588 int width, height, stride;
590 width = v->s.mb_width;
591 height = v->s.mb_height;
592 stride = v->s.mb_stride;
593 invert = get_bits(gb, 1);
594 imode = get_vlc2(gb, vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
600 //Data is actually read in the MB layer (same for all tests == "raw")
601 *raw_flag = 1; //invert ignored
605 if ((height * width) & 1)
607 *planep++ = get_bits(gb, 1);
611 // decode bitplane as one long line
612 for (y = offset; y < height * width; y += 2) {
613 code = get_vlc2(gb, vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
614 *planep++ = code & 1;
616 if(offset == width) {
618 planep += stride - width;
620 *planep++ = code >> 1;
622 if(offset == width) {
624 planep += stride - width;
630 if(!(height % 3) && (width % 3)) { // use 2x3 decoding
631 for(y = 0; y < height; y+= 3) {
632 for(x = width & 1; x < width; x += 2) {
633 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
635 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
638 planep[x + 0] = (code >> 0) & 1;
639 planep[x + 1] = (code >> 1) & 1;
640 planep[x + 0 + stride] = (code >> 2) & 1;
641 planep[x + 1 + stride] = (code >> 3) & 1;
642 planep[x + 0 + stride * 2] = (code >> 4) & 1;
643 planep[x + 1 + stride * 2] = (code >> 5) & 1;
645 planep += stride * 3;
647 if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb);
649 planep += (height & 1) * stride;
650 for(y = height & 1; y < height; y += 2) {
651 for(x = width % 3; x < width; x += 3) {
652 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
654 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
657 planep[x + 0] = (code >> 0) & 1;
658 planep[x + 1] = (code >> 1) & 1;
659 planep[x + 2] = (code >> 2) & 1;
660 planep[x + 0 + stride] = (code >> 3) & 1;
661 planep[x + 1 + stride] = (code >> 4) & 1;
662 planep[x + 2 + stride] = (code >> 5) & 1;
664 planep += stride * 2;
667 if(x) decode_colskip(data , x, height , stride, &v->s.gb);
668 if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb);
672 decode_rowskip(data, width, height, stride, &v->s.gb);
675 decode_colskip(data, width, height, stride, &v->s.gb);
680 /* Applying diff operator */
681 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
685 for (x=1; x<width; x++)
686 planep[x] ^= planep[x-1];
687 for (y=1; y<height; y++)
690 planep[0] ^= planep[-stride];
691 for (x=1; x<width; x++)
693 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
694 else planep[x] ^= planep[x-1];
701 for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride
703 return (imode<<1) + invert;
706 /** @} */ //Bitplane group
708 /***********************************************************************/
709 /** VOP Dquant decoding
710 * @param v VC-1 Context
712 static int vop_dquant_decoding(VC1Context *v)
714 GetBitContext *gb = &v->s.gb;
720 pqdiff = get_bits(gb, 3);
721 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
722 else v->altpq = v->pq + pqdiff + 1;
726 v->dquantfrm = get_bits(gb, 1);
729 v->dqprofile = get_bits(gb, 2);
730 switch (v->dqprofile)
732 case DQPROFILE_SINGLE_EDGE:
733 case DQPROFILE_DOUBLE_EDGES:
734 v->dqsbedge = get_bits(gb, 2);
736 case DQPROFILE_ALL_MBS:
737 v->dqbilevel = get_bits(gb, 1);
738 default: break; //Forbidden ?
740 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
742 pqdiff = get_bits(gb, 3);
743 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
744 else v->altpq = v->pq + pqdiff + 1;
751 /** Put block onto picture
753 static void vc1_put_block(VC1Context *v, DCTELEM block[6][64])
757 DSPContext *dsp = &v->s.dsp;
761 for(k = 0; k < 6; k++)
762 for(j = 0; j < 8; j++)
763 for(i = 0; i < 8; i++)
764 block[k][i + j*8] = ((block[k][i + j*8] - 128) << 1) + 128;
767 ys = v->s.current_picture.linesize[0];
768 us = v->s.current_picture.linesize[1];
769 vs = v->s.current_picture.linesize[2];
772 dsp->put_pixels_clamped(block[0], Y, ys);
773 dsp->put_pixels_clamped(block[1], Y + 8, ys);
775 dsp->put_pixels_clamped(block[2], Y, ys);
776 dsp->put_pixels_clamped(block[3], Y + 8, ys);
778 if(!(v->s.flags & CODEC_FLAG_GRAY)) {
779 dsp->put_pixels_clamped(block[4], v->s.dest[1], us);
780 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs);
784 /** Do motion compensation over 1 macroblock
785 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
787 static void vc1_mc_1mv(VC1Context *v, int dir)
789 MpegEncContext *s = &v->s;
790 DSPContext *dsp = &v->s.dsp;
791 uint8_t *srcY, *srcU, *srcV;
792 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
794 if(!v->s.last_picture.data[0])return;
796 mx = s->mv[dir][0][0];
797 my = s->mv[dir][0][1];
799 // store motion vectors for further use in B frames
800 if(s->pict_type == P_TYPE) {
801 s->current_picture.motion_val[1][s->block_index[0]][0] = mx;
802 s->current_picture.motion_val[1][s->block_index[0]][1] = my;
804 uvmx = (mx + ((mx & 3) == 3)) >> 1;
805 uvmy = (my + ((my & 3) == 3)) >> 1;
807 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
808 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
811 srcY = s->last_picture.data[0];
812 srcU = s->last_picture.data[1];
813 srcV = s->last_picture.data[2];
815 srcY = s->next_picture.data[0];
816 srcU = s->next_picture.data[1];
817 srcV = s->next_picture.data[2];
820 src_x = s->mb_x * 16 + (mx >> 2);
821 src_y = s->mb_y * 16 + (my >> 2);
822 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
823 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
825 src_x = clip( src_x, -16, s->mb_width * 16);
826 src_y = clip( src_y, -16, s->mb_height * 16);
827 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8);
828 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
830 srcY += src_y * s->linesize + src_x;
831 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
832 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
834 /* for grayscale we should not try to read from unknown area */
835 if(s->flags & CODEC_FLAG_GRAY) {
836 srcU = s->edge_emu_buffer + 18 * s->linesize;
837 srcV = s->edge_emu_buffer + 18 * s->linesize;
840 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
841 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
842 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
843 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
845 srcY -= s->mspel * (1 + s->linesize);
846 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
847 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
848 srcY = s->edge_emu_buffer;
849 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
850 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
851 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
852 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
855 /* if we deal with range reduction we need to scale source blocks */
861 for(j = 0; j < 17 + s->mspel*2; j++) {
862 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
865 src = srcU; src2 = srcV;
866 for(j = 0; j < 9; j++) {
867 for(i = 0; i < 9; i++) {
868 src[i] = ((src[i] - 128) >> 1) + 128;
869 src2[i] = ((src2[i] - 128) >> 1) + 128;
871 src += s->uvlinesize;
872 src2 += s->uvlinesize;
875 /* if we deal with intensity compensation we need to scale source blocks */
876 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
881 for(j = 0; j < 17 + s->mspel*2; j++) {
882 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
885 src = srcU; src2 = srcV;
886 for(j = 0; j < 9; j++) {
887 for(i = 0; i < 9; i++) {
888 src[i] = v->lutuv[src[i]];
889 src2[i] = v->lutuv[src2[i]];
891 src += s->uvlinesize;
892 src2 += s->uvlinesize;
895 srcY += s->mspel * (1 + s->linesize);
899 dxy = ((my & 3) << 2) | (mx & 3);
900 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
901 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
902 srcY += s->linesize * 8;
903 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
904 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
905 } else { // hpel mc - always used for luma
906 dxy = (my & 2) | ((mx & 2) >> 1);
909 dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
911 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
914 if(s->flags & CODEC_FLAG_GRAY) return;
915 /* Chroma MC always uses qpel bilinear */
916 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
920 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
921 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
923 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
924 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
928 /** Do motion compensation for 4-MV macroblock - luminance block
930 static void vc1_mc_4mv_luma(VC1Context *v, int n)
932 MpegEncContext *s = &v->s;
933 DSPContext *dsp = &v->s.dsp;
935 int dxy, mx, my, src_x, src_y;
938 if(!v->s.last_picture.data[0])return;
941 srcY = s->last_picture.data[0];
943 off = s->linesize * 4 * (n&2) + (n&1) * 8;
945 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
946 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
948 src_x = clip( src_x, -16, s->mb_width * 16);
949 src_y = clip( src_y, -16, s->mb_height * 16);
951 srcY += src_y * s->linesize + src_x;
953 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
954 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
955 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){
956 srcY -= s->mspel * (1 + s->linesize);
957 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2,
958 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
959 srcY = s->edge_emu_buffer;
960 /* if we deal with range reduction we need to scale source blocks */
966 for(j = 0; j < 9 + s->mspel*2; j++) {
967 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
971 /* if we deal with intensity compensation we need to scale source blocks */
972 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
977 for(j = 0; j < 9 + s->mspel*2; j++) {
978 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]];
982 srcY += s->mspel * (1 + s->linesize);
986 dxy = ((my & 3) << 2) | (mx & 3);
987 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
988 } else { // hpel mc - always used for luma
989 dxy = (my & 2) | ((mx & 2) >> 1);
991 dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
993 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
997 static inline int median4(int a, int b, int c, int d)
1000 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
1001 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
1003 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
1004 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
1009 /** Do motion compensation for 4-MV macroblock - both chroma blocks
1011 static void vc1_mc_4mv_chroma(VC1Context *v)
1013 MpegEncContext *s = &v->s;
1014 DSPContext *dsp = &v->s.dsp;
1015 uint8_t *srcU, *srcV;
1016 int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y;
1017 int i, idx, tx = 0, ty = 0;
1018 int mvx[4], mvy[4], intra[4];
1019 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
1021 if(!v->s.last_picture.data[0])return;
1022 if(s->flags & CODEC_FLAG_GRAY) return;
1024 for(i = 0; i < 4; i++) {
1025 mvx[i] = s->mv[0][i][0];
1026 mvy[i] = s->mv[0][i][1];
1027 intra[i] = v->mb_type[0][s->block_index[i]];
1030 /* calculate chroma MV vector from four luma MVs */
1031 idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0];
1032 if(!idx) { // all blocks are inter
1033 tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
1034 ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
1035 } else if(count[idx] == 1) { // 3 inter blocks
1038 tx = mid_pred(mvx[1], mvx[2], mvx[3]);
1039 ty = mid_pred(mvy[1], mvy[2], mvy[3]);
1042 tx = mid_pred(mvx[0], mvx[2], mvx[3]);
1043 ty = mid_pred(mvy[0], mvy[2], mvy[3]);
1046 tx = mid_pred(mvx[0], mvx[1], mvx[3]);
1047 ty = mid_pred(mvy[0], mvy[1], mvy[3]);
1050 tx = mid_pred(mvx[0], mvx[1], mvx[2]);
1051 ty = mid_pred(mvy[0], mvy[1], mvy[2]);
1054 } else if(count[idx] == 2) {
1056 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
1057 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
1058 tx = (mvx[t1] + mvx[t2]) / 2;
1059 ty = (mvy[t1] + mvy[t2]) / 2;
1061 return; //no need to do MC for inter blocks
1063 s->current_picture.motion_val[1][s->block_index[0]][0] = tx;
1064 s->current_picture.motion_val[1][s->block_index[0]][1] = ty;
1065 uvmx = (tx + ((tx&3) == 3)) >> 1;
1066 uvmy = (ty + ((ty&3) == 3)) >> 1;
1068 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
1069 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
1072 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
1073 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
1075 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8);
1076 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
1077 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
1078 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
1079 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1080 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
1081 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){
1082 ff_emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1,
1083 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1084 ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
1085 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1086 srcU = s->edge_emu_buffer;
1087 srcV = s->edge_emu_buffer + 16;
1089 /* if we deal with range reduction we need to scale source blocks */
1090 if(v->rangeredfrm) {
1092 uint8_t *src, *src2;
1094 src = srcU; src2 = srcV;
1095 for(j = 0; j < 9; j++) {
1096 for(i = 0; i < 9; i++) {
1097 src[i] = ((src[i] - 128) >> 1) + 128;
1098 src2[i] = ((src2[i] - 128) >> 1) + 128;
1100 src += s->uvlinesize;
1101 src2 += s->uvlinesize;
1104 /* if we deal with intensity compensation we need to scale source blocks */
1105 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1107 uint8_t *src, *src2;
1109 src = srcU; src2 = srcV;
1110 for(j = 0; j < 9; j++) {
1111 for(i = 0; i < 9; i++) {
1112 src[i] = v->lutuv[src[i]];
1113 src2[i] = v->lutuv[src2[i]];
1115 src += s->uvlinesize;
1116 src2 += s->uvlinesize;
1121 /* Chroma MC always uses qpel bilinear */
1122 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
1126 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
1127 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
1129 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
1130 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
1134 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
1137 * Decode Simple/Main Profiles sequence header
1138 * @see Figure 7-8, p16-17
1139 * @param avctx Codec context
1140 * @param gb GetBit context initialized from Codec context extra_data
1143 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
1145 VC1Context *v = avctx->priv_data;
1147 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32));
1148 v->profile = get_bits(gb, 2);
1149 if (v->profile == 2)
1151 av_log(avctx, AV_LOG_ERROR, "Profile value 2 is forbidden (and WMV3 Complex Profile is unsupported)\n");
1155 if (v->profile == PROFILE_ADVANCED)
1157 return decode_sequence_header_adv(v, gb);
1161 v->res_sm = get_bits(gb, 2); //reserved
1164 av_log(avctx, AV_LOG_ERROR,
1165 "Reserved RES_SM=%i is forbidden\n", v->res_sm);
1171 v->frmrtq_postproc = get_bits(gb, 3); //common
1172 // (bitrate-32kbps)/64kbps
1173 v->bitrtq_postproc = get_bits(gb, 5); //common
1174 v->s.loop_filter = get_bits(gb, 1); //common
1175 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE)
1177 av_log(avctx, AV_LOG_ERROR,
1178 "LOOPFILTER shell not be enabled in simple profile\n");
1181 v->res_x8 = get_bits(gb, 1); //reserved
1184 av_log(avctx, AV_LOG_ERROR,
1185 "1 for reserved RES_X8 is forbidden\n");
1188 v->multires = get_bits(gb, 1);
1189 v->res_fasttx = get_bits(gb, 1);
1192 av_log(avctx, AV_LOG_ERROR,
1193 "0 for reserved RES_FASTTX is forbidden\n");
1197 v->fastuvmc = get_bits(gb, 1); //common
1198 if (!v->profile && !v->fastuvmc)
1200 av_log(avctx, AV_LOG_ERROR,
1201 "FASTUVMC unavailable in Simple Profile\n");
1204 v->extended_mv = get_bits(gb, 1); //common
1205 if (!v->profile && v->extended_mv)
1207 av_log(avctx, AV_LOG_ERROR,
1208 "Extended MVs unavailable in Simple Profile\n");
1211 v->dquant = get_bits(gb, 2); //common
1212 v->vstransform = get_bits(gb, 1); //common
1214 v->res_transtab = get_bits(gb, 1);
1215 if (v->res_transtab)
1217 av_log(avctx, AV_LOG_ERROR,
1218 "1 for reserved RES_TRANSTAB is forbidden\n");
1222 v->overlap = get_bits(gb, 1); //common
1224 v->s.resync_marker = get_bits(gb, 1);
1225 v->rangered = get_bits(gb, 1);
1226 if (v->rangered && v->profile == PROFILE_SIMPLE)
1228 av_log(avctx, AV_LOG_INFO,
1229 "RANGERED should be set to 0 in simple profile\n");
1232 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
1233 v->quantizer_mode = get_bits(gb, 2); //common
1235 v->finterpflag = get_bits(gb, 1); //common
1236 v->res_rtm_flag = get_bits(gb, 1); //reserved
1237 if (!v->res_rtm_flag)
1239 // av_log(avctx, AV_LOG_ERROR,
1240 // "0 for reserved RES_RTM_FLAG is forbidden\n");
1241 av_log(avctx, AV_LOG_ERROR,
1242 "Old WMV3 version detected, only I-frames will be decoded\n");
1245 av_log(avctx, AV_LOG_DEBUG,
1246 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1247 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
1248 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
1249 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
1250 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
1251 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
1252 v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
1253 v->dquant, v->quantizer_mode, avctx->max_b_frames
1258 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
1260 v->res_rtm_flag = 1;
1261 v->level = get_bits(gb, 3);
1264 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
1266 v->chromaformat = get_bits(gb, 2);
1267 if (v->chromaformat != 1)
1269 av_log(v->s.avctx, AV_LOG_ERROR,
1270 "Only 4:2:0 chroma format supported\n");
1275 v->frmrtq_postproc = get_bits(gb, 3); //common
1276 // (bitrate-32kbps)/64kbps
1277 v->bitrtq_postproc = get_bits(gb, 5); //common
1278 v->postprocflag = get_bits(gb, 1); //common
1280 v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1;
1281 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
1282 v->broadcast = get_bits1(gb);
1283 v->interlace = get_bits1(gb);
1285 av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced mode not supported (yet)\n");
1288 v->tfcntrflag = get_bits1(gb);
1289 v->finterpflag = get_bits1(gb);
1290 get_bits1(gb); // reserved
1292 av_log(v->s.avctx, AV_LOG_DEBUG,
1293 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1294 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
1295 "TFCTRflag=%i, FINTERPflag=%i\n",
1296 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
1297 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
1298 v->tfcntrflag, v->finterpflag
1301 v->psf = get_bits1(gb);
1302 if(v->psf) { //PsF, 6.1.13
1303 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
1306 if(get_bits1(gb)) { //Display Info - decoding is not affected by it
1308 av_log(v->s.avctx, AV_LOG_INFO, "Display extended info:\n");
1309 w = get_bits(gb, 14) + 1;
1310 h = get_bits(gb, 14) + 1;
1311 av_log(v->s.avctx, AV_LOG_INFO, "Display dimensions: %ix%i\n", w, h);
1313 ar = get_bits(gb, 4);
1315 v->s.avctx->sample_aspect_ratio = vc1_pixel_aspect[ar];
1317 w = get_bits(gb, 8);
1318 h = get_bits(gb, 8);
1319 v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
1322 if(get_bits1(gb)){ //framerate stuff
1332 v->color_prim = get_bits(gb, 8);
1333 v->transfer_char = get_bits(gb, 8);
1334 v->matrix_coef = get_bits(gb, 8);
1338 v->hrd_param_flag = get_bits1(gb);
1339 if(v->hrd_param_flag) {
1341 v->hrd_num_leaky_buckets = get_bits(gb, 5);
1342 get_bits(gb, 4); //bitrate exponent
1343 get_bits(gb, 4); //buffer size exponent
1344 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
1345 get_bits(gb, 16); //hrd_rate[n]
1346 get_bits(gb, 16); //hrd_buffer[n]
1352 static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb)
1354 VC1Context *v = avctx->priv_data;
1355 int i, blink, refdist;
1357 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
1358 blink = get_bits1(gb); // broken link
1359 avctx->max_b_frames = 1 - get_bits1(gb); // 'closed entry' also signalize possible B-frames
1360 v->panscanflag = get_bits1(gb);
1361 refdist = get_bits1(gb); // refdist flag
1362 v->s.loop_filter = get_bits1(gb);
1363 v->fastuvmc = get_bits1(gb);
1364 v->extended_mv = get_bits1(gb);
1365 v->dquant = get_bits(gb, 2);
1366 v->vstransform = get_bits1(gb);
1367 v->overlap = get_bits1(gb);
1368 v->quantizer_mode = get_bits(gb, 2);
1370 if(v->hrd_param_flag){
1371 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
1372 get_bits(gb, 8); //hrd_full[n]
1377 avctx->coded_width = (get_bits(gb, 12)+1)<<1;
1378 avctx->coded_height = (get_bits(gb, 12)+1)<<1;
1381 v->extended_dmv = get_bits1(gb);
1383 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
1384 skip_bits(gb, 3); // Y range, ignored for now
1387 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
1388 skip_bits(gb, 3); // UV range, ignored for now
1391 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
1392 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
1393 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
1394 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
1395 blink, 1 - avctx->max_b_frames, v->panscanflag, refdist, v->s.loop_filter,
1396 v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
1401 static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
1403 int pqindex, lowquant, status;
1405 if(v->finterpflag) v->interpfrm = get_bits(gb, 1);
1406 skip_bits(gb, 2); //framecnt unused
1408 if (v->rangered) v->rangeredfrm = get_bits(gb, 1);
1409 v->s.pict_type = get_bits(gb, 1);
1410 if (v->s.avctx->max_b_frames) {
1411 if (!v->s.pict_type) {
1412 if (get_bits(gb, 1)) v->s.pict_type = I_TYPE;
1413 else v->s.pict_type = B_TYPE;
1414 } else v->s.pict_type = P_TYPE;
1415 } else v->s.pict_type = v->s.pict_type ? P_TYPE : I_TYPE;
1418 if(v->s.pict_type == B_TYPE) {
1419 v->bfraction = get_vlc2(gb, vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
1420 v->bfraction = vc1_bfraction_lut[v->bfraction];
1421 if(v->bfraction == 0) {
1422 v->s.pict_type = BI_TYPE;
1425 if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1426 get_bits(gb, 7); // skip buffer fullness
1429 if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1431 if(v->s.pict_type == P_TYPE)
1434 /* Quantizer stuff */
1435 pqindex = get_bits(gb, 5);
1436 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1437 v->pq = pquant_table[0][pqindex];
1439 v->pq = pquant_table[1][pqindex];
1442 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1443 v->pquantizer = pqindex < 9;
1444 if (v->quantizer_mode == QUANT_NON_UNIFORM)
1446 v->pqindex = pqindex;
1447 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
1449 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1450 v->pquantizer = get_bits(gb, 1);
1452 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3);
1453 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1454 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1455 v->range_x = 1 << (v->k_x - 1);
1456 v->range_y = 1 << (v->k_y - 1);
1457 if (v->profile == PROFILE_ADVANCED)
1459 if (v->postprocflag) v->postproc = get_bits(gb, 1);
1462 if (v->multires && v->s.pict_type != B_TYPE) v->respic = get_bits(gb, 2);
1464 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
1465 // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
1467 if(v->s.pict_type == I_TYPE || v->s.pict_type == P_TYPE) v->use_ic = 0;
1469 switch(v->s.pict_type) {
1471 if (v->pq < 5) v->tt_index = 0;
1472 else if(v->pq < 13) v->tt_index = 1;
1473 else v->tt_index = 2;
1475 lowquant = (v->pq > 12) ? 0 : 1;
1476 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
1477 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1479 int scale, shift, i;
1480 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)];
1481 v->lumscale = get_bits(gb, 6);
1482 v->lumshift = get_bits(gb, 6);
1484 /* fill lookup tables for intensity compensation */
1487 shift = (255 - v->lumshift * 2) << 6;
1488 if(v->lumshift > 31)
1491 scale = v->lumscale + 32;
1492 if(v->lumshift > 31)
1493 shift = (v->lumshift - 64) << 6;
1495 shift = v->lumshift << 6;
1497 for(i = 0; i < 256; i++) {
1498 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6);
1499 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1502 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1503 v->s.quarter_sample = 0;
1504 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1505 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
1506 v->s.quarter_sample = 0;
1508 v->s.quarter_sample = 1;
1510 v->s.quarter_sample = 1;
1511 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));
1513 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1514 v->mv_mode2 == MV_PMODE_MIXED_MV)
1515 || v->mv_mode == MV_PMODE_MIXED_MV)
1517 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1518 if (status < 0) return -1;
1519 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1520 "Imode: %i, Invert: %i\n", status>>1, status&1);
1522 v->mv_type_is_raw = 0;
1523 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1525 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1526 if (status < 0) return -1;
1527 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1528 "Imode: %i, Invert: %i\n", status>>1, status&1);
1530 /* Hopefully this is correct for P frames */
1531 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables
1532 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1536 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1537 vop_dquant_decoding(v);
1540 v->ttfrm = 0; //FIXME Is that so ?
1543 v->ttmbf = get_bits(gb, 1);
1546 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1554 if (v->pq < 5) v->tt_index = 0;
1555 else if(v->pq < 13) v->tt_index = 1;
1556 else v->tt_index = 2;
1558 lowquant = (v->pq > 12) ? 0 : 1;
1559 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
1560 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1561 v->s.mspel = v->s.quarter_sample;
1563 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1564 if (status < 0) return -1;
1565 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1566 "Imode: %i, Invert: %i\n", status>>1, status&1);
1567 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1568 if (status < 0) return -1;
1569 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1570 "Imode: %i, Invert: %i\n", status>>1, status&1);
1572 v->s.mv_table_index = get_bits(gb, 2);
1573 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1577 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1578 vop_dquant_decoding(v);
1584 v->ttmbf = get_bits(gb, 1);
1587 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1597 v->c_ac_table_index = decode012(gb);
1598 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1600 v->y_ac_table_index = decode012(gb);
1603 v->s.dc_table_index = get_bits(gb, 1);
1605 if(v->s.pict_type == BI_TYPE) {
1606 v->s.pict_type = B_TYPE;
1612 static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
1615 int pqindex, lowquant;
1618 v->p_frame_skipped = 0;
1621 fcm = decode012(gb);
1622 switch(get_prefix(gb, 0, 4)) {
1624 v->s.pict_type = P_TYPE;
1627 v->s.pict_type = B_TYPE;
1630 v->s.pict_type = I_TYPE;
1633 v->s.pict_type = BI_TYPE;
1636 v->s.pict_type = P_TYPE; // skipped pic
1637 v->p_frame_skipped = 1;
1643 if(!v->interlace || v->panscanflag) {
1650 if(v->panscanflag) {
1653 v->rnd = get_bits1(gb);
1655 v->uvsamp = get_bits1(gb);
1656 if(v->finterpflag) v->interpfrm = get_bits(gb, 1);
1657 if(v->s.pict_type == B_TYPE) {
1658 v->bfraction = get_vlc2(gb, vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
1659 v->bfraction = vc1_bfraction_lut[v->bfraction];
1660 if(v->bfraction == 0) {
1661 v->s.pict_type = BI_TYPE; /* XXX: should not happen here */
1664 pqindex = get_bits(gb, 5);
1665 v->pqindex = pqindex;
1666 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1667 v->pq = pquant_table[0][pqindex];
1669 v->pq = pquant_table[1][pqindex];
1672 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1673 v->pquantizer = pqindex < 9;
1674 if (v->quantizer_mode == QUANT_NON_UNIFORM)
1676 v->pqindex = pqindex;
1677 if (pqindex < 9) v->halfpq = get_bits(gb, 1);
1679 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1680 v->pquantizer = get_bits(gb, 1);
1682 switch(v->s.pict_type) {
1685 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
1686 if (status < 0) return -1;
1687 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
1688 "Imode: %i, Invert: %i\n", status>>1, status&1);
1689 v->condover = CONDOVER_NONE;
1690 if(v->overlap && v->pq <= 8) {
1691 v->condover = decode012(gb);
1692 if(v->condover == CONDOVER_SELECT) {
1693 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
1694 if (status < 0) return -1;
1695 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
1696 "Imode: %i, Invert: %i\n", status>>1, status&1);
1702 v->postproc = get_bits1(gb);
1703 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3);
1704 else v->mvrange = 0;
1705 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1706 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1707 v->range_x = 1 << (v->k_x - 1);
1708 v->range_y = 1 << (v->k_y - 1);
1710 if (v->pq < 5) v->tt_index = 0;
1711 else if(v->pq < 13) v->tt_index = 1;
1712 else v->tt_index = 2;
1714 lowquant = (v->pq > 12) ? 0 : 1;
1715 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
1716 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1718 int scale, shift, i;
1719 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)];
1720 v->lumscale = get_bits(gb, 6);
1721 v->lumshift = get_bits(gb, 6);
1722 /* fill lookup tables for intensity compensation */
1725 shift = (255 - v->lumshift * 2) << 6;
1726 if(v->lumshift > 31)
1729 scale = v->lumscale + 32;
1730 if(v->lumshift > 31)
1731 shift = (v->lumshift - 64) << 6;
1733 shift = v->lumshift << 6;
1735 for(i = 0; i < 256; i++) {
1736 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6);
1737 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1740 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1741 v->s.quarter_sample = 0;
1742 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1743 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
1744 v->s.quarter_sample = 0;
1746 v->s.quarter_sample = 1;
1748 v->s.quarter_sample = 1;
1749 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));
1751 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1752 v->mv_mode2 == MV_PMODE_MIXED_MV)
1753 || v->mv_mode == MV_PMODE_MIXED_MV)
1755 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1756 if (status < 0) return -1;
1757 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1758 "Imode: %i, Invert: %i\n", status>>1, status&1);
1760 v->mv_type_is_raw = 0;
1761 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1763 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1764 if (status < 0) return -1;
1765 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1766 "Imode: %i, Invert: %i\n", status>>1, status&1);
1768 /* Hopefully this is correct for P frames */
1769 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables
1770 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1773 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1774 vop_dquant_decoding(v);
1777 v->ttfrm = 0; //FIXME Is that so ?
1780 v->ttmbf = get_bits(gb, 1);
1783 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1792 v->postproc = get_bits1(gb);
1793 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3);
1794 else v->mvrange = 0;
1795 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1796 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1797 v->range_x = 1 << (v->k_x - 1);
1798 v->range_y = 1 << (v->k_y - 1);
1800 if (v->pq < 5) v->tt_index = 0;
1801 else if(v->pq < 13) v->tt_index = 1;
1802 else v->tt_index = 2;
1804 lowquant = (v->pq > 12) ? 0 : 1;
1805 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
1806 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1807 v->s.mspel = v->s.quarter_sample;
1809 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1810 if (status < 0) return -1;
1811 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1812 "Imode: %i, Invert: %i\n", status>>1, status&1);
1813 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1814 if (status < 0) return -1;
1815 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1816 "Imode: %i, Invert: %i\n", status>>1, status&1);
1818 v->s.mv_table_index = get_bits(gb, 2);
1819 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1823 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1824 vop_dquant_decoding(v);
1830 v->ttmbf = get_bits(gb, 1);
1833 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)];
1843 v->c_ac_table_index = decode012(gb);
1844 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
1846 v->y_ac_table_index = decode012(gb);
1849 v->s.dc_table_index = get_bits(gb, 1);
1850 if ((v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) && v->dquant) {
1851 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1852 vop_dquant_decoding(v);
1856 if(v->s.pict_type == BI_TYPE) {
1857 v->s.pict_type = B_TYPE;
1863 /***********************************************************************/
1865 * @defgroup block VC-1 Block-level functions
1866 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1872 * @brief Get macroblock-level quantizer scale
1874 #define GET_MQUANT() \
1878 if (v->dqprofile == DQPROFILE_ALL_MBS) \
1882 mquant = (get_bits(gb, 1)) ? v->altpq : v->pq; \
1886 mqdiff = get_bits(gb, 3); \
1887 if (mqdiff != 7) mquant = v->pq + mqdiff; \
1888 else mquant = get_bits(gb, 5); \
1891 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
1892 edges = 1 << v->dqsbedge; \
1893 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
1894 edges = (3 << v->dqsbedge) % 15; \
1895 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
1897 if((edges&1) && !s->mb_x) \
1898 mquant = v->altpq; \
1899 if((edges&2) && s->first_slice_line) \
1900 mquant = v->altpq; \
1901 if((edges&4) && s->mb_x == (s->mb_width - 1)) \
1902 mquant = v->altpq; \
1903 if((edges&8) && s->mb_y == (s->mb_height - 1)) \
1904 mquant = v->altpq; \
1908 * @def GET_MVDATA(_dmv_x, _dmv_y)
1909 * @brief Get MV differentials
1910 * @see MVDATA decoding from 8.3.5.2, p(1)20
1911 * @param _dmv_x Horizontal differential for decoded MV
1912 * @param _dmv_y Vertical differential for decoded MV
1914 #define GET_MVDATA(_dmv_x, _dmv_y) \
1915 index = 1 + get_vlc2(gb, vc1_mv_diff_vlc[s->mv_table_index].table,\
1916 VC1_MV_DIFF_VLC_BITS, 2); \
1919 mb_has_coeffs = 1; \
1922 else mb_has_coeffs = 0; \
1924 if (!index) { _dmv_x = _dmv_y = 0; } \
1925 else if (index == 35) \
1927 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
1928 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
1930 else if (index == 36) \
1939 if (!s->quarter_sample && index1 == 5) val = 1; \
1941 if(size_table[index1] - val > 0) \
1942 val = get_bits(gb, size_table[index1] - val); \
1944 sign = 0 - (val&1); \
1945 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1948 if (!s->quarter_sample && index1 == 5) val = 1; \
1950 if(size_table[index1] - val > 0) \
1951 val = get_bits(gb, size_table[index1] - val); \
1953 sign = 0 - (val&1); \
1954 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1957 /** Predict and set motion vector
1959 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)
1961 int xy, wrap, off = 0;
1966 /* scale MV difference to be quad-pel */
1967 dmv_x <<= 1 - s->quarter_sample;
1968 dmv_y <<= 1 - s->quarter_sample;
1970 wrap = s->b8_stride;
1971 xy = s->block_index[n];
1974 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
1975 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
1976 if(mv1) { /* duplicate motion data for 1-MV block */
1977 s->current_picture.motion_val[0][xy + 1][0] = 0;
1978 s->current_picture.motion_val[0][xy + 1][1] = 0;
1979 s->current_picture.motion_val[0][xy + wrap][0] = 0;
1980 s->current_picture.motion_val[0][xy + wrap][1] = 0;
1981 s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
1982 s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
1987 C = s->current_picture.motion_val[0][xy - 1];
1988 A = s->current_picture.motion_val[0][xy - wrap];
1990 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
1992 //in 4-MV mode different blocks have different B predictor position
1995 off = (s->mb_x > 0) ? -1 : 1;
1998 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
2007 B = s->current_picture.motion_val[0][xy - wrap + off];
2009 if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds
2010 if(s->mb_width == 1) {
2014 px = mid_pred(A[0], B[0], C[0]);
2015 py = mid_pred(A[1], B[1], C[1]);
2017 } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds
2023 /* Pullback MV as specified in 8.3.5.3.4 */
2026 qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
2027 qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
2028 X = (s->mb_width << 6) - 4;
2029 Y = (s->mb_height << 6) - 4;
2031 if(qx + px < -60) px = -60 - qx;
2032 if(qy + py < -60) py = -60 - qy;
2034 if(qx + px < -28) px = -28 - qx;
2035 if(qy + py < -28) py = -28 - qy;
2037 if(qx + px > X) px = X - qx;
2038 if(qy + py > Y) py = Y - qy;
2040 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2041 if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) {
2042 if(is_intra[xy - wrap])
2043 sum = FFABS(px) + FFABS(py);
2045 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2047 if(get_bits1(&s->gb)) {
2055 if(is_intra[xy - 1])
2056 sum = FFABS(px) + FFABS(py);
2058 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2060 if(get_bits1(&s->gb)) {
2070 /* store MV using signed modulus of MV range defined in 4.11 */
2071 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
2072 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
2073 if(mv1) { /* duplicate motion data for 1-MV block */
2074 s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0];
2075 s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1];
2076 s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0];
2077 s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1];
2078 s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0];
2079 s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1];
2083 /** Motion compensation for direct or interpolated blocks in B-frames
2085 static void vc1_interp_mc(VC1Context *v)
2087 MpegEncContext *s = &v->s;
2088 DSPContext *dsp = &v->s.dsp;
2089 uint8_t *srcY, *srcU, *srcV;
2090 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
2092 if(!v->s.next_picture.data[0])return;
2094 mx = s->mv[1][0][0];
2095 my = s->mv[1][0][1];
2096 uvmx = (mx + ((mx & 3) == 3)) >> 1;
2097 uvmy = (my + ((my & 3) == 3)) >> 1;
2099 uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1));
2100 uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1));
2102 srcY = s->next_picture.data[0];
2103 srcU = s->next_picture.data[1];
2104 srcV = s->next_picture.data[2];
2106 src_x = s->mb_x * 16 + (mx >> 2);
2107 src_y = s->mb_y * 16 + (my >> 2);
2108 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
2109 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
2111 src_x = clip( src_x, -16, s->mb_width * 16);
2112 src_y = clip( src_y, -16, s->mb_height * 16);
2113 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8);
2114 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
2116 srcY += src_y * s->linesize + src_x;
2117 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
2118 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
2120 /* for grayscale we should not try to read from unknown area */
2121 if(s->flags & CODEC_FLAG_GRAY) {
2122 srcU = s->edge_emu_buffer + 18 * s->linesize;
2123 srcV = s->edge_emu_buffer + 18 * s->linesize;
2127 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16
2128 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
2129 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
2131 srcY -= s->mspel * (1 + s->linesize);
2132 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
2133 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
2134 srcY = s->edge_emu_buffer;
2135 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
2136 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
2137 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
2138 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
2141 /* if we deal with range reduction we need to scale source blocks */
2142 if(v->rangeredfrm) {
2144 uint8_t *src, *src2;
2147 for(j = 0; j < 17 + s->mspel*2; j++) {
2148 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
2151 src = srcU; src2 = srcV;
2152 for(j = 0; j < 9; j++) {
2153 for(i = 0; i < 9; i++) {
2154 src[i] = ((src[i] - 128) >> 1) + 128;
2155 src2[i] = ((src2[i] - 128) >> 1) + 128;
2157 src += s->uvlinesize;
2158 src2 += s->uvlinesize;
2161 srcY += s->mspel * (1 + s->linesize);
2166 dxy = ((my & 1) << 1) | (mx & 1);
2168 dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
2170 if(s->flags & CODEC_FLAG_GRAY) return;
2171 /* Chroma MC always uses qpel blilinear */
2172 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
2175 dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
2176 dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
2179 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
2183 #if B_FRACTION_DEN==256
2187 return 2 * ((value * n + 255) >> 9);
2188 return (value * n + 128) >> 8;
2191 n -= B_FRACTION_DEN;
2193 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
2194 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
2198 /** Reconstruct motion vector for B-frame and do motion compensation
2200 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode)
2203 v->mv_mode2 = v->mv_mode;
2204 v->mv_mode = MV_PMODE_INTENSITY_COMP;
2209 if(v->use_ic) v->mv_mode = v->mv_mode2;
2212 if(mode == BMV_TYPE_INTERPOLATED) {
2215 if(v->use_ic) v->mv_mode = v->mv_mode2;
2219 if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2;
2220 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
2221 if(v->use_ic) v->mv_mode = v->mv_mode2;
2224 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype)
2226 MpegEncContext *s = &v->s;
2227 int xy, wrap, off = 0;
2232 const uint8_t *is_intra = v->mb_type[0];
2236 /* scale MV difference to be quad-pel */
2237 dmv_x[0] <<= 1 - s->quarter_sample;
2238 dmv_y[0] <<= 1 - s->quarter_sample;
2239 dmv_x[1] <<= 1 - s->quarter_sample;
2240 dmv_y[1] <<= 1 - s->quarter_sample;
2242 wrap = s->b8_stride;
2243 xy = s->block_index[0];
2246 s->current_picture.motion_val[0][xy][0] =
2247 s->current_picture.motion_val[0][xy][1] =
2248 s->current_picture.motion_val[1][xy][0] =
2249 s->current_picture.motion_val[1][xy][1] = 0;
2252 s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
2253 s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
2254 s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
2255 s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
2257 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
2258 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
2259 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
2260 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2264 if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2265 C = s->current_picture.motion_val[0][xy - 2];
2266 A = s->current_picture.motion_val[0][xy - wrap*2];
2267 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2268 B = s->current_picture.motion_val[0][xy - wrap*2 + off];
2270 if(!s->first_slice_line) { // predictor A is not out of bounds
2271 if(s->mb_width == 1) {
2275 px = mid_pred(A[0], B[0], C[0]);
2276 py = mid_pred(A[1], B[1], C[1]);
2278 } else if(s->mb_x) { // predictor C is not out of bounds
2284 /* Pullback MV as specified in 8.3.5.3.4 */
2287 if(v->profile < PROFILE_ADVANCED) {
2288 qx = (s->mb_x << 5);
2289 qy = (s->mb_y << 5);
2290 X = (s->mb_width << 5) - 4;
2291 Y = (s->mb_height << 5) - 4;
2292 if(qx + px < -28) px = -28 - qx;
2293 if(qy + py < -28) py = -28 - qy;
2294 if(qx + px > X) px = X - qx;
2295 if(qy + py > Y) py = Y - qy;
2297 qx = (s->mb_x << 6);
2298 qy = (s->mb_y << 6);
2299 X = (s->mb_width << 6) - 4;
2300 Y = (s->mb_height << 6) - 4;
2301 if(qx + px < -60) px = -60 - qx;
2302 if(qy + py < -60) py = -60 - qy;
2303 if(qx + px > X) px = X - qx;
2304 if(qy + py > Y) py = Y - qy;
2307 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2308 if(0 && !s->first_slice_line && s->mb_x) {
2309 if(is_intra[xy - wrap])
2310 sum = FFABS(px) + FFABS(py);
2312 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2314 if(get_bits1(&s->gb)) {
2322 if(is_intra[xy - 2])
2323 sum = FFABS(px) + FFABS(py);
2325 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2327 if(get_bits1(&s->gb)) {
2337 /* store MV using signed modulus of MV range defined in 4.11 */
2338 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
2339 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
2341 if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
2342 C = s->current_picture.motion_val[1][xy - 2];
2343 A = s->current_picture.motion_val[1][xy - wrap*2];
2344 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
2345 B = s->current_picture.motion_val[1][xy - wrap*2 + off];
2347 if(!s->first_slice_line) { // predictor A is not out of bounds
2348 if(s->mb_width == 1) {
2352 px = mid_pred(A[0], B[0], C[0]);
2353 py = mid_pred(A[1], B[1], C[1]);
2355 } else if(s->mb_x) { // predictor C is not out of bounds
2361 /* Pullback MV as specified in 8.3.5.3.4 */
2364 if(v->profile < PROFILE_ADVANCED) {
2365 qx = (s->mb_x << 5);
2366 qy = (s->mb_y << 5);
2367 X = (s->mb_width << 5) - 4;
2368 Y = (s->mb_height << 5) - 4;
2369 if(qx + px < -28) px = -28 - qx;
2370 if(qy + py < -28) py = -28 - qy;
2371 if(qx + px > X) px = X - qx;
2372 if(qy + py > Y) py = Y - qy;
2374 qx = (s->mb_x << 6);
2375 qy = (s->mb_y << 6);
2376 X = (s->mb_width << 6) - 4;
2377 Y = (s->mb_height << 6) - 4;
2378 if(qx + px < -60) px = -60 - qx;
2379 if(qy + py < -60) py = -60 - qy;
2380 if(qx + px > X) px = X - qx;
2381 if(qy + py > Y) py = Y - qy;
2384 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
2385 if(0 && !s->first_slice_line && s->mb_x) {
2386 if(is_intra[xy - wrap])
2387 sum = FFABS(px) + FFABS(py);
2389 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
2391 if(get_bits1(&s->gb)) {
2399 if(is_intra[xy - 2])
2400 sum = FFABS(px) + FFABS(py);
2402 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
2404 if(get_bits1(&s->gb)) {
2414 /* store MV using signed modulus of MV range defined in 4.11 */
2416 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
2417 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
2419 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
2420 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
2421 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
2422 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2425 /** Get predicted DC value for I-frames only
2426 * prediction dir: left=0, top=1
2427 * @param s MpegEncContext
2428 * @param[in] n block index in the current MB
2429 * @param dc_val_ptr Pointer to DC predictor
2430 * @param dir_ptr Prediction direction for use in AC prediction
2432 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2433 int16_t **dc_val_ptr, int *dir_ptr)
2435 int a, b, c, wrap, pred, scale;
2437 static const uint16_t dcpred[32] = {
2438 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
2439 114, 102, 93, 85, 79, 73, 68, 64,
2440 60, 57, 54, 51, 49, 47, 45, 43,
2441 41, 39, 38, 37, 35, 34, 33
2444 /* find prediction - wmv3_dc_scale always used here in fact */
2445 if (n < 4) scale = s->y_dc_scale;
2446 else scale = s->c_dc_scale;
2448 wrap = s->block_wrap[n];
2449 dc_val= s->dc_val[0] + s->block_index[n];
2455 b = dc_val[ - 1 - wrap];
2456 a = dc_val[ - wrap];
2458 if (pq < 9 || !overlap)
2460 /* Set outer values */
2461 if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
2462 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
2466 /* Set outer values */
2467 if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
2468 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
2471 if (abs(a - b) <= abs(b - c)) {
2479 /* update predictor */
2480 *dc_val_ptr = &dc_val[0];
2485 /** Get predicted DC value
2486 * prediction dir: left=0, top=1
2487 * @param s MpegEncContext
2488 * @param[in] n block index in the current MB
2489 * @param dc_val_ptr Pointer to DC predictor
2490 * @param dir_ptr Prediction direction for use in AC prediction
2492 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2493 int a_avail, int c_avail,
2494 int16_t **dc_val_ptr, int *dir_ptr)
2496 int a, b, c, wrap, pred, scale;
2498 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2501 /* find prediction - wmv3_dc_scale always used here in fact */
2502 if (n < 4) scale = s->y_dc_scale;
2503 else scale = s->c_dc_scale;
2505 wrap = s->block_wrap[n];
2506 dc_val= s->dc_val[0] + s->block_index[n];
2512 b = dc_val[ - 1 - wrap];
2513 a = dc_val[ - wrap];
2514 /* scale predictors if needed */
2515 q1 = s->current_picture.qscale_table[mb_pos];
2516 if(c_avail && (n!= 1 && n!=3)) {
2517 q2 = s->current_picture.qscale_table[mb_pos - 1];
2519 c = (c * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2521 if(a_avail && (n!= 2 && n!=3)) {
2522 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2524 a = (a * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2526 if(a_avail && c_avail && (n!=3)) {
2529 if(n != 2) off -= s->mb_stride;
2530 q2 = s->current_picture.qscale_table[off];
2532 b = (b * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2535 if(a_avail && c_avail) {
2536 if(abs(a - b) <= abs(b - c)) {
2543 } else if(a_avail) {
2546 } else if(c_avail) {
2554 /* update predictor */
2555 *dc_val_ptr = &dc_val[0];
2561 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles
2562 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
2566 static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
2568 int xy, wrap, pred, a, b, c;
2570 xy = s->block_index[n];
2571 wrap = s->b8_stride;
2576 a = s->coded_block[xy - 1 ];
2577 b = s->coded_block[xy - 1 - wrap];
2578 c = s->coded_block[xy - wrap];
2587 *coded_block_ptr = &s->coded_block[xy];
2593 * Decode one AC coefficient
2594 * @param v The VC1 context
2595 * @param last Last coefficient
2596 * @param skip How much zero coefficients to skip
2597 * @param value Decoded AC coefficient value
2600 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
2602 GetBitContext *gb = &v->s.gb;
2603 int index, escape, run = 0, level = 0, lst = 0;
2605 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2606 if (index != vc1_ac_sizes[codingset] - 1) {
2607 run = vc1_index_decode_table[codingset][index][0];
2608 level = vc1_index_decode_table[codingset][index][1];
2609 lst = index >= vc1_last_decode_table[codingset];
2613 escape = decode210(gb);
2615 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2616 run = vc1_index_decode_table[codingset][index][0];
2617 level = vc1_index_decode_table[codingset][index][1];
2618 lst = index >= vc1_last_decode_table[codingset];
2621 level += vc1_last_delta_level_table[codingset][run];
2623 level += vc1_delta_level_table[codingset][run];
2626 run += vc1_last_delta_run_table[codingset][level] + 1;
2628 run += vc1_delta_run_table[codingset][level] + 1;
2634 lst = get_bits(gb, 1);
2635 if(v->s.esc3_level_length == 0) {
2636 if(v->pq < 8 || v->dquantfrm) { // table 59
2637 v->s.esc3_level_length = get_bits(gb, 3);
2638 if(!v->s.esc3_level_length)
2639 v->s.esc3_level_length = get_bits(gb, 2) + 8;
2641 v->s.esc3_level_length = get_prefix(gb, 1, 6) + 2;
2643 v->s.esc3_run_length = 3 + get_bits(gb, 2);
2645 run = get_bits(gb, v->s.esc3_run_length);
2646 sign = get_bits(gb, 1);
2647 level = get_bits(gb, v->s.esc3_level_length);
2658 /** Decode intra block in intra frames - should be faster than decode_intra_block
2659 * @param v VC1Context
2660 * @param block block to decode
2661 * @param coded are AC coeffs present or not
2662 * @param codingset set of VLC to decode data
2664 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
2666 GetBitContext *gb = &v->s.gb;
2667 MpegEncContext *s = &v->s;
2668 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2671 int16_t *ac_val, *ac_val2;
2674 /* Get DC differential */
2676 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2678 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2681 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2686 if (dcdiff == 119 /* ESC index value */)
2688 /* TODO: Optimize */
2689 if (v->pq == 1) dcdiff = get_bits(gb, 10);
2690 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
2691 else dcdiff = get_bits(gb, 8);
2696 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2697 else if (v->pq == 2)
2698 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
2700 if (get_bits(gb, 1))
2705 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2708 /* Store the quantized DC coeff, used for prediction */
2710 block[0] = dcdiff * s->y_dc_scale;
2712 block[0] = dcdiff * s->c_dc_scale;
2725 int last = 0, skip, value;
2726 const int8_t *zz_table;
2730 scale = v->pq * 2 + v->halfpq;
2734 zz_table = vc1_horizontal_zz;
2736 zz_table = vc1_vertical_zz;
2738 zz_table = vc1_normal_zz;
2740 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2742 if(dc_pred_dir) //left
2745 ac_val -= 16 * s->block_wrap[n];
2748 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2752 block[zz_table[i++]] = value;
2755 /* apply AC prediction if needed */
2757 if(dc_pred_dir) { //left
2758 for(k = 1; k < 8; k++)
2759 block[k << 3] += ac_val[k];
2761 for(k = 1; k < 8; k++)
2762 block[k] += ac_val[k + 8];
2765 /* save AC coeffs for further prediction */
2766 for(k = 1; k < 8; k++) {
2767 ac_val2[k] = block[k << 3];
2768 ac_val2[k + 8] = block[k];
2771 /* scale AC coeffs */
2772 for(k = 1; k < 64; k++)
2776 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2779 if(s->ac_pred) i = 63;
2785 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2788 scale = v->pq * 2 + v->halfpq;
2789 memset(ac_val2, 0, 16 * 2);
2790 if(dc_pred_dir) {//left
2793 memcpy(ac_val2, ac_val, 8 * 2);
2795 ac_val -= 16 * s->block_wrap[n];
2797 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2800 /* apply AC prediction if needed */
2802 if(dc_pred_dir) { //left
2803 for(k = 1; k < 8; k++) {
2804 block[k << 3] = ac_val[k] * scale;
2805 if(!v->pquantizer && block[k << 3])
2806 block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq;
2809 for(k = 1; k < 8; k++) {
2810 block[k] = ac_val[k + 8] * scale;
2811 if(!v->pquantizer && block[k])
2812 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2818 s->block_last_index[n] = i;
2823 /** Decode intra block in intra frames - should be faster than decode_intra_block
2824 * @param v VC1Context
2825 * @param block block to decode
2826 * @param coded are AC coeffs present or not
2827 * @param codingset set of VLC to decode data
2829 static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant)
2831 GetBitContext *gb = &v->s.gb;
2832 MpegEncContext *s = &v->s;
2833 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2836 int16_t *ac_val, *ac_val2;
2838 int a_avail = v->a_avail, c_avail = v->c_avail;
2839 int use_pred = s->ac_pred;
2842 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2844 /* Get DC differential */
2846 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2848 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2851 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2856 if (dcdiff == 119 /* ESC index value */)
2858 /* TODO: Optimize */
2859 if (mquant == 1) dcdiff = get_bits(gb, 10);
2860 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2861 else dcdiff = get_bits(gb, 8);
2866 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2867 else if (mquant == 2)
2868 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
2870 if (get_bits(gb, 1))
2875 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2878 /* Store the quantized DC coeff, used for prediction */
2880 block[0] = dcdiff * s->y_dc_scale;
2882 block[0] = dcdiff * s->c_dc_scale;
2891 /* check if AC is needed at all and adjust direction if needed */
2892 if(!a_avail) dc_pred_dir = 1;
2893 if(!c_avail) dc_pred_dir = 0;
2894 if(!a_avail && !c_avail) use_pred = 0;
2895 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2898 scale = mquant * 2 + v->halfpq;
2900 if(dc_pred_dir) //left
2903 ac_val -= 16 * s->block_wrap[n];
2905 q1 = s->current_picture.qscale_table[mb_pos];
2906 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
2907 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2908 if(n && n<4) q2 = q1;
2911 int last = 0, skip, value;
2912 const int8_t *zz_table;
2917 zz_table = vc1_horizontal_zz;
2919 zz_table = vc1_vertical_zz;
2921 zz_table = vc1_normal_zz;
2924 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2928 block[zz_table[i++]] = value;
2931 /* apply AC prediction if needed */
2933 /* scale predictors if needed*/
2935 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2936 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2938 if(dc_pred_dir) { //left
2939 for(k = 1; k < 8; k++)
2940 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2942 for(k = 1; k < 8; k++)
2943 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2946 if(dc_pred_dir) { //left
2947 for(k = 1; k < 8; k++)
2948 block[k << 3] += ac_val[k];
2950 for(k = 1; k < 8; k++)
2951 block[k] += ac_val[k + 8];
2955 /* save AC coeffs for further prediction */
2956 for(k = 1; k < 8; k++) {
2957 ac_val2[k] = block[k << 3];
2958 ac_val2[k + 8] = block[k];
2961 /* scale AC coeffs */
2962 for(k = 1; k < 64; k++)
2966 block[k] += (block[k] < 0) ? -mquant : mquant;
2969 if(use_pred) i = 63;
2970 } else { // no AC coeffs
2973 memset(ac_val2, 0, 16 * 2);
2974 if(dc_pred_dir) {//left
2976 memcpy(ac_val2, ac_val, 8 * 2);
2978 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2979 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2980 for(k = 1; k < 8; k++)
2981 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2986 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2988 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
2989 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2990 for(k = 1; k < 8; k++)
2991 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2996 /* apply AC prediction if needed */
2998 if(dc_pred_dir) { //left
2999 for(k = 1; k < 8; k++) {
3000 block[k << 3] = ac_val2[k] * scale;
3001 if(!v->pquantizer && block[k << 3])
3002 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
3005 for(k = 1; k < 8; k++) {
3006 block[k] = ac_val2[k + 8] * scale;
3007 if(!v->pquantizer && block[k])
3008 block[k] += (block[k] < 0) ? -mquant : mquant;
3014 s->block_last_index[n] = i;
3019 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
3020 * @param v VC1Context
3021 * @param block block to decode
3022 * @param coded are AC coeffs present or not
3023 * @param mquant block quantizer
3024 * @param codingset set of VLC to decode data
3026 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
3028 GetBitContext *gb = &v->s.gb;
3029 MpegEncContext *s = &v->s;
3030 int dc_pred_dir = 0; /* Direction of the DC prediction used */
3033 int16_t *ac_val, *ac_val2;
3035 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3036 int a_avail = v->a_avail, c_avail = v->c_avail;
3037 int use_pred = s->ac_pred;
3041 /* XXX: Guard against dumb values of mquant */
3042 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
3044 /* Set DC scale - y and c use the same */
3045 s->y_dc_scale = s->y_dc_scale_table[mquant];
3046 s->c_dc_scale = s->c_dc_scale_table[mquant];
3048 /* Get DC differential */
3050 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3052 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
3055 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
3060 if (dcdiff == 119 /* ESC index value */)
3062 /* TODO: Optimize */
3063 if (mquant == 1) dcdiff = get_bits(gb, 10);
3064 else if (mquant == 2) dcdiff = get_bits(gb, 9);
3065 else dcdiff = get_bits(gb, 8);
3070 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
3071 else if (mquant == 2)
3072 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
3074 if (get_bits(gb, 1))
3079 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
3082 /* Store the quantized DC coeff, used for prediction */
3085 block[0] = dcdiff * s->y_dc_scale;
3087 block[0] = dcdiff * s->c_dc_scale;
3096 /* check if AC is needed at all and adjust direction if needed */
3097 if(!a_avail) dc_pred_dir = 1;
3098 if(!c_avail) dc_pred_dir = 0;
3099 if(!a_avail && !c_avail) use_pred = 0;
3100 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
3103 scale = mquant * 2 + v->halfpq;
3105 if(dc_pred_dir) //left
3108 ac_val -= 16 * s->block_wrap[n];
3110 q1 = s->current_picture.qscale_table[mb_pos];
3111 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
3112 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
3113 if(n && n<4) q2 = q1;
3116 int last = 0, skip, value;
3117 const int8_t *zz_table;
3120 zz_table = vc1_simple_progressive_8x8_zz;
3123 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
3127 block[zz_table[i++]] = value;
3130 /* apply AC prediction if needed */
3132 /* scale predictors if needed*/
3134 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3135 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3137 if(dc_pred_dir) { //left
3138 for(k = 1; k < 8; k++)
3139 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3141 for(k = 1; k < 8; k++)
3142 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3145 if(dc_pred_dir) { //left
3146 for(k = 1; k < 8; k++)
3147 block[k << 3] += ac_val[k];
3149 for(k = 1; k < 8; k++)
3150 block[k] += ac_val[k + 8];
3154 /* save AC coeffs for further prediction */
3155 for(k = 1; k < 8; k++) {
3156 ac_val2[k] = block[k << 3];
3157 ac_val2[k + 8] = block[k];
3160 /* scale AC coeffs */
3161 for(k = 1; k < 64; k++)
3165 block[k] += (block[k] < 0) ? -mquant : mquant;
3168 if(use_pred) i = 63;
3169 } else { // no AC coeffs
3172 memset(ac_val2, 0, 16 * 2);
3173 if(dc_pred_dir) {//left
3175 memcpy(ac_val2, ac_val, 8 * 2);
3177 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3178 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3179 for(k = 1; k < 8; k++)
3180 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3185 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
3187 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
3188 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3189 for(k = 1; k < 8; k++)
3190 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3195 /* apply AC prediction if needed */
3197 if(dc_pred_dir) { //left
3198 for(k = 1; k < 8; k++) {
3199 block[k << 3] = ac_val2[k] * scale;
3200 if(!v->pquantizer && block[k << 3])
3201 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
3204 for(k = 1; k < 8; k++) {
3205 block[k] = ac_val2[k + 8] * scale;
3206 if(!v->pquantizer && block[k])
3207 block[k] += (block[k] < 0) ? -mquant : mquant;
3213 s->block_last_index[n] = i;
3220 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block)
3222 MpegEncContext *s = &v->s;
3223 GetBitContext *gb = &s->gb;
3226 int scale, off, idx, last, skip, value;
3227 int ttblk = ttmb & 7;
3230 ttblk = ttblk_to_tt[v->tt_index][get_vlc2(gb, vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
3232 if(ttblk == TT_4X4) {
3233 subblkpat = ~(get_vlc2(gb, vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
3235 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) {
3236 subblkpat = decode012(gb);
3237 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
3238 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
3239 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
3241 scale = 2 * mquant + v->halfpq;
3243 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
3244 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
3245 subblkpat = 2 - (ttblk == TT_8X4_TOP);
3248 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3249 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3257 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3261 idx = vc1_simple_progressive_8x8_zz[i++];
3262 block[idx] = value * scale;
3264 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3266 s->dsp.vc1_inv_trans_8x8(block);
3269 for(j = 0; j < 4; j++) {
3270 last = subblkpat & (1 << (3 - j));
3272 off = (j & 1) * 4 + (j & 2) * 16;
3274 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3278 idx = vc1_simple_progressive_4x4_zz[i++];
3279 block[idx + off] = value * scale;
3281 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3283 if(!(subblkpat & (1 << (3 - j))))
3284 s->dsp.vc1_inv_trans_4x4(block, j);
3288 for(j = 0; j < 2; j++) {
3289 last = subblkpat & (1 << (1 - j));
3293 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3297 if(v->profile < PROFILE_ADVANCED)
3298 idx = vc1_simple_progressive_8x4_zz[i++];
3300 idx = vc1_adv_progressive_8x4_zz[i++];
3301 block[idx + off] = value * scale;
3303 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3305 if(!(subblkpat & (1 << (1 - j))))
3306 s->dsp.vc1_inv_trans_8x4(block, j);
3310 for(j = 0; j < 2; j++) {
3311 last = subblkpat & (1 << (1 - j));
3315 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
3319 if(v->profile < PROFILE_ADVANCED)
3320 idx = vc1_simple_progressive_4x8_zz[i++];
3322 idx = vc1_adv_progressive_4x8_zz[i++];
3323 block[idx + off] = value * scale;
3325 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3327 if(!(subblkpat & (1 << (1 - j))))
3328 s->dsp.vc1_inv_trans_4x8(block, j);
3336 /** Decode one P-frame MB (in Simple/Main profile)
3338 static int vc1_decode_p_mb(VC1Context *v)
3340 MpegEncContext *s = &v->s;
3341 GetBitContext *gb = &s->gb;
3343 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3344 int cbp; /* cbp decoding stuff */
3345 int mqdiff, mquant; /* MB quantization */
3346 int ttmb = v->ttfrm; /* MB Transform type */
3349 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
3350 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3351 int mb_has_coeffs = 1; /* last_flag */
3352 int dmv_x, dmv_y; /* Differential MV components */
3353 int index, index1; /* LUT indices */
3354 int val, sign; /* temp values */
3355 int first_block = 1;
3357 int skipped, fourmv;
3359 mquant = v->pq; /* Loosy initialization */
3361 if (v->mv_type_is_raw)
3362 fourmv = get_bits1(gb);
3364 fourmv = v->mv_type_mb_plane[mb_pos];
3366 skipped = get_bits1(gb);
3368 skipped = v->s.mbskip_table[mb_pos];
3370 s->dsp.clear_blocks(s->block[0]);
3372 if (!fourmv) /* 1MV mode */
3376 GET_MVDATA(dmv_x, dmv_y);
3379 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3380 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3382 s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
3383 vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
3385 /* FIXME Set DC val for inter block ? */
3386 if (s->mb_intra && !mb_has_coeffs)
3389 s->ac_pred = get_bits(gb, 1);
3392 else if (mb_has_coeffs)
3394 if (s->mb_intra) s->ac_pred = get_bits(gb, 1);
3395 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3403 s->current_picture.qscale_table[mb_pos] = mquant;
3405 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3406 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table,
3407 VC1_TTMB_VLC_BITS, 2);
3408 if(!s->mb_intra) vc1_mc_1mv(v, 0);
3412 s->dc_val[0][s->block_index[i]] = 0;
3414 val = ((cbp >> (5 - i)) & 1);
3415 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3416 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3418 /* check if prediction blocks A and C are available */
3419 v->a_avail = v->c_avail = 0;
3420 if(i == 2 || i == 3 || !s->first_slice_line)
3421 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3422 if(i == 1 || i == 3 || s->mb_x)
3423 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3425 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3426 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3427 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3428 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3429 for(j = 0; j < 64; j++) s->block[i][j] += 128;
3430 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3431 if(v->pq >= 9 && v->overlap) {
3433 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3435 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3438 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
3439 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3441 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
3442 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3449 for(i = 0; i < 6; i++) {
3450 v->mb_type[0][s->block_index[i]] = 0;
3451 s->dc_val[0][s->block_index[i]] = 0;
3453 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
3454 s->current_picture.qscale_table[mb_pos] = 0;
3455 vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
3462 if (!skipped /* unskipped MB */)
3464 int intra_count = 0, coded_inter = 0;
3465 int is_intra[6], is_coded[6];
3467 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3470 val = ((cbp >> (5 - i)) & 1);
3471 s->dc_val[0][s->block_index[i]] = 0;
3478 GET_MVDATA(dmv_x, dmv_y);
3480 vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
3481 if(!s->mb_intra) vc1_mc_4mv_luma(v, i);
3482 intra_count += s->mb_intra;
3483 is_intra[i] = s->mb_intra;
3484 is_coded[i] = mb_has_coeffs;
3487 is_intra[i] = (intra_count >= 3);
3490 if(i == 4) vc1_mc_4mv_chroma(v);
3491 v->mb_type[0][s->block_index[i]] = is_intra[i];
3492 if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
3494 // if there are no coded blocks then don't do anything more
3495 if(!intra_count && !coded_inter) return 0;
3498 s->current_picture.qscale_table[mb_pos] = mquant;
3499 /* test if block is intra and has pred */
3504 if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
3505 || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
3510 if(intrapred)s->ac_pred = get_bits(gb, 1);
3511 else s->ac_pred = 0;
3513 if (!v->ttmbf && coded_inter)
3514 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3518 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3519 s->mb_intra = is_intra[i];
3521 /* check if prediction blocks A and C are available */
3522 v->a_avail = v->c_avail = 0;
3523 if(i == 2 || i == 3 || !s->first_slice_line)
3524 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3525 if(i == 1 || i == 3 || s->mb_x)
3526 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3528 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
3529 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3530 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3531 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3532 for(j = 0; j < 64; j++) s->block[i][j] += 128;
3533 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3534 if(v->pq >= 9 && v->overlap) {
3536 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3538 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3540 } else if(is_coded[i]) {
3541 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
3542 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3544 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
3545 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3553 s->current_picture.qscale_table[mb_pos] = 0;
3554 for (i=0; i<6; i++) {
3555 v->mb_type[0][s->block_index[i]] = 0;
3556 s->dc_val[0][s->block_index[i]] = 0;
3560 vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]);
3561 vc1_mc_4mv_luma(v, i);
3563 vc1_mc_4mv_chroma(v);
3564 s->current_picture.qscale_table[mb_pos] = 0;
3569 /* Should never happen */
3573 /** Decode one B-frame MB (in Main profile)
3575 static void vc1_decode_b_mb(VC1Context *v)
3577 MpegEncContext *s = &v->s;
3578 GetBitContext *gb = &s->gb;
3580 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3581 int cbp = 0; /* cbp decoding stuff */
3582 int mqdiff, mquant; /* MB quantization */
3583 int ttmb = v->ttfrm; /* MB Transform type */
3585 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
3586 offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3587 int mb_has_coeffs = 0; /* last_flag */
3588 int index, index1; /* LUT indices */
3589 int val, sign; /* temp values */
3590 int first_block = 1;
3592 int skipped, direct;
3593 int dmv_x[2], dmv_y[2];
3594 int bmvtype = BMV_TYPE_BACKWARD;
3596 mquant = v->pq; /* Loosy initialization */
3600 direct = get_bits1(gb);
3602 direct = v->direct_mb_plane[mb_pos];
3604 skipped = get_bits1(gb);
3606 skipped = v->s.mbskip_table[mb_pos];
3608 s->dsp.clear_blocks(s->block[0]);
3609 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
3610 for(i = 0; i < 6; i++) {
3611 v->mb_type[0][s->block_index[i]] = 0;
3612 s->dc_val[0][s->block_index[i]] = 0;
3614 s->current_picture.qscale_table[mb_pos] = 0;
3618 GET_MVDATA(dmv_x[0], dmv_y[0]);
3619 dmv_x[1] = dmv_x[0];
3620 dmv_y[1] = dmv_y[0];
3622 if(skipped || !s->mb_intra) {
3623 bmvtype = decode012(gb);
3626 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
3629 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
3632 bmvtype = BMV_TYPE_INTERPOLATED;
3633 dmv_x[0] = dmv_y[0] = 0;
3637 for(i = 0; i < 6; i++)
3638 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3641 if(direct) bmvtype = BMV_TYPE_INTERPOLATED;
3642 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3643 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3647 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3651 s->current_picture.qscale_table[mb_pos] = mquant;
3653 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3654 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
3655 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3656 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3658 if(!mb_has_coeffs && !s->mb_intra) {
3659 /* no coded blocks - effectively skipped */
3660 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3661 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3664 if(s->mb_intra && !mb_has_coeffs) {
3666 s->current_picture.qscale_table[mb_pos] = mquant;
3667 s->ac_pred = get_bits1(gb);
3669 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3671 if(bmvtype == BMV_TYPE_INTERPOLATED) {
3672 GET_MVDATA(dmv_x[0], dmv_y[0]);
3673 if(!mb_has_coeffs) {
3674 /* interpolated skipped block */
3675 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3676 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3680 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3682 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3685 s->ac_pred = get_bits1(gb);
3686 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3688 s->current_picture.qscale_table[mb_pos] = mquant;
3689 if(!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3690 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3696 s->dc_val[0][s->block_index[i]] = 0;
3698 val = ((cbp >> (5 - i)) & 1);
3699 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3700 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3702 /* check if prediction blocks A and C are available */
3703 v->a_avail = v->c_avail = 0;
3704 if(i == 2 || i == 3 || !s->first_slice_line)
3705 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3706 if(i == 1 || i == 3 || s->mb_x)
3707 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3709 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3710 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3711 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3712 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3713 for(j = 0; j < 64; j++) s->block[i][j] += 128;
3714 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3716 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
3717 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3719 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
3720 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3725 /** Decode blocks of I-frame
3727 static void vc1_decode_i_blocks(VC1Context *v)
3730 MpegEncContext *s = &v->s;
3735 /* select codingmode used for VLC tables selection */
3736 switch(v->y_ac_table_index){
3738 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
3741 v->codingset = CS_HIGH_MOT_INTRA;
3744 v->codingset = CS_MID_RATE_INTRA;
3748 switch(v->c_ac_table_index){
3750 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
3753 v->codingset2 = CS_HIGH_MOT_INTER;
3756 v->codingset2 = CS_MID_RATE_INTER;
3760 /* Set DC scale - y and c use the same */
3761 s->y_dc_scale = s->y_dc_scale_table[v->pq];
3762 s->c_dc_scale = s->c_dc_scale_table[v->pq];
3765 s->mb_x = s->mb_y = 0;
3767 s->first_slice_line = 1;
3768 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3769 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
3770 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
3771 ff_init_block_index(s);
3772 ff_update_block_index(s);
3773 s->dsp.clear_blocks(s->block[0]);
3774 mb_pos = s->mb_x + s->mb_y * s->mb_width;
3775 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
3776 s->current_picture.qscale_table[mb_pos] = v->pq;
3777 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3778 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3780 // do actual MB decoding and displaying
3781 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
3782 v->s.ac_pred = get_bits(&v->s.gb, 1);
3784 for(k = 0; k < 6; k++) {
3785 val = ((cbp >> (5 - k)) & 1);
3788 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
3792 cbp |= val << (5 - k);
3794 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
3796 s->dsp.vc1_inv_trans_8x8(s->block[k]);
3797 if(v->pq >= 9 && v->overlap) {
3798 for(j = 0; j < 64; j++) s->block[k][j] += 128;
3802 vc1_put_block(v, s->block);
3803 if(v->pq >= 9 && v->overlap) {
3805 s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
3806 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3807 if(!(s->flags & CODEC_FLAG_GRAY)) {
3808 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
3809 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
3812 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
3813 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3814 if(!s->first_slice_line) {
3815 s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
3816 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3817 if(!(s->flags & CODEC_FLAG_GRAY)) {
3818 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
3819 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3822 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3823 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3826 if(get_bits_count(&s->gb) > v->bits) {
3827 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
3831 ff_draw_horiz_band(s, s->mb_y * 16, 16);
3832 s->first_slice_line = 0;
3836 /** Decode blocks of I-frame for advanced profile
3838 static void vc1_decode_i_blocks_adv(VC1Context *v)
3841 MpegEncContext *s = &v->s;
3848 GetBitContext *gb = &s->gb;
3850 /* select codingmode used for VLC tables selection */
3851 switch(v->y_ac_table_index){
3853 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
3856 v->codingset = CS_HIGH_MOT_INTRA;
3859 v->codingset = CS_MID_RATE_INTRA;
3863 switch(v->c_ac_table_index){
3865 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
3868 v->codingset2 = CS_HIGH_MOT_INTER;
3871 v->codingset2 = CS_MID_RATE_INTER;
3876 s->mb_x = s->mb_y = 0;
3878 s->first_slice_line = 1;
3879 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3880 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
3881 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
3882 ff_init_block_index(s);
3883 ff_update_block_index(s);
3884 s->dsp.clear_blocks(s->block[0]);
3885 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3886 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
3887 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
3888 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3890 // do actual MB decoding and displaying
3891 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
3892 if(v->acpred_is_raw)
3893 v->s.ac_pred = get_bits(&v->s.gb, 1);
3895 v->s.ac_pred = v->acpred_plane[mb_pos];
3897 if(v->condover == CONDOVER_SELECT) {
3898 if(v->overflg_is_raw)
3899 overlap = get_bits(&v->s.gb, 1);
3901 overlap = v->over_flags_plane[mb_pos];
3903 overlap = (v->condover == CONDOVER_ALL);
3907 s->current_picture.qscale_table[mb_pos] = mquant;
3908 /* Set DC scale - y and c use the same */
3909 s->y_dc_scale = s->y_dc_scale_table[mquant];
3910 s->c_dc_scale = s->c_dc_scale_table[mquant];
3912 for(k = 0; k < 6; k++) {
3913 val = ((cbp >> (5 - k)) & 1);
3916 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
3920 cbp |= val << (5 - k);
3922 v->a_avail = !s->first_slice_line || (k==2 || k==3);
3923 v->c_avail = !!s->mb_x || (k==1 || k==3);
3925 vc1_decode_i_block_adv(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);
3927 s->dsp.vc1_inv_trans_8x8(s->block[k]);
3928 for(j = 0; j < 64; j++) s->block[k][j] += 128;
3931 vc1_put_block(v, s->block);
3934 s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
3935 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3936 if(!(s->flags & CODEC_FLAG_GRAY)) {
3937 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
3938 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
3941 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
3942 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3943 if(!s->first_slice_line) {
3944 s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
3945 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3946 if(!(s->flags & CODEC_FLAG_GRAY)) {
3947 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
3948 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3951 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3952 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3955 if(get_bits_count(&s->gb) > v->bits) {
3956 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
3960 ff_draw_horiz_band(s, s->mb_y * 16, 16);
3961 s->first_slice_line = 0;
3965 static void vc1_decode_p_blocks(VC1Context *v)
3967 MpegEncContext *s = &v->s;
3969 /* select codingmode used for VLC tables selection */
3970 switch(v->c_ac_table_index){
3972 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
3975 v->codingset = CS_HIGH_MOT_INTRA;
3978 v->codingset = CS_MID_RATE_INTRA;
3982 switch(v->c_ac_table_index){
3984 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
3987 v->codingset2 = CS_HIGH_MOT_INTER;
3990 v->codingset2 = CS_MID_RATE_INTER;
3994 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3995 s->first_slice_line = 1;
3996 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
3997 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
3998 ff_init_block_index(s);
3999 ff_update_block_index(s);
4000 s->dsp.clear_blocks(s->block[0]);
4003 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4004 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);
4008 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4009 s->first_slice_line = 0;
4013 static void vc1_decode_b_blocks(VC1Context *v)
4015 MpegEncContext *s = &v->s;
4017 /* select codingmode used for VLC tables selection */
4018 switch(v->c_ac_table_index){
4020 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
4023 v->codingset = CS_HIGH_MOT_INTRA;
4026 v->codingset = CS_MID_RATE_INTRA;
4030 switch(v->c_ac_table_index){
4032 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
4035 v->codingset2 = CS_HIGH_MOT_INTER;
4038 v->codingset2 = CS_MID_RATE_INTER;
4042 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
4043 s->first_slice_line = 1;
4044 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
4045 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
4046 ff_init_block_index(s);
4047 ff_update_block_index(s);
4048 s->dsp.clear_blocks(s->block[0]);
4051 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
4052 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);
4056 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4057 s->first_slice_line = 0;
4061 static void vc1_decode_skip_blocks(VC1Context *v)
4063 MpegEncContext *s = &v->s;
4065 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
4066 s->first_slice_line = 1;
4067 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
4069 ff_init_block_index(s);
4070 ff_update_block_index(s);
4071 memcpy(s->dest[0], s->last_picture.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
4072 memcpy(s->dest[1], s->last_picture.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4073 memcpy(s->dest[2], s->last_picture.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
4074 ff_draw_horiz_band(s, s->mb_y * 16, 16);
4075 s->first_slice_line = 0;
4077 s->pict_type = P_TYPE;
4080 static void vc1_decode_blocks(VC1Context *v)
4083 v->s.esc3_level_length = 0;
4085 switch(v->s.pict_type) {
4087 if(v->profile == PROFILE_ADVANCED)
4088 vc1_decode_i_blocks_adv(v);
4090 vc1_decode_i_blocks(v);
4093 if(v->p_frame_skipped)
4094 vc1_decode_skip_blocks(v);
4096 vc1_decode_p_blocks(v);
4100 if(v->profile == PROFILE_ADVANCED)
4101 vc1_decode_i_blocks_adv(v);
4103 vc1_decode_i_blocks(v);
4105 vc1_decode_b_blocks(v);
4110 #define IS_MARKER(x) ((((x) & ~0xFF) == VC1_CODE_RES0) && ((x) != VC1_CODE_ESCAPE))
4112 /** Find VC-1 marker in buffer
4113 * @return position where next marker starts or end of buffer if no marker found
4115 static av_always_inline uint8_t* find_next_marker(uint8_t *src, uint8_t *end)
4117 uint32_t mrk = 0xFFFFFFFF;
4119 if(end-src < 4) return end;
4121 mrk = (mrk << 8) | *src++;
4128 static av_always_inline int vc1_unescape_buffer(uint8_t *src, int size, uint8_t *dst)
4133 for(dsize = 0; dsize < size; dsize++) *dst++ = *src++;
4136 for(i = 0; i < size; i++, src++) {
4137 if(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) {
4138 dst[dsize++] = src[1];
4142 dst[dsize++] = *src;
4147 /** Initialize a VC1/WMV3 decoder
4148 * @todo TODO: Handle VC-1 IDUs (Transport level?)
4149 * @todo TODO: Decypher remaining bits in extra_data
4151 static int vc1_decode_init(AVCodecContext *avctx)
4153 VC1Context *v = avctx->priv_data;
4154 MpegEncContext *s = &v->s;
4157 if (!avctx->extradata_size || !avctx->extradata) return -1;
4158 if (!(avctx->flags & CODEC_FLAG_GRAY))
4159 avctx->pix_fmt = PIX_FMT_YUV420P;
4161 avctx->pix_fmt = PIX_FMT_GRAY8;
4163 avctx->flags |= CODEC_FLAG_EMU_EDGE;
4164 v->s.flags |= CODEC_FLAG_EMU_EDGE;
4166 if(ff_h263_decode_init(avctx) < 0)
4168 if (vc1_init_common(v) < 0) return -1;
4170 avctx->coded_width = avctx->width;
4171 avctx->coded_height = avctx->height;
4172 if (avctx->codec_id == CODEC_ID_WMV3)
4176 // looks like WMV3 has a sequence header stored in the extradata
4177 // advanced sequence header may be before the first frame
4178 // the last byte of the extradata is a version number, 1 for the
4179 // samples we can decode
4181 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
4183 if (decode_sequence_header(avctx, &gb) < 0)
4186 count = avctx->extradata_size*8 - get_bits_count(&gb);
4189 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
4190 count, get_bits(&gb, count));
4194 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
4196 } else { // VC1/WVC1
4197 uint8_t *start = avctx->extradata, *end = avctx->extradata + avctx->extradata_size;
4198 uint8_t *next; int size, buf2_size;
4199 uint8_t *buf2 = NULL;
4200 int seq_inited = 0, ep_inited = 0;
4202 if(avctx->extradata_size < 16) {
4203 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
4207 buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
4208 if(start[0]) start++; // in WVC1 extradata first byte is its size
4210 for(; next < end; start = next){
4211 next = find_next_marker(start + 4, end);
4212 size = next - start - 4;
4213 if(size <= 0) continue;
4214 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
4215 init_get_bits(&gb, buf2, buf2_size * 8);
4216 switch(AV_RB32(start)){
4217 case VC1_CODE_SEQHDR:
4218 if(decode_sequence_header(avctx, &gb) < 0){
4224 case VC1_CODE_ENTRYPOINT:
4225 if(decode_entry_point(avctx, &gb) < 0){
4234 if(!seq_inited || !ep_inited){
4235 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
4239 avctx->has_b_frames= !!(avctx->max_b_frames);
4240 s->low_delay = !avctx->has_b_frames;
4242 s->mb_width = (avctx->coded_width+15)>>4;
4243 s->mb_height = (avctx->coded_height+15)>>4;
4245 /* Allocate mb bitplanes */
4246 v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
4247 v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height);
4248 v->acpred_plane = av_malloc(s->mb_stride * s->mb_height);
4249 v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height);
4251 /* allocate block type info in that way so it could be used with s->block_index[] */
4252 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
4253 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
4254 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
4255 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
4257 /* Init coded blocks info */
4258 if (v->profile == PROFILE_ADVANCED)
4260 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
4262 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
4270 /** Decode a VC1/WMV3 frame
4271 * @todo TODO: Handle VC-1 IDUs (Transport level?)
4273 static int vc1_decode_frame(AVCodecContext *avctx,
4274 void *data, int *data_size,
4275 uint8_t *buf, int buf_size)
4277 VC1Context *v = avctx->priv_data;
4278 MpegEncContext *s = &v->s;
4279 AVFrame *pict = data;
4280 uint8_t *buf2 = NULL;
4282 /* no supplementary picture */
4283 if (buf_size == 0) {
4284 /* special case for last picture */
4285 if (s->low_delay==0 && s->next_picture_ptr) {
4286 *pict= *(AVFrame*)s->next_picture_ptr;
4287 s->next_picture_ptr= NULL;
4289 *data_size = sizeof(AVFrame);
4295 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
4296 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
4297 int i= ff_find_unused_picture(s, 0);
4298 s->current_picture_ptr= &s->picture[i];
4301 //for advanced profile we may need to parse and unescape data
4302 if (avctx->codec_id == CODEC_ID_VC1) {
4304 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
4306 if(IS_MARKER(AV_RB32(buf))){ /* frame starts with marker and needs to be parsed */
4307 uint8_t *dst = buf2, *start, *end, *next;
4311 for(start = buf, end = buf + buf_size; next < end; start = next){
4312 next = find_next_marker(start + 4, end);
4313 size = next - start - 4;
4314 if(size <= 0) continue;
4315 switch(AV_RB32(start)){
4316 case VC1_CODE_FRAME:
4317 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
4319 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
4320 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
4321 init_get_bits(&s->gb, buf2, buf_size2*8);
4322 decode_entry_point(avctx, &s->gb);
4324 case VC1_CODE_SLICE:
4325 av_log(avctx, AV_LOG_ERROR, "Sliced decoding is not implemented (yet)\n");
4330 }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
4333 divider = find_next_marker(buf, buf + buf_size);
4334 if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
4335 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
4339 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
4341 av_free(buf2);return -1;
4343 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
4345 init_get_bits(&s->gb, buf2, buf_size2*8);
4347 init_get_bits(&s->gb, buf, buf_size*8);
4348 // do parse frame header
4349 if(v->profile < PROFILE_ADVANCED) {
4350 if(vc1_parse_frame_header(v, &s->gb) == -1) {
4355 if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
4361 if(s->pict_type != I_TYPE && !v->res_rtm_flag){
4367 s->current_picture.pict_type= s->pict_type;
4368 s->current_picture.key_frame= s->pict_type == I_TYPE;
4370 /* skip B-frames if we don't have reference frames */
4371 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)){
4373 return -1;//buf_size;
4375 /* skip b frames if we are in a hurry */
4376 if(avctx->hurry_up && s->pict_type==B_TYPE) return -1;//buf_size;
4377 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
4378 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
4379 || avctx->skip_frame >= AVDISCARD_ALL) {
4383 /* skip everything if we are in a hurry>=5 */
4384 if(avctx->hurry_up>=5) {
4386 return -1;//buf_size;
4389 if(s->next_p_frame_damaged){
4390 if(s->pict_type==B_TYPE)
4393 s->next_p_frame_damaged=0;
4396 if(MPV_frame_start(s, avctx) < 0) {
4401 ff_er_frame_start(s);
4403 v->bits = buf_size * 8;
4404 vc1_decode_blocks(v);
4405 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
4406 // if(get_bits_count(&s->gb) > buf_size * 8)
4412 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
4413 assert(s->current_picture.pict_type == s->pict_type);
4414 if (s->pict_type == B_TYPE || s->low_delay) {
4415 *pict= *(AVFrame*)s->current_picture_ptr;
4416 } else if (s->last_picture_ptr != NULL) {
4417 *pict= *(AVFrame*)s->last_picture_ptr;
4420 if(s->last_picture_ptr || s->low_delay){
4421 *data_size = sizeof(AVFrame);
4422 ff_print_debug_info(s, pict);
4425 /* Return the Picture timestamp as the frame number */
4426 /* we substract 1 because it is added on utils.c */
4427 avctx->frame_number = s->picture_number - 1;
4434 /** Close a VC1/WMV3 decoder
4435 * @warning Initial try at using MpegEncContext stuff
4437 static int vc1_decode_end(AVCodecContext *avctx)
4439 VC1Context *v = avctx->priv_data;
4441 av_freep(&v->hrd_rate);
4442 av_freep(&v->hrd_buffer);
4443 MPV_common_end(&v->s);
4444 av_freep(&v->mv_type_mb_plane);
4445 av_freep(&v->direct_mb_plane);
4446 av_freep(&v->acpred_plane);
4447 av_freep(&v->over_flags_plane);
4448 av_freep(&v->mb_type_base);
4453 AVCodec vc1_decoder = {
4466 AVCodec wmv3_decoder = {