本文為對(duì)ISO-IEC 13818-6中9.2節(jié)的翻譯,因?yàn)槔锩嬗行┙?jīng)常用到的概念,為了方便記憶以及留下痕跡,特寫此博。
MPEG-2 Transport Stream在協(xié)議棧(Protocol Stack)中的角色
沒有任何DSM-CC messages或是接口可以在MPEG-2傳輸流中傳輸。然而,如果要用MPEG-2傳輸流傳輸DSM-CC 協(xié)議,那么在這一章節(jié)中提到的section就會(huì)被用到。
MPEG-2系統(tǒng),ISO/IEC13818-1定義了一套private_section(私有表)結(jié)構(gòu),可以將DSM-CC的messages(Download ControlMessage 或 Download DataMessage,例如DII,DSI,DDB)封裝成私有表(private_section)的形式,然后進(jìn)行packet化,這樣就塊可以在MPEG-2的傳輸流中進(jìn)行傳輸。本協(xié)議對(duì)private_section定義了額外的文法來滿足額外的DSM-CC的需求,這種私有表稱為DSM-CCSection,它的文法結(jié)構(gòu)和private_section兼容,所以可以用MPEG-2的解碼器對(duì)其解碼。
DSM-CC Sections
當(dāng)DSM-CC U-N(User-Network)和Downloadmessages需要被封裝成MPEG-2的傳輸流時(shí),就需要用到DSMCCsection的語(yǔ)法結(jié)構(gòu)。其他數(shù)據(jù)凈荷(payload)也許也會(huì)用到這種結(jié)構(gòu)。這種結(jié)構(gòu)繼承自在13818-1中定義的private_section,在對(duì)DSM-CC_section header進(jìn)行編碼的時(shí)候某些字段會(huì)有特殊的語(yǔ)義。如何將DSMCCSection映射成MPEG-2 Packets和DSMCC Section的最大長(zhǎng)度都在ISO/IEC13818-1的Private_section中介紹。
在某寫編碼實(shí)現(xiàn)中,在Private_section中使用CRC_32是比較理想的。由于很多系統(tǒng)對(duì)于CRC_32的計(jì)算很有難度,DSMCC_section語(yǔ)法提供了CRC_32的一個(gè)替代品。為了和13818-1一致,如果section_syntax_indicator被賦為1,就會(huì)使用CRC_32這種方式,但是如果section_syntax_indicator被賦為0,除了CRC32字段被替代為checksum字段外,其他字段在和section_syntax_indicator被賦為1的情況沒下沒有任何差別。所以還是兼容13818-1,因?yàn)榫o跟著section_length字段后面的數(shù)據(jù)都被視為私有數(shù)據(jù)(private data)。
因?yàn)閟ection_syntax_indicator字段可能會(huì)出錯(cuò),private_indicator字段必須設(shè)置為section_syntax_indicator的反碼,如果section_syntax_indicator為0,那么private_indicator必須置為1,如果不是這樣,這個(gè)section就是一個(gè)錯(cuò)誤的section。類似的,如果section_syntax_indicator為1,則private_indicator為0。
當(dāng)section_syntax_indicator被設(shè)為0(不用CRC)并且checksum字段也被設(shè)為0,在其他層會(huì)提供一個(gè)錯(cuò)誤檢測(cè),這種需求是強(qiáng)制的(請(qǐng)參考表9-1和download transport protocol requirements)。
對(duì)于MPEG2 傳輸流更多的與private_section相關(guān)的文法和語(yǔ)義,請(qǐng)參照ISO/IEC 13818-1,第2.4.4節(jié)Program Specificinformation,會(huì)包括設(shè)置payload_unit_start_indicator,TS流凈荷中point_field的設(shè)置,以及packet中填充字段的用法。
除非特別指定,DSM-CC tables(擁有相同table id的一個(gè)或多個(gè)DSM CCsections)會(huì)被相同數(shù)值的PID的packets所承載,這點(diǎn)和其他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各字段的語(yǔ)義
table_id:占8位,標(biāo)識(shí)了DSMCC Section凈荷中的數(shù)據(jù)的類型,該字段定義了table_id_extension,version_number,section_number和last_section_number這些字段的編碼規(guī)則。
下表包括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 封裝數(shù)據(jù) |
0×3B | 包括了U-N Messages,除了Download Data Msg外(我們經(jīng)常用到的是Download Control Msg) |
0×3C | 包括了Download Data Messages |
0×3D | 包括了Stream Descriptors |
0×3E | 包括了私有數(shù)據(jù) |
0×3F | ISO/IEC 18318-1保留 |
0×40-0xFE | 用戶私有 |
0xFF | forbidden |
Multi-protocol encapsulated 數(shù)據(jù)也許包括U-U RPCs
section_syntax_indicator:占1bit的字段,當(dāng)設(shè)為‘1’代表校驗(yàn)使用CRC32字段,當(dāng)設(shè)為‘0’代表使用checksum字段。
private_indicator:占1bit的字段,將被設(shè)置為section_syntax_indicator的反碼。
reserved:設(shè)為‘11’
dsmcc_section_length:這個(gè)占位為12bit的字段指示了緊跟在該字段后面的DSMCC Section的剩余的字節(jié)數(shù),該值不能超過4093
table_id_extension:16位的字段,如果table_id的值為0×3B,該字段的值為dsmccMessageHeader中transaction_id字段的低2個(gè)字節(jié);如果table_id的值為0×3C,該字段的值為DownloadDataBlock或DownloadResponse中的moduleId的值。如果既不是0×3C也不是0×3B,則該值由用戶所定義。
version_number:這是個(gè)5bit的字段,如果table_id的值為0×3A或0×3B,該字段設(shè)為0;如果table_id為0×3C并且是DownloadData Message,該字段將會(huì)賦于DDBMessage中moduleVersion字段的低5位的值;如果table_id的值為0×3C并且是DownloadData ResponseMessage,該字段需被設(shè)為0。如果table_id字段不是0×3A到0×3C中的值,該字段的值由用戶所定義。
current_next_indicator:這是一個(gè)1bit的flag,如果table_id的值在0×3A到0×3C范圍內(nèi),該位被設(shè)為‘1’,其他的情況由用戶定義。
section_number:這是一個(gè)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 | 多協(xié)議封裝 |
0×0B | DSMCC U-N Message |
0×0C | DSMCC Strem Descriptors |
0×0D | Dsmcc Sections(包括私有數(shù)據(jù)的任何類型) |
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