Live video on the AT Protocol
1package rtcrec
2
3import (
4 "time"
5
6 "github.com/pion/interceptor"
7 "github.com/pion/webrtc/v4"
8)
9
10type RecordingTrackRemote struct {
11 track *webrtc.TrackRemote
12 stream *RecorderStream
13 pc *RecordingPeerConnection
14}
15
16func (t *RecordingTrackRemote) Read(p []byte) (n int, attrs interceptor.Attributes, err error) {
17 n, attrs, err = t.track.Read(p)
18 now := time.Now()
19 b2 := make([]byte, n)
20 copy(b2, p)
21 t.pc.Do(func() {
22 errString := ""
23 if err != nil {
24 errString = err.Error()
25 }
26 t.stream.Event(WebRTCEvent{
27 TrackRead: &TrackRead{
28 Data: b2,
29 SSRC: t.track.SSRC(),
30 Count: n,
31 // Attrs: attrs,
32 Err: errString,
33 },
34 Time: now,
35 })
36 })
37 return n, attrs, err
38}
39
40func (t *RecordingTrackRemote) Codec() webrtc.RTPCodecParameters {
41 now := time.Now()
42 codec := t.track.Codec()
43 t.pc.Do(func() {
44 t.stream.Event(WebRTCEvent{
45 TrackCodec: &TrackCodec{
46 SSRC: t.track.SSRC(),
47 Codec: codec,
48 },
49 Time: now,
50 })
51 })
52 return codec
53}
54
55func (t *RecordingTrackRemote) ID() string {
56 return t.track.ID()
57}
58
59func (t *RecordingTrackRemote) Kind() webrtc.RTPCodecType {
60 now := time.Now()
61 kind := t.track.Kind()
62 t.pc.Do(func() {
63 t.stream.Event(WebRTCEvent{
64 TrackKind: &TrackKind{
65 SSRC: t.track.SSRC(),
66 Kind: kind,
67 },
68 Time: now,
69 })
70 })
71 return kind
72}
73
74func (t *RecordingTrackRemote) PayloadType() webrtc.PayloadType {
75 now := time.Now()
76 payloadType := t.track.PayloadType()
77 t.pc.Do(func() {
78 t.stream.Event(WebRTCEvent{
79 TrackPayloadType: &TrackPayloadType{
80 SSRC: t.track.SSRC(),
81 PayloadType: payloadType,
82 },
83 Time: now,
84 })
85 })
86 return payloadType
87}
88
89func (t *RecordingTrackRemote) SSRC() webrtc.SSRC {
90 now := time.Now()
91 ssrc := t.track.SSRC()
92 t.pc.Do(func() {
93 t.stream.Event(WebRTCEvent{
94 Time: now,
95 TrackSSRC: &TrackSSRC{
96 SSRC: ssrc,
97 },
98 })
99 })
100 return ssrc
101}