![]() |
|
|
| |
|
||||
EIA-708 is the standard for closed captioning for ATSC digital television streams in the United States and Canada. It was developed by the Electronic Industries Alliance. Unlike most DVB captions, EIA-708 captions are textual like traditional Line 21 captions. However, unlike Line 21 captions, EIA-708 captions include most of the Latin1 character set, and include stubs to support full UTF-32 captions, and downloadable fonts. EIA-708 Captions are injected into MPEG-2 video streams in the picture user data. The packets are in picture order, and must be rearranged just like picture frames are. This is known as the DTVCC Transport Stream. It is a fixed-bandwidth channel that has 960 bit/s allocated for backward compatible Line 21 captions, and 8640 bit/s allocated for EIA-708 captions. The ATSC A/53 Standard (http://www.atsc.org/standards/a_53c_with_amend_1.pdf) contains the encoding specifics. Either the EIT or the PMT tables contain a caption descriptor which tells you what language the captions are in and tells you if they are regular captions or 3rd grade level captions for language learners. EIA-708 caption decoders are required in the U.S. by FCC regulation in all 13" (33cm) diagonal or larger DTV televisions. Further, some broadcasters are be required by FCC regulations to caption a percentage of their broadcasts. Packets in EIA-708Caption streams are transmitted with many packet wrappers around them. These are the picture user data, which contains the caption data, which contains the cc_data, which contains the Caption Channel packets, which contains the Service Block, which contains the caption streams. These packets are described in detail in this section. But the streams themselves are described in the following sections. This layering is based on the OSI Protocol Reference Model:
Picture User DataThe MPEG-2 Stream's picture user data syntax is as follows:
When the picture user data contains a caption user_data_start_code is set to 0x00001B2, the ATSC_identifier is 0x47413934, and the user_data_type_code will be 0x03. If the user_data_type is not 0x03, or 0x06 for bar data, then the packet will be terminated with the bytes 0x0, 0x0, 0x1. If the data describes caption data, it will be as follows: user_data
Marker bits and reserved bits should all be set by default. If the additional_data_flag is set then the ATSC_reserved_user_data will be at the tail of the packet, terminated by the bytes 0x0,0x0,0x1. If the process_cc_data_flag is set then the cc_data_X will contain cc_count cc_data_X packets, described as follows: cc_data packetcc_data_X
If cc_valid is not set this cc_data_X should be considered padding and discarded.. If it is set, cc_type will be one of four values NTSC_CC_FIELD_1 = 0, NTSC_CC_FIELD_1 = 1, DTVCC_PACKET_DATA = 2, DTVCC_PACKET_START = 3. If it is either 0 or 1, the cc_data fields should be interpreted as EIA-608 Captions. If cc_type is 3 then a decoder should begin assembling a Caption Channel Packet with the cc_data as described below, and if the cc_type is 2 it should append the cc_data to any Caption Channel Packet being assembled. If a DTVCC packet is already being assembled and either cc_valid is set and the cc_type is 3 or cc_valid is clear and cc_type is 2 or 3, then the packet should be considered complete. NOTE: In a caption decoder cc_data packets must be reassembled in the correct order to create the DTVCC packets. The standard is not clear on this, but it appears this should be in frame display order, not encoded frame order. This means in encoder DTVCC Packets should probably be broken up and inserted into the picture user data as cc_data packets in display order as well. DTVCC packet
Within the packet_data, there is only one type of packet. This is known as the Service Block. This furter subdivides the DTVCC Transport Stream into 63 substreams, each of which describes a discrete captioning service. Service 1 is designated as the Primary Caption Service, while Service 2 is the Secondary Language Service. The Caption Descriptor describes any other services offered. Service Block Packet
Optional Data 1 is only present if service_number is 7, in which case the extended_service_number should be used instead of the service_number. Optional Data 2 is present only if block_size is greater than 0. However if block_size is 0, the service_number must be zero as well, and then this is known as a Null Service Block Header. A Null Service Block Header can be used for padding. Note: Service Blocks may not cross Caption Channel Packet Boundaries. This means each Caption Channel Packet can be parsed without keeping any state for the Service Blocks themselves. Caption Stream EncodingThe 63 caption service sub-streams contain a mixed command and text stream, much like Telnet. There are four logical code sub-groups: CL, GL, CR, and GR. These each have single and multi-character code sets.
Whenever a command character is seen any text accumulated in the parser should be flushed. Since text might need to be flushed when there is no command pending, there is a null command known as the ETX command in the C0 command set. There are also two special commands, the Reset and DelayCancel. These must be parsed with lookahead. A Delay command issued previously can be canceled at any time with a DelayCancel command, so once a Delay is seen a decoder must look ahead for a DelayCancel, and only look for a DelayCancel. A Reset command on the other hand is sent to break out from an unknown decoder state and all data before it must be ignored. Character GroupsC0 Table
NUL, BS, FF, and CR are interpreted as they are in ASCII control codes. HCR is undefined in the EIA-708-A standard. ETX is the NULL command mentioned earlier, which is used to flush text to the current window when no other command is pending. EXT1 is used to escape to the 'C2', 'C3', 'G2', and 'G3' tables for the following byte. Finally, P16 can be used to escape the next two bytes for Chinese and other large character maps. It should be noted that all characters in the range 0x10-0x17, which currently includes EXT1, are followed by one byte which needs to be interpreted differently. And, all characters in the range 0x18-x1f, which currently includes P16, are followed by two bytes that need to be interpreted differently. If a decoder encounters one of these and does not know what to do, it should still skip the next byte or two, as approriate, before continuing. C1 Table
The C1 Table contains all the currently defined caption commands. These will be described in detail in the next section. C2 TableThe C2 Table contains no commands as of EIA-708 revision A. However, if a command is seen in these code sets a decoder must skip an approriate number of the following bytes.
C3 TableThe C3 Table contains no commands as of EIA-708 revision A. However, if a command is seen in these code sets a decoder must skip an approriate number of the following bytes.<p>
G0 Table
The G0 Table consists of ASCII characters for the most part. SP here is short hand for Space, and MN is a musical note, which replaces the Delete command code in ASCII. G1 Table
The G1 Table is basically the ISO 8859-1 Latin-1 character set. Note character 0xa0 is the non-breaking space, which is to be used to prevent word wrap from separating two words onto separate lines. G2 Table
TSP and NBTSP are the Transparent Space, and Non-Breaking Transparent Space, respectively. The G2 Table contains miscellaneous charcters that may not be displayed in all browsers. BLK indicates a solid block which fills the entire character block with a solid foreground color. G3 TableThe G3 Table contains only a single character, the [CC] Icon, with square corners. This chacter is at 0xa0. Caption commands
EndOfText (0x03)The EndOfText command is a Null Command which can be used to flush any buffered text to the current window. All commands force a flush of any buffered text to the current window, so this command is only needed when no other command is pending. SetCurrentWindow0-7 (0x80-0x87)SetCurrentWindow tells the caption decoder which window the following commands describe: SetWindowAttributes, SetPenAttributes, SetPenColor, SetPenLocation. If the window specified has not already been created with a DefineWinow command then SetCurrentWindow and the window property commands can be safely ignored. ClearWindows (0x88 + 1 byte)ClearWindows clears all the windows specified in the 8 bit window bitmap. DisplayWindows (0x89 + 1 byte)DisplayWindows displays all the windows specified in the 8 bit window bitmap. HideWindows (0x8A + 1 byte)HideWindows hides all the windows specified in the 8 bit window bitmap. ToggleWindows (0x8B + 1 byte)ToggleWindows hides all displayed windows, and displays all hidden windows specified in the 8 bit window bitmap. DeleteWindows (0x8C + 1 byte)DeleteWindows deletes all the windows specified in the 8 bit window bitmap. If the current window, as specified by the last SetCurrentWindow command, is deleted then the current window becomes undefined and the window attribute commands should have no effect until after the next SetCurrentWindow or DefineWindow command. Delay (0x8D + 1 byte)Delay suspends all processing of the current service, except for DelayCancel and Reset scanning. The period of suspension is set to by the one byte parameter. The paramater specifies the delay in tenths of a second, so the minimum delay is 0.1 seconds, and the maximum delay is 25.5 seconds. A zero second delay can safely be ignored in a decoder, but should not be emitted from an encoder. A delay should be cancelled if the caption decoder's input buffer becomes full, a DelayCancel or Reset is received, or the specified delay time elapses. DelayCancel (0x8E)DelayCancel terminates any active delay and resumes normal command processing. DelayCancel should be scanned for durnig a Delay. Reset (0x8F)Reset deletes all windows, cancels any active delay, and clears the buffer before the Reset command. Reset should be scanned for during a Delay. SetPenAttributes (0x90 + 2 bytes)The SetPenAttributes command specifies how certain attributes of subsequent characters are to be rendered in the current window, until the next SetPenAttributes command. This command has the following parameters:
SetPenColor (0x91 + 3 bytes)SetPenColor sets the foreground, background, and edge color for the subsequent characters. Color is specified with 6 bits, 2 for each of blue, green and red. The lowest order bits are for blue, the next two for green and the highest order bits represent red. Opacity is represented by two bits, they represent SOLID=0, FLASH=1, TRANSLUCENT=2, and TRANSPARENT=3. The edge color is the color of the outlined edges of the text, but the outline shares it's opacity with the foreground, so the highest order bits of the third paramater byte should both be cleared. The parameters are as follows:
SetPenLocation (0x92 + 2 bytes)SetPenLocation sets the location of for the next bit of appended text in the current window. It has two parameters, row and column. If a window is not locked (see Define Window) and the SMALL font is in effect the location can be outside the otherwise valid addresses.
SetWindowAttributes (0x97 + 4 bytes)SetWindow Attrcibutes Sets the window attributes of the current window. Fill Color is specified with 6 bits, 2 for each of blue, green and red. The lowest order bits are for blue, the next two for green and the highest order bits represent red. Fill Opacity is represented by two bits, they represent SOLID=0, FLASH=1, TRANSLUCENT=2, and TRANSPARENT=3. The window's Border Color is specified the same way. However, the Border Type is split into two fields. They should be combined, with border type 01 representing the low order bits, and border type 2 the high order bit. Once combined the Border Type has 6 valid values: NONE=0, RAISED=1, DEPRESSED=2, UNIFORM=3, SHADOW_LEFT=4, and SHADOW_RIGHT=5.
DefineWindow0–7 (0x98-0x9F, + 6 bytes)DefineWindow0-7 creates one of the eight windows used by a caption decoder. This command should be sent periodically by a caption encoder even for pre-existing windows so that a newly tuned in caption decoder can begin dispalying captions. When issued on a pre-existing window the pen style and window style can be left null, this tells the decoder not to change the current styles if the exist, and initialize both to style 1 if the window does not exist in it's context. The parameters are as follows.
How to interpret the caption streamText/commandsWord wrapIt may sometimes be desired that word wrap be performed in a caption decoder. This may happen because the end user of the caption decoder specifies a different font than the encoder requests, or the end user wishes to see more of the caption text than normally possible. Note that SetWindowAttributes sets a word wrap flag, when set this indicates the subtitles are written with word wrap in mind, and this may be used as a hint to the decoder that word wrapping is safe. Word wrap can be performed on cartridge return, space, and hyphen characters, however both the non-breaking space (0xA0 in the G1 Table), and the non-breaking transparent space (0x21 in the G2 Table) should not be considered safe characters to rewrite. Anchor IDThere are nine valid anchor ID's, shown below: These are used to tell the caption decoder how to expand the text box as text is added to a caption window. A window is assigned an anchor point, or location and an anchor ID. If the anchor point is say 0,0, and the anchor ID is 0, then the window will expand down and right from the upper left corner of the caption area. If the anchor point is 50%,50% and the anchor ID is 4 the window will expand equally in all directions from the center of the caption area. FontsEIA-708 supports eight font tags: undefined, monospaced serif, proportional serif, monospaced sans serif, proportional sans serif, casual, cursive, small capitals. The first is not defined and should probably be avoided. However these fonts are implemented it should be possible to underline them, and italicize them. Bold versions are not needed, but it should be possible to draw the outline of each letter in a different color and opacity than the fill. Finally, these fonts must allow superscripts, subscripts, and be able to support Latin-1 plus the additional symbols in EIA-708, such as the [CC] symbol and the dozen or so UNICODE characters. Below are some font examples, for more see the wikipedia Fonts article. WindowsThe window addressable area should always be within the Safe-Title area, so that all addressable locations are within the display window if the monitor overscans the image onto a non-rectangular screen. If the video stream has a 16:9 aspect ratio the addresses should be in the range 0..74 for the vertical addresses, and 0..209 for the horizontal addresses. If the video stream has a 4:3 aspect ratio the addresses should be in the range 0..74 for the vertical addresses, and 0..159 for the horizontal addresses. For other aspect ratios relative addressing should be used and both vertical and horizontal addresses should be in the range 0..99%. The window size should be scaled based on the font size. With this in mind, rows longer than 32 characters are discouraged even on 16:9 ratio screen so that larger than specified fonts may be selected by the user. Row and column lockingImplementation notes
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
Copyright 2008 WordIQ.com - Privacy Policy
::
Terms of Use
:: Contact Us
:: About Us This article is licensed under the GNU Free Documentation License. It uses material from the Wikipedia article "EIA-708". |