zoukankan      html  css  js  c++  java
  • Intel IPP 图像空间转换

    一、 背景

      用QuickSync VPP模块做RGBA到NV12的颜色空间转换导致文字显示蒙上一层颜色的问题, 暂时怀疑是VPP自身的问题,因为参数设置都是按官方demo设置的。所以尝试使用IPP来做RGBA到NV12的转化。

    二、IPP 探索历程

      1. 下载IPP安装包, google “IPP”,即可找到下载链接。

      2.安装, 执行 install.sh。 如果有问题,看看文档,安装环境是否满足安装需求。

      3.编写测试程序(可在官网找到),需要关注头文件和库的目录,在安装目录下都可以找到。

    三、RGBA到NV12的转换

      1. 头文件ippcc.h, 库文件 libippcc.so

      2. 实例:

    void Rgb2NV12(const unsigned char I[],
                  const int image_width, 
                  const int image_height,
                  unsigned char J[])
    {
        //memcpy(J, I, image_width*image_height*3);
    
        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)
        {
            memset(J, 128, image_width*image_height*3/2);
        }
    }

    上面实例是转RGB24到NV12的接口

    IPPAPI(IppStatus, ippiRGBToYCbCr420_8u_C3P2R,( const Ipp8u* pRGB, int rgbStep,  Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))//  RGB24-->NV12
    IPPAPI(IppStatus, ippiRGBToYCbCr420_8u_C4P2R,( const Ipp8u* pRGB, int rgbStep,  Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))//  ARGB-->NV12
    IPPAPI(IppStatus, ippiBGRToYCbCr420_8u_C3P2R,( const Ipp8u* pRGB, int rgbStep,  Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))//  BGR24-->NV12
    IPPAPI(IppStatus, ippiBGRToYCbCr420_8u_AC4P2R,( const Ipp8u* pRGB, int rgbStep,  Ipp8u* pY, int YStep,Ipp8u* pCbCr, int CbCrStep, IppiSize roiSize ))// ABGR-->NV12

    实际结果以测试结果为准。

    有一些分辨率在把NV12编码成h264时需要对齐行像素,此时可以更改YStep,CbCrStep进行对齐。例如:

    IppiSize roiSize;
    roiSize.width = m_mfxEncParams.mfx.FrameInfo.CropW;
    roiSize.height = m_mfxEncParams.mfx.FrameInfo.CropH;
    mfxU16 pitch = m_pVPPSurfacesVPPOutEnc[nEncSurfIdx].Data.Pitch;
    ippiBGRToYCbCr420_8u_AC4P2R( (Ipp8u*)pInputBuffer, roiSize.width*4,  (Ipp8u*)m_pVPPSurfacesVPPOutEnc[nEncSurfIdx].Data.Y, pitch, (Ipp8u*)m_pVPPSurfacesVPPOutEnc[nEncSurfIdx].Data.UV,pitch, roiSize);

    上面的Data.Pitch就是编码器对特定分辨率下的行对齐的字节宽度。

  • 相关阅读:
    python字符串,数组操作
    python爬虫之有道在线翻译
    英雄联盟界面
    学习photoshop心得
    linux命令总结之lsof命令
    linux命令总结之netstat命令
    linux命令总结之route命令
    linux命令总结之ip命令
    linux命令总结之dig命令
    IP地址的分类——a,b,c 类是如何划分的
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/7049821.html
Copyright © 2011-2022 走看看