1 /* /////////////////////////////////////////////////////////////////////// 2 // 3 // INTEL CORPORATION PROPRIETARY INFORMATION 4 // This software is supplied under the terms of a license agreement or 5 // nondisclosure agreement with Intel Corporation and may not be copied 6 // or disclosed except in accordance with the terms of that agreement. 7 // Copyright (c) 2008 Intel Corporation. All Rights Reserved. 8 // 9 // Description: Common definitions for parsing VC-1 bitstreams. 10 // 11 */ 12 13 #ifndef _VC1PARSE_COMMON_DEFS_H_ 14 #define _VC1PARSE_COMMON_DEFS_H_ 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif 19 20 #include <stdint.h> 21 22 /** @weakgroup vc1parse_common_defs VC-1 Common Definitions */ 23 /** @ingroup vc1parse_common_defs */ 24 /*@{*/ 25 26 /** This defines the maximum number of horizontal macroblocks in a picture. */ 27 #define VC1_WIDTH_MB_MAX ((2048+15)/16) 28 29 /** This defines the maximum number of vertical macroblocks in a picture. */ 30 #define VC1_HEIGHT_MB_MAX ((1088+15)/16) 31 32 /** This defines the maximum number of bitplane storage per picture. */ 33 #define VC1_MAX_BITPLANE_CHUNKS 3 34 35 /** This defines the value for an invalid BFRACTION syntax element. */ 36 #define VC1_BFRACTION_INVALID 0 37 38 /** This defines the value for BFRACTION syntax element that defines a BI 39 picture. */ 40 #define VC1_BFRACTION_BI 9 41 42 /** This enumeration defines the various supported profiles as defined in 43 PROFILE syntax element. */ 44 enum 45 { 46 VC1_PROFILE_SIMPLE, 47 VC1_PROFILE_MAIN, 48 VC1_PROFILE_RESERVED, 49 VC1_PROFILE_ADVANCED 50 }; 51 52 /** This enumeration defines the frame coding mode as defined in FCM syntax 53 element. */ 54 enum 55 { 56 VC1_FCM_PROGRESSIVE, 57 VC1_FCM_FRAME_INTERLACE = 2, 58 VC1_FCM_FIELD_INTERLACE = 3 59 }; 60 61 /** This enumeration defines the various bitplane types as defined in IMODE 62 syntax element. */ 63 enum 64 { 65 VC1_BITPLANE_RAW_MODE, 66 VC1_BITPLANE_NORM2_MODE, 67 VC1_BITPLANE_DIFF2_MODE, 68 VC1_BITPLANE_NORM6_MODE, 69 VC1_BITPLANE_DIFF6_MODE, 70 VC1_BITPLANE_ROWSKIP_MODE, 71 VC1_BITPLANE_COLSKIP_MODE 72 }; 73 74 /** This enumeration defines the various motion vector modes as defined in 75 MVMODE or MVMODE2 syntax element. */ 76 enum 77 { 78 VC1_MVMODE_1MV, 79 #ifdef VBP 80 VC1_MVMODE_HPELBI_1MV, 81 VC1_MVMODE_HPEL_1MV, 82 #else 83 VC1_MVMODE_HPEL_1MV, 84 VC1_MVMODE_HPELBI_1MV, 85 #endif 86 VC1_MVMODE_MIXED_MV, 87 VC1_MVMODE_INTENSCOMP 88 }; 89 90 /** This enumeration defines the extended differential motion vector range flag 91 as defined in DMVRANGE syntax element. */ 92 enum 93 { 94 VC1_DMVRANGE_NONE, 95 VC1_DMVRANGE_HORIZONTAL_RANGE, 96 VC1_DMVRANGE_VERTICAL_RANGE, 97 VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE 98 }; 99 100 /** This enumeration defines the intensity compensation field as defined in 101 INTCOMPFIELD syntax element. */ 102 enum 103 { 104 VC1_INTCOMP_TOP_FIELD = 1, 105 VC1_INTCOMP_BOTTOM_FIELD = 2, 106 VC1_INTCOMP_BOTH_FIELD = 3 107 }; 108 109 /** This enumeration defines the differential quantizer profiles as defined in 110 DQPROFILE syntax element. */ 111 enum 112 { 113 VC1_DQPROFILE_ALL4EDGES, 114 VC1_DQPROFILE_DBLEDGES, 115 VC1_DQPROFILE_SNGLEDGES, 116 VC1_DQPROFILE_ALLMBLKS 117 }; 118 119 /** This enumeration defines the conditional overlap flag as defined in CONDOVER 120 syntax element. */ 121 enum 122 { 123 VC1_CONDOVER_FLAG_NONE = 0, 124 VC1_CONDOVER_FLAG_ALL = 2, 125 VC1_CONDOVER_FLAG_SOME = 3 126 }; 127 128 /** This enumeration defines the type of quantizer to be used and is derived 129 from bitstream syntax. */ 130 enum 131 { 132 VC1_QUANTIZER_NONUNIFORM, 133 VC1_QUANTIZER_UNIFORM 134 }; 135 136 /** This structure represents the various bitplanes within VC-1 bitstream. */ 137 typedef struct 138 { 139 uint8_t invert; 140 int32_t imode; 141 uint32_t *databits; 142 } vc1_Bitplane; 143 144 /** This structure represents all bitstream metadata needed for register programming. */ 145 typedef struct 146 { 147 // From Sequence Layer for Advanced Profile 148 uint8_t PROFILE; /** 2 bit(s). */ 149 #ifdef VBP 150 uint8_t LEVEL; 151 #endif 152 uint8_t POSTPROCFLAG; /** 1 bit(s). */ 153 uint8_t PULLDOWN; /** 1 bit(s). */ 154 uint8_t INTERLACE; /** 1 bit(s). */ 155 uint8_t TFCNTRFLAG; /** 1 bit(s). */ 156 uint8_t FINTERPFLAG; /** 1 bit(s). */ 157 uint8_t PSF; /** 1 bit(s). */ 158 uint8_t HRD_NUM_LEAKY_BUCKETS; /** 5 bit(s). */ 159 160 // From STRUCT_C 161 uint8_t MAXBFRAMES; /** 3 bit(s). */ 162 uint8_t MULTIRES; /** 1 bit(s). */ 163 164 // From EntryPoint Layer for Advanced Profile 165 uint8_t PANSCAN_FLAG; 166 uint8_t REFDIST_FLAG; 167 uint8_t LOOPFILTER; 168 uint8_t FASTUVMC; 169 uint8_t EXTENDED_MV; 170 uint8_t DQUANT; 171 uint8_t VSTRANSFORM; 172 uint8_t OVERLAP; 173 uint8_t QUANTIZER; 174 uint8_t EXTENDED_DMV; 175 uint8_t RANGE_MAPY_FLAG; 176 uint8_t RANGE_MAPY; 177 uint8_t RANGE_MAPUV_FLAG; 178 uint8_t RANGE_MAPUV; 179 180 // From Picture Header 181 uint8_t RANGERED; /** 1 bit(s). */ 182 uint8_t RNDCTRL; /** 1 bit(s), rcv specific. */ 183 184 // REFDIST is present only in field-interlaced mode on I/I, I/P, P/I, P/P frames 185 // From Canmore, looks like this needs to be propagated to following B frames 186 uint8_t REFDIST; 187 uint8_t INTCOMPFIELD; /** ? bit(s)? */ 188 uint8_t LUMSCALE2; /** 6 bit(s). */ 189 uint8_t LUMSHIFT2; /** 6 bit(s). */ 190 uint8_t bp_raw[VC1_MAX_BITPLANE_CHUNKS]; 191 192 // From SequenceLayerHeader, EntryPointHeader or Struct_A 193 uint16_t width; 194 uint16_t height; 195 uint16_t widthMB; 196 uint16_t heightMB; 197 198 #ifdef VBP 199 uint8_t CLOSED_ENTRY; 200 uint8_t BROKEN_LINK; 201 uint8_t SYNCMARKER; 202 #endif 203 204 } vc1_metadata_t; 205 206 /** This structure represents the sequence header for advanced profile. */ 207 typedef struct 208 { 209 union 210 { 211 #ifndef MFDBIGENDIAN 212 struct 213 { 214 unsigned BITRTQ_POSTPROC:5; 215 unsigned FRMRTQ_POSTPROC:3; 216 unsigned COLORDIFF_FORMAT:2; 217 unsigned LEVEL:3; 218 unsigned PROFILE:2; 219 unsigned pad:17; 220 } seq_flags; 221 #else 222 struct 223 { 224 unsigned pad:17; 225 unsigned PROFILE:2; 226 unsigned LEVEL:3; 227 unsigned COLORDIFF_FORMAT:2; 228 unsigned FRMRTQ_POSTPROC:3; 229 unsigned BITRTQ_POSTPROC:5; 230 } seq_flags; 231 #endif 232 uint32_t flags; 233 }; 234 235 union 236 { 237 #ifndef MFDBIGENDIAN 238 struct 239 { 240 unsigned DISPLAY_EXT:1; 241 unsigned PSF:1; 242 unsigned RESERVED:1; 243 unsigned FINTERPFLAG:1; 244 unsigned TFCNTRFLAG:1; 245 unsigned INTERLACE:1; 246 unsigned PULLDOWN:1; 247 unsigned MAX_CODED_HEIGHT:12; 248 unsigned MAX_CODED_WIDTH:12; 249 unsigned POSTPROCFLAG:1; 250 } seq_max_size; 251 #else 252 struct 253 { 254 unsigned POSTPROCFLAG:1; 255 unsigned MAX_CODED_WIDTH:12; 256 unsigned MAX_CODED_HEIGHT:12; 257 unsigned PULLDOWN:1; 258 unsigned INTERLACE:1; 259 unsigned TFCNTRFLAG:1; 260 unsigned FINTERPFLAG:1; 261 unsigned RESERVED:1; 262 unsigned PSF:1; 263 unsigned DISPLAY_EXT:1; 264 } seq_max_size; 265 #endif 266 uint32_t max_size; 267 }; 268 269 union 270 { 271 #ifndef MFDBIGENDIAN 272 struct 273 { 274 unsigned ASPECT_RATIO_FLAG:1; 275 unsigned DISP_VERT_SIZE:14; 276 unsigned DISP_HORIZ_SIZE:14; 277 unsigned pad:3; 278 } seq_disp_size; 279 #else 280 struct 281 { 282 unsigned pad:3; 283 unsigned DISP_HORIZ_SIZE:14; 284 unsigned DISP_VERT_SIZE:14; 285 unsigned ASPECT_RATIO_FLAG:1; 286 } seq_disp_size; 287 #endif 288 uint32_t disp_size; 289 }; 290 291 uint8_t ASPECT_RATIO; // 4 bits 292 293 union 294 { 295 #ifndef MFDBIGENDIAN 296 struct 297 { 298 unsigned ASPECT_VERT_SIZE:8; 299 unsigned ASPECT_HORIZ_SIZE:8; 300 unsigned pad:16; 301 } seq_aspect_size; 302 #else 303 struct 304 { 305 unsigned pad:16; 306 unsigned ASPECT_HORIZ_SIZE:8; 307 unsigned ASPECT_VERT_SIZE:8; 308 } seq_aspect_size; 309 #endif 310 uint32_t aspect_size; 311 }; 312 313 uint8_t FRAMERATE_FLAG; // 1b 314 uint8_t FRAMERATEIND; // 1b 315 316 union 317 { 318 #ifndef MFDBIGENDIAN 319 struct 320 { 321 unsigned FRAMERATEDR:4; 322 unsigned FRAMERATENR:8; 323 unsigned pad:20; 324 } seq_framerate_fraction; 325 #else 326 struct 327 { 328 unsigned pad:20; 329 unsigned FRAMERATENR:8; 330 unsigned FRAMERATEDR:4; 331 } seq_framerate_fraction; 332 #endif 333 uint32_t framerate_fraction; 334 }; 335 336 uint16_t FRAMERATEEXP; // 16b 337 uint8_t COLOR_FORMAT_FLAG; // 1b 338 339 union 340 { 341 #ifndef MFDBIGENDIAN 342 struct 343 { 344 unsigned MATRIX_COEF:8; 345 unsigned TRANSFER_CHAR:8; 346 unsigned COLOR_PRIM:8; 347 unsigned pad:8; 348 } seq_color_format; 349 #else 350 struct 351 { 352 unsigned pad:8; 353 unsigned COLOR_PRIM:8; 354 unsigned TRANSFER_CHAR:8; 355 unsigned MATRIX_COEF:8; 356 } seq_color_format; 357 #endif 358 uint32_t color_format; 359 }; 360 361 uint8_t HRD_PARAM_FLAG; // 1b 362 uint8_t HRD_NUM_LEAKY_BUCKETS; // 5b 363 // No need to parse remaining items - not needed so far 364 } vc1_SequenceLayerHeader; 365 366 /** This structure represents metadata for struct c. */ 367 typedef struct 368 { 369 union 370 { 371 #ifndef MFDBIGENDIAN 372 struct 373 { 374 unsigned res6:1; 375 unsigned FINTERPFLAG:1; 376 unsigned QUANTIZER:2; 377 unsigned MAXBFRAMES:3; 378 unsigned RANGERED:1; 379 unsigned SYNCMARKER:1; 380 unsigned OVERLAP:1; 381 unsigned res5:1; 382 unsigned VSTRANSFORM:1; 383 unsigned DQUANT:2; 384 unsigned EXTENDED_MV:1; 385 unsigned FASTUVMC:1; 386 unsigned res4:1; 387 unsigned MULTIRES:1; 388 unsigned res3:1; 389 unsigned LOOPFILTER:1; 390 unsigned BITRTQ_POSTPROC:5; 391 unsigned FRMRTQ_POSTPROC:3; 392 unsigned PROFILE:4; 393 } struct_c; 394 #else 395 struct 396 { 397 unsigned PROFILE:4; 398 unsigned FRMRTQ_POSTPROC:3; 399 unsigned BITRTQ_POSTPROC:5; 400 unsigned LOOPFILTER:1; 401 unsigned res3:1; 402 unsigned MULTIRES:1; 403 unsigned res4:1; 404 unsigned FASTUVMC:1; 405 unsigned EXTENDED_MV:1; 406 unsigned DQUANT:2; 407 unsigned VSTRANSFORM:1; 408 unsigned res5:1; 409 unsigned OVERLAP:1; 410 unsigned SYNCMARKER:1; 411 unsigned RANGERED:1; 412 unsigned MAXBFRAMES:3; 413 unsigned QUANTIZER:2; 414 unsigned FINTERPFLAG:1; 415 unsigned res6:1; 416 } struct_c; 417 #endif 418 uint32_t struct_c_rcv; 419 }; 420 421 union 422 { 423 #ifndef MFDBIGENDIAN 424 struct 425 { 426 unsigned VERT_SIZE:16; 427 unsigned HORIZ_SIZE:16; 428 } struct_a; 429 #else 430 struct 431 { 432 unsigned HORIZ_SIZE:16; 433 unsigned VERT_SIZE:16; 434 } struct_a; 435 #endif 436 uint32_t struct_a_rcv; 437 }; 438 439 } vc1_RcvSequenceHeader; 440 441 /** This structure represents metadata for entry point layers. */ 442 typedef struct 443 { 444 union 445 { 446 #ifndef MFDBIGENDIAN 447 struct 448 { 449 unsigned QUANTIZER:2; 450 unsigned OVERLAP:1; 451 unsigned VSTRANSFORM:1; 452 unsigned DQUANT:2; 453 unsigned EXTENDED_MV:1; 454 unsigned FASTUVMC:1; 455 unsigned LOOPFILTER:1; 456 unsigned REFDIST_FLAG:1; 457 unsigned PANSCAN_FLAG:1; 458 unsigned CLOSED_ENTRY:1; 459 unsigned BROKEN_LINK:1; 460 unsigned pad1:19; 461 } ep_flags; 462 #else 463 struct 464 { 465 unsigned pad1:19; 466 unsigned BROKEN_LINK:1; 467 unsigned CLOSED_ENTRY:1; 468 unsigned PANSCAN_FLAG:1; 469 unsigned REFDIST_FLAG:1; 470 unsigned LOOPFILTER:1; 471 unsigned FASTUVMC:1; 472 unsigned EXTENDED_MV:1; 473 unsigned DQUANT:2; 474 unsigned VSTRANSFORM:1; 475 unsigned OVERLAP:1; 476 unsigned QUANTIZER:2; 477 } ep_flags; 478 #endif 479 uint32_t flags; 480 }; 481 482 // Skipping HRD data because it is not needed for our processing 483 484 union 485 { 486 #ifndef MFDBIGENDIAN 487 struct 488 { 489 unsigned CODED_HEIGHT:12; 490 unsigned CODED_WIDTH:12; 491 unsigned pad2:8; 492 } ep_size; 493 #else 494 struct 495 { 496 unsigned pad2:8; 497 unsigned CODED_WIDTH:12; 498 unsigned CODED_HEIGHT:12; 499 } ep_size; 500 #endif 501 uint32_t size; 502 }; 503 504 uint8_t CODED_SIZE_FLAG; /** 1 bit(s). */ 505 uint8_t EXTENDED_DMV; /** 1 bit(s). */ 506 uint8_t RANGE_MAPY_FLAG; /** 1 bit(s). */ 507 uint8_t RANGE_MAPY; /** 3 bit(s). */ 508 uint8_t RANGE_MAPUV_FLAG; /** 1 bit(s). */ 509 uint8_t RANGE_MAPUV; /** 3 bit(s). */ 510 } vc1_EntryPointHeader; 511 512 /** This structure represents metadata for slice and picture layers. */ 513 typedef struct 514 { 515 /* Slice layer. */ 516 uint16_t SLICE_ADDR; /** 9 bit(s). */ 517 518 /* Picture layer for simple or main profile. */ 519 uint8_t RANGEREDFRM; /** 1 bit(s). */ 520 uint8_t PTYPE; /** 4 bit(s)? */ 521 int8_t BFRACTION_NUM; /** ? bit(s). */ 522 int16_t BFRACTION_DEN; /** ? bit(s). */ 523 uint8_t PQINDEX; /** 5 bit(s). */ 524 uint8_t HALFQP; /** 1 bit(s). */ 525 uint8_t PQUANTIZER; /** 1 bit(s). */ 526 uint8_t MVRANGE; /** 3 bit(s)? */ 527 uint8_t MVMODE; /** 4 bit(s)? */ 528 uint8_t MVMODE2; /** 3 bit(s)? */ 529 uint8_t LUMSCALE; /** 6 bit(s). */ 530 uint8_t LUMSHIFT; /** 6 bit(s). */ 531 uint8_t MVTAB; /** 2 bit(s). */ 532 uint8_t CBPTAB; /** 2 bit(s). */ 533 uint8_t TTMBF; /** 1 bit(s). */ 534 uint8_t TTFRM; /** 2 bit(s). */ 535 uint8_t TRANSACFRM; /** 2 bit(s)? */ 536 uint8_t TRANSACFRM2; /** 2 bit(s)? */ 537 uint8_t TRANSDCTAB; /** 1 bit(s). */ 538 539 /* Picture layer for advanced profile. */ 540 uint8_t FCM; /** 2 bit(s)? */ 541 uint8_t FPTYPE; /** 3 bit(s). */ 542 uint8_t TFCNTR; /** 8 bit(s) */ 543 uint8_t RPTFRM; /** 2 bit(s) */ 544 uint8_t TFF; /** 1 bit(s). */ 545 uint8_t RFF; /** 1 bit(s) */ 546 uint8_t RNDCTRL; /** 1 bit(s). */ 547 uint8_t UVSAMP; /** 1 bit(s). */ 548 uint8_t POSTPROC; /** 2 bit(s). */ 549 uint8_t CONDOVER; /** 2 bit(s)? */ 550 uint8_t DMVRANGE; /** ? bit(s)? */ 551 uint8_t MV4SWITCH; /** 1 bit(s). */ 552 uint8_t INTCOMP; /** 1 bit(s). */ 553 uint8_t MBMODETAB; /** 2 bit(s). */ 554 uint8_t MV2BPTAB; /** 2 bit(s). */ 555 uint8_t MV4BPTAB; /** 2 bit(s). */ 556 uint8_t NUMREF; /** 1 bit(s). */ 557 uint8_t REFFIELD; /** 1 bit(s). */ 558 559 /* PAN SCAN */ 560 uint8_t PS_PRESENT; /** 1 bit(s). */ 561 uint8_t number_of_pan_scan_window; /** 4 max. */ 562 viddec_vc1_pan_scan_window_t PAN_SCAN_WINDOW[VIDDEC_PANSCAN_MAX_OFFSETS]; 563 564 /* VOPDQUANT. */ 565 uint8_t PQDIFF; /** 3 bit(s). */ 566 uint8_t ABSPQ; /** 5 bit(s). */ 567 uint8_t DQUANTFRM; /** 1 bit(s). */ 568 uint8_t DQPROFILE; /** 2 bit(s). */ 569 uint8_t DQSBEDGE; /** 2 bit(s). */ 570 uint8_t DQBILEVEL; /** 1 bit(s). */ 571 572 /* Others. */ 573 uint8_t PTypeField1; 574 uint8_t PTypeField2; 575 uint32_t PQUANT; 576 uint8_t CurrField; 577 uint8_t BottomField; 578 uint32_t UniformQuant; 579 580 #ifdef VBP 581 uint8_t raw_MVTYPEMB; 582 uint8_t raw_DIRECTMB; 583 uint8_t raw_SKIPMB; 584 uint8_t raw_ACPRED; 585 uint8_t raw_FIELDTX; 586 uint8_t raw_OVERFLAGS; 587 uint8_t raw_FORWARDMB; 588 589 vc1_Bitplane MVTYPEMB; 590 vc1_Bitplane DIRECTMB; 591 vc1_Bitplane SKIPMB; 592 vc1_Bitplane ACPRED; 593 vc1_Bitplane FIELDTX; 594 vc1_Bitplane OVERFLAGS; 595 vc1_Bitplane FORWARDMB; 596 uint32_t ALTPQUANT; 597 uint8_t DQDBEDGE; 598 #endif 599 600 } vc1_PictureLayerHeader; 601 602 /*@}*/ 603 604 #ifdef __cplusplus 605 } 606 #endif /* __cplusplus. */ 607 608 #endif /* _VC1PARSE_COMMON_DEFS_H_. */ 609