diff --git a/go2rtc.exe b/go2rtc.exe deleted file mode 100644 index 560eac48..00000000 Binary files a/go2rtc.exe and /dev/null differ diff --git a/internal/outputbc/init.go b/internal/execbc/init.go similarity index 61% rename from internal/outputbc/init.go rename to internal/execbc/init.go index 7003b8bc..158780bb 100644 --- a/internal/outputbc/init.go +++ b/internal/execbc/init.go @@ -1,19 +1,19 @@ -package outputbc +package execbc import ( "github.com/AlexxIT/go2rtc/internal/streams" "github.com/AlexxIT/go2rtc/pkg/core" - "github.com/AlexxIT/go2rtc/pkg/outputbc" + "github.com/AlexxIT/go2rtc/pkg/execbc" "github.com/AlexxIT/go2rtc/pkg/shell" ) func Init() { - streams.HandleFunc("outputbc", handle) + streams.HandleFunc("execbc", handle) } func handle(url string) (core.Producer, error) { - args := shell.QuoteSplit(url[9:]) - con, err := outputbc.NewClient(args) + args := shell.QuoteSplit(url[7:]) + con, err := execbc.NewClient(args) if err != nil { return nil, err } diff --git a/main.go b/main.go index bef3f104..aa218fd3 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,6 @@ package main import ( - "github.com/AlexxIT/go2rtc/internal/outputbc" - "github.com/AlexxIT/go2rtc/internal/api" "github.com/AlexxIT/go2rtc/internal/api/ws" "github.com/AlexxIT/go2rtc/internal/app" @@ -11,6 +9,7 @@ import ( "github.com/AlexxIT/go2rtc/internal/dvrip" "github.com/AlexxIT/go2rtc/internal/echo" "github.com/AlexxIT/go2rtc/internal/exec" + "github.com/AlexxIT/go2rtc/internal/execbc" "github.com/AlexxIT/go2rtc/internal/expr" "github.com/AlexxIT/go2rtc/internal/ffmpeg" "github.com/AlexxIT/go2rtc/internal/gopro" @@ -82,7 +81,7 @@ func main() { bubble.Init() // bubble source expr.Init() // expr source gopro.Init() // gopro source - outputbc.Init() + execbc.Init() // Local Backchannel // 6. Helper modules diff --git a/pkg/execbc/client.go b/pkg/execbc/client.go new file mode 100644 index 00000000..aa470a68 --- /dev/null +++ b/pkg/execbc/client.go @@ -0,0 +1,60 @@ +package execbc + +import ( + "io" + "net" + "os/exec" + "sync" + + "github.com/AlexxIT/go2rtc/pkg/core" +) + +type Client struct { + medias []*core.Media + sender *core.Sender + conn net.Conn + send int + pipeCloser io.WriteCloser + commandArgs []string + cmd *exec.Cmd +} + +var lock = &sync.Mutex{} +var singleInstance *Client + +func NewClient(commandArgs []string) (*Client, error) { + return &Client{commandArgs: commandArgs}, nil +} + +func (c *Client) Dial() error { + media := &core.Media{ + Kind: core.KindAudio, + Direction: core.DirectionSendonly, + Codecs: []*core.Codec{ + {Name: core.CodecPCMA, ClockRate: 8000}, + }, + } + + c.medias = append(c.medias, media) + + cmdName := c.commandArgs[0] + args := c.commandArgs[1:] + cmd := *exec.Command(cmdName, args...) + + pipeCloser, error := PipeCloser(&cmd) + if error != nil { + return error + } + c.pipeCloser = pipeCloser + c.cmd = &cmd + return nil +} + +func (c Client) Open() (err error) { + c.cmd.Run() + return +} + +func (c Client) Close() (err error) { + return c.pipeCloser.Close() +} diff --git a/pkg/outputbc/consumer.go b/pkg/execbc/consumer.go similarity index 95% rename from pkg/outputbc/consumer.go rename to pkg/execbc/consumer.go index ba5d2ea2..9595a47c 100644 --- a/pkg/outputbc/consumer.go +++ b/pkg/execbc/consumer.go @@ -1,4 +1,4 @@ -package outputbc +package execbc import ( "encoding/json" @@ -19,7 +19,7 @@ func (c *Client) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiver if c.sender == nil { c.sender = core.NewSender(media, track.Codec) c.sender.Handler = func(packet *rtp.Packet) { - c.pipe.Write(packet.Payload) + c.pipeCloser.Write(packet.Payload) c.send += len(packet.Payload) } diff --git a/pkg/execbc/pipe.go b/pkg/execbc/pipe.go new file mode 100644 index 00000000..6663d6ff --- /dev/null +++ b/pkg/execbc/pipe.go @@ -0,0 +1,29 @@ +package execbc + +import ( + "bufio" + "io" + "os/exec" + + "github.com/AlexxIT/go2rtc/pkg/core" +) + +type pipeCloser struct { + io.Writer + io.Closer + cmd *exec.Cmd +} + +func PipeCloser(cmd *exec.Cmd) (io.WriteCloser, error) { + stdin, err := cmd.StdinPipe() + + if err != nil { + return nil, err + } + + return pipeCloser{bufio.NewWriterSize(stdin, 640), stdin, cmd}, nil +} + +func (p pipeCloser) Close() (err error) { + return core.Any(p.Closer.Close(), p.cmd.Process.Kill(), p.cmd.Wait()) +} diff --git a/pkg/outputbc/client.go b/pkg/outputbc/client.go deleted file mode 100644 index 8c0295c5..00000000 --- a/pkg/outputbc/client.go +++ /dev/null @@ -1,56 +0,0 @@ -package outputbc - -import ( - "io" - "net" - "os/exec" - "sync" - - "github.com/AlexxIT/go2rtc/pkg/core" -) - -type Client struct { - medias []*core.Media - sender *core.Sender - conn net.Conn - send int - cmd exec.Cmd - pipe io.WriteCloser - command []string -} - -var lock = &sync.Mutex{} -var singleInstance *Client - -func NewClient(command []string) (*Client, error) { - return &Client{command: command}, nil -} - -func (c *Client) Dial() { - media := &core.Media{ - Kind: core.KindAudio, - Direction: core.DirectionSendonly, - Codecs: []*core.Codec{ - {Name: core.CodecPCMA, ClockRate: 8000}, - }, - } - - c.medias = append(c.medias, media) - if c.pipe == nil { - cmdName := c.command[0] - args := c.command[1:] - c.cmd = *exec.Command(cmdName, args...) - c.pipe, _ = c.cmd.StdinPipe() - } -} - -func (c *Client) Open() (err error) { - c.cmd.Run() - return -} - -func (c *Client) Close() (err error) { - c.pipe.Close() - c.cmd.Process.Kill() - return -}