1. 程式人生 > >開源框架GPUImage結構分析

開源框架GPUImage結構分析

    GPUImage是IOS上基於opengl的影象、視訊處理開源框架,裡面帶有大量的濾鏡,同時也很方便在原有基礎上加入自己的濾鏡Filter,所有濾鏡是基於opengl shader實現的,所以濾鏡效果影象處理是在GPU上實現的,處理效率比較高,在iPhone6及其以上手機,可以做到實時流暢的效果。

    GPUImage基本架構是chain式結構,主要由一個GPUImageOutput interface和一個GPUImageInput protocol串聯起來,GPUImageOutput輸出Texture,GPUImageInput輸入Texture,整個鏈式影象資料傳遞由Texture擔當。camera,stillimage等影象、視訊sources繼承自GPUImageOutput,濾鏡Filters繼承自GPUImageOutput並實現GPUImageInput,View,FileWriter等Outputs實現GPUImageInput,大致結構如下圖:

    

    要弄清裡面的Chains結構,他們是如何串聯起來,我們首先需要對GPUImageOutput interface和GPUImageInput protocol進行剖析,相關類圖簡單表示如下:

                       

    先來看GPUImageOutput,裡面有兩個很重要的變數:GPUImageFramebuffer指標型別的outputFramebuffer和NSMutableArray指標型別的targets,四個介面重要介面:notifyTargetAboutNewOutputTexture、setInputFramebufferForTartget、addTarget和removeTarget,下面分別來看看。

    outputFramebuffer變數主要是負責管理GPUImageOutput(包括Sources和Filters)產生的Texture。texture為其代表輸出的Texture的index。missingFramebuffer,決定是否生成RenderBuffer,由初始化函式initWIthSize引數是onlyGenerateTexture決定,如果是YES,內部只產生Texture,比如假設源GUPImageVideocamera採集到的視訊資料是RGB資料,直接用glTextImage2D更新紋理,如果為NO,則生成Texture的同時生成Framebuffer,Texture更新方式通過RendFramebuffer來實現,如果GUPImageVideocamera採集到的資料為YUV時,通過opengl實現YUV到到RGB的轉化,用Texture繫結到Framebuffer的方式更新Texture,所有的Filters都是採用Framebuffer更新方式,因為需要用opengl進行影象處理。pixelBuffer用一個CVPixelBuffer型別變數,主要用來實現GPU和CPU之間的資料高效共享,這樣pixelBuffer資料和texture紋理資料同步更新,便於在CPU和GPU端同時高效訪問,見我之前的部落格連結

https://blog.csdn.net/CMSHAO/article/details/80069503

    targets變數主要是負責管理GPUImageOutput下游GPUImageInput,也就是連結到該GPUImageOutput上的GPUImageInput集合,通過介面addTarget和RemoveTarget來進行管理下游GPUImageInput。

    setInputFramebufferForTartget就是將GPUImageOutput生成的outputFramebuffer設定給下游GPUImageInput target,這樣下游GPUImageInput就是在上游GPUImageOutput處理後texture上做處理。

    notifyTargetAboutNewOutputTexture該函式就是在上游GPUImageOutput處理完後,對targets每一個下游GPUImageInput迴圈呼叫setInputFramebufferForTartget,完成texture傳遞。

    通過上述變數和介面,基本上可以懂得GPUImageOutput做了什麼工作,基本上就是通過opengl對影象做處理,所處理的結果存在了outputFramebuffer管理的texture紋理上,並在處理完後,通過notifyTargetAboutNewOutputTexture介面將texture結果傳遞給下游GPUImageInput。

    現在我們來看看GPUImageInput協議,主要有setInputFramebuffer和newFrameReadyAtTime兩個介面。setInputFramebuffer正是GPUImageOutput執行setInputFramebufferForTartget呼叫的,將處理後的texture傳遞下來。newFrameReadyAtTime緊著跟著setInputFramebuffer被呼叫,驅動GPUImageInput進行處理。

    上述文字表示轉化成圖示如下:

    

    這樣sources繼承GPUImageOutput,filters繼承GPUImageOutput和實現GPUImageInput,outputs實現GPUImageInput,一條影象處理資料鏈就形成了。

參考連結: