
大家好,今天我與大家分享的是英特爾GPU架構以及Quick Sync Video技術(shù)在FFmepge中的實(shí)現與使用。
1、處理器整體架構

大家知道,英特爾的圖形處理GPU被稱(chēng)為“核芯顯卡”,與CPU集成封裝在同一個(gè)芯片上,上圖展示的是芯片的內部結構。
1.1 發(fā)展

英特爾從lvy Bridge架構開(kāi)始就嘗試將GPU與CPU集成在中央處理芯片中并逐代發(fā)展到Skylake架構。初期的Ivy Bridge架構中GPU所占的面積非常小,而到現在的第五代處理器架構Skylake已經(jīng)實(shí)現十分成熟的GPU集成技術(shù),GPU在芯片中所占的面積已經(jīng)超過(guò)了一半。在未來(lái)我們將推出基于PCI-E的獨立顯卡,為PC帶來(lái)更大的圖像性能提升。
1.2 基礎功能模塊

上圖展示的是一款GPU所具備的一些基礎功能模塊。英特爾的核芯顯卡分為普通的Intel HD Graphics與性能強大的Intel Iris (Pro)Graphics,其中硬件結構的變化決定性能的高低。我們知道,GPU中的Slice個(gè)數越多,處理單元的組織方式越多,性能便越強大。Intel HD Graphics也就是GT2中只有一個(gè)Slice,而對于Iris系列中的GT3則有兩個(gè)Slice;GT3e相對于GT3增加了eDRAM使其具有更快的內存訪(fǎng)問(wèn)速度,而GT4e則增加到三個(gè)Slice。GPU的基礎功能模塊主要由EU以及相關(guān)的Media Processing(MFX)等組成。一個(gè)Slice中有三個(gè)Sub-Slice,Sub-Slice中包含具體的EU和Media Sampler模塊作為最基本的可編程處理單元,GPU相關(guān)的任務(wù)都是在EU上進(jìn)行。而Media Processing中還集成了一個(gè)被稱(chēng)為MFX的獨立模塊,主要由Media Format Codec(MFX)與VQE組成。MFX可將一些處理任務(wù)通過(guò)Fix Function打包,固定于一個(gè)執行單元中進(jìn)行統一的編解碼處理,不調用EU從而實(shí)現提高EU處理3D圖形等任務(wù)的速度。Video Quality Engine(VQE)提供De-interlace與De-Noise等視頻處理任務(wù),在編解碼中使用EU是為了得到更高的視頻編碼質(zhì)量。
1.3 結構演進(jìn)

上圖展示的是英特爾幾代核芯顯卡產(chǎn)品在結構上的變化。最早的Haswell架構也就是v3系列中的EU個(gè)數相對較少,最多為40個(gè);而到Broadwell架構的GT3中集成了2個(gè)Slice,EU個(gè)數隨之增加到48個(gè),圖像處理性能也隨之增強。從Broadwell架構發(fā)展到Skylake架構,除了EU與Slice格式增加的變化,MFX的組織也有相應改進(jìn)。Broadwell架構是將MFX集成于一個(gè)Slice中,一個(gè)Slice集成一個(gè)MFX;而到Skylake架構之后Slice的個(gè)數增加了但MFX的個(gè)數并沒(méi)有,此時(shí)的MFC便集成在Slice之外。隨著(zhù)組織方式的改變,核芯顯卡的功能也隨之改變:Skylake增加了HEVC的Decoder、PAK增加了基于HEVC的處理功能等改進(jìn)為核芯顯卡整體處理性能帶來(lái)了顯著(zhù)提升,第六代以后的核芯顯卡也都主要沿用GT3的架構組織。

上文介紹了核芯顯卡硬件上的模塊結構,接下來(lái)我將具體介紹Quick Sync Video Acceleration。從Driver分發(fā)下來(lái)的Command Stream回通過(guò)多條路徑在GPU上得到執行:如果命令屬于編解碼的Fix Function則會(huì )由MFX執行,部分與視頻處理相關(guān)的命令會(huì )由VQE執行,其他的命令則會(huì )由EU執行。而編碼過(guò)程主要分為兩部分:ENC與PAK。ENC主要通過(guò)硬件實(shí)現Rate Control、Motion Estimation、Intra Prediction、Mode Decision等功能;PAK進(jìn)行Motion Comp、Intra Prediction、Forward Quant、Pixel Reconstruction、Entropy Coding等功能。在目前的英特爾架構中,Media SDK通過(guò)API對硬件進(jìn)行統一的調度與使用,同時(shí)我們提供更底層的接口Flexible Encoder Interface(FEI)以實(shí)現更優(yōu)秀的底層調度與更好的處理效果。
2、軟件策略

接下來(lái)我將介紹英特爾的軟件策略。最底層的FFmpeg可允許開(kāi)發(fā)者將QSV集成進(jìn)FFmpeg中以便于開(kāi)發(fā),而Media SDK則主要被用于編解碼處理,FFmpeg可把整個(gè)多媒體處理有效結合。如果開(kāi)發(fā)者認為傳統的Media SDK的處理質(zhì)量無(wú)法達到要求或碼率控制不符合某些特定場(chǎng)景,那么可以通過(guò)調用FEI等更底層的接口對控制算法進(jìn)行優(yōu)化;最頂層的OpenCL接口則利用GPU功能實(shí)現邊緣計算等處理任務(wù),常見(jiàn)的Hybrid編碼方式便使用了OpenCL。除此之外OpenCL也可實(shí)現一些其他的并行處理功能,例如與AI相關(guān)的一些計算。
2.1 Media SDK

Media SDK分為以下幾個(gè)版本:Community Edition是一個(gè)包含了基本功能的部分免費版本,Essential Edition與Professional Edition則是具有更多功能的收費版本,可實(shí)現例如hybrid HEVC 編碼,Audio的編解碼、Video Quality Caliper Tool等諸多高級功能和分析工具的集合。
1)軟件架構

上圖主要介紹的是Media Server Studio Software Stack軟件架構,我們基于此架構實(shí)現FFmpeg的加速。
這里需要強調的是:
a)OpenGL (mesa)與linux內核一直是開(kāi)源的項目,但之前版本的MSS中存在一些私有的內核補丁,并對操作系統的或對Linux的內核版本有特殊要求。
b)HD Graphics Driver for Linux之前是一個(gè)閉源的方案,而現在的MSDK 和用戶(hù)態(tài)驅動(dòng)(iHD驅動(dòng))都已經(jīng)實(shí)現開(kāi)源。現在我們正在制作一個(gè)基于開(kāi)源版本的Release,未來(lái)大家可以通過(guò)此開(kāi)源平臺獲得更好的技術(shù)支持。
2)編解碼支持

關(guān)于編解碼支持,其中我想強調的是HEVC 8 bit 與10 bit的編解碼。在Gen 9也就是Skylake上并不支持硬件級別的HEVC 10 bit解碼,面對這種情況我們可以通過(guò)混合模式實(shí)現對HEVC 10 bit的編解碼功能。最新E3v6(Kabylake)雖然只有較低性能的GPU配置,但可以支持HEVC 10 bit解碼,HEVC 10 bit編碼功能則會(huì )在以后發(fā)布的芯片中提供。
2.2 QSV到FFmpeg的集成思路

FFmpeg集成的思路主要如下:
- FFmpeg QSV Plugins:將SDK作為FFmpeg的一部分進(jìn)行封裝,其中包括Decoder、Encoder與VPP Filter處理。
- VAPPI Plugin:Media對整個(gè)英特爾GPU的軟件架構而言,從最底層的linux內核,中間有用戶(hù)態(tài)驅動(dòng),對外的統一的接口就是VAAPI。Media SDK的硬件加速就是基于VAAPI開(kāi)發(fā),同時(shí)增加了很多相關(guān)的功能,其代碼更為復雜;而現在增加的VAAPI Plugin則會(huì )直接調用LibAV使軟硬件結合更為緊密。

接下來(lái)我將介紹如何將SDK集成到FFmpeg中,一共分為AVDecoder、AVEncoder、AVFilter三個(gè)部分。
1)AVFilter
AVFilter主要是利用硬件的GPU實(shí)現Video Processor功能,其中包括vpp_qsv、overlay_qsv、hwupload_qsv,其中我們重點(diǎn)開(kāi)發(fā)了overlay_qsv,vpp_qsv與hwupload_qsv。 如果在一個(gè)視頻處理的pipeline中有多個(gè)VPP的實(shí)例運行,會(huì )對性能造成很大的影響。我們的方案是實(shí)現一個(gè)大的VPP Filter中集成所有功能并通過(guò)設置參數實(shí)現調用,避免了多個(gè)VPP的實(shí)例存在。但是為什么將vpp_qsv與overlay_qsv分開(kāi) 這是因為無(wú)法在一個(gè)VPP實(shí)例中同時(shí)完成compositor和一些視頻處理功能(像de-interlace等)。英特爾核芯顯卡內顯存中的存儲格式為NV12, 和非硬件加速的模塊聯(lián)合工作時(shí),需要對Frame Buffer進(jìn)行從系統內存到顯卡顯存的復制過(guò)程,hwupload_qsv提供了在系統內存和顯卡內存之間進(jìn)行快速幀轉換的功能。
2)AVEncoder
AVEncoder目前支持H264、HEVC、MPEG-2等解碼的硬件加速。
3)AVDecoder
AVDecoder目前支持H264、HEVC、MPEG-2等協(xié)議的硬件加速。
最理想的方案是在整條視頻處理的Pipeline中都使用顯卡內存從而不存在內存之間的幀拷貝,從而達到最快的處理速度,但在實(shí)際應用中我們很多時(shí)候是做不到這一點(diǎn)。將MSDK集成進(jìn)FFmpeg中時(shí)需要解決內存轉換的問(wèn)題,例如VPP Filter不支持一些功能或原始碼流并不在Decoder支持的列表中。上圖中粉色與綠色的轉換表示的就是數據從顯存到系統內存再到顯存之間的轉換。我們在實(shí)踐中經(jīng)常會(huì )遇到處理性能的急劇變化,可能的原因就是一些非硬件處理的模塊和硬件加速的模塊存在與同一個(gè)pipeline中,從而對整體性能造成影響。這是因為進(jìn)行了額外的內存拷貝過(guò)程,一旦優(yōu)化不足則會(huì )極大影響性能。具體進(jìn)行內存分配時(shí)我們使用了hwcontext,這是FFmpeg在3.0之后增加的一個(gè)功能。我們基于FFmpeg中hwcontext的機制實(shí)現了hwcontext_qsv,從而對硬件的初始化與內存分配進(jìn)行很好的管理。
3、對比MSS與FFmpeg+QSV

下面我將分享MSS與FFmpeg+QSV的異同。二者支持相同的編解碼器與視頻處理。
二者的差異有:
- MSS 僅提供了一套庫和工具,用戶(hù)必須基于 MSS進(jìn)行二次開(kāi)發(fā);而FFmpeg 是一個(gè)流行的多媒體開(kāi)放框架, QSV的GPU加速只是其中的一部分。
- MSS的庫中提供 了VPP 接口,用戶(hù)要實(shí)現某些功能必須進(jìn)行二次開(kāi)發(fā)。而目前,FFmpeg+QSV已存在2個(gè)開(kāi)發(fā)好的Filter,并且在Filter中集成了MSS 支持的所有功能,并提供更加簡(jiǎn)單的選項進(jìn)行配置,這些功能對用戶(hù)而言都是方便使用的。
- 在內存管理上,MSS的開(kāi)發(fā)人員必須管理自己的內存;而FFmpeg 提供基本的內存管理單元并實(shí)現系統內存的統一調用,集成了硬件級別的內存處理機制。
- FFmpeg 提供了一定的容錯機制與 a/v 同步機制;FFmpeg+QSV 模塊充分利用這些機制來(lái)提高兼容性,像使用ffmpeg的parse工具進(jìn)行視頻流預處理。
- 處理流程上,MSS的用戶(hù)在使用MSS模塊之前必須自己開(kāi)發(fā)Mux/Demux或其他必要的模塊;而FFmpeg+QSV 由于是基于 MSS 實(shí)現并添加了特殊的邏輯, 每個(gè)模塊都可與 FFmpeg 的其他模塊一起工作。
可以說(shuō)FFmpeg有很強大的媒體支持,相對于傳統的MSS在保證性能與質(zhì)量的前提下為用戶(hù)節省很多工作量并顯著(zhù)提升開(kāi)發(fā)效率。
4、實(shí)踐與測試

上圖展示的是我們在Skylake也就是Gen 9上測試硬件轉碼能力的結果。GT2、GT31、GT41三個(gè)型號性能遞增;TU1、TU2、TU4、TU7表示編解碼性能與圖像質(zhì)量的均衡程度,其中TU7表示最快的處理速度和較差的圖像質(zhì)量,TU1表示基于大量計算得到的較高圖像質(zhì)量。
上圖展示的是Skylake對HEVC支持的性能數據,其中的分辨率為1080P,其實(shí)HEVC 4K60p也能得到很好的性能。隨著(zhù)輸出圖像質(zhì)量的提升,轉碼速度也會(huì )相應降低,但在正常使用中我們主要根據需求平衡性能與質(zhì)量,在較短時(shí)間內實(shí)現較高質(zhì)量的轉碼輸出。

如果重點(diǎn)分析圖像質(zhì)量,在實(shí)踐中我們建議使用Medium模式得到相對較優(yōu)的性能與質(zhì)量。隨著(zhù)參數的變化,PSNR與圖像的整體細節會(huì )出現較明顯變化。




Source Code主要有以下兩種途徑:可以從FFmpeg上直接clone,也可以訪(fǎng)問(wèn)Intel的Github獲得相應源代碼。Intel的github上的分支中的FFmpeg qsv模塊是經(jīng)過(guò)Intel的測試,相對而言問(wèn)題更少運行更加穩定,大家也可以在Intel的Github上提出相關(guān)問(wèn)題,我們會(huì )對部分問(wèn)題進(jìn)行解答。
上圖展示的是實(shí)踐中可能需要的一些使用命令參考,其中我想強調的是Overlay Filter,在這里我們支持多種模式,包括插入臺標的、電視墻等,也可在視頻會(huì )議等場(chǎng)景中實(shí)現人工指定確定畫(huà)面中每一個(gè)圖片的位置等效果。