2 * VC-1 and WMV3 decoder
3 * Copyright (c) 2006 Konstantin Shishkov
4 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * VC-1 and WMV3 decoder
30 #include "mpegvideo.h"
32 #include "vc1acdata.h"
37 extern const uint32_t ff_table0_dc_lum
[120][2], ff_table1_dc_lum
[120][2];
38 extern const uint32_t ff_table0_dc_chroma
[120][2], ff_table1_dc_chroma
[120][2];
39 extern VLC ff_msmp4_dc_luma_vlc
[2], ff_msmp4_dc_chroma_vlc
[2];
40 #define MB_INTRA_VLC_BITS 9
41 extern VLC ff_msmp4_mb_i_vlc
;
42 extern const uint16_t ff_msmp4_mb_i_table
[64][2];
45 static const uint16_t table_mb_intra
[64][2];
48 /** Available Profiles */
53 PROFILE_COMPLEX
, ///< TODO: WMV9 specific
58 /** Sequence quantizer mode */
61 QUANT_FRAME_IMPLICIT
, ///< Implicitly specified at frame level
62 QUANT_FRAME_EXPLICIT
, ///< Explicitly specified at frame level
63 QUANT_NON_UNIFORM
, ///< Non-uniform quant used for all frames
64 QUANT_UNIFORM
///< Uniform quant used for all frames
68 /** Where quant can be changed */
72 DQPROFILE_DOUBLE_EDGES
,
73 DQPROFILE_SINGLE_EDGE
,
78 /** @name Where quant can be changed
89 /** Which pair of edges is quantized with ALTPQUANT */
92 DQDOUBLE_BEDGE_TOPLEFT
,
93 DQDOUBLE_BEDGE_TOPRIGHT
,
94 DQDOUBLE_BEDGE_BOTTOMRIGHT
,
95 DQDOUBLE_BEDGE_BOTTOMLEFT
99 /** MV modes for P frames */
102 MV_PMODE_1MV_HPEL_BILIN
,
106 MV_PMODE_INTENSITY_COMP
110 /** @name MV types for B frames */
115 BMV_TYPE_INTERPOLATED
= 3 //XXX: ??
119 /** @name Block types for P/B frames */
121 enum TransformTypes
{
125 TT_8X4
, //Both halves
128 TT_4X8
, //Both halves
133 /** Table for conversion between TTBLK and TTMB */
134 static const int ttblk_to_tt
[3][8] = {
135 { TT_8X4
, TT_4X8
, TT_8X8
, TT_4X4
, TT_8X4_TOP
, TT_8X4_BOTTOM
, TT_4X8_RIGHT
, TT_4X8_LEFT
},
136 { TT_8X8
, TT_4X8_RIGHT
, TT_4X8_LEFT
, TT_4X4
, TT_8X4
, TT_4X8
, TT_8X4_BOTTOM
, TT_8X4_TOP
},
137 { TT_8X8
, TT_4X8
, TT_4X4
, TT_8X4_BOTTOM
, TT_4X8_RIGHT
, TT_4X8_LEFT
, TT_8X4
, TT_8X4_TOP
}
140 /** MV P mode - the 5th element is only used for mode 1 */
141 static const uint8_t mv_pmode_table
[2][5] = {
142 { MV_PMODE_1MV_HPEL_BILIN
, MV_PMODE_1MV
, MV_PMODE_1MV_HPEL
, MV_PMODE_INTENSITY_COMP
, MV_PMODE_MIXED_MV
},
143 { MV_PMODE_1MV
, MV_PMODE_MIXED_MV
, MV_PMODE_1MV_HPEL
, MV_PMODE_INTENSITY_COMP
, MV_PMODE_1MV_HPEL_BILIN
}
146 /** One more frame type */
149 static const int fps_nr
[5] = { 24, 25, 30, 50, 60 },
150 fps_dr
[2] = { 1000, 1001 };
151 static const uint8_t pquant_table
[3][32] = {
152 { /* Implicit quantizer */
153 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12,
154 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
156 { /* Explicit quantizer, pquantizer uniform */
157 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
158 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
160 { /* Explicit quantizer, pquantizer non-uniform */
161 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
162 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
166 /** @name VC-1 VLC tables and defines
167 * @todo TODO move this into the context
170 #define VC1_BFRACTION_VLC_BITS 7
171 static VLC vc1_bfraction_vlc
;
172 #define VC1_IMODE_VLC_BITS 4
173 static VLC vc1_imode_vlc
;
174 #define VC1_NORM2_VLC_BITS 3
175 static VLC vc1_norm2_vlc
;
176 #define VC1_NORM6_VLC_BITS 9
177 static VLC vc1_norm6_vlc
;
178 /* Could be optimized, one table only needs 8 bits */
179 #define VC1_TTMB_VLC_BITS 9 //12
180 static VLC vc1_ttmb_vlc
[3];
181 #define VC1_MV_DIFF_VLC_BITS 9 //15
182 static VLC vc1_mv_diff_vlc
[4];
183 #define VC1_CBPCY_P_VLC_BITS 9 //14
184 static VLC vc1_cbpcy_p_vlc
[4];
185 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
186 static VLC vc1_4mv_block_pattern_vlc
[4];
187 #define VC1_TTBLK_VLC_BITS 5
188 static VLC vc1_ttblk_vlc
[3];
189 #define VC1_SUBBLKPAT_VLC_BITS 6
190 static VLC vc1_subblkpat_vlc
[3];
192 static VLC vc1_ac_coeff_table
[8];
196 CS_HIGH_MOT_INTRA
= 0,
207 * We mainly need data and is_raw, so this struct could be avoided
208 * to save a level of indirection; feel free to modify
209 * @fixme For now, stride=width
210 * @warning Data are bits, either 1 or 0
212 typedef struct BitPlane
{
213 uint8_t *data
; ///< Data buffer
214 int width
; ///< Width of the buffer
215 int stride
; ///< Stride of the buffer
216 int height
; ///< Plane height
217 uint8_t is_raw
; ///< Bit values must be read at MB level
221 /** Block data for DC/AC prediction
223 typedef struct Block
{
227 int16_t dcstep
, step
;
231 * @fixme Change size wherever another size is more efficient
232 * Many members are only used for Advanced Profile
234 typedef struct VC1Context
{
239 /** Simple/Main Profile sequence header */
241 int res_sm
; ///< reserved, 2b
242 int res_x8
; ///< reserved
243 int multires
; ///< frame-level RESPIC syntax element present
244 int res_fasttx
; ///< reserved, always 1
245 int res_transtab
; ///< reserved, always 0
246 int rangered
; ///< RANGEREDFRM (range reduction) syntax element present
248 int res_rtm_flag
; ///< reserved, set to 1
249 int reserved
; ///< reserved
252 /** Advanced Profile */
254 int level
; ///< 3bits, for Advanced/Simple Profile, provided by TS layer
255 int chromaformat
; ///< 2bits, 2=4:2:0, only defined
256 int postprocflag
; ///< Per-frame processing suggestion flag present
257 int broadcast
; ///< TFF/RFF present
258 int interlace
; ///< Progressive/interlaced (RPTFTM syntax element)
259 int tfcntrflag
; ///< TFCNTR present
260 int panscanflag
; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
261 int extended_dmv
; ///< Additional extended dmv range at P/B frame-level
262 int color_prim
; ///< 8bits, chroma coordinates of the color primaries
263 int transfer_char
; ///< 8bits, Opto-electronic transfer characteristics
264 int matrix_coef
; ///< 8bits, Color primaries->YCbCr transform matrix
265 int hrd_param_flag
; ///< Presence of Hypothetical Reference
266 ///< Decoder parameters
269 /** Sequence header data for all Profiles
270 * TODO: choose between ints, uint8_ts and monobit flags
273 int profile
; ///< 2bits, Profile
274 int frmrtq_postproc
; ///< 3bits,
275 int bitrtq_postproc
; ///< 5bits, quantized framerate-based postprocessing strength
276 int fastuvmc
; ///< Rounding of qpel vector to hpel ? (not in Simple)
277 int extended_mv
; ///< Ext MV in P/B (not in Simple)
278 int dquant
; ///< How qscale varies with MBs, 2bits (not in Simple)
279 int vstransform
; ///< variable-size [48]x[48] transform type + info
280 int overlap
; ///< overlapped transforms in use
281 int quantizer_mode
; ///< 2bits, quantizer mode used for sequence, see QUANT_*
282 int finterpflag
; ///< INTERPFRM present
285 /** Frame decoding info for all profiles */
287 uint8_t mv_mode
; ///< MV coding monde
288 uint8_t mv_mode2
; ///< Secondary MV coding mode (B frames)
289 int k_x
; ///< Number of bits for MVs (depends on MV range)
290 int k_y
; ///< Number of bits for MVs (depends on MV range)
291 int range_x
, range_y
; ///< MV range
292 uint8_t pq
, altpq
; ///< Current/alternate frame quantizer scale
293 /** pquant parameters */
300 /** AC coding set indexes
301 * @see 8.1.1.10, p(1)10
304 int c_ac_table_index
; ///< Chroma index from ACFRM element
305 int y_ac_table_index
; ///< Luma index from AC2FRM element
307 int ttfrm
; ///< Transform type info present at frame level
308 uint8_t ttmbf
; ///< Transform type flag
309 int ttmb
; ///< Transform type
310 uint8_t ttblk4x4
; ///< Value of ttblk which indicates a 4x4 transform
311 int codingset
; ///< index of current table set from 11.8 to use for luma block decoding
312 int codingset2
; ///< index of current table set from 11.8 to use for chroma block decoding
313 int pqindex
; ///< raw pqindex used in coding set selection
316 /** Luma compensation parameters */
321 int16_t bfraction
; ///< Relative position % anchors=> how to scale MVs
322 uint8_t halfpq
; ///< Uniform quant over image and qp+.5
323 uint8_t respic
; ///< Frame-level flag for resized images
324 int buffer_fullness
; ///< HRD info
326 * -# 0 -> [-64n 63.f] x [-32, 31.f]
327 * -# 1 -> [-128, 127.f] x [-64, 63.f]
328 * -# 2 -> [-512, 511.f] x [-128, 127.f]
329 * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
332 uint8_t pquantizer
; ///< Uniform (over sequence) quantizer in use
333 uint8_t *previous_line_cbpcy
; ///< To use for predicted CBPCY
334 VLC
*cbpcy_vlc
; ///< CBPCY VLC table
335 int tt_index
; ///< Index for Transform Type tables
336 BitPlane mv_type_mb_plane
; ///< bitplane for mv_type == (4MV)
337 BitPlane skip_mb_plane
; ///< bitplane for skipped MBs
338 BitPlane direct_mb_plane
; ///< bitplane for "direct" MBs
340 /** Frame decoding info for S/M profiles only */
342 uint8_t rangeredfrm
; ///< out_sample = CLIP((in_sample-128)*2+128)
346 /** Frame decoding info for Advanced profile */
348 uint8_t fcm
; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
349 uint8_t numpanscanwin
;
351 uint8_t rptfrm
, tff
, rff
;
354 uint16_t bottomrightx
;
355 uint16_t bottomrighty
;
358 int hrd_num_leaky_buckets
;
359 uint8_t bit_rate_exponent
;
360 uint8_t buffer_size_exponent
;
361 BitPlane ac_pred_plane
; ///< AC prediction flags bitplane
362 BitPlane over_flags_plane
; ///< Overflags bitplane
364 uint16_t *hrd_rate
, *hrd_buffer
;
365 uint8_t *hrd_fullness
;
366 uint8_t range_mapy_flag
;
367 uint8_t range_mapuv_flag
;
374 * Get unary code of limited length
375 * @fixme FIXME Slow and ugly
376 * @param gb GetBitContext
377 * @param[in] stop The bitstop value (unary code of 1's or 0's)
378 * @param[in] len Maximum length
379 * @return Unary length/index
381 static int get_prefix(GetBitContext
*gb
, int stop
, int len
)
386 for(i
= 0; i
< len
&& get_bits1(gb
) != stop
; i
++);
388 /* int i = 0, tmp = !stop;
390 while (i != len && tmp != stop)
392 tmp = get_bits(gb, 1);
395 if (i == len && tmp != stop) return len+1;
402 UPDATE_CACHE(re
, gb
);
403 buf
=GET_CACHE(re
, gb
); //Still not sure
404 if (stop
) buf
= ~buf
;
406 log
= av_log2(-buf
); //FIXME: -?
408 LAST_SKIP_BITS(re
, gb
, log
+1);
409 CLOSE_READER(re
, gb
);
413 LAST_SKIP_BITS(re
, gb
, limit
);
414 CLOSE_READER(re
, gb
);
419 static inline int decode210(GetBitContext
*gb
){
425 return 2 - get_bits1(gb
);
429 * Init VC-1 specific tables and VC1Context members
430 * @param v The VC1Context to initialize
433 static int vc1_init_common(VC1Context
*v
)
438 /* Set the bit planes */
439 v
->mv_type_mb_plane
= (struct BitPlane
) { NULL
, 0, 0, 0 };
440 v
->direct_mb_plane
= (struct BitPlane
) { NULL
, 0, 0, 0 };
441 v
->skip_mb_plane
= (struct BitPlane
) { NULL
, 0, 0, 0 };
442 v
->ac_pred_plane
= v
->over_flags_plane
= (struct BitPlane
) { NULL
, 0, 0, 0 };
443 v
->hrd_rate
= v
->hrd_buffer
= NULL
;
449 init_vlc(&vc1_bfraction_vlc
, VC1_BFRACTION_VLC_BITS
, 23,
450 vc1_bfraction_bits
, 1, 1,
451 vc1_bfraction_codes
, 1, 1, 1);
452 init_vlc(&vc1_norm2_vlc
, VC1_NORM2_VLC_BITS
, 4,
453 vc1_norm2_bits
, 1, 1,
454 vc1_norm2_codes
, 1, 1, 1);
455 init_vlc(&vc1_norm6_vlc
, VC1_NORM6_VLC_BITS
, 64,
456 vc1_norm6_bits
, 1, 1,
457 vc1_norm6_codes
, 2, 2, 1);
458 init_vlc(&vc1_imode_vlc
, VC1_IMODE_VLC_BITS
, 7,
459 vc1_imode_bits
, 1, 1,
460 vc1_imode_codes
, 1, 1, 1);
463 init_vlc(&vc1_ttmb_vlc
[i
], VC1_TTMB_VLC_BITS
, 16,
464 vc1_ttmb_bits
[i
], 1, 1,
465 vc1_ttmb_codes
[i
], 2, 2, 1);
466 init_vlc(&vc1_ttblk_vlc
[i
], VC1_TTBLK_VLC_BITS
, 8,
467 vc1_ttblk_bits
[i
], 1, 1,
468 vc1_ttblk_codes
[i
], 1, 1, 1);
469 init_vlc(&vc1_subblkpat_vlc
[i
], VC1_SUBBLKPAT_VLC_BITS
, 15,
470 vc1_subblkpat_bits
[i
], 1, 1,
471 vc1_subblkpat_codes
[i
], 1, 1, 1);
475 init_vlc(&vc1_4mv_block_pattern_vlc
[i
], VC1_4MV_BLOCK_PATTERN_VLC_BITS
, 16,
476 vc1_4mv_block_pattern_bits
[i
], 1, 1,
477 vc1_4mv_block_pattern_codes
[i
], 1, 1, 1);
478 init_vlc(&vc1_cbpcy_p_vlc
[i
], VC1_CBPCY_P_VLC_BITS
, 64,
479 vc1_cbpcy_p_bits
[i
], 1, 1,
480 vc1_cbpcy_p_codes
[i
], 2, 2, 1);
481 init_vlc(&vc1_mv_diff_vlc
[i
], VC1_MV_DIFF_VLC_BITS
, 73,
482 vc1_mv_diff_bits
[i
], 1, 1,
483 vc1_mv_diff_codes
[i
], 2, 2, 1);
486 init_vlc(&vc1_ac_coeff_table
[i
], AC_VLC_BITS
, vc1_ac_sizes
[i
],
487 &vc1_ac_tables
[i
][0][1], 8, 4,
488 &vc1_ac_tables
[i
][0][0], 8, 4, 1);
489 init_vlc(&ff_msmp4_mb_i_vlc
, MB_INTRA_VLC_BITS
, 64,
490 &ff_msmp4_mb_i_table
[0][1], 4, 2,
491 &ff_msmp4_mb_i_table
[0][0], 4, 2, 1);
496 v
->mvrange
= 0; /* 7.1.1.18, p80 */
501 /***********************************************************************/
503 * @defgroup bitplane VC9 Bitplane decoding
508 /** @addtogroup bitplane
521 /** @} */ //imode defines
523 /** Allocate the buffer from a bitplane, given its dimensions
524 * @param bp Bitplane which buffer is to allocate
525 * @param[in] width Width of the buffer
526 * @param[in] height Height of the buffer
528 * @todo TODO: Take into account stride
529 * @todo TODO: Allow use of external buffers ?
531 static int alloc_bitplane(BitPlane
*bp
, int width
, int height
)
533 if (!bp
|| bp
->width
<0 || bp
->height
<0) return -1;
534 bp
->data
= (uint8_t*)av_malloc(width
*height
);
535 if (!bp
->data
) return -1;
536 bp
->width
= bp
->stride
= width
;
541 /** Free the bitplane's buffer
542 * @param bp Bitplane which buffer is to free
544 static void free_bitplane(BitPlane
*bp
)
546 bp
->width
= bp
->stride
= bp
->height
= 0;
547 if (bp
->data
) av_freep(&bp
->data
);
550 /** Decode rows by checking if they are skipped
551 * @param plane Buffer to store decoded bits
552 * @param[in] width Width of this buffer
553 * @param[in] height Height of this buffer
554 * @param[in] stride of this buffer
556 static void decode_rowskip(uint8_t* plane
, int width
, int height
, int stride
, GetBitContext
*gb
){
559 for (y
=0; y
<height
; y
++){
560 if (!get_bits(gb
, 1)) //rowskip
561 memset(plane
, 0, width
);
563 for (x
=0; x
<width
; x
++)
564 plane
[x
] = get_bits(gb
, 1);
569 /** Decode columns by checking if they are skipped
570 * @param plane Buffer to store decoded bits
571 * @param[in] width Width of this buffer
572 * @param[in] height Height of this buffer
573 * @param[in] stride of this buffer
574 * @fixme FIXME: Optimize
576 static void decode_colskip(uint8_t* plane
, int width
, int height
, int stride
, GetBitContext
*gb
){
579 for (x
=0; x
<width
; x
++){
580 if (!get_bits(gb
, 1)) //colskip
581 for (y
=0; y
<height
; y
++)
584 for (y
=0; y
<height
; y
++)
585 plane
[y
*stride
] = get_bits(gb
, 1);
590 /** Decode a bitplane's bits
591 * @param bp Bitplane where to store the decode bits
592 * @param v VC-1 context for bit reading and logging
594 * @fixme FIXME: Optimize
595 * @todo TODO: Decide if a struct is needed
597 static int bitplane_decoding(BitPlane
*bp
, VC1Context
*v
)
599 GetBitContext
*gb
= &v
->s
.gb
;
601 int imode
, x
, y
, code
, offset
;
602 uint8_t invert
, *planep
= bp
->data
;
604 invert
= get_bits(gb
, 1);
605 imode
= get_vlc2(gb
, vc1_imode_vlc
.table
, VC1_IMODE_VLC_BITS
, 1);
611 //Data is actually read in the MB layer (same for all tests == "raw")
612 bp
->is_raw
= 1; //invert ignored
616 if ((bp
->height
* bp
->width
) & 1)
618 *planep
++ = get_bits(gb
, 1);
622 // decode bitplane as one long line
623 for (y
= offset
; y
< bp
->height
* bp
->width
; y
+= 2) {
624 code
= get_vlc2(gb
, vc1_norm2_vlc
.table
, VC1_NORM2_VLC_BITS
, 1);
625 *planep
++ = code
& 1;
627 if(offset
== bp
->width
) {
629 planep
+= bp
->stride
- bp
->width
;
631 *planep
++ = code
>> 1;
633 if(offset
== bp
->width
) {
635 planep
+= bp
->stride
- bp
->width
;
641 if(!(bp
->height
% 3) && (bp
->width
% 3)) { // use 2x3 decoding
642 for(y
= 0; y
< bp
->height
; y
+= 3) {
643 for(x
= bp
->width
& 1; x
< bp
->width
; x
+= 2) {
644 code
= get_vlc2(gb
, vc1_norm6_vlc
.table
, VC1_NORM6_VLC_BITS
, 2);
646 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "invalid NORM-6 VLC\n");
649 planep
[x
+ 0] = (code
>> 0) & 1;
650 planep
[x
+ 1] = (code
>> 1) & 1;
651 planep
[x
+ 0 + bp
->stride
] = (code
>> 2) & 1;
652 planep
[x
+ 1 + bp
->stride
] = (code
>> 3) & 1;
653 planep
[x
+ 0 + bp
->stride
* 2] = (code
>> 4) & 1;
654 planep
[x
+ 1 + bp
->stride
* 2] = (code
>> 5) & 1;
656 planep
+= bp
->stride
* 3;
658 if(bp
->width
& 1) decode_colskip(bp
->data
, 1, bp
->height
, bp
->stride
, &v
->s
.gb
);
660 for(y
= bp
->height
& 1; y
< bp
->height
; y
+= 2) {
661 for(x
= bp
->width
% 3; x
< bp
->width
; x
+= 3) {
662 code
= get_vlc2(gb
, vc1_norm6_vlc
.table
, VC1_NORM6_VLC_BITS
, 2);
664 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "invalid NORM-6 VLC\n");
667 planep
[x
+ 0] = (code
>> 0) & 1;
668 planep
[x
+ 1] = (code
>> 1) & 1;
669 planep
[x
+ 2] = (code
>> 2) & 1;
670 planep
[x
+ 0 + bp
->stride
] = (code
>> 3) & 1;
671 planep
[x
+ 1 + bp
->stride
] = (code
>> 4) & 1;
672 planep
[x
+ 2 + bp
->stride
] = (code
>> 5) & 1;
674 planep
+= bp
->stride
* 2;
677 if(x
) decode_colskip(bp
->data
, x
, bp
->height
, bp
->stride
, &v
->s
.gb
);
678 if(bp
->height
& 1) decode_rowskip(bp
->data
+x
, bp
->width
- x
, bp
->height
& 1, bp
->stride
, &v
->s
.gb
);
682 decode_rowskip(bp
->data
, bp
->width
, bp
->height
, bp
->stride
, &v
->s
.gb
);
685 decode_colskip(bp
->data
, bp
->width
, bp
->height
, bp
->stride
, &v
->s
.gb
);
690 /* Applying diff operator */
691 if (imode
== IMODE_DIFF2
|| imode
== IMODE_DIFF6
)
695 for (x
=1; x
<bp
->width
; x
++)
696 planep
[x
] ^= planep
[x
-1];
697 for (y
=1; y
<bp
->height
; y
++)
699 planep
+= bp
->stride
;
700 planep
[0] ^= planep
[-bp
->stride
];
701 for (x
=1; x
<bp
->width
; x
++)
703 if (planep
[x
-1] != planep
[x
-bp
->stride
]) planep
[x
] ^= invert
;
704 else planep
[x
] ^= planep
[x
-1];
711 for (x
=0; x
<bp
->width
*bp
->height
; x
++) planep
[x
] = !planep
[x
]; //FIXME stride
713 return (imode
<<1) + invert
;
715 /** @} */ //Bitplane group
717 /***********************************************************************/
718 /** VOP Dquant decoding
719 * @param v VC-1 Context
721 static int vop_dquant_decoding(VC1Context
*v
)
723 GetBitContext
*gb
= &v
->s
.gb
;
729 pqdiff
= get_bits(gb
, 3);
730 if (pqdiff
== 7) v
->altpq
= get_bits(gb
, 5);
731 else v
->altpq
= v
->pq
+ pqdiff
+ 1;
735 v
->dquantfrm
= get_bits(gb
, 1);
738 v
->dqprofile
= get_bits(gb
, 2);
739 switch (v
->dqprofile
)
741 case DQPROFILE_SINGLE_EDGE
:
742 case DQPROFILE_DOUBLE_EDGES
:
743 v
->dqsbedge
= get_bits(gb
, 2);
745 case DQPROFILE_ALL_MBS
:
746 v
->dqbilevel
= get_bits(gb
, 1);
747 default: break; //Forbidden ?
749 if (!v
->dqbilevel
|| v
->dqprofile
!= DQPROFILE_ALL_MBS
)
751 pqdiff
= get_bits(gb
, 3);
752 if (pqdiff
== 7) v
->altpq
= get_bits(gb
, 5);
753 else v
->altpq
= v
->pq
+ pqdiff
+ 1;
761 /** Do inverse transform
763 static void vc1_inv_trans(DCTELEM block
[64], int M
, int N
)
766 register int t1
,t2
,t3
,t4
,t5
,t6
,t7
,t8
;
772 for(i
= 0; i
< N
; i
++){
773 t1
= 17 * (src
[0] + src
[2]);
774 t2
= 17 * (src
[0] - src
[2]);
780 dst
[0] = (t1
+ t3
+ t6
+ 4) >> 3;
781 dst
[1] = (t2
- t4
+ t5
+ 4) >> 3;
782 dst
[2] = (t2
+ t4
- t5
+ 4) >> 3;
783 dst
[3] = (t1
- t3
- t6
+ 4) >> 3;
789 for(i
= 0; i
< N
; i
++){
790 t1
= 12 * (src
[0] + src
[4]);
791 t2
= 12 * (src
[0] - src
[4]);
792 t3
= 16 * src
[2] + 6 * src
[6];
793 t4
= 6 * src
[2] - 16 * src
[6];
800 t1
= 16 * src
[1] + 15 * src
[3] + 9 * src
[5] + 4 * src
[7];
801 t2
= 15 * src
[1] - 4 * src
[3] - 16 * src
[5] - 9 * src
[7];
802 t3
= 9 * src
[1] - 16 * src
[3] + 4 * src
[5] + 15 * src
[7];
803 t4
= 4 * src
[1] - 9 * src
[3] + 15 * src
[5] - 16 * src
[7];
805 dst
[0] = (t5
+ t1
+ 4) >> 3;
806 dst
[1] = (t6
+ t2
+ 4) >> 3;
807 dst
[2] = (t7
+ t3
+ 4) >> 3;
808 dst
[3] = (t8
+ t4
+ 4) >> 3;
809 dst
[4] = (t8
- t4
+ 4) >> 3;
810 dst
[5] = (t7
- t3
+ 4) >> 3;
811 dst
[6] = (t6
- t2
+ 4) >> 3;
812 dst
[7] = (t5
- t1
+ 4) >> 3;
822 for(i
= 0; i
< M
; i
++){
823 t1
= 17 * (src
[ 0] + src
[16]);
824 t2
= 17 * (src
[ 0] - src
[16]);
830 dst
[ 0] = (t1
+ t3
+ t6
+ 64) >> 7;
831 dst
[ 8] = (t2
- t4
+ t5
+ 64) >> 7;
832 dst
[16] = (t2
+ t4
- t5
+ 64) >> 7;
833 dst
[24] = (t1
- t3
- t6
+ 64) >> 7;
839 for(i
= 0; i
< M
; i
++){
840 t1
= 12 * (src
[ 0] + src
[32]);
841 t2
= 12 * (src
[ 0] - src
[32]);
842 t3
= 16 * src
[16] + 6 * src
[48];
843 t4
= 6 * src
[16] - 16 * src
[48];
850 t1
= 16 * src
[ 8] + 15 * src
[24] + 9 * src
[40] + 4 * src
[56];
851 t2
= 15 * src
[ 8] - 4 * src
[24] - 16 * src
[40] - 9 * src
[56];
852 t3
= 9 * src
[ 8] - 16 * src
[24] + 4 * src
[40] + 15 * src
[56];
853 t4
= 4 * src
[ 8] - 9 * src
[24] + 15 * src
[40] - 16 * src
[56];
855 dst
[ 0] = (t5
+ t1
+ 64) >> 7;
856 dst
[ 8] = (t6
+ t2
+ 64) >> 7;
857 dst
[16] = (t7
+ t3
+ 64) >> 7;
858 dst
[24] = (t8
+ t4
+ 64) >> 7;
859 dst
[32] = (t8
- t4
+ 64 + 1) >> 7;
860 dst
[40] = (t7
- t3
+ 64 + 1) >> 7;
861 dst
[48] = (t6
- t2
+ 64 + 1) >> 7;
862 dst
[56] = (t5
- t1
+ 64 + 1) >> 7;
870 /** Apply overlap transform
872 * @todo move to DSPContext
874 static void vc1_overlap_block(MpegEncContext
*s
, DCTELEM block
[64], int n
, int do_hor
, int do_vert
)
883 for(i
= 0; i
< 64; i
++)
888 /** Put block onto picture
889 * @todo move to DSPContext
891 static void vc1_put_block(VC1Context
*v
, DCTELEM block
[6][64])
895 DSPContext
*dsp
= &v
->s
.dsp
;
897 ys
= v
->s
.current_picture
.linesize
[0];
898 us
= v
->s
.current_picture
.linesize
[1];
899 vs
= v
->s
.current_picture
.linesize
[2];
902 dsp
->put_pixels_clamped(block
[0], Y
, ys
);
903 dsp
->put_pixels_clamped(block
[1], Y
+ 8, ys
);
905 dsp
->put_pixels_clamped(block
[2], Y
, ys
);
906 dsp
->put_pixels_clamped(block
[3], Y
+ 8, ys
);
908 dsp
->put_pixels_clamped(block
[4], v
->s
.dest
[1], us
);
909 dsp
->put_pixels_clamped(block
[5], v
->s
.dest
[2], vs
);
912 /** Do motion compensation over 1 macroblock
913 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
915 static void vc1_mc_1mv(VC1Context
*v
)
917 MpegEncContext
*s
= &v
->s
;
918 DSPContext
*dsp
= &v
->s
.dsp
;
919 uint8_t *srcY
, *srcU
, *srcV
;
920 int dxy
, mx
, my
, src_x
, src_y
;
921 int width
= s
->mb_width
* 16, height
= s
->mb_height
* 16;
923 if(!v
->s
.last_picture
.data
[0])return;
925 mx
= s
->mv
[0][0][0] >> s
->mspel
;
926 my
= s
->mv
[0][0][1] >> s
->mspel
;
927 srcY
= s
->last_picture
.data
[0];
928 srcU
= s
->last_picture
.data
[1];
929 srcV
= s
->last_picture
.data
[2];
931 if(s
->mspel
) { // hpel mc
932 dxy
= ((my
& 1) << 1) | (mx
& 1);
933 src_x
= s
->mb_x
* 16 + (mx
>> 1);
934 src_y
= s
->mb_y
* 16 + (my
>> 1);
935 /* src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
938 src_y = clip(src_y, -16, height);
941 srcY
+= src_y
* s
->linesize
+ src_x
;
942 srcU
+= (src_y
>> 1) * s
->uvlinesize
+ (src_x
>> 1);
943 srcV
+= (src_y
>> 1) * s
->uvlinesize
+ (src_x
>> 1);
945 if((unsigned)src_x
> s
->h_edge_pos
- (mx
&1) - 16
946 || (unsigned)src_y
> s
->v_edge_pos
- (my
&1) - 16){
947 uint8_t *uvbuf
= s
->edge_emu_buffer
+ 18 * s
->linesize
;
949 ff_emulated_edge_mc(s
->edge_emu_buffer
, srcY
, s
->linesize
, 16+1, 16+1,
950 src_x
, src_y
, s
->h_edge_pos
, s
->v_edge_pos
);
951 srcY
= s
->edge_emu_buffer
;
952 ff_emulated_edge_mc(uvbuf
, srcU
, s
->uvlinesize
, 8+1, 8+1,
953 src_x
>> 1, src_y
>> 1, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
954 ff_emulated_edge_mc(uvbuf
+ 16, srcV
, s
->uvlinesize
, 8+1, 8+1,
955 src_x
>> 1, src_y
>> 1, s
->h_edge_pos
>> 1, s
->v_edge_pos
>> 1);
959 dsp
->put_no_rnd_pixels_tab
[0][dxy
](s
->dest
[0], srcY
, s
->linesize
, 16);
960 dsp
->put_no_rnd_pixels_tab
[1][0](s
->dest
[1], srcU
, s
->uvlinesize
, 8);
961 dsp
->put_no_rnd_pixels_tab
[1][0](s
->dest
[2], srcV
, s
->uvlinesize
, 8);
963 int motion_x
= mx
, motion_y
= my
, uvdxy
, uvsrc_x
, uvsrc_y
;
964 dxy
= ((motion_y
& 3) << 2) | (motion_x
& 3);
965 src_x
= s
->mb_x
* 16 + (mx
>> 2);
966 src_y
= s
->mb_y
* 16 + (my
>> 2);
974 uvdxy
= (mx
&1) | ((my
&1)<<1);
978 uvsrc_x
= s
->mb_x
* 8 + mx
;
979 uvsrc_y
= s
->mb_y
* 8 + my
;
981 srcY
= s
->last_picture
.data
[0] + src_y
* s
->linesize
+ src_x
;
982 srcU
= s
->last_picture
.data
[1] + uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
983 srcV
= s
->last_picture
.data
[2] + uvsrc_y
* s
->uvlinesize
+ uvsrc_x
;
985 if( (unsigned)src_x
> s
->h_edge_pos
- (motion_x
&3) - 16
986 || (unsigned)src_y
> s
->v_edge_pos
- (motion_y
&3) - 16 ){
987 uint8_t *uvbuf
= s
->edge_emu_buffer
+ 18*s
->linesize
;
988 ff_emulated_edge_mc(s
->edge_emu_buffer
, srcY
, s
->linesize
, 17, 17,
989 src_x
, src_y
, s
->h_edge_pos
, s
->v_edge_pos
);
990 srcY
= s
->edge_emu_buffer
;
991 ff_emulated_edge_mc(uvbuf
, srcU
, s
->uvlinesize
, 9, 9,
992 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
993 ff_emulated_edge_mc(uvbuf
+ 16, srcV
, s
->uvlinesize
, 9, 9,
994 uvsrc_x
, uvsrc_y
, s
->h_edge_pos
>>1, s
->v_edge_pos
>>1);
999 dsp
->put_no_rnd_qpel_pixels_tab
[0][dxy
](s
->dest
[0], srcY
, s
->linesize
);
1000 dsp
->put_no_rnd_pixels_tab
[1][uvdxy
](s
->dest
[1], srcU
, s
->uvlinesize
, 8);
1001 dsp
->put_no_rnd_pixels_tab
[1][uvdxy
](s
->dest
[2], srcV
, s
->uvlinesize
, 8);
1006 * Decode Simple/Main Profiles sequence header
1007 * @see Figure 7-8, p16-17
1008 * @param avctx Codec context
1009 * @param gb GetBit context initialized from Codec context extra_data
1012 static int decode_sequence_header(AVCodecContext
*avctx
, GetBitContext
*gb
)
1014 VC1Context
*v
= avctx
->priv_data
;
1016 av_log(avctx
, AV_LOG_INFO
, "Header: %0X\n", show_bits(gb
, 32));
1017 v
->profile
= get_bits(gb
, 2);
1018 if (v
->profile
== 2)
1020 av_log(avctx
, AV_LOG_ERROR
, "Profile value 2 is forbidden (and WMV3 Complex Profile is unsupported)\n");
1024 if (v
->profile
== PROFILE_ADVANCED
)
1026 v
->level
= get_bits(gb
, 3);
1029 av_log(avctx
, AV_LOG_ERROR
, "Reserved LEVEL %i\n",v
->level
);
1031 v
->chromaformat
= get_bits(gb
, 2);
1032 if (v
->chromaformat
!= 1)
1034 av_log(avctx
, AV_LOG_ERROR
,
1035 "Only 4:2:0 chroma format supported\n");
1041 v
->res_sm
= get_bits(gb
, 2); //reserved
1044 av_log(avctx
, AV_LOG_ERROR
,
1045 "Reserved RES_SM=%i is forbidden\n", v
->res_sm
);
1051 v
->frmrtq_postproc
= get_bits(gb
, 3); //common
1052 // (bitrate-32kbps)/64kbps
1053 v
->bitrtq_postproc
= get_bits(gb
, 5); //common
1054 v
->s
.loop_filter
= get_bits(gb
, 1); //common
1055 if(v
->s
.loop_filter
== 1 && v
->profile
== PROFILE_SIMPLE
)
1057 av_log(avctx
, AV_LOG_ERROR
,
1058 "LOOPFILTER shell not be enabled in simple profile\n");
1061 if (v
->profile
< PROFILE_ADVANCED
)
1063 v
->res_x8
= get_bits(gb
, 1); //reserved
1066 av_log(avctx
, AV_LOG_ERROR
,
1067 "1 for reserved RES_X8 is forbidden\n");
1070 v
->multires
= get_bits(gb
, 1);
1071 v
->res_fasttx
= get_bits(gb
, 1);
1074 av_log(avctx
, AV_LOG_ERROR
,
1075 "0 for reserved RES_FASTTX is forbidden\n");
1080 v
->fastuvmc
= get_bits(gb
, 1); //common
1081 if (!v
->profile
&& !v
->fastuvmc
)
1083 av_log(avctx
, AV_LOG_ERROR
,
1084 "FASTUVMC unavailable in Simple Profile\n");
1087 v
->extended_mv
= get_bits(gb
, 1); //common
1088 if (!v
->profile
&& v
->extended_mv
)
1090 av_log(avctx
, AV_LOG_ERROR
,
1091 "Extended MVs unavailable in Simple Profile\n");
1094 v
->dquant
= get_bits(gb
, 2); //common
1095 v
->vstransform
= get_bits(gb
, 1); //common
1097 if (v
->profile
< PROFILE_ADVANCED
)
1099 v
->res_transtab
= get_bits(gb
, 1);
1100 if (v
->res_transtab
)
1102 av_log(avctx
, AV_LOG_ERROR
,
1103 "1 for reserved RES_TRANSTAB is forbidden\n");
1108 v
->overlap
= get_bits(gb
, 1); //common
1110 if (v
->profile
< PROFILE_ADVANCED
)
1112 v
->s
.resync_marker
= get_bits(gb
, 1);
1113 v
->rangered
= get_bits(gb
, 1);
1114 if (v
->rangered
&& v
->profile
== PROFILE_SIMPLE
)
1116 av_log(avctx
, AV_LOG_INFO
,
1117 "RANGERED should be set to 0 in simple profile\n");
1121 v
->s
.max_b_frames
= avctx
->max_b_frames
= get_bits(gb
, 3); //common
1122 v
->quantizer_mode
= get_bits(gb
, 2); //common
1124 if (v
->profile
< PROFILE_ADVANCED
)
1126 v
->finterpflag
= get_bits(gb
, 1); //common
1127 v
->res_rtm_flag
= get_bits(gb
, 1); //reserved
1128 if (!v
->res_rtm_flag
)
1130 av_log(avctx
, AV_LOG_ERROR
,
1131 "0 for reserved RES_RTM_FLAG is forbidden\n");
1134 av_log(avctx
, AV_LOG_DEBUG
,
1135 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1136 "LoopFilter=%i, MultiRes=%i, FastUVMV=%i, Extended MV=%i\n"
1137 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
1138 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
1139 v
->profile
, v
->frmrtq_postproc
, v
->bitrtq_postproc
,
1140 v
->s
.loop_filter
, v
->multires
, v
->fastuvmc
, v
->extended_mv
,
1141 v
->rangered
, v
->vstransform
, v
->overlap
, v
->s
.resync_marker
,
1142 v
->dquant
, v
->quantizer_mode
, avctx
->max_b_frames
1150 static int vc1_parse_frame_header(VC1Context
*v
, GetBitContext
* gb
)
1152 int pqindex
, lowquant
, status
;
1154 if(v
->finterpflag
) v
->interpfrm
= get_bits(gb
, 1);
1155 skip_bits(gb
, 2); //framecnt unused
1157 if (v
->rangered
) v
->rangeredfrm
= get_bits(gb
, 1);
1158 v
->s
.pict_type
= get_bits(gb
, 1);
1159 if (v
->s
.avctx
->max_b_frames
) {
1160 if (!v
->s
.pict_type
) {
1161 if (get_bits(gb
, 1)) v
->s
.pict_type
= I_TYPE
;
1162 else v
->s
.pict_type
= B_TYPE
;
1163 } else v
->s
.pict_type
= P_TYPE
;
1164 } else v
->s
.pict_type
= v
->s
.pict_type ? P_TYPE
: I_TYPE
;
1166 if(v
->s
.pict_type
== I_TYPE
)
1167 get_bits(gb
, 7); // skip buffer fullness
1169 /* Quantizer stuff */
1170 pqindex
= get_bits(gb
, 5);
1171 if (v
->quantizer_mode
== QUANT_FRAME_IMPLICIT
)
1172 v
->pq
= pquant_table
[0][pqindex
];
1174 v
->pq
= pquant_table
[v
->quantizer_mode
-1][pqindex
];
1176 if (v
->quantizer_mode
== QUANT_FRAME_IMPLICIT
)
1177 v
->pquantizer
= pqindex
< 9;
1178 if (v
->quantizer_mode
== QUANT_UNIFORM
|| v
->quantizer_mode
== QUANT_NON_UNIFORM
)
1179 v
->pquantizer
= v
->quantizer_mode
== QUANT_UNIFORM
;
1180 v
->pqindex
= pqindex
;
1181 if (pqindex
< 9) v
->halfpq
= get_bits(gb
, 1);
1183 if (v
->quantizer_mode
== QUANT_FRAME_EXPLICIT
)
1184 v
->pquantizer
= get_bits(gb
, 1);
1187 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
1188 // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
1190 //TODO: complete parsing for P/B/BI frames
1191 switch(v
->s
.pict_type
) {
1193 if (v
->pq
< 5) v
->tt_index
= 0;
1194 else if(v
->pq
< 13) v
->tt_index
= 1;
1195 else v
->tt_index
= 2;
1197 if (v
->extended_mv
== 1) v
->mvrange
= get_prefix(gb
, 0, 3);
1198 v
->k_x
= v
->mvrange
+ 9 + (v
->mvrange
>> 1); //k_x can be 9 10 12 13
1199 v
->k_y
= v
->mvrange
+ 8; //k_y can be 8 9 10 11
1200 v
->range_x
= 1 << (v
->k_x
- 1);
1201 v
->range_y
= 1 << (v
->k_y
- 1);
1202 if (v
->profile
== PROFILE_ADVANCED
)
1204 if (v
->postprocflag
) v
->postproc
= get_bits(gb
, 1);
1207 if (v
->multires
) v
->respic
= get_bits(gb
, 2);
1208 lowquant
= (v
->pq
> 12) ?
0 : 1;
1209 v
->mv_mode
= mv_pmode_table
[lowquant
][get_prefix(gb
, 1, 4)];
1210 if (v
->mv_mode
== MV_PMODE_INTENSITY_COMP
)
1212 v
->mv_mode2
= mv_pmode_table
[lowquant
][get_prefix(gb
, 1, 3)];
1213 v
->lumscale
= get_bits(gb
, 6);
1214 v
->lumshift
= get_bits(gb
, 6);
1216 if(v
->mv_mode
== MV_PMODE_1MV_HPEL
|| v
->mv_mode
== MV_PMODE_1MV_HPEL_BILIN
)
1221 if(v
->mv_mode
!= MV_PMODE_1MV
&& v
->mv_mode
!= MV_PMODE_1MV_HPEL
&& v
->mv_mode
!= MV_PMODE_1MV_HPEL_BILIN
) {
1222 av_log(v
->s
.avctx
, AV_LOG_ERROR
, "Only 1MV P-frames are supported by now\n");
1225 if ((v
->mv_mode
== MV_PMODE_INTENSITY_COMP
&&
1226 v
->mv_mode2
== MV_PMODE_MIXED_MV
)
1227 || v
->mv_mode
== MV_PMODE_MIXED_MV
)
1229 status
= bitplane_decoding(&v
->mv_type_mb_plane
, v
);
1230 if (status
< 0) return -1;
1231 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB MV Type plane encoding: "
1232 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1234 status
= bitplane_decoding(&v
->skip_mb_plane
, v
);
1235 if (status
< 0) return -1;
1236 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "MB Skip plane encoding: "
1237 "Imode: %i, Invert: %i\n", status
>>1, status
&1);
1239 /* Hopefully this is correct for P frames */
1240 v
->s
.mv_table_index
= get_bits(gb
, 2); //but using vc1_ tables
1241 v
->cbpcy_vlc
= &vc1_cbpcy_p_vlc
[get_bits(gb
, 2)];
1245 av_log(v
->s
.avctx
, AV_LOG_DEBUG
, "VOP DQuant info\n");
1246 vop_dquant_decoding(v
);
1249 v
->ttfrm
= 0; //FIXME Is that so ?
1252 v
->ttmbf
= get_bits(gb
, 1);
1255 v
->ttfrm
= get_bits(gb
, 2);
1264 v
->c_ac_table_index
= decode012(gb
);
1265 if (v
->s
.pict_type
== I_TYPE
|| v
->s
.pict_type
== BI_TYPE
)
1267 v
->y_ac_table_index
= decode012(gb
);
1270 v
->s
.dc_table_index
= get_bits(gb
, 1);
1275 /***********************************************************************/
1277 * @defgroup block VC-1 Block-level functions
1278 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1279 * @todo TODO: Integrate to MpegEncContext facilities
1285 * @brief Get macroblock-level quantizer scale
1286 * @warning XXX: qdiff to the frame quant, not previous quant ?
1287 * @fixme XXX: Don't know how to initialize mquant otherwise in last case
1289 #define GET_MQUANT() \
1292 if (v->dqprofile == DQPROFILE_ALL_MBS) \
1296 mquant = (get_bits(gb, 1)) ? v->pq : v->altpq; \
1300 mqdiff = get_bits(gb, 3); \
1301 if (mqdiff != 7) mquant = v->pq + mqdiff; \
1302 else mquant = get_bits(gb, 5); \
1305 else mquant = v->pq; \
1309 * @def GET_MVDATA(_dmv_x, _dmv_y)
1310 * @brief Get MV differentials
1311 * @see MVDATA decoding from 8.3.5.2, p(1)20
1312 * @param _dmv_x Horizontal differential for decoded MV
1313 * @param _dmv_y Vertical differential for decoded MV
1314 * @todo TODO: Use MpegEncContext arrays to store them
1316 #define GET_MVDATA(_dmv_x, _dmv_y) \
1317 index = 1 + get_vlc2(gb, vc1_mv_diff_vlc[s->mv_table_index].table,\
1318 VC1_MV_DIFF_VLC_BITS, 2); \
1321 mb_has_coeffs = 1; \
1324 else mb_has_coeffs = 0; \
1326 if (!index) { _dmv_x = _dmv_y = 0; } \
1327 else if (index == 35) \
1329 _dmv_x = get_bits(gb, v->k_x - s->mspel); \
1330 _dmv_y = get_bits(gb, v->k_y - s->mspel); \
1332 else if (index == 36) \
1341 if (s->mspel && index1 == 5) val = 1; \
1343 val = get_bits(gb, size_table[index1] - val); \
1344 sign = 0 - (val&1); \
1345 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1348 if (s->mspel && index1 == 5) val = 1; \
1350 val = get_bits(gb, size_table[index1] - val); \
1351 sign = 0 - (val&1); \
1352 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
1355 /** Predict and set motion vector
1357 static inline void vc1_pred_mv(MpegEncContext
*s
, int dmv_x
, int dmv_y
, int mv1
, int r_x
, int r_y
)
1363 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1365 /* scale MV difference to be quad-pel */
1369 wrap
= s
->b8_stride
;
1370 xy
= s
->block_index
[0];
1372 C
= s
->current_picture
.motion_val
[0][xy
- (1 << mv1
)];
1373 A
= s
->current_picture
.motion_val
[0][xy
- (wrap
<< mv1
)];
1374 off
= (s
->mb_x
== (s
->mb_width
- 1)) ?
-1 : 1;
1375 B
= s
->current_picture
.motion_val
[0][xy
+ ((off
- wrap
) << mv1
)];
1377 if(!s
->first_slice_line
) { // predictor A is not out of bounds
1378 if(s
->mb_width
== 1) {
1382 px
= mid_pred(A
[0], B
[0], C
[0]);
1383 py
= mid_pred(A
[1], B
[1], C
[1]);
1385 } else if(s
->mb_x
) { // predictor C is not out of bounds
1391 if(s
->mb_intra
) px
= py
= 0;
1393 /* Pullback MV as specified in 8.3.5.3.4 */
1396 qx
= s
->mb_x
<< 6; //FIXME: add real block coords for 4MV mode
1398 X
= (s
->mb_width
<< 6) - 4;
1399 Y
= (s
->mb_height
<< 6) - 4;
1401 if(qx
+ px
< -60) px
= -60 - qx
;
1402 if(qy
+ py
< -60) py
= -60 - qy
;
1404 if(qx
+ px
< -28) px
= -28 - qx
;
1405 if(qy
+ py
< -28) py
= -28 - qy
;
1407 if(qx
+ px
> X
) px
= X
- qx
;
1408 if(qy
+ py
> Y
) py
= Y
- qy
;
1410 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
1411 if(!s
->mb_intra
&& !s
->first_slice_line
&& s
->mb_x
) {
1412 if(IS_INTRA(s
->current_picture
.mb_type
[mb_pos
- s
->mb_stride
]))
1413 sum
= ABS(px
) + ABS(py
);
1415 sum
= ABS(px
- A
[0]) + ABS(py
- A
[1]);
1417 if(get_bits1(&s
->gb
)) {
1425 if(IS_INTRA(s
->current_picture
.mb_type
[mb_pos
- 1]))
1426 sum
= ABS(px
) + ABS(py
);
1428 sum
= ABS(px
- C
[0]) + ABS(py
- C
[1]);
1430 if(get_bits1(&s
->gb
)) {
1440 /* store MV using signed modulus of MV range defined in 4.11 */
1441 s
->mv
[0][0][0] = s
->current_picture
.motion_val
[0][xy
][0] = ((px
+ dmv_x
+ r_x
) & ((r_x
<< 1) - 1)) - r_x
;
1442 s
->mv
[0][0][1] = s
->current_picture
.motion_val
[0][xy
][1] = ((py
+ dmv_y
+ r_y
) & ((r_y
<< 1) - 1)) - r_y
;
1445 /** Get predicted DC value for I-frames only
1446 * prediction dir: left=0, top=1
1447 * @param s MpegEncContext
1448 * @param[in] n block index in the current MB
1449 * @param dc_val_ptr Pointer to DC predictor
1450 * @param dir_ptr Prediction direction for use in AC prediction
1452 static inline int vc1_i_pred_dc(MpegEncContext
*s
, int overlap
, int pq
, int n
,
1453 int16_t **dc_val_ptr
, int *dir_ptr
)
1455 int a
, b
, c
, wrap
, pred
, scale
;
1457 static const uint16_t dcpred
[32] = {
1458 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
1459 114, 102, 93, 85, 79, 73, 68, 64,
1460 60, 57, 54, 51, 49, 47, 45, 43,
1461 41, 39, 38, 37, 35, 34, 33
1464 /* find prediction - wmv3_dc_scale always used here in fact */
1465 if (n
< 4) scale
= s
->y_dc_scale
;
1466 else scale
= s
->c_dc_scale
;
1468 wrap
= s
->block_wrap
[n
];
1469 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
1475 b
= dc_val
[ - 1 - wrap
];
1476 a
= dc_val
[ - wrap
];
1478 if (pq
< 9 || !overlap
)
1480 /* Set outer values */
1481 if (!s
->mb_y
&& (n
!=2 && n
!=3)) b
=a
=dcpred
[scale
];
1482 if (s
->mb_x
== 0 && (n
!=1 && n
!=3)) b
=c
=dcpred
[scale
];
1486 /* Set outer values */
1487 if (!s
->mb_y
&& (n
!=2 && n
!=3)) b
=a
=0;
1488 if (s
->mb_x
== 0 && (n
!=1 && n
!=3)) b
=c
=0;
1491 if (abs(a
- b
) <= abs(b
- c
)) {
1499 /* update predictor */
1500 *dc_val_ptr
= &dc_val
[0];
1505 /** Get predicted DC value
1506 * prediction dir: left=0, top=1
1507 * @param s MpegEncContext
1508 * @param[in] n block index in the current MB
1509 * @param dc_val_ptr Pointer to DC predictor
1510 * @param dir_ptr Prediction direction for use in AC prediction
1512 static inline int vc1_pred_dc(MpegEncContext
*s
, int overlap
, int pq
, int n
,
1513 int a_avail
, int c_avail
,
1514 int16_t **dc_val_ptr
, int *dir_ptr
)
1516 int a
, b
, c
, wrap
, pred
, scale
;
1518 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1519 int mb_pos2
, q1
, q2
;
1521 /* find prediction - wmv3_dc_scale always used here in fact */
1522 if (n
< 4) scale
= s
->y_dc_scale
;
1523 else scale
= s
->c_dc_scale
;
1525 wrap
= s
->block_wrap
[n
];
1526 dc_val
= s
->dc_val
[0] + s
->block_index
[n
];
1532 b
= dc_val
[ - 1 - wrap
];
1533 a
= dc_val
[ - wrap
];
1535 if(a_avail
&& c_avail
) {
1536 if(abs(a
- b
) <= abs(b
- c
)) {
1543 } else if(a_avail
) {
1546 } else if(c_avail
) {
1554 /* scale coeffs if needed */
1555 mb_pos2
= mb_pos
- *dir_ptr
- (1 - *dir_ptr
) * s
->mb_stride
;
1556 q1
= s
->current_picture
.qscale_table
[mb_pos
];
1557 q2
= s
->current_picture
.qscale_table
[mb_pos2
];
1558 if(0 && q1
&& q2
&& q1
!= q2
) {
1559 q1
= s
->y_dc_scale_table
[q1
];
1560 q2
= s
->y_dc_scale_table
[q2
];
1561 pred
= (pred
* q2
* vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1564 /* update predictor */
1565 *dc_val_ptr
= &dc_val
[0];
1571 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles
1572 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
1573 * @todo TODO: Integrate to MpegEncContext facilities
1577 static inline int vc1_coded_block_pred(MpegEncContext
* s
, int n
, uint8_t **coded_block_ptr
)
1579 int xy
, wrap
, pred
, a
, b
, c
;
1581 xy
= s
->block_index
[n
];
1582 wrap
= s
->b8_stride
;
1587 a
= s
->coded_block
[xy
- 1 ];
1588 b
= s
->coded_block
[xy
- 1 - wrap
];
1589 c
= s
->coded_block
[xy
- wrap
];
1598 *coded_block_ptr
= &s
->coded_block
[xy
];
1604 * Decode one AC coefficient
1605 * @param v The VC1 context
1606 * @param last Last coefficient
1607 * @param skip How much zero coefficients to skip
1608 * @param value Decoded AC coefficient value
1611 static void vc1_decode_ac_coeff(VC1Context
*v
, int *last
, int *skip
, int *value
, int codingset
)
1613 GetBitContext
*gb
= &v
->s
.gb
;
1614 int index
, escape
, run
= 0, level
= 0, lst
= 0;
1616 index
= get_vlc2(gb
, vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
1617 if (index
!= vc1_ac_sizes
[codingset
] - 1) {
1618 run
= vc1_index_decode_table
[codingset
][index
][0];
1619 level
= vc1_index_decode_table
[codingset
][index
][1];
1620 lst
= index
>= vc1_last_decode_table
[codingset
];
1624 escape
= decode210(gb
);
1626 index
= get_vlc2(gb
, vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
1627 run
= vc1_index_decode_table
[codingset
][index
][0];
1628 level
= vc1_index_decode_table
[codingset
][index
][1];
1629 lst
= index
>= vc1_last_decode_table
[codingset
];
1631 level
+= vc1_last_delta_level_table
[codingset
][run
];
1633 level
+= vc1_delta_level_table
[codingset
][run
];
1636 } else if (escape
== 1) {
1637 index
= get_vlc2(gb
, vc1_ac_coeff_table
[codingset
].table
, AC_VLC_BITS
, 3);
1638 run
= vc1_index_decode_table
[codingset
][index
][0];
1639 level
= vc1_index_decode_table
[codingset
][index
][1];
1640 lst
= index
>= vc1_last_decode_table
[codingset
];
1642 run
+= vc1_last_delta_run_table
[codingset
][level
] + 1;
1644 run
+= vc1_delta_run_table
[codingset
][level
] + 1;
1649 lst
= get_bits(gb
, 1);
1650 if(v
->s
.esc3_level_length
== 0) {
1651 if(v
->pq
< 8 || v
->dquantfrm
) { // table 59
1652 v
->s
.esc3_level_length
= get_bits(gb
, 3);
1653 if(!v
->s
.esc3_level_length
)
1654 v
->s
.esc3_level_length
= get_bits(gb
, 2) + 8;
1656 v
->s
.esc3_level_length
= get_prefix(gb
, 1, 6) + 2;
1658 v
->s
.esc3_run_length
= 3 + get_bits(gb
, 2);
1660 run
= get_bits(gb
, v
->s
.esc3_run_length
);
1661 sign
= get_bits(gb
, 1);
1662 level
= get_bits(gb
, v
->s
.esc3_level_length
);
1673 /** Decode intra block in intra frames - should be faster than decode_intra_block
1674 * @param v VC1Context
1675 * @param block block to decode
1676 * @param coded are AC coeffs present or not
1677 * @param codingset set of VLC to decode data
1679 static int vc1_decode_i_block(VC1Context
*v
, DCTELEM block
[64], int n
, int coded
, int codingset
)
1681 GetBitContext
*gb
= &v
->s
.gb
;
1682 MpegEncContext
*s
= &v
->s
;
1683 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
1686 int16_t *ac_val
, *ac_val2
;
1689 /* Get DC differential */
1691 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1693 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1696 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
1701 if (dcdiff
== 119 /* ESC index value */)
1703 /* TODO: Optimize */
1704 if (v
->pq
== 1) dcdiff
= get_bits(gb
, 10);
1705 else if (v
->pq
== 2) dcdiff
= get_bits(gb
, 9);
1706 else dcdiff
= get_bits(gb
, 8);
1711 dcdiff
= (dcdiff
<<2) + get_bits(gb
, 2) - 3;
1712 else if (v
->pq
== 2)
1713 dcdiff
= (dcdiff
<<1) + get_bits(gb
, 1) - 1;
1715 if (get_bits(gb
, 1))
1720 dcdiff
+= vc1_i_pred_dc(&v
->s
, v
->overlap
, v
->pq
, n
, &dc_val
, &dc_pred_dir
);
1723 /* Store the quantized DC coeff, used for prediction */
1726 block
[0] = dcdiff
* s
->y_dc_scale
;
1728 block
[0] = dcdiff
* s
->c_dc_scale
;
1741 int last
= 0, skip
, value
;
1742 const int8_t *zz_table
;
1746 scale
= v
->pq
* 2 + v
->halfpq
;
1750 zz_table
= vc1_horizontal_zz
;
1752 zz_table
= vc1_vertical_zz
;
1754 zz_table
= vc1_normal_zz
;
1756 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
1758 if(dc_pred_dir
) //left
1761 ac_val
-= 16 * s
->block_wrap
[n
];
1764 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
1768 block
[zz_table
[i
++]] = value
;
1771 /* apply AC prediction if needed */
1773 if(dc_pred_dir
) { //left
1774 for(k
= 1; k
< 8; k
++)
1775 block
[k
<< 3] += ac_val
[k
];
1777 for(k
= 1; k
< 8; k
++)
1778 block
[k
] += ac_val
[k
+ 8];
1781 /* save AC coeffs for further prediction */
1782 for(k
= 1; k
< 8; k
++) {
1783 ac_val2
[k
] = block
[k
<< 3];
1784 ac_val2
[k
+ 8] = block
[k
];
1787 /* scale AC coeffs */
1788 for(k
= 1; k
< 64; k
++)
1792 block
[k
] += (block
[k
] < 0) ?
-v
->pq
: v
->pq
;
1795 if(s
->ac_pred
) i
= 63;
1801 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
1804 scale
= v
->pq
* 2 + v
->halfpq
;
1805 memset(ac_val2
, 0, 16 * 2);
1806 if(dc_pred_dir
) {//left
1809 memcpy(ac_val2
, ac_val
, 8 * 2);
1811 ac_val
-= 16 * s
->block_wrap
[n
];
1813 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
1816 /* apply AC prediction if needed */
1818 if(dc_pred_dir
) { //left
1819 for(k
= 1; k
< 8; k
++) {
1820 block
[k
<< 3] = ac_val
[k
] * scale
;
1822 block
[k
<< 3] += (block
[k
<< 3] < 0) ?
-v
->pq
: v
->pq
;
1825 for(k
= 1; k
< 8; k
++) {
1826 block
[k
] = ac_val
[k
+ 8] * scale
;
1828 block
[k
] += (block
[k
] < 0) ?
-v
->pq
: v
->pq
;
1834 s
->block_last_index
[n
] = i
;
1839 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
1840 * @param v VC1Context
1841 * @param block block to decode
1842 * @param coded are AC coeffs present or not
1843 * @param mquant block quantizer
1844 * @param codingset set of VLC to decode data
1846 static int vc1_decode_intra_block(VC1Context
*v
, DCTELEM block
[64], int n
, int coded
, int mquant
, int codingset
)
1848 GetBitContext
*gb
= &v
->s
.gb
;
1849 MpegEncContext
*s
= &v
->s
;
1850 int dc_pred_dir
= 0; /* Direction of the DC prediction used */
1853 int16_t *ac_val
, *ac_val2
;
1855 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
1856 int a_avail
, c_avail
;
1858 /* XXX: Guard against dumb values of mquant */
1859 mquant
= (mquant
< 1) ?
0 : ( (mquant
>31) ?
31 : mquant
);
1861 /* Set DC scale - y and c use the same */
1862 s
->y_dc_scale
= s
->y_dc_scale_table
[mquant
];
1863 s
->c_dc_scale
= s
->c_dc_scale_table
[mquant
];
1865 /* check if prediction blocks A and C are available */
1866 a_avail
= c_avail
= 0;
1867 if((n
== 2 || n
== 3) || (s
->mb_y
&& IS_INTRA(s
->current_picture
.mb_type
[mb_pos
- s
->mb_stride
])))
1869 if((n
== 1 || n
== 3) || (s
->mb_x
&& IS_INTRA(s
->current_picture
.mb_type
[mb_pos
- 1])))
1871 /* Get DC differential */
1873 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_luma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1875 dcdiff
= get_vlc2(&s
->gb
, ff_msmp4_dc_chroma_vlc
[s
->dc_table_index
].table
, DC_VLC_BITS
, 3);
1878 av_log(s
->avctx
, AV_LOG_ERROR
, "Illegal DC VLC\n");
1883 if (dcdiff
== 119 /* ESC index value */)
1885 /* TODO: Optimize */
1886 if (mquant
== 1) dcdiff
= get_bits(gb
, 10);
1887 else if (mquant
== 2) dcdiff
= get_bits(gb
, 9);
1888 else dcdiff
= get_bits(gb
, 8);
1893 dcdiff
= (dcdiff
<<2) + get_bits(gb
, 2) - 3;
1894 else if (mquant
== 2)
1895 dcdiff
= (dcdiff
<<1) + get_bits(gb
, 1) - 1;
1897 if (get_bits(gb
, 1))
1902 dcdiff
+= vc1_pred_dc(&v
->s
, v
->overlap
, mquant
, n
, a_avail
, c_avail
, &dc_val
, &dc_pred_dir
);
1905 /* Store the quantized DC coeff, used for prediction */
1908 block
[0] = dcdiff
* s
->y_dc_scale
;
1910 block
[0] = dcdiff
* s
->c_dc_scale
;
1923 int last
= 0, skip
, value
;
1924 const int8_t *zz_table
;
1928 scale
= mquant
* 2 + v
->halfpq
;
1932 zz_table
= vc1_horizontal_zz
;
1934 zz_table
= vc1_vertical_zz
;
1936 zz_table
= vc1_normal_zz
;
1938 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
1940 if(dc_pred_dir
) //left
1943 ac_val
-= 16 * s
->block_wrap
[n
];
1946 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, codingset
);
1950 block
[zz_table
[i
++]] = value
;
1953 /* apply AC prediction if needed */
1955 /* scale predictors if needed*/
1956 int mb_pos2
, q1
, q2
;
1958 mb_pos2
= mb_pos
- dc_pred_dir
- (1 - dc_pred_dir
) * s
->mb_stride
;
1959 q1
= s
->current_picture
.qscale_table
[mb_pos
];
1960 q2
= s
->current_picture
.qscale_table
[mb_pos2
];
1963 memset(ac_val
, 0, 8 * sizeof(ac_val
[0]));
1967 memset(ac_val
+ 8, 0, 8 * sizeof(ac_val
[0]));
1970 if(!q1
&& q1
&& q2
&& q1
!= q2
) {
1974 if(dc_pred_dir
) { //left
1975 for(k
= 1; k
< 8; k
++)
1976 block
[k
<< 3] += (ac_val
[k
] * q2
* vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1978 for(k
= 1; k
< 8; k
++)
1979 block
[k
] += (ac_val
[k
+ 8] * q2
* vc1_dqscale
[q1
- 1] + 0x20000) >> 18;
1982 if(dc_pred_dir
) { //left
1983 for(k
= 1; k
< 8; k
++)
1984 block
[k
<< 3] += ac_val
[k
];
1986 for(k
= 1; k
< 8; k
++)
1987 block
[k
] += ac_val
[k
+ 8];
1991 /* save AC coeffs for further prediction */
1992 for(k
= 1; k
< 8; k
++) {
1993 ac_val2
[k
] = block
[k
<< 3];
1994 ac_val2
[k
+ 8] = block
[k
];
1997 /* scale AC coeffs */
1998 for(k
= 1; k
< 64; k
++)
2002 block
[k
] += (block
[k
] < 0) ?
-mquant
: mquant
;
2005 if(s
->ac_pred
) i
= 63;
2011 ac_val
= s
->ac_val
[0][0] + s
->block_index
[n
] * 16;
2015 memset(ac_val
, 0, 8 * sizeof(ac_val
[0]));
2019 memset(ac_val
+ 8, 0, 8 * sizeof(ac_val
[0]));
2023 scale
= mquant
* 2 + v
->halfpq
;
2024 memset(ac_val2
, 0, 16 * 2);
2025 if(dc_pred_dir
) {//left
2028 memcpy(ac_val2
, ac_val
, 8 * 2);
2030 ac_val
-= 16 * s
->block_wrap
[n
];
2032 memcpy(ac_val2
+ 8, ac_val
+ 8, 8 * 2);
2035 /* apply AC prediction if needed */
2037 if(dc_pred_dir
) { //left
2038 for(k
= 1; k
< 8; k
++) {
2039 block
[k
<< 3] = ac_val
[k
] * scale
;
2041 block
[k
<< 3] += (block
[k
<< 3] < 0) ?
-mquant
: mquant
;
2044 for(k
= 1; k
< 8; k
++) {
2045 block
[k
] = ac_val
[k
+ 8] * scale
;
2047 block
[k
] += (block
[k
] < 0) ?
-mquant
: mquant
;
2053 s
->block_last_index
[n
] = i
;
2060 static int vc1_decode_p_block(VC1Context
*v
, DCTELEM block
[64], int n
, int mquant
, int ttmb
, int first_block
)
2062 MpegEncContext
*s
= &v
->s
;
2063 GetBitContext
*gb
= &s
->gb
;
2066 int scale
, off
, idx
, last
, skip
, value
;
2067 int ttblk
= ttmb
& 7;
2070 ttblk
= ttblk_to_tt
[v
->tt_index
][get_vlc2(gb
, vc1_ttblk_vlc
[v
->tt_index
].table
, VC1_TTBLK_VLC_BITS
, 1)];
2072 if(ttblk
== TT_4X4
) {
2073 subblkpat
= ~(get_vlc2(gb
, vc1_subblkpat_vlc
[v
->tt_index
].table
, VC1_SUBBLKPAT_VLC_BITS
, 1) + 1);
2075 if((ttblk
!= TT_8X8
&& ttblk
!= TT_4X4
) && (v
->ttmbf
|| (ttmb
!= -1 && (ttmb
& 8) && !first_block
))) {
2076 subblkpat
= decode012(gb
);
2077 if(ttblk
== TT_8X4_TOP
|| ttblk
== TT_8X4_BOTTOM
) ttblk
= TT_8X4
;
2078 if(ttblk
== TT_4X8_RIGHT
|| ttblk
== TT_4X8_LEFT
) ttblk
= TT_4X8
;
2082 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
2083 if(ttblk
== TT_8X4_TOP
|| ttblk
== TT_8X4_BOTTOM
) {
2085 subblkpat
= 2 - (ttblk
== TT_8X4_TOP
);
2087 if(ttblk
== TT_4X8_RIGHT
|| ttblk
== TT_4X8_LEFT
) {
2089 subblkpat
= 2 - (ttblk
== TT_4X8_LEFT
);
2097 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2101 idx
= vc1_simple_progressive_8x8_zz
[i
++];
2102 block
[idx
] = value
* scale
;
2104 vc1_inv_trans(block
, 8, 8);
2107 for(j
= 0; j
< 4; j
++) {
2108 last
= subblkpat
& (1 << (3 - j
));
2110 off
= (j
& 1) * 4 + (j
& 2) * 32;
2112 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2116 idx
= vc1_simple_progressive_4x4_zz
[i
++];
2117 block
[idx
+ off
] = value
* scale
;
2119 vc1_inv_trans(block
+ off
, 4, 4);
2123 for(j
= 0; j
< 2; j
++) {
2124 last
= subblkpat
& (1 << (1 - j
));
2128 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2132 idx
= vc1_simple_progressive_8x4_zz
[i
++];
2133 block
[idx
+ off
] = value
* scale
;
2135 if(!(subblkpat
& (1 << (1 - j
)))) vc1_inv_trans(block
+ off
, 8, 4);
2139 for(j
= 0; j
< 2; j
++) {
2140 last
= subblkpat
& (1 << (1 - j
));
2144 vc1_decode_ac_coeff(v
, &last
, &skip
, &value
, v
->codingset2
);
2148 idx
= vc1_simple_progressive_8x4_zz
[i
++];
2149 block
[idx
+ off
] = value
* scale
;
2151 vc1_inv_trans(block
+ off
, 4, 8);
2159 /** Decode one P-frame MB (in Simple/Main profile)
2160 * @todo TODO: Extend to AP
2161 * @fixme FIXME: DC value for inter blocks not set
2163 static int vc1_decode_p_mb(VC1Context
*v
, DCTELEM block
[6][64])
2165 MpegEncContext
*s
= &v
->s
;
2166 GetBitContext
*gb
= &s
->gb
;
2167 int i
, j
, mb_offset
= s
->mb_x
+ s
->mb_y
*s
->mb_width
; /* XXX: mb_stride */
2168 int mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_stride
;
2169 int cbp
; /* cbp decoding stuff */
2170 int hybrid_pred
; /* Prediction types */
2171 int mqdiff
, mquant
; /* MB quantization */
2172 int ttmb
= v
->ttmb
; /* MB Transform type */
2175 static const int size_table
[6] = { 0, 2, 3, 4, 5, 8 },
2176 offset_table
[6] = { 0, 1, 3, 7, 15, 31 };
2177 int mb_has_coeffs
= 1; /* last_flag */
2178 int dmv_x
, dmv_y
; /* Differential MV components */
2179 int index
, index1
; /* LUT indices */
2180 int val
, sign
; /* temp values */
2181 int first_block
= 1;
2184 mquant
= v
->pq
; /* Loosy initialization */
2186 if (v
->mv_type_mb_plane
.is_raw
)
2187 v
->mv_type_mb_plane
.data
[mb_offset
] = get_bits(gb
, 1);
2188 if (v
->skip_mb_plane
.is_raw
)
2189 v
->skip_mb_plane
.data
[mb_offset
] = get_bits(gb
, 1);
2190 s
->current_picture
.mbskip_table
[mb_pos
] = v
->skip_mb_plane
.data
[mb_offset
];
2191 if (!v
->mv_type_mb_plane
.data
[mb_offset
]) /* 1MV mode */
2193 if (!v
->skip_mb_plane
.data
[mb_offset
])
2195 GET_MVDATA(dmv_x
, dmv_y
);
2197 s
->current_picture
.mb_type
[mb_pos
] = s
->mb_intra ? MB_TYPE_INTRA
: MB_TYPE_16x16
;
2198 vc1_pred_mv(s
, dmv_x
, dmv_y
, 1, v
->range_x
, v
->range_y
);
2200 /* FIXME Set DC val for inter block ? */
2201 if (s
->mb_intra
&& !mb_has_coeffs
)
2204 s
->ac_pred
= get_bits(gb
, 1);
2207 else if (mb_has_coeffs
)
2209 if (s
->mb_intra
) s
->ac_pred
= get_bits(gb
, 1);
2210 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
2218 s
->current_picture
.qscale_table
[mb_pos
] = mquant
;
2220 if (!v
->ttmbf
&& !s
->mb_intra
&& mb_has_coeffs
)
2221 ttmb
= get_vlc2(gb
, vc1_ttmb_vlc
[v
->tt_index
].table
,
2222 VC1_TTMB_VLC_BITS
, 2);
2223 s
->dsp
.clear_blocks(block
[0]);
2228 s
->dc_val
[0][s
->block_index
[i
]] = 0;
2230 val
= ((cbp
>> (5 - i
)) & 1);
2231 off
= (i
& 4) ?
0 : ((i
& 1) * 8 + (i
& 2) * 4 * s
->linesize
);
2233 vc1_decode_intra_block(v
, block
[i
], i
, val
, mquant
, (i
&4)?v
->codingset2
:v
->codingset
);
2234 vc1_inv_trans(s
->block
[i
], 8, 8);
2235 for(j
= 0; j
< 64; j
++) s
->block
[i
][j
] += 128;
2236 s
->dsp
.put_pixels_clamped(s
->block
[i
], s
->dest
[dst_idx
] + off
, s
->linesize
>> ((i
& 4) >> 2));
2238 vc1_decode_p_block(v
, block
[i
], i
, mquant
, ttmb
, first_block
);
2239 if(!v
->ttmbf
&& ttmb
< 8) ttmb
= -1;
2241 s
->dsp
.add_pixels_clamped(s
->block
[i
], s
->dest
[dst_idx
] + off
, (i
&4)?s
->uvlinesize
:s
->linesize
);
2248 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_SKIP
;
2249 vc1_pred_mv(s
, 0, 0, 1, v
->range_x
, v
->range_y
);
2255 {//FIXME: looks not conforming to standard and is not even theoretically complete
2256 if (!v
->skip_mb_plane
.data
[mb_offset
] /* unskipped MB */)
2258 int blk_intra
[4], blk_coded
[4];
2260 cbp
= get_vlc2(&v
->s
.gb
, v
->cbpcy_vlc
->table
, VC1_CBPCY_P_VLC_BITS
, 2);
2263 val
= ((cbp
>> (5 - i
)) & 1);
2267 GET_MVDATA(dmv_x
, dmv_y
);
2268 blk_intra
[i
] = s
->mb_intra
;
2270 if (v
->mv_mode
== MV_PMODE_MIXED_MV
/* Hybrid pred */)
2271 hybrid_pred
= get_bits(gb
, 1);
2273 if((blk_intra
[0] | blk_intra
[1] | blk_intra
[2] | blk_intra
[3]) ||
2274 (blk_coded
[0] | blk_coded
[1] | blk_coded
[2] | blk_coded
[3])) {
2277 if (s
->mb_intra
/* One of the 4 blocks is intra */
2278 /* non-zero pred for that block */)
2279 s
->ac_pred
= get_bits(gb
, 1);
2281 ttmb
= get_vlc2(gb
, vc1_ttmb_vlc
[v
->tt_index
].table
,
2282 VC1_TTMB_VLC_BITS
, 12);
2283 for(i
= 0; i
< 6; i
++) {
2284 val
= ((cbp
>> (5 - i
)) & 1);
2285 if(i
& 4 || blk_intra
[i
] || val
) {
2286 if(i
< 4 && blk_intra
[i
])
2287 status
= vc1_decode_intra_block(v
, block
[i
], i
, val
, mquant
, (i
&4)?v
->codingset2
:v
->codingset
);
2289 status
= vc1_decode_p_block(v
, block
[i
], i
, mquant
, ttmb
, 0);
2297 /* XXX: Skipped => cbp=0 and mquant doesn't matter ? */
2300 if (v
->mv_mode
== MV_PMODE_MIXED_MV
/* Hybrid pred */)
2301 hybrid_pred
= get_bits(gb
, 1);
2308 /* Should never happen */
2312 /** Decode blocks of I-frame
2314 static void vc1_decode_i_blocks(VC1Context
*v
)
2317 MpegEncContext
*s
= &v
->s
;
2322 /* select codingmode used for VLC tables selection */
2323 switch(v
->y_ac_table_index
){
2325 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
2328 v
->codingset
= CS_HIGH_MOT_INTRA
;
2331 v
->codingset
= CS_MID_RATE_INTRA
;
2335 switch(v
->c_ac_table_index
){
2337 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
2340 v
->codingset2
= CS_HIGH_MOT_INTER
;
2343 v
->codingset2
= CS_MID_RATE_INTER
;
2347 /* Set DC scale - y and c use the same */
2348 s
->y_dc_scale
= s
->y_dc_scale_table
[v
->pq
];
2349 s
->c_dc_scale
= s
->c_dc_scale_table
[v
->pq
];
2352 s
->mb_x
= s
->mb_y
= 0;
2354 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
2355 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
2356 for(s
->mb_x
= 0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2357 ff_init_block_index(s
);
2358 ff_update_block_index(s
);
2359 s
->dsp
.clear_blocks(s
->block
[0]);
2360 mb_pos
= s
->mb_x
+ s
->mb_y
* s
->mb_width
;
2361 s
->current_picture
.mb_type
[mb_pos
] = MB_TYPE_INTRA
;
2362 s
->current_picture
.qscale_table
[mb_pos
] = v
->pq
;
2364 // do actual MB decoding and displaying
2365 cbp
= get_vlc2(&v
->s
.gb
, ff_msmp4_mb_i_vlc
.table
, MB_INTRA_VLC_BITS
, 2);
2366 v
->s
.ac_pred
= get_bits(&v
->s
.gb
, 1);
2368 for(k
= 0; k
< 6; k
++) {
2369 val
= ((cbp
>> (5 - k
)) & 1);
2371 int pred
= vc1_coded_block_pred(&v
->s
, k
, &coded_val
);
2375 cbp
|= val
<< (5 - k
);
2377 vc1_decode_i_block(v
, s
->block
[k
], k
, val
, (k
<4)? v
->codingset
: v
->codingset2
);
2379 vc1_inv_trans(s
->block
[k
], 8, 8);
2380 if(v
->pq
>= 9 && v
->overlap
) {
2381 vc1_overlap_block(s
, s
->block
[k
], k
, (s
->mb_y
|| k
>1), (s
->mb_x
|| (k
!= 0 && k
!= 2)));
2385 vc1_put_block(v
, s
->block
);
2387 if(get_bits_count(&s
->gb
) > v
->bits
) {
2388 av_log(s
->avctx
, AV_LOG_ERROR
, "Bits overconsumption: %i > %i\n", get_bits_count(&s
->gb
), v
->bits
);
2392 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
2396 static void vc1_decode_p_blocks(VC1Context
*v
)
2398 MpegEncContext
*s
= &v
->s
;
2400 /* select codingmode used for VLC tables selection */
2401 switch(v
->c_ac_table_index
){
2403 v
->codingset
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTRA
: CS_LOW_MOT_INTRA
;
2406 v
->codingset
= CS_HIGH_MOT_INTRA
;
2409 v
->codingset
= CS_MID_RATE_INTRA
;
2413 switch(v
->c_ac_table_index
){
2415 v
->codingset2
= (v
->pqindex
<= 8) ? CS_HIGH_RATE_INTER
: CS_LOW_MOT_INTER
;
2418 v
->codingset2
= CS_HIGH_MOT_INTER
;
2421 v
->codingset2
= CS_MID_RATE_INTER
;
2425 ff_er_add_slice(s
, 0, 0, s
->mb_width
- 1, s
->mb_height
- 1, (AC_END
|DC_END
|MV_END
));
2426 s
->first_slice_line
= 1;
2427 for(s
->mb_y
= 0; s
->mb_y
< s
->mb_height
; s
->mb_y
++) {
2428 for(s
->mb_x
= 0; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
2429 ff_init_block_index(s
);
2430 ff_update_block_index(s
);
2431 s
->dsp
.clear_blocks(s
->block
[0]);
2433 vc1_decode_p_mb(v
, s
->block
);
2434 if(get_bits_count(&s
->gb
) > v
->bits
|| get_bits_count(&s
->gb
) < 0) {
2435 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
);
2439 ff_draw_horiz_band(s
, s
->mb_y
* 16, 16);
2440 s
->first_slice_line
= 0;
2444 static void vc1_decode_blocks(VC1Context
*v
)
2447 v
->s
.esc3_level_length
= 0;
2449 switch(v
->s
.pict_type
) {
2451 vc1_decode_i_blocks(v
);
2454 vc1_decode_p_blocks(v
);
2460 /** Initialize a VC1/WMV3 decoder
2461 * @todo TODO: Handle VC-1 IDUs (Transport level?)
2462 * @todo TODO: Decypher remaining bits in extra_data
2464 static int vc1_decode_init(AVCodecContext
*avctx
)
2466 VC1Context
*v
= avctx
->priv_data
;
2467 MpegEncContext
*s
= &v
->s
;
2470 if (!avctx
->extradata_size
|| !avctx
->extradata
) return -1;
2471 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
2474 if(ff_h263_decode_init(avctx
) < 0)
2476 if (vc1_init_common(v
) < 0) return -1;
2478 av_log(avctx
, AV_LOG_INFO
, "This decoder is not supposed to produce picture. Dont report this as a bug!\n");
2479 av_log(avctx
, AV_LOG_INFO
, "If you see a picture, don't believe your eyes.\n");
2481 avctx
->flags
|= CODEC_FLAG_EMU_EDGE
;
2482 avctx
->coded_width
= avctx
->width
;
2483 avctx
->coded_height
= avctx
->height
;
2484 if (avctx
->codec_id
== CODEC_ID_WMV3
)
2488 // looks like WMV3 has a sequence header stored in the extradata
2489 // advanced sequence header may be before the first frame
2490 // the last byte of the extradata is a version number, 1 for the
2491 // samples we can decode
2493 init_get_bits(&gb
, avctx
->extradata
, avctx
->extradata_size
*8);
2495 if (decode_sequence_header(avctx
, &gb
) < 0)
2498 count
= avctx
->extradata_size
*8 - get_bits_count(&gb
);
2501 av_log(avctx
, AV_LOG_INFO
, "Extra data: %i bits left, value: %X\n",
2502 count
, get_bits(&gb
, count
));
2506 av_log(avctx
, AV_LOG_INFO
, "Read %i bits in overflow\n", -count
);
2509 avctx
->has_b_frames
= !!(avctx
->max_b_frames
);
2511 s
->mb_width
= (avctx
->coded_width
+15)>>4;
2512 s
->mb_height
= (avctx
->coded_height
+15)>>4;
2514 /* Allocate mb bitplanes */
2515 if (alloc_bitplane(&v
->mv_type_mb_plane
, s
->mb_width
, s
->mb_height
) < 0)
2517 if (alloc_bitplane(&v
->mv_type_mb_plane
, s
->mb_width
, s
->mb_height
) < 0)
2519 if (alloc_bitplane(&v
->skip_mb_plane
, s
->mb_width
, s
->mb_height
) < 0)
2521 if (alloc_bitplane(&v
->direct_mb_plane
, s
->mb_width
, s
->mb_height
) < 0)
2524 /* For predictors */
2525 v
->previous_line_cbpcy
= (uint8_t *)av_malloc(s
->mb_stride
*4);
2526 if (!v
->previous_line_cbpcy
) return -1;
2528 /* Init coded blocks info */
2529 if (v
->profile
== PROFILE_ADVANCED
)
2531 if (alloc_bitplane(&v
->over_flags_plane
, s
->mb_width
, s
->mb_height
) < 0)
2533 if (alloc_bitplane(&v
->ac_pred_plane
, s
->mb_width
, s
->mb_height
) < 0)
2541 /** Decode a VC1/WMV3 frame
2542 * @todo TODO: Handle VC-1 IDUs (Transport level?)
2543 * @warning Initial try at using MpegEncContext stuff
2545 static int vc1_decode_frame(AVCodecContext
*avctx
,
2546 void *data
, int *data_size
,
2547 uint8_t *buf
, int buf_size
)
2549 VC1Context
*v
= avctx
->priv_data
;
2550 MpegEncContext
*s
= &v
->s
;
2551 AVFrame
*pict
= data
;
2553 /* no supplementary picture */
2554 if (buf_size
== 0) {
2555 /* special case for last picture */
2556 if (s
->low_delay
==0 && s
->next_picture_ptr
) {
2557 *pict
= *(AVFrame
*)s
->next_picture_ptr
;
2558 s
->next_picture_ptr
= NULL
;
2560 *data_size
= sizeof(AVFrame
);
2566 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
2567 if(s
->current_picture_ptr
==NULL
|| s
->current_picture_ptr
->data
[0]){
2568 int i
= ff_find_unused_picture(s
, 0);
2569 s
->current_picture_ptr
= &s
->picture
[i
];
2572 avctx
->has_b_frames
= !s
->low_delay
;
2574 init_get_bits(&s
->gb
, buf
, buf_size
*8);
2575 // do parse frame header
2576 if(vc1_parse_frame_header(v
, &s
->gb
) == -1)
2579 if(s
->pict_type
!= I_TYPE
&& s
->pict_type
!= P_TYPE
)return -1;
2582 s
->current_picture
.pict_type
= s
->pict_type
;
2583 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
2585 /* skip B-frames if we don't have reference frames */
2586 if(s
->last_picture_ptr
==NULL
&& (s
->pict_type
==B_TYPE
|| s
->dropable
)) return -1;//buf_size;
2587 /* skip b frames if we are in a hurry */
2588 if(avctx
->hurry_up
&& s
->pict_type
==B_TYPE
) return -1;//buf_size;
2589 if( (avctx
->skip_frame
>= AVDISCARD_NONREF
&& s
->pict_type
==B_TYPE
)
2590 || (avctx
->skip_frame
>= AVDISCARD_NONKEY
&& s
->pict_type
!=I_TYPE
)
2591 || avctx
->skip_frame
>= AVDISCARD_ALL
)
2593 /* skip everything if we are in a hurry>=5 */
2594 if(avctx
->hurry_up
>=5) return -1;//buf_size;
2596 if(s
->next_p_frame_damaged
){
2597 if(s
->pict_type
==B_TYPE
)
2600 s
->next_p_frame_damaged
=0;
2603 if(MPV_frame_start(s
, avctx
) < 0)
2606 ff_er_frame_start(s
);
2608 v
->bits
= buf_size
* 8;
2609 vc1_decode_blocks(v
);
2610 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
2611 // if(get_bits_count(&s->gb) > buf_size * 8)
2617 assert(s
->current_picture
.pict_type
== s
->current_picture_ptr
->pict_type
);
2618 assert(s
->current_picture
.pict_type
== s
->pict_type
);
2619 if (s
->pict_type
== B_TYPE
|| s
->low_delay
) {
2620 *pict
= *(AVFrame
*)s
->current_picture_ptr
;
2621 } else if (s
->last_picture_ptr
!= NULL
) {
2622 *pict
= *(AVFrame
*)s
->last_picture_ptr
;
2625 if(s
->last_picture_ptr
|| s
->low_delay
){
2626 *data_size
= sizeof(AVFrame
);
2627 ff_print_debug_info(s
, pict
);
2630 /* Return the Picture timestamp as the frame number */
2631 /* we substract 1 because it is added on utils.c */
2632 avctx
->frame_number
= s
->picture_number
- 1;
2638 /** Close a VC1/WMV3 decoder
2639 * @warning Initial try at using MpegEncContext stuff
2641 static int vc1_decode_end(AVCodecContext
*avctx
)
2643 VC1Context
*v
= avctx
->priv_data
;
2645 av_freep(&v
->hrd_rate
);
2646 av_freep(&v
->hrd_buffer
);
2647 MPV_common_end(&v
->s
);
2648 free_bitplane(&v
->mv_type_mb_plane
);
2649 free_bitplane(&v
->skip_mb_plane
);
2650 free_bitplane(&v
->direct_mb_plane
);
2655 AVCodec vc1_decoder
= {
2668 AVCodec wmv3_decoder
= {