package util import ( "context" "errors" "basic.com/valib/deliver.git" "basic.com/valib/logger.git" ) const ( // 共享内存发送/接收失败shmMaxTryCount次重新创建通道尝试 ShmMaxTryCount = 7 // 不论共享内存/mangos发送/接收失败最大次数,认为当前通道不再使用, 关闭 // 有问题,摄像机长时间断网后重连,但是通道关闭 tooLongFailed = 300 File_Img_Id_Pre = "img_" File_Video_Id_Pre = "video_" File_Audio_Id_Pre = "audio_" ) 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) { 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 }