VP3 MBRING format

Introduction

The macroblock ring outputted from VLD is packet based, and aligned on 32-bit word size.

A packet has the header type in bits [24..31] and length in bits [0..23]. The data length is in words, and doesn’t include the header itself.

type 00: Macro block header

MPEG2

The macro block header contains 4 data words:

  • Word 0:
    • [0:15] Absolute address in macroblock units, 0 based
  • Word 1:
    • [0:7] Y coord in macroblock units, 0 based
    • [8:15] X coord in macroblock units, 0 based
  • Word 2:
    • [0] not_coded[??]
    • [1] skipped[??]
    • [3] quant
    • [4] motion_forward
    • [5] motion_backward
    • [6] coded_block_pattern
    • [7] intra
    • [26:26] dct_type
    • [27:28] motion_type
      • 0: field motion
      • 1: frame-based motion
      • 2: 16x8 field
      • 3: dual prime motion
  • Word 3:
    • [6:7] motion_vector_count
    • [8:12] quantiser_scale_code

H.264

  • Payload word 0:
    • bits 0-12: macroblock address
  • Payload word 1:
    • bits 0-7: y coord in macroblock units
    • bits 8-15: x coord in macroblock units
  • Payload word 2:
    • bit 0: first macroblock of a slice flag
    • bit 1: mb_skip_flag
    • bit 2: mb_field_coding_flag
    • bits 3-8: mb_type
    • bits 9+i*4 - 12+i*4, i < 4: sub_mb_type[i]
    • bit 25: transform_size_8x8_flag
  • Payload word 3:
    • bits 0-5: mb_qp_delta
    • bits 6-7: intra_chroma_pred_mode
  • Payload word 4:
    • bits i*4+0 - i*4+2, i < 8: rem_intra_pred_mode[i]
    • bit i*4+3, i < 8: prev_intra_pred_mode_flag[i]
  • Payload word 5:
    • bits i*4+0 - i*4+2, i < 8: rem_intra_pred_mode[i+8]
    • bit i*4+3, i < 8: prev_intra_pred_mode_flag[i+8]

Error

The macro block header contains 3 data words:

  • Word 0:
    • [0:15] Absolute address in macroblock units, 0 based
    • [16] error flag, always set
  • Word 1:
    • [0:7] Y coord in macroblock units, 0 based
    • [8:15] X coord in macroblock units, 0 based
  • Word 2: all 0

type 01: Motion vector

MPEG2

Todo

Verify whether X or Y is in the lowest 16 bits. I assume X

The motion vector has a length of 4 data words, and contains a total of 8 PMVs with a size of 16 bits each. The motion vectors are likely encoded in order of the spec with PMV[r][s][t].

The layout of each 16 bit PMV:

  • [0:5] motion code
  • [6:13] residual
  • [14] motion_vertical_field_select
  • [14:15] dmvector (0, 1, or 3)

motion_vertical_field_select and dmvector occupy same bits, but the mpeg spec makes them mutually exclusive, so they don’t conflict.

H.264

Payload like VP2, except length is in 32-bit words.

type 02: DCT coordinates

A packet of this type is created for each pattern enabled in coded_block_pattern. This packet type is byte oriented, rather than word oriented. It splits the coordinates up in chunks of 4 coordinates each, so 0..3 becomes 0, 4..7 becomes 1, 60..63 becomes chunk 15. The first 2 bytes contain a 16-bit bitmask indicating the presence of each chunk. If a chunks bit is set it will be encoded further.

For each present chunk a 8-bit bitmask will be created, which contains the size of each coordinate in that chunk. 2 bits are used for each coordinate, indicating the size (0 = not present, 1 = 1 byte, 2 = 2 bytes). This is followed by all coordinates present in this chunk, the last chunk is padded with 0s to align to word size.

For example: 0x10 0x00 0x40 0xff

Chunk 4 (0x0010>>4)&1 has pos 3 (0x40 >> (2*3))&3 set to -1

type 03: PCM data

Payload length is 0x60 words. Packet is byte oriented, instead of word oriented. Payload is raw PCM data from bitstream.

type 04: Coded block pattern

MPEG2

This packet puts coded_block_pattern in 1 data word.

H.264

Payload like VP2.

type 05: Pred weight table

Payload like VP2, except length is in 32-bit words.

type 06: End of stream

This header has no length, and signals the parser it’s done.

Macroblock

A macroblock is created in this order:

  • motion vector (optional)
  • macro block header
  • DCT coordinates / PCM samples (optional, and repeated as many times as needed)
  • coded_block_pattern (optional)

‘optional’ is relative to the MPEG spec. For example intra frames always require a coded_block_pattern.