本文为对ISO-IEC 13818-6中9.2节的翻译,因为里面有些经常用到的概念,为了方便记忆以及留下痕迹,特写此博。
MPEG-2 Transport Stream在协议栈(Protocol Stack)中的角色
没有任何DSM-CC messages或是接口可以在MPEG-2传输流中传输。然而,如果要用MPEG-2传输流传输DSM-CC 协议,那么在这一章节中提到的section就会被用到。
MPEG-2系统,ISO/IEC 13818-1定义了一套private_section(私有表)结构,可以将DSM-CC的messages(Download Control Message 或 Download Data Message,例如DII,DSI,DDB)封装成私有表(private_section)的形式,然后进行packet化,这样就块可以在 MPEG-2的传输流中进行传输。本协议对private_section定义了额外的文法来满足额外的DSM-CC的需求,这种私有表称为DSM-CC Section,它的文法结构和private_section兼容,所以可以用MPEG-2的解码器对其解码。
DSM-CC Sections
当DSM-CC U-N(User-Network)和Download messages需要被封装成MPEG-2的传输流时,就需要用到DSMCC section的语法结构。其他数据净荷(payload)也许也会用到这种结构。这种结构继承自在13818-1中定义的 private_section,在对DSM-CC_section header进行编码的时候某些字段会有特殊的语义。如何将DSMCC Section映射成MPEG-2 Packets和DSMCC Section的最大长度都在ISO/IEC 13818-1的Private_section中介绍。
在某写编码实现中,在Private_section中使用CRC_32是比较理想的。由于很多系统对于CRC_32的计算很有难 度,DSMCC_section语法提供了CRC_32的一个替代品。为了和13818-1一致,如果section_syntax_indicator 被赋为1,就会使用CRC_32这种方式,但是如果section_syntax_indicator被赋为0,除了CRC32字段被替代为 checksum字段外,其他字段在和section_syntax_indicator被赋为1的情况没下没有任何差别。所以还是兼容13818-1, 因为紧跟着section_length字段后面的数据都被视为私有数据(private data)。
因为section_syntax_indicator字段可能会出错,private_indicator字段必须设置为 section_syntax_indicator的反码,如果section_syntax_indicator为0,那么 private_indicator必须置为1,如果不是这样,这个section就是一个错误的section。类似的,如果 section_syntax_indicator为1,则private_indicator为0。
当section_syntax_indicator被设为0(不用CRC)并且checksum字段也被设为0,在其他层会提供一个错误检测,这种需求是强制的(请参考表9-1和download transport protocol requirements)。
对于MPEG2 传输流更多的与private_section相关的文法和语义,请参照ISO/IEC 13818-1,第2.4.4节 Program Specific information,会包括设置payload_unit_start_indicator,TS流净荷中point_field的设置,以及 packet中填充字段的用法。
除非特别指定,DSM-CC tables(拥有相同table id的一个或多个DSM CC sections)会被相同数值的PID的packets所承载,这点和其他private_sections(例如,13818-1将它们的 stream type指定为0×05)一样。
DSMCC-CC Section Format
Syntax | No. of bits | Mnemonic |
DSMCC_section(){ | ||
table_id | 8 | uimsbf |
section_syntax_indicator | 1 | bslbf |
private_indicator | 1 | bslbf |
reserved | 2 | bslbf |
dsmcc_section_length | 2 | bslbf |
table_id_externsion | 16 | uimsbf |
reserved | 2 | bslbf |
version_number | 5 | uimsf |
current_next_indicator | 1 | bslbf |
section_number | 8 | uimsf |
last_section_number | 8 | uimsf |
if (table_id==0×3A) { | ||
LLCSNAP() | ||
} | ||
else if (table_id==0×3B) { | ||
userNetworkMessage() | ||
} | ||
else if (table_id==0×3C) { | ||
downloadDataMessage() | ||
} | ||
else if (table_id==0×3D) { | ||
DSMCC_descriptor_list() | ||
} | ||
else if (table_id==0×3E) { | ||
for (i ==0;i<dsmcc_section_length-9;i++){ | ||
private_data_byte | ||
} | ||
} | ||
if (section_syntax_indicator==’0′) { | ||
checksum | 32 | uimsf |
} | ||
else { | ||
CRC_32 | 32 | uimsf |
} | ||
} |
DSMCC Section各字段的语义
table_id:占8位,标识了DSMCC Section净荷中的数据的类型,该字段定义了table_id_extension,version_number,section_number和last_section_number这些字段的编码规则。
下表包括DSMCC table_id的赋值。
table_id | DSMCC Section Type |
---|---|
0×00-0×37 | ITU-T Rec.H.222.0|ISO/IEC 13818-1所定义 |
0×38-0×39 | ISO/IEC 13818-1保留 |
0×3A | DSMCC-Section 包括了 multi-protocol 封装数据 |
0×3B | 包括了U-N Messages,除了Download Data Msg外(我们经常用到的是Download Control Msg) |
0×3C | 包括了Download Data Messages |
0×3D | 包括了Stream Descriptors |
0×3E | 包括了私有数据 |
0×3F | ISO/IEC 18318-1保留 |
0×40-0xFE | 用户私有 |
0xFF | forbidden |
Multi-protocol encapsulated 数据也许包括U-U RPCs
section_syntax_indicator:占1bit的字段,当设为‘1’代表校验使用CRC32字段,当设为‘0’代表使用checksum字段。
private_indicator:占1bit的字段,将被设置为section_syntax_indicator的反码。
reserved:设为‘11’
dsmcc_section_length:这个占位为12bit的字段指示了紧跟在该字段后面的DSMCC Section的剩余的字节数,该值不能超过4093
table_id_extension:16位的字段,如果table_id的值为0×3B,该字段的值为 dsmccMessageHeader中transaction_id字段的低2个字节;如果table_id的值为0×3C,该字段的值为 DownloadDataBlock或DownloadResponse中的moduleId的值。如果既不是0×3C也不是0×3B,则该值由用户所定 义。
version_number:这是个5bit的字段,如果table_id的值为0×3A或0×3B,该字段设为 0;如果table_id为0×3C并且是DownloadData Message,该字段将会赋于DDB Message中moduleVersion字段的低5位的值;如果table_id的值为0×3C并且是DownloadData Response Message,该字段需被设为0。如果table_id字段不是0×3A到0×3C中的值,该字段的值由用户所定义。
current_next_indicator:这是一个1bit的flag,如果table_id的值在0×3A到0×3C范围内,该位被设为‘1’,其他的情况由用户定义。
section_number:这是一个8bit的字段,如果table_id的值等于0×3A或0×3B,该字段将为0;如果table_id的值为0×3C,该字段的值将等于DDB或DDR message的moduleNumber字段最低8bit的值。其他的由用户去定义。
CRC32:在ISO/IEC 13818-1 附录B中定义。
checksum:
DSMCC Stream Types
DSMCC定义了不同的stream_type值,PMT的es_info_loop中有用到stream_type字段,dsmcc section的stream_type描述如下:
下表包括了DSMCC stream type的赋值:
stream_type | Description |
---|---|
0×00-0×09 | ITU-T Rec.H.220|ISO/IEC 13818-1定义 |
0×0A | 多协议封装 |
0×0B | DSMCC U-N Message |
0×0C | DSMCC Strem Descriptors |
0×0D | Dsmcc Sections(包括私有数据的任何类型) |
0×0E-0×7F | 保留 |
0×80-0xFF | 用户私有 |
下面一些限制:
- 只有table_id为0×3A的DSMCC Sections包含stream type为0×0A的packets
- 只有table_id为0×3B和0×3C的DSMCC Section包含stream type为0×0B的TS Packets
- 只有table_id为0×3D的DSMCC Section包含stream type为0×0C的TS Packets