From a79283f652e78fb8591a8af69f973055f9730c9d Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 20 十二月 2019 16:45:34 +0800
Subject: [PATCH] update

---
 go.sum     |   79 +++++++
 db.go      |  109 +++++++++
 go.mod     |   21 +
 facerun.go |  287 ++++++++++++++++++++++++++
 goface.go  |  118 +++++++---
 5 files changed, 571 insertions(+), 43 deletions(-)

diff --git a/db.go b/db.go
new file mode 100644
index 0000000..3b3e278
--- /dev/null
+++ b/db.go
@@ -0,0 +1,109 @@
+package main
+
+import (
+	"fmt"
+	"strconv"
+
+	"basic.com/dbapi.git"
+	"basic.com/libgowrapper/sdkstruct.git"
+	"basic.com/pubsub/cache.git/shardmap"
+	"basic.com/pubsub/protomsg.git"
+	"basic.com/valib/gopherdiscovery.git"
+	"github.com/gogo/protobuf/proto"
+)
+
+const (
+	prefixTASKSDKRULE = "TASKSDKRULE_"
+)
+
+var cMap *shardmap.ShardMap
+
+// InitDBAPI init dbapi
+func InitDBAPI(ip string, httpPort, heartBeatPort, dataPort int, log func(...interface{})) {
+	dbapi.Init(ip, httpPort)
+	var initchan = make(chan bool)
+	go InitCache(initchan, ip, heartBeatPort, dataPort)
+	log("db init done!", <-initchan)
+}
+
+// TaskInfos get camera infos from sqlite db
+func TaskInfos() []protomsg.TaskSdkInfo {
+	tAPI := dbapi.TaskApi{}
+	tasks := tAPI.FindAll()
+
+	return tasks
+}
+
+// SDKInfo get sdk
+func SDKInfo() []sdkstruct.SDKInfo {
+	sAPI := dbapi.SdkApi{}
+
+	s := sAPI.FindAllSdkRun()
+	var sdks []sdkstruct.SDKInfo
+	for _, v := range s {
+		sdks = append(sdks, sdkstruct.SDKInfo{
+			IpcID:   v.IpcId,
+			SdkType: v.SdkType,
+		})
+	}
+	return sdks
+}
+
+// InitCache cache
+func InitCache(initChan chan bool, dbIP string, surveyPort int, pubSubPort int) {
+	cMap = shardmap.New(uint8(32))
+	urlSurvey := "tcp://" + dbIP + ":" + strconv.Itoa(surveyPort)
+	urlPubSub := "tcp://" + dbIP + ":" + strconv.Itoa(pubSubPort)
+	client, _ := gopherdiscovery.ClientWithSub(urlSurvey, urlPubSub, "analysisProc")
+	recvMsg := client.HeartBeatMsg()
+	fmt.Println(<-recvMsg)
+
+	initCacheData(initChan)
+
+	peers, _ := client.Peers()
+	for b := range peers {
+		fmt.Println("peerMsg:", b)
+		updateData(b)
+	}
+}
+
+func initCacheData(initChan chan bool) {
+	initTaskSdkRule()
+	initChan <- true
+}
+
+func initTaskSdkRule() {
+	var api dbapi.TaskSdkRuleApi
+
+	b, rules := api.FindAllTaskSdkRules()
+	if b {
+		if rules != nil {
+			for _, tRule := range rules {
+				cMap.Set(prefixTASKSDKRULE+tRule.TaskId, tRule.SdkRules)
+			}
+		}
+	}
+}
+
+func updateData(b []byte) {
+	newUpdateMsg := &protomsg.DbChangeMessage{}
+	if err := proto.Unmarshal(b, newUpdateMsg); err != nil {
+		fmt.Println("dbChangeMsg unmarshal err:", err)
+		return
+	}
+	switch newUpdateMsg.Table {
+	case protomsg.TableChanged_T_TaskSdkRule:
+		initTaskSdkRule()
+	default:
+
+	}
+}
+
+// GetTaskSdkRules rules
+func GetTaskSdkRules(taskID string) []*protomsg.SdkRuleSet {
+	r, b := cMap.Get(prefixTASKSDKRULE + taskID)
+	if b {
+		return r.([]*protomsg.SdkRuleSet)
+	}
+	return nil
+}
diff --git a/facerun.go b/facerun.go
new file mode 100644
index 0000000..f7e9e12
--- /dev/null
+++ b/facerun.go
@@ -0,0 +1,287 @@
+package main
+
+import (
+	"context"
+	"sync"
+	"time"
+
+	"basic.com/libgowrapper/sdkhelper.git"
+
+	"basic.com/libgowrapper/sdkstruct.git"
+	"basic.com/pubsub/protomsg.git"
+	"basic.com/valib/gogpu.git"
+)
+
+type face struct {
+	handle *SDKFace
+
+	maxChannel      int
+	ftrackChans     map[string]chan protomsg.SdkMessage
+	ftrackChannels  map[string]int
+	ftrackChanStats []bool
+	chnLock         sync.Mutex
+
+	fnLogger func(...interface{})
+
+	typ                 string
+	id                  string
+	shm                 bool
+	ipc2Rule            string
+	ruleMsgMaxCacheSize int
+	reserved            map[string]string
+}
+
+// Create create sdk
+func Create(config string, typ, id string, gpu int, shm bool, ipc2Rule string, ruleMaxSize int, fn func(...interface{}), reserved map[string]string) interface{} {
+
+	handle := NewSDK(fn)
+	if handle == nil {
+		fn("Face SDK Create Error When New SDK")
+		return nil
+	}
+	cfg, err := sdkhelper.ReadConfig(config)
+	if err != nil {
+		fn("Face SDK Create Error When Read Config: ", err)
+		return nil
+	}
+
+	// 姝ゅ涓庝紶鍏ョ殑閰嶇疆鏂囦欢param蹇呴』涓�涓�瀵瑰簲,鍚﹀垯鍑洪敊
+	dt, dn, da, pt, et, ti, ts, mc, gm :=
+		"detect_thread",
+		"detect_num",
+		"detect_angle",
+		"property_thread",
+		"extract_thread",
+		"track_interval",
+		"track_sample",
+		"max_channel",
+		"gpu-memory"
+
+	params := []string{dt, dn, da, pt, et, ti, ts, mc, gm}
+
+	for _, v := range params {
+		if _, ok := cfg.Param[v]; !ok {
+			fn("Face SDK Create Error Because of Param Not Found: ", v)
+			return nil
+		}
+	}
+
+	w, h, detThrd, detNum, detAngle, propThrd, extThrd, trckInterval, trckSmpl, maxChan, gpuM :=
+		1280, 720, sdkhelper.Atoi(cfg.Param[dt]), sdkhelper.Atoi(cfg.Param[dn]), sdkhelper.Atoi(cfg.Param[da]),
+		sdkhelper.Atoi(cfg.Param[pt]), sdkhelper.Atoi(cfg.Param[et]), sdkhelper.Atoi(cfg.Param[ti]), sdkhelper.Atoi(cfg.Param[ts]),
+		sdkhelper.Atoi(cfg.Param[mc]), sdkhelper.Atoi(cfg.Param[gm])
+
+	if detAngle > 0 {
+	}
+
+	rGPU := gpu
+
+	if rGPU == -1 {
+		rGPU = gogpu.ValidGPU(gpuM + 512)
+	}
+	if rGPU == -1 {
+		fn("Face SDK Create Error When Find GPU")
+		return nil
+	}
+
+	if !handle.Tracker(w, h, detNum, trckInterval, trckSmpl, detThrd, rGPU) {
+		fn("Face SDK Create Error When Init Tracker")
+		return nil
+	}
+	if !handle.Extractor(extThrd, rGPU) {
+		fn("Face SDK Create Error When Init Extractor")
+		return nil
+	}
+
+	if !handle.Propertizer(propThrd) {
+		fn("Face SDK Create Error When Init Propertizer")
+		return nil
+	}
+
+	return &face{
+		handle: handle,
+
+		maxChannel:      maxChan,
+		ftrackChans:     make(map[string]chan protomsg.SdkMessage, maxChan),
+		ftrackChannels:  make(map[string]int, maxChan),
+		ftrackChanStats: make([]bool, maxChan, maxChan),
+
+		fnLogger: fn,
+
+		typ:                 typ,
+		id:                  id,
+		shm:                 shm,
+		ipc2Rule:            ipc2Rule,
+		ruleMsgMaxCacheSize: ruleMaxSize,
+		reserved:            reserved,
+	}
+}
+
+// Run run
+func Run(ctx context.Context, i interface{}) {
+	s := i.(*face)
+
+	const (
+		postPull = `_1`
+		postPush = `_2`
+	)
+	ipcRcv := sdkhelper.GetIpcAddress(s.shm, s.id+postPull)
+	ipcSnd := sdkhelper.GetIpcAddress(s.shm, s.id+postPush)
+	chRcv := make(chan []byte)
+	chSnd := make(chan sdkstruct.MsgSDK)
+
+	rcver := sdkhelper.NewReciever(ipcRcv, chRcv, s.shm, s.fnLogger)
+	snder := sdkhelper.NewSender(ipcSnd, chSnd, s.shm, s.fnLogger)
+	torule := sdkhelper.NewToRule(s.ipc2Rule, s.ruleMsgMaxCacheSize, s.fnLogger)
+
+	snder.ApplyCallbackFunc(torule.Push)
+
+	go rcver.Run(ctx)
+	go snder.Run(ctx)
+	go torule.Run(ctx)
+
+	go s.run(ctx, chRcv, chSnd)
+}
+
+//////////////////////////////////////////////////////////////////
+const (
+	cacheFrameNum   = 3
+	trackChnTimeout = time.Duration(10)
+)
+
+func (f *face) cleanChnStat() {
+	f.chnLock.Lock()
+	for i := 0; i < f.maxChannel; i++ {
+		f.ftrackChanStats[i] = false
+	}
+	f.chnLock.Unlock()
+}
+
+func (f *face) getAvailableChn() int {
+	f.chnLock.Lock()
+	defer f.chnLock.Unlock()
+
+	for i := 0; i < f.maxChannel; i++ {
+		if f.ftrackChanStats[i] == false {
+			f.ftrackChanStats[i] = true
+			return i
+		}
+	}
+	return -1
+}
+
+func (f *face) releaseChn(chn int) {
+	f.chnLock.Lock()
+	f.ftrackChanStats[chn] = false
+	f.chnLock.Unlock()
+}
+
+func (f *face) run(ctx context.Context, in <-chan []byte, out chan<- sdkstruct.MsgSDK) {
+
+	chMsg := make(chan protomsg.SdkMessage)
+	go sdkhelper.UnserilizeProto(ctx, in, chMsg, f.fnLogger)
+
+	for {
+		select {
+		case <-ctx.Done():
+			f.handle.Free()
+			return
+		case rMsg := <-chMsg:
+			if !sdkhelper.ValidRemoteMessage(rMsg, f.typ, f.fnLogger) {
+				f.fnLogger("FACE TRACK VALIDREMOTEMESSAGE INVALID")
+				sdkhelper.EjectResult(nil, rMsg, out)
+				continue
+			}
+
+			if _, ok := f.ftrackChans[rMsg.Cid]; ok {
+				f.ftrackChans[rMsg.Cid] <- rMsg
+			} else {
+
+				f.ftrackChans[rMsg.Cid] = make(chan protomsg.SdkMessage, cacheFrameNum)
+				chn := f.getAvailableChn()
+				if chn < 0 {
+					f.fnLogger("TOO MUCH CHANNEL")
+					sdkhelper.EjectResult(nil, rMsg, out)
+					continue
+				}
+				f.ftrackChannels[rMsg.Cid] = chn
+
+				i := sdkhelper.UnpackImage(rMsg, f.typ, f.fnLogger)
+				if i == nil {
+					sdkhelper.EjectResult(nil, rMsg, out)
+					continue
+				}
+				// conv to bgr24 and resize
+				imgW, imgH := int(i.Width), int(i.Height)
+				ret := f.handle.TrackerResize(imgW, imgH, chn)
+				f.fnLogger("ResizeFaceTracker: cid: ", rMsg.Cid, " chan: ", chn, " wXh: ", imgW, "x", imgH, " result:", ret)
+				go f.detectTrackOneChn(ctx, f.ftrackChans[rMsg.Cid], out, chn)
+				f.ftrackChans[rMsg.Cid] <- rMsg
+			}
+		default:
+			time.Sleep(time.Millisecond * 100)
+		}
+	}
+}
+
+func (f *face) detectTrackOneChn(ctx context.Context, in <-chan protomsg.SdkMessage, out chan<- sdkstruct.MsgSDK, dtchn int) {
+	tm := time.Now()
+	sc := 0
+	f.fnLogger("DETECTTRACKONECHN DTCHN: ", dtchn)
+	var curCid string
+
+	for {
+		select {
+		case <-ctx.Done():
+			return
+
+		case rMsg := <-in:
+
+			if !sdkhelper.ValidRemoteMessage(rMsg, f.typ, f.fnLogger) {
+				sdkhelper.EjectResult(nil, rMsg, out)
+				continue
+			}
+
+			i := sdkhelper.UnpackImage(rMsg, f.typ, f.fnLogger)
+			if i == nil || i.Data == nil || i.Width <= 0 || i.Height <= 0 {
+				sdkhelper.EjectResult(nil, rMsg, out)
+				continue
+			}
+
+			curCid = i.Cid
+
+			// conv to bgr24 and resize
+			imgW, imgH := int(i.Width), int(i.Height)
+
+			count, data, _ := f.handle.Run(i.Data, imgW, imgH, 3, dtchn)
+
+			sdkhelper.EjectResult(data, rMsg, out)
+			var id, name string
+			if rMsg.Tasklab != nil {
+				id, name = rMsg.Tasklab.Taskid, rMsg.Tasklab.Taskname
+			}
+			f.fnLogger("CAMERAID: ", rMsg.Cid, " TASKID: ", id, " TASKNAME: ", name, " DETECT ", f.typ, " COUNT: ", count)
+
+			sc++
+			if sc == 25 {
+				f.fnLogger("CHAN:%d, FACE RUN 25 FRAME USE TIME: ", dtchn, time.Since(tm))
+				sc = 0
+				tm = time.Now()
+			}
+
+			if time.Since(tm) > time.Second {
+				f.fnLogger("CHAN: ", dtchn, " FACE RUN ", sc, " FRAME USE TIME: ", time.Since(tm))
+				sc = 0
+				tm = time.Now()
+			}
+		case <-time.After(trackChnTimeout * time.Second):
+			f.fnLogger("Timeout to get image, curCid:", curCid)
+			if curCid != "" {
+				delete(f.ftrackChans, curCid)
+				f.releaseChn(dtchn)
+			}
+			return
+
+		}
+	}
+}
diff --git a/go.mod b/go.mod
index a8f027f..8a6f535 100644
--- a/go.mod
+++ b/go.mod
@@ -2,4 +2,23 @@
 
 go 1.12
 
-require basic.com/libgowrapper/sdkstruct.git v0.0.0-20191211011351-89daaec8738e
+require (
+	basic.com/dbapi.git v0.0.0-20191216030028-03153c1f1f30
+	basic.com/libgowrapper/sdkhelper.git v0.0.0-20191220070838-2d836fec8448
+	basic.com/libgowrapper/sdkstruct.git v0.0.0-20191220011601-e0b3d1f0183c
+	basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48
+	basic.com/pubsub/protomsg.git v0.0.0-20191219033725-b95da65535d0
+	basic.com/valib/deliver.git v0.0.0-20190927081905-2d390df9ede3 // indirect
+	basic.com/valib/gogpu.git v0.0.0-20190711044327-62043b070865
+	basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28
+	basic.com/valib/shm.git v0.0.0-20191029034255-156e610f9bca // indirect
+	github.com/ajg/form v1.5.1 // indirect
+	github.com/gogo/protobuf v1.3.1
+	github.com/gorilla/websocket v1.4.1 // indirect
+	golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect
+	golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
+	golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 // indirect
+	google.golang.org/grpc v1.26.0 // indirect
+	honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc // indirect
+	nanomsg.org/go-mangos v1.4.0 // indirect
+)
diff --git a/go.sum b/go.sum
index 939f47c..848d0d0 100644
--- a/go.sum
+++ b/go.sum
@@ -1,2 +1,77 @@
-basic.com/libgowrapper/sdkstruct.git v0.0.0-20191211011351-89daaec8738e h1:FIUozkg3tMk0K6cQMOt/DvlpK/A66AMDdCKpE4qlUzc=
-basic.com/libgowrapper/sdkstruct.git v0.0.0-20191211011351-89daaec8738e/go.mod h1:bNdkzVVGY+oQEcaYN9VlyIK/03WB3NQNQApjiPJjIag=
+basic.com/dbapi.git v0.0.0-20191216030028-03153c1f1f30 h1:nesVta2Rf3LAqyFtGAqNOI+Mf9SqHa4gz1Dj38nm5bk=
+basic.com/dbapi.git v0.0.0-20191216030028-03153c1f1f30/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
+basic.com/libgowrapper/sdkhelper.git v0.0.0-20191220070838-2d836fec8448 h1:fnzmik70HiNRSdeH7QHT+bqEy+eSfSSmXSZOWDff4G4=
+basic.com/libgowrapper/sdkhelper.git v0.0.0-20191220070838-2d836fec8448/go.mod h1:eBHanxa92Srb5c/OmupgcAZmLC3Et5HMp9JsebHAIC4=
+basic.com/libgowrapper/sdkstruct.git v0.0.0-20191220011601-e0b3d1f0183c h1:maWYZw9iSQUuN1jbDxgi9IvKrCD97tiTCv8PkLArZ/I=
+basic.com/libgowrapper/sdkstruct.git v0.0.0-20191220011601-e0b3d1f0183c/go.mod h1:bNdkzVVGY+oQEcaYN9VlyIK/03WB3NQNQApjiPJjIag=
+basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48 h1:BBA30Rgljn6MRieC4gUncETJDyna3ObyubTo9HEQ2M0=
+basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
+basic.com/pubsub/protomsg.git v0.0.0-20191219033725-b95da65535d0 h1:5NOX81GTsRLwbhnHWYU4g6jfcOynSWetmf9PlhK5eLI=
+basic.com/pubsub/protomsg.git v0.0.0-20191219033725-b95da65535d0/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/valib/deliver.git v0.0.0-20190927081905-2d390df9ede3 h1:VY23IpugB/FsU2hSnVeLjZKX5cSgNmhcSEiw6vxX+bg=
+basic.com/valib/deliver.git v0.0.0-20190927081905-2d390df9ede3/go.mod h1:bkYiTUGzckyNOjAgn9rB/DOjFzwoSHJlruuWQ6hu6IY=
+basic.com/valib/gogpu.git v0.0.0-20190711044327-62043b070865 h1:3XvkNdRlJDXV45ie8U0uGA9ImJZtyTT0C/h+4Rizv0Y=
+basic.com/valib/gogpu.git v0.0.0-20190711044327-62043b070865/go.mod h1:yxux5RP4A6a591vWljXxGlHdERVVyWDD3TwwQjuyogw=
+basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28 h1:3hejanzPEBvZSSvjIqayB83/6/6SLLrX9oNZAdiYELg=
+basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28/go.mod h1:CQ+UJyZV8MRzwwckncdUDu6/RDTKAzSIPCxc9tFcwPs=
+basic.com/valib/shm.git v0.0.0-20191029034255-156e610f9bca h1:Y2Lgpxx5Tq0nKSAaB00F4piJhljMgPpfsBGQ2qpEloE=
+basic.com/valib/shm.git v0.0.0-20191029034255-156e610f9bca/go.mod h1:yYRM7bM9y0KKd4IfNt3myjsvkFVFIIWNjsvK14tNbq4=
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
+github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
+github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+nanomsg.org/go-mangos v1.4.0 h1:pVRLnzXePdSbhWlWdSncYszTagERhMG5zK/vXYmbEdM=
+nanomsg.org/go-mangos v1.4.0/go.mod h1:MOor8xUIgwsRMPpLr9xQxe7bT7rciibScOqVyztNxHQ=
diff --git a/goface.go b/goface.go
index d5e2494..ad427c6 100644
--- a/goface.go
+++ b/goface.go
@@ -12,9 +12,12 @@
 */
 import "C"
 import (
+	"errors"
 	"unsafe"
 
 	"basic.com/libgowrapper/sdkstruct.git"
+	"basic.com/pubsub/protomsg.git"
+	"github.com/gogo/protobuf/proto"
 )
 
 // SDKFace sdk
@@ -28,7 +31,7 @@
 }
 
 // NewSDK sdk
-func NewSDK(fn func(...interface{})) interface{} {
+func NewSDK(fn func(...interface{})) *SDKFace {
 	h := C.create_sdkface()
 	if h == nil {
 		return nil
@@ -45,8 +48,7 @@
 }
 
 // Free free
-func Free(i interface{}) {
-	s := i.(*SDKFace)
+func (s *SDKFace) Free() {
 	if s != nil && s.handle != nil {
 		C.release(s.handle)
 	}
@@ -59,8 +61,8 @@
 }
 
 // Detector detector
-func Detector(i interface{}, minFaces, rollAngles, threadMax, gpu int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Detector(minFaces, rollAngles, threadMax, gpu int) bool {
+
 	if s.detector {
 		return true
 	}
@@ -74,8 +76,8 @@
 }
 
 // Extractor ext
-func Extractor(i interface{}, threadMax, gpu int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Extractor(threadMax, gpu int) bool {
+
 	if s.extractor {
 		return true
 	}
@@ -89,8 +91,8 @@
 }
 
 // Propertizer prop
-func Propertizer(i interface{}, threadMax int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Propertizer(threadMax int) bool {
+
 	if s.propertizer {
 		return true
 	}
@@ -104,8 +106,8 @@
 }
 
 // Tracker track
-func Tracker(i interface{}, w, h, maxFaces, interval, sampleSize, threadMax, gpu int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Tracker(w, h, maxFaces, interval, sampleSize, threadMax, gpu int) bool {
+
 	if s.tracker {
 		return s.tracker
 	}
@@ -134,7 +136,7 @@
 }
 
 // Detect det
-func Detect(s *SDKFace, data []byte, w, h, c int, ch int) []sdkstruct.CFacePos {
+func (s *SDKFace) Detect(data []byte, w, h, c int, ch int) []sdkstruct.CFacePos {
 	if !s.detector {
 		return nil
 	}
@@ -150,7 +152,7 @@
 }
 
 // Extract extract
-func Extract(s *SDKFace, fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) []byte {
+func (s *SDKFace) Extract(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) []byte {
 
 	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
 
@@ -166,8 +168,8 @@
 }
 
 // Compare face compare
-func Compare(i interface{}, feat1 []byte, feat2 []byte) float32 {
-	s := i.(*SDKFace)
+func (s *SDKFace) Compare(feat1 []byte, feat2 []byte) float32 {
+
 	if s.extractor {
 		return 0
 	}
@@ -177,7 +179,7 @@
 }
 
 // Propertize prop
-func Propertize(s *SDKFace, fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) *sdkstruct.CThftResult {
+func (s *SDKFace) Propertize(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) *sdkstruct.CThftResult {
 	if !s.propertizer {
 		return nil
 	}
@@ -208,7 +210,7 @@
 }
 
 // Track track
-func Track(s *SDKFace, data []byte, w, h, c int, ch int) []sdkstruct.CFaceInfo {
+func (s *SDKFace) Track(data []byte, w, h, c int, ch int) []sdkstruct.CFaceInfo {
 	if !s.tracker {
 		return nil
 	}
@@ -247,8 +249,7 @@
 }
 
 // TrackerResize init face tracker
-func TrackerResize(i interface{}, w, h, ch int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) TrackerResize(w, h, ch int) bool {
 
 	if !s.tracker {
 		s.printLog("->face--> TrackerResize Failed, No Tracker Init")
@@ -263,15 +264,13 @@
 }
 
 // Run run
-func Run(i interface{}, data []byte, w, h, c, dchan int) []sdkstruct.CFaceResult {
+func (s *SDKFace) Run(data []byte, w, h, c, dchan int) (int, []byte, error) {
 	if data == nil || w <= 0 || h <= 0 {
-		return nil
+		return 0, nil, errors.New("->face--> Face Input Image Error")
 	}
 
-	s := i.(*SDKFace)
-
 	if !s.tracker || !s.extractor || !s.propertizer {
-		return nil
+		return 0, nil, errors.New("->face--> Face SDK No Init Correctly")
 	}
 
 	channel := c
@@ -279,31 +278,70 @@
 		channel = 3
 	}
 
-	// if !TrackerResize(i, w, h, dchan) {
-	// 	return nil
-	// }
-
 	var fInfo []sdkstruct.CFaceInfo
 
-	fInfo = Track(s, data, w, h, c, dchan)
+	fInfo = s.Track(data, w, h, c, dchan)
+	if len(fInfo) == 0 {
+		return 0, nil, errors.New("->face--> Face Track No One")
+	}
 
-	var faces []sdkstruct.CFaceResult
-	//灏唖dk杩斿洖鍊艰浆鎹㈡垚protomsg绫诲瀷
+	var faces []*protomsg.ResultFaceDetect
+
 	for _, d := range fInfo {
 
 		//杩愯sd
 		dec := FaceInfo2FacePos(d)
-		prop := Propertize(s, dec, data, w, h, c, dchan)
-		feat := Extract(s, dec, data, w, h, c, dchan)
+		p := s.Propertize(dec, data, w, h, c, dchan)
+		feat := s.Extract(dec, data, w, h, c, dchan)
 
-		result := sdkstruct.CFaceResult{
-			Info: d,
-			Prop: *prop,
-			Feat: feat,
-		}
-		faces = append(faces, result)
+		/// filter rules
+		// sdkid := rMsg.Msg.Tasklab.Sdkinfos[rMsg.Msg.Tasklab.Index].Ipcid
+		// size := (d.RcFace.Right - d.RcFace.Left) * (d.RcFace.Bottom - d.RcFace.Top)
+		// angle := d.FAngle
+		// if !filter(rMsg.Msg.Tasklab.Taskid, sdkid, angle.Confidence, float32(angle.Yaw), int(size)) {
+		// 	continue
+		// }
+		/// filter rules
+
+		prop := (*protomsg.ThftResult)(unsafe.Pointer(&p))
+		fpos := tconvert2ProtoFacePos(d)
+
+		//缁勬垚缁撴灉骞跺簭鍒楀寲
+		res := &protomsg.ResultFaceDetect{Pos: fpos, Result: prop, Feats: feat}
+		faces = append(faces, res)
 
 	}
+	facePos := protomsg.ParamFacePos{Faces: faces}
+	d, e := proto.Marshal(&facePos)
 
-	return faces
+	return len(faces), d, e
+}
+
+func tconvert2ProtoFacePos(dec sdkstruct.CFaceInfo) *protomsg.FacePos {
+
+	crect := dec.RcFace
+	rect := protomsg.Rect{Left: crect.Left, Top: crect.Top, Right: crect.Right, Bottom: crect.Bottom}
+	leftEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtLeftEye))
+	rightEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtRightEye))
+	mouth := (*protomsg.Point)(unsafe.Pointer(&dec.PtMouth))
+	nose := (*protomsg.Point)(unsafe.Pointer(&dec.PtNose))
+	angle := (*protomsg.FaceAngle)(unsafe.Pointer(&dec.FAngle))
+	faceID := uint64(dec.NFaceID)
+
+	facialData := dec.PFacialData[:512]
+
+	// facialData := make([]byte, 512)
+	// copy(facialData[:], dec.PFacialData[:512])
+
+	return &protomsg.FacePos{
+		RcFace:     &rect,
+		PtLeftEye:  leftEye,
+		PtRightEye: rightEye,
+		PtMouth:    mouth,
+		PtNose:     nose,
+		FAngle:     angle,
+		Quality:    dec.NQuality,
+		FacialData: facialData,
+		FaceID:     faceID,
+	}
 }

--
Gitblit v1.8.0