| | |
| | | |
| | | goffmpeg.InitFFmpeg() |
| | | |
| | | if testIt { |
| | | test() |
| | | } |
| | | |
| | | ctx, cancel := context.WithCancel(context.Background()) |
| | | |
| | | if testIt { |
| | | test(ctx) |
| | | } |
| | | |
| | | ch := make(chan CameraInfo) |
| | | |
| | |
| | | url := strings.TrimSpace(c.URL) |
| | | id := strings.TrimSpace(c.ID) |
| | | addr := strings.TrimSpace(ipcAddr) |
| | | go runSender(id, url, addr) |
| | | go runSender(ctx, id, url, addr) |
| | | } |
| | | } |
| | | } |
| | |
| | | cancel() |
| | | } |
| | | |
| | | func runSender(cameraID, rtspURL, ipcLabel string) { |
| | | d := srv.NewSender(cameraID, rtspURL, ipcLabel) |
| | | func runSender(ctx context.Context, cameraID, rtspURL, ipcLabel string) { |
| | | d := srv.NewSender(ctx, cameraID, rtspURL, ipcLabel) |
| | | if asServer { |
| | | d.RunAsServer() |
| | | } |
| | | d.RunAsClient() |
| | | } |
| | | |
| | | func test() { |
| | | func test(ctx context.Context) { |
| | | fmt.Println("start test") |
| | | |
| | | fmt.Println(picFolder) |
| | | |
| | | runSender("cameraid", streamURL, ipcURL) |
| | | runSender(ctx, "cameraid", streamURL, ipcURL) |
| | | } |
| | |
| | | package service |
| | | |
| | | import ( |
| | | "context" |
| | | ) |
| | | |
| | | // ImageInfo deocded image data |
| | | type ImageInfo struct { |
| | | Data []byte |
| | |
| | | Height int |
| | | |
| | | // CameraID string |
| | | } |
| | | |
| | | // ContextIPC server context |
| | | type ContextIPC struct { |
| | | ctx context.Context |
| | | cancel context.CancelFunc |
| | | } |
| | |
| | | |
| | | // Sender decoder ingo |
| | | type Sender struct { |
| | | ctxIPC *ContextIPC |
| | | ctx context.Context |
| | | |
| | | cameraID string |
| | | streamURL string |
| | |
| | | } |
| | | |
| | | // NewSender Sender |
| | | func NewSender(cameraID, streamURL, ipcURL string) *Sender { |
| | | ctx, cancel := context.WithCancel(context.Background()) |
| | | func NewSender(ctx context.Context, cameraID, streamURL, ipcURL string) *Sender { |
| | | |
| | | fmt.Printf("create ipc %s for decode : %s, on camera id %s\n", ipcURL, streamURL, cameraID) |
| | | |
| | | return &Sender{ |
| | | ctxIPC: &ContextIPC{ctx, cancel}, |
| | | ctx: ctx, |
| | | |
| | | cameraID: cameraID, |
| | | streamURL: streamURL, |
| | |
| | | func (s *Sender) serializeImageInfo(img <-chan ImageInfo, data chan<- []byte) { |
| | | for { |
| | | select { |
| | | case <-s.ctxIPC.ctx.Done(): |
| | | case <-s.ctx.Done(): |
| | | fmt.Println("stop Sender") |
| | | return |
| | | case i := <-img: |
| | |
| | | |
| | | // RunAsServer run a IPC server |
| | | func (s *Sender) RunAsServer() { |
| | | i := ipc.NewServer(s.ctxIPC.ctx, s.ipcURL) |
| | | i := ipc.NewServer(s.ctx, s.ipcURL) |
| | | fmt.Println("ipc :", s.ipcURL, " cameraid:", s.cameraID) |
| | | s.run(i) |
| | | |
| | |
| | | |
| | | // RunAsClient run as a IPC client |
| | | func (s *Sender) RunAsClient() { |
| | | i := ipc.NewClient(s.ctxIPC.ctx, s.ipcURL) |
| | | i := ipc.NewClient(s.ctx, s.ipcURL) |
| | | fmt.Println("ipc :", s.ipcURL, " cameraid:", s.cameraID) |
| | | s.run(i) |
| | | } |
| | | |
| | | // Stop stop run decoder, must run in goroutine |
| | | func (s *Sender) Stop() { |
| | | s.ffmpeg.Free() |
| | | s.ctxIPC.cancel() |
| | | } |