From 19445d14e73f4bb96e218a65e126ae526f89537d Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 08 五月 2019 14:14:59 +0800
Subject: [PATCH] context使用

---
 decoder/main.go |  110 +++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 75 insertions(+), 35 deletions(-)

diff --git a/decoder/main.go b/decoder/main.go
index c6e75b8..eb39bae 100644
--- a/decoder/main.go
+++ b/decoder/main.go
@@ -2,12 +2,14 @@
 
 import (
 	"context"
-	"decoder/demo"
+	"decoder/valib/goffmpeg"
 	"decoder/valib/ipc"
+	srv "decoder/work/service"
 	"encoding/json"
 	"flag"
 	"fmt"
-	// "videoServer/demo"
+	"strconv"
+	"strings"
 )
 
 var (
@@ -16,6 +18,10 @@
 
 	ipcURL string
 	proc   string
+
+	testIt bool
+
+	asServer bool
 )
 
 func init() {
@@ -23,6 +29,10 @@
 	flag.StringVar(&picFolder, "f", ".", "test pic folder")
 
 	flag.StringVar(&ipcURL, "ipc", "ipc:///tmp/pic.ipc", "ipc label")
+
+	flag.BoolVar(&testIt, "test", false, "use test")
+
+	flag.BoolVar(&asServer, "server", false, "run ipc as server")
 }
 
 // CameraInfo camera info
@@ -38,28 +48,33 @@
 }
 
 var (
-	mapCI = make(map[string]CameraInfo)
-	port  = 7001
+	mapCameraInfo = make(map[string]CameraInfo)
 )
 
-func recvFromIPC(ctx context.Context, url string, ch chan<- CameraInfo) {
+func recvCameraInfoFromIPC(ctx context.Context, url string, ch chan<- CameraInfo) {
 	ipc := ipc.NewClient(ctx, url)
 
 	for {
 		msg := ipc.Recv()
 		if msg != nil {
-			fmt.Println(string(msg))
+
 			var c CameraInfo
 			if err := json.Unmarshal(msg, &c); err == nil {
+
+				if _, ok := mapCameraInfo[c.ID]; ok {
+					continue
+				}
+
 				ch <- c
-				fmt.Printf("recv camere info %+v\n", c)
+
+				msgIpc := MsgIPC{"new decoder", 0}
+				if b, err := json.Marshal(msgIpc); err == nil {
+					ipc.Send(b)
+				}
 			} else {
 				fmt.Println(err)
 			}
-			msgIpc := MsgIPC{"new decoder", port}
-			if b, err := json.Marshal(msgIpc); err == nil {
-				ipc.Send(b)
-			}
+
 		}
 	}
 }
@@ -67,39 +82,64 @@
 func main() {
 	flag.Parse()
 
-	test()
+	goffmpeg.InitFFmpeg()
 
-	// ctx, cancel := context.WithCancel(context.Background())
+	ctx, cancel := context.WithCancel(context.Background())
 
-	// ch := make(chan CameraInfo)
-	// go recvFromIPC(ctx, "tcp://192.168.1.124:7000", ch)
+	if testIt {
+		test(ctx)
+	}
 
-	// for {
-	// 	select {
-	// 	case <-ctx.Done():
-	// 		return
-	// 	case c := <-ch:
-	// 		if _, ok := mapCI[c.ID]; !ok {
-	// 			mapCI[c.ID] = c
-	// 			ipc := "tcp://192.168.1.124:" + strconv.Itoa(port)
-	// 			port++
-	// 			fmt.Printf("create ipc %s for decode : %s, on camera id %s\n", ipc, c.URL, c.ID)
+	ch := make(chan CameraInfo)
 
-	// 			url := strings.TrimSpace(c.URL)
-	// 			id := strings.TrimSpace(c.ID)
-	// 			i := strings.TrimSpace(ipc)
-	// 			go demo.SendByIPC(url, id, i)
-	// 		}
-	// 	}
-	// }
-	// cancel()
+	tcp := ``
+	port := 7001
 
+	if strings.Index(ipcURL, "tcp://") == 0 {
+		i := strings.LastIndex(ipcURL, ":")
+		tcp = ipcURL[0 : i+1]
+
+		strPort := ipcURL[i+1:]
+		port, _ = strconv.Atoi(strPort)
+		port++
+	}
+
+	go recvCameraInfoFromIPC(ctx, ipcURL, ch)
+
+	for {
+		select {
+		case <-ctx.Done():
+			return
+		case c := <-ch:
+			if _, ok := mapCameraInfo[c.ID]; !ok {
+				mapCameraInfo[c.ID] = c
+				ipcAddr := tcp + strconv.Itoa(port)
+				port++
+
+				url := strings.TrimSpace(c.URL)
+				id := strings.TrimSpace(c.ID)
+				addr := strings.TrimSpace(ipcAddr)
+				go runSender(ctx, id, url, addr)
+			}
+		}
+	}
+
+	goffmpeg.FreeFFmpeg()
+	cancel()
 }
 
-func test() {
+func runSender(ctx context.Context, cameraID, rtspURL, ipcLabel string) {
+	d := srv.NewSender(ctx, cameraID, rtspURL, ipcLabel)
+	if asServer {
+		d.RunAsServer()
+	}
+	d.RunAsClient()
+}
+
+func test(ctx context.Context) {
 	fmt.Println("start test")
 
 	fmt.Println(picFolder)
 
-	demo.SendByIPC(streamURL, "camera1", ipcURL, true)
+	runSender(ctx, "cameraid", streamURL, ipcURL)
 }

--
Gitblit v1.8.0