Live video on the AT Protocol
79
fork

Configure Feed

Select the types of activity you want to include in your feed.

at eli/fix-context-recursion 65 lines 1.6 kB view raw
1package rtcrec 2 3import ( 4 "errors" 5 "fmt" 6 "io" 7 8 "github.com/pion/interceptor" 9 "github.com/pion/webrtc/v4" 10) 11 12type ReplayTrackRemote struct { 13 ssrc webrtc.SSRC 14 trackEvent *WebRTCEvent 15 events map[string][]*WebRTCEvent 16 pc *ReplayPeerConnection 17} 18 19func (t *ReplayTrackRemote) Read(p []byte) (n int, attrs interceptor.Attributes, err error) { 20 ev := t.pc.group.NextTrack(t.ssrc, EventTypeTrackRead) 21 if ev == nil { 22 return 0, nil, io.EOF 23 } 24 select { 25 case <-t.pc.wait(fmt.Sprintf("TrackRead %s", t.trackEvent.Track.ID), ev.Time): 26 var err error 27 if ev.TrackRead.Err != "" { 28 err = errors.New(ev.TrackRead.Err) 29 } 30 if ev.TrackRead.Data != nil { 31 copied := copy(p, ev.TrackRead.Data) 32 if copied != len(ev.TrackRead.Data) { 33 panic("copied != len(ev.TrackRead.Data)") 34 } 35 } 36 // log.Log(t.pc.ctx, "TrackRead", "trackId", t.trackEvent.Track.ID, "count", ev.TrackRead.Count, "err", err) 37 return ev.TrackRead.Count, nil, err 38 case <-t.pc.ctx.Done(): 39 return 0, nil, t.pc.ctx.Err() 40 } 41} 42 43func (t *ReplayTrackRemote) Codec() webrtc.RTPCodecParameters { 44 ev := t.pc.group.PeekTrack(t.ssrc, EventTypeTrackCodec) 45 if ev == nil { 46 panic("no codec found") 47 } 48 return ev.TrackCodec.Codec 49} 50 51func (t *ReplayTrackRemote) ID() string { 52 return t.trackEvent.Track.ID 53} 54 55func (t *ReplayTrackRemote) Kind() webrtc.RTPCodecType { 56 return t.trackEvent.Track.Kind 57} 58 59func (t *ReplayTrackRemote) PayloadType() webrtc.PayloadType { 60 return t.trackEvent.Track.PayloadType 61} 62 63func (t *ReplayTrackRemote) SSRC() webrtc.SSRC { 64 return t.ssrc 65}