首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用IPP将RGB颜色空间转换为NV12颜色空间

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

Stack Overflow用户
提问于 2016-06-12 05:41:16
回答 1查看 7.2K关注 0票数 5

像英特尔®媒体软件开发工具包这样的视频编码器需要NV12视频输入格式。

NV12 format是在存储器中排序的YUV4:2:0格式,首先是Y平面,然后是交错UV平面中的压缩色度样本。

示例:

YYYYYY

YYYYYY

UVUVUV

RGB颜色格式,指像素顺序RGB (每像素字节,低位字节为红色):

RGBRGBRGBRGBRGB

RGBRGBRGBRGBRGB

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

我的问题是:是否作为 函数将RGB色彩空间转换为NV12?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-12 05:41:16

我发现IPP函数是存在的:

ippiRGBToYCbCr420_8u_C3P2R

很难找到它,因为函数名或描述没有提到NV12。

该函数使用BT.601标准。

以下是在BT.601标准中将RGB转换为NV12的代码示例:

代码语言:javascript
复制
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...          
}

使用BT.709标准将RGB转换为NV12的

至于2019年,BT.709 (HDTV)标准可能比BT.601 (SDTV)更相关。

在BT.709标准中,IPP缺乏从RGB到NV12的直接转换功能。

有一个函数可以将BGR转换为NV12

该解决方案包括两个阶段:

  1. RGB转换为BGR (交换通道)。

代码示例使用ippiSwapChannels_8u_C3R进行RGBBGR的转换。

  • BGR转换为NV12

代码示例使用ippiBGRToYCbCr420_709CSC_8u_C3P2R进行BGRNV12的转换。

sample函数需要一些额外的内存空间来存储中间的BGR图像。

指向草图内存的指针被传递给函数(内存应该在函数外部分配)。

以下是在 to中将RGB转换为NV12的代码示例。709标准:

代码语言:javascript
复制
//sketch_buff - Temporary buffer for storing image in BGR format.
//              Size of sketch_buff must be at least image_width*image_height*3 bytes.
void Rgb2NV12_709(const unsigned char I[],
                  const int image_width, 
                  const int image_height,
                  unsigned char sketch_buff[],
                  unsigned char J[])
{
    IppStatus ipp_status;    
    int srcStep = image_width*3;
    int dstBgrStep = image_width*3;
    int dstYStep = image_width;
    int dstCbCrStep = image_width;
    IppiSize roiSize = {image_width, image_height};

    const Ipp8u* pRGB = (Ipp8u*)I;
    Ipp8u* pBGR = (Ipp8u*)sketch_buff; //BGR image is stored in sketch_buff
    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.

    const int bgrOrder[3] = {2, 1, 0};

    //Swap Red and Blue color channels - convert from RGB to BGR
    //Store the result into sketch_buff (sketch buffer is allocated outside the function)
    ipp_status = ippiSwapChannels_8u_C3R(pRGB, srcStep, pBGR, dstBgrStep, roiSize, bgrOrder);

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

    //Convert BGR to NV12 in BT.709 standard
    ipp_status = ippiBGRToYCbCr420_709CSC_8u_C3P2R(pBGR, srcStep, pDstY, dstYStep, pDstCbCr, dstCbCrStep, roiSize);

    //if (ipp_status != ippStsNoErr), Handle errors...
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37768751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档