馮少奇,丁春峰
(鄭州大學河南激光與光電信息技術重點實驗室,河南 鄭州 450052)
以ARM為代表的微處理器設計技術的發展,極大地推動了嵌入式設備上多媒體處理技術的進步。尤其是最新推出的ARM11系列微處理器,它包含了更多的多媒體處理指令來加速視頻處理。S3C6410作為采用ARM11架構的低成本、低功耗、高性能的微處理器,內部集成了包括運動圖像處理、顯示控制和圖像縮放等多個功能強大的硬件加速器。其中多格式編解碼器(Multi Format Codec,MFC)支持 MPEG-4、H.263、H.264編解碼和 VC1解碼。使用S3C6410處理器進行視頻處理無需開發視頻編解碼算法,設計人員可以將精力放在應用軟件的開發上,從而提高開發效率。
Windows Embedded CE 6(以下簡稱WINCE)作為一個為嵌入式微處理器設計的操作系統,它通過添加各種組件來實現不同的功能。DirectShow是WinCE系統的一個多媒體流處理組件,可以很好地實現視頻的采集壓縮和回放等功能[1]。因此在使用S3C6410處理器的 WINCE系統上,可以很方便地使用DirectShow對CMOS和CCD攝像頭輸出的視頻使用MFC壓縮處理。
在設計MPEG-4視頻壓縮濾波器之前,首先需要熟悉DirectShow,然后制定整個采集壓縮過程的濾波器圖表,最后完成濾波器的設計。
系統結構如圖1所示,可以簡單地分為輸入、邏輯處理和輸出三部分,其中方框內部的邏輯處理部分是該系統的核心。其包括源濾波器、傳輸濾波器和渲染濾波器以及管理它們的濾波器圖表管理對象。

圖1 DirectShow系統結構圖
在應用程序中,將若干個濾波器按照特定的方式連接,從而實現不同的功能。濾波器之間通過pin連接,上游濾波器的輸出pin連接下游濾波器的輸入pin,這些連接在一起的一組濾波器稱為濾波器圖表,其使用的濾波器以及它們之間的連接決定了多媒體數據流的整個處理過程[2]。
在使用S3C6410處理器的WINCE系統上實現視頻采集壓縮,就要定制一個濾波器圖表,其包括整個圖表中需要的濾波器以及它們之間的連接。根據系統功能的要求,定制完成的濾波器圖表,如圖2所示。其中各個濾波器具有不同的功能,它們之間的連接代表了數據處理的流程。

圖2 MPEG-4視頻采集壓縮的濾波器圖表
其中Video capture source作為源濾波器,由CCD或者CMOS攝像頭經過軟件層封裝生成的1個視頻源濾波器,該濾波器提供了3個輸出pin,分別是Capture pin,Still pin,Preview pin。不同的pin具有不同的功能,Capture pin用于捕獲視頻流,傳遞給下游濾波器的輸入pin進行MPEG-4算法的視頻壓縮處理。Preview pin用于視頻預覽,該pin連接下游的Video Renderer。Video Renderer是基于DirectDraw技術封裝的視頻渲染濾波器,用于在顯示設備上預覽視頻。該濾波器往往由操作系統自帶,無須自行設計。
與Video capture source的capture pin相連接的MFC Encoder濾波器便是將要設計的MPEG-4視頻壓縮濾波器,它接收上游傳遞來的YUV420格式的原始視頻,由MFC壓縮處理后通過輸出pin傳遞給下游的Dump Filter。Dump Filter是DirectShow附帶的一個示例濾波器,它接收數據并保存到文件存儲系統中,生成原始的數據文件。這里需要注意兩點:第一,存儲系統可以是硬盤、Flash存儲器、SD卡等;第二,在當前的濾波器圖表中,Dump filter接收MFC Encoder編碼后的視頻流,生成的文件后綴為m4v。
縱觀整個濾波器圖表,除了MFC Encoder需要自行設計,其他濾波器已由系統提供,因此要完成視頻壓縮,MFC Encoder的設計成為關鍵環節,下面將詳細闡述該濾波器的設計方法及其應用。
S3C6410的多媒體協處理器通過一個單一的硬件架構支持 H.263P3,MPEG-4 Single Profile,H.264 Baseline Profile和VC1 Main Profile的多格式的視頻編解碼,它可以同時支持一路視頻編碼和三路視頻解碼的多方調用,也可以通過時分復用的方式在進行一路MPEG-4視頻編碼的同時,支持另一路H.264視頻流的解碼。它內嵌了一個16位的DSP處理器用于處理數據比特流和控制視頻編解碼硬件。該協處理器在編解碼性能方面十分出色,在全雙工模式下支持高達30 f/s的VGA分辨力的視頻編解碼,在半雙工模式下支持高達30 f/s的720×480分辨力和25 f/s的720×576分辨力的視頻編解碼。
在操作系統層和軟件應用層,三星提供了軟件包來支持多媒體協處理器的應用,它包括位于操作系統層的多媒體協處理器驅動和位于應用軟件層的多格式視頻編解碼庫。其軟件架構如圖3所示。在下部操作系統區域,多媒體協處理器驅動為操作系統調用多媒體協處理器提供了底層軟件支持,同時為上層的用戶區域提供了3個API接口函數:CreateFile(open),DeviceIoControl(ioctl),Close-Handle(close)。其中CreateFile創建一個MFC應用實例,DeviceIoControl根據輸入的參數不同進行各種視頻格式的編解碼操作,CloseHandle關閉當前的MFC應用實例。位于上方用戶區域的多格式視頻編解碼庫利用操作系統區域提供的上述3個API接口函數,進一步的封裝形成了支持多種視頻編解碼格式的靜態庫,應用程序開發者使用該靜態庫提供的一系列函數可以很方便地調用多媒體協處理器。目前該庫支持的視頻解碼格式為MPEG-4 Single Profile,H.263 P3,H.264 Baseline Profile,VC1 Main Profile,而支持的視頻編碼格式為MPEG-4 Single Profile,H.263 P3,H.264 Baseline Profile[3]。由此可以看出,該設計的MFC Encoder位于圖3中最上方的用戶多媒體應用程序框架內,主要使用編解碼庫中的MPEG-4 Single Profile視頻編碼函數部分。

圖3 S3C6410多格式視頻編解碼軟件架構
在WinCE中DirectShow作為一個組件被添加到操作系統中,其SDK提供了一套基類源代碼,這些源代碼大大降低了濾波器的設計難度。首先需要配置環境,該濾波器的設計工具為Platform Builder for WinCE 6.0(以下簡稱PB6),它是作為VS2005的一個插件來安裝使用的。在PB6下開發的濾波器實質上是一個Win32動態鏈接庫,開發環境的配置是在當前工作目錄下的Sources文件中完成。Sources文件中定義了一些變量,Build工具在編譯源代碼的時候利用它們作為參數進行編譯和鏈接,Nmake工具利用這些參數生成不同類型的輸出文件[4]。
對于MFC Encoder濾波器的Sources文件,首先是輸入輸出參數的基本設置,分別是輸出目標的名稱(不包括擴展名)TARGETNAME、與之相關的.def文件名稱TARGETDEFNAME、編譯后目標文件存放路徑 RELEASETYPE、輸出文件類型為dll以及dll文件的入口函數DLLENTRY,然后是INCLUDES,指定了額外的要包含的頭文件的路徑。這里需要包含多格式視頻編解碼庫源文件的MFCLib目錄,這樣在編譯和鏈接階段編譯器才能找到需要的文件。
其中SOURCELIBS指定了編譯時需要靜態鏈接的庫文件,包括DirectShow基類庫和WinCE系統庫。接下來是TARGETLIBS,指定了編譯時需要動態鏈接的庫文件,除了包含所有SOURCELIBS包含的庫以外,還需要包含S3C6410的多格式視頻編解碼庫,文件名為6410MFCLib_s.lib。最后是 SOURCES和 FILE_VIEW_INCLUDES_FOLDER的設置,SOURCES包含了當前項目所有的源文件和資源文件,而FILE_VIEW_INCLUDES_FOLDER包含了所有的頭文件。
設計濾波器,選擇一個合適的父類是至關重要的。該設計中的濾波器MFC Encoder接收YUV420格式的視頻數據,經過S3C6410的MFC編碼后形成M4V格式的視頻數據并以字節流的形式輸出,因此父類選擇CTransformFilter。它有一個輸入pin,支持的媒體格式為:主媒體類型MEDIATYPE_Video、子媒體類型MEDIASUBTYPE_YV12,一個輸出pin,支持的媒體格式為:主媒體類型MEDIATYPE_Stream、子媒體類型MEDIASUBTYPE_m4v。在該設計中,采用將應用框架和應用邏輯分離的設計理念,這里的濾波器是一個傳輸濾波器,即支持“輸入→編碼處理→輸出”的應用框架。而應用邏輯部分,即MFC編碼的過程。
濾波器框架是指完成濾波器功能的一系列必要的操作函數。該設計中的濾波器MFC Encoder父類為CTransformFilter,必須實現以下幾個函數的重載操作:
1)CheckInputType
此函數檢查輸入媒體類型,這里接受的媒體類型為YUV420格式的視頻數據。當確定接受媒體類型之后,從類型為CMediaType的輸入參數的指針變量mtIn中獲取輸入視頻的寬度、高度、幀速等信息。
2)CheckTransform
該函數不實現任何功能,因此只用一句return S_OK。3)DecideBufferSize
該函數用于內存的分配,值得注意的是視頻接收緩沖區大小的設置,S3C6410的MFC手冊的建議值是720×480×4×3 byte,因此緩沖區的大小設置為720×480×4 byte即1382400 byte,緩沖區的個數設置為3個。
4)GetMediaType
該函數用于返回當前濾波器支持的輸出媒體類型,本濾波器輸出的媒體類型為M4V格式的視頻數據,因此可以在此設置輸出媒體類型。
5)Receive
該函數接收輸入的YUV420格式的視頻數據,然后傳給應用邏輯部分的函數MP4Encode編碼壓縮處理,因此該函數是實現視頻編碼壓縮的關鍵。
6)Transform
該函數將編碼壓縮后的數據傳至輸出pin,同時將輸入端視頻數據的時間戳、播放時間、是否為同步點、媒體類型、是否為預滾動數據、是否為連續幀等屬性拷貝至輸出端。
以上是應用框架部分需要重載函數的設計,其他部分的設計方法與設計一個普通的傳輸濾波器相同,下文主要介紹應用邏輯部分的設計。
應用邏輯即實現邏輯功能的部分,首先采集攝像頭視頻數據后送入MFC編碼壓縮,然后送出編碼后的數據流。該濾波器使用MP4Encode函數來實現視頻壓縮,主要通過調用S3C6410的多格式視頻編解碼庫中的函數來實現視頻壓縮,使用的函數如下:
1)SsbSipMPEG4EncodeInit
該函數創建一個MPEG-4編碼實例,輸入參數包括編碼類型(MPEG-4或H.263)、圖像寬度和高度、幀速和比特率,函數返回值為MPEG-4編碼實例的句柄。
2)SsbSipMPEG4EncodeExe
該函數將YUV420格式的視頻數據編碼為MPEG-4視頻流。
3)SsbSipMPEG4EncodeGetInBuf
獲取編碼輸入緩沖區的內存地址,包括指向緩沖區的地址指針變量,以及以字節為單位的大小。
4)SsbSipMPEG4EncodeGetOutBuf
獲取編碼輸出緩沖區的內存地址,包括指向緩沖區的地址指針變量,以及以字節為單位的大小。
5)SsbSipMPEG4EncodeDeInit
該函數釋放當前MPEG-4編碼實例所占用的資源,參數為當前實例的句柄。
函數MP4Encode的具體工作流程如圖4所示,當所有設計工作完成之后,通過PB6的build工具編譯源文件,生成名為MFCEncFilter.dll的動態庫文件,這就是設計完成的S3C6410下的MPEG-4視頻壓縮濾波器MFC Encoder。
與桌面操作系統不同的是,WinCE需要自己填寫注冊信息,而不是使用自注冊函數DllRegisterServer。在platform.reg文件中,為該濾波器寫入注冊信息,包括濾波器的名稱、CLSID、對應的dll文件名稱、輸入pin的屬性和媒體類型、輸出pin的屬性和媒體類型等。
在WinCE中注冊之后,就可以使用圖2定制的濾波器圖表進行視頻采集壓縮處理。通過測試,在640×480分辨力的30 f/s的情況下,視頻編碼效率高,壓縮后的圖像質量令人滿意。經過統計,在運動場景下398幀的YUV420格式的視頻數據大小為175 Mbyte,經過編碼壓縮后的大小為 5.18 Mbyte,壓縮比率約為 35∶1[5]。
通過整個設計過程可以看出,在WinCE系統下設計一個基于DirectShow架構的硬編碼濾波器,首先必須詳細地了解該多媒體處理器的硬件架構,然后充分地熟悉其驅動程序以及提供的編解碼庫,從而為后續封裝設計打下堅實的基礎。而后要熟悉DirectShow架構,掌握DirectShow濾波器的設計方法,最后利用編解碼庫設計濾波器。因此,對多媒體處理器軟硬件的熟悉和DirectShow濾波器設計方法的掌握是該濾波器設計的關鍵。

圖4 MP4Encode函數流程圖
[1]何宗鍵.Windows CE嵌入式系統[M].北京:北京航空航天大學出版社,2006.
[2]陸其明.DirectShow開發指南[M].北京:清華大學出版社,2003.
[3]ISO/IEC 14496,MPEG-4 第10 部分:高級視頻編碼 AVC[S].1998.
[4]汪兵.Windows CE嵌入式高級編程及其實例詳解[M].北京:中國水利水電出版社,2008.
[5]宋睿,姜秀華,史惠.移動多媒體廣播壓縮域視頻質量客觀評價[J].電視技術,2010,34(S1):204-206.