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