Sub-Pictures

The typical arrangement of data in the 53220 byte buffer for sub-pictures is
SPUHPXDtfPXDbfSP_DCSQT
However, the only requirement is that the header (SPUH) be first, all other areas are reached by pointers.

SPUH

Sub-Picture Unit Header
2 words (small endian - least significant byte last)
offsetnamecontents
0SPDSZthe size of the total sub-picture data (which may span packets)
2SP_DCSQTAoffset within the Sub-Picture Unit to the SP_DCSQT

PXDtf and PXDbf

PiXel Data
These are the rle compressed pixel data for the top field (lines 1, 3, 5, etc) and the bottom field (lines 2, 4, 6, etc) respectively
Individual pixels may have one of four values, commonly referred to as background (0), pattern (1), emphasis 1 (2), and emphasis 2 (3) Each coded value indicates the number of pixels having the same code value, and can be in one of four forms, depending on the number of identical pixels
rangebitsformat
1-34n n c c
4-1580 0 n n n n c c
16-63120 0 0 0 n n n n n n c c
64-255160 0 0 0 0 0 n n n n n n n n c c
One special case, encoding a count of zero using the 16-bit format indicates the same pixel value until the end of the line.
If, at the end of a line, the bit count is not a multiple of 8, four fill bits of 0 are added.

SP_DCSQT

Sub-Picture Display Control SeQuence Table
This area contains blocks (SP_DCSQ) of commands to the decoder. Each SP_DCSQ begins with a 2 word header
offsetnamecontents
0SP_DCSQ_STMdelay to wait before executing these commands.
The units are 90KHz clock (same as PTM) divided by 1024 - see conversion aids
2SP_NXT_DCSQ_SAoffset within the Sub-Picture Unit to the next SP_DCSQ. If this is the last SP_DCSQ, it points to itself.

Commands

There are eight commands available for Sub-Pictures. The first SP_DCSQ should contain, as a minimum, SET_COLOR, SET_CONTR, SET_DAREA, and SET_DSPXA.

FF - CMD_END - ends one SP_DCSQ

00 - FSTA_DSP - Forced Start Display, no arguments

01 - STA_DSP - Start Display, no arguments

02 - STP_DSP - Stop Display, no arguments

03 - SET_COLOR - provides four indices into the CLUT for the current PGC to associate with the four pixel values. One nibble per pixel value for a total of 2 bytes.
e2 e1   p b

04 - SET_CONTR - directly provides the four contrast (alpha blend) values to associate with the four pixel values. One nibble per pixel value for a total of 2 bytes. 0x0 = transparent, 0xF = opaque
e2 e1   p b

05 - SET_DAREA - defines the display area, each pair (X and Y) of values is 3 bytes wide, for a total of 6 bytes, and has the form
sx sx   sx ex   ex ex   sy sy   sy ey   ey ey
sx = starting X coordinate
ex = ending X coordinate
sy = starting Y coordinate
ey = ending Y coordinate

06 - SET_DSPXA - defines the pixel data addresses. First a 2-byte offset to the top field data, followed by a 2-byte offset to the bottom field data, for a total of 4 bytes.

07 - CHG_COLCON - allows for changing the COLor and CONtrast within one or more areas of the display. This command contains a series of parameters, arranged in a hierarchy.
Following the command byte is a 2-byte value for the total size of the parameter area, including the size word.
The parameter sequence begins with a LN_CTLI, which defines a vertically bounded area of the display. The LN_CTLI may include from one to fifteen PX_CTLI parameters, which define a starting horizontal position and new color and contrast value to apply from that column on towards the right to the next PX_CTLI or the right side of the display.

LN_CTLI, 4 bytes, special value of 0f ff ff ff signifies the end of the parameter area (this termination code MUST be present as the last parameter)
0 s   s s   n t   t t
sss = csln, the starting (top-most) line number for this area
n = number of PX_CTLI to follow
ttt = ctln, the terminating (bottom-most) line number for this area

PX_CTLI, 6 bytes, defines a starting column and new color and contrast values
bytes 0 and 1 - starting column number
bytes 2 and 3 - new color values, as per SET_COLOR
bytes 4 and 5 - new contrast values, as per SET_CONTR

Converting frames and time to SP_DCSQ_STM values

The direct method of converting time to delay values is to multiply time in seconds by 90000/1024 and truncate the value. Rounding up will cause the display to occur one frame late.
Framesvalue for NTSC (30fps)value for PAL/SECAM (25fps)
123
257
3810
41114
51417
61721
72024
82328
92631
102935
113238
123542
133845
144149
154352
164656
174959
185263
195566
205870
216173
226477
236780
247084
2573(87)
2676(91)
2779(94)
2882(98)
2984(101)
secondsvalue
187
2175
3263
4351
5439
6527
7615
8703
9791
10878
201757
302636
403515
504394
605273

DVD-Video home