112 lines
2.0 KiB
Go
112 lines
2.0 KiB
Go
package common
|
|
|
|
/*
|
|
#cgo CFLAGS: -I../include
|
|
#cgo LDFLAGS: -L../dl_lib -lkvm
|
|
#include "kvm_vision.h"
|
|
*/
|
|
import "C"
|
|
import (
|
|
"sync"
|
|
"unsafe"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var (
|
|
kvmVision *KvmVision
|
|
kvmVisionOnce sync.Once
|
|
)
|
|
|
|
type KvmVision struct{}
|
|
|
|
func GetKvmVision() *KvmVision {
|
|
kvmVisionOnce.Do(func() {
|
|
kvmVision = &KvmVision{}
|
|
|
|
logLevel := C.uint8_t(0)
|
|
C.kvmv_init(logLevel)
|
|
log.Debugf("kvm vision initialized")
|
|
})
|
|
|
|
return kvmVision
|
|
}
|
|
|
|
func (k *KvmVision) ReadMjpeg(width uint16, height uint16, quality uint16) (data []byte, result int) {
|
|
var (
|
|
kvmData *C.uint8_t
|
|
dataSize C.uint32_t
|
|
)
|
|
|
|
result = int(C.kvmv_read_img(
|
|
C.uint16_t(width),
|
|
C.uint16_t(height),
|
|
C.uint8_t(0),
|
|
C.uint16_t(quality),
|
|
&kvmData,
|
|
&dataSize,
|
|
))
|
|
if result < 0 {
|
|
log.Errorf("failed to read kvm image: %v", result)
|
|
return
|
|
}
|
|
defer C.free_kvmv_data(&kvmData)
|
|
|
|
data = C.GoBytes(unsafe.Pointer(kvmData), C.int(dataSize))
|
|
return
|
|
}
|
|
|
|
func (k *KvmVision) ReadH264(width uint16, height uint16, bitRate uint16) (data []byte, result int) {
|
|
var (
|
|
kvmData *C.uint8_t
|
|
dataSize C.uint32_t
|
|
)
|
|
|
|
result = int(C.kvmv_read_img(
|
|
C.uint16_t(width),
|
|
C.uint16_t(height),
|
|
C.uint8_t(1),
|
|
C.uint16_t(bitRate),
|
|
&kvmData,
|
|
&dataSize,
|
|
))
|
|
if result < 0 {
|
|
log.Errorf("failed to read kvm image: %v", result)
|
|
return
|
|
}
|
|
defer C.free_kvmv_data(&kvmData)
|
|
|
|
data = C.GoBytes(unsafe.Pointer(kvmData), C.int(dataSize))
|
|
return
|
|
}
|
|
|
|
func (k *KvmVision) SetHDMI(enable bool) int {
|
|
hdmiEnable := C.uint8_t(0)
|
|
if enable {
|
|
hdmiEnable = C.uint8_t(1)
|
|
}
|
|
|
|
result := int(C.kvmv_hdmi_control(hdmiEnable))
|
|
if result < 0 {
|
|
log.Errorf("failed to set hdmi to %t", enable)
|
|
return result
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func (k *KvmVision) SetGop(gop uint8) {
|
|
_gop := C.uint8_t(gop)
|
|
C.set_h264_gop(_gop)
|
|
}
|
|
|
|
func (k *KvmVision) SetFrameDetect(frame uint8) {
|
|
_frame := C.uint8_t(frame)
|
|
C.set_frame_detact(_frame)
|
|
}
|
|
|
|
func (k *KvmVision) Close() {
|
|
C.kvmv_deinit()
|
|
log.Debugf("stop kvm vision...")
|
|
}
|