VC-1 Data Structures
Part of Understanding VC-1
This page is a discussion of the various data structures and constant enumerations employed in the SMPTE Reference Decoder (SRD) VC-1 reference implementation. These are mostly found in the file vc1types.h.
Macroblocks, Blocks, and Sub-blocks
A macroblock embodies a 16x16 block of pixels in a YUV 4:2:0 colorspace. A macroblock consists of 6 blocks: 4 8x8 Y blocks, 1 U block, and 1 V block. Further, these blocks maybe divided into sub-blocks of sizes 8x4, 4x8, or 4x4.
Block Types
Note: enumerated numbers are defined in the SRD; specific numbers may or may not be relevant to independent implementation. 0: 8x8 inter-coded block 1: 8x4 inter-coded block 2: 4x8 inter-coded block 3: 4x4 inter-coded block 4: transform type not yet determined 5: intra-coded block, no AC prediction 6: intra-coded block, AC prediction of top row coefficients 7: intra-coded block, AC prediction of left column coefficients
Intra Block
An intra block data structure requires the following information:
- number of non-zero AC coefficients
- quantized DC coefficient for prediction
- 7 quantized AC coefficients along the top row of the block, used for prediction
- 7 quantized AC coefficients along the left side of the block, used for prediction
- 16 samples representing the bottom 2 8-pixel rows of the block, maintained for overlap smoothing filters
Hybrid Prediction Modes
Note: enumerated numbers are defined in the SRD; specific numbers may or may not be relevant to independent implementation.
- 0: predict from left
- 1: predict from top
- 2: no hybrid prediction
Sub-block Patterns
Note: enumerated numbers are defined in the SRD; specific numbers may or may not be relevant to independent implementation.
- 0: 8x8 transform, coded
- 1: 8x4 transform, bottom subblock coded
- 2: 8x4 transform, top subblock coded
- 3: 8x4 transform, both subblocks coded
- 4: 4x8 transform, right subblock coded
- 5: 4x8 transform, left subblock coded
- 6: 4x8 transform, both subblocks coded
- 7: 4x4 transform, subblock pattern separate
- 8: 8x8 transform, coded, whole MB
- 9: 8x4 transform, bottom subblock coded, whole MB
- 10: 8x4 transform, top subblock coded, whole MB
- 11: 8x4 transform, both subblocks coded, whole MB
- 12: 4x8 transform, right subblock coded, whole MB
- 13: 4x8 transform, left subblock coded, whole MB
- 14: 4x8 transform, both subblocks coded, whole MB
- 15: 4x4 transform, subblocks pattern separate, whole MB
One more stray constant:
- 8: MB level threshold
Motion Vector
This is the information maintained for an individual motion vector:
- X offset
- Y offset
- a flag indicating whether the vector pertains to the top or bottom field of interlaced video
The (X, Y) vector is relative to the top-left coordinate of a block. The fractional pel resolution of the vectors depends on the motion vector coding mode.
Motion
This structure encapsulates motion vectors along with mode information.
- prediction mode, as enumerated in Hybrid Prediction Modes
- motion vector data structure
- differential motion vector data structure, represented in quarter-pel units
The SRD contains the following not accompanying this data structure:
/* * If Two Reference Images (NUMREF=1) then: * Y=2*(YValue)+PredFlag * PredFlag: 0=dominant 1=non-dominant */
Motion Vector History
This data structure consists of an array of 4 motion vector data structures which stores the motion vector history for 4 Y blocks, used for direct mode.
Inter Block
An intra block data structure requires the following information:
- an array of 4 integers representing the number of non-zero coefficients (DC and AC together) for up to 4 sub-blocks in the block
- 2 motion structures, 1 for backward prediction and 1 for forward prediction
Block
This is the information that the SRD maintains for an individual block:
- block type, as defined in Block Types section
- a flag indicating whether there are non-zero AC coefficients for an intra block, or non-zero DC or AC coefficients for an inter block
- a C union that contains either an intra or inter block data structure
Quantizer
This data structure maintains information about quantization parameters.
- quantizer step, range 0..31
- quantizer half-step, either 0 or 1
- a flag indicating whether the quantization is uniform or non-uniform
Macroblock Properties
These properties are associated with various macroblock coding options:
- a block is intra-coded, or has 1, 2, or 4 motion vectors associated
- a block predicts backwards from a previous frame, from a forward frame, from both a backward or forward frame, or uses "direct" mode
- a flag that indicates whether MVs apply to interlaced fields
- a flag that indicates that "bottom field different direction to top"
- a flag that indicates "field transform"
AC Prediction
Note: enumerated numbers are defined in the SRD; specific numbers may or may not be relevant to independent implementation.
- 0: AC prediction off
- 1: AC prediction on
- 2: AC prediction absent (no blocks to predict from?)
Macroblock
The SRD maintains the following information about an individual macroblock:
- macroblock type: this is a combination of properties enumerated in Macroblock Properties
- AC prediction status as enumerated in AC Prediction
- block type as enumerated in Block Types; might be "any"
- a flag indicating whether the overlap filter is active for this macroblock
- a flag indicating whether is motion predicted only (presumably, this means that a predicted block is formed by no other transform/addition occurs for the MB)
- a 6-bit flag vector that indicates which of the 6 constituent block in the MB are coded
- a 4-bit flag vector that indicates motion vector block pattern-- these flags are set if the differential MV for a respective Y block is not 0
- quantizer data structure for the macroblock
- 6 block structures
Picture Format
Note: enumerated numbers are defined in the SRD; specific numbers may or may not be relevant to an independent implementation.
- 0: picture is a progressive frame
- 1: picture is an interlaced frame
- 2: picture consists of 2 interlaced fields
- 3: picture format has not been determined
Bitstream Profile
These are the supported profiles in the VC-1 coding scheme.
- 0: simple profile
- 1: main profile
- 2: reserved
- 3: advanced profile
Profile Level Enumeration
- simple/main profiles:
- 0: low
- 1: medium
- 2: high
- advanced profile:
- 0..4: levels 0..4
- levels 5..7 are reserved
- 255 indicates that the level is unknown
Chroma Format
The SRD only supports one chroma format: YUV 4:2:0, which is format 1. Ostensibly, there are 2 bits in the bitstream to define chroma format. Modes 0, 2, and 3 are all reserved.
Color Primaries
- 0: color primaries are forbidden
- 1: ITU-R BT-709
- 2: unspecified
- 3: reserved
- 4: reserved
- 5: EBU Tech 3213
- 6: SMPTE C
- 7-255: reserved
Transfer Characteristics
These properties are encoded into the bitstream and describe the characteristics of the source bitstream:
- 0: forbidden
- 1: ITU-R BT-709
- 2: unspecified
- 3: reserved
- 4: reserved
- 5: reserved
- 6: reserved
- 7: SMPTE 240M
- 8-255: reserved
Matrix Coefficients
- 0: forbidden
- 1: ITU-R BT-709
- 2: unspecified
- 3: reserved
- 4: reserved
- 5: reserved
- 6: SMPTE 170M
- 7: SMPTE 240M
- 8-255: reserved
Quantizer Modes
- 0: quantizer implied by quantizer step size
- 1: quantizer explicitly signaled
- 2: non-uniform quantizer
- 3: uniform quantizer
Picture Types
- 0: I-frame-- intraframe/field
- 1: P-frame-- predicted frame/field
- 2: B-frame-- bi-directionally predicted frame/field
- 3: BI-frame-- ??? perhaps an I-frame upon which no other frames depend
- 4: skipped
Scaling
This enumeration defines whether there will be any scaling in the picture before display:
- 0: 1x1 = no scaling
- 1: 2x1 = horizontal scaling
- 2: 1x2 = vertical scaling
- 3: 2x2 = horizontal and vertical scaling
Motion Vector Ranges
- Range #0:
- x component range = -64..63
- y component range = -32..31
- Range #1:
- x component range = -128..127
- y component range = -64..63
- Range #2:
- x component range = -512..511
- y component range = -128..127
- Range #3:
- x component range = -1024..1023
- y component range = -256..255