Collect producers codecs during negotiation
This commit is contained in:
+22
-1
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user