From 69b17230f329f6a3e3399ada1d45825c0d9afe11 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Sun, 4 Dec 2022 23:16:34 +0300 Subject: [PATCH] Collect producers codecs during negotiation --- cmd/streams/stream.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/cmd/streams/stream.go b/cmd/streams/stream.go index b819f6e1..6843f2e8 100644 --- a/cmd/streams/stream.go +++ b/cmd/streams/stream.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "github.com/AlexxIT/go2rtc/pkg/streamer" + "strings" "sync" ) @@ -55,6 +56,8 @@ func (s *Stream) AddConsumer(cons streamer.Consumer) (err error) { consumer := &Consumer{element: cons} var producers []*Producer // matched producers for consumer + var codecs string + // Step 1. Get consumer medias for icc, consMedia := range cons.GetMedias() { log.Trace().Stringer("media", consMedia). @@ -67,6 +70,8 @@ func (s *Stream) AddConsumer(cons streamer.Consumer) (err error) { log.Trace().Stringer("media", prodMedia). Msgf("[streams] producer=%d candidate=%d", ip, ipc) + collectCodecs(prodMedia, &codecs) + // Step 3. Match consumer/producer codecs list prodCodec := prodMedia.MatchMedia(consMedia) if prodCodec != nil { @@ -93,7 +98,7 @@ func (s *Stream) AddConsumer(cons streamer.Consumer) (err error) { if len(producers) == 0 { s.stopProducers() - return errors.New("couldn't find the matching tracks") + return errors.New("no matching codecs: " + codecs) } s.mu.Lock() @@ -216,3 +221,19 @@ func (s *Stream) removeProducer(i int) { 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 + } +}