/*********************************************************************

* By                       :     Lile

* Last Modified   :     2015年3月3日星期二  08:46:13

* Email                 :     roger0212@163.com

* HomePage      :      http://blog.csdn.net/lile777

* CopyRight        :      该文章版权由Lile所有。可在非商业目的下任意传播和复制。

*                                   对于商业目的下对本文的任何行为需经作者同意。

*********************************************************************/

1、  YUV420  YUV422  YUV444

4:2:2乃是指數位影像資料的格式,一般而言數位影像以色差端子來說,

            分成三個component,即Y,Cb,Cr(或叫Y,U,V),但是由於人類視覺系統只對亮度反應較敏銳,為了減少資料頻寬(因為傳輸媒介(如網路或電波)的頻寬是有限的),U,V的部分就會用偷工減料的方式來因應.常見格式有YUV420,YUV422,YUV444三種格式.

            其中YUV444是完全未刪減最逼真的格式,即每4個Y,配4個U,4個V

            YUV422則是在UV上減半之格式,即每4個Y,配2個U,2個V

            YUV420則是在UV上減1/4之格式,即每4個Y,配1個U,1個V

            當然啦YUV420在這三者間顏色的表現較不細緻,不過由於人類不易察覺,這個格式廣為DVD所應用.

出处:http://203.208.39.132/search?q=cache:doj0KBXwSv4J:blog.csdn.net/arau_sh/archive/2008/10/13/3068824.aspx+YUV420+YUV422&cd=1&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy29TkqWKJtUWWRqZcNQy27Ni2XXrog

2、hiH264_DEC_ATTR_S 结构体

/* 解码器属性数据结构 */

typedef struct hiH264_DEC_ATTR_S

{

HI_U32 uPictureFormat; /* 解码器输出图像格式 */

/* 0x00: 目前解码库只支持YUV420图像格式 */

HI_U32 uStreamInType; /* 输入码流格式 */

/* 0x00: 目前解码库只支持以“00 00 01”为 nalu分割符的流式H.264码流 */

HI_U32 uPicWidthInMB; /* 图像宽度(以宏块为单位) */

HI_U32 uPicHeightInMB; /* 图像高度(以宏块为单位) */

HI_U32 uBufNum;            /* 参考帧数目 */

HI_U32 uWorkMode;   /* 解码器工作模式 */

Bit31 ~Bit3

Bit2

Bit1

Bit0

保留

00: 仅解码图像

10: 保留

01: 解码Hi351x数字水印

11: 保留

0: 快速输出模式;

1: 正常输出模式

H264_USERDATA_S *pUserData; /* 用户私有数据 */

HI_U32 uReserved; /* 保留字 */

} H264_DEC_ATTR_S;

3、hiH264_DEC_FRAME_S 解码输出图像结构体

/* 解码器输出图像信息数据结构 */

typedef struct hiH264_DEC_FRAME_S

{

HI_U8 *pY; /* Y分量地址 */

HI_U8 *pU; /* U分量地址 */

HI_U8 *pV; /* V分量地址 */

HI_U32 uWidth; /* 图像宽度(以像素为单位) */

HI_U32 uHeight; /* 图像高度(以像素为单位) */

HI_U32 uYStride; /* 输出Y分量的stride (以像素为单位) */

HI_U32 uUVStride; /* 输出U/V分量stride (以像素为单位) */

HI_U32 uCroppingLeftOffset; /* 图像裁减信息:左边界裁减像素数 */

HI_U32 uCroppingRightOffset; /* 图像裁减信息:右边界裁减像素数 */

HI_U32 uCroppingTopOffset; /* 图像裁减信息:上边界裁减像素数 */

HI_U32 uCroppingBottomOffset; /* 图像裁减信息:下边界裁减像素数 */

HI_U32 uDpbIdx; /* 输出图像在dpb中的序号 */

HI_U32 tPicFlag; /* 图像类型:0:帧; 1:顶场; 2:底场 */

HI_U32 bError; /* 图像是否有错:0:正确;1:图像有错 */

HI_U32 bIntra; /* 图像是否为IDR帧:0:非IDR帧;1:IDR帧 */

HI_U64 ullPTS; /* 时间戳 */

HI_U32 uPictureID; /* 图像序号 */

HI_U32 uReserved; /* 保留字 */

H264_USERDATA_S *pUserData; /* 指向用户私有数据 */

} H264_DEC_FRAME_S;

4、hiH264_LIBINFO_S

/* 解码库版本、版权和能力集信息数据结构 */

typedef struct hiH264_LIBINFO_S

{

HI_U32 uMajor; /* 主编号 */

HI_U32 uMinor; /* 次编号 */

HI_U32 uRelease; /* 发布编号 */

HI_U32 uBuild; /* 建构编号 */

const HI_CHAR*sVersion; /* 版本信息 */

const HI_CHAR*sCopyRight; /* 版权信息 */

HI_U32 uFunctionSet;/* 解码库能力集 */

HI_U32uPictureFormat;/* 支持的输出图像格式*/

/* 0x00:当前仅支持YUV420图像格式 */

HI_U32uStreamInType; /* 输入码流格式*/

/* 0x00:当前仅支持以“00 00 01”为nalu分割符的流式H.264码流 */

HI_U32 uPicWidth; /*最大图像宽度(以像素为单位) */

HI_U32 uPicHeight;/* 最大图像高度(以像素为单位) */

HI_U32 uBufNum; /* 最大参考帧数目 */

HI_U32 uReserved; /*保留字 */

} H264_LIBINFO_S;

5、HI_HDL HI_DLLEXPORT Hi264DecCreate( H264_DEC_ATTR_S *pDecAttr );

/*

创建解码器句柄。在解码开始时,分配解码空间和初始化解码器相关的变量及状态,

设置解码器输入码流类型、输出图像格式、解码器支持的最大图像的宽高、解码器支

持的最大参考帧数目等解码器属性。

上层应用可以使用多线程创建多个解码器,实现多路解码。

创建成功后, 返回值为  创建解码器的句柄

*/

/*create a decoder*/

    handle = Hi264DecCreate(&dec_attrbute);

6、 QueryPerformanceFrequency()

类型:Win32API

原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;

零,硬件不支持,读取失败。

QueryPerformanceFrequency()  

供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。

函数的原形是:

  BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

  BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:

  typeef union _ LARGE_INTEGER

  {

   struct

   {

   DWORD LowPart;

   LONG HighPart;

   };

   LONGLONG QuadPart;

  } LARGE_INTEGER;

在定时前应该

先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。

接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。

测试函数SLEEP(100)的精确持续时间方法:

  LARGE_INTEGER litmp;

  LONGLONG qt1,qt2;

  double dft,dff,dfm;

  QueryPerformanceFrequency(&litmp);//获得时钟频率

  dff=(double)litmp.QuadPart;

  QueryPerformanceCounter(&litmp);//获得初始值

  qt1=litmp.QuadPart;Sleep(100);

  QueryPerformanceCounter(&litmp);//获得终止值

  qt2=litmp.QuadPart;

  dfm=(double)(qt2-qt1);

  dft=dfm/dff;//获得对应的时间值

需要注意的是DFT计算的结果单位是秒。

7、Hi264DecFrame(handle, buf,  len, 0, &dec_frame,  flags); 

/// 对输入的一段码流进行解码并按帧输出图像;

/// 本函数仅支持流式解码,对于以“00 00 01”为nalu 分隔符的连续、线性H.264 码流,

/// 用户可从任意起始地址、任意长度配置给解码器解码。

HI_S32 HI_DLLEXPORT Hi264DecFrame(

    HI_HDL  hDec,

    HI_U8*  pStream,

    HI_U32  iStreamLen,

    HI_U64  ullPTS,

    H264_DEC_FRAME_S *pDecFrame,   // 输出图片 格式

    HI_U32  uFlags );

返回值

宏定义

含义

0

HI_H264DEC_OK

函数执行成功,有一帧图像输出。

-1

HI_H264DEC_NEED_MORE_BITS

剩余码流不够解码一帧的数据,需要重新配置更多的码流。uFlags为0时才会返回此值。

-2

HI_H264DEC_NO_PICTURE

解码器内部残留的图像已经全部输出完毕。uFlags为1时才会返回此值。

-3

HI_H264DEC_ERR_HANDLE

解码器句柄为空或输出图像结构体为空。

【注意】

在调用本函数过程中需要注意以下两点:

在解码过程中,用户应该将码流分段,并依次配置给解码器。当用户调用此函数,将一段码流配置给解码器之后,应对函数的参数做如下配置:

pStream=NULL;

iStreamLen=0;

uFlags=0;

然后循环调用此函数,直到函数返回HI_H264DEC_NEED_MORE_BITS 时才能再次配置一段新的码流。

在上述循环调用的过程中,如果函数返回 HI_H264DEC_OK 则表明有一帧图像输出,用户必须在循环调用内部及时处理存储在pDecFrame 中的图像。





在解码结束时,为了输出解码器内部可能的残留图像,用户可对函数的参数做如下配置:

uFlags=1;

pStream=NULL;

然后循环调用此函数,直到函数返回HI_H264DEC_NO_PICTURE 时才能停止解码。

在上述循环调用的过程中,如果函数返回 HI_H264DEC_OK 则表明有一帧图像输出,用户必须在循环调用内部及时处理存储在pDecFrame 中的图像。

解码函数提供时间戳透传功能,输入的时间戳将保存在当前码流解码后的图像结构体H264_DEC_FRAME_S 中,并随解码图像一起输出。

【待续】海思Hi3520A学习笔记的更多相关文章

  1. 第2季:从官方例程深度学习海思SDK及API

    2.1.官方mppsample的总体分析2.1.sample的整体架构(1)sample其实是很多个例程,所以有很多个main(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析 ...

  2. 海思hi35xx 开发学习(3):视频输入

    视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVDS 接口和 HISPI 接口),SLVS-EC,BT.1120,BT.656,BT.601,DC 等接口接收视频数据.V ...

  3. Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试

    前言   目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启Hi3516系列的开发教程.   Hi3516DV300芯片介绍   Hi3516DV300为专业行Smart IP ...

  4. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  5. libx264开发笔记(一):libx264介绍、海思平台移植编译

    前言   在编译ffmpeg时,使用到h264编码时是需要依赖libx264的,本文章是将将libx264作为静态库移植到海思上.   相关博客 <Qt开发笔记之编码x264码流并封装mp4(一 ...

  6. OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

    前言   移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持.   Ffmpeg的移植   Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...

  7. linux学习笔记---未完待续,缓慢更新

    做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...

  8. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  9. SQLServer学习笔记系列6

    一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...

随机推荐

  1. ASP.NET MVC5 之 客户端实现文件的下载

    MVC 实现下载功能主要借助于 File 属性: //下载文件接口 public ActionResult GetTrackTempIsc(ICSModels icsModels) { bool fl ...

  2. Android 性能优化(14)网络优化( 10)Determining and Monitoring the Connectivity Status

    Determining and Monitoring the Connectivity Status This lesson teaches you to Determine if you Have ...

  3. Spring Boot (27) actuator服务监控与管理

    actuaotr是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...

  4. P1334 瑞瑞的木板

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  5. oracle添加联合主键

    1 alter table tablename add constraint unionkeyname primary key (column1,column2); 上面语句中: tablename为 ...

  6. Angular——内置过滤器

    基本介绍 在AngularJS中使用过滤器格式化展示数据,在“{{}}”中使用“|”来调用过滤器,使用“:”传递参数. 基本使用 过滤器可以串起来使用,只要用   |  来衔接就行了,可以将上次返回的 ...

  7. Stanford coursera Andrew Ng 机器学习课程第四周总结(附Exercise 3)

    Introduction Neural NetWork的由来 时,我们可以对它进行处理,分类.但是当特征数增长为时,分类器的效率就会很低了. Neural NetWork模型 该图是最简单的神经网络, ...

  8. PHP实现写LOG日志的代码

    这篇文章给大家介绍的内容是关于PHP实现写LOG日志的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. public function write_log(){ //设置目录时间 ...

  9. 【OpenCV】像素操作的数字图像处理

    之前几天捣鼓matlab,用来处理数字图像,矩阵操作什么的,如果忘记线性代数就真的GG了. 在用了matlab被深深地吐槽之后,决定改用opencv,C++貌似也是处理数字图像的很好的工具 1. 在u ...

  10. JavaScript 实现页面中录音功能

    页面中实现录音需要使用浏览器提供的 Media​Recorder API,所以前提是需要浏览器支持 MediaStream Recording 相关的功能. 以下代码默认工作在 Chrome 环境中. ...