海思的dll,解码h264  解码后转出yuv12
dll自己百度下载  hi_h264dec.dll   hi_h264dec_w.dll
 
调用方法:
if (H264Dec.Hi264DecAU(_decHandle, pH264Data, frameLen, 0, ref _decodeFrame, 0) == 0)
 
pH264Data是h264帧的句柄,frameLen是h264帧的长度,_decodeFrame是解码后的yuv帧
 
 
 
#region 解码器相关变量声明
/// <summary>
/// 数据的句柄
/// </summary>
/// <summary>
/// 这是解码器属性信息
/// </summary>
public H264Dec.hiH264_DEC_ATTR_S decAttr;
/// <summary>
/// 这是解码器输出图像信息
/// </summary>
public H264Dec.hiH264_DEC_FRAME_S _decodeFrame = new H264Dec.hiH264_DEC_FRAME_S();
/// <summary>
/// 解码器句柄
/// </summary>
public IntPtr _decHandle;
static double[,] YUV2RGB_CONVERT_MATRIX = new double[, ] { { , , 1.4022 }, { , -0.3456, -0.7145 }, { , 1.771, } };
#endregion #region 解码器相关初始化,一般在窗口load中进行初始化
decAttr = new H264Dec.hiH264_DEC_ATTR_S();
decAttr.uPictureFormat = ;
decAttr.uStreamInType = ;
decAttr.uPicWidthInMB = (uint)width;
decAttr.uPicHeightInMB = (uint)height;
decAttr.uBufNum = ;
decAttr.uWorkMode = ;
//创建、初始化解码器句柄
_decHandle = H264Dec.Hi264DecCreate(ref decAttr);
#endregion using System;
using System.Runtime.InteropServices; namespace FVD.Common
{
public class H264Dec
{
public const int HI_SUCCESS = ; public const int HI_FAILURE = -; public const int HI_LITTLE_ENDIAN = ; public const int HI_BIG_ENDIAN = ; public const int HI_DECODER_SLEEP_TIME = ; public const int HI_H264DEC_OK = ; public const int HI_H264DEC_NEED_MORE_BITS = -; public const int HI_H264DEC_NO_PICTURE = -; public const int HI_H264DEC_ERR_HANDLE = -; [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecImageEnhance",CallingConvention = CallingConvention.Cdecl)]
public static extern int Hi264DecImageEnhance(IntPtr hDec, refhiH264_DEC_FRAME_S pDecFrame, uint uEnhanceCoeff); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecCreate", CallingConvention =CallingConvention.Cdecl)]
public static extern IntPtr Hi264DecCreate(ref hiH264_DEC_ATTR_S pDecAttr); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecDestroy", CallingConvention =CallingConvention.Cdecl)]
public static extern void Hi264DecDestroy(IntPtr hDec); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecGetInfo", CallingConvention =CallingConvention.Cdecl)]
public static extern int Hi264DecGetInfo(ref hiH264_LIBINFO_S pLibInfo); /// <summary>
/// 对输入的一段码流进行解码并按帧输出图像
/// </summary>
/// <param name="hDec">解码器句柄</param>
/// <param name="pStream">码流起始地址</param>
/// <param name="iStreamLen">码流长度</param>
/// <param name="ullPTS">时间戳信息</param>
/// <param name="pDecFrame">图像信息</param>
/// <param name="uFlags">解码模式 0:正常解码;1、解码完毕并要求解码器输出残留图像</param>
/// <returns></returns>
[DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecFrame", CallingConvention = CallingConvention.Cdecl)]
public static extern int Hi264DecFrame(IntPtr hDec, IntPtr pStream, uint iStreamLen, ulong ullPTS, ref hiH264_DEC_FRAME_S pDecFrame, uint uFlags); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecAU", CallingConvention =CallingConvention.Cdecl)]
public static extern int Hi264DecAU(IntPtr hDec, IntPtr pStream, uint iStreamLen,ulong ullPTS, ref hiH264_DEC_FRAME_S pDecFrame, uint uFlags);
/// <summary>
/// 解码器属性信息。
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct hiH264_DEC_ATTR_S
{
/// <summary>
/// 解码器输出图像格式,目前解码库只支持YUV420图像格式
/// </summary>
public uint uPictureFormat;
/// <summary>
/// 输入码流格式 0x00: 目前解码库只支持以“00 00 01”为nalu分割符的流式H.264码流
/// </summary>
public uint uStreamInType;
/// <summary>
/// 图像宽度
/// </summary>
public uint uPicWidthInMB;
/// <summary>
/// 图像高度
/// </summary>
public uint uPicHeightInMB;
/// <summary>
/// 参考帧数目
/// </summary>
public uint uBufNum;
/// <summary>
/// 解码器工作模式
/// </summary>
public uint uWorkMode;
/// <summary>
/// 用户私有数据
/// </summary>
public IntPtr pUserData;
/// <summary>
/// 保留字
/// </summary>
public uint uReserved; } /// <summary>
/// 解码器输出图像信息数据结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct hiH264_DEC_FRAME_S
{
/// <summary>
/// Y分量地址
/// </summary>
public IntPtr pY;
/// <summary>
/// U分量地址
/// </summary>
public IntPtr pU;
/// <summary>
/// V分量地址
/// </summary>
public IntPtr pV;
/// <summary>
/// 图像宽度(以像素为单位)
/// </summary>
public uint uWidth;
/// <summary>
/// 图像高度(以像素为单位)
/// </summary>
public uint uHeight;
/// <summary>
/// 输出Y分量的stride (以像素为单位)
/// </summary>
public uint uYStride;
/// <summary>
/// 输出UV分量的stride (以像素为单位)
/// </summary>
public uint uUVStride;
/// <summary>
/// 图像裁减信息:左边界裁减像素数
/// </summary>
public uint uCroppingLeftOffset;
/// <summary>
/// 图像裁减信息:右边界裁减像素数
/// </summary>
public uint uCroppingRightOffset;
/// <summary>
/// 图像裁减信息:上边界裁减像素数
/// </summary>
public uint uCroppingTopOffset;
/// <summary>
/// 图像裁减信息:下边界裁减像素数
/// </summary>
public uint uCroppingBottomOffset;
/// <summary>
/// 输出图像在dpb中的序号
/// </summary>
public uint uDpbIdx;
/// <summary>
/// 图像类型:0:帧; 1:顶场; 2:底场 */
/// </summary>
public uint uPicFlag;
/// <summary>
/// 图像类型:0:帧; 1:顶场; 2:底场 */
/// </summary>
public uint bError;
/// <summary>
/// 图像是否为IDR帧:0:非IDR帧;1:IDR帧
/// </summary>
public uint bIntra;
/// <summary>
/// 时间戳
/// </summary>
public ulong ullPTS;
/// <summary>
/// 图像信号
/// </summary>
public uint uPictureID;
/// <summary>
/// 保留字
/// </summary>
public uint uReserved;
/// <summary>
/// 指向用户私有数据
/// </summary>
public IntPtr pUserData; } /// <summary>
/// 解码库版本、版权和能力集信息。
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct hiH264_LIBINFO_S
{
/// <summary>
/// 主编号
/// </summary>
public uint uMajor;
/// <summary>
/// 次编号
/// </summary>
public uint uMinor;
/// <summary>
/// 发布编号
/// </summary>
public uint uRelease;
/// <summary>
/// 建构编号
/// </summary>
public uint uBuild;
/// <summary>
/// 版本信息
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public string sVersion;
/// <summary>
/// 版权信息
/// </summary>
[MarshalAs(UnmanagedType.LPStr)]
public string sCopyRight;
/// <summary>
/// 解码库能力集
/// </summary>
public uint uFunctionSet;
/// <summary>
/// 支持的输出图像格式
/// </summary>
public uint uPictureFormat;
/// <summary>
/// 输入码流格式
/// </summary>
public uint uStreamInType;
/// <summary>
/// 最大图像宽度(以像素为单位)
/// </summary>
public uint uPicWidth;
/// <summary>
/// 最大图像高度(以像素为单位)
/// </summary>
public uint uPicHeight;
/// <summary>
/// 最大参考帧数目
/// </summary>
public uint uBufNum;
/// <summary>
/// 保留字
/// </summary>
public uint uReserved; } /// <summary>
/// 用户私有数据信息。
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct hiH264_USERDATA_S
{
/// <summary>
/// 用户数据类型
/// </summary>
public uint uUserDataType;
/// <summary>
/// 用户数据长度
/// </summary>
public uint uUserDataSize;
/// <summary>
/// 用户数据缓冲区
/// </summary>
public IntPtr pData;
/// <summary>
/// 指向下一段用户数据
/// </summary>
public IntPtr pNext;
}
}
}

海思h264解码库的更多相关文章

  1. 海思H264解码库 hi_h264dec_w.dll 水印问题

    上一篇   海思h264解码库 , 实现了H264帧的简单解码,但更换相机后,出现了解码视频中央出现水印的问题,水印如下图 查找网络,基本就这一篇相关的,还没给出好的解决办法. http://bbs. ...

  2. H264解码学习-2015.04.16

    今天看了不少,却感觉收获寥寥. 1.H264相关知识 因为RTP协议发过来的数据已经经过了H264编码,所以这边需要解码.补充一下H264的相关知识. 与以往的视频压缩标准相比,H.264 视频压缩标 ...

  3. linux之x86裁剪移植---ffmpeg的H264解码显示(420、422)

    在虚拟机上yuv420可以正常显示 ,而945(D525)模块上却无法显示 ,后来验证了directdraw的yuv420也无法显示 ,由此怀疑显卡不支持 ,后把420转换为422显示. 420显示如 ...

  4. 海思3519A 移植 Qt 5.5.1

    源码下载 网址:qt-everywhere-opensource-src-5.5.1.tar.gz 配置生成MakeFile 文件 解压源码包,在源码包路径下生成配置 MakeFile : ./con ...

  5. 海思HI35xx平台软件开发快速入门之H264解码实例学习

    ref :https://blog.csdn.net/wytzsjzly/article/details/82500277   前言 H264视频编码技术诞生于2003年,至今已有十余载,技术相当成熟 ...

  6. 海思hi3518 移植live555 实现H264的RTSP播放

    用海思的交叉编译工具交叉编译live555 ,结合海思例子venc中的H264部分,完成RTSP的视频数据发布. 用vlc可以播放,但是实时性比较差,慢了5秒

  7. 海思3519 qt ffmpeg 软解码播放avi

    在海思3519上基于qt采用ffmpeg对avi进行解码显示,其中ffmpeg的配置,qt的配置在前文中已经说明,在此不再赘述. 解码 解码在单独的线程中进行,具体的代码如下: void VideoP ...

  8. 聊聊视频中的编解码器,你所不知道的h264、h265、vp8、vp9和av1编解码库

    你知道FFmpeg吗?了解过h264/h265/vp8/vp9编解码库吗? 我们日常生活中使用最广泛的五种视频编码:H264(AVC).H265(HEVC).vp8.vp9.av1都分别是什么?由哪些 ...

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

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

随机推荐

  1. Jackson将json字符串转换成泛型List

    Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点 Jackson处理一般的Ja ...

  2. Walle - 瓦力上线部署系统搭建攻略

    背景知识:Walle - 瓦力是一个支持svn.git.多用户.多项目.多环境同时部署的上线部署系统,http://www.oschina.net/news/68610/walle-0-9-2 实验系 ...

  3. Oracle数据库穿越防火墙访问

    原因 Oracle listener 只起一个中介作用,当客户连接它时,它根据配置寻找到相应的数据库实例进程,然后spawned一个新的数据库连接,这个连接端口由listener传递给客户机,此后客户 ...

  4. 帆软报表FineReport中数据连接之Websphere配置JNDI连接

    以oracle9i数据源制作的模板jndi.cpt为例来说明如何在FineReport中的Websphere配置JNDI连接.由于常用服务器的JNDI驱动过大,帆软报表FineReport中没有自带, ...

  5. GLine游戏(Win32GUI实现,CodeBlocks+GCC编译)

    游戏规则: 在10X10的棋盘上有五种颜色的棋子. 点击一个棋子,再点击一个空格子,如果两者之间有一条路径的话,棋子会移动到空格子内. 每移动一次,棋盘上会增加三个棋子,其位置和颜色都是随机的. 当横 ...

  6. POJ1679 The Unique MST[次小生成树]

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28673   Accepted: 10239 ...

  7. NOIP2011选择客栈[递推]

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  8. MAVEN构建Spring +Spring mvc + Mybatis 项目(Maven配置部分(workshop))

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. Linux提权(2)-高级版

    当你在攻击受害者的电脑时即使你拥有了一个shell,依然可能会有一些拒绝执行指令的限制.为了获得目标主机的完整控制权限,你需要在未授权的地方绕过权限控制.这些权限可以删除文件,浏览私人信息,或者安装并 ...

  10. linux tcp超时重传实现分析

    kernel version 3.18.20 1.函数调用关系 tcp_ack-> tcp_clean_rtx_queue-> tcp_ack_update_rtt-> tp-> ...