mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-06 08:46:57 +08:00
Fix race (concurency) for Track
This commit is contained in:
@@ -24,7 +24,7 @@ func (p *Producer) GetTrack(media *streamer.Media, codec *streamer.Codec) *strea
|
||||
panic("you shall not pass!")
|
||||
}
|
||||
|
||||
track := &streamer.Track{Codec: codec, Direction: media.Direction}
|
||||
track := streamer.NewTrack(codec, media.Direction)
|
||||
|
||||
switch media.Direction {
|
||||
case streamer.DirectionSendonly:
|
||||
|
@@ -75,7 +75,7 @@ func (c *Client) GetTrack(media *streamer.Media, codec *streamer.Codec) *streame
|
||||
}
|
||||
}
|
||||
|
||||
track := &streamer.Track{Codec: codec, Direction: media.Direction}
|
||||
track := streamer.NewTrack(codec, media.Direction)
|
||||
c.tracks = append(c.tracks, track)
|
||||
return track
|
||||
}
|
||||
|
@@ -192,10 +192,7 @@ func (c *Client) getTracks() error {
|
||||
}
|
||||
c.medias = append(c.medias, media)
|
||||
|
||||
track := &streamer.Track{
|
||||
Direction: streamer.DirectionSendonly,
|
||||
Codec: codec,
|
||||
}
|
||||
track := streamer.NewTrack(codec, streamer.DirectionSendonly)
|
||||
c.tracks[msg.TrackID] = track
|
||||
|
||||
case "mp4a": // mp4a.40.2
|
||||
|
@@ -83,9 +83,7 @@ func (c *Client) Dial() (err error) {
|
||||
}
|
||||
c.medias = append(c.medias, media)
|
||||
|
||||
track := &streamer.Track{
|
||||
Codec: codec, Direction: media.Direction,
|
||||
}
|
||||
track := streamer.NewTrack(codec, media.Direction)
|
||||
c.tracks = append(c.tracks, track)
|
||||
|
||||
case av.AAC:
|
||||
@@ -108,9 +106,7 @@ func (c *Client) Dial() (err error) {
|
||||
}
|
||||
c.medias = append(c.medias, media)
|
||||
|
||||
track := &streamer.Track{
|
||||
Codec: codec, Direction: media.Direction,
|
||||
}
|
||||
track := streamer.NewTrack(codec, media.Direction)
|
||||
c.tracks = append(c.tracks, track)
|
||||
|
||||
default:
|
||||
|
@@ -429,9 +429,7 @@ func (c *Conn) SetupMedia(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
track := &streamer.Track{
|
||||
Codec: codec, Direction: media.Direction,
|
||||
}
|
||||
track := streamer.NewTrack(codec, media.Direction)
|
||||
|
||||
switch track.Direction {
|
||||
case streamer.DirectionSendonly:
|
||||
@@ -519,9 +517,7 @@ func (c *Conn) Accept() error {
|
||||
// TODO: fix someday...
|
||||
c.channels = map[byte]*streamer.Track{}
|
||||
for i, media := range c.Medias {
|
||||
track := &streamer.Track{
|
||||
Codec: media.Codecs[0], Direction: media.Direction,
|
||||
}
|
||||
track := streamer.NewTrack(media.Codecs[0], media.Direction)
|
||||
c.tracks = append(c.tracks, track)
|
||||
c.channels[byte(i<<1)] = track
|
||||
}
|
||||
|
@@ -13,7 +13,11 @@ type Track struct {
|
||||
Codec *Codec
|
||||
Direction string
|
||||
sink map[*Track]WriterFunc
|
||||
sinkMu sync.RWMutex
|
||||
sinkMu *sync.RWMutex
|
||||
}
|
||||
|
||||
func NewTrack(codec *Codec, direction string) *Track {
|
||||
return &Track{Codec: codec, Direction: direction, sinkMu: new(sync.RWMutex)}
|
||||
}
|
||||
|
||||
func (t *Track) String() string {
|
||||
@@ -40,14 +44,12 @@ func (t *Track) Bind(w WriterFunc) *Track {
|
||||
t.sink = map[*Track]WriterFunc{}
|
||||
}
|
||||
|
||||
clone := &Track{
|
||||
Codec: t.Codec, Direction: t.Direction, sink: t.sink,
|
||||
}
|
||||
t.sink[clone] = w
|
||||
clone := *t
|
||||
t.sink[&clone] = w
|
||||
|
||||
t.sinkMu.Unlock()
|
||||
|
||||
return clone
|
||||
return &clone
|
||||
}
|
||||
|
||||
func (t *Track) Unbind() {
|
||||
|
Reference in New Issue
Block a user