新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 數(shù)字機(jī)頂盒字幕解碼顯示系統(tǒng)設(shè)計(jì)方案

數(shù)字機(jī)頂盒字幕解碼顯示系統(tǒng)設(shè)計(jì)方案

作者: 時(shí)間:2013-01-11 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/185490.htm

  3.2 數(shù)據(jù)模塊

  數(shù)據(jù)模塊負(fù)責(zé)對(duì)PES 包進(jìn)行。

  字幕PES 包解碼流程如圖4 所示。

圖4 字幕PES 包解析流程

圖4 字幕PES 包解析流程。

字幕解碼主要是對(duì)PES 包進(jìn)行分析,包括PES包頭的檢測(cè),PES 包頭信息的提取和字幕段的分析。

  濾波得到一個(gè)PES 包后,首先判斷包頭是否合法,包括判斷前四個(gè)字節(jié)是否為0×000001BD 和PES包長(zhǎng)度是否合法。

  PES 包頭信息提取包括提取PTS、PES 包頭長(zhǎng)度等。PTS 是該分組中承載的所要顯示的數(shù)據(jù)的顯示時(shí)間。根據(jù)包頭長(zhǎng)度可以定位到PES 的負(fù)載位置,進(jìn)而分析PES 包的負(fù)載。

  分析PES 包的負(fù)載,首先判斷前兩個(gè)字節(jié)(定義字節(jié)和字幕流id)是否分別為0×20、0×00.若都符合,則可以確定這個(gè)包就是所要的封裝有字幕數(shù)據(jù)的PES 包。然后進(jìn)入字幕段分析,字幕字段的內(nèi)容有四種情況。先找到同步頭字節(jié)0×0f,再往后分析8bit 的段類(lèi)型(segment_type),通過(guò)判斷該字節(jié)值來(lái)確定data_field()攜帶的是哪種類(lèi)型的數(shù)據(jù)。當(dāng)segment_type為0×10 時(shí)[3],該段為頁(yè)分段;當(dāng)segment_type 為0×11時(shí),則該段為區(qū)域分段;當(dāng)segment_byte 為0×12 時(shí),該段為CLUT 分段;當(dāng)segment_byte 為0×13 時(shí),該段為對(duì)象數(shù)據(jù)分段。最后,根據(jù)不同的類(lèi)型調(diào)用不同的函數(shù)對(duì)各種類(lèi)型的分段進(jìn)行下一步的分析。

  在頁(yè)分段的解析中找到該頁(yè)的頁(yè)id、顯示終止時(shí)間、顯示狀態(tài)、該頁(yè)由幾個(gè)區(qū)域組成、每個(gè)區(qū)域的區(qū)域id 和每個(gè)區(qū)域的水平垂直坐標(biāo),并把這些數(shù)據(jù)存儲(chǔ)起來(lái)。然后,根據(jù)從頁(yè)分段中獲取的區(qū)域的id 找到相應(yīng)的區(qū)域分段,獲取該區(qū)域的寬高、像素深度、該區(qū)域填充的顏色、顏色表id(CLUT_id)、區(qū)域的數(shù)據(jù)對(duì)象個(gè)數(shù)、每個(gè)數(shù)據(jù)對(duì)象編號(hào)(object_id),并存儲(chǔ)這些數(shù)據(jù)。

  最后,通過(guò)CLUT_id 找到顏色表,得到顏色的Y、Cr、Cb、T 值。通過(guò)object_id 找到對(duì)象數(shù)據(jù)的內(nèi)容,包括編碼方式及編碼數(shù)據(jù)。用相應(yīng)的解碼方式把這些相關(guān)的編碼數(shù)據(jù)解碼出來(lái),并放入緩沖區(qū)。其中,在頁(yè)分析時(shí),當(dāng)解析出的該頁(yè)的顯示終止時(shí)間已經(jīng)過(guò)了,則并不需要分析該頁(yè),把跟與該頁(yè)相關(guān)的數(shù)據(jù)緩沖區(qū)進(jìn)行清空操作。

  由于一個(gè)PES 包可能包含多個(gè)字幕段(subtitling_segment),因此必須循環(huán)分析到最后一個(gè)字幕段。對(duì)每個(gè)字幕段分析完后,都要判斷下一個(gè)字節(jié)是下一個(gè)字幕段的同步頭(0×0f)還是字幕數(shù)據(jù)結(jié)束標(biāo)志(0×ff)。若是下一個(gè)字幕段的同步頭則繼續(xù)分析,若是數(shù)據(jù)結(jié)束標(biāo)志則代表該P(yáng)ES 包攜帶的負(fù)載分析完畢。最后,把得到的數(shù)據(jù)存放到顯示緩沖區(qū),通過(guò)分析得到的PTS 創(chuàng)建一個(gè)定時(shí)時(shí)間,當(dāng)時(shí)間到的時(shí)候從緩沖區(qū)中把數(shù)據(jù)讀出,并調(diào)用OSD 層驅(qū)動(dòng)顯示數(shù)據(jù)。

  在該解碼中,對(duì)于合成頁(yè)(composition_page_id)的處理分為兩種,這是因?yàn)橥粋€(gè)PID 可能傳送不同語(yǔ)言的字幕流,即語(yǔ)言不同的多個(gè)信息共享同一個(gè)PID流,所以在處理的時(shí)候可以把合成頁(yè)設(shè)置為濾波器的深度。當(dāng)一路數(shù)據(jù)流進(jìn)來(lái)的時(shí)候,對(duì)符合該P(yáng)ID 的PES 包中對(duì)應(yīng)的頁(yè)ID 進(jìn)行判斷,與頁(yè)ID 相同的就提取,不同的就丟棄,這是其中的一種解析提取方式。另一種方式是采用多種語(yǔ)言共用的PID 值去設(shè)置濾波器,把與該P(yáng)ID 值符合的字幕流提取出來(lái),送去PES包解析。經(jīng)過(guò)PES 解析出該頁(yè)ID,這時(shí)再判斷該頁(yè)ID是否與在PMT 表解析得到的頁(yè)ID 一樣。如果一樣的話,說(shuō)明正是要找的包,反之則說(shuō)明是一個(gè)無(wú)效的PES 包,則丟棄該包。

  3.3 字幕圖層顯示模塊

  當(dāng)用戶在收看節(jié)目,啟動(dòng)字幕功能時(shí),用戶看到的是節(jié)目畫(huà)面和字幕畫(huà)面的疊加,OSD 界面顯示技術(shù)是指在圖像畫(huà)面上疊加圖文顯示,使屏幕提供更多附加信息。

  為了控制字幕在屏幕上的正常顯示,需要利用OSD 驅(qū)動(dòng)模塊提供的區(qū)域操作功能。在該字幕顯示實(shí)現(xiàn)中主要用到的OSD 函數(shù)接口有OSD 初始化函數(shù)、區(qū)域清除函數(shù)、OSD 區(qū)域創(chuàng)建函數(shù)、OSD 區(qū)域顯示函數(shù)和OSD 區(qū)域隱藏函數(shù),在該系統(tǒng)中以回調(diào)函數(shù)的形式利用這些接口函數(shù)。在系統(tǒng)初始化中,必須先初始化字幕OSD 區(qū)域,獲取OSD 層的設(shè)備id,注冊(cè)字幕區(qū)域創(chuàng)建回調(diào)函數(shù)、字幕區(qū)域顯示回調(diào)函數(shù)、字幕清屏回調(diào)函數(shù)和字幕區(qū)域隱藏回調(diào)函數(shù)。把這些函數(shù)的地址加以保存,當(dāng)需要相應(yīng)的OSD 服務(wù)時(shí),就通過(guò)函數(shù)指針調(diào)用相應(yīng)的函數(shù)。

  字幕顯示可以根據(jù)分析PES 包得到時(shí)間信息,并通過(guò)這個(gè)時(shí)間信息與音視頻同步。在每區(qū)域數(shù)據(jù)解碼完畢后,顯示模塊創(chuàng)建相關(guān)的OSD 區(qū)域,分配內(nèi)存空間,把解析完的數(shù)據(jù)連同該數(shù)據(jù)要顯示的時(shí)間PTS 送到顯示緩沖區(qū)。此時(shí),根據(jù)當(dāng)前系統(tǒng)時(shí)鐘STC 和存儲(chǔ)的PTS 創(chuàng)建一個(gè)定時(shí)器,如果顯示時(shí)間已經(jīng)超過(guò)了系統(tǒng)時(shí)間,那么顯示緩沖區(qū)的數(shù)據(jù)就要清空掉;反之,當(dāng)顯示時(shí)間到的時(shí)候,定時(shí)器被觸發(fā),顯示內(nèi)容輸出到OSD 緩沖區(qū),并結(jié)合顯示持續(xù)時(shí)間來(lái)進(jìn)行字幕的顯示。顯示狀態(tài)流程如圖5 所示。

圖5 顯示狀態(tài)流程

圖5 顯示狀態(tài)流程

  由于字幕的顯示和機(jī)頂盒菜單界面的顯示都是基于區(qū)域的,對(duì)于不同的應(yīng)用,不能同時(shí)往同一個(gè)位置填充不同的數(shù)據(jù)。因此,在字幕顯示前要把菜單OSD 顯示區(qū)域隱藏起來(lái)。當(dāng)字幕正在顯示又需要使用系統(tǒng)菜單時(shí),調(diào)用字幕區(qū)域隱藏函數(shù),設(shè)置顯示標(biāo)志為非需要顯示狀態(tài)。在菜單顯示結(jié)束后,調(diào)用字幕區(qū)域顯示函數(shù),恢復(fù)字幕顯示。采用這種方式可以解決字幕顯示和界面顯示的沖突。

  3.4 字幕用戶控制模塊

  控制模塊是人機(jī)交換模塊,主要負(fù)責(zé)用戶請(qǐng)求的處理。本模塊的首要任務(wù)是將用戶的請(qǐng)求進(jìn)行消息分類(lèi),再根據(jù)不同的消息與相關(guān)的模塊進(jìn)行通信,消息可分為以下幾種:獲取字幕控制信息消息、啟動(dòng)及停止字幕數(shù)據(jù)濾波消息、字幕數(shù)據(jù)解碼及停止解碼消息、OSD 區(qū)域顯示消息、OSD 區(qū)域清除消息和OSD 區(qū)域隱藏消息。

  在機(jī)頂盒系統(tǒng)軟件中,字幕的創(chuàng)建通過(guò)遙控器上的字幕鍵(SUBT)觸發(fā),發(fā)送消息啟動(dòng)數(shù)據(jù)控制信息提取模塊,解析完畢后顯示多語(yǔ)言字幕列表,供用戶選擇所要接收的語(yǔ)言(上下鍵選擇及OK 鍵觸發(fā))。用戶一旦選擇后,啟動(dòng)字幕數(shù)據(jù)提取模塊,進(jìn)行字幕PES數(shù)據(jù)流的濾波和緩沖,同時(shí)啟動(dòng)顯示模塊,根據(jù)各種時(shí)間進(jìn)行顯示或者清屏。字幕的關(guān)閉由遙控器上的退出(EXIT)鍵觸發(fā),進(jìn)而控制停止濾波、停止數(shù)據(jù)解碼,釋放字幕功能創(chuàng)建的各內(nèi)存空間,停止字幕顯示。

  在顯示字幕的同時(shí),進(jìn)行界面菜單操作分成兩種情況。一種是菜單操作進(jìn)行了調(diào)臺(tái),用戶控制模塊發(fā)送消息關(guān)掉字幕功能、停止濾波、釋放字幕功能創(chuàng)建的各內(nèi)存空間;另一種情況是非調(diào)臺(tái)的其他菜單操作,當(dāng)界面操作結(jié)束后則發(fā)送字幕恢復(fù)顯示消息給圖層顯示模塊恢復(fù)顯示。

  4 結(jié)束語(yǔ)

  本文采用模塊化的設(shè)計(jì)思路,按照功能將機(jī)頂盒字幕解碼系統(tǒng)分為四個(gè)模塊,即數(shù)據(jù)提取、數(shù)據(jù)解碼、數(shù)據(jù)顯示和用戶控制模塊。在各個(gè)模塊的實(shí)現(xiàn)上按照中間件和驅(qū)動(dòng)層兩個(gè)方面進(jìn)行程序設(shè)計(jì),使得編寫(xiě)的代碼便于理解閱讀,同時(shí)又易于實(shí)現(xiàn)不同平臺(tái)間移植。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉