Live video on the AT Protocol
79
fork

Configure Feed

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

at v0.7.31 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}