1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
//! Track event types.
//!
//! Events related to incoming media tracks from the remote peer.
use crateMediaStreamId;
use crateMediaStreamTrackId;
use crate;
/// Initialization data for a track event.
///
/// Contains IDs needed to access the track, receiver, transceiver, and
/// associated media streams when a track is opened.
///
/// # Fields
///
/// - `receiver_id` - ID of the RTP receiver handling this track
/// - `track_id` - ID of the media stream track
/// - `stream_ids` - IDs of media streams this track belongs to
/// - `rid` - RTP Stream ID for simulcast/SVC (if applicable)
///
/// # Examples
///
/// ## Accessing track components
///
/// ```ignore
/// // Note: Accessing receiver/transceiver requires &mut RTCPeerConnection
/// use rtc::peer_connection::RTCPeerConnection;
/// use rtc::peer_connection::event::{RTCPeerConnectionEvent, RTCTrackEvent};
///
/// fn handle_event(mut peer_connection: RTCPeerConnection, event: RTCPeerConnectionEvent) {
/// match event {
/// RTCPeerConnectionEvent::OnTrack(RTCTrackEvent::OnOpen(init)) => {
/// // Access the receiver
/// if let Some(receiver) = peer_connection.rtp_receiver(init.receiver_id) {
/// // Get receiver parameters
/// let params = receiver.get_parameters();
/// println!("Codecs: {:?}", params.codecs);
/// }
///
/// // Print associated stream IDs
/// println!("Stream IDs: {:?}", init.stream_ids);
///
/// // Check if this is a simulcast stream
/// if let Some(rid) = &init.rid {
/// println!("Simulcast RID: {}", rid);
/// }
/// }
/// _ => {}
/// }
/// }
/// ```
/// Events related to incoming media tracks.
///
/// These events track the lifecycle of media tracks received from the remote peer.
/// Applications should handle these events to access incoming audio/video streams
/// and read RTP/RTCP packets.
///
/// # Lifecycle
///
/// 1. `OnOpen` - Track is ready, contains initialization data
/// 2. `OnError` - An error occurred with the track
/// 3. `OnClosing` - Track is starting to close
/// 4. `OnClose` - Track is fully closed
///
/// # Examples
///
/// ## Handling track lifecycle
///
/// ```
/// use rtc::peer_connection::event::{RTCPeerConnectionEvent, RTCTrackEvent};
///
/// # fn handle_event(event: RTCPeerConnectionEvent) {
/// match event {
/// RTCPeerConnectionEvent::OnTrack(track_event) => {
/// match track_event {
/// RTCTrackEvent::OnOpen(init) => {
/// println!("Track opened: {:?}", init.track_id);
/// // Start reading RTP packets
/// }
/// RTCTrackEvent::OnError(track_id) => {
/// eprintln!("Track error: {:?}", track_id);
/// }
/// RTCTrackEvent::OnClose(track_id) => {
/// println!("Track closed: {:?}", track_id);
/// // Clean up resources
/// }
/// _ => {}
/// }
/// }
/// _ => {}
/// }
/// # }
/// ```
///
/// ## Reading media from track (conceptual)
///
/// ```ignore
/// // Note: poll_read() is part of sans-I/O design
/// use rtc::peer_connection::RTCPeerConnection;
/// use rtc::peer_connection::event::{RTCPeerConnectionEvent, RTCTrackEvent};
/// use rtc::peer_connection::message::RTCMessage;
///
/// fn handle_events(mut peer_connection: RTCPeerConnection) {
/// // Poll events
/// while let Some(event) = peer_connection.poll_event() {
/// if let RTCPeerConnectionEvent::OnTrack(RTCTrackEvent::OnOpen(init)) = event {
/// println!("Track opened, ready to receive media");
/// }
/// }
///
/// // Poll incoming media
/// while let Some(message) = peer_connection.poll_read() {
/// match message {
/// RTCMessage::RtpPacket(track_id, rtp) => {
/// println!("RTP packet from track {:?}: {} bytes", track_id, rtp.payload.len());
/// }
/// RTCMessage::RtcpPacket(receiver_id, rtcp) => {
/// println!("RTCP packet: {:?}", rtcp);
/// }
/// _ => {}
/// }
/// }
/// }
/// ```
///
/// # Specification
///
/// See [RTCTrackEvent](https://www.w3.org/TR/webrtc/#rtctrackevent)