From 35a85de7b7495878ae4dcb73449f18c28131496c Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 03 二月 2023 17:17:16 +0800 Subject: [PATCH] add go test,complete --- shmparser/shmparser.go | 107 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 86 insertions(+), 21 deletions(-) diff --git a/shmparser/shmparser.go b/shmparser/shmparser.go index 56e6de0..d814eed 100644 --- a/shmparser/shmparser.go +++ b/shmparser/shmparser.go @@ -22,8 +22,8 @@ return *(*string)(unsafe.Pointer(&d)) } -// Image2shm fill image to shm -func Image2shm(shm []byte, cid, cname string, data []byte, w, h int, fid int64) { +// Image2Shm fill image to shm +func Image2Shm(shm []byte, cid, cname string, data []byte, w, h int, fid int64) { timestamp := strings.Replace(time.Now().Format("2006-01-02 15:04:05.000"), ".", ":", -1) dataptr := (*C.uchar)(unsafe.Pointer(&data[0])) @@ -43,7 +43,8 @@ ) shmptr := unsafe.Pointer(&shm[0]) - C.goimage2shm(shmptr, unsafe.Pointer(&cimg)) + C.goImage2Shm(shmptr, unsafe.Pointer(cimg)) + C.free_stimg(cimg) } // ImageShm Image struct in Shm @@ -57,11 +58,20 @@ Cname string } +func uintptr2byte(p unsafe.Pointer, size uint64) []byte { + if (^uint(0) >> 63) == 0 { + const maxLen = 0x7fffffff + return (*(*[maxLen]byte)(p))[:size:size] + } else { + const maxLen = 0xffffffffffff + return (*(*[maxLen]byte)(p))[:size:size] + } +} + func Shm2Image(shm []byte) ImageShm { cimg := C.shm2image(unsafe.Pointer(&shm[0])) var goimg ImageShm - const maxLen = 0xffffffffffff var data, ts, cid, cname unsafe.Pointer var sd, id C.ulong @@ -69,16 +79,16 @@ p := unsafe.Pointer(cimg) - C.goimageinfo(p, &data, &sd, &ts, &sts, &cid, &scid, &cname, &scname, &id, &w, &h) - goimg.Data = (*[maxLen]byte)(data)[:uint64(sd):uint64(sd)] + C.goImageGet(p, &data, &sd, &ts, &sts, &cid, &scid, &cname, &scname, &id, &w, &h) + goimg.Data = uintptr2byte(data, uint64(sd)) - tmp := (*[maxLen]byte)(ts)[:int(sts):int(sts)] + tmp := uintptr2byte(ts, uint64(sts)) goimg.Timestamp = byte2str(tmp) - tmp = (*[maxLen]byte)(cid)[:int(scid):int(scid)] + tmp = uintptr2byte(cid, uint64(scid)) goimg.Cid = byte2str(tmp) - tmp = (*[maxLen]byte)(cname)[:int(scname):int(scname)] + tmp = uintptr2byte(cname, uint64(scname)) goimg.Cname = byte2str(tmp) goimg.Width = int(w) @@ -136,14 +146,14 @@ // AddResSdk2RuleInShm add sdk message to rule in shm func AddResSdk2RuleInShm(shm []byte, sdk Resdk) { - ctgts := C.gotargetsnew(C.uint(len(sdk.Targets))) + ctgts := C.goTargetsNew(C.uint(len(sdk.Targets))) for k, v := range sdk.Targets { tpbyte := str2byte(v.Type) tptr := (*C.char)(unsafe.Pointer(&tpbyte[0])) featptr := (*C.uchar)(unsafe.Pointer(&v.Feat[0])) attrptr := (*C.uchar)(unsafe.Pointer(&v.Attr[0])) - C.gotargetsadd(ctgts, C.int(k), C.ulong(v.Id), tptr, C.uint(len(v.Type)), + C.goTargetAdd(ctgts, C.int(k), C.ulong(v.Id), tptr, C.uint(len(v.Type)), C.int(v.Confidence), C.int(v.Rc.Left), C.int(v.Rc.Top), C.int(v.Rc.Right), C.int(v.Rc.Bottom), featptr, C.uint(len(v.Feat)), attrptr, C.uint(len(v.Attr))) @@ -156,11 +166,11 @@ tp := str2byte(sdk.Type) tpstr := (*C.char)(unsafe.Pointer(&tp[0])) - C.goruleaddsdk(shmptr, ctgts, C.uint(len(sdk.Targets)), + C.goSdkPut(shmptr, ctgts, C.uint(len(sdk.Targets)), tpstr, C.uint(len(sdk.Type)), tsptr, C.uint(len(sdk.Timestamp))) - C.gotargetsdel(ctgts) + C.goTargetsDel(ctgts) } // Shm2Rule get Rule from shm @@ -170,22 +180,77 @@ crule := C.shm2rule(unsafe.Pointer(&shm[0])) - const maxLen = 0xffffffffffff - - var data unsafe.Pointer - var s32 C.uint + var ht unsafe.Pointer + var sht C.uint p := unsafe.Pointer(crule) - C.gorulehandletrack(p, &data, &s32) - tmp := (*[maxLen]byte)(data)[:int(s32):int(s32)] + C.goHandletrackGet(p, &ht, &sht) + tmp := uintptr2byte(ht, uint64(sht)) rule.Handletrack = byte2str(tmp) - C.goruledatatype(p, &data, &s32) - tmp = (*[maxLen]byte)(data)[:int(s32):int(s32)] + var dt unsafe.Pointer + var sdt C.uint + C.goDatatypeGet(p, &dt, &sdt) + tmp = uintptr2byte(dt, uint64(sdt)) rule.Datatype = byte2str(tmp) //////////////////////////////////////////////// + var csdk unsafe.Pointer + var s32 C.uint + C.goSdkArrayGet(p, &csdk, &s32) + + for i := 0; i < int(s32); i++ { + var ctype, cid, cname, cts, ctgt unsafe.Pointer + var st, si, sn, sts, stgt C.uint + var sdk Resdk + + C.goSdkGet(csdk, C.int(i), &ctype, &st, &cid, &si, + &cname, &sn, &cts, &sts, &ctgt, &stgt) + tmp = uintptr2byte(ctype, uint64(st)) + sdk.Type = byte2str(tmp) + + tmp = uintptr2byte(cid, uint64(si)) + sdk.Id = byte2str(tmp) + + tmp = uintptr2byte(cname, uint64(sn)) + sdk.Name = byte2str(tmp) + tmp = uintptr2byte(cts, uint64(sts)) + sdk.Timestamp = byte2str(tmp) + + for j := 0; j < int(stgt); j++ { + var tid C.ulong + var tc, tl, tt, tr, tb C.int + var tp, tfeat, tattr unsafe.Pointer + var stp, stf, sta C.uint + + var tgt Target + + C.goTargetGet(ctgt, C.int(j), &tid, &tc, &tl, &tt, &tr, &tb, + &tp, &stp, &tfeat, &stf, &tattr, &sta) + + tgt.Id = uint64(tid) + tgt.Confidence = int(tc) + tgt.Rc.Left = int(tl) + tgt.Rc.Top = int(tt) + tgt.Rc.Right = int(tr) + tgt.Rc.Bottom = int(tb) + + tmp = uintptr2byte(tp, uint64(stp)) + tgt.Type = byte2str(tmp) + + tmp = uintptr2byte(tfeat, uint64(stf)) + tgt.Feat = tmp + + tmp = uintptr2byte(tattr, uint64(sta)) + tgt.Attr = tmp + + sdk.Targets = append(sdk.Targets, tgt) + } + + rule.Sdks = append(rule.Sdks, sdk) + } + C.free_strule(crule) return rule -- Gitblit v1.8.0