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();
186 void set_ts_info(uint64_t clock_start, uint32_t clock_rate, uint32_t rtp_ts_start);
191 rtp_error_t install_sender_hook(
void (*hook)(uvgrtp::frame::rtcp_sender_report *));
192 rtp_error_t install_receiver_hook(
void (*hook)(uvgrtp::frame::rtcp_receiver_report *));
193 rtp_error_t install_sdes_hook(
void (*hook)(uvgrtp::frame::rtcp_sdes_packet *));
194 rtp_error_t install_app_hook(
void (*hook)(uvgrtp::frame::rtcp_app_packet *));
198 rtp_error_t update_sender_stats(
size_t pkt_size);
201 static rtp_error_t recv_packet_handler(
void *arg,
int flags, frame::rtp_frame **out);
204 static rtp_error_t send_packet_handler_vec(
void *arg, uvgrtp::buf_vec& buffers);
208 static void rtcp_runner(
rtcp *
rtcp);
213 bool is_participant(uint32_t ssrc);
221 bool collision_detected(uint32_t ssrc, sockaddr_in& src_addr);
224 rtp_error_t add_participant(uint32_t ssrc);
228 rtp_error_t init_new_participant(uvgrtp::frame::rtp_frame *frame);
232 rtp_error_t init_participant_seq(uint32_t ssrc, uint16_t base_seq);
239 rtp_error_t update_participant_seq(uint32_t ssrc, uint16_t seq);
245 void update_rtcp_bandwidth(
size_t pkt_size);
251 rtp_error_t generate_sender_report();
252 rtp_error_t generate_receiver_report();
257 void zero_stats(uvgrtp::rtcp_statistics *stats);
264 uvgrtp::srtcp *srtcp_;
284 size_t rtcp_bandwidth_;
294 size_t avg_rtcp_pkt_pize_;
297 size_t rtcp_pkt_count_;
298 size_t rtcp_byte_count_;
301 size_t rtcp_pkt_sent_count_;
310 uint64_t clock_start_;
313 uint32_t clock_rate_;
316 uint32_t rtp_ts_start_;
318 std::map<uint32_t, rtcp_participant *> participants_;
319 size_t num_receivers_;
322 struct rtcp_statistics our_stats;
326 std::vector<rtcp_participant *> initial_participants_;
332 std::vector<uvgrtp::socket> sockets_;
334 void (*sender_hook_)(uvgrtp::frame::rtcp_sender_report *);
335 void (*receiver_hook_)(uvgrtp::frame::rtcp_receiver_report *);
336 void (*sdes_hook_)(uvgrtp::frame::rtcp_sdes_packet *);
337 void (*app_hook_)(uvgrtp::frame::rtcp_app_packet *);
341 namespace uvg_rtp = uvgrtp;