From 4058b9d3145c9f2c01ad07f0004948636bcbaf7e Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 30 四月 2019 13:55:15 +0800 Subject: [PATCH] init submodule --- decoder/work/service/reciever.go | 71 ++++++++++++++ decoder/main.go | 71 ++++++++++++++ .gitignore | 6 .gitmodules | 12 ++ decoder/go.mod | 5 + decoder/work/service/decoder.go | 88 +++++++++++++++++ decoder/runtime/libcffmpeg.so | 0 decoder/.vscode/settings.json | 3 decoder/valib/goffmpeg | 2 decoder/.gitignore | 1 analysis/valib/gosdk | 2 decoder/go.sum | 2 analysis/valib/ipc | 2 decoder/valib/ipc | 2 decoder/demo/simpleIPC.go | 11 ++ decoder/work/service/common.go | 20 ++++ 16 files changed, 292 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 0def275..8b6083f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,17 +5,19 @@ *.obj # Compiled Dynamic libraries -*.so +#*.so *.dylib *.dll # Compiled Static libraries *.lai *.la -*.a +#*.a *.lib # Executables *.exe *.out *.app + +build/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0d2f557 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "analysis/valib/gosdk"] + path = analysis/valib/gosdk + url = git://192.168.1.226/valib/gosdk.git +[submodule "analysis/valib/ipc"] + path = analysis/valib/ipc + url = git://192.168.1.226/valib/ipc.git +[submodule "decoder/valib/ipc"] + path = decoder/valib/ipc + url = git://192.168.1.226/valib/ipc.git +[submodule "decoder/valib/goffmpeg"] + path = decoder/valib/goffmpeg + url = git://192.168.1.226/valib/goffmpeg.git diff --git a/analysis/valib/gosdk b/analysis/valib/gosdk new file mode 160000 index 0000000..e3a2151 --- /dev/null +++ b/analysis/valib/gosdk @@ -1 +1 @@ -Subproject commit 0000000000000000000000000000000000000000 +Subproject commit e3a2151968276a71a617d88965281e279ad68236 diff --git a/analysis/valib/ipc b/analysis/valib/ipc new file mode 160000 index 0000000..66d8e66 --- /dev/null +++ b/analysis/valib/ipc @@ -1 +1 @@ -Subproject commit 0000000000000000000000000000000000000000 +Subproject commit 66d8e6695ada4090bdb81279d594f323be875bc7 diff --git a/decoder/.gitignore b/decoder/.gitignore new file mode 100644 index 0000000..541ce64 --- /dev/null +++ b/decoder/.gitignore @@ -0,0 +1 @@ +decoder diff --git a/decoder/.vscode/settings.json b/decoder/.vscode/settings.json new file mode 100644 index 0000000..8c45cda --- /dev/null +++ b/decoder/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "go.formatTool": "goimports" +} \ No newline at end of file diff --git a/decoder/demo/simpleIPC.go b/decoder/demo/simpleIPC.go new file mode 100644 index 0000000..8f309f0 --- /dev/null +++ b/decoder/demo/simpleIPC.go @@ -0,0 +1,11 @@ +package demo + +import ( + srv "decoder/work/service" +) + +// SendByIPC send pic by ipc +func SendByIPC(rtspURL, cameraID, ipcURL string) { + d := srv.NewDecoder(cameraID, rtspURL, ipcURL) + d.Run() +} diff --git a/decoder/go.mod b/decoder/go.mod new file mode 100644 index 0000000..62603f0 --- /dev/null +++ b/decoder/go.mod @@ -0,0 +1,5 @@ +module decoder + +go 1.12 + +require nanomsg.org/go-mangos v1.4.0 diff --git a/decoder/go.sum b/decoder/go.sum new file mode 100644 index 0000000..7d77097 --- /dev/null +++ b/decoder/go.sum @@ -0,0 +1,2 @@ +nanomsg.org/go-mangos v1.4.0 h1:pVRLnzXePdSbhWlWdSncYszTagERhMG5zK/vXYmbEdM= +nanomsg.org/go-mangos v1.4.0/go.mod h1:MOor8xUIgwsRMPpLr9xQxe7bT7rciibScOqVyztNxHQ= diff --git a/decoder/main.go b/decoder/main.go new file mode 100644 index 0000000..0c7f65b --- /dev/null +++ b/decoder/main.go @@ -0,0 +1,71 @@ +package main + +import ( + "bytes" + "context" + "decoder/demo" + "decoder/valib/ipc" + "encoding/gob" + "flag" + "fmt" + // "videoServer/demo" +) + +var ( + streamURL string + picFolder string + + ipcURL string + proc string +) + +func init() { + flag.StringVar(&streamURL, "i", "rtsp://192.168.1.203:8554/16.mkv", "input url") + flag.StringVar(&picFolder, "f", ".", "test pic folder") + + flag.StringVar(&ipcURL, "ipc", "ipc:///tmp/pic.ipc", "ipc label") +} + +func test() { + fmt.Println("start test") + + fmt.Println(picFolder) + + demo.SendByIPC(streamURL, "camera1", ipcURL) +} + +type cameraInfo struct { + cameraID string + videoURL string +} + +func recvFromIPC(ctx context.Context, url string) (cameraID, rtspURL string) { + ipc := ipc.NewClient(ctx, url) + + for { + msg := ipc.Recv() + + var buf bytes.Buffer + buf.Write(msg) + + dec := gob.NewDecoder(&buf) + + var i cameraInfo + if err := dec.Decode(&i); err != nil { + fmt.Println("gob decode CameraImage error", err) + continue + } + return i.cameraID, i.videoURL + } +} + +func main() { + flag.Parse() + + ctx, cancel := context.WithCancel(context.Background()) + recvFromIPC(ctx, "tcp://192.168.1.156:7000") + + cancel() + // test() + +} diff --git a/decoder/runtime/libcffmpeg.so b/decoder/runtime/libcffmpeg.so new file mode 100755 index 0000000..5679d03 --- /dev/null +++ b/decoder/runtime/libcffmpeg.so Binary files differ diff --git a/decoder/valib/goffmpeg b/decoder/valib/goffmpeg new file mode 160000 index 0000000..7f8e310 --- /dev/null +++ b/decoder/valib/goffmpeg @@ -1 +1 @@ -Subproject commit 0000000000000000000000000000000000000000 +Subproject commit 7f8e310acc232c67ba8e6f72028d677010d1051a diff --git a/decoder/valib/ipc b/decoder/valib/ipc new file mode 160000 index 0000000..66d8e66 --- /dev/null +++ b/decoder/valib/ipc @@ -1 +1 @@ -Subproject commit 0000000000000000000000000000000000000000 +Subproject commit 66d8e6695ada4090bdb81279d594f323be875bc7 diff --git a/decoder/work/service/common.go b/decoder/work/service/common.go new file mode 100644 index 0000000..54cff5d --- /dev/null +++ b/decoder/work/service/common.go @@ -0,0 +1,20 @@ +package service + +import ( + "context" +) + +// ImageInfo deocded image data +type ImageInfo struct { + Data []byte + Width int + Height int + + CameraID string +} + +// ContextIPC server context +type ContextIPC struct { + ctx context.Context + cancel context.CancelFunc +} diff --git a/decoder/work/service/decoder.go b/decoder/work/service/decoder.go new file mode 100644 index 0000000..dfff34d --- /dev/null +++ b/decoder/work/service/decoder.go @@ -0,0 +1,88 @@ +package service + +import ( + "bytes" + "context" + "decoder/valib/goffmpeg" + "decoder/valib/ipc" + "encoding/gob" + "fmt" +) + +// Decoder decoder ingo +type Decoder struct { + ctxIPC *ContextIPC + + cameraID string + streamURL string + ipcURL string + + ffmpeg *goffmpeg.GoFFMPEG +} + +// NewDecoder decoder +func NewDecoder(cameraID, streamURL, ipcURL string) *Decoder { + ctx, cancel := context.WithCancel(context.Background()) + + return &Decoder{ + ctxIPC: &ContextIPC{ctx, cancel}, + + cameraID: cameraID, + streamURL: streamURL, + ipcURL: ipcURL, + } +} + +func (dec *Decoder) serializeImageInfo(img <-chan ImageInfo, data chan<- []byte) { + for { + select { + case <-dec.ctxIPC.ctx.Done(): + fmt.Println("stop decoder") + return + case i := <-img: + var buf bytes.Buffer + enc := gob.NewEncoder(&buf) + + if err := enc.Encode(i); err != nil { + fmt.Println("gob encode camera image error", err) + continue + } + b := buf.Bytes() + data <- b + } + + } +} + +// Run run a decoder +func (dec *Decoder) Run() { + ipc := ipc.NewServer(dec.ctxIPC.ctx, dec.ipcURL) + + gf := goffmpeg.New() + if gf != nil { + dec.ffmpeg = gf + } + imageChan := make(chan ImageInfo) + dataChan := make(chan []byte) + + go dec.serializeImageInfo(imageChan, dataChan) + + gf.ActiveDecoder(func(d *[]byte, w, h *int) { + + if *w > 0 && *h > 0 { + i := ImageInfo{*d, *w, *h, dec.cameraID} + imageChan <- i + } else { + fmt.Println("decode jpg error") + } + }) + gf.Run(dec.streamURL) + + ipc.SendFromChannel(dataChan) +} + +// Stop stop run decoder, must run in goroutine +func (dec *Decoder) Stop() { + dec.ffmpeg.Free() + dec.ctxIPC.cancel() +} diff --git a/decoder/work/service/reciever.go b/decoder/work/service/reciever.go new file mode 100644 index 0000000..2ae6bfb --- /dev/null +++ b/decoder/work/service/reciever.go @@ -0,0 +1,71 @@ +package service + +import ( + "bytes" + "context" + "decoder/valib/ipc" + "encoding/gob" + "fmt" +) + +// Reciever recv from ipc +type Reciever struct { + ctxIPC *ContextIPC + ipcURL string + chImage chan<- ImageInfo +} + +func unserilizeImageInfo(data <-chan []byte, img chan<- ImageInfo) { + for { + d := <-data + + var buf bytes.Buffer + buf.Write(d) + + dec := gob.NewDecoder(&buf) + + var i ImageInfo + if err := dec.Decode(&i); err != nil { + fmt.Println("gob decode CameraImage error", err) + continue + } + img <- i + } +} + +// NewReciever new recv +func NewReciever(url string, ch chan<- ImageInfo) *Reciever { + ctx, cancel := context.WithCancel(context.Background()) + + return &Reciever{ + ctxIPC: &ContextIPC{ctx, cancel}, + ipcURL: url, + chImage: ch, + } +} + +// NewRecieverWithContext new recver with context +func NewRecieverWithContext(ctx context.Context, url string, ch chan<- ImageInfo) *Reciever { + return &Reciever{ + ctxIPC: &ContextIPC{ctx, nil}, + ipcURL: url, + chImage: ch, + } +} + +// Run run task from ipc data +func (r *Reciever) Run() { + ipc := ipc.NewClient(r.ctxIPC.ctx, r.ipcURL) + + dataChan := make(chan []byte) + go unserilizeImageInfo(dataChan, r.chImage) + + ipc.RecvToChannel(dataChan) +} + +// Stop stop reciever, run in goroutine +func (r *Reciever) Stop() { + if r.ctxIPC.cancel != nil { + r.ctxIPC.cancel() + } +} -- Gitblit v1.8.0