视频分析2.0 多进程拆分仓库
zhangmeng
2019-05-06 ffd71d97fc9eb5236e6a92db408745ddf080217b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package sdk
 
import (
    "fmt"
    "reflect"
    "videoServer/util/gosdk"
)
 
type fnParamInfo struct {
    typ     reflect.Type
    typKind reflect.Kind
 
    typElem     reflect.Type
    typElemKind reflect.Kind
}
 
type fnInfo struct {
    fn     interface{}
    params []fnParamInfo
}
 
var (
    mapSDK = make(map[string]fnInfo)
 
    FaceDetect      = "face_detect"
    FaceProperty    = "face_property"
    FaceExtract     = "face_extract"
    FaceCompare     = "face_compare"
    FaceTrack       = "face_track"
    FaceTrackOnly   = "face_track_only"
    FaceTrackDetect = "face_track_detect"
    YoloDetect      = "yolo_detect"
)
 
func typeInfo(t reflect.Type) fnParamInfo {
    var pInfo fnParamInfo
 
    pInfo.typ = t
    pInfo.typKind = t.Kind()
    if t.Kind() == reflect.Ptr || t.Kind() == reflect.Slice || t.Kind() == reflect.Map {
        te := t.Elem()
        pInfo.typElem = te
        pInfo.typElemKind = te.Kind()
    }
    return pInfo
}
 
func valueTypeInfo(p interface{}) fnParamInfo {
    t := reflect.TypeOf(p)
    return typeInfo(t)
}
 
func makeFnInfo(fnName string, i interface{}) {
 
    f := reflect.ValueOf(i)
    fmt.Println()
    fmt.Println("function :", fnName)
    numIn := f.Type().NumIn()
 
    var paramsInfo []fnParamInfo
    for i := 0; i < numIn; i++ {
        t := f.Type().In(i)
 
        pInfo := typeInfo(t)
 
        paramsInfo = append(paramsInfo, pInfo)
        fmt.Printf("[param %d type %s, kind %s] ", i, pInfo.typ.Name(), pInfo.typKind.String())
        if pInfo.typElem != nil {
            fmt.Printf("[Elem type %s, kind %s]", pInfo.typElem.Name(), pInfo.typElemKind.String())
        }
        fmt.Println()
 
    }
 
    mapSDK[fnName] = fnInfo{i, paramsInfo}
}
 
func init() {
    makeFnInfo(FaceDetect, gosdk.FaceDetect)
    makeFnInfo(FaceProperty, gosdk.FaceProperty)
    makeFnInfo(FaceExtract, gosdk.FaceExtract)
    makeFnInfo(FaceCompare, gosdk.FaceCompare)
    makeFnInfo(FaceTrack, gosdk.FaceTrack)
    makeFnInfo(FaceTrackOnly, gosdk.FaceTrackOnly)
    makeFnInfo(FaceTrackDetect, gosdk.FaceTrackDetect)
    makeFnInfo(YoloDetect, gosdk.YoloDetect)
}
 
// Run sdks...
func Run(sdks ...string) {
    fmt.Println("hello")
    fmt.Println("world")
}
 
func RunSDK(sdk string) {
    if v, ok := mapSDK[sdk]; ok {
        DoFiledAndMethod(v.fn)
    }
}
 
// DoFiledAndMethod 通过接口来获取任意参数,然后一一揭晓
func DoFiledAndMethod(input interface{}) {
    f := reflect.ValueOf(input)
    numIn := f.Type().NumIn()
 
    fmt.Println("func number in param :", numIn)
 
    for i := 0; i < numIn; i++ {
        t := f.Type().In(i)
        if t.Kind() == reflect.Ptr {
            te := t.Elem()
            fmt.Printf("t type %s, t elem type %s\n", t.Name(), te.Name())
        }
        fmt.Printf("param %d type %s\n", i, t.Name())
    }
 
    var b []gosdk.CObjInfo
    var a []gosdk.CObjInfo
 
    bInfo := valueTypeInfo(b)
    aInfo := valueTypeInfo(a)
    fmt.Printf("a type %+v is b type %+v :%t\n", aInfo, bInfo, bInfo == aInfo)
    fmt.Println("b type:", valueTypeInfo(b).typ.Name(), valueTypeInfo(b).typKind.String())
}