|
歐洲采用的Teletext 標準叫做"ITU-R System B Teletext",標準文檔是EN300472和EN300706.該標準支持以下特性: (1) 24X40的文本字符顯示,也支持簡單的圖象信息的顯示. (2) 支持多頁碼,應(yīng)用程序可以自由切換到任意選定的頁. (3) 支持多語言,可以在teletext中指定所使用的語言. (4) 文本支持自定義背景色,自定義前景色.支持長度,寬度加倍(double width,double height) (5) 所有數(shù)據(jù)采用了奇偶校驗和漢明碼編碼,具有比較強的錯誤處理功能. (6) 格式基本兼容模擬TTX,支持VBI插入teletext數(shù)據(jù). Teletext數(shù)據(jù)是在TS流中和Video,Audio數(shù)據(jù)一起傳送的.EN300472規(guī)定采用以下方法識別teletext數(shù)據(jù)的PID:如果 PMT段中的stream_type==0xbd(private_stream_1),那么這個數(shù)據(jù)流就是teletext或者subtitle數(shù)據(jù) (統(tǒng)稱為VBI數(shù)據(jù),具體區(qū)分還需要在teletext分析中處理),VBI數(shù)據(jù)開始于PES包的數(shù)據(jù)部分. Teletext在PES包中的格式如下: 各字段含義: data_identifier:數(shù)據(jù)標志符,如果是teletext必須等于0x10~0x1f. data_unit_id:用來標志是teletext數(shù)據(jù)還是subtitle數(shù)據(jù).0x02表示是teletext,0x03表示是subtitle. data_field()是標準的teletext格式的數(shù)據(jù)包,參考下圖.實際上,一個data_field就是teletext的一行數(shù)據(jù). data_field()的格式如下: 各字段含義如下: reserved_future_use:2bits保留未來使用 field_parity:1bit的奇偶標志,'1'表示是偶數(shù)場(下半場),'0'表示奇數(shù)場(上半場) line_offset:5bits,在VBI插入時指定的場線數(shù)據(jù).(以上兩個參數(shù)在使用VBI硬件插入才需要使用) framing_code:8bits的幀同步代碼,必須是0xe4. magazine_and_packet_address:16bits,指定當前傳送的雜志號碼和包號碼,采用的是漢明8/4編碼. 其中的包號碼(Packet address)實際上代表的是TTX頁面的行號碼(0-24). data_block:320bits,40Bytes的數(shù)據(jù)塊,全部采用奇偶校驗,對應(yīng)TTX頁面的40列,范圍是0x00-0x7f(最高位是奇偶校驗位).把這部分的數(shù)據(jù)全部提取出來,就可以獲得一個行的全部數(shù)據(jù)(TTX是24行X40列). 因此,解teletext的軟件一般采用這樣的流程: (1) 分析PMT表,獲取代表teletext的PID,標注為TTX_pid; (2) 在解復用程序中過濾PID==TTX_pid的數(shù)據(jù),解出PES的數(shù)據(jù)部分. (3) 把第二步得到的數(shù)據(jù)部分全部保存到一個緩沖區(qū),直到所有的數(shù)據(jù)全部緩沖完畢. (4) 解出packet address,該數(shù)據(jù)代表當前的行號(0-24).如果是0,則本個data block包含的是主頁面代碼和子頁面代碼.如果不是0(1-24),則說明data block是對應(yīng)頁的列數(shù)據(jù)(40個字節(jié)的ASCII),把這些數(shù)據(jù)解出保存到緩沖區(qū).(這里必須和PID過濾一樣,過濾主頁面號碼和子頁面號碼,即沒有選擇的頁面忽略掉) (5) 循環(huán)第(4)步直到所有的列數(shù)據(jù)全部解出. (6) 把緩沖區(qū)中的24X40的數(shù)據(jù)顯示出來.一般是在RAM中定義一個unsigned char TTX_DATA[24][40]數(shù)組保存. Teletext是如何支持自定義前景色和背景色等特性的呢?實際上非常簡單,就包含在每一行數(shù)據(jù)的40個字節(jié)中.我們知道可顯示ASCII的范圍是0x20~0x7f,小于0x20的代碼在teletext中做為控制字符(需要在顯示程序中處理),具體規(guī)定如下: 0x00-0x07:設(shè)置前景色,顏色分別是黑,紅,綠,黃,藍,洋青,洋藍,白(設(shè)置后生效,也就是說,顯示程序遇到這些代碼,在隨后的顯示中必須改變前景色到對應(yīng)的顏色) 0x08:開始閃爍功能,設(shè)置后生效. 0x09:結(jié)束閃爍功能,設(shè)置后生效 0x0a:BOX結(jié)束,設(shè)置后生效. 0x0b:BOX開始,設(shè)置后生效. 0x0c:正常象素大小,設(shè)置后生效. 0x0d:寬度加倍,設(shè)置后生效. 0x0e:長度加倍,設(shè)置后生效. 0x0f:寬度和長度都加倍,設(shè)置后生效. 0x10-0x17:設(shè)置馬塞克顏色,顏色代碼同0x00-0x07,設(shè)置后生效. 0x18:以后固定是顯示空,直到遇到其他顏色屬性.設(shè)置后生效. 0x19-0x1b:請參考EN300706標準. 0x1c:設(shè)置黑背景色.設(shè)置后馬上生效. 0x1d:設(shè)置新的背景色,下一個字符指定背景顏色,代碼同0x0-0x07. 0x1e:保持馬塞克功能,設(shè)置后生效. 0x1f:取消馬塞克功能,設(shè)置后生效. 以上所描述的控制字符作用范圍僅僅是一行.也就是說如果遇到新行,則設(shè)置全部恢復默認設(shè)置,EBU teletext的默認設(shè)置是:黑背景色,白前景色,無閃爍,無BOX,正常的象素大小,無任何馬塞克功能.因此,teletext的顯示程序必須一個字 符一個字符的分析數(shù)據(jù),直到所有的數(shù)據(jù)全部顯示完畢. 實際上,EBU teletext使用了4個規(guī)格,包括V1.0,V1.5,V2.5,V3.5.V1.0只支持ASCII文本和基本屬性,其他規(guī)格還支持簡單圖象和Objects,請參考EN300706獲取更多的信息. EBU teletext格式使用了漢明編碼方法,具體編碼格式請參考EN300706. 下面可以參考一下<<Seekfor MPEG-2 decoder>>中處理teletext的效果: (1) 菜單上的數(shù)字是主頁面,下一級菜單是子頁面: (2)teletext文字疊加在Video上的透明顯示效果: (3)teletext文字疊加在Video上不透明的顯示效果: (4)切換到其他頁面的顯示效果:
|