• 【待续】海思Hi3520A学习笔记


    /*********************************************************************
    * 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 中,并随解码图像一起输出。



  • 相关阅读:
    【视频开发】ONVIF、RTSP/RTP、FFMPEG的开发实录
    【视频开发】ONVIF、RTSP/RTP、FFMPEG的开发实录
    【视频开发】opencv不能读取MP4格式文件
    CentOS 7下升级Python版本到3.x系列
    PyCharm常用快捷键
    ASCII、Unicode和UTF-8编码的区别
    配置Windows Server 2008/2012/2016允许2个用户同时远程桌面
    一道简单的python面试题-购物车
    Linux 下查看局域网内所有主机IP和MAC
    CentOS 7 配置HTTPS加密访问SVN
  • 原文地址:https://www.cnblogs.com/roger0212/p/4436651.html
Copyright © 2020-2023  润新知