1
0
mirror of https://gitlab.crans.org/nounous/ghostream.git synced 2025-06-29 21:31:07 +02:00

Use channels to send SRT packets to forwarded streams

This commit is contained in:
Yohann D'ANELLO
2020-10-01 12:00:59 +02:00
parent dc7a3fef9f
commit efa44488c0
5 changed files with 54 additions and 21 deletions

View File

@ -2,6 +2,7 @@ package forwarding
import (
"bufio"
"gitlab.crans.org/nounous/ghostream/stream/srt"
"io"
"log"
"os/exec"
@ -13,16 +14,43 @@ type Options map[string][]string
var (
cfg Options
forwardingChannel chan srt.Packet
ffmpegInstances = make(map[string]*exec.Cmd)
ffmpegInputStreams = make(map[string]*io.WriteCloser)
)
// New Load configuration
func New(c Options) {
// New Load configuration and initialize SRT channel
func New(c Options, channel chan srt.Packet) {
cfg = c
forwardingChannel = channel
go waitForPackets()
log.Printf("Stream forwarding initialized")
}
func waitForPackets() {
for {
var err error = nil
packet := <-forwardingChannel
switch packet.PacketType {
case "register":
err = RegisterStream(packet.StreamName)
break
case "sendData":
err = SendPacket(packet.StreamName, packet.Data)
break
case "close":
err = CloseConnection(packet.StreamName)
break
default:
log.Println("Unknown SRT packet type:", packet.PacketType)
break
}
if err != nil {
log.Printf("Error occured while receiving SRT packet of type %s: %s", packet.PacketType, err)
}
}
}
// RegisterStream Declare a new open stream and create ffmpeg instances
func RegisterStream(name string) error {
streams, exist := cfg[name]
@ -80,16 +108,14 @@ func RegisterStream(name string) error {
}
// SendPacket forward data to all FFMpeg instances related to the stream name
func SendPacket(name string, data []byte) {
func SendPacket(name string, data []byte) error {
stdin := ffmpegInputStreams[name]
if stdin == nil {
// Don't need to forward stream
return
return nil
}
_, err := (*stdin).Write(data)
if err != nil {
log.Printf("Error while sending a packet to external streaming server for key %s: %s", name, err)
}
return err
}
// CloseConnection When the stream is ended, close FFMPEG instances