1
Fork 0

Fix disk writer when doing simulcast.

This commit is contained in:
Juliusz Chroboczek 2021-05-12 16:39:46 +02:00
parent 1130295e0b
commit 0205695bd7
1 changed files with 40 additions and 10 deletions

View File

@ -260,15 +260,50 @@ type diskTrack struct {
} }
func newDiskConn(client *Client, directory string, up conn.Up, remoteTracks []conn.UpTrack) (*diskConn, error) { func newDiskConn(client *Client, directory string, up conn.Up, remoteTracks []conn.UpTrack) (*diskConn, error) {
var audio, video conn.UpTrack
for _, remote := range remoteTracks {
codec := remote.Codec().MimeType
if strings.EqualFold(codec, "audio/opus") {
if audio == nil {
audio = remote
} else {
client.group.WallOps("Multiple audio tracks, recording just one")
}
} else if strings.EqualFold(codec, "video/vp8") ||
strings.EqualFold(codec, "video/vp9") {
println(remote.Label())
if video == nil || video.Label() == "l" {
video = remote
} else if remote.Label() != "l" {
client.group.WallOps("Multiple video tracks, recording just one")
}
} else {
client.group.WallOps("Unknown codec, " + codec + ", not recording")
}
}
if video == nil && audio == nil {
return nil, errors.New("no usable tracks found")
}
tracks := make([]conn.UpTrack, 0, 2)
if audio != nil {
tracks = append(tracks, audio)
}
if video != nil {
tracks = append(tracks, video)
}
_, username := up.User() _, username := up.User()
conn := diskConn{ conn := diskConn{
client: client, client: client,
directory: directory, directory: directory,
username: username, username: username,
tracks: make([]*diskTrack, 0, len(remoteTracks)), tracks: make([]*diskTrack, 0, len(tracks)),
remote: up, remote: up,
} }
for _, remote := range remoteTracks { for _, remote := range tracks {
var builder *samplebuilder.SampleBuilder var builder *samplebuilder.SampleBuilder
codec := remote.Codec() codec := remote.Codec()
if strings.EqualFold(codec.MimeType, "audio/opus") { if strings.EqualFold(codec.MimeType, "audio/opus") {
@ -279,9 +314,6 @@ func newDiskConn(client *Client, directory string, up conn.Up, remoteTracks []co
), ),
) )
} else if strings.EqualFold(codec.MimeType, "video/vp8") { } else if strings.EqualFold(codec.MimeType, "video/vp8") {
if conn.hasVideo {
return nil, errors.New("multiple video tracks not supported")
}
builder = samplebuilder.New( builder = samplebuilder.New(
128, &codecs.VP8Packet{}, codec.ClockRate, 128, &codecs.VP8Packet{}, codec.ClockRate,
samplebuilder.WithPartitionHeadChecker( samplebuilder.WithPartitionHeadChecker(
@ -290,9 +322,6 @@ func newDiskConn(client *Client, directory string, up conn.Up, remoteTracks []co
) )
conn.hasVideo = true conn.hasVideo = true
} else if strings.EqualFold(codec.MimeType, "video/vp9") { } else if strings.EqualFold(codec.MimeType, "video/vp9") {
if conn.hasVideo {
return nil, errors.New("multiple video tracks not supported")
}
builder = samplebuilder.New( builder = samplebuilder.New(
128, &codecs.VP9Packet{}, codec.ClockRate, 128, &codecs.VP9Packet{}, codec.ClockRate,
samplebuilder.WithPartitionHeadChecker( samplebuilder.WithPartitionHeadChecker(
@ -301,8 +330,9 @@ func newDiskConn(client *Client, directory string, up conn.Up, remoteTracks []co
) )
conn.hasVideo = true conn.hasVideo = true
} else { } else {
client.group.WallOps( // this shouldn't happen
"Cannot record codec " + codec.MimeType, return nil, errors.New(
"cannot record codec " + codec.MimeType,
) )
continue continue
} }