1
zhanghua
2024-09-28 d385d4d35e20d7b24bc6a00cac20c5fd5374c2d8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
package com.dahua.netsdk.lib;
 
import com.dahua.netsdk.lib.NetSDKLib.SdkStructure;
import com.sun.jna.*;
import com.sun.jna.ptr.IntByReference;
 
/**
 * PlaySDK JNA接口封装
 */
public interface PlaySDKLib extends Library {
 
    PlaySDKLib PLAYSDK_INSTANCE = Native.load(LibraryLoad.getLoadLibrary("dhplay"), PlaySDKLib.class);
 
    /**
     * 错误码表
     *
     * @author 29779
     */
    public class PlaySDKLastError {
        public static final int DH_PLAY_NOERROR = 0;        //没有错误
        public static final int DH_PLAY_PARA_OVER = 1;        //输入参数非法
        public static final int DH_PLAY_ORDER_ERROR = 2;        //调用顺序不对
        public static final int DH_PLAY_TIMER_ERROR = 3;        //多媒体时钟设置失败
        public static final int DH_PLAY_DEC_VIDEO_ERROR = 4;        //视频解码失败
        public static final int DH_PLAY_DEC_AUDIO_ERROR = 5;        //音频解码失败
        public static final int DH_PLAY_ALLOC_MEMORY_ERROR = 6;        //分配内存失败
        public static final int DH_PLAY_OPEN_FILE_ERROR = 7;        //文件操作失败
        public static final int DH_PLAY_CREATE_OBJ_ERROR = 8;        //创建线程事件等失败
        public static final int DH_PLAY_CREATE_DDRAW_ERROR = 9;        //创建directDraw失败
        public static final int DH_PLAY_CREATE_OFFSCREEN_ERROR = 10;        //创建后端缓存失败
        public static final int DH_PLAY_BUF_OVER = 11;        //缓冲区满,输入流失败
        public static final int DH_PLAY_CREATE_SOUND_ERROR = 12;        //创建音频设备失败
        public static final int DH_PLAY_SET_VOLUME_ERROR = 13;        //设置音量失败
        public static final int DH_PLAY_SUPPORT_FILE_ONLY = 14;        //只能在播放文件时才能使用
        public static final int DH_PLAY_SUPPORT_STREAM_ONLY = 15;        //只能在播放流时才能使用
        public static final int DH_PLAY_SYS_NOT_SUPPORT = 16;        //系统不支持,解码器只能工作在Pentium 3以上
        public static final int DH_PLAY_FILEHEADER_UNKNOWN = 17;        //没有文件头
        public static final int DH_PLAY_VERSION_INCORRECT = 18;        //解码器和编码器版本不对应
        public static final int DH_PLAY_INIT_DECODER_ERROR = 19;        //初始化解码器失败
        public static final int DH_PLAY_CHECK_FILE_ERROR = 20;        //文件太短或码流无法识别
        public static final int DH_PLAY_INIT_TIMER_ERROR = 21;        //初始化多媒体时钟失败
        public static final int DH_PLAY_BLT_ERROR = 22;        //位拷贝失败
        public static final int DH_PLAY_UPDATE_ERROR = 23;        //显示overlay失败
        public static final int DH_PLAY_MEMORY_TOOSMALL = 24;        //缓冲太小
    }
 
    /**
     * 视频码流类型
     *
     * @author 29779
     */
    public static class T_VIDEO extends SdkStructure {
        public static final int T_UYVY = 1;        //UYVY类型的YUV数据,现在不支持.
        public static final int T_IYUV = 3;        //IYUV(I420)类型YUV数据
        public static final int T_RGB32 = 7;        //RGB32类型
    }
 
    public static class RenderType extends SdkStructure {
        public static final int RENDER_NOTSET = 0;
        public static final int RENDER_GDI = 1;
        public static final int RENDER_X11 = RENDER_GDI;
        public static final int RENDER_D3D = 2;
        public static final int RENDER_OPENGL = RENDER_D3D;
        public static final int RENDER_DDRAW = 3;
    }
 
    public static class DecodeType extends SdkStructure {
        public static final int DECODE_NOTSET = 0;
        public static final int DECODE_SW = 1;
        public static final int DECODE_HW = 2;         //拷贝模式
        public static final int DECODE_HW_FAST = 3;  //直接显示模式
        public static final int DECODE_MSDK = 4;
    }
 
    /**
     * PLAY_GetFreePort 获取空闲通道号,上限为501.与PLAY_ReleasePort匹对使用.
     *
     * @param plPort plPort,输出参数,返回获取的通道号.
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_GetFreePort(IntByReference plPort);
 
    /**
     * PLAY_OpenStream  打开流播放
     *
     * @param nPort        通道号
     * @param pFileHeadBuf 目前不使用,填NULL.
     * @param nSize        目前不适用,填0.
     * @param nBufPoolSize 设置播放器中存放数据流的缓冲区大小. 范围是[SOURCE_BUF_MIN,SOURCE_BUF_MAX].一般设为900*1024,如果数
     *                     据送过来相对均匀,可调小该值,如果数据传输不均匀,可增大该值.
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_OpenStream(int nPort, byte[] pFileHeadBuf, int nSize, int nBufPoolSize);
 
    /**
     * 抓图回调函数
     */
    public interface IDisplayCBFun extends SDKCallback {
        /**
         * IDisplsyCBFun,
         *
         * @param nPort     通道号
         * @param pBuf      返回图像数据
         * @param nSize     返回图像数据大小
         * @param nWidth    画面宽,单位像素
         * @param nHeight   画面高
         * @param nStamp    时标信息,单位毫秒
         * @param nType     数据类型,T_RGB32,T_UYVY,详见 T_VIDEO
         * @param pReserved 对应用户自定义参数
         * @see T_VIDEO
         */
        void invoke(int nPort, Pointer pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, Pointer pReserved);
    }
 
    /**
     * PLAY_SetDisplayCallBack
     * 设置视频抓图回调函数.如果要停止回调,可以把回调函数指针设为NULL,该函数可以在任何时候调用
     *
     * @param nPort
     * @param DisplayCBFun 抓图回调函数,
     * @param pUserData    用户自定义参数
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_SetDisplayCallBack(int nPort, IDisplayCBFun DisplayCBFun, Pointer pUserData);
 
    /**
     * PLAY_Play 开始播放.如果已经播放,改变当前播放状态为正常速度播放.
     *
     * @param nPort 通道号
     * @param hWnd  播放窗口句柄
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_Play(int nPort, Pointer hWnd);
 
    /**
     * PLAY_InputData 输 入数据流,PLAY_Play之后使用
     *
     * @param nPort 通道号
     * @param pBuf  缓冲区地址
     * @param nSize 缓冲区大小
     * @return 成功返回 1,失败返回 0. 如失败,一般是缓冲区已满,用户可暂停输入,一段时间之后再输入流,确保播放库不丢失数据。
     */
    public int PLAY_InputData(int nPort, byte[] pBuf, int nSize);
 
    /**
     * PLAY_Stop 停止播放
     *
     * @param nPort 通道号
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_Stop(int nPort);
 
    /**
     * PLAY_CloseStream 关闭流
     *
     * @param nPort 通道号
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_CloseStream(int nPort);
 
    /**
     * PLAY_ReleasePort 释放通道号,与PLAY_RealsePort匹对使用.
     *
     * @param lPort
     * @return 成功返回 1,失败返回 0.
     */
    public int PLAY_ReleasePort(int lPort);
 
    /**
     * PLAY_GetLastError 获取错误码
     *
     * @param nPort 通道号
     * @return 获得当前错误的错误码.请参见错误码宏定义
     * @see PlaySDKLastError
     */
    public int PLAY_GetLastError(int nPort);
 
    /**
     * PLAY_GetLastErrorEx 获取错误码
     *
     * @param nPort 通道号
     * @return 获得当前错误的错误码.请参见错误码宏定义
     * @see PlaySDKLastErrorEx
     */
    public int PLAY_GetLastErrorEx(int nPort);
 
    /**
     * PLAY_GetPlayedTimeEx 获取文件当前播放时间
     *
     * @param nPort 通道号
     * @return 文件当前播放的时间, 单位毫秒.
     */
    public int PLAY_GetPlayedTimeEx(int nPort);
 
    /**
     * PLAY_SetPlayedTimeEx 设置文件当前播放时间
     *
     * @param nPort 通道号    nTime,设置文件播放位置到指定时间,单位毫秒.
     * @return BOOL, 成功返回TRUE, 失败返回FALSE.
     */
    public boolean PLAY_SetPlayedTimeEx(int nPort, int nTime);
 
    /**
     * PLAY_SetEngine 指定解码器(Windows平台), PLAY_Play之前调用有效, 如果单一设置其中一个Engine,可以将另一个传入NOTSET, 例如:PLAY_SetEngine(0, DECODE_HW, RENDER_NOTSET);
     *
     * @param nPort      通道号
     * @param decodeType 解码模式(仅限于H264, Hevc)
     * @param renderType 渲染模式
     * @return true:成功    false:失败
     */
    public boolean PLAY_SetEngine(int nPort, int decodeType, int renderType);
 
    /**
     * PLAY_SetSecurityKey   设置AES解密密钥
     *
     * @param nPort   解码通道
     * @param szKey   密钥的指针
     * @param nKeylen 密钥的长度
     * @return true:成功    false:失败
     */
    public boolean PLAY_SetSecurityKey(int nPort, String szKey, int nKeylen);
 
    public static class LOG_LEVEL extends SdkStructure {
        public static final int LOG_LevelUnknown = 0; // unknown
        public static final int LOG_LevelFatal = 1;         // fatal, when setting this level, (fatal) will output
        public static final int LOG_LevelError = 2;         // error,when setting this level, (fatal,error) will output
        public static final int LOG_LevelWarn = 3;         // warn, when setting this level, (fatal,error,warn) will output
        public static final int LOG_LevelInfo = 4;         // info, when setting this level, (fatal,error,warn,info) will output
        public static final int LOG_LevelTrace = 5;         // Trace, when setting this level, (fatal,error,warn,info,trace) will output
        public static final int LOG_LevelDebug = 6;         // Debug, when setting this level, (fatal,error,warn,info,trace,debug) will output
    }
 
    ;
 
    public void PLAY_SetPrintLogLevel(int logLevel);
 
    // 按时间回放进度回调函数原形
    public interface fDecCBFun extends SDKCallback {
 
        // pFrameInfo FRAME_INFO
        void invoke(int nPort, Pointer pBuf, int nSize, Pointer pFrameInfo, Pointer pUserData, int nReserved2);
    }
 
    /**
     * 设置解码回调,替换播放器中的显示部分,由用户自己控制显示,该函数在
     * PLAY_Play之前调用,在PLAY_Stop时自动失效,下次调用PLAY_Play之前
     * 需要重新设置。解码部分不控制速度,只要用户从回调函数中返回,解码器
     * 就会解码下一部分数据。适用于只解码不显示的情形。
     *
     * @return BOOL,成功返回TRUE,失败返回FALSE
     * @param[in] nPort 通道号
     * @param[out] DecCBFun 解码回调函数指针,不能为NULL
     * @param[in] pUserData 用户自定义参数
     * @note 如果返回失败,可以调用PLAY_GetLastErrorEx接口获取错误码。
     */
    public boolean PLAY_SetDecCallBackEx(int nPort, fDecCBFun DecCBFun, Pointer pUserData);
 
    /* 帧信息 */
    public static class FRAME_INFO extends SdkStructure {
        public int nWidth;                    // 画面宽,单位像素。如果是音频数据则为0
        public int nHeight;                    // 画面高,如果是音频数据则为0
        public int nStamp;                    // 时标信息,单位毫秒
        public int nType;                    // 视频帧类型,T_AUDIO16,T_RGB32,T_IYUV
        public int nFrameRate;                // 视频表示帧率,音频表示采样率
    }
 
    /**
     * 查询信息。
     *
     * @param[in] nPort 通道号
     * @param[in] cmdType 指定状态查询指令,见CMD_TYPE_E
     * @param[in] buf 存放信息的缓冲
     * @param[in] buflen 缓冲长度
     * @param[out] returnlen 获取的信息的有效数据长度
     * @return BOOL,成功返回TRUE,失败返回FALSE
     * @note 如果返回失败,可以调用PLAY_GetLastErrorEx接口获取错误码。
     */
    public boolean PLAY_QueryInfo(int nPort, int cmdType, Pointer buf, int buflen, IntByReference returnlen);
 
    public static class TimeInfo extends SdkStructure {
        public int year;
        public int month;
        public int day;
        public int hour;
        public int minute;
        public int second;
 
        @Override
        public String toString() {
            return year + "/" + month + "/" + day + " " + hour + ":" + minute + ":" + second;
        }
    }
}