Live video on the AT Protocol
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}