package com.dahua.netsdk.lib.streamParserAndPackage;
|
import com.dahua.netsdk.lib.LibraryLoad;
|
import com.sun.jna.Library;
|
import com.sun.jna.Native;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.Structure;
|
|
|
public interface StreamParser extends Library{
|
//StreamParser INSTANCE = (StreamParser) Native.loadLibrary((Platform.isWindows()? "StreamParser":"C"), StreamParser.class);
|
StreamParser INSTANCE = Native.load(LibraryLoad.getLoadLibrary("StreamParser"), StreamParser.class);
|
|
// 接口返回值
|
public static interface SP_RESULT
|
{
|
public static final int SP_SUCCESS = 0; /*成功*/
|
public static final int SP_ERROR_INVALID_HANDLE = 1; /*无效句柄*/
|
public static final int SP_ERROR_FILE_TYPE_NOSUPPORT = 2; /*文件类型不支持*/
|
public static final int SP_ERROR_STREAM_NOSUPPORT= 3; /*流类型不支持*/
|
public static final int SP_ERROR_PARAMETER = 6; /*参数有误*/
|
public static final int SP_ERROR_BAD_FORMATTED = 9; /*文件格式错误*/
|
public static final int SP_ERROR_BUFFER_OVERFLOW = 12; /*内部缓冲区溢出*/
|
public static final int SP_ERROR_SYSTEM_OUT_OF_MEMORY = 13; /*系统内存不够*/
|
public static final int SP_ERROR_LIST_EMPTY = 14; /*列表为空*/
|
}
|
|
// 帧类型
|
public static interface SP_FRAME_TYPE
|
{
|
public static final int SP_FRAME_TYPE_UNKNOWN = 0; /*帧类型不可知*/
|
public static final int SP_FRAME_TYPE_VIDEO = 1; /*帧类型是视频帧*/
|
public static final int SP_FRAME_TYPE_AUDIO = 2; /*帧类型是音频帧*/
|
public static final int SP_FRAME_TYPE_DATA = 3; /*帧类型是数据帧*/
|
}
|
|
// 帧子类型
|
public static interface SP_FRAME_SUB_TYPE
|
{
|
public static final int SP_FRAME_SUB_TYPE_DATA_INVALID = -1; /*数据无效*/
|
public static final int SP_FRAME_SUB_TYPE_VIDEO_I_FRAME = 0; /*I帧*/
|
public static final int SP_FRAME_SUB_TYPE_VIDEO_P_FRAME = 1; /*P帧*/
|
public static final int SP_FRAME_SUB_TYPE_VIDEO_B_FRAME = 2; /*B帧*/
|
public static final int SP_FRAME_SUB_TYPE_VIDEO_JPEG_FRAME = 8; /*JPEG帧*/
|
}
|
|
// 视频编码类型
|
public static interface SP_ENCODE_VIDEO_TYPE
|
{
|
public static final int SP_ENCODE_VIDEO_UNKNOWN = 0; /*视频编码格式不可知*/
|
public static final int SP_ENCODE_VIDEO_MPEG4 = 1; /*视频编码格式是MPEG4*/
|
public static final int SP_ENCODE_VIDEO_HI_H264 = 2; /*视频编码格式是海思H264*/
|
public static final int SP_ENCODE_VIDEO_JPEG = 3; /*视频编码格式是标准JPEG*/
|
public static final int SP_ENCODE_VIDEO_DH_H264 = 4; /*视频编码格式是DH码流H264*/
|
public static final int SP_ENCODE_VIDEO_MPEG2 = 9; /*视频编码格式是MPEG2*/
|
public static final int SP_ENCODE_VIDEO_DH_H265 = 12; /*视频编码格式是H265*/
|
public static final int SP_ENCODE_VIDEO_H263 = 35; /*视频编码格式是H263*/
|
}
|
|
// 音频编码类型
|
public static interface SP_ENCODE_AUDIO_TYPE
|
{
|
public static final int SP_ENCODE_AUDIO_UNKNOWN = 0;
|
public static final int SP_ENCODE_AUDIO_PCM = 7; /*音频编码格式是PCM8*/
|
public static final int SP_ENCODE_AUDIO_G729 = 8; /*音频编码格式是G729*/
|
public static final int SP_ENCODE_AUDIO_IMA = 9; /*音频编码格式是IMA*/
|
public static final int SP_ENCODE_PCM_MULAW = 10; /*音频编码格式是PCM MULAW*/
|
public static final int SP_ENCODE_AUDIO_G721 = 11; /*音频编码格式是G721*/
|
public static final int SP_ENCODE_PCM8_VWIS = 12; /*音频编码格式是PCM8_VWIS*/
|
public static final int SP_ENCODE_MS_ADPCM = 13; /*音频编码格式是MS_ADPCM*/
|
public static final int SP_ENCODE_AUDIO_G711A = 14; /*音频编码格式是G711A*/
|
public static final int SP_ENCODE_AUDIO_AMR = 15; /*音频编码格式是AMR*/
|
public static final int SP_ENCODE_AUDIO_PCM16 = 16; /*音频编码格式是PCM16*/
|
public static final int SP_ENCODE_AUDIO_G711U = 22; /*音频编码格式是G711U*/
|
public static final int SP_ENCODE_AUDIO_G723 = 23; /*音频编码格式是G723*/
|
public static final int SP_ENCODE_AUDIO_AAC = 26; /*音频编码格式是AAC*/
|
public static final int SP_ENCODE_AUDIO_MP2 = 31; /*音频编码格式是mp2*/
|
public static final int SP_ENCODE_AUDIO_OGG = 32; /*音频编码格式是ogg vorbis*/
|
public static final int SP_ENCODE_AUDIO_MP3 = 33; /*音频编码格式是mp3*/
|
public static final int SP_ENCODE_AUDIO_G722_1 = 34; /*音频编码格式是G722.1*/
|
public static final int SP_ENCODE_AUDIO_AC = 49; /*音频编码格式是AC3*/
|
}
|
|
// 加密类型
|
public static interface SP_ENCRYPT_TYPE
|
{
|
public static final int SP_ENCRYPT_UNKOWN = 0;
|
public static final int SP_ENCRYPT_AES = 1;
|
}
|
|
// 时间信息
|
@Structure.FieldOrder(value={"nYear","nMonth","nDay","nHour","nMinute","nSecond","nMilliSecond"})
|
class SP_TIME extends Structure
|
{
|
public int nYear; /*年*/
|
public int nMonth; /*月*/
|
public int nDay; /*日*/
|
public int nHour; /*小时*/
|
public int nMinute; /*分钟*/
|
public int nSecond; /*秒*/
|
public int nMilliSecond; /*毫秒*/
|
}
|
|
// 帧信息
|
@Structure.FieldOrder(value={"frameType","frameSubType","frameEncodeType","reserved1","streamPointer","streamLen",
|
"framePointer","frameLen","frameTime","timeStamp","frameSeq","frameRate",
|
"width","height","reserved2","reserved3","samplePerSec","bitsPerSample",
|
"channels","isValid","reaserved4"})
|
class SP_FRAME_INFO extends Structure
|
{
|
|
/*类型*/
|
public int frameType; /*帧类型*/
|
public int frameSubType; /*帧子类型*/
|
public int frameEncodeType; /*帧编码类型*/
|
public int reserved1; /*保留字段*/
|
|
/*数据*/
|
public Pointer streamPointer; /*指向码流数据*/
|
public int streamLen; /*码流长度*/
|
public Pointer framePointer; /*指向帧头*/
|
public int frameLen; /*帧长度(包括帧头、数据、帧尾)*/
|
|
/*时间*/
|
public SP_TIME frameTime = new SP_TIME(); /*时间信息*/
|
public int timeStamp; /*时间戳*/
|
|
/*序号*/
|
public int frameSeq; /*帧序号*/
|
|
/*视频属性,关键帧才有*/
|
public int frameRate; /*帧率*/
|
public int width; /*宽*/
|
public int height; /*高*/
|
|
public int reserved2;
|
public int reserved3;
|
|
/*音频属性*/
|
public int samplePerSec; /*采样频率*/
|
public int bitsPerSample; /*采样位数*/
|
public int channels; /*声道数*/
|
|
/*错误标志*/
|
public int isValid; /*0为有效,非0表示真错误*/
|
|
// 64位保留字段
|
public byte[] reaserved4 = new byte[432]; /*保留字节*/
|
|
// 32位保留字段
|
//public byte[] reaserved4 = new byte[412]; /*保留字节*/
|
}
|
|
/********************************************************************
|
* Funcname: SP_CreateStreamParser
|
* Purpose: 创建流分析器
|
* InputParam: nBufferSize: 需要开辟的缓冲区大小,不能小于SP_PaseData每次传入的数据流长度
|
* OutputParam: 无
|
* Return: NULL: 创建流分析器失败
|
* 其他值:流解析器句柄
|
*********************************************************************/
|
Pointer SP_CreateStreamParser(int nBufferSize);
|
|
/********************************************************************
|
* Funcname: SP_ParseData
|
* Purpose: 输入数据流,并同步进行分析
|
* InputParam: handle: 通过SP_CreateStreamParser返回的句柄
|
* stream: 数据流缓冲地址
|
* length: 数据流长度
|
* OutputParam: 无
|
* Return: 详见SP_RESULT
|
*********************************************************************/
|
int SP_ParseData(Pointer handle, byte[] stream, int length);
|
|
/********************************************************************
|
* Funcname: SP_GetOneFrame
|
* Purpose: 同步获取一帧信息,反复调用直到失败
|
* InputParam: handle: 通过SP_CreateStreamParser返回的句柄
|
* frameInfo: 外部SP_FRAME_INFO的一个结构地址。
|
* OutputParam: 无
|
* Return: 详见SP_RESULT
|
*********************************************************************/
|
int SP_GetOneFrame(Pointer handle, Pointer frameInfo);
|
|
/********************************************************************
|
* Funcname: SP_StreamEncryptKey
|
* Purpose: 设置实时流解析秘钥
|
* InputParam: handle: 通过SP_CreateStreamParser或SP_CreateFileParser返回的句柄。
|
* type : 秘钥类型 :SP_ENCRYPT
|
* key:秘钥数据
|
* keylen:秘钥长度
|
* OutputParam: 无
|
* Return: 详见SP_RESULT
|
*********************************************************************/
|
int SP_StreamEncryptKey(Pointer handle, int type, byte[] key, int keylen);
|
|
/********************************************************************
|
* Funcname: SP_Destroy
|
* Purpose: 销毁码流分析器
|
* InputParam: handle: 通过SP_CreateStreamParser返回的句柄。
|
* OutputParam: 无
|
* Return: 详见SP_RESULT
|
*********************************************************************/
|
int SP_Destroy(Pointer handle);
|
|
/********************************************************************
|
* Funcname: SP_GetLastError
|
* Purpose: 获得码流分析库错误码
|
* InputParam: handle: 通过SP_CreateStreamParser或SP_CreateFileParser返回的句柄。
|
* OutputParam: 无
|
* Return: 详见SP_RESULT
|
*********************************************************************/
|
int SP_GetLastError(Pointer handle);
|
}
|