2016-06-11 93 views
1

インテル®メディアSDKのようなビデオエンコーダでは、NV12ビデオ入力形式が必要です。IPPを使用してRGBをNV12色空間に変換する方法

NV12 formatは、Y平面の最初のメモリで順序付けされたYUV 4:2:0形式です。次に、インターリーブされたUV平面にパックされた彩度サンプルが続きます。

例:
YYYYYY
YYYYYY
UVUVUV

enter image description here

RGBカラーフォーマット、ピクセル順序ためにRGB(ピクセル当たりのバイト、下位バイトが赤である)を指す:
RGBRGBRGBRGBRGB
RGBRGBRGBRGBRGB

enter image description here

私はいくつかのWeb調査をした、とに関するNV12、YUVは、YCbCr色空間として定義されていることが分かりました。 少なくとも2つの可能なのYCbCrフォーマットは現在ありませんがNV12を適用します。

HDTVを適用します私の質問は:はRGBカラーに変換IPP関数としてありますNV12へのスペース?

+0

@Rotem:、最後を変更するには、別の編集をしてくださいあなたは、MATLABの答えを探しているかどうかを明確にしてください、そうでない場合私は文章を追加しました。 (そして、 '[matlab]'タグを削除してください) –

+0

質問を3つの異なる質問に分けてください:1. IPPを使う、2.ペイントCコード、3. SSE最適化コード? – Rotem

+1

高度に特化したツールボックスを作成した場合は、おそらくGitHubが最適な場所です。セルフQ/Aは、あなたの質問が話題になっている場合にのみスタックオーバーフローで動作します。閉鎖によって明らかなように、あなたのものは非常に広すぎます。正しく説明された答え(純粋なコードダンプとは対照的に)を狭い形の質問として試してみるか、ツールボックスでGitHubページを作成してください。 – Adriaan

答えて

8

私はIPP関数が存在することが判明:

ippiRGBToYCbCr420_8u_C3P2R

関数名や説明はNV12に言及していないので、見つけるのは大変でした。
この関数はBT.601標準を使用します。
BT.709のIPP実装が見つかりませんでした。ここで

はNV12にRGBを変換するためにそれを使用するためのコードサンプルです:

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

関連する問題