Rewrite gstreamer-src/Pipeline for multi-track

This allows us to demonstrate multi-track easier, without having to
worry about encoding multiple times

Relates to #54
This commit is contained in:
Sean DuBois
2019-03-11 23:14:59 -07:00
parent d7639778cc
commit bc94eaa968
4 changed files with 13 additions and 11 deletions

View File

@@ -85,8 +85,8 @@ func main() {
}
// Start pushing buffers on these tracks
gst.CreatePipeline(webrtc.Opus, opusTrack, *audioSrc).Start()
gst.CreatePipeline(webrtc.VP8, vp8Track, *videoSrc).Start()
gst.CreatePipeline(webrtc.Opus, []*webrtc.Track{opusTrack}, *audioSrc).Start()
gst.CreatePipeline(webrtc.VP8, []*webrtc.Track{vp8Track}, *videoSrc).Start()
// Block forever
select {}

View File

@@ -85,8 +85,8 @@ func main() {
fmt.Println(signal.Encode(answer))
// Start pushing buffers on these tracks
gst.CreatePipeline(webrtc.Opus, opusTrack, *audioSrc).Start()
gst.CreatePipeline(webrtc.VP8, vp8Track, *videoSrc).Start()
gst.CreatePipeline(webrtc.Opus, []*webrtc.Track{opusTrack}, *audioSrc).Start()
gst.CreatePipeline(webrtc.VP8, []*webrtc.Track{vp8Track}, *videoSrc).Start()
// Block forever
select {}

View File

@@ -23,7 +23,7 @@ func init() {
// Pipeline is a wrapper for a GStreamer Pipeline
type Pipeline struct {
Pipeline *C.GstElement
track *webrtc.Track
tracks []*webrtc.Track
id int
codecName string
}
@@ -32,7 +32,7 @@ var pipelines = make(map[int]*Pipeline)
var pipelinesLock sync.Mutex
// CreatePipeline creates a GStreamer Pipeline
func CreatePipeline(codecName string, track *webrtc.Track, pipelineSrc string) *Pipeline {
func CreatePipeline(codecName string, tracks []*webrtc.Track, pipelineSrc string) *Pipeline {
pipelineStr := "appsink name=appsink"
switch codecName {
case webrtc.VP8:
@@ -57,7 +57,7 @@ func CreatePipeline(codecName string, track *webrtc.Track, pipelineSrc string) *
pipeline := &Pipeline{
Pipeline: C.gstreamer_send_create_pipeline(pipelineStrUnsafe),
track: track,
tracks: tracks,
id: len(pipelines),
codecName: codecName,
}
@@ -94,9 +94,11 @@ func goHandlePipelineBuffer(buffer unsafe.Pointer, bufferLen C.int, duration C.i
} else {
samples = uint32(videoClockRate * (float32(duration) / 1000000000))
}
if err := pipeline.track.WriteSample(media.Sample{Data: C.GoBytes(buffer, bufferLen), Samples: samples}); err != nil {
for _, t := range pipeline.tracks {
if err := t.WriteSample(media.Sample{Data: C.GoBytes(buffer, bufferLen), Samples: samples}); err != nil {
panic(err)
}
}
} else {
fmt.Printf("discarding buffer, no pipeline with id %d", int(pipelineID))
}

View File

@@ -146,8 +146,8 @@ func main() {
}
// Start pushing buffers on these tracks
gst.CreatePipeline(webrtc.Opus, opusTrack, "audiotestsrc").Start()
gst.CreatePipeline(webrtc.VP8, vp8Track, "videotestsrc").Start()
gst.CreatePipeline(webrtc.Opus, []*webrtc.Track{opusTrack}, "audiotestsrc").Start()
gst.CreatePipeline(webrtc.VP8, []*webrtc.Track{vp8Track}, "videotestsrc").Start()
}
select {}