23 typedef std::vector<std::pair<size_t, uint8_t*>> buf_vec;
31 struct sender_statistics {
33 uint32_t sent_pkts = 0;
34 uint32_t sent_bytes = 0;
35 bool sent_rtp_packet =
false;
38 struct receiver_statistics {
40 uint32_t received_pkts = 0;
41 uint32_t lost_pkts = 0;
42 uint32_t received_bytes = 0;
43 bool received_rtp_packet =
false;
45 uint32_t expected_pkts = 0;
46 uint32_t received_prior = 0;
47 uint32_t expected_prior = 0;
54 uint64_t initial_ntp = 0;
55 uint32_t initial_rtp = 0;
56 uint32_t clock_rate = 0;
59 uvgrtp::clock::hrc::hrc_t sr_ts;
62 uint32_t base_seq = 0;
67 struct rtcp_participant {
68 struct receiver_statistics stats;
70 uint32_t probation = 0;
81 struct rtcp_app_packet {
82 rtcp_app_packet(
const rtcp_app_packet& orig_packet) =
delete;
83 rtcp_app_packet(
const char* name, uint8_t subtype, uint32_t payload_len, std::unique_ptr<uint8_t[]> payload);
90 std::unique_ptr<uint8_t[]> payload;
114 rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic<std::uint32_t>> ssrc, std::string cname,
int rce_flags);
115 rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic<std::uint32_t>> ssrc, std::string cname, std::shared_ptr<uvgrtp::srtcp> srtcp,
int rce_flags);
130 rtp_error_t generate_report();
136 rtp_error_t handle_incoming_packet(uint8_t *buffer,
size_t size);
170 rtp_error_t
send_app_packet(
const char *name, uint8_t subtype, uint32_t payload_len,
const uint8_t *payload);
206 rtp_error_t add_initial_participant(uint32_t clock_rate);
218 rtp_error_t reset_rtcp_state(uint32_t ssrc);
224 uint32_t get_rtcp_interval_ms()
const;
230 rtp_error_t set_rtcp_interval_ms(int32_t new_interval);
235 void set_session_bandwidth(uint32_t kbps);
237 std::shared_ptr<uvgrtp::socket> get_socket()
const;
246 rtp_error_t set_network_addresses(std::string local_addr, std::string remote_addr,
247 uint16_t local_port, uint16_t dst_port);
250 std::vector<uint32_t> get_participants()
const;
267 void set_ts_info(uint64_t clock_start, uint32_t clock_rate, uint32_t rtp_ts_start);
295 rtp_error_t
install_sender_hook(std::function<
void(std::unique_ptr<uvgrtp::frame::rtcp_sender_report>)> sr_handler);
319 rtp_error_t
install_receiver_hook(std::function<
void(std::unique_ptr<uvgrtp::frame::rtcp_receiver_report>)> rr_handler);
343 rtp_error_t
install_sdes_hook(std::function<
void(std::unique_ptr<uvgrtp::frame::rtcp_sdes_packet>)> sdes_handler);
367 rtp_error_t
install_app_hook(std::function<
void(std::unique_ptr<uvgrtp::frame::rtcp_app_packet>)> app_handler);
371 rtp_error_t
install_sender_hook(std::function<
void(std::shared_ptr<uvgrtp::frame::rtcp_sender_report>)> sr_handler);
372 rtp_error_t
install_receiver_hook(std::function<
void(std::shared_ptr<uvgrtp::frame::rtcp_receiver_report>)> rr_handler);
373 rtp_error_t
install_sdes_hook(std::function<
void(std::shared_ptr<uvgrtp::frame::rtcp_sdes_packet>)> sdes_handler);
374 rtp_error_t
install_app_hook(std::function<
void(std::shared_ptr<uvgrtp::frame::rtcp_app_packet>)> app_handler);
387 rtp_error_t
install_send_app_hook(std::string app_name, std::function<std::unique_ptr<uint8_t[]>(uint8_t& subtype, uint32_t& payload_len)> app_sending_func);
398 rtp_error_t remove_send_app_hook(std::string app_name);
402 rtp_error_t update_sender_stats(
size_t pkt_size);
405 static rtp_error_t recv_packet_handler(
void *arg,
int rce_flags,
frame::rtp_frame **out);
408 static rtp_error_t send_packet_handler_vec(
void *arg, uvgrtp::buf_vec& buffers);
411 size_t rtcp_length_in_bytes(uint16_t length);
413 void set_payload_size(
size_t mtu_size);
418 rtp_error_t set_sdes_items(
const std::vector<uvgrtp::frame::rtcp_sdes_item>& items);
420 uint32_t size_of_ready_app_packets()
const;
421 uint32_t size_of_apps_from_hook(std::vector< std::shared_ptr<rtcp_app_packet>> packets)
const;
423 uint32_t size_of_compound_packet(uint16_t reports,
424 bool sr_packet,
bool rr_packet,
bool sdes_packet, uint32_t app_size,
bool bye_packet)
const;
427 void read_rtcp_header(
const uint8_t* buffer,
size_t& read_ptr,
429 void read_reports(
const uint8_t* buffer,
size_t& read_ptr,
size_t packet_end, uint8_t count,
430 std::vector<uvgrtp::frame::rtcp_report_block>& reports);
432 void read_ssrc(
const uint8_t* buffer,
size_t& read_ptr, uint32_t& out_ssrc);
437 rtp_error_t handle_sender_report_packet(uint8_t* buffer,
size_t& read_ptr,
size_t packet_end,
439 rtp_error_t handle_receiver_report_packet(uint8_t* buffer,
size_t& read_ptr,
size_t packet_end,
441 rtp_error_t handle_sdes_packet(uint8_t* buffer,
size_t& read_ptr,
size_t packet_end,
443 rtp_error_t handle_bye_packet(uint8_t* buffer,
size_t& read_ptr,
445 rtp_error_t handle_app_packet(uint8_t* buffer,
size_t& read_ptr,
size_t packet_end,
448 static void rtcp_runner(
rtcp *
rtcp);
450 static void rtcp_report_reader(
rtcp *
rtcp);
455 bool is_participant(uint32_t ssrc)
const;
464 bool collision_detected(uint32_t ssrc)
const;
467 rtp_error_t add_participant(uint32_t ssrc);
475 rtp_error_t init_participant_seq(uint32_t ssrc, uint16_t base_seq);
482 rtp_error_t update_participant_seq(uint32_t ssrc, uint16_t seq);
488 void update_rtcp_bandwidth(
size_t pkt_size);
492 void update_avg_rtcp_size(uint64_t packet_size);
497 double rtcp_interval(
int members,
int senders,
498 double rtcp_bw,
bool we_sent,
double avg_rtcp_size,
bool red_min,
bool randomisation);
504 rtp_error_t remove_timeout_ssrc(uint32_t ssrc);
509 void zero_stats(uvgrtp::sender_statistics *stats);
511 void zero_stats(uvgrtp::receiver_statistics *stats);
514 rtp_error_t send_rtcp_packet_to_participants(uint8_t* frame, uint32_t frame_size,
bool encrypt);
516 void free_participant(std::unique_ptr<rtcp_participant> participant);
518 void cleanup_participants();
521 std::shared_ptr<uvgrtp::srtcp> srtcp_;
539 uint32_t total_bandwidth_;
545 double rtcp_bandwidth_;
549 uint32_t reduced_minimum_;
558 std::string local_addr_;
559 std::string remote_addr_;
560 uint16_t local_port_;
568 size_t avg_rtcp_pkt_pize_;
572 uint64_t avg_rtcp_size_;
576 size_t rtcp_pkt_count_;
577 size_t rtcp_byte_count_;
580 uint32_t rtcp_pkt_sent_count_;
587 std::shared_ptr<std::atomic_uint> ssrc_;
590 uint64_t clock_start_;
593 uint32_t clock_rate_;
596 uint32_t rtp_ts_start_;
598 std::map<uint32_t, std::unique_ptr<rtcp_participant>> participants_;
599 uint8_t num_receivers_;
602 sockaddr_in socket_address_ = {};
608 std::map<uint32_t, uint32_t> ms_since_last_rep_;
611 struct sender_statistics our_stats;
615 std::vector<std::unique_ptr<rtcp_participant>> initial_participants_;
624 std::function<void(std::shared_ptr<uvgrtp::frame::rtcp_sender_report>)> sr_hook_f_;
625 std::function<void(std::unique_ptr<uvgrtp::frame::rtcp_sender_report>)> sr_hook_u_;
626 std::function<void(std::shared_ptr<uvgrtp::frame::rtcp_receiver_report>)> rr_hook_f_;
627 std::function<void(std::unique_ptr<uvgrtp::frame::rtcp_receiver_report>)> rr_hook_u_;
628 std::function<void(std::shared_ptr<uvgrtp::frame::rtcp_sdes_packet>)> sdes_hook_f_;
629 std::function<void(std::unique_ptr<uvgrtp::frame::rtcp_sdes_packet>)> sdes_hook_u_;
630 std::function<void(std::shared_ptr<uvgrtp::frame::rtcp_app_packet>)> app_hook_f_;
631 std::function<void(std::unique_ptr<uvgrtp::frame::rtcp_app_packet>)> app_hook_u_;
633 std::mutex sr_mutex_;
634 std::mutex rr_mutex_;
635 std::mutex sdes_mutex_;
636 std::mutex app_mutex_;
637 mutable std::mutex participants_mutex_;
638 std::mutex send_app_mutex_;
640 std::unique_ptr<std::thread> report_generator_;
641 std::unique_ptr<std::thread> report_reader_;
642 std::shared_ptr<uvgrtp::socket> rtcp_socket_;
644 bool is_active()
const
651 std::atomic<uint32_t> interval_ms_;
653 std::shared_ptr<uvgrtp::rtp> rtp_ptr_;
655 std::mutex packet_mutex_;
658 std::vector<uvgrtp::frame::rtcp_sdes_item> ourItems_;
659 std::vector<uint32_t> bye_ssrcs_;
661 std::map<std::string, std::deque<rtcp_app_packet>> app_packets_;
663 std::multimap<std::string, std::function <std::unique_ptr<uint8_t[]>(uint8_t& subtype, uint32_t& payload_len)>> outgoing_app_hooks_;
675namespace uvg_rtp = uvgrtp;
RTCP instance handles all incoming and outgoing RTCP traffic, including report generation.
rtp_error_t install_receiver_hook(void(*hook)(uvgrtp::frame::rtcp_receiver_report *))
Install an RTCP Receiver Report hook.
rtp_error_t send_app_packet(const char *name, uint8_t subtype, uint32_t payload_len, const uint8_t *payload)
Send an RTCP APP packet.
rtp_error_t install_receiver_hook(std::function< void(std::unique_ptr< uvgrtp::frame::rtcp_receiver_report >)> rr_handler)
Install an RTCP Receiver Report hook.
rtp_error_t send_bye_packet(std::vector< uint32_t > ssrcs)
Send an RTCP BYE packet.
rtp_error_t install_sdes_hook(std::function< void(std::unique_ptr< uvgrtp::frame::rtcp_sdes_packet >)> sdes_handler)
Install an RTCP SDES packet hook.
rtp_error_t install_sender_hook(void(*hook)(uvgrtp::frame::rtcp_sender_report *))
Install an RTCP Sender Report hook.
void set_ts_info(uint64_t clock_start, uint32_t clock_rate, uint32_t rtp_ts_start)
Provide timestamping information for RTCP.
rtp_error_t send_sdes_packet(const std::vector< uvgrtp::frame::rtcp_sdes_item > &items)
Send an RTCP SDES packet.
rtp_error_t install_app_hook(std::function< void(std::unique_ptr< uvgrtp::frame::rtcp_app_packet >)> app_handler)
Install an RTCP APP packet hook.
rtp_error_t install_sender_hook(std::function< void(std::unique_ptr< uvgrtp::frame::rtcp_sender_report >)> sr_handler)
Install an RTCP Sender Report hook.
rtp_error_t remove_all_hooks()
Remove all installed hooks for RTCP.
rtp_error_t install_app_hook(void(*hook)(uvgrtp::frame::rtcp_app_packet *))
Install an RTCP APP packet hook.
rtp_error_t install_send_app_hook(std::string app_name, std::function< std::unique_ptr< uint8_t[]>(uint8_t &subtype, uint32_t &payload_len)> app_sending_func)
Install hook for one type of APP packets.
rtp_error_t install_sdes_hook(void(*hook)(uvgrtp::frame::rtcp_sdes_packet *))
Install an RTCP SDES packet hook.
See RFC 3550 section 6.4.2
See RFC 3550 section 6.4.1