typedef unsigned char HI_U8;
typedef unsigned char HI_UCHAR;
typedef unsigned long HI_U32;
typedef unsigned __int64 HI_U64;
typedef void* HI_HDL;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 );typedef struct hiH264_DEC_FRAME_S
{
HI_U8* pY;
HI_U8* pU;
HI_U8* pV;
HI_U32 uWidth;
HI_U32 uHeight;
HI_U32 uYStride;
HI_U32 uUVStride;
HI_U32 uCroppingLeftOffset;
HI_U32 uCroppingRightOffset;
HI_U32 uCroppingTopOffset;
HI_U32 uCroppingBottomOffset;
HI_U32 uDpbIdx;
HI_U32 uPicFlag;
HI_U32 bError;
HI_U32 bIntra;
HI_U64 ullPTS;
HI_U32 uPictureID;
HI_U32 uReserved;
H264_USERDATA_S *pUserData;
} H264_DEC_FRAME_S;typedef struct hiH264_USERDATA_S
{
HI_U32 uUserDataType;
HI_U32 uUserDataSize;
HI_UCHAR* pData;
struct hiH264_USERDATA_S* pNext;
} H264_USERDATA_S;
typedef unsigned char HI_UCHAR;
typedef unsigned long HI_U32;
typedef unsigned __int64 HI_U64;
typedef void* HI_HDL;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 );typedef struct hiH264_DEC_FRAME_S
{
HI_U8* pY;
HI_U8* pU;
HI_U8* pV;
HI_U32 uWidth;
HI_U32 uHeight;
HI_U32 uYStride;
HI_U32 uUVStride;
HI_U32 uCroppingLeftOffset;
HI_U32 uCroppingRightOffset;
HI_U32 uCroppingTopOffset;
HI_U32 uCroppingBottomOffset;
HI_U32 uDpbIdx;
HI_U32 uPicFlag;
HI_U32 bError;
HI_U32 bIntra;
HI_U64 ullPTS;
HI_U32 uPictureID;
HI_U32 uReserved;
H264_USERDATA_S *pUserData;
} H264_DEC_FRAME_S;typedef struct hiH264_USERDATA_S
{
HI_U32 uUserDataType;
HI_U32 uUserDataSize;
HI_UCHAR* pData;
struct hiH264_USERDATA_S* pNext;
} H264_USERDATA_S;
解决方案 »
- C#中字典(dictionary)的问题
- DSOFramer.ocx 求稳定版 我的是 2.2.1.2 在线保存两次 ie就死
- C#中字符双引号(")该如何表示?
- 急求C#运算符r3 = (0x6c000 | ((DEN >> 12) & 0x3ff))指导
- 急!急!急!发布网站时app_code.dll发生冲突!!!大侠们帮帮小妹!!在线等====
- C#中如何打开一个word文档!!!
- 显示,用C#实现
- MVVM 修改
- 如何在C#中调用并执行其它程序!
- ASP.NET 怎样实现分页呢
- [高分求救]C#调用C++里的.dll文件,求其中一个方法参数列表的意思。
- 帮忙把一句VB的翻译成C#的,谢谢!
这方面的问题,都还没有解决,可以共同商讨
http://hi.baidu.com/2fred/blog/item/54c89a254b89aa6734a80f93.html
unsafe extern public static int Hi264DecFrame(void* hDec, byte* pStream, uint iStreamLen, ulong ullPTS, H264_DEC_FRAME_S* pDecFrame, uint uFlags);[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct H264_DEC_FRAME_S
{
public byte* pY;
public byte* pU;
public byte* pV;
public uint uWidth;
public uint uHeight;
public uint uYStride;
public uint uUVStride;
public uint uCroppingLeftOffset;
public uint uCroppingRightOffset;
public uint uCroppingTopOffset;
public uint uCroppingBottomOffset;
public uint uDpbIdx;
public uint uPicFlag;
public uint bError;
public uint bIntra;
public ulong ullPTS;
public uint uPictureID;
public uint uReserved;
public H264_USERDATA_S* pUserData;
} [StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct H264_USERDATA_S
{
public uint uUserDataType;
public uint uUserDataSize;
public byte* pData;
public H264_USERDATA_S* pNext;
}
第二个参数如果用byte*,在c#里调用应该怎么传值呢?我是用的byte[]。按照我自己的方法调用的时候Hi264DecFrame的返回值是表示第一个参数为空或输出参数pDecFrame为空。
第一个参数我调试看是有值的
byte[]转换成byte*需要固定一下,
fixed(byte* pb=byteArray)
{
在这里可以用pb这个指针。
类似的可以把pb转成void*: void*pv=(void*)pb; 结构取地址后也可以这样转换。
}IntPtr和*都可以互相转换使用的。
//给attr赋值
void* ip = CDll. Hi264DecCreate(&attr);
hiH264_DEC_FRAME_S frame = new hiH264_DEC_FRAME_S();
hiH264_USERDATA_S userdata = new hiH264_USERDATA_S();
frame.pUserData = &userdata; FileStream fs //打开一个文件
byte[] buffer = new byte[1024*50]; UInt32 len = (UInt32)(fs.Read(buffer,0,buffer.Length));
UInt32 flag =(UInt32)( (len>0)?0:1);
int rel =0;
fixed(byte* pb=buffer)
rel = CDll.Hi264DecFrame(ip,pb,len,0,&frame,flag);现在 rel返回值正确了,但是frame.pUserData里的数据是空的。
unsafe public struct hiH264_USERDATA_S
{
public System.UInt32 uUserDataType;
public System.UInt32 uUserDataSize;
public byte* pData;
public hiH264_USERDATA_S* pNext;
}
如果不写frame.pUserData = &userdata;这句,frame.pUserData都是空的。
---------
pData是空的?这个也是个指针,估计你那个函数要往里填数据,一般这种东西都是调用方分配空间的,所以,你需要再弄一个byte[]给它。
{
HI_U32 uUserDataType;
HI_U32 uUserDataSize; 看样子这个字段是调用后pData的实际长度。
HI_UCHAR* pData;
struct hiH264_USERDATA_S* pNext;
}
所以给pData分配的容量要满足预计需求。
在c++里调用直接申明一个hiH264_DEC_FRAME_S frame,然后传地址进去,frame.pUserData.pData就有值了。
现在函数返回值是说数据已经正确返回了。
H264_USERDATA_S *pUserData;
C++里也要分配空间呀,难道是被调用方分配的?
把C++代码贴上来一些。
h264_dec_attr_s dec_attrbute;
h264_dbc_frame_s dec_frame;
hi_hdl handle =null;file* h264=null;
h264 = fopen();
给dec_attrbute赋值handle = hi264deccreate(&dec_attrbute);//上一个帖子问的,这个已经没问题了
hi_u32 len 赋值
hi_u32 flags 赋值
hi_s32 rel =0;
rel = hi264decframe(handle,buf,len,0,&dec_frame,flags)
后面是处理dec_frame里的数据这个是c++.dll提供的开发文档,我把没用的都省略了
uUserDataType=0
uUserDataSize=0
pData=null
pNext=null
#define __HI_CONFIG__#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#ifdef _WIN32
#include <malloc.h>
#include <windows.h>
#include <process.h>
#endif
#ifdef HI_DLL_CALL
#define HI_DLLEXPORT __declspec( dllexport )
#else
#define HI_DLLEXPORT
#endif
#define CONSTVOID const void
typedef unsigned char HI_U8;
typedef unsigned char HI_UCHAR;
typedef unsigned short HI_U16;
typedef unsigned long HI_U32;
typedef signed char HI_S8;
typedef signed short HI_S16;
typedef signed long HI_S32;
typedef char HI_CHAR;
typedef char* HI_PCHAR;
typedef float HI_FLOAT;
typedef double HI_DOUBLE;
typedef void HI_VOID;
typedef enum {
HI_FALSE = 0,
HI_TRUE = 1,
} HI_BOOL;#define HI_NULL 0L
#define HI_NULL_PTR HI_NULL#define HI_SUCCESS 0
#define HI_FAILURE (-1)#define HI_LITTLE_ENDIAN 1234
#define HI_BIG_ENDIAN 4321
#define HI_DECODER_SLEEP_TIME 60000
#ifdef _MSC_VER
typedef __int64 HI_S64;
typedef unsigned __int64 HI_U64;
#endif#if defined __INTEL_COMPILER || defined __GNUC__
typedef long long HI_S64;
typedef unsigned long long HI_U64;
#endif#ifdef _WIN32
#define HiSleep(x) Sleep(x)
#endif#endif __HI_CONFIG__#ifndef __HI_H264API__
#define __HI_H264API__
#define HI_H264DEC_OK 0
#define HI_H264DEC_NEED_MORE_BITS -1
#define HI_H264DEC_NO_PICTURE -2
#define HI_H264DEC_ERR_HANDLE -3typedef void* HI_HDL;
typedef struct hiH264_USERDATA_S
{
HI_U32 uUserDataType; //Type of userdata
HI_U32 uUserDataSize; //Length of userdata in byte
HI_UCHAR* pData; //Buffer contains userdata stuff
struct hiH264_USERDATA_S* pNext; //Pointer to next userdata
} H264_USERDATA_S;typedef struct hiH264_DEC_ATTR_S
{
HI_U32 uPictureFormat;
HI_U32 uStreamInType;
HI_U32 uPicWidthInMB;
HI_U32 uPicHeightInMB;
HI_U32 uBufNum;
HI_U32 uWorkMode;
H264_USERDATA_S *pUserData;
HI_U32 uReserved;
} H264_DEC_ATTR_S;
typedef struct hiH264_DEC_FRAME_S
{
HI_U8* pY;
HI_U8* pU;
HI_U8* pV;
HI_U32 uWidth;
HI_U32 uHeight;
HI_U32 uYStride;
HI_U32 uUVStride;
HI_U32 uCroppingLeftOffset;
HI_U32 uCroppingRightOffset;
HI_U32 uCroppingTopOffset;
HI_U32 uCroppingBottomOffset;
HI_U32 uDpbIdx;
HI_U32 uPicFlag;
HI_U32 bError;
HI_U32 bIntra;
HI_U64 ullPTS;
HI_U32 uPictureID;
HI_U32 uReserved;
H264_USERDATA_S *pUserData;
} H264_DEC_FRAME_S;
HI_HDL HI_DLLEXPORT Hi264DecCreate( H264_DEC_ATTR_S *pDecAttr );void HI_DLLEXPORT Hi264DecDestroy( HI_HDL hDec );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 );