From f7a86c37945d2923a0e9d20aecb9ba2573d0a632 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期六, 11 一月 2020 18:28:22 +0800 Subject: [PATCH] debug --- run.go | 146 ++++++++++++++++++++++++++++++------------------ 1 files changed, 90 insertions(+), 56 deletions(-) diff --git a/run.go b/run.go index e1f3cbd..cc5a50b 100644 --- a/run.go +++ b/run.go @@ -12,15 +12,74 @@ "basic.com/valib/gogpu.git" ) +type channel struct { + index int + msg chan protomsg.SdkMessage +} + +////////////////////////////////////////////////////////////////// +const ( + cacheFrameNum = 3 + trackChnTimeout = time.Duration(10) +) + +func (f *face) channelAvailable() int { + + for i := 0; i < f.maxChannel; i++ { + found := false + for _, v := range f.mapChan { + if v.index == i { + found = true + break + } + } + if !found { + return i + } + } + return -1 +} + +func (f *face) channelRelease(id string) { + f.mapChanLock.Lock() + defer f.mapChanLock.Unlock() + + delete(f.mapChan, id) +} + +func (f *face) channelExist(id string) (*channel, bool) { + f.mapChanLock.Lock() + defer f.mapChanLock.Unlock() + + c, ok := f.mapChan[id] + return c, ok +} + +func (f *face) channelNew(id string) *channel { + f.mapChanLock.Lock() + defer f.mapChanLock.Unlock() + + index := f.channelAvailable() + if index < 0 { + return nil + } + + c := &channel{ + index: index, + msg: make(chan protomsg.SdkMessage, cacheFrameNum), + } + + f.mapChan[id] = c + return c +} + type face struct { handle *SDKFace list *sdkhelper.LockList - maxChannel int - ftrackChans map[string]chan protomsg.SdkMessage - ftrackChannels map[string]int - ftrackChanStats []bool - chnLock sync.Mutex + maxChannel int + mapChan map[string]*channel + mapChanLock sync.Mutex fnLogger func(...interface{}) @@ -103,10 +162,8 @@ handle: handle, list: sdkhelper.NewLockList(maxChan + maxChan/2), - maxChannel: maxChan, - ftrackChans: make(map[string]chan protomsg.SdkMessage, maxChan), - ftrackChannels: make(map[string]int, maxChan), - ftrackChanStats: make([]bool, maxChan, maxChan), + maxChannel: maxChan, + mapChan: make(map[string]*channel, maxChan), fnLogger: fn, @@ -135,19 +192,21 @@ func (f *face) run(msgs []protomsg.SdkMessage, out chan<- sdkstruct.MsgSDK, typ string) { + f.fnLogger("######run batch images") + for _, msg := range msgs { - if _, ok := f.ftrackChans[msg.Cid]; ok { - f.ftrackChans[msg.Cid] <- msg + if c, ok := f.channelExist(msg.Cid); ok { + f.fnLogger("######push image") + c.msg <- msg + f.fnLogger("######push over image") } else { - f.ftrackChans[msg.Cid] = make(chan protomsg.SdkMessage, cacheFrameNum) - chn := f.getAvailableChn() - if chn < 0 { + nc := f.channelNew(msg.Cid) + if nc == nil { f.fnLogger("TOO MUCH CHANNEL") sdkhelper.EjectResult(nil, msg, out) continue } - f.ftrackChannels[msg.Cid] = chn i := sdkhelper.UnpackImage(msg, f.typ, f.fnLogger) if i == nil { @@ -156,23 +215,27 @@ } // conv to bgr24 and resize imgW, imgH := int(i.Width), int(i.Height) - ret := f.handle.TrackerResize(imgW, imgH, chn) - f.fnLogger("ResizeFaceTracker: cid: ", msg.Cid, " chan: ", chn, " wXh: ", imgW, "x", imgH, " result:", ret) - go f.detectTrackOneChn(f.ftrackChans[msg.Cid], out, chn) - f.ftrackChans[msg.Cid] <- msg + ret := f.handle.TrackerResize(imgW, imgH, nc.index) + f.fnLogger("ResizeFaceTracker: cid: ", msg.Cid, " chan: ", nc.index, " wXh: ", imgW, "x", imgH, " result:", ret) + go f.detectTrackOneChn(nc, out) + nc.msg <- msg } } + f.fnLogger("######run over batch images") + } -func (f *face) detectTrackOneChn(in <-chan protomsg.SdkMessage, out chan<- sdkstruct.MsgSDK, dtchn int) { +func (f *face) detectTrackOneChn(c *channel, out chan<- sdkstruct.MsgSDK) { tm := time.Now() sc := 0 + + dtchn := c.index f.fnLogger("DETECTTRACKONECHN DTCHN: ", dtchn) var curCid string for { select { - case rMsg := <-in: + case rMsg := <-c.msg: if !sdkhelper.ValidRemoteMessage(rMsg, f.typ, f.fnLogger) { sdkhelper.EjectResult(nil, rMsg, out) @@ -194,9 +257,14 @@ // conv to bgr24 and resize imgW, imgH := int(i.Width), int(i.Height) + f.fnLogger("######face sdk run") count, data, _ := f.handle.Run(i.Data, imgW, imgH, 3, dtchn) + f.fnLogger("######face over sdk run") + f.fnLogger("######face eject data") sdkhelper.EjectResult(data, rMsg, out) + f.fnLogger("######face over eject data") + var id, name string if rMsg.Tasklab != nil { id, name = rMsg.Tasklab.Taskid, rMsg.Tasklab.Taskname @@ -218,43 +286,9 @@ case <-time.After(trackChnTimeout * time.Second): f.fnLogger("Timeout to get image, curCid:", curCid) if curCid != "" { - delete(f.ftrackChans, curCid) - f.releaseChn(dtchn) + f.channelRelease(curCid) } return } } -} - -////////////////////////////////////////////////////////////////// -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() } -- Gitblit v1.8.0