12 #include "srtp/srtcp.hh"
24 const int RTP_SEQ_MOD = 1 << 16;
25 const int MIN_SEQUENTIAL = 2;
26 const int MAX_DROPOUT = 3000;
27 const int MAX_MISORDER = 100;
28 const int MIN_TIMEOUT = 5000;
30 struct rtcp_statistics {
32 uint32_t received_pkts;
33 uint32_t dropped_pkts;
34 uint32_t received_bytes;
49 uvgrtp::clock::hrc::hrc_t sr_ts;
57 struct rtcp_participant {
58 uvgrtp::socket *socket;
60 struct rtcp_statistics stats;
67 uvgrtp::frame::rtcp_sender_report *s_frame;
68 uvgrtp::frame::rtcp_receiver_report *r_frame;
69 uvgrtp::frame::rtcp_sdes_packet *sdes_frame;
70 uvgrtp::frame::rtcp_app_packet *app_frame;
74 class rtcp :
public runner {
77 rtcp(uvgrtp::rtp *rtp,
int flags);
78 rtcp(uvgrtp::rtp *rtp, uvgrtp::srtcp *srtcp,
int flags);
93 rtp_error_t generate_report();
103 rtp_error_t handle_sender_report_packet(uint8_t *frame,
size_t size);
104 rtp_error_t handle_receiver_report_packet(uint8_t *frame,
size_t size);
105 rtp_error_t handle_sdes_packet(uint8_t *frame,
size_t size);
106 rtp_error_t handle_bye_packet(uint8_t *frame,
size_t size);
107 rtp_error_t handle_app_packet(uint8_t *frame,
size_t size);
113 rtp_error_t handle_incoming_packet(uint8_t *buffer,
size_t size);
123 rtp_error_t send_sdes_packet(std::vector<uvgrtp::frame::rtcp_sdes_item>& items);
124 rtp_error_t send_app_packet(
char *name, uint8_t subtype,
size_t payload_len, uint8_t *payload);
125 rtp_error_t send_bye_packet(std::vector<uint32_t> ssrcs);
132 uvgrtp::frame::rtcp_sender_report *get_sender_packet(uint32_t ssrc);
133 uvgrtp::frame::rtcp_receiver_report *get_receiver_packet(uint32_t ssrc);
134 uvgrtp::frame::rtcp_sdes_packet *get_sdes_packet(uint32_t ssrc);
135 uvgrtp::frame::rtcp_app_packet *get_app_packet(uint32_t ssrc);
138 std::vector<uvgrtp::socket>& get_sockets();
148 rtp_error_t add_participant(std::string dst_addr, uint16_t dst_port, uint16_t src_port, uint32_t clock_rate);
151 void sender_inc_seq_cycle_count();
152 void sender_inc_sent_pkts(
size_t n);
153 void sender_inc_sent_bytes(
size_t n);
154 void sender_update_stats(uvgrtp::frame::rtp_frame *frame);
156 void receiver_inc_sent_bytes(uint32_t sender_ssrc,
size_t n);
157 void receiver_inc_overhead_bytes(uint32_t sender_ssrc,
size_t n);
158 void receiver_inc_total_bytes(uint32_t sender_ssrc,
size_t n);
159 void receiver_inc_sent_pkts(uint32_t sender_ssrc,
size_t n);
166 rtp_error_t receiver_update_stats(uvgrtp::frame::rtp_frame *frame);
175 rtp_error_t reset_rtcp_state(uint32_t ssrc);
178 void update_session_statistics(uvgrtp::frame::rtp_frame *frame);
181 std::vector<uint32_t> get_participants();
198 void set_ts_info(uint64_t clock_start, uint32_t clock_rate, uint32_t rtp_ts_start);
203 rtp_error_t install_sender_hook(
void (*hook)(uvgrtp::frame::rtcp_sender_report *));
204 rtp_error_t install_receiver_hook(
void (*hook)(uvgrtp::frame::rtcp_receiver_report *));
205 rtp_error_t install_sdes_hook(
void (*hook)(uvgrtp::frame::rtcp_sdes_packet *));
206 rtp_error_t install_app_hook(
void (*hook)(uvgrtp::frame::rtcp_app_packet *));
210 rtp_error_t update_sender_stats(
size_t pkt_size);
213 static rtp_error_t recv_packet_handler(
void *arg,
int flags, frame::rtp_frame **out);
216 static rtp_error_t send_packet_handler_vec(
void *arg, uvgrtp::buf_vec& buffers);
220 static void rtcp_runner(
rtcp *
rtcp);
225 bool is_participant(uint32_t ssrc);
233 bool collision_detected(uint32_t ssrc, sockaddr_in& src_addr);
236 rtp_error_t add_participant(uint32_t ssrc);
240 rtp_error_t init_new_participant(uvgrtp::frame::rtp_frame *frame);
244 rtp_error_t init_participant_seq(uint32_t ssrc, uint16_t base_seq);
251 rtp_error_t update_participant_seq(uint32_t ssrc, uint16_t seq);
257 void update_rtcp_bandwidth(
size_t pkt_size);
263 rtp_error_t generate_sender_report();
264 rtp_error_t generate_receiver_report();
269 void zero_stats(uvgrtp::rtcp_statistics *stats);
276 uvgrtp::srtcp *srtcp_;
296 size_t rtcp_bandwidth_;
306 size_t avg_rtcp_pkt_pize_;
309 size_t rtcp_pkt_count_;
310 size_t rtcp_byte_count_;
313 size_t rtcp_pkt_sent_count_;
322 uint64_t clock_start_;
325 uint32_t clock_rate_;
328 uint32_t rtp_ts_start_;
330 std::map<uint32_t, rtcp_participant *> participants_;
331 size_t num_receivers_;
334 struct rtcp_statistics our_stats;
338 std::vector<rtcp_participant *> initial_participants_;
344 std::vector<uvgrtp::socket> sockets_;
346 void (*sender_hook_)(uvgrtp::frame::rtcp_sender_report *);
347 void (*receiver_hook_)(uvgrtp::frame::rtcp_receiver_report *);
348 void (*sdes_hook_)(uvgrtp::frame::rtcp_sdes_packet *);
349 void (*app_hook_)(uvgrtp::frame::rtcp_app_packet *);
353 namespace uvg_rtp = uvgrtp;
void set_ts_info(uint64_t clock_start, uint32_t clock_rate, uint32_t rtp_ts_start)
Provide timestamping information for RTCP.