如何使用IPP将RGB转换为NV12色彩空间

Rot*_*tem 3 c rgb yuv intel-ipp nv12-nv21

像Intel®MediaSDK这样的视频编码器需要NV12视频输入格式.

NV12格式是YUV 4:2:0格式,在存储器中排序,首先是Y平面,然后是交错UV平面中的打包色度样本.

例:
YYYYYY
YYYYYY
UVUVUV

在此输入图像描述

RGB颜色格式,指像素级RGB(每像素字节,低字节为红色):
RGBRGBRGBRGBRGB
RGBRGBRGBRGBRGB

在此输入图像描述

我做了一些网络研究,发现对于NV12,YUV被定义为YCbCr色彩空间.目前至少有两种可能的YCbCr格式适用于NV12:

我的问题是:是否有将IP色彩空间转换为NV12的IPP功能?

Rot*_*tem 10

我发现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...          
}
Run Code Online (Sandbox Code Playgroud)