Collect producers codecs during negotiation
This commit is contained in:
+22
-1
@@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/AlexxIT/go2rtc/pkg/streamer"
|
"github.com/AlexxIT/go2rtc/pkg/streamer"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -55,6 +56,8 @@ func (s *Stream) AddConsumer(cons streamer.Consumer) (err error) {
|
|||||||
consumer := &Consumer{element: cons}
|
consumer := &Consumer{element: cons}
|
||||||
var producers []*Producer // matched producers for consumer
|
var producers []*Producer // matched producers for consumer
|
||||||
|
|
||||||
|
var codecs string
|
||||||
|
|
||||||
// Step 1. Get consumer medias
|
// Step 1. Get consumer medias
|
||||||
for icc, consMedia := range cons.GetMedias() {
|
for icc, consMedia := range cons.GetMedias() {
|
||||||
log.Trace().Stringer("media", consMedia).
|
log.Trace().Stringer("media", consMedia).
|
||||||
@@ -67,6 +70,8 @@ func (s *Stream) AddConsumer(cons streamer.Consumer) (err error) {
|
|||||||
log.Trace().Stringer("media", prodMedia).
|
log.Trace().Stringer("media", prodMedia).
|
||||||
Msgf("[streams] producer=%d candidate=%d", ip, ipc)
|
Msgf("[streams] producer=%d candidate=%d", ip, ipc)
|
||||||
|
|
||||||
|
collectCodecs(prodMedia, &codecs)
|
||||||
|
|
||||||
// Step 3. Match consumer/producer codecs list
|
// Step 3. Match consumer/producer codecs list
|
||||||
prodCodec := prodMedia.MatchMedia(consMedia)
|
prodCodec := prodMedia.MatchMedia(consMedia)
|
||||||
if prodCodec != nil {
|
if prodCodec != nil {
|
||||||
@@ -93,7 +98,7 @@ func (s *Stream) AddConsumer(cons streamer.Consumer) (err error) {
|
|||||||
|
|
||||||
if len(producers) == 0 {
|
if len(producers) == 0 {
|
||||||
s.stopProducers()
|
s.stopProducers()
|
||||||
return errors.New("couldn't find the matching tracks")
|
return errors.New("no matching codecs: " + codecs)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
@@ -216,3 +221,19 @@ func (s *Stream) removeProducer(i int) {
|
|||||||
s.producers = append(s.producers[:i], s.producers[i+1:]...)
|
s.producers = append(s.producers[:i], s.producers[i+1:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func collectCodecs(media *streamer.Media, codecs *string) {
|
||||||
|
for _, codec := range media.Codecs {
|
||||||
|
name := codec.Name
|
||||||
|
if name == streamer.CodecAAC {
|
||||||
|
name = "AAC"
|
||||||
|
}
|
||||||
|
if strings.Contains(*codecs, name) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(*codecs) > 0 {
|
||||||
|
*codecs += ","
|
||||||
|
}
|
||||||
|
*codecs += name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user