织梦CMS - 轻松建站从此开始!

罗索

MPEG-2 Transport Stream在协议栈(Protocol Stack)中的角色

落鹤生 发布于 2010-10-18 14:05 点击:次 
没有任何DSM-CC messages或是接口可以在MPEG-2传输流中传输。然而,如果要用MPEG-2传输流传输DSM-CC 协议,那么在这一章节中提到的section就会被用到。
TAG:

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
(pascal4)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201010/10329.html]
本文出处:百度博客 作者:pascal4
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容