zhangmeng
2019-11-27 e8bfcf3115506b2c4109d912dd1bffc7e8c44d9b
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package util
 
import (
    "context"
    "errors"
 
    "basic.com/valib/deliver.git"
 
    "basic.com/valib/logger.git"
)
 
const (
    // 共享内存发送/接收失败shmMaxTryCount次重新创建通道尝试
    shmMaxTryCount = 7
    // 不论共享内存/mangos发送/接收失败最大次数,认为当前通道不再使用, 关闭
    // 有问题,摄像机长时间断网后重连,但是通道关闭
    tooLongFailed = 300
)
 
type SocketContext struct {
    Sock    deliver.Deliver
    Context context.Context
    Cancel  context.CancelFunc
 
    Mode   int
    URL    string
    UseSHM bool
}
 
//  1. oldstring element is not in new  : abandon(delete)
//  2. new element is not in oldstring  : add(add)
func Difference(oldstring []string, newstring []string) map[string]string {
    var diff = make(map[string]string)
 
    // Loop two times, first to find oldstring strings not in newstring,
    // second loop to find newstring strings not in oldstring
    for i := 0; i < 2; i++ {
        for _, s1 := range oldstring {
            found := false
            for _, s2 := range newstring {
                if s1 == s2 {
                    found = true
                    break
                }
            }
            // String not found. We add it to return slice
            if !found && i == 0 {
                diff[s1] = "delete"
            }
            if !found && i != 0 {
                diff[s1] = "add"
            }
        }
        // Swap the slices, only if it was the first loop
        if i == 0 {
            oldstring, newstring = newstring, oldstring
        }
    }
    return diff
}
 
// UnCompress uncompress
func UnCompress(in []byte) ([]byte, error) {
    return in, nil
 
    // out := make([]byte, 3*len(in))
    // n, err := lz4.UncompressBlock(in, out)
    // if err != nil {
    //     logger.Error("uncompress error: ", err)
    //     return nil, err
    // }
    // out = out[:n] // uncompressed data
    // return out, nil
}
 
// Compress compress
func Compress(in []byte) ([]byte, error) {
    return in, nil
 
    // out := make([]byte, len(in))
    // ht := make([]int, 64<<10) // buffer for the compression table
    // n, err := lz4.CompressBlock(in, out, ht)
    // if err != nil {
    //     logger.Error("compress: ", err)
    //     return nil, err
    // }
    // if n >= len(in) {
    //     logger.Error("image is not compressible")
    // }
    // out = out[:n] // compressed data
    // return out, nil
}
 
// create server
func NewSocketListen(mode int, url string, shm bool) (socket SocketContext, err error) {
    logger.Info("url is: ", url)
    ctx, cancel := context.WithCancel(context.Background())
 
    socket.Context = ctx
    socket.Cancel = cancel
 
    socket.Mode = mode
    socket.URL = url
    socket.UseSHM = shm
 
    if shm {
        var err error
        socket.Sock, err = deliver.NewServerWithError(deliver.Mode(mode), url)
        if err != nil {
            logger.Info("TASK CREATE SERVER SHM ERROR: ", err)
        }
    } else {
        socket.Sock = deliver.NewServer(deliver.Mode(mode), url)
    }
 
    if socket.Sock == nil {
        return socket, errors.New("create listen error")
    }
 
    return socket, nil
}
 
func NewSocketDial(mode int, url string) (socket SocketContext, err error) {
    logger.Info("url is: ", url)
    ctx, cancel := context.WithCancel(context.Background())
 
    socket.Context = ctx
    socket.Cancel = cancel
 
    socket.Sock = deliver.NewClient(deliver.Mode(mode), url)
 
    if socket.Sock == nil {
        return socket, errors.New("create listen error")
    }
 
    return socket, nil
}
 
func MaybeRestartSocket(socket SocketContext, tryCnt *int) SocketContext {
    if socket.UseSHM {
        if *tryCnt > shmMaxTryCount {
            logger.Info("SDK SEND SHM TRY :", shmMaxTryCount, " RESTART IT")
 
            socket.Sock.Close()
            newSocket, err := NewSocketListen(socket.Mode, socket.URL, socket.UseSHM)
            if err != nil {
                return socket
            }
 
            *tryCnt = 0
 
            return newSocket
        }
    }
 
    return socket
}