Mercurial > audlegacy-plugins
comparison src/ffmpeg/libavcodec/vc1.c @ 808:e8776388b02a trunk
[svn] - add ffmpeg
| author | nenolod |
|---|---|
| date | Mon, 12 Mar 2007 11:18:54 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 807:0f9c8d4d3ac4 | 808:e8776388b02a |
|---|---|
| 1 /* | |
| 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 | |
| 5 * | |
| 6 * This file is part of FFmpeg. | |
| 7 * | |
| 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. | |
| 12 * | |
| 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. | |
| 17 * | |
| 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 | |
| 21 * | |
| 22 */ | |
| 23 | |
| 24 /** | |
| 25 * @file vc1.c | |
| 26 * VC-1 and WMV3 decoder | |
| 27 * | |
| 28 */ | |
| 29 #include "common.h" | |
| 30 #include "dsputil.h" | |
| 31 #include "avcodec.h" | |
| 32 #include "mpegvideo.h" | |
| 33 #include "vc1data.h" | |
| 34 #include "vc1acdata.h" | |
| 35 | |
| 36 #undef NDEBUG | |
| 37 #include <assert.h> | |
| 38 | |
| 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]; | |
| 45 #define DC_VLC_BITS 9 | |
| 46 #define AC_VLC_BITS 9 | |
| 47 static const uint16_t table_mb_intra[64][2]; | |
| 48 | |
| 49 | |
| 50 /** Available Profiles */ | |
| 51 //@{ | |
| 52 enum Profile { | |
| 53 PROFILE_SIMPLE, | |
| 54 PROFILE_MAIN, | |
| 55 PROFILE_COMPLEX, ///< TODO: WMV9 specific | |
| 56 PROFILE_ADVANCED | |
| 57 }; | |
| 58 //@} | |
| 59 | |
| 60 /** Sequence quantizer mode */ | |
| 61 //@{ | |
| 62 enum QuantMode { | |
| 63 QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level | |
| 64 QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level | |
| 65 QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames | |
| 66 QUANT_UNIFORM ///< Uniform quant used for all frames | |
| 67 }; | |
| 68 //@} | |
| 69 | |
| 70 /** Where quant can be changed */ | |
| 71 //@{ | |
| 72 enum DQProfile { | |
| 73 DQPROFILE_FOUR_EDGES, | |
| 74 DQPROFILE_DOUBLE_EDGES, | |
| 75 DQPROFILE_SINGLE_EDGE, | |
| 76 DQPROFILE_ALL_MBS | |
| 77 }; | |
| 78 //@} | |
| 79 | |
| 80 /** @name Where quant can be changed | |
| 81 */ | |
| 82 //@{ | |
| 83 enum DQSingleEdge { | |
| 84 DQSINGLE_BEDGE_LEFT, | |
| 85 DQSINGLE_BEDGE_TOP, | |
| 86 DQSINGLE_BEDGE_RIGHT, | |
| 87 DQSINGLE_BEDGE_BOTTOM | |
| 88 }; | |
| 89 //@} | |
| 90 | |
| 91 /** Which pair of edges is quantized with ALTPQUANT */ | |
| 92 //@{ | |
| 93 enum DQDoubleEdge { | |
| 94 DQDOUBLE_BEDGE_TOPLEFT, | |
| 95 DQDOUBLE_BEDGE_TOPRIGHT, | |
| 96 DQDOUBLE_BEDGE_BOTTOMRIGHT, | |
| 97 DQDOUBLE_BEDGE_BOTTOMLEFT | |
| 98 }; | |
| 99 //@} | |
| 100 | |
| 101 /** MV modes for P frames */ | |
| 102 //@{ | |
| 103 enum MVModes { | |
| 104 MV_PMODE_1MV_HPEL_BILIN, | |
| 105 MV_PMODE_1MV, | |
| 106 MV_PMODE_1MV_HPEL, | |
| 107 MV_PMODE_MIXED_MV, | |
| 108 MV_PMODE_INTENSITY_COMP | |
| 109 }; | |
| 110 //@} | |
| 111 | |
| 112 /** @name MV types for B frames */ | |
| 113 //@{ | |
| 114 enum BMVTypes { | |
| 115 BMV_TYPE_BACKWARD, | |
| 116 BMV_TYPE_FORWARD, | |
| 117 BMV_TYPE_INTERPOLATED | |
| 118 }; | |
| 119 //@} | |
| 120 | |
| 121 /** @name Block types for P/B frames */ | |
| 122 //@{ | |
| 123 enum TransformTypes { | |
| 124 TT_8X8, | |
| 125 TT_8X4_BOTTOM, | |
| 126 TT_8X4_TOP, | |
| 127 TT_8X4, //Both halves | |
| 128 TT_4X8_RIGHT, | |
| 129 TT_4X8_LEFT, | |
| 130 TT_4X8, //Both halves | |
| 131 TT_4X4 | |
| 132 }; | |
| 133 //@} | |
| 134 | |
| 135 /** Table for conversion between TTBLK and TTMB */ | |
| 136 static const int ttblk_to_tt[3][8] = { | |
| 137 { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT }, | |
| 138 { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP }, | |
| 139 { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP } | |
| 140 }; | |
| 141 | |
| 142 static const int ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 }; | |
| 143 | |
| 144 /** MV P mode - the 5th element is only used for mode 1 */ | |
| 145 static const uint8_t mv_pmode_table[2][5] = { | |
| 146 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV }, | |
| 147 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN } | |
| 148 }; | |
| 149 static const uint8_t mv_pmode_table2[2][4] = { | |
| 150 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV }, | |
| 151 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN } | |
| 152 }; | |
| 153 | |
| 154 /** One more frame type */ | |
| 155 #define BI_TYPE 7 | |
| 156 | |
| 157 static const int fps_nr[5] = { 24, 25, 30, 50, 60 }, | |
| 158 fps_dr[2] = { 1000, 1001 }; | |
| 159 static const uint8_t pquant_table[3][32] = { | |
| 160 { /* Implicit quantizer */ | |
| 161 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12, | |
| 162 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31 | |
| 163 }, | |
| 164 { /* Explicit quantizer, pquantizer uniform */ | |
| 165 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
| 166 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 | |
| 167 }, | |
| 168 { /* Explicit quantizer, pquantizer non-uniform */ | |
| 169 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, | |
| 170 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31 | |
| 171 } | |
| 172 }; | |
| 173 | |
| 174 /** @name VC-1 VLC tables and defines | |
| 175 * @todo TODO move this into the context | |
| 176 */ | |
| 177 //@{ | |
| 178 #define VC1_BFRACTION_VLC_BITS 7 | |
| 179 static VLC vc1_bfraction_vlc; | |
| 180 #define VC1_IMODE_VLC_BITS 4 | |
| 181 static VLC vc1_imode_vlc; | |
| 182 #define VC1_NORM2_VLC_BITS 3 | |
| 183 static VLC vc1_norm2_vlc; | |
| 184 #define VC1_NORM6_VLC_BITS 9 | |
| 185 static VLC vc1_norm6_vlc; | |
| 186 /* Could be optimized, one table only needs 8 bits */ | |
| 187 #define VC1_TTMB_VLC_BITS 9 //12 | |
| 188 static VLC vc1_ttmb_vlc[3]; | |
| 189 #define VC1_MV_DIFF_VLC_BITS 9 //15 | |
| 190 static VLC vc1_mv_diff_vlc[4]; | |
| 191 #define VC1_CBPCY_P_VLC_BITS 9 //14 | |
| 192 static VLC vc1_cbpcy_p_vlc[4]; | |
| 193 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6 | |
| 194 static VLC vc1_4mv_block_pattern_vlc[4]; | |
| 195 #define VC1_TTBLK_VLC_BITS 5 | |
| 196 static VLC vc1_ttblk_vlc[3]; | |
| 197 #define VC1_SUBBLKPAT_VLC_BITS 6 | |
| 198 static VLC vc1_subblkpat_vlc[3]; | |
| 199 | |
| 200 static VLC vc1_ac_coeff_table[8]; | |
| 201 //@} | |
| 202 | |
| 203 enum CodingSet { | |
| 204 CS_HIGH_MOT_INTRA = 0, | |
| 205 CS_HIGH_MOT_INTER, | |
| 206 CS_LOW_MOT_INTRA, | |
| 207 CS_LOW_MOT_INTER, | |
| 208 CS_MID_RATE_INTRA, | |
| 209 CS_MID_RATE_INTER, | |
| 210 CS_HIGH_RATE_INTRA, | |
| 211 CS_HIGH_RATE_INTER | |
| 212 }; | |
| 213 | |
| 214 /** @name Overlap conditions for Advanced Profile */ | |
| 215 //@{ | |
| 216 enum COTypes { | |
| 217 CONDOVER_NONE = 0, | |
| 218 CONDOVER_ALL, | |
| 219 CONDOVER_SELECT | |
| 220 }; | |
| 221 //@} | |
| 222 | |
| 223 | |
| 224 /** The VC1 Context | |
| 225 * @fixme Change size wherever another size is more efficient | |
| 226 * Many members are only used for Advanced Profile | |
| 227 */ | |
| 228 typedef struct VC1Context{ | |
| 229 MpegEncContext s; | |
| 230 | |
| 231 int bits; | |
| 232 | |
| 233 /** Simple/Main Profile sequence header */ | |
| 234 //@{ | |
| 235 int res_sm; ///< reserved, 2b | |
| 236 int res_x8; ///< reserved | |
| 237 int multires; ///< frame-level RESPIC syntax element present | |
| 238 int res_fasttx; ///< reserved, always 1 | |
| 239 int res_transtab; ///< reserved, always 0 | |
| 240 int rangered; ///< RANGEREDFRM (range reduction) syntax element present | |
| 241 ///< at frame level | |
| 242 int res_rtm_flag; ///< reserved, set to 1 | |
| 243 int reserved; ///< reserved | |
| 244 //@} | |
| 245 | |
| 246 /** Advanced Profile */ | |
| 247 //@{ | |
| 248 int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer | |
| 249 int chromaformat; ///< 2bits, 2=4:2:0, only defined | |
| 250 int postprocflag; ///< Per-frame processing suggestion flag present | |
| 251 int broadcast; ///< TFF/RFF present | |
| 252 int interlace; ///< Progressive/interlaced (RPTFTM syntax element) | |
| 253 int tfcntrflag; ///< TFCNTR present | |
| 254 int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present | |
| 255 int extended_dmv; ///< Additional extended dmv range at P/B frame-level | |
| 256 int color_prim; ///< 8bits, chroma coordinates of the color primaries | |
| 257 int transfer_char; ///< 8bits, Opto-electronic transfer characteristics | |
| 258 int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix | |
| 259 int hrd_param_flag; ///< Presence of Hypothetical Reference | |
| 260 ///< Decoder parameters | |
| 261 int psf; ///< Progressive Segmented Frame | |
| 262 //@} | |
| 263 | |
| 264 /** Sequence header data for all Profiles | |
| 265 * TODO: choose between ints, uint8_ts and monobit flags | |
| 266 */ | |
| 267 //@{ | |
| 268 int profile; ///< 2bits, Profile | |
| 269 int frmrtq_postproc; ///< 3bits, | |
| 270 int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength | |
| 271 int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple) | |
| 272 int extended_mv; ///< Ext MV in P/B (not in Simple) | |
| 273 int dquant; ///< How qscale varies with MBs, 2bits (not in Simple) | |
| 274 int vstransform; ///< variable-size [48]x[48] transform type + info | |
| 275 int overlap; ///< overlapped transforms in use | |
| 276 int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_* | |
| 277 int finterpflag; ///< INTERPFRM present | |
| 278 //@} | |
| 279 | |
| 280 /** Frame decoding info for all profiles */ | |
| 281 //@{ | |
| 282 uint8_t mv_mode; ///< MV coding monde | |
| 283 uint8_t mv_mode2; ///< Secondary MV coding mode (B frames) | |
| 284 int k_x; ///< Number of bits for MVs (depends on MV range) | |
| 285 int k_y; ///< Number of bits for MVs (depends on MV range) | |
| 286 int range_x, range_y; ///< MV range | |
| 287 uint8_t pq, altpq; ///< Current/alternate frame quantizer scale | |
| 288 /** pquant parameters */ | |
| 289 //@{ | |
| 290 uint8_t dquantfrm; | |
| 291 uint8_t dqprofile; | |
| 292 uint8_t dqsbedge; | |
| 293 uint8_t dqbilevel; | |
| 294 //@} | |
| 295 /** AC coding set indexes | |
| 296 * @see 8.1.1.10, p(1)10 | |
| 297 */ | |
| 298 //@{ | |
| 299 int c_ac_table_index; ///< Chroma index from ACFRM element | |
| 300 int y_ac_table_index; ///< Luma index from AC2FRM element | |
| 301 //@} | |
| 302 int ttfrm; ///< Transform type info present at frame level | |
| 303 uint8_t ttmbf; ///< Transform type flag | |
| 304 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform | |
| 305 int codingset; ///< index of current table set from 11.8 to use for luma block decoding | |
| 306 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding | |
| 307 int pqindex; ///< raw pqindex used in coding set selection | |
| 308 int a_avail, c_avail; | |
| 309 uint8_t *mb_type_base, *mb_type[3]; | |
| 310 | |
| 311 | |
| 312 /** Luma compensation parameters */ | |
| 313 //@{ | |
| 314 uint8_t lumscale; | |
| 315 uint8_t lumshift; | |
| 316 //@} | |
| 317 int16_t bfraction; ///< Relative position % anchors=> how to scale MVs | |
| 318 uint8_t halfpq; ///< Uniform quant over image and qp+.5 | |
| 319 uint8_t respic; ///< Frame-level flag for resized images | |
| 320 int buffer_fullness; ///< HRD info | |
| 321 /** Ranges: | |
| 322 * -# 0 -> [-64n 63.f] x [-32, 31.f] | |
| 323 * -# 1 -> [-128, 127.f] x [-64, 63.f] | |
| 324 * -# 2 -> [-512, 511.f] x [-128, 127.f] | |
| 325 * -# 3 -> [-1024, 1023.f] x [-256, 255.f] | |
| 326 */ | |
| 327 uint8_t mvrange; | |
| 328 uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use | |
| 329 VLC *cbpcy_vlc; ///< CBPCY VLC table | |
| 330 int tt_index; ///< Index for Transform Type tables | |
| 331 uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV) | |
| 332 uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs | |
| 333 int mv_type_is_raw; ///< mv type mb plane is not coded | |
| 334 int dmb_is_raw; ///< direct mb plane is raw | |
| 335 int skip_is_raw; ///< skip mb plane is not coded | |
| 336 uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation | |
| 337 int use_ic; ///< use intensity compensation in B-frames | |
| 338 int rnd; ///< rounding control | |
| 339 | |
| 340 /** Frame decoding info for S/M profiles only */ | |
| 341 //@{ | |
| 342 uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128) | |
| 343 uint8_t interpfrm; | |
| 344 //@} | |
| 345 | |
| 346 /** Frame decoding info for Advanced profile */ | |
| 347 //@{ | |
| 348 uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace | |
| 349 uint8_t numpanscanwin; | |
| 350 uint8_t tfcntr; | |
| 351 uint8_t rptfrm, tff, rff; | |
| 352 uint16_t topleftx; | |
| 353 uint16_t toplefty; | |
| 354 uint16_t bottomrightx; | |
| 355 uint16_t bottomrighty; | |
| 356 uint8_t uvsamp; | |
| 357 uint8_t postproc; | |
| 358 int hrd_num_leaky_buckets; | |
| 359 uint8_t bit_rate_exponent; | |
| 360 uint8_t buffer_size_exponent; | |
| 361 uint8_t* acpred_plane; ///< AC prediction flags bitplane | |
| 362 int acpred_is_raw; | |
| 363 uint8_t* over_flags_plane; ///< Overflags bitplane | |
| 364 int overflg_is_raw; | |
| 365 uint8_t condover; | |
| 366 uint16_t *hrd_rate, *hrd_buffer; | |
| 367 uint8_t *hrd_fullness; | |
| 368 uint8_t range_mapy_flag; | |
| 369 uint8_t range_mapuv_flag; | |
| 370 uint8_t range_mapy; | |
| 371 uint8_t range_mapuv; | |
| 372 //@} | |
| 373 | |
| 374 int p_frame_skipped; | |
| 375 int bi_type; | |
| 376 } VC1Context; | |
| 377 | |
| 378 /** | |
| 379 * Get unary code of limited length | |
| 380 * @fixme FIXME Slow and ugly | |
| 381 * @param gb GetBitContext | |
| 382 * @param[in] stop The bitstop value (unary code of 1's or 0's) | |
| 383 * @param[in] len Maximum length | |
| 384 * @return Unary length/index | |
| 385 */ | |
| 386 static int get_prefix(GetBitContext *gb, int stop, int len) | |
| 387 { | |
| 388 #if 1 | |
| 389 int i; | |
| 390 | |
| 391 for(i = 0; i < len && get_bits1(gb) != stop; i++); | |
| 392 return i; | |
| 393 /* int i = 0, tmp = !stop; | |
| 394 | |
| 395 while (i != len && tmp != stop) | |
| 396 { | |
| 397 tmp = get_bits(gb, 1); | |
| 398 i++; | |
| 399 } | |
| 400 if (i == len && tmp != stop) return len+1; | |
| 401 return i;*/ | |
| 402 #else | |
| 403 unsigned int buf; | |
| 404 int log; | |
| 405 | |
| 406 OPEN_READER(re, gb); | |
| 407 UPDATE_CACHE(re, gb); | |
| 408 buf=GET_CACHE(re, gb); //Still not sure | |
| 409 if (stop) buf = ~buf; | |
| 410 | |
| 411 log= av_log2(-buf); //FIXME: -? | |
| 412 if (log < limit){ | |
| 413 LAST_SKIP_BITS(re, gb, log+1); | |
| 414 CLOSE_READER(re, gb); | |
| 415 return log; | |
| 416 } | |
| 417 | |
| 418 LAST_SKIP_BITS(re, gb, limit); | |
| 419 CLOSE_READER(re, gb); | |
| 420 return limit; | |
| 421 #endif | |
| 422 } | |
| 423 | |
| 424 static inline int decode210(GetBitContext *gb){ | |
| 425 int n; | |
| 426 n = get_bits1(gb); | |
| 427 if (n == 1) | |
| 428 return 0; | |
| 429 else | |
| 430 return 2 - get_bits1(gb); | |
| 431 } | |
| 432 | |
| 433 /** | |
| 434 * Init VC-1 specific tables and VC1Context members | |
| 435 * @param v The VC1Context to initialize | |
| 436 * @return Status | |
| 437 */ | |
| 438 static int vc1_init_common(VC1Context *v) | |
| 439 { | |
| 440 static int done = 0; | |
| 441 int i = 0; | |
| 442 | |
| 443 v->hrd_rate = v->hrd_buffer = NULL; | |
| 444 | |
| 445 /* VLC tables */ | |
| 446 if(!done) | |
| 447 { | |
| 448 done = 1; | |
| 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); | |
| 461 for (i=0; i<3; i++) | |
| 462 { | |
| 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); | |
| 472 } | |
| 473 for(i=0; i<4; i++) | |
| 474 { | |
| 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); | |
| 484 } | |
| 485 for(i=0; i<8; i++) | |
| 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); | |
| 492 } | |
| 493 | |
| 494 /* Other defaults */ | |
| 495 v->pq = -1; | |
| 496 v->mvrange = 0; /* 7.1.1.18, p80 */ | |
| 497 | |
| 498 return 0; | |
| 499 } | |
| 500 | |
| 501 /***********************************************************************/ | |
| 502 /** | |
| 503 * @defgroup bitplane VC9 Bitplane decoding | |
| 504 * @see 8.7, p56 | |
| 505 * @{ | |
| 506 */ | |
| 507 | |
| 508 /** @addtogroup bitplane | |
| 509 * Imode types | |
| 510 * @{ | |
| 511 */ | |
| 512 enum Imode { | |
| 513 IMODE_RAW, | |
| 514 IMODE_NORM2, | |
| 515 IMODE_DIFF2, | |
| 516 IMODE_NORM6, | |
| 517 IMODE_DIFF6, | |
| 518 IMODE_ROWSKIP, | |
| 519 IMODE_COLSKIP | |
| 520 }; | |
| 521 /** @} */ //imode defines | |
| 522 | |
| 523 /** Decode rows by checking if they are skipped | |
| 524 * @param plane Buffer to store decoded bits | |
| 525 * @param[in] width Width of this buffer | |
| 526 * @param[in] height Height of this buffer | |
| 527 * @param[in] stride of this buffer | |
| 528 */ | |
| 529 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ | |
| 530 int x, y; | |
| 531 | |
| 532 for (y=0; y<height; y++){ | |
| 533 if (!get_bits(gb, 1)) //rowskip | |
| 534 memset(plane, 0, width); | |
| 535 else | |
| 536 for (x=0; x<width; x++) | |
| 537 plane[x] = get_bits(gb, 1); | |
| 538 plane += stride; | |
| 539 } | |
| 540 } | |
| 541 | |
| 542 /** Decode columns by checking if they are skipped | |
| 543 * @param plane Buffer to store decoded bits | |
| 544 * @param[in] width Width of this buffer | |
| 545 * @param[in] height Height of this buffer | |
| 546 * @param[in] stride of this buffer | |
| 547 * @fixme FIXME: Optimize | |
| 548 */ | |
| 549 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ | |
| 550 int x, y; | |
| 551 | |
| 552 for (x=0; x<width; x++){ | |
| 553 if (!get_bits(gb, 1)) //colskip | |
| 554 for (y=0; y<height; y++) | |
| 555 plane[y*stride] = 0; | |
| 556 else | |
| 557 for (y=0; y<height; y++) | |
| 558 plane[y*stride] = get_bits(gb, 1); | |
| 559 plane ++; | |
| 560 } | |
| 561 } | |
| 562 | |
| 563 /** Decode a bitplane's bits | |
| 564 * @param bp Bitplane where to store the decode bits | |
| 565 * @param v VC-1 context for bit reading and logging | |
| 566 * @return Status | |
| 567 * @fixme FIXME: Optimize | |
| 568 */ | |
| 569 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) | |
| 570 { | |
| 571 GetBitContext *gb = &v->s.gb; | |
| 572 | |
| 573 int imode, x, y, code, offset; | |
| 574 uint8_t invert, *planep = data; | |
| 575 int width, height, stride; | |
| 576 | |
| 577 width = v->s.mb_width; | |
| 578 height = v->s.mb_height; | |
| 579 stride = v->s.mb_stride; | |
| 580 invert = get_bits(gb, 1); | |
| 581 imode = get_vlc2(gb, vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1); | |
| 582 | |
| 583 *raw_flag = 0; | |
| 584 switch (imode) | |
| 585 { | |
| 586 case IMODE_RAW: | |
| 587 //Data is actually read in the MB layer (same for all tests == "raw") | |
| 588 *raw_flag = 1; //invert ignored | |
| 589 return invert; | |
| 590 case IMODE_DIFF2: | |
| 591 case IMODE_NORM2: | |
| 592 if ((height * width) & 1) | |
| 593 { | |
| 594 *planep++ = get_bits(gb, 1); | |
| 595 offset = 1; | |
| 596 } | |
| 597 else offset = 0; | |
| 598 // decode bitplane as one long line | |
| 599 for (y = offset; y < height * width; y += 2) { | |
| 600 code = get_vlc2(gb, vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1); | |
| 601 *planep++ = code & 1; | |
| 602 offset++; | |
| 603 if(offset == width) { | |
| 604 offset = 0; | |
| 605 planep += stride - width; | |
| 606 } | |
| 607 *planep++ = code >> 1; | |
| 608 offset++; | |
| 609 if(offset == width) { | |
| 610 offset = 0; | |
| 611 planep += stride - width; | |
| 612 } | |
| 613 } | |
| 614 break; | |
| 615 case IMODE_DIFF6: | |
| 616 case IMODE_NORM6: | |
| 617 if(!(height % 3) && (width % 3)) { // use 2x3 decoding | |
| 618 for(y = 0; y < height; y+= 3) { | |
| 619 for(x = width & 1; x < width; x += 2) { | |
| 620 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); | |
| 621 if(code < 0){ | |
| 622 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); | |
| 623 return -1; | |
| 624 } | |
| 625 planep[x + 0] = (code >> 0) & 1; | |
| 626 planep[x + 1] = (code >> 1) & 1; | |
| 627 planep[x + 0 + stride] = (code >> 2) & 1; | |
| 628 planep[x + 1 + stride] = (code >> 3) & 1; | |
| 629 planep[x + 0 + stride * 2] = (code >> 4) & 1; | |
| 630 planep[x + 1 + stride * 2] = (code >> 5) & 1; | |
| 631 } | |
| 632 planep += stride * 3; | |
| 633 } | |
| 634 if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb); | |
| 635 } else { // 3x2 | |
| 636 planep += (height & 1) * stride; | |
| 637 for(y = height & 1; y < height; y += 2) { | |
| 638 for(x = width % 3; x < width; x += 3) { | |
| 639 code = get_vlc2(gb, vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); | |
| 640 if(code < 0){ | |
| 641 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); | |
| 642 return -1; | |
| 643 } | |
| 644 planep[x + 0] = (code >> 0) & 1; | |
| 645 planep[x + 1] = (code >> 1) & 1; | |
| 646 planep[x + 2] = (code >> 2) & 1; | |
| 647 planep[x + 0 + stride] = (code >> 3) & 1; | |
| 648 planep[x + 1 + stride] = (code >> 4) & 1; | |
| 649 planep[x + 2 + stride] = (code >> 5) & 1; | |
| 650 } | |
| 651 planep += stride * 2; | |
| 652 } | |
| 653 x = width % 3; | |
| 654 if(x) decode_colskip(data , x, height , stride, &v->s.gb); | |
| 655 if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb); | |
| 656 } | |
| 657 break; | |
| 658 case IMODE_ROWSKIP: | |
| 659 decode_rowskip(data, width, height, stride, &v->s.gb); | |
| 660 break; | |
| 661 case IMODE_COLSKIP: | |
| 662 decode_colskip(data, width, height, stride, &v->s.gb); | |
| 663 break; | |
| 664 default: break; | |
| 665 } | |
| 666 | |
| 667 /* Applying diff operator */ | |
| 668 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) | |
| 669 { | |
| 670 planep = data; | |
| 671 planep[0] ^= invert; | |
| 672 for (x=1; x<width; x++) | |
| 673 planep[x] ^= planep[x-1]; | |
| 674 for (y=1; y<height; y++) | |
| 675 { | |
| 676 planep += stride; | |
| 677 planep[0] ^= planep[-stride]; | |
| 678 for (x=1; x<width; x++) | |
| 679 { | |
| 680 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert; | |
| 681 else planep[x] ^= planep[x-1]; | |
| 682 } | |
| 683 } | |
| 684 } | |
| 685 else if (invert) | |
| 686 { | |
| 687 planep = data; | |
| 688 for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride | |
| 689 } | |
| 690 return (imode<<1) + invert; | |
| 691 } | |
| 692 | |
| 693 /** @} */ //Bitplane group | |
| 694 | |
| 695 /***********************************************************************/ | |
| 696 /** VOP Dquant decoding | |
| 697 * @param v VC-1 Context | |
| 698 */ | |
| 699 static int vop_dquant_decoding(VC1Context *v) | |
| 700 { | |
| 701 GetBitContext *gb = &v->s.gb; | |
| 702 int pqdiff; | |
| 703 | |
| 704 //variable size | |
| 705 if (v->dquant == 2) | |
| 706 { | |
| 707 pqdiff = get_bits(gb, 3); | |
| 708 if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
| 709 else v->altpq = v->pq + pqdiff + 1; | |
| 710 } | |
| 711 else | |
| 712 { | |
| 713 v->dquantfrm = get_bits(gb, 1); | |
| 714 if ( v->dquantfrm ) | |
| 715 { | |
| 716 v->dqprofile = get_bits(gb, 2); | |
| 717 switch (v->dqprofile) | |
| 718 { | |
| 719 case DQPROFILE_SINGLE_EDGE: | |
| 720 case DQPROFILE_DOUBLE_EDGES: | |
| 721 v->dqsbedge = get_bits(gb, 2); | |
| 722 break; | |
| 723 case DQPROFILE_ALL_MBS: | |
| 724 v->dqbilevel = get_bits(gb, 1); | |
| 725 default: break; //Forbidden ? | |
| 726 } | |
| 727 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) | |
| 728 { | |
| 729 pqdiff = get_bits(gb, 3); | |
| 730 if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
| 731 else v->altpq = v->pq + pqdiff + 1; | |
| 732 } | |
| 733 } | |
| 734 } | |
| 735 return 0; | |
| 736 } | |
| 737 | |
| 738 /** Put block onto picture | |
| 739 */ | |
| 740 static void vc1_put_block(VC1Context *v, DCTELEM block[6][64]) | |
| 741 { | |
| 742 uint8_t *Y; | |
| 743 int ys, us, vs; | |
| 744 DSPContext *dsp = &v->s.dsp; | |
| 745 | |
| 746 if(v->rangeredfrm) { | |
| 747 int i, j, k; | |
| 748 for(k = 0; k < 6; k++) | |
| 749 for(j = 0; j < 8; j++) | |
| 750 for(i = 0; i < 8; i++) | |
| 751 block[k][i + j*8] = ((block[k][i + j*8] - 128) << 1) + 128; | |
| 752 | |
| 753 } | |
| 754 ys = v->s.current_picture.linesize[0]; | |
| 755 us = v->s.current_picture.linesize[1]; | |
| 756 vs = v->s.current_picture.linesize[2]; | |
| 757 Y = v->s.dest[0]; | |
| 758 | |
| 759 dsp->put_pixels_clamped(block[0], Y, ys); | |
| 760 dsp->put_pixels_clamped(block[1], Y + 8, ys); | |
| 761 Y += ys * 8; | |
| 762 dsp->put_pixels_clamped(block[2], Y, ys); | |
| 763 dsp->put_pixels_clamped(block[3], Y + 8, ys); | |
| 764 | |
| 765 if(!(v->s.flags & CODEC_FLAG_GRAY)) { | |
| 766 dsp->put_pixels_clamped(block[4], v->s.dest[1], us); | |
| 767 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs); | |
| 768 } | |
| 769 } | |
| 770 | |
| 771 /** Do motion compensation over 1 macroblock | |
| 772 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c | |
| 773 */ | |
| 774 static void vc1_mc_1mv(VC1Context *v, int dir) | |
| 775 { | |
| 776 MpegEncContext *s = &v->s; | |
| 777 DSPContext *dsp = &v->s.dsp; | |
| 778 uint8_t *srcY, *srcU, *srcV; | |
| 779 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; | |
| 780 | |
| 781 if(!v->s.last_picture.data[0])return; | |
| 782 | |
| 783 mx = s->mv[dir][0][0]; | |
| 784 my = s->mv[dir][0][1]; | |
| 785 | |
| 786 // store motion vectors for further use in B frames | |
| 787 if(s->pict_type == P_TYPE) { | |
| 788 s->current_picture.motion_val[1][s->block_index[0]][0] = mx; | |
| 789 s->current_picture.motion_val[1][s->block_index[0]][1] = my; | |
| 790 } | |
| 791 uvmx = (mx + ((mx & 3) == 3)) >> 1; | |
| 792 uvmy = (my + ((my & 3) == 3)) >> 1; | |
| 793 if(!dir) { | |
| 794 srcY = s->last_picture.data[0]; | |
| 795 srcU = s->last_picture.data[1]; | |
| 796 srcV = s->last_picture.data[2]; | |
| 797 } else { | |
| 798 srcY = s->next_picture.data[0]; | |
| 799 srcU = s->next_picture.data[1]; | |
| 800 srcV = s->next_picture.data[2]; | |
| 801 } | |
| 802 | |
| 803 src_x = s->mb_x * 16 + (mx >> 2); | |
| 804 src_y = s->mb_y * 16 + (my >> 2); | |
| 805 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
| 806 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
| 807 | |
| 808 src_x = clip( src_x, -16, s->mb_width * 16); | |
| 809 src_y = clip( src_y, -16, s->mb_height * 16); | |
| 810 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8); | |
| 811 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8); | |
| 812 | |
| 813 srcY += src_y * s->linesize + src_x; | |
| 814 srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 815 srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 816 | |
| 817 /* for grayscale we should not try to read from unknown area */ | |
| 818 if(s->flags & CODEC_FLAG_GRAY) { | |
| 819 srcU = s->edge_emu_buffer + 18 * s->linesize; | |
| 820 srcV = s->edge_emu_buffer + 18 * s->linesize; | |
| 821 } | |
| 822 | |
| 823 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) | |
| 824 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3 | |
| 825 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){ | |
| 826 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; | |
| 827 | |
| 828 srcY -= s->mspel * (1 + s->linesize); | |
| 829 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2, | |
| 830 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
| 831 srcY = s->edge_emu_buffer; | |
| 832 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, | |
| 833 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
| 834 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, | |
| 835 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
| 836 srcU = uvbuf; | |
| 837 srcV = uvbuf + 16; | |
| 838 /* if we deal with range reduction we need to scale source blocks */ | |
| 839 if(v->rangeredfrm) { | |
| 840 int i, j; | |
| 841 uint8_t *src, *src2; | |
| 842 | |
| 843 src = srcY; | |
| 844 for(j = 0; j < 17 + s->mspel*2; j++) { | |
| 845 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; | |
| 846 src += s->linesize; | |
| 847 } | |
| 848 src = srcU; src2 = srcV; | |
| 849 for(j = 0; j < 9; j++) { | |
| 850 for(i = 0; i < 9; i++) { | |
| 851 src[i] = ((src[i] - 128) >> 1) + 128; | |
| 852 src2[i] = ((src2[i] - 128) >> 1) + 128; | |
| 853 } | |
| 854 src += s->uvlinesize; | |
| 855 src2 += s->uvlinesize; | |
| 856 } | |
| 857 } | |
| 858 /* if we deal with intensity compensation we need to scale source blocks */ | |
| 859 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
| 860 int i, j; | |
| 861 uint8_t *src, *src2; | |
| 862 | |
| 863 src = srcY; | |
| 864 for(j = 0; j < 17 + s->mspel*2; j++) { | |
| 865 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]]; | |
| 866 src += s->linesize; | |
| 867 } | |
| 868 src = srcU; src2 = srcV; | |
| 869 for(j = 0; j < 9; j++) { | |
| 870 for(i = 0; i < 9; i++) { | |
| 871 src[i] = v->lutuv[src[i]]; | |
| 872 src2[i] = v->lutuv[src2[i]]; | |
| 873 } | |
| 874 src += s->uvlinesize; | |
| 875 src2 += s->uvlinesize; | |
| 876 } | |
| 877 } | |
| 878 srcY += s->mspel * (1 + s->linesize); | |
| 879 } | |
| 880 | |
| 881 if(v->fastuvmc) { | |
| 882 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); | |
| 883 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); | |
| 884 } | |
| 885 | |
| 886 if(s->mspel) { | |
| 887 dxy = ((my & 3) << 2) | (mx & 3); | |
| 888 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd); | |
| 889 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd); | |
| 890 srcY += s->linesize * 8; | |
| 891 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd); | |
| 892 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd); | |
| 893 } else { // hpel mc - always used for luma | |
| 894 dxy = (my & 2) | ((mx & 2) >> 1); | |
| 895 | |
| 896 if(!v->rnd) | |
| 897 dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
| 898 else | |
| 899 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
| 900 } | |
| 901 | |
| 902 if(s->flags & CODEC_FLAG_GRAY) return; | |
| 903 /* Chroma MC always uses qpel bilinear */ | |
| 904 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); | |
| 905 uvmx = (uvmx&3)<<1; | |
| 906 uvmy = (uvmy&3)<<1; | |
| 907 if(!v->rnd){ | |
| 908 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 909 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 910 }else{ | |
| 911 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 912 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 913 } | |
| 914 } | |
| 915 | |
| 916 /** Do motion compensation for 4-MV macroblock - luminance block | |
| 917 */ | |
| 918 static void vc1_mc_4mv_luma(VC1Context *v, int n) | |
| 919 { | |
| 920 MpegEncContext *s = &v->s; | |
| 921 DSPContext *dsp = &v->s.dsp; | |
| 922 uint8_t *srcY; | |
| 923 int dxy, mx, my, src_x, src_y; | |
| 924 int off; | |
| 925 | |
| 926 if(!v->s.last_picture.data[0])return; | |
| 927 mx = s->mv[0][n][0]; | |
| 928 my = s->mv[0][n][1]; | |
| 929 srcY = s->last_picture.data[0]; | |
| 930 | |
| 931 off = s->linesize * 4 * (n&2) + (n&1) * 8; | |
| 932 | |
| 933 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2); | |
| 934 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2); | |
| 935 | |
| 936 src_x = clip( src_x, -16, s->mb_width * 16); | |
| 937 src_y = clip( src_y, -16, s->mb_height * 16); | |
| 938 | |
| 939 srcY += src_y * s->linesize + src_x; | |
| 940 | |
| 941 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) | |
| 942 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2 | |
| 943 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){ | |
| 944 srcY -= s->mspel * (1 + s->linesize); | |
| 945 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2, | |
| 946 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
| 947 srcY = s->edge_emu_buffer; | |
| 948 /* if we deal with range reduction we need to scale source blocks */ | |
| 949 if(v->rangeredfrm) { | |
| 950 int i, j; | |
| 951 uint8_t *src; | |
| 952 | |
| 953 src = srcY; | |
| 954 for(j = 0; j < 9 + s->mspel*2; j++) { | |
| 955 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; | |
| 956 src += s->linesize; | |
| 957 } | |
| 958 } | |
| 959 /* if we deal with intensity compensation we need to scale source blocks */ | |
| 960 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
| 961 int i, j; | |
| 962 uint8_t *src; | |
| 963 | |
| 964 src = srcY; | |
| 965 for(j = 0; j < 9 + s->mspel*2; j++) { | |
| 966 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]]; | |
| 967 src += s->linesize; | |
| 968 } | |
| 969 } | |
| 970 srcY += s->mspel * (1 + s->linesize); | |
| 971 } | |
| 972 | |
| 973 if(s->mspel) { | |
| 974 dxy = ((my & 3) << 2) | (mx & 3); | |
| 975 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd); | |
| 976 } else { // hpel mc - always used for luma | |
| 977 dxy = (my & 2) | ((mx & 2) >> 1); | |
| 978 if(!v->rnd) | |
| 979 dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); | |
| 980 else | |
| 981 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); | |
| 982 } | |
| 983 } | |
| 984 | |
| 985 static inline int median4(int a, int b, int c, int d) | |
| 986 { | |
| 987 if(a < b) { | |
| 988 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; | |
| 989 else return (FFMIN(b, c) + FFMAX(a, d)) / 2; | |
| 990 } else { | |
| 991 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; | |
| 992 else return (FFMIN(a, c) + FFMAX(b, d)) / 2; | |
| 993 } | |
| 994 } | |
| 995 | |
| 996 | |
| 997 /** Do motion compensation for 4-MV macroblock - both chroma blocks | |
| 998 */ | |
| 999 static void vc1_mc_4mv_chroma(VC1Context *v) | |
| 1000 { | |
| 1001 MpegEncContext *s = &v->s; | |
| 1002 DSPContext *dsp = &v->s.dsp; | |
| 1003 uint8_t *srcU, *srcV; | |
| 1004 int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y; | |
| 1005 int i, idx, tx = 0, ty = 0; | |
| 1006 int mvx[4], mvy[4], intra[4]; | |
| 1007 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; | |
| 1008 | |
| 1009 if(!v->s.last_picture.data[0])return; | |
| 1010 if(s->flags & CODEC_FLAG_GRAY) return; | |
| 1011 | |
| 1012 for(i = 0; i < 4; i++) { | |
| 1013 mvx[i] = s->mv[0][i][0]; | |
| 1014 mvy[i] = s->mv[0][i][1]; | |
| 1015 intra[i] = v->mb_type[0][s->block_index[i]]; | |
| 1016 } | |
| 1017 | |
| 1018 /* calculate chroma MV vector from four luma MVs */ | |
| 1019 idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0]; | |
| 1020 if(!idx) { // all blocks are inter | |
| 1021 tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]); | |
| 1022 ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]); | |
| 1023 } else if(count[idx] == 1) { // 3 inter blocks | |
| 1024 switch(idx) { | |
| 1025 case 0x1: | |
| 1026 tx = mid_pred(mvx[1], mvx[2], mvx[3]); | |
| 1027 ty = mid_pred(mvy[1], mvy[2], mvy[3]); | |
| 1028 break; | |
| 1029 case 0x2: | |
| 1030 tx = mid_pred(mvx[0], mvx[2], mvx[3]); | |
| 1031 ty = mid_pred(mvy[0], mvy[2], mvy[3]); | |
| 1032 break; | |
| 1033 case 0x4: | |
| 1034 tx = mid_pred(mvx[0], mvx[1], mvx[3]); | |
| 1035 ty = mid_pred(mvy[0], mvy[1], mvy[3]); | |
| 1036 break; | |
| 1037 case 0x8: | |
| 1038 tx = mid_pred(mvx[0], mvx[1], mvx[2]); | |
| 1039 ty = mid_pred(mvy[0], mvy[1], mvy[2]); | |
| 1040 break; | |
| 1041 } | |
| 1042 } else if(count[idx] == 2) { | |
| 1043 int t1 = 0, t2 = 0; | |
| 1044 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;} | |
| 1045 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;} | |
| 1046 tx = (mvx[t1] + mvx[t2]) / 2; | |
| 1047 ty = (mvy[t1] + mvy[t2]) / 2; | |
| 1048 } else | |
| 1049 return; //no need to do MC for inter blocks | |
| 1050 | |
| 1051 s->current_picture.motion_val[1][s->block_index[0]][0] = tx; | |
| 1052 s->current_picture.motion_val[1][s->block_index[0]][1] = ty; | |
| 1053 uvmx = (tx + ((tx&3) == 3)) >> 1; | |
| 1054 uvmy = (ty + ((ty&3) == 3)) >> 1; | |
| 1055 | |
| 1056 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
| 1057 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
| 1058 | |
| 1059 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8); | |
| 1060 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8); | |
| 1061 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 1062 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 1063 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) | |
| 1064 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 | |
| 1065 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){ | |
| 1066 ff_emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1, | |
| 1067 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
| 1068 ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1, | |
| 1069 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
| 1070 srcU = s->edge_emu_buffer; | |
| 1071 srcV = s->edge_emu_buffer + 16; | |
| 1072 | |
| 1073 /* if we deal with range reduction we need to scale source blocks */ | |
| 1074 if(v->rangeredfrm) { | |
| 1075 int i, j; | |
| 1076 uint8_t *src, *src2; | |
| 1077 | |
| 1078 src = srcU; src2 = srcV; | |
| 1079 for(j = 0; j < 9; j++) { | |
| 1080 for(i = 0; i < 9; i++) { | |
| 1081 src[i] = ((src[i] - 128) >> 1) + 128; | |
| 1082 src2[i] = ((src2[i] - 128) >> 1) + 128; | |
| 1083 } | |
| 1084 src += s->uvlinesize; | |
| 1085 src2 += s->uvlinesize; | |
| 1086 } | |
| 1087 } | |
| 1088 /* if we deal with intensity compensation we need to scale source blocks */ | |
| 1089 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
| 1090 int i, j; | |
| 1091 uint8_t *src, *src2; | |
| 1092 | |
| 1093 src = srcU; src2 = srcV; | |
| 1094 for(j = 0; j < 9; j++) { | |
| 1095 for(i = 0; i < 9; i++) { | |
| 1096 src[i] = v->lutuv[src[i]]; | |
| 1097 src2[i] = v->lutuv[src2[i]]; | |
| 1098 } | |
| 1099 src += s->uvlinesize; | |
| 1100 src2 += s->uvlinesize; | |
| 1101 } | |
| 1102 } | |
| 1103 } | |
| 1104 | |
| 1105 if(v->fastuvmc) { | |
| 1106 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); | |
| 1107 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); | |
| 1108 } | |
| 1109 | |
| 1110 /* Chroma MC always uses qpel bilinear */ | |
| 1111 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); | |
| 1112 uvmx = (uvmx&3)<<1; | |
| 1113 uvmy = (uvmy&3)<<1; | |
| 1114 if(!v->rnd){ | |
| 1115 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 1116 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 1117 }else{ | |
| 1118 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 1119 dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 1120 } | |
| 1121 } | |
| 1122 | |
| 1123 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb); | |
| 1124 | |
| 1125 /** | |
| 1126 * Decode Simple/Main Profiles sequence header | |
| 1127 * @see Figure 7-8, p16-17 | |
| 1128 * @param avctx Codec context | |
| 1129 * @param gb GetBit context initialized from Codec context extra_data | |
| 1130 * @return Status | |
| 1131 */ | |
| 1132 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) | |
| 1133 { | |
| 1134 VC1Context *v = avctx->priv_data; | |
| 1135 | |
| 1136 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32)); | |
| 1137 v->profile = get_bits(gb, 2); | |
| 1138 if (v->profile == 2) | |
| 1139 { | |
| 1140 av_log(avctx, AV_LOG_ERROR, "Profile value 2 is forbidden (and WMV3 Complex Profile is unsupported)\n"); | |
| 1141 return -1; | |
| 1142 } | |
| 1143 | |
| 1144 if (v->profile == PROFILE_ADVANCED) | |
| 1145 { | |
| 1146 return decode_sequence_header_adv(v, gb); | |
| 1147 } | |
| 1148 else | |
| 1149 { | |
| 1150 v->res_sm = get_bits(gb, 2); //reserved | |
| 1151 if (v->res_sm) | |
| 1152 { | |
| 1153 av_log(avctx, AV_LOG_ERROR, | |
| 1154 "Reserved RES_SM=%i is forbidden\n", v->res_sm); | |
| 1155 return -1; | |
| 1156 } | |
| 1157 } | |
| 1158 | |
| 1159 // (fps-2)/4 (->30) | |
| 1160 v->frmrtq_postproc = get_bits(gb, 3); //common | |
| 1161 // (bitrate-32kbps)/64kbps | |
| 1162 v->bitrtq_postproc = get_bits(gb, 5); //common | |
| 1163 v->s.loop_filter = get_bits(gb, 1); //common | |
| 1164 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) | |
| 1165 { | |
| 1166 av_log(avctx, AV_LOG_ERROR, | |
| 1167 "LOOPFILTER shell not be enabled in simple profile\n"); | |
| 1168 } | |
| 1169 | |
| 1170 v->res_x8 = get_bits(gb, 1); //reserved | |
| 1171 if (v->res_x8) | |
| 1172 { | |
| 1173 av_log(avctx, AV_LOG_ERROR, | |
| 1174 "1 for reserved RES_X8 is forbidden\n"); | |
| 1175 //return -1; | |
| 1176 } | |
| 1177 v->multires = get_bits(gb, 1); | |
| 1178 v->res_fasttx = get_bits(gb, 1); | |
| 1179 if (!v->res_fasttx) | |
| 1180 { | |
| 1181 av_log(avctx, AV_LOG_ERROR, | |
| 1182 "0 for reserved RES_FASTTX is forbidden\n"); | |
| 1183 //return -1; | |
| 1184 } | |
| 1185 | |
| 1186 v->fastuvmc = get_bits(gb, 1); //common | |
| 1187 if (!v->profile && !v->fastuvmc) | |
| 1188 { | |
| 1189 av_log(avctx, AV_LOG_ERROR, | |
| 1190 "FASTUVMC unavailable in Simple Profile\n"); | |
| 1191 return -1; | |
| 1192 } | |
| 1193 v->extended_mv = get_bits(gb, 1); //common | |
| 1194 if (!v->profile && v->extended_mv) | |
| 1195 { | |
| 1196 av_log(avctx, AV_LOG_ERROR, | |
| 1197 "Extended MVs unavailable in Simple Profile\n"); | |
| 1198 return -1; | |
| 1199 } | |
| 1200 v->dquant = get_bits(gb, 2); //common | |
| 1201 v->vstransform = get_bits(gb, 1); //common | |
| 1202 | |
| 1203 v->res_transtab = get_bits(gb, 1); | |
| 1204 if (v->res_transtab) | |
| 1205 { | |
| 1206 av_log(avctx, AV_LOG_ERROR, | |
| 1207 "1 for reserved RES_TRANSTAB is forbidden\n"); | |
| 1208 return -1; | |
| 1209 } | |
| 1210 | |
| 1211 v->overlap = get_bits(gb, 1); //common | |
| 1212 | |
| 1213 v->s.resync_marker = get_bits(gb, 1); | |
| 1214 v->rangered = get_bits(gb, 1); | |
| 1215 if (v->rangered && v->profile == PROFILE_SIMPLE) | |
| 1216 { | |
| 1217 av_log(avctx, AV_LOG_INFO, | |
| 1218 "RANGERED should be set to 0 in simple profile\n"); | |
| 1219 } | |
| 1220 | |
| 1221 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common | |
| 1222 v->quantizer_mode = get_bits(gb, 2); //common | |
| 1223 | |
| 1224 v->finterpflag = get_bits(gb, 1); //common | |
| 1225 v->res_rtm_flag = get_bits(gb, 1); //reserved | |
| 1226 if (!v->res_rtm_flag) | |
| 1227 { | |
| 1228 // av_log(avctx, AV_LOG_ERROR, | |
| 1229 // "0 for reserved RES_RTM_FLAG is forbidden\n"); | |
| 1230 av_log(avctx, AV_LOG_ERROR, | |
| 1231 "Old WMV3 version detected, only I-frames will be decoded\n"); | |
| 1232 //return -1; | |
| 1233 } | |
| 1234 av_log(avctx, AV_LOG_DEBUG, | |
| 1235 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" | |
| 1236 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n" | |
| 1237 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n" | |
| 1238 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n", | |
| 1239 v->profile, v->frmrtq_postproc, v->bitrtq_postproc, | |
| 1240 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv, | |
| 1241 v->rangered, v->vstransform, v->overlap, v->s.resync_marker, | |
| 1242 v->dquant, v->quantizer_mode, avctx->max_b_frames | |
| 1243 ); | |
| 1244 return 0; | |
| 1245 } | |
| 1246 | |
| 1247 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) | |
| 1248 { | |
| 1249 v->res_rtm_flag = 1; | |
| 1250 v->level = get_bits(gb, 3); | |
| 1251 if(v->level >= 5) | |
| 1252 { | |
| 1253 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level); | |
| 1254 } | |
| 1255 v->chromaformat = get_bits(gb, 2); | |
| 1256 if (v->chromaformat != 1) | |
| 1257 { | |
| 1258 av_log(v->s.avctx, AV_LOG_ERROR, | |
| 1259 "Only 4:2:0 chroma format supported\n"); | |
| 1260 return -1; | |
| 1261 } | |
| 1262 | |
| 1263 // (fps-2)/4 (->30) | |
| 1264 v->frmrtq_postproc = get_bits(gb, 3); //common | |
| 1265 // (bitrate-32kbps)/64kbps | |
| 1266 v->bitrtq_postproc = get_bits(gb, 5); //common | |
| 1267 v->postprocflag = get_bits(gb, 1); //common | |
| 1268 | |
| 1269 v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1; | |
| 1270 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1; | |
| 1271 v->broadcast = get_bits1(gb); | |
| 1272 v->interlace = get_bits1(gb); | |
| 1273 v->tfcntrflag = get_bits1(gb); | |
| 1274 v->finterpflag = get_bits1(gb); | |
| 1275 get_bits1(gb); // reserved | |
| 1276 v->psf = get_bits1(gb); | |
| 1277 if(v->psf) { //PsF, 6.1.13 | |
| 1278 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n"); | |
| 1279 return -1; | |
| 1280 } | |
| 1281 if(get_bits1(gb)) { //Display Info - decoding is not affected by it | |
| 1282 int w, h, ar = 0; | |
| 1283 av_log(v->s.avctx, AV_LOG_INFO, "Display extended info:\n"); | |
| 1284 w = get_bits(gb, 14); | |
| 1285 h = get_bits(gb, 14); | |
| 1286 av_log(v->s.avctx, AV_LOG_INFO, "Display dimensions: %ix%i\n", w, h); | |
| 1287 //TODO: store aspect ratio in AVCodecContext | |
| 1288 if(get_bits1(gb)) | |
| 1289 ar = get_bits(gb, 4); | |
| 1290 if(ar == 15) { | |
| 1291 w = get_bits(gb, 8); | |
| 1292 h = get_bits(gb, 8); | |
| 1293 } | |
| 1294 | |
| 1295 if(get_bits1(gb)){ //framerate stuff | |
| 1296 if(get_bits1(gb)) { | |
| 1297 get_bits(gb, 16); | |
| 1298 } else { | |
| 1299 get_bits(gb, 8); | |
| 1300 get_bits(gb, 4); | |
| 1301 } | |
| 1302 } | |
| 1303 | |
| 1304 if(get_bits1(gb)){ | |
| 1305 v->color_prim = get_bits(gb, 8); | |
| 1306 v->transfer_char = get_bits(gb, 8); | |
| 1307 v->matrix_coef = get_bits(gb, 8); | |
| 1308 } | |
| 1309 } | |
| 1310 | |
| 1311 v->hrd_param_flag = get_bits1(gb); | |
| 1312 if(v->hrd_param_flag) { | |
| 1313 int i; | |
| 1314 v->hrd_num_leaky_buckets = get_bits(gb, 5); | |
| 1315 get_bits(gb, 4); //bitrate exponent | |
| 1316 get_bits(gb, 4); //buffer size exponent | |
| 1317 for(i = 0; i < v->hrd_num_leaky_buckets; i++) { | |
| 1318 get_bits(gb, 16); //hrd_rate[n] | |
| 1319 get_bits(gb, 16); //hrd_buffer[n] | |
| 1320 } | |
| 1321 } | |
| 1322 return 0; | |
| 1323 } | |
| 1324 | |
| 1325 static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb) | |
| 1326 { | |
| 1327 VC1Context *v = avctx->priv_data; | |
| 1328 int i; | |
| 1329 | |
| 1330 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32)); | |
| 1331 get_bits1(gb); // broken link | |
| 1332 avctx->max_b_frames = 1 - get_bits1(gb); // 'closed entry' also signalize possible B-frames | |
| 1333 v->panscanflag = get_bits1(gb); | |
| 1334 get_bits1(gb); // refdist flag | |
| 1335 v->s.loop_filter = get_bits1(gb); | |
| 1336 v->fastuvmc = get_bits1(gb); | |
| 1337 v->extended_mv = get_bits1(gb); | |
| 1338 v->dquant = get_bits(gb, 2); | |
| 1339 v->vstransform = get_bits1(gb); | |
| 1340 v->overlap = get_bits1(gb); | |
| 1341 v->quantizer_mode = get_bits(gb, 2); | |
| 1342 | |
| 1343 if(v->hrd_param_flag){ | |
| 1344 for(i = 0; i < v->hrd_num_leaky_buckets; i++) { | |
| 1345 get_bits(gb, 8); //hrd_full[n] | |
| 1346 } | |
| 1347 } | |
| 1348 | |
| 1349 if(get_bits1(gb)){ | |
| 1350 avctx->coded_width = (get_bits(gb, 12)+1)<<1; | |
| 1351 avctx->coded_height = (get_bits(gb, 12)+1)<<1; | |
| 1352 } | |
| 1353 if(v->extended_mv) | |
| 1354 v->extended_dmv = get_bits1(gb); | |
| 1355 if(get_bits1(gb)) { | |
| 1356 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n"); | |
| 1357 skip_bits(gb, 3); // Y range, ignored for now | |
| 1358 } | |
| 1359 if(get_bits1(gb)) { | |
| 1360 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n"); | |
| 1361 skip_bits(gb, 3); // UV range, ignored for now | |
| 1362 } | |
| 1363 | |
| 1364 return 0; | |
| 1365 } | |
| 1366 | |
| 1367 static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) | |
| 1368 { | |
| 1369 int pqindex, lowquant, status; | |
| 1370 | |
| 1371 if(v->finterpflag) v->interpfrm = get_bits(gb, 1); | |
| 1372 skip_bits(gb, 2); //framecnt unused | |
| 1373 v->rangeredfrm = 0; | |
| 1374 if (v->rangered) v->rangeredfrm = get_bits(gb, 1); | |
| 1375 v->s.pict_type = get_bits(gb, 1); | |
| 1376 if (v->s.avctx->max_b_frames) { | |
| 1377 if (!v->s.pict_type) { | |
| 1378 if (get_bits(gb, 1)) v->s.pict_type = I_TYPE; | |
| 1379 else v->s.pict_type = B_TYPE; | |
| 1380 } else v->s.pict_type = P_TYPE; | |
| 1381 } else v->s.pict_type = v->s.pict_type ? P_TYPE : I_TYPE; | |
| 1382 | |
| 1383 v->bi_type = 0; | |
| 1384 if(v->s.pict_type == B_TYPE) { | |
| 1385 v->bfraction = get_vlc2(gb, vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1); | |
| 1386 v->bfraction = vc1_bfraction_lut[v->bfraction]; | |
| 1387 if(v->bfraction == 0) { | |
| 1388 v->s.pict_type = BI_TYPE; | |
| 1389 } | |
| 1390 } | |
| 1391 if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) | |
| 1392 get_bits(gb, 7); // skip buffer fullness | |
| 1393 | |
| 1394 /* calculate RND */ | |
| 1395 if(v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) | |
| 1396 v->rnd = 1; | |
| 1397 if(v->s.pict_type == P_TYPE) | |
| 1398 v->rnd ^= 1; | |
| 1399 | |
| 1400 /* Quantizer stuff */ | |
| 1401 pqindex = get_bits(gb, 5); | |
| 1402 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) | |
| 1403 v->pq = pquant_table[0][pqindex]; | |
| 1404 else | |
| 1405 v->pq = pquant_table[1][pqindex]; | |
| 1406 | |
| 1407 v->pquantizer = 1; | |
| 1408 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) | |
| 1409 v->pquantizer = pqindex < 9; | |
| 1410 if (v->quantizer_mode == QUANT_NON_UNIFORM) | |
| 1411 v->pquantizer = 0; | |
| 1412 v->pqindex = pqindex; | |
| 1413 if (pqindex < 9) v->halfpq = get_bits(gb, 1); | |
| 1414 else v->halfpq = 0; | |
| 1415 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) | |
| 1416 v->pquantizer = get_bits(gb, 1); | |
| 1417 v->dquantfrm = 0; | |
| 1418 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3); | |
| 1419 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | |
| 1420 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | |
| 1421 v->range_x = 1 << (v->k_x - 1); | |
| 1422 v->range_y = 1 << (v->k_y - 1); | |
| 1423 if (v->profile == PROFILE_ADVANCED) | |
| 1424 { | |
| 1425 if (v->postprocflag) v->postproc = get_bits(gb, 1); | |
| 1426 } | |
| 1427 else | |
| 1428 if (v->multires && v->s.pict_type != B_TYPE) v->respic = get_bits(gb, 2); | |
| 1429 | |
| 1430 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n", | |
| 1431 // (v->s.pict_type == P_TYPE) ? 'P' : ((v->s.pict_type == I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm); | |
| 1432 | |
| 1433 if(v->s.pict_type == I_TYPE || v->s.pict_type == P_TYPE) v->use_ic = 0; | |
| 1434 | |
| 1435 switch(v->s.pict_type) { | |
| 1436 case P_TYPE: | |
| 1437 if (v->pq < 5) v->tt_index = 0; | |
| 1438 else if(v->pq < 13) v->tt_index = 1; | |
| 1439 else v->tt_index = 2; | |
| 1440 | |
| 1441 lowquant = (v->pq > 12) ? 0 : 1; | |
| 1442 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; | |
| 1443 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) | |
| 1444 { | |
| 1445 int scale, shift, i; | |
| 1446 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)]; | |
| 1447 v->lumscale = get_bits(gb, 6); | |
| 1448 v->lumshift = get_bits(gb, 6); | |
| 1449 v->use_ic = 1; | |
| 1450 /* fill lookup tables for intensity compensation */ | |
| 1451 if(!v->lumscale) { | |
| 1452 scale = -64; | |
| 1453 shift = (255 - v->lumshift * 2) << 6; | |
| 1454 if(v->lumshift > 31) | |
| 1455 shift += 128 << 6; | |
| 1456 } else { | |
| 1457 scale = v->lumscale + 32; | |
| 1458 if(v->lumshift > 31) | |
| 1459 shift = (v->lumshift - 64) << 6; | |
| 1460 else | |
| 1461 shift = v->lumshift << 6; | |
| 1462 } | |
| 1463 for(i = 0; i < 256; i++) { | |
| 1464 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6); | |
| 1465 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); | |
| 1466 } | |
| 1467 } | |
| 1468 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN) | |
| 1469 v->s.quarter_sample = 0; | |
| 1470 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
| 1471 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN) | |
| 1472 v->s.quarter_sample = 0; | |
| 1473 else | |
| 1474 v->s.quarter_sample = 1; | |
| 1475 } else | |
| 1476 v->s.quarter_sample = 1; | |
| 1477 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)); | |
| 1478 | |
| 1479 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && | |
| 1480 v->mv_mode2 == MV_PMODE_MIXED_MV) | |
| 1481 || v->mv_mode == MV_PMODE_MIXED_MV) | |
| 1482 { | |
| 1483 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v); | |
| 1484 if (status < 0) return -1; | |
| 1485 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " | |
| 1486 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1487 } else { | |
| 1488 v->mv_type_is_raw = 0; | |
| 1489 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height); | |
| 1490 } | |
| 1491 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
| 1492 if (status < 0) return -1; | |
| 1493 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
| 1494 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1495 | |
| 1496 /* Hopefully this is correct for P frames */ | |
| 1497 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables | |
| 1498 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
| 1499 | |
| 1500 if (v->dquant) | |
| 1501 { | |
| 1502 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
| 1503 vop_dquant_decoding(v); | |
| 1504 } | |
| 1505 | |
| 1506 v->ttfrm = 0; //FIXME Is that so ? | |
| 1507 if (v->vstransform) | |
| 1508 { | |
| 1509 v->ttmbf = get_bits(gb, 1); | |
| 1510 if (v->ttmbf) | |
| 1511 { | |
| 1512 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)]; | |
| 1513 } | |
| 1514 } else { | |
| 1515 v->ttmbf = 1; | |
| 1516 v->ttfrm = TT_8X8; | |
| 1517 } | |
| 1518 break; | |
| 1519 case B_TYPE: | |
| 1520 if (v->pq < 5) v->tt_index = 0; | |
| 1521 else if(v->pq < 13) v->tt_index = 1; | |
| 1522 else v->tt_index = 2; | |
| 1523 | |
| 1524 lowquant = (v->pq > 12) ? 0 : 1; | |
| 1525 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN; | |
| 1526 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV); | |
| 1527 v->s.mspel = v->s.quarter_sample; | |
| 1528 | |
| 1529 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v); | |
| 1530 if (status < 0) return -1; | |
| 1531 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: " | |
| 1532 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1533 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
| 1534 if (status < 0) return -1; | |
| 1535 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
| 1536 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1537 | |
| 1538 v->s.mv_table_index = get_bits(gb, 2); | |
| 1539 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
| 1540 | |
| 1541 if (v->dquant) | |
| 1542 { | |
| 1543 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
| 1544 vop_dquant_decoding(v); | |
| 1545 } | |
| 1546 | |
| 1547 v->ttfrm = 0; | |
| 1548 if (v->vstransform) | |
| 1549 { | |
| 1550 v->ttmbf = get_bits(gb, 1); | |
| 1551 if (v->ttmbf) | |
| 1552 { | |
| 1553 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)]; | |
| 1554 } | |
| 1555 } else { | |
| 1556 v->ttmbf = 1; | |
| 1557 v->ttfrm = TT_8X8; | |
| 1558 } | |
| 1559 break; | |
| 1560 } | |
| 1561 | |
| 1562 /* AC Syntax */ | |
| 1563 v->c_ac_table_index = decode012(gb); | |
| 1564 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) | |
| 1565 { | |
| 1566 v->y_ac_table_index = decode012(gb); | |
| 1567 } | |
| 1568 /* DC Syntax */ | |
| 1569 v->s.dc_table_index = get_bits(gb, 1); | |
| 1570 | |
| 1571 if(v->s.pict_type == BI_TYPE) { | |
| 1572 v->s.pict_type = B_TYPE; | |
| 1573 v->bi_type = 1; | |
| 1574 } | |
| 1575 return 0; | |
| 1576 } | |
| 1577 | |
| 1578 static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) | |
| 1579 { | |
| 1580 int fcm; | |
| 1581 int pqindex, lowquant; | |
| 1582 int status; | |
| 1583 | |
| 1584 v->p_frame_skipped = 0; | |
| 1585 | |
| 1586 if(v->interlace) | |
| 1587 fcm = decode012(gb); | |
| 1588 switch(get_prefix(gb, 0, 4)) { | |
| 1589 case 0: | |
| 1590 v->s.pict_type = P_TYPE; | |
| 1591 break; | |
| 1592 case 1: | |
| 1593 v->s.pict_type = B_TYPE; | |
| 1594 return -1; | |
| 1595 // break; | |
| 1596 case 2: | |
| 1597 v->s.pict_type = I_TYPE; | |
| 1598 break; | |
| 1599 case 3: | |
| 1600 v->s.pict_type = BI_TYPE; | |
| 1601 break; | |
| 1602 case 4: | |
| 1603 v->s.pict_type = P_TYPE; // skipped pic | |
| 1604 v->p_frame_skipped = 1; | |
| 1605 return 0; | |
| 1606 } | |
| 1607 if(v->tfcntrflag) | |
| 1608 get_bits(gb, 8); | |
| 1609 if(v->broadcast) { | |
| 1610 if(!v->interlace || v->panscanflag) { | |
| 1611 get_bits(gb, 2); | |
| 1612 } else { | |
| 1613 get_bits1(gb); | |
| 1614 get_bits1(gb); | |
| 1615 } | |
| 1616 } | |
| 1617 if(v->panscanflag) { | |
| 1618 //... | |
| 1619 } | |
| 1620 v->rnd = get_bits1(gb); | |
| 1621 if(v->interlace) | |
| 1622 v->uvsamp = get_bits1(gb); | |
| 1623 if(v->finterpflag) v->interpfrm = get_bits(gb, 1); | |
| 1624 pqindex = get_bits(gb, 5); | |
| 1625 v->pqindex = pqindex; | |
| 1626 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) | |
| 1627 v->pq = pquant_table[0][pqindex]; | |
| 1628 else | |
| 1629 v->pq = pquant_table[1][pqindex]; | |
| 1630 | |
| 1631 v->pquantizer = 1; | |
| 1632 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) | |
| 1633 v->pquantizer = pqindex < 9; | |
| 1634 if (v->quantizer_mode == QUANT_NON_UNIFORM) | |
| 1635 v->pquantizer = 0; | |
| 1636 v->pqindex = pqindex; | |
| 1637 if (pqindex < 9) v->halfpq = get_bits(gb, 1); | |
| 1638 else v->halfpq = 0; | |
| 1639 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) | |
| 1640 v->pquantizer = get_bits(gb, 1); | |
| 1641 | |
| 1642 switch(v->s.pict_type) { | |
| 1643 case I_TYPE: | |
| 1644 case BI_TYPE: | |
| 1645 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v); | |
| 1646 if (status < 0) return -1; | |
| 1647 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: " | |
| 1648 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1649 v->condover = CONDOVER_NONE; | |
| 1650 if(v->overlap && v->pq <= 8) { | |
| 1651 v->condover = decode012(gb); | |
| 1652 if(v->condover == CONDOVER_SELECT) { | |
| 1653 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v); | |
| 1654 if (status < 0) return -1; | |
| 1655 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: " | |
| 1656 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1657 } | |
| 1658 } | |
| 1659 break; | |
| 1660 case P_TYPE: | |
| 1661 if(v->postprocflag) | |
| 1662 v->postproc = get_bits1(gb); | |
| 1663 if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3); | |
| 1664 else v->mvrange = 0; | |
| 1665 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | |
| 1666 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | |
| 1667 v->range_x = 1 << (v->k_x - 1); | |
| 1668 v->range_y = 1 << (v->k_y - 1); | |
| 1669 | |
| 1670 if (v->pq < 5) v->tt_index = 0; | |
| 1671 else if(v->pq < 13) v->tt_index = 1; | |
| 1672 else v->tt_index = 2; | |
| 1673 | |
| 1674 lowquant = (v->pq > 12) ? 0 : 1; | |
| 1675 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; | |
| 1676 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) | |
| 1677 { | |
| 1678 int scale, shift, i; | |
| 1679 v->mv_mode2 = mv_pmode_table2[lowquant][get_prefix(gb, 1, 3)]; | |
| 1680 v->lumscale = get_bits(gb, 6); | |
| 1681 v->lumshift = get_bits(gb, 6); | |
| 1682 /* fill lookup tables for intensity compensation */ | |
| 1683 if(!v->lumscale) { | |
| 1684 scale = -64; | |
| 1685 shift = (255 - v->lumshift * 2) << 6; | |
| 1686 if(v->lumshift > 31) | |
| 1687 shift += 128 << 6; | |
| 1688 } else { | |
| 1689 scale = v->lumscale + 32; | |
| 1690 if(v->lumshift > 31) | |
| 1691 shift = (v->lumshift - 64) << 6; | |
| 1692 else | |
| 1693 shift = v->lumshift << 6; | |
| 1694 } | |
| 1695 for(i = 0; i < 256; i++) { | |
| 1696 v->luty[i] = clip_uint8((scale * i + shift + 32) >> 6); | |
| 1697 v->lutuv[i] = clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); | |
| 1698 } | |
| 1699 } | |
| 1700 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN) | |
| 1701 v->s.quarter_sample = 0; | |
| 1702 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | |
| 1703 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN) | |
| 1704 v->s.quarter_sample = 0; | |
| 1705 else | |
| 1706 v->s.quarter_sample = 1; | |
| 1707 } else | |
| 1708 v->s.quarter_sample = 1; | |
| 1709 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)); | |
| 1710 | |
| 1711 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && | |
| 1712 v->mv_mode2 == MV_PMODE_MIXED_MV) | |
| 1713 || v->mv_mode == MV_PMODE_MIXED_MV) | |
| 1714 { | |
| 1715 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v); | |
| 1716 if (status < 0) return -1; | |
| 1717 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " | |
| 1718 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1719 } else { | |
| 1720 v->mv_type_is_raw = 0; | |
| 1721 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height); | |
| 1722 } | |
| 1723 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
| 1724 if (status < 0) return -1; | |
| 1725 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
| 1726 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
| 1727 | |
| 1728 /* Hopefully this is correct for P frames */ | |
| 1729 v->s.mv_table_index = get_bits(gb, 2); //but using vc1_ tables | |
| 1730 v->cbpcy_vlc = &vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
| 1731 if (v->dquant) | |
| 1732 { | |
| 1733 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
| 1734 vop_dquant_decoding(v); | |
| 1735 } | |
| 1736 | |
| 1737 v->ttfrm = 0; //FIXME Is that so ? | |
| 1738 if (v->vstransform) | |
| 1739 { | |
| 1740 v->ttmbf = get_bits(gb, 1); | |
| 1741 if (v->ttmbf) | |
| 1742 { | |
| 1743 v->ttfrm = ttfrm_to_tt[get_bits(gb, 2)]; | |
| 1744 } | |
| 1745 } else { | |
| 1746 v->ttmbf = 1; | |
| 1747 v->ttfrm = TT_8X8; | |
| 1748 } | |
| 1749 break; | |
| 1750 } | |
| 1751 | |
| 1752 /* AC Syntax */ | |
| 1753 v->c_ac_table_index = decode012(gb); | |
| 1754 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) | |
| 1755 { | |
| 1756 v->y_ac_table_index = decode012(gb); | |
| 1757 } | |
| 1758 /* DC Syntax */ | |
| 1759 v->s.dc_table_index = get_bits(gb, 1); | |
| 1760 if (v->s.pict_type == I_TYPE && v->dquant) { | |
| 1761 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
| 1762 vop_dquant_decoding(v); | |
| 1763 } | |
| 1764 | |
| 1765 v->bi_type = 0; | |
| 1766 if(v->s.pict_type == BI_TYPE) { | |
| 1767 v->s.pict_type = B_TYPE; | |
| 1768 v->bi_type = 1; | |
| 1769 } | |
| 1770 return 0; | |
| 1771 } | |
| 1772 | |
| 1773 /***********************************************************************/ | |
| 1774 /** | |
| 1775 * @defgroup block VC-1 Block-level functions | |
| 1776 * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | |
| 1777 * @{ | |
| 1778 */ | |
| 1779 | |
| 1780 /** | |
| 1781 * @def GET_MQUANT | |
| 1782 * @brief Get macroblock-level quantizer scale | |
| 1783 */ | |
| 1784 #define GET_MQUANT() \ | |
| 1785 if (v->dquantfrm) \ | |
| 1786 { \ | |
| 1787 int edges = 0; \ | |
| 1788 if (v->dqprofile == DQPROFILE_ALL_MBS) \ | |
| 1789 { \ | |
| 1790 if (v->dqbilevel) \ | |
| 1791 { \ | |
| 1792 mquant = (get_bits(gb, 1)) ? v->altpq : v->pq; \ | |
| 1793 } \ | |
| 1794 else \ | |
| 1795 { \ | |
| 1796 mqdiff = get_bits(gb, 3); \ | |
| 1797 if (mqdiff != 7) mquant = v->pq + mqdiff; \ | |
| 1798 else mquant = get_bits(gb, 5); \ | |
| 1799 } \ | |
| 1800 } \ | |
| 1801 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \ | |
| 1802 edges = 1 << v->dqsbedge; \ | |
| 1803 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \ | |
| 1804 edges = (3 << v->dqsbedge) % 15; \ | |
| 1805 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \ | |
| 1806 edges = 15; \ | |
| 1807 if((edges&1) && !s->mb_x) \ | |
| 1808 mquant = v->altpq; \ | |
| 1809 if((edges&2) && s->first_slice_line) \ | |
| 1810 mquant = v->altpq; \ | |
| 1811 if((edges&4) && s->mb_x == (s->mb_width - 1)) \ | |
| 1812 mquant = v->altpq; \ | |
| 1813 if((edges&8) && s->mb_y == (s->mb_height - 1)) \ | |
| 1814 mquant = v->altpq; \ | |
| 1815 } | |
| 1816 | |
| 1817 /** | |
| 1818 * @def GET_MVDATA(_dmv_x, _dmv_y) | |
| 1819 * @brief Get MV differentials | |
| 1820 * @see MVDATA decoding from 8.3.5.2, p(1)20 | |
| 1821 * @param _dmv_x Horizontal differential for decoded MV | |
| 1822 * @param _dmv_y Vertical differential for decoded MV | |
| 1823 */ | |
| 1824 #define GET_MVDATA(_dmv_x, _dmv_y) \ | |
| 1825 index = 1 + get_vlc2(gb, vc1_mv_diff_vlc[s->mv_table_index].table,\ | |
| 1826 VC1_MV_DIFF_VLC_BITS, 2); \ | |
| 1827 if (index > 36) \ | |
| 1828 { \ | |
| 1829 mb_has_coeffs = 1; \ | |
| 1830 index -= 37; \ | |
| 1831 } \ | |
| 1832 else mb_has_coeffs = 0; \ | |
| 1833 s->mb_intra = 0; \ | |
| 1834 if (!index) { _dmv_x = _dmv_y = 0; } \ | |
| 1835 else if (index == 35) \ | |
| 1836 { \ | |
| 1837 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \ | |
| 1838 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \ | |
| 1839 } \ | |
| 1840 else if (index == 36) \ | |
| 1841 { \ | |
| 1842 _dmv_x = 0; \ | |
| 1843 _dmv_y = 0; \ | |
| 1844 s->mb_intra = 1; \ | |
| 1845 } \ | |
| 1846 else \ | |
| 1847 { \ | |
| 1848 index1 = index%6; \ | |
| 1849 if (!s->quarter_sample && index1 == 5) val = 1; \ | |
| 1850 else val = 0; \ | |
| 1851 if(size_table[index1] - val > 0) \ | |
| 1852 val = get_bits(gb, size_table[index1] - val); \ | |
| 1853 else val = 0; \ | |
| 1854 sign = 0 - (val&1); \ | |
| 1855 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
| 1856 \ | |
| 1857 index1 = index/6; \ | |
| 1858 if (!s->quarter_sample && index1 == 5) val = 1; \ | |
| 1859 else val = 0; \ | |
| 1860 if(size_table[index1] - val > 0) \ | |
| 1861 val = get_bits(gb, size_table[index1] - val); \ | |
| 1862 else val = 0; \ | |
| 1863 sign = 0 - (val&1); \ | |
| 1864 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
| 1865 } | |
| 1866 | |
| 1867 /** Predict and set motion vector | |
| 1868 */ | |
| 1869 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) | |
| 1870 { | |
| 1871 int xy, wrap, off = 0; | |
| 1872 int16_t *A, *B, *C; | |
| 1873 int px, py; | |
| 1874 int sum; | |
| 1875 | |
| 1876 /* scale MV difference to be quad-pel */ | |
| 1877 dmv_x <<= 1 - s->quarter_sample; | |
| 1878 dmv_y <<= 1 - s->quarter_sample; | |
| 1879 | |
| 1880 wrap = s->b8_stride; | |
| 1881 xy = s->block_index[n]; | |
| 1882 | |
| 1883 if(s->mb_intra){ | |
| 1884 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0; | |
| 1885 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0; | |
| 1886 if(mv1) { /* duplicate motion data for 1-MV block */ | |
| 1887 s->current_picture.motion_val[0][xy + 1][0] = 0; | |
| 1888 s->current_picture.motion_val[0][xy + 1][1] = 0; | |
| 1889 s->current_picture.motion_val[0][xy + wrap][0] = 0; | |
| 1890 s->current_picture.motion_val[0][xy + wrap][1] = 0; | |
| 1891 s->current_picture.motion_val[0][xy + wrap + 1][0] = 0; | |
| 1892 s->current_picture.motion_val[0][xy + wrap + 1][1] = 0; | |
| 1893 } | |
| 1894 return; | |
| 1895 } | |
| 1896 | |
| 1897 C = s->current_picture.motion_val[0][xy - 1]; | |
| 1898 A = s->current_picture.motion_val[0][xy - wrap]; | |
| 1899 if(mv1) | |
| 1900 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2; | |
| 1901 else { | |
| 1902 //in 4-MV mode different blocks have different B predictor position | |
| 1903 switch(n){ | |
| 1904 case 0: | |
| 1905 off = (s->mb_x > 0) ? -1 : 1; | |
| 1906 break; | |
| 1907 case 1: | |
| 1908 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1; | |
| 1909 break; | |
| 1910 case 2: | |
| 1911 off = 1; | |
| 1912 break; | |
| 1913 case 3: | |
| 1914 off = -1; | |
| 1915 } | |
| 1916 } | |
| 1917 B = s->current_picture.motion_val[0][xy - wrap + off]; | |
| 1918 | |
| 1919 if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds | |
| 1920 if(s->mb_width == 1) { | |
| 1921 px = A[0]; | |
| 1922 py = A[1]; | |
| 1923 } else { | |
| 1924 px = mid_pred(A[0], B[0], C[0]); | |
| 1925 py = mid_pred(A[1], B[1], C[1]); | |
| 1926 } | |
| 1927 } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds | |
| 1928 px = C[0]; | |
| 1929 py = C[1]; | |
| 1930 } else { | |
| 1931 px = py = 0; | |
| 1932 } | |
| 1933 /* Pullback MV as specified in 8.3.5.3.4 */ | |
| 1934 { | |
| 1935 int qx, qy, X, Y; | |
| 1936 qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0); | |
| 1937 qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0); | |
| 1938 X = (s->mb_width << 6) - 4; | |
| 1939 Y = (s->mb_height << 6) - 4; | |
| 1940 if(mv1) { | |
| 1941 if(qx + px < -60) px = -60 - qx; | |
| 1942 if(qy + py < -60) py = -60 - qy; | |
| 1943 } else { | |
| 1944 if(qx + px < -28) px = -28 - qx; | |
| 1945 if(qy + py < -28) py = -28 - qy; | |
| 1946 } | |
| 1947 if(qx + px > X) px = X - qx; | |
| 1948 if(qy + py > Y) py = Y - qy; | |
| 1949 } | |
| 1950 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | |
| 1951 if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) { | |
| 1952 if(is_intra[xy - wrap]) | |
| 1953 sum = FFABS(px) + FFABS(py); | |
| 1954 else | |
| 1955 sum = FFABS(px - A[0]) + FFABS(py - A[1]); | |
| 1956 if(sum > 32) { | |
| 1957 if(get_bits1(&s->gb)) { | |
| 1958 px = A[0]; | |
| 1959 py = A[1]; | |
| 1960 } else { | |
| 1961 px = C[0]; | |
| 1962 py = C[1]; | |
| 1963 } | |
| 1964 } else { | |
| 1965 if(is_intra[xy - 1]) | |
| 1966 sum = FFABS(px) + FFABS(py); | |
| 1967 else | |
| 1968 sum = FFABS(px - C[0]) + FFABS(py - C[1]); | |
| 1969 if(sum > 32) { | |
| 1970 if(get_bits1(&s->gb)) { | |
| 1971 px = A[0]; | |
| 1972 py = A[1]; | |
| 1973 } else { | |
| 1974 px = C[0]; | |
| 1975 py = C[1]; | |
| 1976 } | |
| 1977 } | |
| 1978 } | |
| 1979 } | |
| 1980 /* store MV using signed modulus of MV range defined in 4.11 */ | |
| 1981 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x; | |
| 1982 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y; | |
| 1983 if(mv1) { /* duplicate motion data for 1-MV block */ | |
| 1984 s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0]; | |
| 1985 s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1]; | |
| 1986 s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0]; | |
| 1987 s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1]; | |
| 1988 s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0]; | |
| 1989 s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1]; | |
| 1990 } | |
| 1991 } | |
| 1992 | |
| 1993 /** Motion compensation for direct or interpolated blocks in B-frames | |
| 1994 */ | |
| 1995 static void vc1_interp_mc(VC1Context *v) | |
| 1996 { | |
| 1997 MpegEncContext *s = &v->s; | |
| 1998 DSPContext *dsp = &v->s.dsp; | |
| 1999 uint8_t *srcY, *srcU, *srcV; | |
| 2000 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; | |
| 2001 | |
| 2002 if(!v->s.next_picture.data[0])return; | |
| 2003 | |
| 2004 mx = s->mv[1][0][0]; | |
| 2005 my = s->mv[1][0][1]; | |
| 2006 uvmx = (mx + ((mx & 3) == 3)) >> 1; | |
| 2007 uvmy = (my + ((my & 3) == 3)) >> 1; | |
| 2008 srcY = s->next_picture.data[0]; | |
| 2009 srcU = s->next_picture.data[1]; | |
| 2010 srcV = s->next_picture.data[2]; | |
| 2011 | |
| 2012 src_x = s->mb_x * 16 + (mx >> 2); | |
| 2013 src_y = s->mb_y * 16 + (my >> 2); | |
| 2014 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
| 2015 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
| 2016 | |
| 2017 src_x = clip( src_x, -16, s->mb_width * 16); | |
| 2018 src_y = clip( src_y, -16, s->mb_height * 16); | |
| 2019 uvsrc_x = clip(uvsrc_x, -8, s->mb_width * 8); | |
| 2020 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8); | |
| 2021 | |
| 2022 srcY += src_y * s->linesize + src_x; | |
| 2023 srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 2024 srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 2025 | |
| 2026 /* for grayscale we should not try to read from unknown area */ | |
| 2027 if(s->flags & CODEC_FLAG_GRAY) { | |
| 2028 srcU = s->edge_emu_buffer + 18 * s->linesize; | |
| 2029 srcV = s->edge_emu_buffer + 18 * s->linesize; | |
| 2030 } | |
| 2031 | |
| 2032 if(v->rangeredfrm | |
| 2033 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 | |
| 2034 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ | |
| 2035 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; | |
| 2036 | |
| 2037 srcY -= s->mspel * (1 + s->linesize); | |
| 2038 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2, | |
| 2039 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
| 2040 srcY = s->edge_emu_buffer; | |
| 2041 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, | |
| 2042 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
| 2043 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, | |
| 2044 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
| 2045 srcU = uvbuf; | |
| 2046 srcV = uvbuf + 16; | |
| 2047 /* if we deal with range reduction we need to scale source blocks */ | |
| 2048 if(v->rangeredfrm) { | |
| 2049 int i, j; | |
| 2050 uint8_t *src, *src2; | |
| 2051 | |
| 2052 src = srcY; | |
| 2053 for(j = 0; j < 17 + s->mspel*2; j++) { | |
| 2054 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; | |
| 2055 src += s->linesize; | |
| 2056 } | |
| 2057 src = srcU; src2 = srcV; | |
| 2058 for(j = 0; j < 9; j++) { | |
| 2059 for(i = 0; i < 9; i++) { | |
| 2060 src[i] = ((src[i] - 128) >> 1) + 128; | |
| 2061 src2[i] = ((src2[i] - 128) >> 1) + 128; | |
| 2062 } | |
| 2063 src += s->uvlinesize; | |
| 2064 src2 += s->uvlinesize; | |
| 2065 } | |
| 2066 } | |
| 2067 srcY += s->mspel * (1 + s->linesize); | |
| 2068 } | |
| 2069 | |
| 2070 if(v->fastuvmc) { | |
| 2071 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); | |
| 2072 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); | |
| 2073 } | |
| 2074 | |
| 2075 mx >>= 1; | |
| 2076 my >>= 1; | |
| 2077 dxy = ((my & 1) << 1) | (mx & 1); | |
| 2078 | |
| 2079 dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
| 2080 | |
| 2081 if(s->flags & CODEC_FLAG_GRAY) return; | |
| 2082 /* Chroma MC always uses qpel blilinear */ | |
| 2083 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); | |
| 2084 uvmx = (uvmx&3)<<1; | |
| 2085 uvmy = (uvmy&3)<<1; | |
| 2086 dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 2087 dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 2088 } | |
| 2089 | |
| 2090 static always_inline int scale_mv(int value, int bfrac, int inv, int qs) | |
| 2091 { | |
| 2092 int n = bfrac; | |
| 2093 | |
| 2094 #if B_FRACTION_DEN==256 | |
| 2095 if(inv) | |
| 2096 n -= 256; | |
| 2097 if(!qs) | |
| 2098 return 2 * ((value * n + 255) >> 9); | |
| 2099 return (value * n + 128) >> 8; | |
| 2100 #else | |
| 2101 if(inv) | |
| 2102 n -= B_FRACTION_DEN; | |
| 2103 if(!qs) | |
| 2104 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN)); | |
| 2105 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN; | |
| 2106 #endif | |
| 2107 } | |
| 2108 | |
| 2109 /** Reconstruct motion vector for B-frame and do motion compensation | |
| 2110 */ | |
| 2111 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode) | |
| 2112 { | |
| 2113 if(v->use_ic) { | |
| 2114 v->mv_mode2 = v->mv_mode; | |
| 2115 v->mv_mode = MV_PMODE_INTENSITY_COMP; | |
| 2116 } | |
| 2117 if(direct) { | |
| 2118 vc1_mc_1mv(v, 0); | |
| 2119 vc1_interp_mc(v); | |
| 2120 if(v->use_ic) v->mv_mode = v->mv_mode2; | |
| 2121 return; | |
| 2122 } | |
| 2123 if(mode == BMV_TYPE_INTERPOLATED) { | |
| 2124 vc1_mc_1mv(v, 0); | |
| 2125 vc1_interp_mc(v); | |
| 2126 if(v->use_ic) v->mv_mode = v->mv_mode2; | |
| 2127 return; | |
| 2128 } | |
| 2129 | |
| 2130 if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2; | |
| 2131 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD)); | |
| 2132 if(v->use_ic) v->mv_mode = v->mv_mode2; | |
| 2133 } | |
| 2134 | |
| 2135 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype) | |
| 2136 { | |
| 2137 MpegEncContext *s = &v->s; | |
| 2138 int xy, wrap, off = 0; | |
| 2139 int16_t *A, *B, *C; | |
| 2140 int px, py; | |
| 2141 int sum; | |
| 2142 int r_x, r_y; | |
| 2143 const uint8_t *is_intra = v->mb_type[0]; | |
| 2144 | |
| 2145 r_x = v->range_x; | |
| 2146 r_y = v->range_y; | |
| 2147 /* scale MV difference to be quad-pel */ | |
| 2148 dmv_x[0] <<= 1 - s->quarter_sample; | |
| 2149 dmv_y[0] <<= 1 - s->quarter_sample; | |
| 2150 dmv_x[1] <<= 1 - s->quarter_sample; | |
| 2151 dmv_y[1] <<= 1 - s->quarter_sample; | |
| 2152 | |
| 2153 wrap = s->b8_stride; | |
| 2154 xy = s->block_index[0]; | |
| 2155 | |
| 2156 if(s->mb_intra) { | |
| 2157 s->current_picture.motion_val[0][xy][0] = | |
| 2158 s->current_picture.motion_val[0][xy][1] = | |
| 2159 s->current_picture.motion_val[1][xy][0] = | |
| 2160 s->current_picture.motion_val[1][xy][1] = 0; | |
| 2161 return; | |
| 2162 } | |
| 2163 s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample); | |
| 2164 s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample); | |
| 2165 s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample); | |
| 2166 s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample); | |
| 2167 if(direct) { | |
| 2168 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0]; | |
| 2169 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1]; | |
| 2170 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0]; | |
| 2171 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1]; | |
| 2172 return; | |
| 2173 } | |
| 2174 | |
| 2175 if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) { | |
| 2176 C = s->current_picture.motion_val[0][xy - 2]; | |
| 2177 A = s->current_picture.motion_val[0][xy - wrap*2]; | |
| 2178 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; | |
| 2179 B = s->current_picture.motion_val[0][xy - wrap*2 + off]; | |
| 2180 | |
| 2181 if(!s->first_slice_line) { // predictor A is not out of bounds | |
| 2182 if(s->mb_width == 1) { | |
| 2183 px = A[0]; | |
| 2184 py = A[1]; | |
| 2185 } else { | |
| 2186 px = mid_pred(A[0], B[0], C[0]); | |
| 2187 py = mid_pred(A[1], B[1], C[1]); | |
| 2188 } | |
| 2189 } else if(s->mb_x) { // predictor C is not out of bounds | |
| 2190 px = C[0]; | |
| 2191 py = C[1]; | |
| 2192 } else { | |
| 2193 px = py = 0; | |
| 2194 } | |
| 2195 /* Pullback MV as specified in 8.3.5.3.4 */ | |
| 2196 { | |
| 2197 int qx, qy, X, Y; | |
| 2198 if(v->profile < PROFILE_ADVANCED) { | |
| 2199 qx = (s->mb_x << 5); | |
| 2200 qy = (s->mb_y << 5); | |
| 2201 X = (s->mb_width << 5) - 4; | |
| 2202 Y = (s->mb_height << 5) - 4; | |
| 2203 if(qx + px < -28) px = -28 - qx; | |
| 2204 if(qy + py < -28) py = -28 - qy; | |
| 2205 if(qx + px > X) px = X - qx; | |
| 2206 if(qy + py > Y) py = Y - qy; | |
| 2207 } else { | |
| 2208 qx = (s->mb_x << 6); | |
| 2209 qy = (s->mb_y << 6); | |
| 2210 X = (s->mb_width << 6) - 4; | |
| 2211 Y = (s->mb_height << 6) - 4; | |
| 2212 if(qx + px < -60) px = -60 - qx; | |
| 2213 if(qy + py < -60) py = -60 - qy; | |
| 2214 if(qx + px > X) px = X - qx; | |
| 2215 if(qy + py > Y) py = Y - qy; | |
| 2216 } | |
| 2217 } | |
| 2218 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | |
| 2219 if(0 && !s->first_slice_line && s->mb_x) { | |
| 2220 if(is_intra[xy - wrap]) | |
| 2221 sum = FFABS(px) + FFABS(py); | |
| 2222 else | |
| 2223 sum = FFABS(px - A[0]) + FFABS(py - A[1]); | |
| 2224 if(sum > 32) { | |
| 2225 if(get_bits1(&s->gb)) { | |
| 2226 px = A[0]; | |
| 2227 py = A[1]; | |
| 2228 } else { | |
| 2229 px = C[0]; | |
| 2230 py = C[1]; | |
| 2231 } | |
| 2232 } else { | |
| 2233 if(is_intra[xy - 2]) | |
| 2234 sum = FFABS(px) + FFABS(py); | |
| 2235 else | |
| 2236 sum = FFABS(px - C[0]) + FFABS(py - C[1]); | |
| 2237 if(sum > 32) { | |
| 2238 if(get_bits1(&s->gb)) { | |
| 2239 px = A[0]; | |
| 2240 py = A[1]; | |
| 2241 } else { | |
| 2242 px = C[0]; | |
| 2243 py = C[1]; | |
| 2244 } | |
| 2245 } | |
| 2246 } | |
| 2247 } | |
| 2248 /* store MV using signed modulus of MV range defined in 4.11 */ | |
| 2249 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x; | |
| 2250 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y; | |
| 2251 } | |
| 2252 if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) { | |
| 2253 C = s->current_picture.motion_val[1][xy - 2]; | |
| 2254 A = s->current_picture.motion_val[1][xy - wrap*2]; | |
| 2255 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2; | |
| 2256 B = s->current_picture.motion_val[1][xy - wrap*2 + off]; | |
| 2257 | |
| 2258 if(!s->first_slice_line) { // predictor A is not out of bounds | |
| 2259 if(s->mb_width == 1) { | |
| 2260 px = A[0]; | |
| 2261 py = A[1]; | |
| 2262 } else { | |
| 2263 px = mid_pred(A[0], B[0], C[0]); | |
| 2264 py = mid_pred(A[1], B[1], C[1]); | |
| 2265 } | |
| 2266 } else if(s->mb_x) { // predictor C is not out of bounds | |
| 2267 px = C[0]; | |
| 2268 py = C[1]; | |
| 2269 } else { | |
| 2270 px = py = 0; | |
| 2271 } | |
| 2272 /* Pullback MV as specified in 8.3.5.3.4 */ | |
| 2273 { | |
| 2274 int qx, qy, X, Y; | |
| 2275 if(v->profile < PROFILE_ADVANCED) { | |
| 2276 qx = (s->mb_x << 5); | |
| 2277 qy = (s->mb_y << 5); | |
| 2278 X = (s->mb_width << 5) - 4; | |
| 2279 Y = (s->mb_height << 5) - 4; | |
| 2280 if(qx + px < -28) px = -28 - qx; | |
| 2281 if(qy + py < -28) py = -28 - qy; | |
| 2282 if(qx + px > X) px = X - qx; | |
| 2283 if(qy + py > Y) py = Y - qy; | |
| 2284 } else { | |
| 2285 qx = (s->mb_x << 6); | |
| 2286 qy = (s->mb_y << 6); | |
| 2287 X = (s->mb_width << 6) - 4; | |
| 2288 Y = (s->mb_height << 6) - 4; | |
| 2289 if(qx + px < -60) px = -60 - qx; | |
| 2290 if(qy + py < -60) py = -60 - qy; | |
| 2291 if(qx + px > X) px = X - qx; | |
| 2292 if(qy + py > Y) py = Y - qy; | |
| 2293 } | |
| 2294 } | |
| 2295 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ | |
| 2296 if(0 && !s->first_slice_line && s->mb_x) { | |
| 2297 if(is_intra[xy - wrap]) | |
| 2298 sum = FFABS(px) + FFABS(py); | |
| 2299 else | |
| 2300 sum = FFABS(px - A[0]) + FFABS(py - A[1]); | |
| 2301 if(sum > 32) { | |
| 2302 if(get_bits1(&s->gb)) { | |
| 2303 px = A[0]; | |
| 2304 py = A[1]; | |
| 2305 } else { | |
| 2306 px = C[0]; | |
| 2307 py = C[1]; | |
| 2308 } | |
| 2309 } else { | |
| 2310 if(is_intra[xy - 2]) | |
| 2311 sum = FFABS(px) + FFABS(py); | |
| 2312 else | |
| 2313 sum = FFABS(px - C[0]) + FFABS(py - C[1]); | |
| 2314 if(sum > 32) { | |
| 2315 if(get_bits1(&s->gb)) { | |
| 2316 px = A[0]; | |
| 2317 py = A[1]; | |
| 2318 } else { | |
| 2319 px = C[0]; | |
| 2320 py = C[1]; | |
| 2321 } | |
| 2322 } | |
| 2323 } | |
| 2324 } | |
| 2325 /* store MV using signed modulus of MV range defined in 4.11 */ | |
| 2326 | |
| 2327 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x; | |
| 2328 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y; | |
| 2329 } | |
| 2330 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0]; | |
| 2331 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1]; | |
| 2332 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0]; | |
| 2333 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1]; | |
| 2334 } | |
| 2335 | |
| 2336 /** Get predicted DC value for I-frames only | |
| 2337 * prediction dir: left=0, top=1 | |
| 2338 * @param s MpegEncContext | |
| 2339 * @param[in] n block index in the current MB | |
| 2340 * @param dc_val_ptr Pointer to DC predictor | |
| 2341 * @param dir_ptr Prediction direction for use in AC prediction | |
| 2342 */ | |
| 2343 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n, | |
| 2344 int16_t **dc_val_ptr, int *dir_ptr) | |
| 2345 { | |
| 2346 int a, b, c, wrap, pred, scale; | |
| 2347 int16_t *dc_val; | |
| 2348 static const uint16_t dcpred[32] = { | |
| 2349 -1, 1024, 512, 341, 256, 205, 171, 146, 128, | |
| 2350 114, 102, 93, 85, 79, 73, 68, 64, | |
| 2351 60, 57, 54, 51, 49, 47, 45, 43, | |
| 2352 41, 39, 38, 37, 35, 34, 33 | |
| 2353 }; | |
| 2354 | |
| 2355 /* find prediction - wmv3_dc_scale always used here in fact */ | |
| 2356 if (n < 4) scale = s->y_dc_scale; | |
| 2357 else scale = s->c_dc_scale; | |
| 2358 | |
| 2359 wrap = s->block_wrap[n]; | |
| 2360 dc_val= s->dc_val[0] + s->block_index[n]; | |
| 2361 | |
| 2362 /* B A | |
| 2363 * C X | |
| 2364 */ | |
| 2365 c = dc_val[ - 1]; | |
| 2366 b = dc_val[ - 1 - wrap]; | |
| 2367 a = dc_val[ - wrap]; | |
| 2368 | |
| 2369 if (pq < 9 || !overlap) | |
| 2370 { | |
| 2371 /* Set outer values */ | |
| 2372 if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale]; | |
| 2373 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale]; | |
| 2374 } | |
| 2375 else | |
| 2376 { | |
| 2377 /* Set outer values */ | |
| 2378 if (s->first_slice_line && (n!=2 && n!=3)) b=a=0; | |
| 2379 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0; | |
| 2380 } | |
| 2381 | |
| 2382 if (abs(a - b) <= abs(b - c)) { | |
| 2383 pred = c; | |
| 2384 *dir_ptr = 1;//left | |
| 2385 } else { | |
| 2386 pred = a; | |
| 2387 *dir_ptr = 0;//top | |
| 2388 } | |
| 2389 | |
| 2390 /* update predictor */ | |
| 2391 *dc_val_ptr = &dc_val[0]; | |
| 2392 return pred; | |
| 2393 } | |
| 2394 | |
| 2395 | |
| 2396 /** Get predicted DC value | |
| 2397 * prediction dir: left=0, top=1 | |
| 2398 * @param s MpegEncContext | |
| 2399 * @param[in] n block index in the current MB | |
| 2400 * @param dc_val_ptr Pointer to DC predictor | |
| 2401 * @param dir_ptr Prediction direction for use in AC prediction | |
| 2402 */ | |
| 2403 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n, | |
| 2404 int a_avail, int c_avail, | |
| 2405 int16_t **dc_val_ptr, int *dir_ptr) | |
| 2406 { | |
| 2407 int a, b, c, wrap, pred, scale; | |
| 2408 int16_t *dc_val; | |
| 2409 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 2410 int q1, q2 = 0; | |
| 2411 | |
| 2412 /* find prediction - wmv3_dc_scale always used here in fact */ | |
| 2413 if (n < 4) scale = s->y_dc_scale; | |
| 2414 else scale = s->c_dc_scale; | |
| 2415 | |
| 2416 wrap = s->block_wrap[n]; | |
| 2417 dc_val= s->dc_val[0] + s->block_index[n]; | |
| 2418 | |
| 2419 /* B A | |
| 2420 * C X | |
| 2421 */ | |
| 2422 c = dc_val[ - 1]; | |
| 2423 b = dc_val[ - 1 - wrap]; | |
| 2424 a = dc_val[ - wrap]; | |
| 2425 /* scale predictors if needed */ | |
| 2426 q1 = s->current_picture.qscale_table[mb_pos]; | |
| 2427 if(c_avail && (n!= 1 && n!=3)) { | |
| 2428 q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
| 2429 if(q2 && q2 != q1) | |
| 2430 c = (c * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; | |
| 2431 } | |
| 2432 if(a_avail && (n!= 2 && n!=3)) { | |
| 2433 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
| 2434 if(q2 && q2 != q1) | |
| 2435 a = (a * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; | |
| 2436 } | |
| 2437 if(a_avail && c_avail && (n!=3)) { | |
| 2438 int off = mb_pos; | |
| 2439 if(n != 1) off--; | |
| 2440 if(n != 2) off -= s->mb_stride; | |
| 2441 q2 = s->current_picture.qscale_table[off]; | |
| 2442 if(q2 && q2 != q1) | |
| 2443 b = (b * s->y_dc_scale_table[q2] * vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18; | |
| 2444 } | |
| 2445 | |
| 2446 if(a_avail && c_avail) { | |
| 2447 if(abs(a - b) <= abs(b - c)) { | |
| 2448 pred = c; | |
| 2449 *dir_ptr = 1;//left | |
| 2450 } else { | |
| 2451 pred = a; | |
| 2452 *dir_ptr = 0;//top | |
| 2453 } | |
| 2454 } else if(a_avail) { | |
| 2455 pred = a; | |
| 2456 *dir_ptr = 0;//top | |
| 2457 } else if(c_avail) { | |
| 2458 pred = c; | |
| 2459 *dir_ptr = 1;//left | |
| 2460 } else { | |
| 2461 pred = 0; | |
| 2462 *dir_ptr = 1;//left | |
| 2463 } | |
| 2464 | |
| 2465 /* update predictor */ | |
| 2466 *dc_val_ptr = &dc_val[0]; | |
| 2467 return pred; | |
| 2468 } | |
| 2469 | |
| 2470 | |
| 2471 /** | |
| 2472 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles | |
| 2473 * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | |
| 2474 * @{ | |
| 2475 */ | |
| 2476 | |
| 2477 static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) | |
| 2478 { | |
| 2479 int xy, wrap, pred, a, b, c; | |
| 2480 | |
| 2481 xy = s->block_index[n]; | |
| 2482 wrap = s->b8_stride; | |
| 2483 | |
| 2484 /* B C | |
| 2485 * A X | |
| 2486 */ | |
| 2487 a = s->coded_block[xy - 1 ]; | |
| 2488 b = s->coded_block[xy - 1 - wrap]; | |
| 2489 c = s->coded_block[xy - wrap]; | |
| 2490 | |
| 2491 if (b == c) { | |
| 2492 pred = a; | |
| 2493 } else { | |
| 2494 pred = c; | |
| 2495 } | |
| 2496 | |
| 2497 /* store value */ | |
| 2498 *coded_block_ptr = &s->coded_block[xy]; | |
| 2499 | |
| 2500 return pred; | |
| 2501 } | |
| 2502 | |
| 2503 /** | |
| 2504 * Decode one AC coefficient | |
| 2505 * @param v The VC1 context | |
| 2506 * @param last Last coefficient | |
| 2507 * @param skip How much zero coefficients to skip | |
| 2508 * @param value Decoded AC coefficient value | |
| 2509 * @see 8.1.3.4 | |
| 2510 */ | |
| 2511 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset) | |
| 2512 { | |
| 2513 GetBitContext *gb = &v->s.gb; | |
| 2514 int index, escape, run = 0, level = 0, lst = 0; | |
| 2515 | |
| 2516 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); | |
| 2517 if (index != vc1_ac_sizes[codingset] - 1) { | |
| 2518 run = vc1_index_decode_table[codingset][index][0]; | |
| 2519 level = vc1_index_decode_table[codingset][index][1]; | |
| 2520 lst = index >= vc1_last_decode_table[codingset]; | |
| 2521 if(get_bits(gb, 1)) | |
| 2522 level = -level; | |
| 2523 } else { | |
| 2524 escape = decode210(gb); | |
| 2525 if (escape != 2) { | |
| 2526 index = get_vlc2(gb, vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); | |
| 2527 run = vc1_index_decode_table[codingset][index][0]; | |
| 2528 level = vc1_index_decode_table[codingset][index][1]; | |
| 2529 lst = index >= vc1_last_decode_table[codingset]; | |
| 2530 if(escape == 0) { | |
| 2531 if(lst) | |
| 2532 level += vc1_last_delta_level_table[codingset][run]; | |
| 2533 else | |
| 2534 level += vc1_delta_level_table[codingset][run]; | |
| 2535 } else { | |
| 2536 if(lst) | |
| 2537 run += vc1_last_delta_run_table[codingset][level] + 1; | |
| 2538 else | |
| 2539 run += vc1_delta_run_table[codingset][level] + 1; | |
| 2540 } | |
| 2541 if(get_bits(gb, 1)) | |
| 2542 level = -level; | |
| 2543 } else { | |
| 2544 int sign; | |
| 2545 lst = get_bits(gb, 1); | |
| 2546 if(v->s.esc3_level_length == 0) { | |
| 2547 if(v->pq < 8 || v->dquantfrm) { // table 59 | |
| 2548 v->s.esc3_level_length = get_bits(gb, 3); | |
| 2549 if(!v->s.esc3_level_length) | |
| 2550 v->s.esc3_level_length = get_bits(gb, 2) + 8; | |
| 2551 } else { //table 60 | |
| 2552 v->s.esc3_level_length = get_prefix(gb, 1, 6) + 2; | |
| 2553 } | |
| 2554 v->s.esc3_run_length = 3 + get_bits(gb, 2); | |
| 2555 } | |
| 2556 run = get_bits(gb, v->s.esc3_run_length); | |
| 2557 sign = get_bits(gb, 1); | |
| 2558 level = get_bits(gb, v->s.esc3_level_length); | |
| 2559 if(sign) | |
| 2560 level = -level; | |
| 2561 } | |
| 2562 } | |
| 2563 | |
| 2564 *last = lst; | |
| 2565 *skip = run; | |
| 2566 *value = level; | |
| 2567 } | |
| 2568 | |
| 2569 /** Decode intra block in intra frames - should be faster than decode_intra_block | |
| 2570 * @param v VC1Context | |
| 2571 * @param block block to decode | |
| 2572 * @param coded are AC coeffs present or not | |
| 2573 * @param codingset set of VLC to decode data | |
| 2574 */ | |
| 2575 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset) | |
| 2576 { | |
| 2577 GetBitContext *gb = &v->s.gb; | |
| 2578 MpegEncContext *s = &v->s; | |
| 2579 int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
| 2580 int run_diff, i; | |
| 2581 int16_t *dc_val; | |
| 2582 int16_t *ac_val, *ac_val2; | |
| 2583 int dcdiff; | |
| 2584 | |
| 2585 /* Get DC differential */ | |
| 2586 if (n < 4) { | |
| 2587 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
| 2588 } else { | |
| 2589 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
| 2590 } | |
| 2591 if (dcdiff < 0){ | |
| 2592 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); | |
| 2593 return -1; | |
| 2594 } | |
| 2595 if (dcdiff) | |
| 2596 { | |
| 2597 if (dcdiff == 119 /* ESC index value */) | |
| 2598 { | |
| 2599 /* TODO: Optimize */ | |
| 2600 if (v->pq == 1) dcdiff = get_bits(gb, 10); | |
| 2601 else if (v->pq == 2) dcdiff = get_bits(gb, 9); | |
| 2602 else dcdiff = get_bits(gb, 8); | |
| 2603 } | |
| 2604 else | |
| 2605 { | |
| 2606 if (v->pq == 1) | |
| 2607 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; | |
| 2608 else if (v->pq == 2) | |
| 2609 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; | |
| 2610 } | |
| 2611 if (get_bits(gb, 1)) | |
| 2612 dcdiff = -dcdiff; | |
| 2613 } | |
| 2614 | |
| 2615 /* Prediction */ | |
| 2616 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir); | |
| 2617 *dc_val = dcdiff; | |
| 2618 | |
| 2619 /* Store the quantized DC coeff, used for prediction */ | |
| 2620 if (n < 4) { | |
| 2621 block[0] = dcdiff * s->y_dc_scale; | |
| 2622 } else { | |
| 2623 block[0] = dcdiff * s->c_dc_scale; | |
| 2624 } | |
| 2625 /* Skip ? */ | |
| 2626 run_diff = 0; | |
| 2627 i = 0; | |
| 2628 if (!coded) { | |
| 2629 goto not_coded; | |
| 2630 } | |
| 2631 | |
| 2632 //AC Decoding | |
| 2633 i = 1; | |
| 2634 | |
| 2635 { | |
| 2636 int last = 0, skip, value; | |
| 2637 const int8_t *zz_table; | |
| 2638 int scale; | |
| 2639 int k; | |
| 2640 | |
| 2641 scale = v->pq * 2 + v->halfpq; | |
| 2642 | |
| 2643 if(v->s.ac_pred) { | |
| 2644 if(!dc_pred_dir) | |
| 2645 zz_table = vc1_horizontal_zz; | |
| 2646 else | |
| 2647 zz_table = vc1_vertical_zz; | |
| 2648 } else | |
| 2649 zz_table = vc1_normal_zz; | |
| 2650 | |
| 2651 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
| 2652 ac_val2 = ac_val; | |
| 2653 if(dc_pred_dir) //left | |
| 2654 ac_val -= 16; | |
| 2655 else //top | |
| 2656 ac_val -= 16 * s->block_wrap[n]; | |
| 2657 | |
| 2658 while (!last) { | |
| 2659 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
| 2660 i += skip; | |
| 2661 if(i > 63) | |
| 2662 break; | |
| 2663 block[zz_table[i++]] = value; | |
| 2664 } | |
| 2665 | |
| 2666 /* apply AC prediction if needed */ | |
| 2667 if(s->ac_pred) { | |
| 2668 if(dc_pred_dir) { //left | |
| 2669 for(k = 1; k < 8; k++) | |
| 2670 block[k << 3] += ac_val[k]; | |
| 2671 } else { //top | |
| 2672 for(k = 1; k < 8; k++) | |
| 2673 block[k] += ac_val[k + 8]; | |
| 2674 } | |
| 2675 } | |
| 2676 /* save AC coeffs for further prediction */ | |
| 2677 for(k = 1; k < 8; k++) { | |
| 2678 ac_val2[k] = block[k << 3]; | |
| 2679 ac_val2[k + 8] = block[k]; | |
| 2680 } | |
| 2681 | |
| 2682 /* scale AC coeffs */ | |
| 2683 for(k = 1; k < 64; k++) | |
| 2684 if(block[k]) { | |
| 2685 block[k] *= scale; | |
| 2686 if(!v->pquantizer) | |
| 2687 block[k] += (block[k] < 0) ? -v->pq : v->pq; | |
| 2688 } | |
| 2689 | |
| 2690 if(s->ac_pred) i = 63; | |
| 2691 } | |
| 2692 | |
| 2693 not_coded: | |
| 2694 if(!coded) { | |
| 2695 int k, scale; | |
| 2696 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
| 2697 ac_val2 = ac_val; | |
| 2698 | |
| 2699 scale = v->pq * 2 + v->halfpq; | |
| 2700 memset(ac_val2, 0, 16 * 2); | |
| 2701 if(dc_pred_dir) {//left | |
| 2702 ac_val -= 16; | |
| 2703 if(s->ac_pred) | |
| 2704 memcpy(ac_val2, ac_val, 8 * 2); | |
| 2705 } else {//top | |
| 2706 ac_val -= 16 * s->block_wrap[n]; | |
| 2707 if(s->ac_pred) | |
| 2708 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
| 2709 } | |
| 2710 | |
| 2711 /* apply AC prediction if needed */ | |
| 2712 if(s->ac_pred) { | |
| 2713 if(dc_pred_dir) { //left | |
| 2714 for(k = 1; k < 8; k++) { | |
| 2715 block[k << 3] = ac_val[k] * scale; | |
| 2716 if(!v->pquantizer && block[k << 3]) | |
| 2717 block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq; | |
| 2718 } | |
| 2719 } else { //top | |
| 2720 for(k = 1; k < 8; k++) { | |
| 2721 block[k] = ac_val[k + 8] * scale; | |
| 2722 if(!v->pquantizer && block[k]) | |
| 2723 block[k] += (block[k] < 0) ? -v->pq : v->pq; | |
| 2724 } | |
| 2725 } | |
| 2726 i = 63; | |
| 2727 } | |
| 2728 } | |
| 2729 s->block_last_index[n] = i; | |
| 2730 | |
| 2731 return 0; | |
| 2732 } | |
| 2733 | |
| 2734 /** Decode intra block in intra frames - should be faster than decode_intra_block | |
| 2735 * @param v VC1Context | |
| 2736 * @param block block to decode | |
| 2737 * @param coded are AC coeffs present or not | |
| 2738 * @param codingset set of VLC to decode data | |
| 2739 */ | |
| 2740 static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant) | |
| 2741 { | |
| 2742 GetBitContext *gb = &v->s.gb; | |
| 2743 MpegEncContext *s = &v->s; | |
| 2744 int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
| 2745 int run_diff, i; | |
| 2746 int16_t *dc_val; | |
| 2747 int16_t *ac_val, *ac_val2; | |
| 2748 int dcdiff; | |
| 2749 int a_avail = v->a_avail, c_avail = v->c_avail; | |
| 2750 int use_pred = s->ac_pred; | |
| 2751 int scale; | |
| 2752 int q1, q2 = 0; | |
| 2753 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 2754 | |
| 2755 /* Get DC differential */ | |
| 2756 if (n < 4) { | |
| 2757 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
| 2758 } else { | |
| 2759 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
| 2760 } | |
| 2761 if (dcdiff < 0){ | |
| 2762 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); | |
| 2763 return -1; | |
| 2764 } | |
| 2765 if (dcdiff) | |
| 2766 { | |
| 2767 if (dcdiff == 119 /* ESC index value */) | |
| 2768 { | |
| 2769 /* TODO: Optimize */ | |
| 2770 if (mquant == 1) dcdiff = get_bits(gb, 10); | |
| 2771 else if (mquant == 2) dcdiff = get_bits(gb, 9); | |
| 2772 else dcdiff = get_bits(gb, 8); | |
| 2773 } | |
| 2774 else | |
| 2775 { | |
| 2776 if (mquant == 1) | |
| 2777 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; | |
| 2778 else if (mquant == 2) | |
| 2779 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; | |
| 2780 } | |
| 2781 if (get_bits(gb, 1)) | |
| 2782 dcdiff = -dcdiff; | |
| 2783 } | |
| 2784 | |
| 2785 /* Prediction */ | |
| 2786 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir); | |
| 2787 *dc_val = dcdiff; | |
| 2788 | |
| 2789 /* Store the quantized DC coeff, used for prediction */ | |
| 2790 if (n < 4) { | |
| 2791 block[0] = dcdiff * s->y_dc_scale; | |
| 2792 } else { | |
| 2793 block[0] = dcdiff * s->c_dc_scale; | |
| 2794 } | |
| 2795 /* Skip ? */ | |
| 2796 run_diff = 0; | |
| 2797 i = 0; | |
| 2798 | |
| 2799 //AC Decoding | |
| 2800 i = 1; | |
| 2801 | |
| 2802 /* check if AC is needed at all and adjust direction if needed */ | |
| 2803 if(!a_avail) dc_pred_dir = 1; | |
| 2804 if(!c_avail) dc_pred_dir = 0; | |
| 2805 if(!a_avail && !c_avail) use_pred = 0; | |
| 2806 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
| 2807 ac_val2 = ac_val; | |
| 2808 | |
| 2809 scale = mquant * 2 + v->halfpq; | |
| 2810 | |
| 2811 if(dc_pred_dir) //left | |
| 2812 ac_val -= 16; | |
| 2813 else //top | |
| 2814 ac_val -= 16 * s->block_wrap[n]; | |
| 2815 | |
| 2816 q1 = s->current_picture.qscale_table[mb_pos]; | |
| 2817 if(dc_pred_dir && c_avail) q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
| 2818 if(!dc_pred_dir && a_avail) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
| 2819 if(n && n<4) q2 = q1; | |
| 2820 | |
| 2821 if(coded) { | |
| 2822 int last = 0, skip, value; | |
| 2823 const int8_t *zz_table; | |
| 2824 int k; | |
| 2825 | |
| 2826 if(v->s.ac_pred) { | |
| 2827 if(!dc_pred_dir) | |
| 2828 zz_table = vc1_horizontal_zz; | |
| 2829 else | |
| 2830 zz_table = vc1_vertical_zz; | |
| 2831 } else | |
| 2832 zz_table = vc1_normal_zz; | |
| 2833 | |
| 2834 while (!last) { | |
| 2835 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
| 2836 i += skip; | |
| 2837 if(i > 63) | |
| 2838 break; | |
| 2839 block[zz_table[i++]] = value; | |
| 2840 } | |
| 2841 | |
| 2842 /* apply AC prediction if needed */ | |
| 2843 if(use_pred) { | |
| 2844 /* scale predictors if needed*/ | |
| 2845 if(q2 && q1!=q2) { | |
| 2846 q1 = q1 * 2 - 1; | |
| 2847 q2 = q2 * 2 - 1; | |
| 2848 | |
| 2849 if(dc_pred_dir) { //left | |
| 2850 for(k = 1; k < 8; k++) | |
| 2851 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 2852 } else { //top | |
| 2853 for(k = 1; k < 8; k++) | |
| 2854 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 2855 } | |
| 2856 } else { | |
| 2857 if(dc_pred_dir) { //left | |
| 2858 for(k = 1; k < 8; k++) | |
| 2859 block[k << 3] += ac_val[k]; | |
| 2860 } else { //top | |
| 2861 for(k = 1; k < 8; k++) | |
| 2862 block[k] += ac_val[k + 8]; | |
| 2863 } | |
| 2864 } | |
| 2865 } | |
| 2866 /* save AC coeffs for further prediction */ | |
| 2867 for(k = 1; k < 8; k++) { | |
| 2868 ac_val2[k] = block[k << 3]; | |
| 2869 ac_val2[k + 8] = block[k]; | |
| 2870 } | |
| 2871 | |
| 2872 /* scale AC coeffs */ | |
| 2873 for(k = 1; k < 64; k++) | |
| 2874 if(block[k]) { | |
| 2875 block[k] *= scale; | |
| 2876 if(!v->pquantizer) | |
| 2877 block[k] += (block[k] < 0) ? -mquant : mquant; | |
| 2878 } | |
| 2879 | |
| 2880 if(use_pred) i = 63; | |
| 2881 } else { // no AC coeffs | |
| 2882 int k; | |
| 2883 | |
| 2884 memset(ac_val2, 0, 16 * 2); | |
| 2885 if(dc_pred_dir) {//left | |
| 2886 if(use_pred) { | |
| 2887 memcpy(ac_val2, ac_val, 8 * 2); | |
| 2888 if(q2 && q1!=q2) { | |
| 2889 q1 = q1 * 2 - 1; | |
| 2890 q2 = q2 * 2 - 1; | |
| 2891 for(k = 1; k < 8; k++) | |
| 2892 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 2893 } | |
| 2894 } | |
| 2895 } else {//top | |
| 2896 if(use_pred) { | |
| 2897 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
| 2898 if(q2 && q1!=q2) { | |
| 2899 q1 = q1 * 2 - 1; | |
| 2900 q2 = q2 * 2 - 1; | |
| 2901 for(k = 1; k < 8; k++) | |
| 2902 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 2903 } | |
| 2904 } | |
| 2905 } | |
| 2906 | |
| 2907 /* apply AC prediction if needed */ | |
| 2908 if(use_pred) { | |
| 2909 if(dc_pred_dir) { //left | |
| 2910 for(k = 1; k < 8; k++) { | |
| 2911 block[k << 3] = ac_val2[k] * scale; | |
| 2912 if(!v->pquantizer && block[k << 3]) | |
| 2913 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant; | |
| 2914 } | |
| 2915 } else { //top | |
| 2916 for(k = 1; k < 8; k++) { | |
| 2917 block[k] = ac_val2[k + 8] * scale; | |
| 2918 if(!v->pquantizer && block[k]) | |
| 2919 block[k] += (block[k] < 0) ? -mquant : mquant; | |
| 2920 } | |
| 2921 } | |
| 2922 i = 63; | |
| 2923 } | |
| 2924 } | |
| 2925 s->block_last_index[n] = i; | |
| 2926 | |
| 2927 return 0; | |
| 2928 } | |
| 2929 | |
| 2930 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block | |
| 2931 * @param v VC1Context | |
| 2932 * @param block block to decode | |
| 2933 * @param coded are AC coeffs present or not | |
| 2934 * @param mquant block quantizer | |
| 2935 * @param codingset set of VLC to decode data | |
| 2936 */ | |
| 2937 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset) | |
| 2938 { | |
| 2939 GetBitContext *gb = &v->s.gb; | |
| 2940 MpegEncContext *s = &v->s; | |
| 2941 int dc_pred_dir = 0; /* Direction of the DC prediction used */ | |
| 2942 int run_diff, i; | |
| 2943 int16_t *dc_val; | |
| 2944 int16_t *ac_val, *ac_val2; | |
| 2945 int dcdiff; | |
| 2946 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 2947 int a_avail = v->a_avail, c_avail = v->c_avail; | |
| 2948 int use_pred = s->ac_pred; | |
| 2949 int scale; | |
| 2950 int q1, q2 = 0; | |
| 2951 | |
| 2952 /* XXX: Guard against dumb values of mquant */ | |
| 2953 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); | |
| 2954 | |
| 2955 /* Set DC scale - y and c use the same */ | |
| 2956 s->y_dc_scale = s->y_dc_scale_table[mquant]; | |
| 2957 s->c_dc_scale = s->c_dc_scale_table[mquant]; | |
| 2958 | |
| 2959 /* Get DC differential */ | |
| 2960 if (n < 4) { | |
| 2961 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
| 2962 } else { | |
| 2963 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | |
| 2964 } | |
| 2965 if (dcdiff < 0){ | |
| 2966 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); | |
| 2967 return -1; | |
| 2968 } | |
| 2969 if (dcdiff) | |
| 2970 { | |
| 2971 if (dcdiff == 119 /* ESC index value */) | |
| 2972 { | |
| 2973 /* TODO: Optimize */ | |
| 2974 if (mquant == 1) dcdiff = get_bits(gb, 10); | |
| 2975 else if (mquant == 2) dcdiff = get_bits(gb, 9); | |
| 2976 else dcdiff = get_bits(gb, 8); | |
| 2977 } | |
| 2978 else | |
| 2979 { | |
| 2980 if (mquant == 1) | |
| 2981 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; | |
| 2982 else if (mquant == 2) | |
| 2983 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; | |
| 2984 } | |
| 2985 if (get_bits(gb, 1)) | |
| 2986 dcdiff = -dcdiff; | |
| 2987 } | |
| 2988 | |
| 2989 /* Prediction */ | |
| 2990 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir); | |
| 2991 *dc_val = dcdiff; | |
| 2992 | |
| 2993 /* Store the quantized DC coeff, used for prediction */ | |
| 2994 | |
| 2995 if (n < 4) { | |
| 2996 block[0] = dcdiff * s->y_dc_scale; | |
| 2997 } else { | |
| 2998 block[0] = dcdiff * s->c_dc_scale; | |
| 2999 } | |
| 3000 /* Skip ? */ | |
| 3001 run_diff = 0; | |
| 3002 i = 0; | |
| 3003 | |
| 3004 //AC Decoding | |
| 3005 i = 1; | |
| 3006 | |
| 3007 /* check if AC is needed at all and adjust direction if needed */ | |
| 3008 if(!a_avail) dc_pred_dir = 1; | |
| 3009 if(!c_avail) dc_pred_dir = 0; | |
| 3010 if(!a_avail && !c_avail) use_pred = 0; | |
| 3011 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
| 3012 ac_val2 = ac_val; | |
| 3013 | |
| 3014 scale = mquant * 2 + v->halfpq; | |
| 3015 | |
| 3016 if(dc_pred_dir) //left | |
| 3017 ac_val -= 16; | |
| 3018 else //top | |
| 3019 ac_val -= 16 * s->block_wrap[n]; | |
| 3020 | |
| 3021 q1 = s->current_picture.qscale_table[mb_pos]; | |
| 3022 if(dc_pred_dir && c_avail) q2 = s->current_picture.qscale_table[mb_pos - 1]; | |
| 3023 if(!dc_pred_dir && a_avail) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride]; | |
| 3024 if(n && n<4) q2 = q1; | |
| 3025 | |
| 3026 if(coded) { | |
| 3027 int last = 0, skip, value; | |
| 3028 const int8_t *zz_table; | |
| 3029 int k; | |
| 3030 | |
| 3031 zz_table = vc1_simple_progressive_8x8_zz; | |
| 3032 | |
| 3033 while (!last) { | |
| 3034 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); | |
| 3035 i += skip; | |
| 3036 if(i > 63) | |
| 3037 break; | |
| 3038 block[zz_table[i++]] = value; | |
| 3039 } | |
| 3040 | |
| 3041 /* apply AC prediction if needed */ | |
| 3042 if(use_pred) { | |
| 3043 /* scale predictors if needed*/ | |
| 3044 if(q2 && q1!=q2) { | |
| 3045 q1 = q1 * 2 - 1; | |
| 3046 q2 = q2 * 2 - 1; | |
| 3047 | |
| 3048 if(dc_pred_dir) { //left | |
| 3049 for(k = 1; k < 8; k++) | |
| 3050 block[k << 3] += (ac_val[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 3051 } else { //top | |
| 3052 for(k = 1; k < 8; k++) | |
| 3053 block[k] += (ac_val[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 3054 } | |
| 3055 } else { | |
| 3056 if(dc_pred_dir) { //left | |
| 3057 for(k = 1; k < 8; k++) | |
| 3058 block[k << 3] += ac_val[k]; | |
| 3059 } else { //top | |
| 3060 for(k = 1; k < 8; k++) | |
| 3061 block[k] += ac_val[k + 8]; | |
| 3062 } | |
| 3063 } | |
| 3064 } | |
| 3065 /* save AC coeffs for further prediction */ | |
| 3066 for(k = 1; k < 8; k++) { | |
| 3067 ac_val2[k] = block[k << 3]; | |
| 3068 ac_val2[k + 8] = block[k]; | |
| 3069 } | |
| 3070 | |
| 3071 /* scale AC coeffs */ | |
| 3072 for(k = 1; k < 64; k++) | |
| 3073 if(block[k]) { | |
| 3074 block[k] *= scale; | |
| 3075 if(!v->pquantizer) | |
| 3076 block[k] += (block[k] < 0) ? -mquant : mquant; | |
| 3077 } | |
| 3078 | |
| 3079 if(use_pred) i = 63; | |
| 3080 } else { // no AC coeffs | |
| 3081 int k; | |
| 3082 | |
| 3083 memset(ac_val2, 0, 16 * 2); | |
| 3084 if(dc_pred_dir) {//left | |
| 3085 if(use_pred) { | |
| 3086 memcpy(ac_val2, ac_val, 8 * 2); | |
| 3087 if(q2 && q1!=q2) { | |
| 3088 q1 = q1 * 2 - 1; | |
| 3089 q2 = q2 * 2 - 1; | |
| 3090 for(k = 1; k < 8; k++) | |
| 3091 ac_val2[k] = (ac_val2[k] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 3092 } | |
| 3093 } | |
| 3094 } else {//top | |
| 3095 if(use_pred) { | |
| 3096 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); | |
| 3097 if(q2 && q1!=q2) { | |
| 3098 q1 = q1 * 2 - 1; | |
| 3099 q2 = q2 * 2 - 1; | |
| 3100 for(k = 1; k < 8; k++) | |
| 3101 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * vc1_dqscale[q1 - 1] + 0x20000) >> 18; | |
| 3102 } | |
| 3103 } | |
| 3104 } | |
| 3105 | |
| 3106 /* apply AC prediction if needed */ | |
| 3107 if(use_pred) { | |
| 3108 if(dc_pred_dir) { //left | |
| 3109 for(k = 1; k < 8; k++) { | |
| 3110 block[k << 3] = ac_val2[k] * scale; | |
| 3111 if(!v->pquantizer && block[k << 3]) | |
| 3112 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant; | |
| 3113 } | |
| 3114 } else { //top | |
| 3115 for(k = 1; k < 8; k++) { | |
| 3116 block[k] = ac_val2[k + 8] * scale; | |
| 3117 if(!v->pquantizer && block[k]) | |
| 3118 block[k] += (block[k] < 0) ? -mquant : mquant; | |
| 3119 } | |
| 3120 } | |
| 3121 i = 63; | |
| 3122 } | |
| 3123 } | |
| 3124 s->block_last_index[n] = i; | |
| 3125 | |
| 3126 return 0; | |
| 3127 } | |
| 3128 | |
| 3129 /** Decode P block | |
| 3130 */ | |
| 3131 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block) | |
| 3132 { | |
| 3133 MpegEncContext *s = &v->s; | |
| 3134 GetBitContext *gb = &s->gb; | |
| 3135 int i, j; | |
| 3136 int subblkpat = 0; | |
| 3137 int scale, off, idx, last, skip, value; | |
| 3138 int ttblk = ttmb & 7; | |
| 3139 | |
| 3140 if(ttmb == -1) { | |
| 3141 ttblk = ttblk_to_tt[v->tt_index][get_vlc2(gb, vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)]; | |
| 3142 } | |
| 3143 if(ttblk == TT_4X4) { | |
| 3144 subblkpat = ~(get_vlc2(gb, vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1); | |
| 3145 } | |
| 3146 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) { | |
| 3147 subblkpat = decode012(gb); | |
| 3148 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits | |
| 3149 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4; | |
| 3150 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8; | |
| 3151 } | |
| 3152 scale = 2 * mquant + v->halfpq; | |
| 3153 | |
| 3154 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT | |
| 3155 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) { | |
| 3156 subblkpat = 2 - (ttblk == TT_8X4_TOP); | |
| 3157 ttblk = TT_8X4; | |
| 3158 } | |
| 3159 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) { | |
| 3160 subblkpat = 2 - (ttblk == TT_4X8_LEFT); | |
| 3161 ttblk = TT_4X8; | |
| 3162 } | |
| 3163 switch(ttblk) { | |
| 3164 case TT_8X8: | |
| 3165 i = 0; | |
| 3166 last = 0; | |
| 3167 while (!last) { | |
| 3168 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
| 3169 i += skip; | |
| 3170 if(i > 63) | |
| 3171 break; | |
| 3172 idx = vc1_simple_progressive_8x8_zz[i++]; | |
| 3173 block[idx] = value * scale; | |
| 3174 if(!v->pquantizer) | |
| 3175 block[idx] += (block[idx] < 0) ? -mquant : mquant; | |
| 3176 } | |
| 3177 s->dsp.vc1_inv_trans_8x8(block); | |
| 3178 break; | |
| 3179 case TT_4X4: | |
| 3180 for(j = 0; j < 4; j++) { | |
| 3181 last = subblkpat & (1 << (3 - j)); | |
| 3182 i = 0; | |
| 3183 off = (j & 1) * 4 + (j & 2) * 16; | |
| 3184 while (!last) { | |
| 3185 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
| 3186 i += skip; | |
| 3187 if(i > 15) | |
| 3188 break; | |
| 3189 idx = vc1_simple_progressive_4x4_zz[i++]; | |
| 3190 block[idx + off] = value * scale; | |
| 3191 if(!v->pquantizer) | |
| 3192 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; | |
| 3193 } | |
| 3194 if(!(subblkpat & (1 << (3 - j)))) | |
| 3195 s->dsp.vc1_inv_trans_4x4(block, j); | |
| 3196 } | |
| 3197 break; | |
| 3198 case TT_8X4: | |
| 3199 for(j = 0; j < 2; j++) { | |
| 3200 last = subblkpat & (1 << (1 - j)); | |
| 3201 i = 0; | |
| 3202 off = j * 32; | |
| 3203 while (!last) { | |
| 3204 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
| 3205 i += skip; | |
| 3206 if(i > 31) | |
| 3207 break; | |
| 3208 if(v->profile < PROFILE_ADVANCED) | |
| 3209 idx = vc1_simple_progressive_8x4_zz[i++]; | |
| 3210 else | |
| 3211 idx = vc1_adv_progressive_8x4_zz[i++]; | |
| 3212 block[idx + off] = value * scale; | |
| 3213 if(!v->pquantizer) | |
| 3214 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; | |
| 3215 } | |
| 3216 if(!(subblkpat & (1 << (1 - j)))) | |
| 3217 s->dsp.vc1_inv_trans_8x4(block, j); | |
| 3218 } | |
| 3219 break; | |
| 3220 case TT_4X8: | |
| 3221 for(j = 0; j < 2; j++) { | |
| 3222 last = subblkpat & (1 << (1 - j)); | |
| 3223 i = 0; | |
| 3224 off = j * 4; | |
| 3225 while (!last) { | |
| 3226 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2); | |
| 3227 i += skip; | |
| 3228 if(i > 31) | |
| 3229 break; | |
| 3230 if(v->profile < PROFILE_ADVANCED) | |
| 3231 idx = vc1_simple_progressive_4x8_zz[i++]; | |
| 3232 else | |
| 3233 idx = vc1_adv_progressive_4x8_zz[i++]; | |
| 3234 block[idx + off] = value * scale; | |
| 3235 if(!v->pquantizer) | |
| 3236 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; | |
| 3237 } | |
| 3238 if(!(subblkpat & (1 << (1 - j)))) | |
| 3239 s->dsp.vc1_inv_trans_4x8(block, j); | |
| 3240 } | |
| 3241 break; | |
| 3242 } | |
| 3243 return 0; | |
| 3244 } | |
| 3245 | |
| 3246 | |
| 3247 /** Decode one P-frame MB (in Simple/Main profile) | |
| 3248 */ | |
| 3249 static int vc1_decode_p_mb(VC1Context *v) | |
| 3250 { | |
| 3251 MpegEncContext *s = &v->s; | |
| 3252 GetBitContext *gb = &s->gb; | |
| 3253 int i, j; | |
| 3254 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 3255 int cbp; /* cbp decoding stuff */ | |
| 3256 int mqdiff, mquant; /* MB quantization */ | |
| 3257 int ttmb = v->ttfrm; /* MB Transform type */ | |
| 3258 int status; | |
| 3259 | |
| 3260 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 }, | |
| 3261 offset_table[6] = { 0, 1, 3, 7, 15, 31 }; | |
| 3262 int mb_has_coeffs = 1; /* last_flag */ | |
| 3263 int dmv_x, dmv_y; /* Differential MV components */ | |
| 3264 int index, index1; /* LUT indices */ | |
| 3265 int val, sign; /* temp values */ | |
| 3266 int first_block = 1; | |
| 3267 int dst_idx, off; | |
| 3268 int skipped, fourmv; | |
| 3269 | |
| 3270 mquant = v->pq; /* Loosy initialization */ | |
| 3271 | |
| 3272 if (v->mv_type_is_raw) | |
| 3273 fourmv = get_bits1(gb); | |
| 3274 else | |
| 3275 fourmv = v->mv_type_mb_plane[mb_pos]; | |
| 3276 if (v->skip_is_raw) | |
| 3277 skipped = get_bits1(gb); | |
| 3278 else | |
| 3279 skipped = v->s.mbskip_table[mb_pos]; | |
| 3280 | |
| 3281 s->dsp.clear_blocks(s->block[0]); | |
| 3282 | |
| 3283 if (!fourmv) /* 1MV mode */ | |
| 3284 { | |
| 3285 if (!skipped) | |
| 3286 { | |
| 3287 GET_MVDATA(dmv_x, dmv_y); | |
| 3288 | |
| 3289 if (s->mb_intra) { | |
| 3290 s->current_picture.motion_val[1][s->block_index[0]][0] = 0; | |
| 3291 s->current_picture.motion_val[1][s->block_index[0]][1] = 0; | |
| 3292 } | |
| 3293 s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16; | |
| 3294 vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]); | |
| 3295 | |
| 3296 /* FIXME Set DC val for inter block ? */ | |
| 3297 if (s->mb_intra && !mb_has_coeffs) | |
| 3298 { | |
| 3299 GET_MQUANT(); | |
| 3300 s->ac_pred = get_bits(gb, 1); | |
| 3301 cbp = 0; | |
| 3302 } | |
| 3303 else if (mb_has_coeffs) | |
| 3304 { | |
| 3305 if (s->mb_intra) s->ac_pred = get_bits(gb, 1); | |
| 3306 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); | |
| 3307 GET_MQUANT(); | |
| 3308 } | |
| 3309 else | |
| 3310 { | |
| 3311 mquant = v->pq; | |
| 3312 cbp = 0; | |
| 3313 } | |
| 3314 s->current_picture.qscale_table[mb_pos] = mquant; | |
| 3315 | |
| 3316 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs) | |
| 3317 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, | |
| 3318 VC1_TTMB_VLC_BITS, 2); | |
| 3319 if(!s->mb_intra) vc1_mc_1mv(v, 0); | |
| 3320 dst_idx = 0; | |
| 3321 for (i=0; i<6; i++) | |
| 3322 { | |
| 3323 s->dc_val[0][s->block_index[i]] = 0; | |
| 3324 dst_idx += i >> 2; | |
| 3325 val = ((cbp >> (5 - i)) & 1); | |
| 3326 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); | |
| 3327 v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
| 3328 if(s->mb_intra) { | |
| 3329 /* check if prediction blocks A and C are available */ | |
| 3330 v->a_avail = v->c_avail = 0; | |
| 3331 if(i == 2 || i == 3 || !s->first_slice_line) | |
| 3332 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
| 3333 if(i == 1 || i == 3 || s->mb_x) | |
| 3334 v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
| 3335 | |
| 3336 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); | |
| 3337 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; | |
| 3338 s->dsp.vc1_inv_trans_8x8(s->block[i]); | |
| 3339 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; | |
| 3340 for(j = 0; j < 64; j++) s->block[i][j] += 128; | |
| 3341 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); | |
| 3342 if(v->pq >= 9 && v->overlap) { | |
| 3343 if(v->a_avail) | |
| 3344 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); | |
| 3345 if(v->c_avail) | |
| 3346 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); | |
| 3347 } | |
| 3348 } else if(val) { | |
| 3349 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); | |
| 3350 if(!v->ttmbf && ttmb < 8) ttmb = -1; | |
| 3351 first_block = 0; | |
| 3352 if((i<4) || !(s->flags & CODEC_FLAG_GRAY)) | |
| 3353 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); | |
| 3354 } | |
| 3355 } | |
| 3356 } | |
| 3357 else //Skipped | |
| 3358 { | |
| 3359 s->mb_intra = 0; | |
| 3360 for(i = 0; i < 6; i++) { | |
| 3361 v->mb_type[0][s->block_index[i]] = 0; | |
| 3362 s->dc_val[0][s->block_index[i]] = 0; | |
| 3363 } | |
| 3364 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP; | |
| 3365 s->current_picture.qscale_table[mb_pos] = 0; | |
| 3366 vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]); | |
| 3367 vc1_mc_1mv(v, 0); | |
| 3368 return 0; | |
| 3369 } | |
| 3370 } //1MV mode | |
| 3371 else //4MV mode | |
| 3372 { | |
| 3373 if (!skipped /* unskipped MB */) | |
| 3374 { | |
| 3375 int intra_count = 0, coded_inter = 0; | |
| 3376 int is_intra[6], is_coded[6]; | |
| 3377 /* Get CBPCY */ | |
| 3378 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); | |
| 3379 for (i=0; i<6; i++) | |
| 3380 { | |
| 3381 val = ((cbp >> (5 - i)) & 1); | |
| 3382 s->dc_val[0][s->block_index[i]] = 0; | |
| 3383 s->mb_intra = 0; | |
| 3384 if(i < 4) { | |
| 3385 dmv_x = dmv_y = 0; | |
| 3386 s->mb_intra = 0; | |
| 3387 mb_has_coeffs = 0; | |
| 3388 if(val) { | |
| 3389 GET_MVDATA(dmv_x, dmv_y); | |
| 3390 } | |
| 3391 vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]); | |
| 3392 if(!s->mb_intra) vc1_mc_4mv_luma(v, i); | |
| 3393 intra_count += s->mb_intra; | |
| 3394 is_intra[i] = s->mb_intra; | |
| 3395 is_coded[i] = mb_has_coeffs; | |
| 3396 } | |
| 3397 if(i&4){ | |
| 3398 is_intra[i] = (intra_count >= 3); | |
| 3399 is_coded[i] = val; | |
| 3400 } | |
| 3401 if(i == 4) vc1_mc_4mv_chroma(v); | |
| 3402 v->mb_type[0][s->block_index[i]] = is_intra[i]; | |
| 3403 if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i]; | |
| 3404 } | |
| 3405 // if there are no coded blocks then don't do anything more | |
| 3406 if(!intra_count && !coded_inter) return 0; | |
| 3407 dst_idx = 0; | |
| 3408 GET_MQUANT(); | |
| 3409 s->current_picture.qscale_table[mb_pos] = mquant; | |
| 3410 /* test if block is intra and has pred */ | |
| 3411 { | |
| 3412 int intrapred = 0; | |
| 3413 for(i=0; i<6; i++) | |
| 3414 if(is_intra[i]) { | |
| 3415 if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]]) | |
| 3416 || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) { | |
| 3417 intrapred = 1; | |
| 3418 break; | |
| 3419 } | |
| 3420 } | |
| 3421 if(intrapred)s->ac_pred = get_bits(gb, 1); | |
| 3422 else s->ac_pred = 0; | |
| 3423 } | |
| 3424 if (!v->ttmbf && coded_inter) | |
| 3425 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); | |
| 3426 for (i=0; i<6; i++) | |
| 3427 { | |
| 3428 dst_idx += i >> 2; | |
| 3429 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); | |
| 3430 s->mb_intra = is_intra[i]; | |
| 3431 if (is_intra[i]) { | |
| 3432 /* check if prediction blocks A and C are available */ | |
| 3433 v->a_avail = v->c_avail = 0; | |
| 3434 if(i == 2 || i == 3 || !s->first_slice_line) | |
| 3435 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
| 3436 if(i == 1 || i == 3 || s->mb_x) | |
| 3437 v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
| 3438 | |
| 3439 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset); | |
| 3440 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; | |
| 3441 s->dsp.vc1_inv_trans_8x8(s->block[i]); | |
| 3442 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; | |
| 3443 for(j = 0; j < 64; j++) s->block[i][j] += 128; | |
| 3444 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); | |
| 3445 if(v->pq >= 9 && v->overlap) { | |
| 3446 if(v->a_avail) | |
| 3447 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); | |
| 3448 if(v->c_avail) | |
| 3449 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); | |
| 3450 } | |
| 3451 } else if(is_coded[i]) { | |
| 3452 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); | |
| 3453 if(!v->ttmbf && ttmb < 8) ttmb = -1; | |
| 3454 first_block = 0; | |
| 3455 if((i<4) || !(s->flags & CODEC_FLAG_GRAY)) | |
| 3456 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); | |
| 3457 } | |
| 3458 } | |
| 3459 return status; | |
| 3460 } | |
| 3461 else //Skipped MB | |
| 3462 { | |
| 3463 s->mb_intra = 0; | |
| 3464 s->current_picture.qscale_table[mb_pos] = 0; | |
| 3465 for (i=0; i<6; i++) { | |
| 3466 v->mb_type[0][s->block_index[i]] = 0; | |
| 3467 s->dc_val[0][s->block_index[i]] = 0; | |
| 3468 } | |
| 3469 for (i=0; i<4; i++) | |
| 3470 { | |
| 3471 vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]); | |
| 3472 vc1_mc_4mv_luma(v, i); | |
| 3473 } | |
| 3474 vc1_mc_4mv_chroma(v); | |
| 3475 s->current_picture.qscale_table[mb_pos] = 0; | |
| 3476 return 0; | |
| 3477 } | |
| 3478 } | |
| 3479 | |
| 3480 /* Should never happen */ | |
| 3481 return -1; | |
| 3482 } | |
| 3483 | |
| 3484 /** Decode one B-frame MB (in Main profile) | |
| 3485 */ | |
| 3486 static void vc1_decode_b_mb(VC1Context *v) | |
| 3487 { | |
| 3488 MpegEncContext *s = &v->s; | |
| 3489 GetBitContext *gb = &s->gb; | |
| 3490 int i, j; | |
| 3491 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 3492 int cbp = 0; /* cbp decoding stuff */ | |
| 3493 int mqdiff, mquant; /* MB quantization */ | |
| 3494 int ttmb = v->ttfrm; /* MB Transform type */ | |
| 3495 | |
| 3496 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 }, | |
| 3497 offset_table[6] = { 0, 1, 3, 7, 15, 31 }; | |
| 3498 int mb_has_coeffs = 0; /* last_flag */ | |
| 3499 int index, index1; /* LUT indices */ | |
| 3500 int val, sign; /* temp values */ | |
| 3501 int first_block = 1; | |
| 3502 int dst_idx, off; | |
| 3503 int skipped, direct; | |
| 3504 int dmv_x[2], dmv_y[2]; | |
| 3505 int bmvtype = BMV_TYPE_BACKWARD; | |
| 3506 | |
| 3507 mquant = v->pq; /* Loosy initialization */ | |
| 3508 s->mb_intra = 0; | |
| 3509 | |
| 3510 if (v->dmb_is_raw) | |
| 3511 direct = get_bits1(gb); | |
| 3512 else | |
| 3513 direct = v->direct_mb_plane[mb_pos]; | |
| 3514 if (v->skip_is_raw) | |
| 3515 skipped = get_bits1(gb); | |
| 3516 else | |
| 3517 skipped = v->s.mbskip_table[mb_pos]; | |
| 3518 | |
| 3519 s->dsp.clear_blocks(s->block[0]); | |
| 3520 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0; | |
| 3521 for(i = 0; i < 6; i++) { | |
| 3522 v->mb_type[0][s->block_index[i]] = 0; | |
| 3523 s->dc_val[0][s->block_index[i]] = 0; | |
| 3524 } | |
| 3525 s->current_picture.qscale_table[mb_pos] = 0; | |
| 3526 | |
| 3527 if (!direct) { | |
| 3528 if (!skipped) { | |
| 3529 GET_MVDATA(dmv_x[0], dmv_y[0]); | |
| 3530 dmv_x[1] = dmv_x[0]; | |
| 3531 dmv_y[1] = dmv_y[0]; | |
| 3532 } | |
| 3533 if(skipped || !s->mb_intra) { | |
| 3534 bmvtype = decode012(gb); | |
| 3535 switch(bmvtype) { | |
| 3536 case 0: | |
| 3537 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD; | |
| 3538 break; | |
| 3539 case 1: | |
| 3540 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD; | |
| 3541 break; | |
| 3542 case 2: | |
| 3543 bmvtype = BMV_TYPE_INTERPOLATED; | |
| 3544 dmv_x[0] = dmv_y[0] = 0; | |
| 3545 } | |
| 3546 } | |
| 3547 } | |
| 3548 for(i = 0; i < 6; i++) | |
| 3549 v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
| 3550 | |
| 3551 if (skipped) { | |
| 3552 if(direct) bmvtype = BMV_TYPE_INTERPOLATED; | |
| 3553 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3554 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3555 return; | |
| 3556 } | |
| 3557 if (direct) { | |
| 3558 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); | |
| 3559 GET_MQUANT(); | |
| 3560 s->mb_intra = 0; | |
| 3561 mb_has_coeffs = 0; | |
| 3562 s->current_picture.qscale_table[mb_pos] = mquant; | |
| 3563 if(!v->ttmbf) | |
| 3564 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); | |
| 3565 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0; | |
| 3566 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3567 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3568 } else { | |
| 3569 if(!mb_has_coeffs && !s->mb_intra) { | |
| 3570 /* no coded blocks - effectively skipped */ | |
| 3571 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3572 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3573 return; | |
| 3574 } | |
| 3575 if(s->mb_intra && !mb_has_coeffs) { | |
| 3576 GET_MQUANT(); | |
| 3577 s->current_picture.qscale_table[mb_pos] = mquant; | |
| 3578 s->ac_pred = get_bits1(gb); | |
| 3579 cbp = 0; | |
| 3580 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3581 } else { | |
| 3582 if(bmvtype == BMV_TYPE_INTERPOLATED) { | |
| 3583 GET_MVDATA(dmv_x[0], dmv_y[0]); | |
| 3584 if(!mb_has_coeffs) { | |
| 3585 /* interpolated skipped block */ | |
| 3586 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3587 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3588 return; | |
| 3589 } | |
| 3590 } | |
| 3591 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3592 if(!s->mb_intra) { | |
| 3593 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); | |
| 3594 } | |
| 3595 if(s->mb_intra) | |
| 3596 s->ac_pred = get_bits1(gb); | |
| 3597 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); | |
| 3598 GET_MQUANT(); | |
| 3599 s->current_picture.qscale_table[mb_pos] = mquant; | |
| 3600 if(!v->ttmbf && !s->mb_intra && mb_has_coeffs) | |
| 3601 ttmb = get_vlc2(gb, vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); | |
| 3602 } | |
| 3603 } | |
| 3604 dst_idx = 0; | |
| 3605 for (i=0; i<6; i++) | |
| 3606 { | |
| 3607 s->dc_val[0][s->block_index[i]] = 0; | |
| 3608 dst_idx += i >> 2; | |
| 3609 val = ((cbp >> (5 - i)) & 1); | |
| 3610 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); | |
| 3611 v->mb_type[0][s->block_index[i]] = s->mb_intra; | |
| 3612 if(s->mb_intra) { | |
| 3613 /* check if prediction blocks A and C are available */ | |
| 3614 v->a_avail = v->c_avail = 0; | |
| 3615 if(i == 2 || i == 3 || !s->first_slice_line) | |
| 3616 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; | |
| 3617 if(i == 1 || i == 3 || s->mb_x) | |
| 3618 v->c_avail = v->mb_type[0][s->block_index[i] - 1]; | |
| 3619 | |
| 3620 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); | |
| 3621 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue; | |
| 3622 s->dsp.vc1_inv_trans_8x8(s->block[i]); | |
| 3623 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1; | |
| 3624 for(j = 0; j < 64; j++) s->block[i][j] += 128; | |
| 3625 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); | |
| 3626 } else if(val) { | |
| 3627 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); | |
| 3628 if(!v->ttmbf && ttmb < 8) ttmb = -1; | |
| 3629 first_block = 0; | |
| 3630 if((i<4) || !(s->flags & CODEC_FLAG_GRAY)) | |
| 3631 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); | |
| 3632 } | |
| 3633 } | |
| 3634 } | |
| 3635 | |
| 3636 /** Decode blocks of I-frame | |
| 3637 */ | |
| 3638 static void vc1_decode_i_blocks(VC1Context *v) | |
| 3639 { | |
| 3640 int k, j; | |
| 3641 MpegEncContext *s = &v->s; | |
| 3642 int cbp, val; | |
| 3643 uint8_t *coded_val; | |
| 3644 int mb_pos; | |
| 3645 | |
| 3646 /* select codingmode used for VLC tables selection */ | |
| 3647 switch(v->y_ac_table_index){ | |
| 3648 case 0: | |
| 3649 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; | |
| 3650 break; | |
| 3651 case 1: | |
| 3652 v->codingset = CS_HIGH_MOT_INTRA; | |
| 3653 break; | |
| 3654 case 2: | |
| 3655 v->codingset = CS_MID_RATE_INTRA; | |
| 3656 break; | |
| 3657 } | |
| 3658 | |
| 3659 switch(v->c_ac_table_index){ | |
| 3660 case 0: | |
| 3661 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; | |
| 3662 break; | |
| 3663 case 1: | |
| 3664 v->codingset2 = CS_HIGH_MOT_INTER; | |
| 3665 break; | |
| 3666 case 2: | |
| 3667 v->codingset2 = CS_MID_RATE_INTER; | |
| 3668 break; | |
| 3669 } | |
| 3670 | |
| 3671 /* Set DC scale - y and c use the same */ | |
| 3672 s->y_dc_scale = s->y_dc_scale_table[v->pq]; | |
| 3673 s->c_dc_scale = s->c_dc_scale_table[v->pq]; | |
| 3674 | |
| 3675 //do frame decode | |
| 3676 s->mb_x = s->mb_y = 0; | |
| 3677 s->mb_intra = 1; | |
| 3678 s->first_slice_line = 1; | |
| 3679 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); | |
| 3680 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { | |
| 3681 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { | |
| 3682 ff_init_block_index(s); | |
| 3683 ff_update_block_index(s); | |
| 3684 s->dsp.clear_blocks(s->block[0]); | |
| 3685 mb_pos = s->mb_x + s->mb_y * s->mb_width; | |
| 3686 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA; | |
| 3687 s->current_picture.qscale_table[mb_pos] = v->pq; | |
| 3688 s->current_picture.motion_val[1][s->block_index[0]][0] = 0; | |
| 3689 s->current_picture.motion_val[1][s->block_index[0]][1] = 0; | |
| 3690 | |
| 3691 // do actual MB decoding and displaying | |
| 3692 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); | |
| 3693 v->s.ac_pred = get_bits(&v->s.gb, 1); | |
| 3694 | |
| 3695 for(k = 0; k < 6; k++) { | |
| 3696 val = ((cbp >> (5 - k)) & 1); | |
| 3697 | |
| 3698 if (k < 4) { | |
| 3699 int pred = vc1_coded_block_pred(&v->s, k, &coded_val); | |
| 3700 val = val ^ pred; | |
| 3701 *coded_val = val; | |
| 3702 } | |
| 3703 cbp |= val << (5 - k); | |
| 3704 | |
| 3705 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2); | |
| 3706 | |
| 3707 s->dsp.vc1_inv_trans_8x8(s->block[k]); | |
| 3708 if(v->pq >= 9 && v->overlap) { | |
| 3709 for(j = 0; j < 64; j++) s->block[k][j] += 128; | |
| 3710 } | |
| 3711 } | |
| 3712 | |
| 3713 vc1_put_block(v, s->block); | |
| 3714 if(v->pq >= 9 && v->overlap) { | |
| 3715 if(!s->first_slice_line) { | |
| 3716 s->dsp.vc1_v_overlap(s->dest[0], s->linesize, 0); | |
| 3717 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize, 0); | |
| 3718 if(!(s->flags & CODEC_FLAG_GRAY)) { | |
| 3719 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize, s->mb_y&1); | |
| 3720 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize, s->mb_y&1); | |
| 3721 } | |
| 3722 } | |
| 3723 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1); | |
| 3724 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); | |
| 3725 if(s->mb_x) { | |
| 3726 s->dsp.vc1_h_overlap(s->dest[0], s->linesize, 0); | |
| 3727 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0); | |
| 3728 if(!(s->flags & CODEC_FLAG_GRAY)) { | |
| 3729 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1); | |
| 3730 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1); | |
| 3731 } | |
| 3732 } | |
| 3733 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize, 1); | |
| 3734 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); | |
| 3735 } | |
| 3736 | |
| 3737 if(get_bits_count(&s->gb) > v->bits) { | |
| 3738 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); | |
| 3739 return; | |
| 3740 } | |
| 3741 } | |
| 3742 ff_draw_horiz_band(s, s->mb_y * 16, 16); | |
| 3743 s->first_slice_line = 0; | |
| 3744 } | |
| 3745 } | |
| 3746 | |
| 3747 /** Decode blocks of I-frame for advanced profile | |
| 3748 */ | |
| 3749 static void vc1_decode_i_blocks_adv(VC1Context *v) | |
| 3750 { | |
| 3751 int k, j; | |
| 3752 MpegEncContext *s = &v->s; | |
| 3753 int cbp, val; | |
| 3754 uint8_t *coded_val; | |
| 3755 int mb_pos; | |
| 3756 int mquant = v->pq; | |
| 3757 int mqdiff; | |
| 3758 int overlap; | |
| 3759 GetBitContext *gb = &s->gb; | |
| 3760 | |
| 3761 /* select codingmode used for VLC tables selection */ | |
| 3762 switch(v->y_ac_table_index){ | |
| 3763 case 0: | |
| 3764 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; | |
| 3765 break; | |
| 3766 case 1: | |
| 3767 v->codingset = CS_HIGH_MOT_INTRA; | |
| 3768 break; | |
| 3769 case 2: | |
| 3770 v->codingset = CS_MID_RATE_INTRA; | |
| 3771 break; | |
| 3772 } | |
| 3773 | |
| 3774 switch(v->c_ac_table_index){ | |
| 3775 case 0: | |
| 3776 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; | |
| 3777 break; | |
| 3778 case 1: | |
| 3779 v->codingset2 = CS_HIGH_MOT_INTER; | |
| 3780 break; | |
| 3781 case 2: | |
| 3782 v->codingset2 = CS_MID_RATE_INTER; | |
| 3783 break; | |
| 3784 } | |
| 3785 | |
| 3786 /* Set DC scale - y and c use the same */ | |
| 3787 s->y_dc_scale = s->y_dc_scale_table[v->pq]; | |
| 3788 s->c_dc_scale = s->c_dc_scale_table[v->pq]; | |
| 3789 | |
| 3790 //do frame decode | |
| 3791 s->mb_x = s->mb_y = 0; | |
| 3792 s->mb_intra = 1; | |
| 3793 s->first_slice_line = 1; | |
| 3794 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); | |
| 3795 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { | |
| 3796 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { | |
| 3797 ff_init_block_index(s); | |
| 3798 ff_update_block_index(s); | |
| 3799 s->dsp.clear_blocks(s->block[0]); | |
| 3800 mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 3801 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA; | |
| 3802 s->current_picture.motion_val[1][s->block_index[0]][0] = 0; | |
| 3803 s->current_picture.motion_val[1][s->block_index[0]][1] = 0; | |
| 3804 | |
| 3805 // do actual MB decoding and displaying | |
| 3806 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); | |
| 3807 if(v->acpred_is_raw) | |
| 3808 v->s.ac_pred = get_bits(&v->s.gb, 1); | |
| 3809 else | |
| 3810 v->s.ac_pred = v->acpred_plane[mb_pos]; | |
| 3811 | |
| 3812 if(v->condover == CONDOVER_SELECT) { | |
| 3813 if(v->overflg_is_raw) | |
| 3814 overlap = get_bits(&v->s.gb, 1); | |
| 3815 else | |
| 3816 overlap = v->over_flags_plane[mb_pos]; | |
| 3817 } else | |
| 3818 overlap = (v->condover == CONDOVER_ALL); | |
| 3819 | |
| 3820 GET_MQUANT(); | |
| 3821 | |
| 3822 s->current_picture.qscale_table[mb_pos] = mquant; | |
| 3823 | |
| 3824 for(k = 0; k < 6; k++) { | |
| 3825 val = ((cbp >> (5 - k)) & 1); | |
| 3826 | |
| 3827 if (k < 4) { | |
| 3828 int pred = vc1_coded_block_pred(&v->s, k, &coded_val); | |
| 3829 val = val ^ pred; | |
| 3830 *coded_val = val; | |
| 3831 } | |
| 3832 cbp |= val << (5 - k); | |
| 3833 | |
| 3834 v->a_avail = !s->first_slice_line || (k==2 || k==3); | |
| 3835 v->c_avail = !!s->mb_x || (k==1 || k==3); | |
| 3836 | |
| 3837 vc1_decode_i_block_adv(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant); | |
| 3838 | |
| 3839 s->dsp.vc1_inv_trans_8x8(s->block[k]); | |
| 3840 for(j = 0; j < 64; j++) s->block[k][j] += 128; | |
| 3841 } | |
| 3842 | |
| 3843 vc1_put_block(v, s->block); | |
| 3844 if(overlap) { | |
| 3845 if(!s->first_slice_line) { | |
| 3846 s->dsp.vc1_v_overlap(s->dest[0], s->linesize, 0); | |
| 3847 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize, 0); | |
| 3848 if(!(s->flags & CODEC_FLAG_GRAY)) { | |
| 3849 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize, s->mb_y&1); | |
| 3850 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize, s->mb_y&1); | |
| 3851 } | |
| 3852 } | |
| 3853 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1); | |
| 3854 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); | |
| 3855 if(s->mb_x) { | |
| 3856 s->dsp.vc1_h_overlap(s->dest[0], s->linesize, 0); | |
| 3857 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0); | |
| 3858 if(!(s->flags & CODEC_FLAG_GRAY)) { | |
| 3859 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1); | |
| 3860 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1); | |
| 3861 } | |
| 3862 } | |
| 3863 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize, 1); | |
| 3864 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); | |
| 3865 } | |
| 3866 | |
| 3867 if(get_bits_count(&s->gb) > v->bits) { | |
| 3868 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); | |
| 3869 return; | |
| 3870 } | |
| 3871 } | |
| 3872 ff_draw_horiz_band(s, s->mb_y * 16, 16); | |
| 3873 s->first_slice_line = 0; | |
| 3874 } | |
| 3875 } | |
| 3876 | |
| 3877 static void vc1_decode_p_blocks(VC1Context *v) | |
| 3878 { | |
| 3879 MpegEncContext *s = &v->s; | |
| 3880 | |
| 3881 /* select codingmode used for VLC tables selection */ | |
| 3882 switch(v->c_ac_table_index){ | |
| 3883 case 0: | |
| 3884 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; | |
| 3885 break; | |
| 3886 case 1: | |
| 3887 v->codingset = CS_HIGH_MOT_INTRA; | |
| 3888 break; | |
| 3889 case 2: | |
| 3890 v->codingset = CS_MID_RATE_INTRA; | |
| 3891 break; | |
| 3892 } | |
| 3893 | |
| 3894 switch(v->c_ac_table_index){ | |
| 3895 case 0: | |
| 3896 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; | |
| 3897 break; | |
| 3898 case 1: | |
| 3899 v->codingset2 = CS_HIGH_MOT_INTER; | |
| 3900 break; | |
| 3901 case 2: | |
| 3902 v->codingset2 = CS_MID_RATE_INTER; | |
| 3903 break; | |
| 3904 } | |
| 3905 | |
| 3906 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); | |
| 3907 s->first_slice_line = 1; | |
| 3908 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { | |
| 3909 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { | |
| 3910 ff_init_block_index(s); | |
| 3911 ff_update_block_index(s); | |
| 3912 s->dsp.clear_blocks(s->block[0]); | |
| 3913 | |
| 3914 vc1_decode_p_mb(v); | |
| 3915 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { | |
| 3916 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); | |
| 3917 return; | |
| 3918 } | |
| 3919 } | |
| 3920 ff_draw_horiz_band(s, s->mb_y * 16, 16); | |
| 3921 s->first_slice_line = 0; | |
| 3922 } | |
| 3923 } | |
| 3924 | |
| 3925 static void vc1_decode_b_blocks(VC1Context *v) | |
| 3926 { | |
| 3927 MpegEncContext *s = &v->s; | |
| 3928 | |
| 3929 /* select codingmode used for VLC tables selection */ | |
| 3930 switch(v->c_ac_table_index){ | |
| 3931 case 0: | |
| 3932 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA; | |
| 3933 break; | |
| 3934 case 1: | |
| 3935 v->codingset = CS_HIGH_MOT_INTRA; | |
| 3936 break; | |
| 3937 case 2: | |
| 3938 v->codingset = CS_MID_RATE_INTRA; | |
| 3939 break; | |
| 3940 } | |
| 3941 | |
| 3942 switch(v->c_ac_table_index){ | |
| 3943 case 0: | |
| 3944 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER; | |
| 3945 break; | |
| 3946 case 1: | |
| 3947 v->codingset2 = CS_HIGH_MOT_INTER; | |
| 3948 break; | |
| 3949 case 2: | |
| 3950 v->codingset2 = CS_MID_RATE_INTER; | |
| 3951 break; | |
| 3952 } | |
| 3953 | |
| 3954 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); | |
| 3955 s->first_slice_line = 1; | |
| 3956 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { | |
| 3957 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { | |
| 3958 ff_init_block_index(s); | |
| 3959 ff_update_block_index(s); | |
| 3960 s->dsp.clear_blocks(s->block[0]); | |
| 3961 | |
| 3962 vc1_decode_b_mb(v); | |
| 3963 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { | |
| 3964 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); | |
| 3965 return; | |
| 3966 } | |
| 3967 } | |
| 3968 ff_draw_horiz_band(s, s->mb_y * 16, 16); | |
| 3969 s->first_slice_line = 0; | |
| 3970 } | |
| 3971 } | |
| 3972 | |
| 3973 static void vc1_decode_skip_blocks(VC1Context *v) | |
| 3974 { | |
| 3975 MpegEncContext *s = &v->s; | |
| 3976 | |
| 3977 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); | |
| 3978 s->first_slice_line = 1; | |
| 3979 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { | |
| 3980 s->mb_x = 0; | |
| 3981 ff_init_block_index(s); | |
| 3982 ff_update_block_index(s); | |
| 3983 memcpy(s->dest[0], s->last_picture.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16); | |
| 3984 memcpy(s->dest[1], s->last_picture.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8); | |
| 3985 memcpy(s->dest[2], s->last_picture.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8); | |
| 3986 ff_draw_horiz_band(s, s->mb_y * 16, 16); | |
| 3987 s->first_slice_line = 0; | |
| 3988 } | |
| 3989 s->pict_type = P_TYPE; | |
| 3990 } | |
| 3991 | |
| 3992 static void vc1_decode_blocks(VC1Context *v) | |
| 3993 { | |
| 3994 | |
| 3995 v->s.esc3_level_length = 0; | |
| 3996 | |
| 3997 switch(v->s.pict_type) { | |
| 3998 case I_TYPE: | |
| 3999 if(v->profile == PROFILE_ADVANCED) | |
| 4000 vc1_decode_i_blocks_adv(v); | |
| 4001 else | |
| 4002 vc1_decode_i_blocks(v); | |
| 4003 break; | |
| 4004 case P_TYPE: | |
| 4005 if(v->p_frame_skipped) | |
| 4006 vc1_decode_skip_blocks(v); | |
| 4007 else | |
| 4008 vc1_decode_p_blocks(v); | |
| 4009 break; | |
| 4010 case B_TYPE: | |
| 4011 if(v->bi_type) | |
| 4012 vc1_decode_i_blocks(v); | |
| 4013 else | |
| 4014 vc1_decode_b_blocks(v); | |
| 4015 break; | |
| 4016 } | |
| 4017 } | |
| 4018 | |
| 4019 | |
| 4020 /** Initialize a VC1/WMV3 decoder | |
| 4021 * @todo TODO: Handle VC-1 IDUs (Transport level?) | |
| 4022 * @todo TODO: Decypher remaining bits in extra_data | |
| 4023 */ | |
| 4024 static int vc1_decode_init(AVCodecContext *avctx) | |
| 4025 { | |
| 4026 VC1Context *v = avctx->priv_data; | |
| 4027 MpegEncContext *s = &v->s; | |
| 4028 GetBitContext gb; | |
| 4029 | |
| 4030 if (!avctx->extradata_size || !avctx->extradata) return -1; | |
| 4031 if (!(avctx->flags & CODEC_FLAG_GRAY)) | |
| 4032 avctx->pix_fmt = PIX_FMT_YUV420P; | |
| 4033 else | |
| 4034 avctx->pix_fmt = PIX_FMT_GRAY8; | |
| 4035 v->s.avctx = avctx; | |
| 4036 avctx->flags |= CODEC_FLAG_EMU_EDGE; | |
| 4037 v->s.flags |= CODEC_FLAG_EMU_EDGE; | |
| 4038 | |
| 4039 if(ff_h263_decode_init(avctx) < 0) | |
| 4040 return -1; | |
| 4041 if (vc1_init_common(v) < 0) return -1; | |
| 4042 | |
| 4043 avctx->coded_width = avctx->width; | |
| 4044 avctx->coded_height = avctx->height; | |
| 4045 if (avctx->codec_id == CODEC_ID_WMV3) | |
| 4046 { | |
| 4047 int count = 0; | |
| 4048 | |
| 4049 // looks like WMV3 has a sequence header stored in the extradata | |
| 4050 // advanced sequence header may be before the first frame | |
| 4051 // the last byte of the extradata is a version number, 1 for the | |
| 4052 // samples we can decode | |
| 4053 | |
| 4054 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8); | |
| 4055 | |
| 4056 if (decode_sequence_header(avctx, &gb) < 0) | |
| 4057 return -1; | |
| 4058 | |
| 4059 count = avctx->extradata_size*8 - get_bits_count(&gb); | |
| 4060 if (count>0) | |
| 4061 { | |
| 4062 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n", | |
| 4063 count, get_bits(&gb, count)); | |
| 4064 } | |
| 4065 else if (count < 0) | |
| 4066 { | |
| 4067 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count); | |
| 4068 } | |
| 4069 } else { // VC1/WVC1 | |
| 4070 int edata_size = avctx->extradata_size; | |
| 4071 uint8_t *edata = avctx->extradata; | |
| 4072 | |
| 4073 if(avctx->extradata_size < 16) { | |
| 4074 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", edata_size); | |
| 4075 return -1; | |
| 4076 } | |
| 4077 while(edata_size > 8) { | |
| 4078 // test if we've found header | |
| 4079 if(BE_32(edata) == 0x0000010F) { | |
| 4080 edata += 4; | |
| 4081 edata_size -= 4; | |
| 4082 break; | |
| 4083 } | |
| 4084 edata_size--; | |
| 4085 edata++; | |
| 4086 } | |
| 4087 | |
| 4088 init_get_bits(&gb, edata, edata_size*8); | |
| 4089 | |
| 4090 if (decode_sequence_header(avctx, &gb) < 0) | |
| 4091 return -1; | |
| 4092 | |
| 4093 while(edata_size > 8) { | |
| 4094 // test if we've found entry point | |
| 4095 if(BE_32(edata) == 0x0000010E) { | |
| 4096 edata += 4; | |
| 4097 edata_size -= 4; | |
| 4098 break; | |
| 4099 } | |
| 4100 edata_size--; | |
| 4101 edata++; | |
| 4102 } | |
| 4103 | |
| 4104 init_get_bits(&gb, edata, edata_size*8); | |
| 4105 | |
| 4106 if (decode_entry_point(avctx, &gb) < 0) | |
| 4107 return -1; | |
| 4108 } | |
| 4109 avctx->has_b_frames= !!(avctx->max_b_frames); | |
| 4110 s->low_delay = !avctx->has_b_frames; | |
| 4111 | |
| 4112 s->mb_width = (avctx->coded_width+15)>>4; | |
| 4113 s->mb_height = (avctx->coded_height+15)>>4; | |
| 4114 | |
| 4115 /* Allocate mb bitplanes */ | |
| 4116 v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height); | |
| 4117 v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height); | |
| 4118 v->acpred_plane = av_malloc(s->mb_stride * s->mb_height); | |
| 4119 v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height); | |
| 4120 | |
| 4121 /* allocate block type info in that way so it could be used with s->block_index[] */ | |
| 4122 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2); | |
| 4123 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1; | |
| 4124 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1; | |
| 4125 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1); | |
| 4126 | |
| 4127 /* Init coded blocks info */ | |
| 4128 if (v->profile == PROFILE_ADVANCED) | |
| 4129 { | |
| 4130 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0) | |
| 4131 // return -1; | |
| 4132 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0) | |
| 4133 // return -1; | |
| 4134 } | |
| 4135 | |
| 4136 return 0; | |
| 4137 } | |
| 4138 | |
| 4139 | |
| 4140 /** Decode a VC1/WMV3 frame | |
| 4141 * @todo TODO: Handle VC-1 IDUs (Transport level?) | |
| 4142 */ | |
| 4143 static int vc1_decode_frame(AVCodecContext *avctx, | |
| 4144 void *data, int *data_size, | |
| 4145 uint8_t *buf, int buf_size) | |
| 4146 { | |
| 4147 VC1Context *v = avctx->priv_data; | |
| 4148 MpegEncContext *s = &v->s; | |
| 4149 AVFrame *pict = data; | |
| 4150 uint8_t *buf2 = NULL; | |
| 4151 | |
| 4152 /* no supplementary picture */ | |
| 4153 if (buf_size == 0) { | |
| 4154 /* special case for last picture */ | |
| 4155 if (s->low_delay==0 && s->next_picture_ptr) { | |
| 4156 *pict= *(AVFrame*)s->next_picture_ptr; | |
| 4157 s->next_picture_ptr= NULL; | |
| 4158 | |
| 4159 *data_size = sizeof(AVFrame); | |
| 4160 } | |
| 4161 | |
| 4162 return 0; | |
| 4163 } | |
| 4164 | |
| 4165 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there | |
| 4166 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){ | |
| 4167 int i= ff_find_unused_picture(s, 0); | |
| 4168 s->current_picture_ptr= &s->picture[i]; | |
| 4169 } | |
| 4170 | |
| 4171 //for advanced profile we need to unescape buffer | |
| 4172 if (avctx->codec_id == CODEC_ID_VC1) { | |
| 4173 int i, buf_size2; | |
| 4174 buf2 = av_malloc(buf_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
| 4175 buf_size2 = 0; | |
| 4176 for(i = 0; i < buf_size; i++) { | |
| 4177 if(buf[i] == 3 && i >= 2 && !buf[i-1] && !buf[i-2] && i < buf_size-1 && buf[i+1] < 4) { | |
| 4178 buf2[buf_size2++] = buf[i+1]; | |
| 4179 i++; | |
| 4180 } else | |
| 4181 buf2[buf_size2++] = buf[i]; | |
| 4182 } | |
| 4183 init_get_bits(&s->gb, buf2, buf_size2*8); | |
| 4184 } else | |
| 4185 init_get_bits(&s->gb, buf, buf_size*8); | |
| 4186 // do parse frame header | |
| 4187 if(v->profile < PROFILE_ADVANCED) { | |
| 4188 if(vc1_parse_frame_header(v, &s->gb) == -1) { | |
| 4189 av_free(buf2); | |
| 4190 return -1; | |
| 4191 } | |
| 4192 } else { | |
| 4193 if(vc1_parse_frame_header_adv(v, &s->gb) == -1) { | |
| 4194 av_free(buf2); | |
| 4195 return -1; | |
| 4196 } | |
| 4197 } | |
| 4198 | |
| 4199 if(s->pict_type != I_TYPE && !v->res_rtm_flag){ | |
| 4200 av_free(buf2); | |
| 4201 return -1; | |
| 4202 } | |
| 4203 | |
| 4204 // for hurry_up==5 | |
| 4205 s->current_picture.pict_type= s->pict_type; | |
| 4206 s->current_picture.key_frame= s->pict_type == I_TYPE; | |
| 4207 | |
| 4208 /* skip B-frames if we don't have reference frames */ | |
| 4209 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)){ | |
| 4210 av_free(buf2); | |
| 4211 return -1;//buf_size; | |
| 4212 } | |
| 4213 /* skip b frames if we are in a hurry */ | |
| 4214 if(avctx->hurry_up && s->pict_type==B_TYPE) return -1;//buf_size; | |
| 4215 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE) | |
| 4216 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE) | |
| 4217 || avctx->skip_frame >= AVDISCARD_ALL) { | |
| 4218 av_free(buf2); | |
| 4219 return buf_size; | |
| 4220 } | |
| 4221 /* skip everything if we are in a hurry>=5 */ | |
| 4222 if(avctx->hurry_up>=5) { | |
| 4223 av_free(buf2); | |
| 4224 return -1;//buf_size; | |
| 4225 } | |
| 4226 | |
| 4227 if(s->next_p_frame_damaged){ | |
| 4228 if(s->pict_type==B_TYPE) | |
| 4229 return buf_size; | |
| 4230 else | |
| 4231 s->next_p_frame_damaged=0; | |
| 4232 } | |
| 4233 | |
| 4234 if(MPV_frame_start(s, avctx) < 0) { | |
| 4235 av_free(buf2); | |
| 4236 return -1; | |
| 4237 } | |
| 4238 | |
| 4239 ff_er_frame_start(s); | |
| 4240 | |
| 4241 v->bits = buf_size * 8; | |
| 4242 vc1_decode_blocks(v); | |
| 4243 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8); | |
| 4244 // if(get_bits_count(&s->gb) > buf_size * 8) | |
| 4245 // return -1; | |
| 4246 ff_er_frame_end(s); | |
| 4247 | |
| 4248 MPV_frame_end(s); | |
| 4249 | |
| 4250 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type); | |
| 4251 assert(s->current_picture.pict_type == s->pict_type); | |
| 4252 if (s->pict_type == B_TYPE || s->low_delay) { | |
| 4253 *pict= *(AVFrame*)s->current_picture_ptr; | |
| 4254 } else if (s->last_picture_ptr != NULL) { | |
| 4255 *pict= *(AVFrame*)s->last_picture_ptr; | |
| 4256 } | |
| 4257 | |
| 4258 if(s->last_picture_ptr || s->low_delay){ | |
| 4259 *data_size = sizeof(AVFrame); | |
| 4260 ff_print_debug_info(s, pict); | |
| 4261 } | |
| 4262 | |
| 4263 /* Return the Picture timestamp as the frame number */ | |
| 4264 /* we substract 1 because it is added on utils.c */ | |
| 4265 avctx->frame_number = s->picture_number - 1; | |
| 4266 | |
| 4267 av_free(buf2); | |
| 4268 return buf_size; | |
| 4269 } | |
| 4270 | |
| 4271 | |
| 4272 /** Close a VC1/WMV3 decoder | |
| 4273 * @warning Initial try at using MpegEncContext stuff | |
| 4274 */ | |
| 4275 static int vc1_decode_end(AVCodecContext *avctx) | |
| 4276 { | |
| 4277 VC1Context *v = avctx->priv_data; | |
| 4278 | |
| 4279 av_freep(&v->hrd_rate); | |
| 4280 av_freep(&v->hrd_buffer); | |
| 4281 MPV_common_end(&v->s); | |
| 4282 av_freep(&v->mv_type_mb_plane); | |
| 4283 av_freep(&v->direct_mb_plane); | |
| 4284 av_freep(&v->acpred_plane); | |
| 4285 av_freep(&v->over_flags_plane); | |
| 4286 av_freep(&v->mb_type_base); | |
| 4287 return 0; | |
| 4288 } | |
| 4289 | |
| 4290 | |
| 4291 AVCodec vc1_decoder = { | |
| 4292 "vc1", | |
| 4293 CODEC_TYPE_VIDEO, | |
| 4294 CODEC_ID_VC1, | |
| 4295 sizeof(VC1Context), | |
| 4296 vc1_decode_init, | |
| 4297 NULL, | |
| 4298 vc1_decode_end, | |
| 4299 vc1_decode_frame, | |
| 4300 CODEC_CAP_DELAY, | |
| 4301 NULL | |
| 4302 }; | |
| 4303 | |
| 4304 AVCodec wmv3_decoder = { | |
| 4305 "wmv3", | |
| 4306 CODEC_TYPE_VIDEO, | |
| 4307 CODEC_ID_WMV3, | |
| 4308 sizeof(VC1Context), | |
| 4309 vc1_decode_init, | |
| 4310 NULL, | |
| 4311 vc1_decode_end, | |
| 4312 vc1_decode_frame, | |
| 4313 CODEC_CAP_DELAY, | |
| 4314 NULL | |
| 4315 }; |
