| 1 | /* |
| 2 | * VC-1 and WMV3 decoder |
| 3 | * Copyright (c) 2006-2007 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 | #ifndef AVCODEC_VC1_H |
| 24 | #define AVCODEC_VC1_H |
| 25 | |
| 26 | #include "avcodec.h" |
| 27 | #include "h264chroma.h" |
| 28 | #include "mpegvideo.h" |
| 29 | #include "intrax8.h" |
| 30 | #include "vc1_common.h" |
| 31 | #include "vc1dsp.h" |
| 32 | |
| 33 | #define AC_VLC_BITS 9 |
| 34 | |
| 35 | /** Sequence quantizer mode */ |
| 36 | //@{ |
| 37 | enum QuantMode { |
| 38 | QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level |
| 39 | QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level |
| 40 | QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames |
| 41 | QUANT_UNIFORM ///< Uniform quant used for all frames |
| 42 | }; |
| 43 | //@} |
| 44 | |
| 45 | /** Where quant can be changed */ |
| 46 | //@{ |
| 47 | enum DQProfile { |
| 48 | DQPROFILE_FOUR_EDGES, |
| 49 | DQPROFILE_DOUBLE_EDGES, |
| 50 | DQPROFILE_SINGLE_EDGE, |
| 51 | DQPROFILE_ALL_MBS |
| 52 | }; |
| 53 | //@} |
| 54 | |
| 55 | /** @name Where quant can be changed |
| 56 | */ |
| 57 | //@{ |
| 58 | enum DQSingleEdge { |
| 59 | DQSINGLE_BEDGE_LEFT, |
| 60 | DQSINGLE_BEDGE_TOP, |
| 61 | DQSINGLE_BEDGE_RIGHT, |
| 62 | DQSINGLE_BEDGE_BOTTOM |
| 63 | }; |
| 64 | //@} |
| 65 | |
| 66 | /** Which pair of edges is quantized with ALTPQUANT */ |
| 67 | //@{ |
| 68 | enum DQDoubleEdge { |
| 69 | DQDOUBLE_BEDGE_TOPLEFT, |
| 70 | DQDOUBLE_BEDGE_TOPRIGHT, |
| 71 | DQDOUBLE_BEDGE_BOTTOMRIGHT, |
| 72 | DQDOUBLE_BEDGE_BOTTOMLEFT |
| 73 | }; |
| 74 | //@} |
| 75 | |
| 76 | /** MV modes for P frames */ |
| 77 | //@{ |
| 78 | enum MVModes { |
| 79 | MV_PMODE_1MV_HPEL_BILIN, |
| 80 | MV_PMODE_1MV, |
| 81 | MV_PMODE_1MV_HPEL, |
| 82 | MV_PMODE_MIXED_MV, |
| 83 | MV_PMODE_INTENSITY_COMP |
| 84 | }; |
| 85 | //@} |
| 86 | |
| 87 | /** MBMODE for interlaced frame P-picture */ |
| 88 | //@{ |
| 89 | enum MBModesIntfr { |
| 90 | MV_PMODE_INTFR_1MV, |
| 91 | MV_PMODE_INTFR_2MV_FIELD, |
| 92 | MV_PMODE_INTFR_2MV, |
| 93 | MV_PMODE_INTFR_4MV_FIELD, |
| 94 | MV_PMODE_INTFR_4MV, |
| 95 | MV_PMODE_INTFR_INTRA, |
| 96 | }; |
| 97 | //@} |
| 98 | |
| 99 | /** @name MV types for B frames */ |
| 100 | //@{ |
| 101 | enum BMVTypes { |
| 102 | BMV_TYPE_BACKWARD, |
| 103 | BMV_TYPE_FORWARD, |
| 104 | BMV_TYPE_INTERPOLATED, |
| 105 | BMV_TYPE_DIRECT |
| 106 | }; |
| 107 | //@} |
| 108 | |
| 109 | /** @name Block types for P/B frames */ |
| 110 | //@{ |
| 111 | enum TransformTypes { |
| 112 | TT_8X8, |
| 113 | TT_8X4_BOTTOM, |
| 114 | TT_8X4_TOP, |
| 115 | TT_8X4, // both halves |
| 116 | TT_4X8_RIGHT, |
| 117 | TT_4X8_LEFT, |
| 118 | TT_4X8, // both halves |
| 119 | TT_4X4 |
| 120 | }; |
| 121 | //@} |
| 122 | |
| 123 | enum CodingSet { |
| 124 | CS_HIGH_MOT_INTRA = 0, |
| 125 | CS_HIGH_MOT_INTER, |
| 126 | CS_LOW_MOT_INTRA, |
| 127 | CS_LOW_MOT_INTER, |
| 128 | CS_MID_RATE_INTRA, |
| 129 | CS_MID_RATE_INTER, |
| 130 | CS_HIGH_RATE_INTRA, |
| 131 | CS_HIGH_RATE_INTER |
| 132 | }; |
| 133 | |
| 134 | /** @name Overlap conditions for Advanced Profile */ |
| 135 | //@{ |
| 136 | enum COTypes { |
| 137 | CONDOVER_NONE = 0, |
| 138 | CONDOVER_ALL, |
| 139 | CONDOVER_SELECT |
| 140 | }; |
| 141 | //@} |
| 142 | |
| 143 | /** |
| 144 | * FCM Frame Coding Mode |
| 145 | * @note some content might be marked interlaced |
| 146 | * but have fcm set to 0 as well (e.g. HD-DVD) |
| 147 | */ |
| 148 | enum FrameCodingMode { |
| 149 | PROGRESSIVE = 0, ///< in the bitstream is reported as 00b |
| 150 | ILACE_FRAME, ///< in the bitstream is reported as 10b |
| 151 | ILACE_FIELD ///< in the bitstream is reported as 11b |
| 152 | }; |
| 153 | |
| 154 | /** |
| 155 | * Imode types |
| 156 | * @{ |
| 157 | */ |
| 158 | enum Imode { |
| 159 | IMODE_RAW, |
| 160 | IMODE_NORM2, |
| 161 | IMODE_DIFF2, |
| 162 | IMODE_NORM6, |
| 163 | IMODE_DIFF6, |
| 164 | IMODE_ROWSKIP, |
| 165 | IMODE_COLSKIP |
| 166 | }; |
| 167 | /** @} */ //imode defines |
| 168 | |
| 169 | /** The VC1 Context |
| 170 | * @todo Change size wherever another size is more efficient |
| 171 | * Many members are only used for Advanced Profile |
| 172 | */ |
| 173 | typedef struct VC1Context{ |
| 174 | MpegEncContext s; |
| 175 | IntraX8Context x8; |
| 176 | H264ChromaContext h264chroma; |
| 177 | VC1DSPContext vc1dsp; |
| 178 | |
| 179 | int bits; |
| 180 | |
| 181 | /** Simple/Main Profile sequence header */ |
| 182 | //@{ |
| 183 | int res_sprite; ///< reserved, sprite mode |
| 184 | int res_y411; ///< reserved, old interlaced mode |
| 185 | int res_x8; ///< reserved |
| 186 | int multires; ///< frame-level RESPIC syntax element present |
| 187 | int res_fasttx; ///< reserved, always 1 |
| 188 | int res_transtab; ///< reserved, always 0 |
| 189 | int rangered; ///< RANGEREDFRM (range reduction) syntax element present |
| 190 | ///< at frame level |
| 191 | int res_rtm_flag; ///< reserved, set to 1 |
| 192 | int reserved; ///< reserved |
| 193 | //@} |
| 194 | |
| 195 | /** Advanced Profile */ |
| 196 | //@{ |
| 197 | int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer |
| 198 | int chromaformat; ///< 2bits, 2=4:2:0, only defined |
| 199 | int postprocflag; ///< Per-frame processing suggestion flag present |
| 200 | int broadcast; ///< TFF/RFF present |
| 201 | int interlace; ///< Progressive/interlaced (RPTFTM syntax element) |
| 202 | int tfcntrflag; ///< TFCNTR present |
| 203 | int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present |
| 204 | int refdist_flag; ///< REFDIST syntax element present in II, IP, PI or PP field picture headers |
| 205 | int extended_dmv; ///< Additional extended dmv range at P/B frame-level |
| 206 | int color_prim; ///< 8bits, chroma coordinates of the color primaries |
| 207 | int transfer_char; ///< 8bits, Opto-electronic transfer characteristics |
| 208 | int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix |
| 209 | int hrd_param_flag; ///< Presence of Hypothetical Reference |
| 210 | ///< Decoder parameters |
| 211 | int psf; ///< Progressive Segmented Frame |
| 212 | //@} |
| 213 | |
| 214 | /** Sequence header data for all Profiles |
| 215 | * TODO: choose between ints, uint8_ts and monobit flags |
| 216 | */ |
| 217 | //@{ |
| 218 | int profile; ///< 2bits, Profile |
| 219 | int frmrtq_postproc; ///< 3bits, |
| 220 | int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength |
| 221 | int max_coded_width, max_coded_height; |
| 222 | int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple) |
| 223 | int extended_mv; ///< Ext MV in P/B (not in Simple) |
| 224 | int dquant; ///< How qscale varies with MBs, 2bits (not in Simple) |
| 225 | int vstransform; ///< variable-size [48]x[48] transform type + info |
| 226 | int overlap; ///< overlapped transforms in use |
| 227 | int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_* |
| 228 | int finterpflag; ///< INTERPFRM present |
| 229 | //@} |
| 230 | |
| 231 | /** Frame decoding info for all profiles */ |
| 232 | //@{ |
| 233 | uint8_t mv_mode; ///< MV coding monde |
| 234 | uint8_t mv_mode2; ///< Secondary MV coding mode (B frames) |
| 235 | int k_x; ///< Number of bits for MVs (depends on MV range) |
| 236 | int k_y; ///< Number of bits for MVs (depends on MV range) |
| 237 | int range_x, range_y; ///< MV range |
| 238 | uint8_t pq, altpq; ///< Current/alternate frame quantizer scale |
| 239 | uint8_t zz_8x8[4][64]; ///< Zigzag table for TT_8x8, permuted for IDCT |
| 240 | int left_blk_sh, top_blk_sh; ///< Either 3 or 0, positions of l/t in blk[] |
| 241 | const uint8_t* zz_8x4; ///< Zigzag scan table for TT_8x4 coding mode |
| 242 | const uint8_t* zz_4x8; ///< Zigzag scan table for TT_4x8 coding mode |
| 243 | /** pquant parameters */ |
| 244 | //@{ |
| 245 | uint8_t dquantfrm; |
| 246 | uint8_t dqprofile; |
| 247 | uint8_t dqsbedge; |
| 248 | uint8_t dqbilevel; |
| 249 | //@} |
| 250 | /** AC coding set indexes |
| 251 | * @see 8.1.1.10, p(1)10 |
| 252 | */ |
| 253 | //@{ |
| 254 | int c_ac_table_index; ///< Chroma index from ACFRM element |
| 255 | int y_ac_table_index; ///< Luma index from AC2FRM element |
| 256 | //@} |
| 257 | int ttfrm; ///< Transform type info present at frame level |
| 258 | uint8_t ttmbf; ///< Transform type flag |
| 259 | int *ttblk_base, *ttblk; ///< Transform type at the block level |
| 260 | int codingset; ///< index of current table set from 11.8 to use for luma block decoding |
| 261 | int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding |
| 262 | int pqindex; ///< raw pqindex used in coding set selection |
| 263 | int a_avail, c_avail; |
| 264 | uint8_t *mb_type_base, *mb_type[3]; |
| 265 | |
| 266 | |
| 267 | /** Luma compensation parameters */ |
| 268 | //@{ |
| 269 | uint8_t lumscale; |
| 270 | uint8_t lumshift; |
| 271 | //@} |
| 272 | int16_t bfraction; ///< Relative position % anchors=> how to scale MVs |
| 273 | uint8_t halfpq; ///< Uniform quant over image and qp+.5 |
| 274 | uint8_t respic; ///< Frame-level flag for resized images |
| 275 | int buffer_fullness; ///< HRD info |
| 276 | /** Ranges: |
| 277 | * -# 0 -> [-64n 63.f] x [-32, 31.f] |
| 278 | * -# 1 -> [-128, 127.f] x [-64, 63.f] |
| 279 | * -# 2 -> [-512, 511.f] x [-128, 127.f] |
| 280 | * -# 3 -> [-1024, 1023.f] x [-256, 255.f] |
| 281 | */ |
| 282 | uint8_t mvrange; ///< Extended MV range flag |
| 283 | uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use |
| 284 | VLC *cbpcy_vlc; ///< CBPCY VLC table |
| 285 | int tt_index; ///< Index for Transform Type tables (to decode TTMB) |
| 286 | uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV) |
| 287 | uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs |
| 288 | uint8_t* forward_mb_plane; ///< bitplane for "forward" MBs |
| 289 | int mv_type_is_raw; ///< mv type mb plane is not coded |
| 290 | int dmb_is_raw; ///< direct mb plane is raw |
| 291 | int fmb_is_raw; ///< forward mb plane is raw |
| 292 | int skip_is_raw; ///< skip mb plane is not coded |
| 293 | uint8_t last_luty[2][256], last_lutuv[2][256]; ///< lookup tables used for intensity compensation |
| 294 | uint8_t aux_luty[2][256], aux_lutuv[2][256]; ///< lookup tables used for intensity compensation |
| 295 | uint8_t next_luty[2][256], next_lutuv[2][256]; ///< lookup tables used for intensity compensation |
| 296 | uint8_t (*curr_luty)[256] ,(*curr_lutuv)[256]; |
| 297 | int last_use_ic, *curr_use_ic, next_use_ic, aux_use_ic; |
| 298 | int rnd; ///< rounding control |
| 299 | |
| 300 | /** Frame decoding info for S/M profiles only */ |
| 301 | //@{ |
| 302 | uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128) |
| 303 | uint8_t interpfrm; |
| 304 | //@} |
| 305 | |
| 306 | /** Frame decoding info for Advanced profile */ |
| 307 | //@{ |
| 308 | enum FrameCodingMode fcm; |
| 309 | uint8_t numpanscanwin; |
| 310 | uint8_t tfcntr; |
| 311 | uint8_t rptfrm, tff, rff; |
| 312 | uint16_t topleftx; |
| 313 | uint16_t toplefty; |
| 314 | uint16_t bottomrightx; |
| 315 | uint16_t bottomrighty; |
| 316 | uint8_t uvsamp; |
| 317 | uint8_t postproc; |
| 318 | int hrd_num_leaky_buckets; |
| 319 | uint8_t bit_rate_exponent; |
| 320 | uint8_t buffer_size_exponent; |
| 321 | uint8_t* acpred_plane; ///< AC prediction flags bitplane |
| 322 | int acpred_is_raw; |
| 323 | uint8_t* over_flags_plane; ///< Overflags bitplane |
| 324 | int overflg_is_raw; |
| 325 | uint8_t condover; |
| 326 | uint16_t *hrd_rate, *hrd_buffer; |
| 327 | uint8_t *hrd_fullness; |
| 328 | uint8_t range_mapy_flag; |
| 329 | uint8_t range_mapuv_flag; |
| 330 | uint8_t range_mapy; |
| 331 | uint8_t range_mapuv; |
| 332 | //@} |
| 333 | |
| 334 | /** Frame decoding info for interlaced picture */ |
| 335 | uint8_t dmvrange; ///< Extended differential MV range flag |
| 336 | int fourmvswitch; |
| 337 | int intcomp; |
| 338 | uint8_t lumscale2; ///< for interlaced field P picture |
| 339 | uint8_t lumshift2; |
| 340 | VLC* mbmode_vlc; |
| 341 | VLC* imv_vlc; |
| 342 | VLC* twomvbp_vlc; |
| 343 | VLC* fourmvbp_vlc; |
| 344 | uint8_t twomvbp; |
| 345 | uint8_t fourmvbp; |
| 346 | uint8_t* fieldtx_plane; |
| 347 | int fieldtx_is_raw; |
| 348 | uint8_t zzi_8x8[64]; |
| 349 | uint8_t *blk_mv_type_base, *blk_mv_type; ///< 0: frame MV, 1: field MV (interlaced frame) |
| 350 | uint8_t *mv_f_base, *mv_f[2]; ///< 0: MV obtained from same field, 1: opposite field |
| 351 | uint8_t *mv_f_next_base, *mv_f_next[2]; |
| 352 | int field_mode; ///< 1 for interlaced field pictures |
| 353 | int fptype; |
| 354 | int second_field; |
| 355 | int refdist; ///< distance of the current picture from reference |
| 356 | int numref; ///< number of past field pictures used as reference |
| 357 | // 0 corresponds to 1 and 1 corresponds to 2 references |
| 358 | int reffield; ///< if numref = 0 (1 reference) then reffield decides which |
| 359 | // field to use among the two fields from previous frame |
| 360 | int intcompfield; ///< which of the two fields to be intensity compensated |
| 361 | // 0: both fields, 1: bottom field, 2: top field |
| 362 | int cur_field_type; ///< 0: top, 1: bottom |
| 363 | int ref_field_type[2]; ///< forward and backward reference field type (top or bottom) |
| 364 | int blocks_off, mb_off; |
| 365 | int qs_last; ///< if qpel has been used in the previous (tr.) picture |
| 366 | int bmvtype; |
| 367 | int frfd, brfd; ///< reference frame distance (forward or backward) |
| 368 | int first_pic_header_flag; |
| 369 | int pic_header_flag; |
| 370 | |
| 371 | /** Frame decoding info for sprite modes */ |
| 372 | //@{ |
| 373 | int new_sprite; |
| 374 | int two_sprites; |
| 375 | AVFrame *sprite_output_frame; |
| 376 | int output_width, output_height, sprite_width, sprite_height; |
| 377 | uint8_t* sr_rows[2][2]; ///< Sprite resizer line cache |
| 378 | //@} |
| 379 | |
| 380 | int p_frame_skipped; |
| 381 | int bi_type; |
| 382 | int x8_type; |
| 383 | |
| 384 | int16_t (*block)[6][64]; |
| 385 | int n_allocated_blks, cur_blk_idx, left_blk_idx, topleft_blk_idx, top_blk_idx; |
| 386 | uint32_t *cbp_base, *cbp; |
| 387 | uint8_t *is_intra_base, *is_intra; |
| 388 | int16_t (*luma_mv_base)[2], (*luma_mv)[2]; |
| 389 | uint8_t bfraction_lut_index; ///< Index for BFRACTION value (see Table 40, reproduced into ff_vc1_bfraction_lut[]) |
| 390 | uint8_t broken_link; ///< Broken link flag (BROKEN_LINK syntax element) |
| 391 | uint8_t closed_entry; ///< Closed entry point flag (CLOSED_ENTRY syntax element) |
| 392 | |
| 393 | int end_mb_x; ///< Horizontal macroblock limit (used only by mss2) |
| 394 | |
| 395 | int parse_only; ///< Context is used within parser |
| 396 | int resync_marker; ///< could this stream contain resync markers |
| 397 | } VC1Context; |
| 398 | |
| 399 | /** |
| 400 | * Decode Simple/Main Profiles sequence header |
| 401 | * @see Figure 7-8, p16-17 |
| 402 | * @param avctx Codec context |
| 403 | * @param gb GetBit context initialized from Codec context extra_data |
| 404 | * @return Status |
| 405 | */ |
| 406 | int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb); |
| 407 | |
| 408 | int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb); |
| 409 | |
| 410 | int ff_vc1_parse_frame_header (VC1Context *v, GetBitContext *gb); |
| 411 | int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext *gb); |
| 412 | int ff_vc1_init_common(VC1Context *v); |
| 413 | |
| 414 | int ff_vc1_decode_init_alloc_tables(VC1Context *v); |
| 415 | void ff_vc1_init_transposed_scantables(VC1Context *v); |
| 416 | int ff_vc1_decode_end(AVCodecContext *avctx); |
| 417 | void ff_vc1_decode_blocks(VC1Context *v); |
| 418 | |
| 419 | void ff_vc1_loop_filter_iblk(VC1Context *v, int pq); |
| 420 | void ff_vc1_loop_filter_iblk_delayed(VC1Context *v, int pq); |
| 421 | void ff_vc1_smooth_overlap_filter_iblk(VC1Context *v); |
| 422 | void ff_vc1_apply_p_loop_filter(VC1Context *v); |
| 423 | |
| 424 | void ff_vc1_mc_1mv(VC1Context *v, int dir); |
| 425 | void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg); |
| 426 | void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir); |
| 427 | void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg); |
| 428 | |
| 429 | void ff_vc1_interp_mc(VC1Context *v); |
| 430 | |
| 431 | #endif /* AVCODEC_VC1_H */ |