package common
|
|
import (
|
"context"
|
"encoding/json"
|
"fmt"
|
"io/ioutil"
|
"strconv"
|
"time"
|
|
"basic.com/libgowrapper/sdkstruct.git"
|
"basic.com/pubsub/protomsg.git"
|
"basic.com/valib/deliver.git"
|
"github.com/gogo/protobuf/proto"
|
)
|
|
const mode = deliver.PushPull
|
|
// GetIpcAddress get ipc
|
func GetIpcAddress(shm bool, id string) string {
|
if shm {
|
return id
|
}
|
return `ipc:///tmp/` + id + `.ipc`
|
}
|
|
// SubConfig sub
|
type SubConfig struct {
|
SoFile string `json:"so_file_path"`
|
Env string `json:"runtime"`
|
Param map[string]string `json:"param"`
|
}
|
|
// SdkConfig sdk
|
type SdkConfig struct {
|
SoFile string `json:"so_file_path"`
|
Env string `json:"runtime"`
|
Param map[string]string `json:"param"`
|
Sub *SubConfig `json:"sub"`
|
}
|
|
// ReadConfig conf
|
func ReadConfig(file string) (SdkConfig, error) {
|
data, err := ioutil.ReadFile(file)
|
if err != nil {
|
return SdkConfig{}, fmt.Errorf("READ SDK CONFIG FILE %s ERROR", file)
|
}
|
|
//读取的数据为json格式,需要进行解码
|
var v SdkConfig
|
err = json.Unmarshal(data, &v)
|
|
return v, err
|
}
|
|
// Atoi atoi
|
func Atoi(s string) int {
|
i, _ := strconv.Atoi(s)
|
return i
|
}
|
|
// UnserilizeProto un
|
func UnserilizeProto(ctx context.Context, data <-chan []byte, out chan<- protomsg.SdkMessage, fn func(...interface{})) {
|
for {
|
select {
|
case <-ctx.Done():
|
return
|
case d := <-data:
|
if len(d) < 100 {
|
continue
|
}
|
msg := protomsg.SdkMessage{}
|
if err := proto.Unmarshal(d, &msg); err != nil {
|
fn(err, " msg 处理异常")
|
continue
|
}
|
|
out <- msg
|
|
default:
|
time.Sleep(10 * time.Millisecond)
|
}
|
}
|
}
|
|
// Msg2MsgSDK msg->msgsdk
|
func Msg2MsgSDK(msg protomsg.SdkMessage) *sdkstruct.MsgSDK {
|
|
d, err := proto.Marshal(&msg)
|
if err != nil {
|
return nil
|
}
|
|
index, count := int(msg.Tasklab.Index), len(msg.Tasklab.Sdkinfos)
|
if index >= count {
|
return &sdkstruct.MsgSDK{
|
MsgData: d,
|
SdkCount: count,
|
SdkIndex: index,
|
SdkDataLen: 0,
|
}
|
}
|
|
return &sdkstruct.MsgSDK{
|
MsgData: d,
|
SdkCount: count,
|
SdkIndex: index,
|
SdkDataLen: len(d),
|
}
|
}
|
|
// EjectResult eject
|
func EjectResult(res []byte, msg protomsg.SdkMessage, out chan<- sdkstruct.MsgSDK) {
|
|
if res == nil {
|
s := Msg2MsgSDK(msg)
|
if s == nil {
|
return
|
}
|
out <- *s
|
return
|
}
|
|
msg.Tasklab.Sdkinfos[int(msg.Tasklab.Index)].Sdkdata = res
|
|
s := Msg2MsgSDK(msg)
|
if s == nil {
|
return
|
}
|
out <- *s
|
}
|
|
/////////////////////////////////////////////////////////////
|
|
// ValidRemoteMessage valid or not
|
func ValidRemoteMessage(msg protomsg.SdkMessage, fnName string, fn func(...interface{})) bool {
|
if msg.Tasklab == nil {
|
fn(fnName, " recieve msg nil")
|
return false
|
}
|
|
sdkLen := len(msg.Tasklab.Sdkinfos)
|
if sdkLen == 0 {
|
fn(fnName, " has no sdk info")
|
return false
|
}
|
|
curIndex := int(msg.Tasklab.Index)
|
if curIndex < 0 || curIndex >= sdkLen {
|
fn(fnName, " tasklab index ", curIndex, " error")
|
return false
|
}
|
if msg.Tasklab.Sdkinfos[curIndex].Sdktype != fnName {
|
fn(fnName, " is different from ", msg.Tasklab.Sdkinfos[curIndex].Sdktype)
|
return false
|
}
|
return true
|
}
|
|
// UnpackImage unpack
|
func UnpackImage(msg protomsg.SdkMessage, fnName string, fn func(...interface{})) *protomsg.Image {
|
// 反序列化数据得到sdk入参
|
i := &protomsg.Image{}
|
err := proto.Unmarshal(msg.Data, i)
|
if err != nil {
|
fn(fnName, " protobuf decode CameraImage error: ", err.Error())
|
return nil
|
}
|
if i.Data == nil {
|
fn(fnName, " protomsg.Image data null")
|
return nil
|
}
|
return i
|
}
|