This repository has been archived on 2019-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
mumbledj/vendor/github.com/layeh/gumble/gumbleffmpeg/source.go
2016-06-20 17:50:40 -07:00

104 lines
1.6 KiB
Go

package gumbleffmpeg
import (
"io"
"os/exec"
)
// Source is a Stream source.
type Source interface {
// must include the -i <filename>
arguments() []string
start(*exec.Cmd) error
done()
}
// sourceFile
type sourceFile string
// SourceFile is standard file source.
func SourceFile(filename string) Source {
return sourceFile(filename)
}
func (s sourceFile) arguments() []string {
return []string{"-i", string(s)}
}
func (sourceFile) start(*exec.Cmd) error {
return nil
}
func (sourceFile) done() {
}
// sourceReader
type sourceReader struct {
r io.ReadCloser
}
// SourceReader is a ReadCloser source.
func SourceReader(r io.ReadCloser) Source {
return &sourceReader{r}
}
func (*sourceReader) arguments() []string {
return []string{"-i", "-"}
}
func (s *sourceReader) start(cmd *exec.Cmd) error {
cmd.Stdin = s.r
return nil
}
func (s *sourceReader) done() {
s.r.Close()
}
// sourceExec
type sourceExec struct {
name string
arg []string
cmd *exec.Cmd
}
// SourceExec uses the output of the given command and arguments as source
// data.
func SourceExec(name string, arg ...string) Source {
return &sourceExec{
name: name,
arg: arg,
}
}
func (*sourceExec) arguments() []string {
return []string{"-i", "-"}
}
func (s *sourceExec) start(cmd *exec.Cmd) error {
s.cmd = exec.Command(s.name, s.arg...)
r, err := s.cmd.StdoutPipe()
if err != nil {
return err
}
cmd.Stdin = r
if err := s.cmd.Start(); err != nil {
cmd.Stdin = nil
return err
}
return nil
}
func (s *sourceExec) done() {
if s.cmd != nil {
if p := s.cmd.Process; p != nil {
p.Kill()
}
s.cmd.Wait()
}
}