數字機頂盒字幕解碼顯示系統設計方案
字幕PES 包解碼流程如圖4 所示。
圖4 字幕PES 包解析流程。
字幕解碼主要是對PES 包進行分析,包括PES包頭的檢測,PES 包頭信息的提取和字幕段的分析。
濾波得到一個PES 包后,首先判斷包頭是否合法,包括判斷前四個字節是否為0×000001BD 和PES包長度是否合法。
PES 包頭信息提取包括提取PTS、PES 包頭長度等。PTS 是該分組中承載的所要顯示的數據的顯示時間。根據包頭長度可以定位到PES 的負載位置,進而分析PES 包的負載。
分析PES 包的負載,首先判斷前兩個字節(定義字節和字幕流id)是否分別為0×20、0×00.若都符合,則可以確定這個包就是所要的封裝有字幕數據的PES 包。然后進入字幕段分析,字幕字段的內容有四種情況。先找到同步頭字節0×0f,再往后分析8bit 的段類型(segment_type),通過判斷該字節值來確定data_field()攜帶的是哪種類型的數據。當segment_type為0×10 時[3],該段為頁分段;當segment_type 為0×11時,則該段為區域分段;當segment_byte 為0×12 時,該段為CLUT 分段;當segment_byte 為0×13 時,該段為對象數據分段。最后,根據不同的類型調用不同的函數對各種類型的分段進行下一步的分析。
在頁分段的解析中找到該頁的頁id、顯示終止時間、顯示狀態、該頁由幾個區域組成、每個區域的區域id 和每個區域的水平垂直坐標,并把這些數據存儲起來。然后,根據從頁分段中獲取的區域的id 找到相應的區域分段,獲取該區域的寬高、像素深度、該區域填充的顏色、顏色表id(CLUT_id)、區域的數據對象個數、每個數據對象編號(object_id),并存儲這些數據。
最后,通過CLUT_id 找到顏色表,得到顏色的Y、Cr、Cb、T 值。通過object_id 找到對象數據的內容,包括編碼方式及編碼數據。用相應的解碼方式把這些相關的編碼數據解碼出來,并放入緩沖區。其中,在頁分析時,當解析出的該頁的顯示終止時間已經過了,則并不需要分析該頁,把跟與該頁相關的數據緩沖區進行清空操作。
由于一個PES 包可能包含多個字幕段(subtitling_segment),因此必須循環分析到最后一個字幕段。對每個字幕段分析完后,都要判斷下一個字節是下一個字幕段的同步頭(0×0f)還是字幕數據結束標志(0×ff)。若是下一個字幕段的同步頭則繼續分析,若是數據結束標志則代表該PES 包攜帶的負載分析完畢。最后,把得到的數據存放到顯示緩沖區,通過分析得到的PTS 創建一個定時時間,當時間到的時候從緩沖區中把數據讀出,并調用OSD 層驅動顯示數據。
在該解碼中,對于合成頁(composition_page_id)的處理分為兩種,這是因為同一個PID 可能傳送不同語言的字幕流,即語言不同的多個信息共享同一個PID流,所以在處理的時候可以把合成頁設置為濾波器的深度。當一路數據流進來的時候,對符合該PID 的PES 包中對應的頁ID 進行判斷,與頁ID 相同的就提取,不同的就丟棄,這是其中的一種解析提取方式。另一種方式是采用多種語言共用的PID 值去設置濾波器,把與該PID 值符合的字幕流提取出來,送去PES包解析。經過PES 解析出該頁ID,這時再判斷該頁ID是否與在PMT 表解析得到的頁ID 一樣。如果一樣的話,說明正是要找的包,反之則說明是一個無效的PES 包,則丟棄該包。
3.3 字幕圖層顯示模塊
當用戶在收看節目,啟動字幕功能時,用戶看到的是節目畫面和字幕畫面的疊加,OSD 界面顯示技術是指在圖像畫面上疊加圖文顯示,使屏幕提供更多附加信息。
為了控制字幕在屏幕上的正常顯示,需要利用OSD 驅動模塊提供的區域操作功能。在該字幕顯示實現中主要用到的OSD 函數接口有OSD 初始化函數、區域清除函數、OSD 區域創建函數、OSD 區域顯示函數和OSD 區域隱藏函數,在該系統中以回調函數的形式利用這些接口函數。在系統初始化中,必須先初始化字幕OSD 區域,獲取OSD 層的設備id,注冊字幕區域創建回調函數、字幕區域顯示回調函數、字幕清屏回調函數和字幕區域隱藏回調函數。把這些函數的地址加以保存,當需要相應的OSD 服務時,就通過函數指針調用相應的函數。
字幕顯示可以根據分析PES 包得到時間信息,并通過這個時間信息與音視頻同步。在每區域數據解碼完畢后,顯示模塊創建相關的OSD 區域,分配內存空間,把解析完的數據連同該數據要顯示的時間PTS 送到顯示緩沖區。此時,根據當前系統時鐘STC 和存儲的PTS 創建一個定時器,如果顯示時間已經超過了系統時間,那么顯示緩沖區的數據就要清空掉;反之,當顯示時間到的時候,定時器被觸發,顯示內容輸出到OSD 緩沖區,并結合顯示持續時間來進行字幕的顯示。顯示狀態流程如圖5 所示。
圖5 顯示狀態流程
由于字幕的顯示和機頂盒菜單界面的顯示都是基于區域的,對于不同的應用,不能同時往同一個位置填充不同的數據。因此,在字幕顯示前要把菜單OSD 顯示區域隱藏起來。當字幕正在顯示又需要使用系統菜單時,調用字幕區域隱藏函數,設置顯示標志為非需要顯示狀態。在菜單顯示結束后,調用字幕區域顯示函數,恢復字幕顯示。采用這種方式可以解決字幕顯示和界面顯示的沖突。
3.4 字幕用戶控制模塊
控制模塊是人機交換模塊,主要負責用戶請求的處理。本模塊的首要任務是將用戶的請求進行消息分類,再根據不同的消息與相關的模塊進行通信,消息可分為以下幾種:獲取字幕控制信息消息、啟動及停止字幕數據濾波消息、字幕數據解碼及停止解碼消息、OSD 區域顯示消息、OSD 區域清除消息和OSD 區域隱藏消息。
在機頂盒系統軟件中,字幕的創建通過遙控器上的字幕鍵(SUBT)觸發,發送消息啟動數據控制信息提取模塊,解析完畢后顯示多語言字幕列表,供用戶選擇所要接收的語言(上下鍵選擇及OK 鍵觸發)。用戶一旦選擇后,啟動字幕數據提取模塊,進行字幕PES數據流的濾波和緩沖,同時啟動顯示模塊,根據各種時間進行顯示或者清屏。字幕的關閉由遙控器上的退出(EXIT)鍵觸發,進而控制停止濾波、停止數據解碼,釋放字幕功能創建的各內存空間,停止字幕顯示。
在顯示字幕的同時,進行界面菜單操作分成兩種情況。一種是菜單操作進行了調臺,用戶控制模塊發送消息關掉字幕功能、停止濾波、釋放字幕功能創建的各內存空間;另一種情況是非調臺的其他菜單操作,當界面操作結束后則發送字幕恢復顯示消息給圖層顯示模塊恢復顯示。
4 結束語
本文采用模塊化的設計思路,按照功能將機頂盒字幕解碼系統分為四個模塊,即數據提取、數據解碼、數據顯示和用戶控制模塊。在各個模塊的實現上按照中間件和驅動層兩個方面進行程序設計,使得編寫的代碼便于理解閱讀,同時又易于實現不同平臺間移植。
評論