DVB字幕解码
TS流解析
當(dāng)調(diào)諧器選定頻點(diǎn)之后,此時(shí)本地的接收器能夠源源不斷地接收到TS碼流,在這些碼流中,包含了視頻信息、音頻信息以及各種輔助信息,我們所要做的就是從這些信息中找到所承載的字幕信息,并進(jìn)行解碼。
TS流的復(fù)用與解復(fù)用:
在數(shù)字電視系統(tǒng)的前端,所有的數(shù)據(jù)(視頻,音頻以及PSI/SI信息)都會(huì)被復(fù)用器復(fù)用成TS流,從而進(jìn)行傳送,示意圖如下:
機(jī)頂盒等接收設(shè)備接收到的就是這樣被復(fù)用的一個(gè)個(gè)包,需要解復(fù)用器進(jìn)行解復(fù)用。解復(fù)用的意義就在于可以將TS流中類型相同的包存入相同的緩存中,分別處理,這樣就可以將視頻、音頻以及其他業(yè)務(wù)信息的數(shù)據(jù)區(qū)分隔開來(lái)。
TS流拼接成PES包
在接收器接收到TS流之后,首先需要等待數(shù)據(jù)的同步,即完整的數(shù)據(jù)包的到來(lái)。首先需要查找PID為0x0的包,這是PAT(節(jié)目映射表),每個(gè)TS流中有一個(gè),每隔0.5s重復(fù)。在PAT表中,定義了當(dāng)下TS流中的所有節(jié)目,是PSI的根節(jié)點(diǎn),要查找節(jié)目必須從PAT表開始查找,其主要包含頻道號(hào)碼和每一個(gè)頻道對(duì)應(yīng)的PMT的PID。當(dāng)選定節(jié)目后,按照上述PID找到對(duì)應(yīng)的PMT。
PMT是節(jié)目映射表,其中包含了當(dāng)前頻道中所有的video數(shù)據(jù)的PID,所有的audio數(shù)據(jù)的PID,以及和當(dāng)前頻道關(guān)聯(lián)在一起的其他數(shù)據(jù)的PID。從PMT中,我們可以找到字幕數(shù)據(jù)流所對(duì)應(yīng)的PID,可以根據(jù)此PID拼接成一個(gè)完整的PES包。
TS包由包頭跟有效載荷組成,其中包頭4個(gè)字節(jié),有效載荷184個(gè)字節(jié),一共188個(gè)字節(jié),其結(jié)構(gòu)如下所示:
如前文所述,根據(jù)PMT中給定的PID找到字幕數(shù)據(jù)對(duì)應(yīng)的TS包。其中,同步字節(jié)是固定的8bit字段,其值為0x47;有效載荷單元起始指示符為1bit標(biāo)志,當(dāng)傳輸流包有效載荷包含PES包數(shù)據(jù)時(shí),置1指示此傳輸流包的有效載荷應(yīng)隨著PES包的首字節(jié)開始,0指示此傳輸流包中無(wú)任何PES包開始,通過(guò)此標(biāo)志,我們可以判斷一個(gè)PES包是否已經(jīng)存儲(chǔ)完整;自適應(yīng)段為2bit字段,指示此包頭是否跟隨自適應(yīng)字段或有效載荷,當(dāng)為01時(shí)指示無(wú)自適應(yīng)段,僅有效載荷,為10時(shí)僅有自適應(yīng)段,無(wú)有效載荷,11時(shí)為自適應(yīng)段后跟隨有效載荷。如果存在自適應(yīng)段,則連續(xù)計(jì)數(shù)器字段后8個(gè)bit指示自適應(yīng)段長(zhǎng)度。如果沒(méi)有自適應(yīng)段只有有效載荷,則包頭之后的184個(gè)字節(jié)就是有效載荷,存入緩存中;如果有自適應(yīng)段,則使用184減去自適應(yīng)段長(zhǎng)度即可得到有效載荷的長(zhǎng)度,將其存入緩存中。直到下一個(gè)PES包頭到達(dá),說(shuō)明此PES包已完整。
PES包解析
字幕段數(shù)據(jù)的獲取
PES包的完整結(jié)構(gòu)見下圖:
包起始碼前綴是固定的24比特碼,值為0x1;流id指示基本流的類型和編號(hào),對(duì)字幕流來(lái)說(shuō),流id應(yīng)為0xbd;PES包長(zhǎng)度是一個(gè)16bit的字段,指示PES包中跟隨該字段最后字節(jié)的字節(jié)數(shù),0值指示PES包長(zhǎng)度既未指定,也未限定并且僅在這樣的PES包中才被允許;PES頭數(shù)據(jù)長(zhǎng)度指示在此PES包頭中包含的由任選字段和任意填充字節(jié)所占據(jù)的字節(jié)總數(shù);PTS指示了顯示時(shí)間與解碼時(shí)間的關(guān)系。在獲取PES包長(zhǎng)度和PES頭數(shù)據(jù)長(zhǎng)度后即可得到PES數(shù)據(jù)域中的數(shù)據(jù),即字幕的相關(guān)數(shù)據(jù)。
字幕段數(shù)據(jù)的解析
上述得到的字幕數(shù)據(jù)段結(jié)構(gòu)如下所示:
對(duì)字幕數(shù)據(jù)來(lái)說(shuō),data_identifier為固定的8bit字段,為0x20;subtitle_stream_id是在PES包中指示字幕流,固定為0x00,之后就是字幕的數(shù)據(jù)段;最后是8bit的PES數(shù)據(jù)結(jié)束的標(biāo)志位,固定為0xff。字幕數(shù)據(jù)段的結(jié)構(gòu)如下:
開始是8bit的同步字節(jié),固定為0x0f,通過(guò)此同步字節(jié)可用來(lái)驗(yàn)證傳輸信息有沒(méi)有丟失;之后是8bit的segment_type,代表傳輸?shù)淖帜粩?shù)據(jù)的類型;隨后是2個(gè)字節(jié)的page_id,用來(lái)指示字幕服務(wù)的類型,通過(guò)page_id可用來(lái)區(qū)分此字幕頁(yè)是composition page還是ancillary page。Ancillary page代表由多個(gè)字幕服務(wù)共享的數(shù)據(jù),例如logo或者字符符號(hào)。segment_length是2個(gè)字節(jié)的字段,指示該字段后直到字幕段結(jié)束的字節(jié)的數(shù)量,之后就是字幕數(shù)據(jù)段的數(shù)據(jù)。
字幕數(shù)據(jù)段較為常用的是四種類型:頁(yè)組成段、區(qū)域組成段、CLUT定義段以及對(duì)象數(shù)據(jù)段。頁(yè)組成段攜帶一個(gè)包含0個(gè)或者多個(gè)region的清單,這個(gè)清單定義了頁(yè)組成段定義的顯示中可見的region的集合,這個(gè)可見清單在PTS定義的時(shí)間變得可用,解碼器的顯示將立即從之前存在的可見區(qū)域的集合切換到最新定義的集合,在頁(yè)組成段之后可能會(huì)跟著0或多個(gè)區(qū)域組成段,但頁(yè)組成段的region清單可能跟這些區(qū)域組成段的集合有很大的不同。一個(gè)完整的區(qū)域組成段集合將隨著標(biāo)志有“modechange”或“acquisition point”狀態(tài)的頁(yè)組成段出現(xiàn),這是引入region并為其分配內(nèi)存的過(guò)程,區(qū)域組成段攜帶有關(guān)region位置和區(qū)域?qū)傩缘男畔?#xff0c;例如水平和垂直分辨率、背景色、區(qū)域的像素深度、CLUT的id、包含對(duì)象的列表以及對(duì)象在區(qū)域中的位置。CLUT定義段代表將要有CLUT的更改,也就是顏色的改變。對(duì)象數(shù)據(jù)段包含了一個(gè)對(duì)象的相關(guān)數(shù)據(jù),即字幕對(duì)應(yīng)的字符或者像素編碼。
頁(yè)組成段結(jié)構(gòu)如上圖所示,部分解釋如下:
- page_time_out:以s為單位的時(shí)間,在該時(shí)間后該頁(yè)面不再有效,應(yīng)當(dāng)從屏幕上擦除此頁(yè)面,這是為了防止因?yàn)殄e(cuò)誤導(dǎo)致該頁(yè)面長(zhǎng)期停留在屏幕上的情況發(fā)生;
- page_state:該字段表示頁(yè)組合分段中和subtitle頁(yè)描述相關(guān)聯(lián)的內(nèi)存規(guī)劃的狀態(tài),相關(guān)值的定義如下:
normal case代表頁(yè)組合分段后跟著不完整的region集合,將要更改其中的字幕元素,acquisition point表示頁(yè)組合分段后跟著完整的region集合,描述當(dāng)前的內(nèi)存規(guī)劃,即將更新頁(yè)面, mode change表示頁(yè)組合分段后跟著的regions,描述一個(gè)新的內(nèi)存規(guī)劃,需要更新頁(yè)面。 - region_id:頁(yè)中唯一標(biāo)識(shí)一個(gè)區(qū)域的元素,所有的region都應(yīng)該按照region_vertical_address字段中的順序排列在頁(yè)組合分段中。
- region_horizontal_address:指定了region左上角像素的水平地址。
- region_vertical_address:指定了region頂行的垂直地址。
區(qū)域組成段結(jié)構(gòu)如上圖所示,部分解釋如下:
- region_id:唯一標(biāo)識(shí)了一個(gè)region。
- region_fill_flag:如果設(shè)置為1,代表該區(qū)域?qū)⑹褂么硕沃衦egion_n-bit_pixel_code字段中定義的背景色填充。
- region_width:表示region的寬度。
- region_height:表示region的高度。
- region_level_of_compatibility:表示解碼器解碼該region所需的CLUT的最小類型。
- region_depth:該region可以使用的最大像素深度。
- CLUT_id:標(biāo)識(shí)CLUT的唯一標(biāo)識(shí)。
- region_8-bit_pixel_code:當(dāng)region_fill_flag被設(shè)置后,該region使用的256色的像素編碼。
- region_4-bit_pixel_code:當(dāng)region_fill_flag被設(shè)置后,該region使用的16色的像素編碼。
- region_2-bit_pixel_code:當(dāng)region_fill_flag被設(shè)置后,該region使用的4色的像素編碼。
- object_id:標(biāo)識(shí)區(qū)域中顯示的一個(gè)對(duì)象。
- object_type:標(biāo)識(shí)對(duì)象的類型,設(shè)置為0x00代表位圖,0x01代表字符,0x02代表字符串,0x03保留。
- object_provider_flag:2bit的標(biāo)識(shí),標(biāo)識(shí)object的來(lái)源。
- object_horizontal_position:指定對(duì)象的水平位置,單位為像素,相對(duì)于區(qū)域的左邊緣。
- object_vertical_position:指定對(duì)象的垂直位置,單位為掃描線,相對(duì)于區(qū)域的頂部。
- foreground_pixel_code:標(biāo)識(shí)定義字符的前景色的8_bit_pixel_code。
- background_pixel_code:標(biāo)識(shí)定義字符的背景色的8_bit_pixel_code。
CLUT定義段的結(jié)構(gòu)如上所示,部分解釋如下:
- CLUT_id:標(biāo)識(shí)頁(yè)中包含在CLUT定義段域中的CLUT族。
- CLUT_entry_id:指定CLUT的條目號(hào),CLTU的條目號(hào)從0開始。
- 2-bit/entry_CLUT_flag:如果設(shè)置為1,代表該CLUT值將被用于標(biāo)識(shí)2-bit/entry CLUT的條目。
- 4-bit/entry_CLUT_flag:如果設(shè)置為1,代表該CLUT值將被用于標(biāo)識(shí)4-bit/entry CLUT的條目。
- 8-bit/entry_CLUT_flag:如果設(shè)置為1,代表該CLUT值將被用于標(biāo)識(shí)8-bit/entry CLUT的條目。
- full_range_flag:如果設(shè)置為1,標(biāo)識(shí)Y-value、Cr-value、Cb-value和T-value字段為8bit方案,如果設(shè)置為0,這些字段僅包含最重要的比特位。
- Y-value:代表該條目中CLUT的Y輸出值。
- Cr-value:代表該條目中CLUT的Cr輸出值。
- Cb-value:代表該條目中的CLUT的Cb輸出值。
- T-value:代表該條目中的透明度輸出值。
對(duì)象數(shù)據(jù)段的結(jié)構(gòu)如上圖,部分解釋如下:
- object_id:標(biāo)識(shí)object_data_segment中的object數(shù)據(jù)。
- object_coding_method:標(biāo)識(shí)用于object編碼的方法,0x00代表像素編碼,0x01代表字符串編碼,0x02保留,0x03保留。
- non_modifying_colour_flag:設(shè)置為1代表CLUT條目值‘1’是一個(gè)非修改的顏色,意味著其不應(yīng)該覆蓋任何底層的object。
- top_field_data_block_length:表示隨后頂部區(qū)域包含的pixel-data_sub-block的字節(jié)數(shù)。
- bottom_field_data_block_length:表示隨后底部區(qū)域包含的pixel-data_sub-block的字節(jié)數(shù)。
- number_of_codes:表示字符串中編碼字符的數(shù)量。
總結(jié)
- 上一篇: 软件工程专业英语专用名词翻译
- 下一篇: 光端机和无缝带拼接混合矩阵切换器的配搭应