Collect producers codecs during negotiation

This commit is contained in:
Alexey Khit
2022-12-04 23:16:34 +03:00
parent e2ecd909ab
commit 69b17230f3
+22 -1
View File
@@ -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
}
}