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就是编码器对特定分辨率下的行对齐的字节宽度。

时间: 2024-10-07 22:06:00

Intel IPP 图像空间转换的相关文章

Centos6.7下安装Intel 的icc / ifort 编译器(非商业版)

一.查看系统环境 [[email protected]_EXERCISE bigdft-1.8.1]# cat /etc/redhat-release CentOS release 6.7 (Final) [[email protected]_EXERCISE bigdft-1.8.1]# uname -a Linux MPI_EXERCISE 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_

intel ipp6.0安装过程

由于最近看到一个代码中使用了intel ipp6.0库,了解到,ipp6.0是一个很强大的图像处理库,将其与opencv联合使用,还能够加速opencv的处理,在图像处理的过程中,是一个很重要的工具.下面将搜索以及安装的过程介绍如下,仅供参考. 1,下载安装.由于官方的文件是要收费的,价格不菲,199dollars,但是intel还算大方,提供了31天的试用版,作者使用的就是试用版.连接地址如下: http://registrationcenter-download.intel.com/akdl

H.264开源解码器评测

转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/ 要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码.所以我们需要分离器,视频解码器和音频解码器,俗称hdtv的“三件套”,又统称滤镜. H264的分离器: 常见的有Gabest MP4分离器,就是MP4splitter,也是Gabest编写的,Halli的分离器和NDigital分离器等. H264的视频解码器: CoreAVC的H264视频解码器Cor

数字图像处理之cpu加速(1)

在处理图像时,会经常对像素进行操作,实时性要求较高的场所往往会使用并行处理,好在(C/C++ API)支持多种并行方式:mpi,openmp,intel ipp 等,今天记录一种利用 openmp简单的并行处理图像方法:灰度图像取反. 需要用到的头文件:#include “omp.h”,作者是基于opencv3.0处理的图片,cpu为赛扬E3200,双核. 话不多说上代码: #include "opencv2/opencv.hpp" #include "omp.h"

CentOS6.5上配置Python2.7+OpenCV2.4.7

本文讲述在Linux上使用配置Python调用OpenCV的开发环境 环境:CentOS 6.5 +Python2.7.8+OpenCV2.4.7 0.安装OpenCV环境要求(Installation in Linux) OpenCV.org的要求: GCC 4.4.x or later() CMake 2.8.7 or higher Git(如果直接下载了源码,这个没必要) GTK+2.x or higher, including headers (libgtk2.0-dev) pkg-co

多线程程序设计的8个规则

另外一篇 : http://blog.csdn.net/mousebaby808/article/details/7092031 在Intel,并行化技术主要有四个步骤:分析,设计与实现,调试以及性能调优.这些步骤用来对一段串行代码进行并行化.尽管这四个步骤中的第一.三.四步都已经有了很多相关文档,但是关于怎样进行设计与实现的却不多. 并行编程更像是一门艺术,而不是一门科学.这里将会给出八条设计多线程程序的简单规则,你可以把他们一一放进你的多线程程序设计百宝箱中.通过参考这些规则,你能写出高质量

Linux 汇编语言开发指南

一.简介 作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能.就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分.由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能. 大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 L

SIP协议&开源SIP服务器搭建和客户端安装

1. SIP SIP 是一个应用层的控制协议,可以用来建立,修改,和终止多媒体会话,例如Internet电话 SIP在建立和维持终止多媒体会话协议上,支持五个方面: 1)   用户定位: 检查终端用户的位置,用于通讯. 2)   用户有效性:检查用户参与会话的意愿程度. 3)   用户能力:检查媒体和媒体的参数. 4)   建立会话: “ringing”,建立会话参数在呼叫方和被叫方. 5)       会话管理:包括发送和终止会话,修改会话参数,激活服务等等. 1.1 SIP基本组成要素 用户

Linux汇编语言开发指南

http://blog.chinaunix.net/space.php?uid=25299072&do=blog&id=2943093 一.简介 作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能.就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分.由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编