Files
hcnetsdk-go/callback.go
2021-08-04 13:21:20 +08:00

68 lines
2.3 KiB
Go

package hcnetsdk
/*
#cgo CFLAGS: -I./include
#cgo windows LDFLAGS: -L${SRCDIR}/libs/windows -lHCCore -lHCNetSDK
#cgo linux LDFLAGS: -L${SRCDIR}/libs/linux -lHCCore -lHCNetSDK
#cgo darwin LDFLAGS: -L${SRCDIR}/libs/darwin -lHCCore -lHCNetSDK
#include "HCNetSDK.h"
*/
import "C"
import (
"unsafe"
)
//------------------消息回调------------------//
var messageCallBackHooks = make(map[int]MessageCallBack)
type MessageCallBack func(lCommand uint32, pAlarmer *NetDvrAlarmer, pAlarmInfo []byte, pUserData unsafe.Pointer) int32
//export fMSGCallBackGo
func fMSGCallBackGo(lCommand C.LONG, pAlarmer C.LPNET_DVR_ALARMER, pAlarmInfo *C.char, dwBufLen C.DWORD, pUser unsafe.Pointer) C.BOOL {
userId := int(pAlarmer.lUserID)
callback := messageCallBackHooks[userId]
if callback != nil {
alarmer := (*NetDvrAlarmer)(unsafe.Pointer(pAlarmer))
buffer := C.GoBytes(unsafe.Pointer(pAlarmInfo), C.int(dwBufLen))
return C.BOOL(callback(uint32(lCommand), alarmer, buffer, pUser))
}
return C.BOOL(1)
}
//------------------异常回调------------------//
var exceptionCallBackHooks = make(map[int]ExceptionCallBack)
type ExceptionCallBack func(dwType uint32, lUserID int32, lHandle int32, pUser interface{})
//export fExceptionCallBackGo
func fExceptionCallBackGo(dwType C.DWORD, lUserID C.LONG, lHandle C.LONG, pUser *C.void) {
callback := exceptionCallBackHooks[int(lUserID)]
if callback != nil {
callback(uint32(dwType), int32(lUserID), int32(lHandle), pUser)
}
}
//------------------视频流回调------------------//
var realDataCallBackHooks = make(map[int]RealDataCallBack)
type RealDataCallBack func(lPlayHandle int32, dwDataType uint32, pbuffer []byte, dwBufSize uint32, pUser interface{})
//export fRealDataCallBackGo
func fRealDataCallBackGo(lPlayHandle C.LONG, dwDataType C.DWORD, pBuffer *C.BYTE, dwBufSize C.DWORD, pUser *C.void) {
userData := *(*realDataCallBackDataWrapper)(unsafe.Pointer(pUser))
callback := realDataCallBackHooks[userData.UserId]
if callback != nil {
bytes := C.GoBytes(unsafe.Pointer(pBuffer), C.int(dwBufSize))
callback(int32(lPlayHandle), uint32(dwDataType), bytes, uint32(dwBufSize), userData.Data)
}
}
// 用户自定义数据包装
type realDataCallBackDataWrapper struct {
UserId int // 用户登录句柄
Data interface{} // 传递数据
}