package main
|
|
import (
|
"analysis/demo"
|
"analysis/valib/ipc"
|
srv "analysis/work/service"
|
"bytes"
|
"context"
|
"encoding/gob"
|
"encoding/json"
|
"flag"
|
"fmt"
|
"strconv"
|
"time"
|
)
|
|
var (
|
picFolder string
|
|
ipcURL string
|
streamURL string
|
|
ipcServer bool
|
|
procType string
|
procCount int
|
)
|
|
func init() {
|
flag.StringVar(&streamURL, "i", "rtsp://192.168.1.203:8554/16.mkv", "input url")
|
flag.StringVar(&picFolder, "f", ".", "test pic folder")
|
|
flag.StringVar(&ipcURL, "ipc", "ipc:///tmp/piipc", "ipc label")
|
|
flag.BoolVar(&ipcServer, "server", false, "run ipc as server")
|
|
flag.IntVar(&procCount, "c", 1, "proc run count")
|
}
|
|
const (
|
sender = "snd"
|
reciever = "rcv"
|
)
|
|
// 每一个任务标签
|
type TaskLabel struct {
|
Taskid string
|
Sdkids []string
|
Index int
|
}
|
|
//每一条加工后的数据流
|
type SdkMessage struct {
|
Cid string
|
Tasklab TaskLabel
|
Data []byte
|
}
|
|
type ChSdkMsg struct {
|
sdkMsg SdkMessage
|
ch chan<- srv.ImageInfo
|
}
|
|
var mapSdkMsg = make(map[string]ChSdkMsg)
|
|
func recvSdkMsgInfoFromIPC(ctx context.Context, url string) {
|
ipc := ipc.NewClient(ctx, url)
|
fmt.Println("ipc address: ", url)
|
|
for {
|
msg := ipc.Recv()
|
if msg != nil {
|
|
var m SdkMessage
|
if err := json.Unmarshal(msg, &m); err == nil {
|
|
if v, ok := mapSdkMsg[m.Cid]; !ok {
|
imageChan := make(chan srv.ImageInfo)
|
mapSdkMsg[m.Cid] = ChSdkMsg{m, imageChan}
|
y := demo.NewYolo()
|
go y.ShowYoloWithName(imageChan, m.Cid)
|
} else {
|
|
fmt.Println("recv ipc : ", url, " cameraid : ", v.sdkMsg.Cid)
|
|
var buf bytes.Buffer
|
buf.Write(v.sdkMsg.Data)
|
dec := gob.NewDecoder(&buf)
|
var i srv.ImageInfo
|
if err := dec.Decode(&i); err != nil {
|
fmt.Println("gob decode CameraImage error", err)
|
continue
|
}
|
|
v.ch <- i
|
}
|
|
} else {
|
fmt.Println(err)
|
}
|
|
}
|
}
|
}
|
|
func main() {
|
flag.Parse()
|
|
fmt.Println("start test, pic folder: ", picFolder)
|
|
tcp := "tcp://192.168.1.124:"
|
port := 9000
|
ctx, cancel := context.WithCancel(context.Background())
|
for i := 0; i < procCount; i++ {
|
go recvSdkMsgInfoFromIPC(ctx, tcp+strconv.Itoa(port))
|
port++
|
}
|
for {
|
time.Sleep(time.Duration(2) * time.Second)
|
}
|
cancel()
|
}
|
|
func oneTest(ctx context.Context) {
|
imageChan := make(chan srv.ImageInfo)
|
d := srv.NewReciever(ctx, ipcURL, imageChan)
|
|
if ipcServer {
|
go d.RunAsServer()
|
} else {
|
go d.RunAsClient()
|
}
|
|
y := demo.NewYolo()
|
y.ShowYolo(imageChan)
|
|
}
|