2016-06-11 172 views
1

英特爾®媒體SDK等視頻編碼器需要NV12視頻輸入格式。如何使用IPP將RGB轉換爲NV12色彩空間

NV12 format是YUV 4:2:0格式,首先在Y平面的存儲器中排序,然後是交錯UV平面中的打包色度樣本。

實施例:
YYYYYY
YYYYYY
UVUVUV

enter image description here

RGB顏色格式,指的是像素階RGB(每像素字節,低位字節是紅):
RGBRGBRGBRGBRGB
RGBRGBRGBRGBRGB

enter image description here

我做了一些網站的研究,並且發現了關於NV12,YUV被定義爲YCbCr色彩空間。 目前有至少2種可能的YCbCr格式應用NV12:

我的問題是:有作爲IPP功能轉換RGB顏色空間到NV12?

+0

@Rotem:請說明您是否正在尋找答案,MATLAB,如果沒有,請再拍編輯修改的最後一個我添加的句子。 (並刪除'[matlab]'標籤) –

+0

我應該將問題分爲3個不同的問題:1.使用IPP,2. Pain C Code,3. SSE優化代碼? – Rotem

+1

如果你寫了一個高度專業的工具箱,GitHub可能是最好的地方。只有當你的問題是在話題上時,自我Q/A才適用於堆棧溢出。正如封面所顯示的那樣,你的觀點太廣泛了。可以嘗試使用正確解釋的答案(與純代碼轉儲相反)將其作爲狹義形式的問題編寫,或者使用工具箱創建GitHub頁面。 – Adriaan

回答

8

我發現IPP函數存在:

ippiRGBToYCbCr420_8u_C3P2R

這是很難找到,因爲函數名稱或說明中沒有提到NV12。
該功能使用BT.601標準。
我找不到BT.709的IPP實施。

下面是使用它的RGB轉換爲NV12一個代碼示例:

void Rgb2NV12(const unsigned char I[], int image_width, int image_height, unsigned char J[]) 
{ 
    IppStatus ipp_status; 

    int srcStep = image_width*3; 
    int dstYStep = image_width; 
    int dstCbCrStep = image_width; 
    IppiSize roiSize = {image_width, image_height}; 

    const Ipp8u* pSrc = (Ipp8u*)I; 

    Ipp8u *pDstY = (Ipp8u*)J;       //Y color plane is the first image_width*image_height pixels of J. 
    Ipp8u *pDstCbCr = (Ipp8u*)&J[image_width*image_height]; //In NV12 format, UV plane starts below Y. 

    ipp_status = ippiRGBToYCbCr420_8u_C3P2R(pSrc, srcStep, pDstY, dstYStep, pDstCbCr, dstCbCrStep, roiSize); 

    //if (ipp_status != ippStsNoErr), Handle errors...   
} 
+1

我在C中的優化實現(使用SSE內在函數向量化)可以在這裏找到:[https://github.com/cohenrotem/Rgb2NV12](https://github.com/cohenrotem/Rgb2NV12)。 – Rotem