• 沒有找到結果。

輸出端模組架構

第四章 輸入端與輸出端模組

4.4 輸出端模組架構

輸出端模組與輸入端模組的架構類似,都是在處理 DSP 晶片與 DSP 晶片外部連接 硬體之間的訊號傳輸,所以在輸出端的架構上除了軟體層的模組外,也具備了硬體的區 塊來將影像訊號從 DSP 晶片的輸出。而輸出端在架構上主要包含了兩部分,第一部分 是影像從 DSP 晶片輸出前末端的軟體模組 tmVrenderGfxVo,以及此軟體模組所操控的 硬體區塊 MBS(Memory Based Scale)和 QVCP(Quality Video Composition Processor);第 二部分則是影像從 DSP 晶片輸出後所銜接的訊號類比數位轉換晶片,以及用來控制此 硬體區塊的軟體模組 tmVencAna,整體的輸出端架構如圖 4.20 所示。

輸出端在程式上的設定程序與輸入端類似,都必須要先取得與 DSP 晶片相連接的 硬體資訊,再來設定軟體層的模組。因此在設定上,應用層會先藉由 tmVencAna 模組的 函式來取得 D/A 晶片的資訊,而這些 D/A 晶片的資料則是在程式的一開始在對硬體初 始化時就註冊到 BSL 層裡,所以當 tmVencAna 模組中的函式在取得 D/A 晶片資訊時,

會直接到 BSL 層存放硬體資訊的陣列中讀取資料,並將取得的資料設定到自己的資料 結構裡儲存。而 tmVrenderGfxVo 模組的設定步驟則和一般模組的設定方式類似,透過 模組中的 OL 層函式來往下層設定模組的 Capabilities 以及 Instance 資料結構。

Application

tmVrendGfxVo tmVencAna TSSA

Input Pin

Display MBS HW Qvcp HW Codec (D/A)

Ex. 7104 BSL dlQvcp

dlMbs2

圖 4.20 輸出端分層與模組架構

53

輸出端與一般模組不同處在於輸出端操控了兩組硬體區塊 MBS 以及 QVCP,而輸 出端的影像資料主要也是交給這兩塊硬體來做處理,因此當輸出端模組啟動後,會至前 一個模組寫入資料的記憶體區塊中拿取影像資料,並啟動硬體暫存器的控制位元,將記 憶體中的資料直接交給硬體模組來處理。因此接下來就針對 MBS 以及 QVCP 這兩組硬 體模組的特色來做討論。

MBS(Memory Based Scalar)

MBS 這塊硬體模組主要的功能是轉換影像的格式或調整畫面的尺寸大小,MBS 模 組中的函式會直接至記憶體中讀取影像,經過影像的調整之後,再寫入記憶體中儲 存。而 MBS 在影像處理上功能列舉如下:

z 影像畫面的放大或縮小

z 將交織式(interlace)的畫面影像合成為整張的影像(frame)

z 顯示影像的長寬比例轉換

z 在影像取樣 4:2:0,4:2:2,4:4:4 格式上的轉換

z 色彩空間上的轉換

z 像素格式的轉換

由於影像的顯示是由輸出端模組 VrenderGfxVo 來控制,因此在顯示條件上若有用 到 MBS 所提供的影像處理功能,則會在 VrenderGfxVo 模組中呼叫 MBS 的函式來 做處理。除了輸出端模組會使用到 MBS 硬體區塊外,在 NDK 的程式資料庫中具有 一個的 TSSA 架構的軟體模組“tmVtransMbs2"用來控制 MBS 這塊硬體,而 tmVtransMbs2 模組在程式上的執行順序,通常是位於影像擷取模組與編碼模組之間,

對於要編碼的影像做一些畫面上的調整。

QVCP(Quality Video Composition Processor)

QVCP 是 DSP 晶片上用來處理影像顯示的硬體單元,也是影像訊號在輸出 DSP 晶 片前所必經的一個處理單元,是由上層的軟體模組 tmVrenderGfxVo 透過模組 DL 層的函式來設定執行內容。QVCP 主要提供了一個高解析度的影像輸出功能,影像 的類型除了攝錄到的影片外,還可以輸出磁碟中的圖片影像,因此在 QVCP 中會藉 由分層器(layers)來處理不同來源的影像,以及組合器(mixers)來將不同的資料合成

54

在同一個顯示畫面上。而 QVCP 所提供的影像處理功能列舉如下:

z 色彩的補償

z 反向伽瑪(gamma)值的校正

z 修正影像品質,例如讓色彩的明亮度(luminance)更明顯、色度濃度(chrominance) 的改善、膚色的校正、藍色成分的延伸、綠色成分的加強……等

z 水平軸上的比例的修正,讓影像的全景能夠呈現在螢幕上

z 影像顯示於不同螢幕上(例如 SD-TV、HD-TV)的顯示條件控制

z 降低雜訊的成分

當 MBS 與 QVCP 影像處理完畢後,便會將資料直接傳送給 D/A 晶片,將數位訊號 轉換為類比訊號,接著將影像輸出於螢幕上顯示。

55

第五章 實作驗證

本章首先會先針對模組與模組之間的傳輸方式進行探討,延續第三章對傳輸模組 IOD 的描述,藉由實際應用程式( exH264Codec.c )的執行,來測試模組之間在傳輸資料 時,如何操作 IOD 上的序列與 packet,並驗證傳輸模組的溝通方式;接下來則會以另一 個應用程式( exSvipDeinterlace.c )來測試,在此應用程式中所使用到的影像處理模組架構 較為特殊,因此會先對該影像處理模組進行介紹,並探討其資料的傳輸方式,接著會在 此影像處理模組上新增一個人臉偵測的功能函式,並載至 NXP 的 PCI Lite Demo 板上測 試是否能順利執行。在章節的順序上,5.1 節會以第一個應用程式的測試結果,來對 IOD 的序列以及 packet 的傳輸關係進行討論;5.2 節中則會討論第二個應用程式上模組的傳 輸架構,並對加入的程式片段進行說明。

5.1 傳輸數據驗證

模組之間溝通主要是透過傳輸模組 IOD 中的 packet 來傳遞資料,在第三章對傳輸 模組的探討中有提到,當模組要讀取或寫入資料時,會將 IOD 結構成員上所存放的序列 編號傳入到 OSAL 層上,到存放所有序列資料的陣列中尋找該編號所代表的序列,再藉 由 psos 的系統函式來取得該序列上的 packet。其中 IOD 上傳輸的序列可分為兩種:full queue 以及 empty queue,在 full queue 上傳送的是寫有資料的 packet,也就是 packet 上 所記錄的 buffer 記憶體區塊中存有影像資料;而 empty queue 上傳送的則為空的 packet,

代表該 packet 所記錄的 buffer 記憶體區塊中沒有影像資料。假設目前系統上使用到 A、

B、C 三個影像處理模組,如圖 5.1 所示,在兩兩模組之間會有一個 IOD 來做資料傳輸,

因此在這個系統上會存在兩個 IOD。其中每個 IOD 上所傳輸的序列都會具備一組序列 編號,以數字(1)、(2)、(3)、(4)……來標示序列,此編號是在序列的建立過程中,依照 序列建立的前後順序所標示上的,會記錄在 IOD 的的結構成員結構成員 full queue 以及 empty queue 中( 序列的建立過程在第三章的 2.2 小節中有詳細討論 )。因此在模組傳輸 資料的過程中,當模組要讀取影像資料時,就會將連結於模組輸入端 IOD 所記錄的序列 編號傳入系統中,來取得儲存於序列上 packet 的資訊,藉由 packet 上所記錄的 buffer 位址進而取得影像資訊,例如圖 5.1 中的 Component B,輸入的影像資訊會存放在 IOD 1 的序列上,所以當 Component B 要讀取資料時,就會將 IOD 1 上所記錄的序列編號傳入 系統中,由系統函式來取得該序列上所儲存 packet;同樣的當模組要將資料傳遞給下一

56 如 packet 數量、packet id、buffer 數量、buffer 尺寸大小……等資訊來設定的。在設定好 packet 的結構參數之後,系統上會再根據 buffer 尺寸的設定值,到實體記憶體上分配記 憶體區塊,並將 buffer 所分配到的記憶體位址設定到 packet 的結構參數中,讓 packet 上能夠記錄影像資料所存放的位址,整個 IOD、packet、buffer 的連結關係如圖 5.2 所示。

Component IOD 1 B

empty queue (2) full queue (1)

IOD 2

empty queue (4) full queue (3) Component

57

透過這樣的 queue、packet、buffer 結構關係,在系統上首先會將建立好且尚未儲存 資料的 packet 結構位址依序設定到 empty queue 中,如此一來在應用程式開始執行前,

所有 packet 都會放置在 empty queue 上就緒,等待模組來拿取並寫入資料。一旦程式開 始運作後,模組就會不斷至 empty queue 中拿取空的 packet 來寫入影像資料,當模組把 影像資料儲存到 packet 所指定的記憶體區塊後,接著就會將此 packet 的資料結構位址填 到 full queue 上,也就是將此 packet 標示為已使用的部分,這樣下一級的模組就可以直 接到 full queue 上拿取 packet,並由 packet 取得影像所儲存的位址。當下一級模組讀取 完影像資料後,就會將該 packet 所指定記憶體區塊中的資料清空,並將此 packet 的資料 結構位址填到 empty queue 上,也就是標示為未使用的 packet,繼續提供給前一級的模 組來寫入資料。

因此在這部分便以 NDK6.1 所提供的應用程式“exH264Codec.c"來進行測試,觀 圖 5.3 queue、packet 與 buffer 的結構關係

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

empty queue full queue

packet size =16 - byte

*用來標示所傳輸的 packet 資訊,包括存放 packet 資料結 構的位址、在 packet 處理程序上的旗標。

buffer

1 2 3 4 5 6

buffer size

*在每個 packet 結構中存有 buffer 的位址、數量、size 等資料

1 2 3 4 5 6

packet

size of packet structure

0

58

察 queue、packet 以及 buffer 之間的關係。在“exH264Codec.c"這個應用程式中,定義 了六個影像處理模組,因此在這些模組之間總共會使用到五個 IOD 來做資料的傳輸,表 5.1 即為在程式上為這五個 IOD 定義的傳輸單位的設定值,包含了 queue 的名稱、代號、

packet 數量、在序列上所能傳輸的 packet 數 ( Queue size )、以及 buffer 的尺寸大小。

Queue Queue size Buffer size

IOD_1 Full Queue –

Name [FS2M],No. 0 Empty Queue –

Name [ES2M],No.1

Packet 數= 12

Name [M2EE],No.3

Packet 數= 15

Name [E2RE],No.5

Packet 數= 8

Name [E2DE],No.7

Packet 數= 25

Name [DRE0],No.9

Packet 數= 19

Queue size = 19+ 32 = 51

773376

由於建立好 packet 在模組開始運作前,皆為未使用的狀態,並存放於 empty queue 中,因此就藉由這個時機印出了每個 IOD 上 empty queue 所儲存的資料,也就是 IOD 中 所有 packet 的資料結構位址。表 5.2 中則分別列出了三個 IOD:IOD 1、IOD 2、IOD4 中前五個 packet 與 buffer 的位址資訊。

表 5.1 IOD 的傳輸單位設定

59

1 -645249612 -657570432 -657224704 2 -657699012 -656878976 -656533248 3 -645249480 -656187520 -655841792 4 -657698880 -655496064 -655150336 5 -645249348 -654804608 -654458880 IOD 2 &

Queue.3

1 -645248428 -645247360 -644901632 2 -657696560 -644555904 -644210176 3 -645248296 -643864448 -643518720 4 -657696428 -643172992 -642827264 5 -645248164 -642481408 -642135680 IOD 4 &

Queue.7

1 -657692176 -618216064 2 -657692060 -617167360 3 -618218760 -616118656

4 -657692024 -615069952

5 -618218564 -614021248

觀察表 5.2中的數據,可發現在buffer位址也就是記憶體位址的分配上,兩兩差距皆 為該IOD所定義的buffer尺寸大小再加上128 - byte,在IOD 1以及IOD 2中buffer是用來儲 存一張影像的畫面,因此大小即為影像畫面的尺寸345600 ( 720×480 ) - byte,而IOD 4由 在從full queue上讀取packet的資料時,是否也有操作到同一個packet。

表 5.2 packet與buffer位址

差距=345728,為 IOD 2 所定義的 buffer size : 345600+128

差距=345728,為 IOD 1 所定義的 buffer size : 345600+128

差距=1048704,為 IOD 2 所定義的 buffer size : 1048576+128

60

在此應用程式“exH264Codec.c"的執行上,由於執行的功能選擇,在程式實際的 運作上只有使用到五個模組來做處理,因此模組之間只會使用到四個IOD來傳輸資料,

分別為表 5.1中所列舉出來的IOD 1、IOD 2、IOD 4以及IOD 5,整體的模組架構如圖 5.4 所示。而接下來則整理了此應用程式在執行上,各IOD的接收端模組從full queue上拿取 的packet資料結構位址,在表 5.3裡列出了程式運作時的前十五筆數據,表格上的第一

分別為表 5.1中所列舉出來的IOD 1、IOD 2、IOD 4以及IOD 5,整體的模組架構如圖 5.4 所示。而接下來則整理了此應用程式在執行上,各IOD的接收端模組從full queue上拿取 的packet資料結構位址,在表 5.3裡列出了程式運作時的前十五筆數據,表格上的第一