multiplex: Configure RTCP to use rtcp_reader class for reception
This commit is contained in:
parent
24812c1788
commit
8037e730b4
|
@ -120,10 +120,10 @@ namespace uvgrtp {
|
|||
class rtcp {
|
||||
public:
|
||||
/// \cond DO_NOT_DOCUMENT
|
||||
rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic<std::uint32_t>> ssrc, std::string cname,
|
||||
std::shared_ptr<uvgrtp::socketfactory> sfp, int rce_flags);
|
||||
rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic<std::uint32_t>> ssrc, std::string cname,
|
||||
std::shared_ptr<uvgrtp::socketfactory> sfp, std::shared_ptr<uvgrtp::srtcp> srtcp, int rce_flags);
|
||||
rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic<std::uint32_t>> ssrc, std::shared_ptr<std::atomic<uint32_t>> remote_ssrc,
|
||||
std::string cname, std::shared_ptr<uvgrtp::socketfactory> sfp, int rce_flags);
|
||||
rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic<std::uint32_t>> ssrc, std::shared_ptr<std::atomic<uint32_t>> remote_ssrc,
|
||||
std::string cname, std::shared_ptr<uvgrtp::socketfactory> sfp, std::shared_ptr<uvgrtp::srtcp> srtcp, int rce_flags);
|
||||
~rtcp();
|
||||
|
||||
/* start the RTCP runner thread
|
||||
|
@ -597,6 +597,9 @@ namespace uvgrtp {
|
|||
/* Copy of our own current SSRC */
|
||||
std::shared_ptr<std::atomic_uint> ssrc_;
|
||||
|
||||
/* Copy of the remote streams SSRC */
|
||||
std::shared_ptr<std::atomic<uint32_t>> remote_ssrc_;
|
||||
|
||||
/* NTP timestamp associated with initial RTP timestamp (aka t = 0) */
|
||||
uint64_t clock_start_;
|
||||
|
||||
|
|
|
@ -286,7 +286,7 @@ rtp_error_t uvgrtp::media_stream::init()
|
|||
}
|
||||
|
||||
rtp_ = std::shared_ptr<uvgrtp::rtp> (new uvgrtp::rtp(fmt_, ssrc_, ipv6_));
|
||||
rtcp_ = std::shared_ptr<uvgrtp::rtcp> (new uvgrtp::rtcp(rtp_, ssrc_, cname_, sfp_, rce_flags_));
|
||||
rtcp_ = std::shared_ptr<uvgrtp::rtcp> (new uvgrtp::rtcp(rtp_, ssrc_, remote_ssrc_, cname_, sfp_, rce_flags_));
|
||||
|
||||
socket_->install_handler(rtcp_.get(), rtcp_->send_packet_handler_vec);
|
||||
|
||||
|
@ -351,7 +351,7 @@ rtp_error_t uvgrtp::media_stream::add_srtp_ctx(uint8_t *key, uint8_t *salt)
|
|||
return free_resources(ret);
|
||||
}
|
||||
|
||||
rtcp_ = std::shared_ptr<uvgrtp::rtcp> (new uvgrtp::rtcp(rtp_, ssrc_, cname_, sfp_, srtcp_, rce_flags_));
|
||||
rtcp_ = std::shared_ptr<uvgrtp::rtcp> (new uvgrtp::rtcp(rtp_, ssrc_, remote_ssrc_, cname_, sfp_, srtcp_, rce_flags_));
|
||||
|
||||
socket_->install_handler(rtcp_.get(), rtcp_->send_packet_handler_vec);
|
||||
socket_->install_handler(srtp_.get(), srtp_->send_packet_handler);
|
||||
|
@ -420,7 +420,7 @@ rtp_error_t uvgrtp::media_stream::add_zrtp_ctx()
|
|||
|
||||
UVG_LOG_DEBUG("DH negotiation finished!");
|
||||
|
||||
rtcp_ = std::shared_ptr<uvgrtp::rtcp>(new uvgrtp::rtcp(rtp_, ssrc_, cname_, sfp_, srtcp_, rce_flags_));
|
||||
rtcp_ = std::shared_ptr<uvgrtp::rtcp>(new uvgrtp::rtcp(rtp_, ssrc_, remote_ssrc_, cname_, sfp_, srtcp_, rce_flags_));
|
||||
|
||||
socket_->install_handler(srtp_.get(), srtp_->send_packet_handler);
|
||||
socket_->install_handler(rtcp_.get(), rtcp_->send_packet_handler_vec);
|
||||
|
|
|
@ -518,12 +518,12 @@ void uvgrtp::reception_flow::process_packet(int rce_flags)
|
|||
bool reth = false;
|
||||
if (current_ssrc == hnssrc || current_ssrc == nhssrc|| current_ssrc == frame->header.ssrc) {
|
||||
reth = true;
|
||||
UVG_LOG_INFO("Hook ssrc %d", current_ssrc);
|
||||
//UVG_LOG_INFO("Hook ssrc %d", current_ssrc);
|
||||
|
||||
}
|
||||
else if (current_ssrc == 0) {
|
||||
reth = true;
|
||||
UVG_LOG_INFO("Hook ssrc 0");
|
||||
//UVG_LOG_INFO("Hook ssrc 0");
|
||||
|
||||
}
|
||||
else {
|
||||
|
|
30
src/rtcp.cc
30
src/rtcp.cc
|
@ -45,14 +45,14 @@ constexpr int ESTIMATED_MAX_RECEPTION_TIME_MS = 10;
|
|||
|
||||
const uint32_t MAX_SUPPORTED_PARTICIPANTS = 31;
|
||||
|
||||
uvgrtp::rtcp::rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic_uint> ssrc, std::string cname,
|
||||
std::shared_ptr<uvgrtp::socketfactory> sfp, int rce_flags) :
|
||||
uvgrtp::rtcp::rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic_uint> ssrc, std::shared_ptr<std::atomic<uint32_t>> remote_ssrc,
|
||||
std::string cname, std::shared_ptr<uvgrtp::socketfactory> sfp, int rce_flags) :
|
||||
rce_flags_(rce_flags), our_role_(RECEIVER),
|
||||
tp_(0), tc_(0), tn_(0), pmembers_(0),
|
||||
members_(0), senders_(0), rtcp_bandwidth_(0), reduced_minimum_(0),
|
||||
we_sent_(false), local_addr_(""), remote_addr_(""), local_port_(0), dst_port_(0),
|
||||
avg_rtcp_pkt_pize_(0), avg_rtcp_size_(64), rtcp_pkt_count_(0), rtcp_byte_count_(0),
|
||||
rtcp_pkt_sent_count_(0), initial_(true), ssrc_(ssrc),
|
||||
rtcp_pkt_sent_count_(0), initial_(true), ssrc_(ssrc), remote_ssrc_(remote_ssrc),
|
||||
num_receivers_(0),
|
||||
ipv6_(false),
|
||||
socket_address_({}),
|
||||
|
@ -112,9 +112,9 @@ uvgrtp::rtcp::rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic
|
|||
}
|
||||
}
|
||||
|
||||
uvgrtp::rtcp::rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic_uint> ssrc, std::string cname,
|
||||
std::shared_ptr<uvgrtp::socketfactory> sfp, std::shared_ptr<uvgrtp::srtcp> srtcp, int rce_flags):
|
||||
rtcp(rtp, ssrc, cname, sfp, rce_flags)
|
||||
uvgrtp::rtcp::rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic_uint> ssrc, std::shared_ptr<std::atomic<uint32_t>> remote_ssrc,
|
||||
std::string cname, std::shared_ptr<uvgrtp::socketfactory> sfp, std::shared_ptr<uvgrtp::srtcp> srtcp, int rce_flags):
|
||||
rtcp(rtp, ssrc, remote_ssrc, cname, sfp, rce_flags)
|
||||
{
|
||||
srtcp_ = srtcp;
|
||||
}
|
||||
|
@ -212,8 +212,10 @@ rtp_error_t uvgrtp::rtcp::start()
|
|||
rtcp_socket_ = sfp_->create_new_socket();
|
||||
new_socket_ = true;
|
||||
rtcp_reader_ = std::shared_ptr<uvgrtp::rtcp_reader>(new uvgrtp::rtcp_reader(sfp_));
|
||||
rtcp_reader_->set_socket(rtcp_socket_);
|
||||
rtcp_reader_->map_ssrc_to_rtcp(remote_ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
|
||||
sfp_->map_port_to_rtcp_reader(local_port_, rtcp_reader_);
|
||||
|
||||
rtcp_reader_->map_ssrc_to_rtcp(ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
|
||||
}
|
||||
// Source port is in use -> fetch the existing socket
|
||||
else {
|
||||
|
@ -223,11 +225,16 @@ rtp_error_t uvgrtp::rtcp::start()
|
|||
rtcp_socket_ = sfp_->create_new_socket();
|
||||
new_socket_ = true;
|
||||
rtcp_reader_ = std::shared_ptr<uvgrtp::rtcp_reader>(new uvgrtp::rtcp_reader(sfp_));
|
||||
rtcp_reader_->map_ssrc_to_rtcp(ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
|
||||
rtcp_reader_->set_socket(rtcp_socket_);
|
||||
rtcp_reader_->map_ssrc_to_rtcp(remote_ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
|
||||
sfp_->map_port_to_rtcp_reader(local_port_, rtcp_reader_);
|
||||
}
|
||||
// Otherwise use the given existing socket
|
||||
|
||||
rtcp_reader_ = sfp_->get_rtcp_reader(local_port_);
|
||||
rtcp_reader_->map_ssrc_to_rtcp(ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
|
||||
rtcp_socket_ = sfp_->get_socket_ptr(local_port_);
|
||||
rtcp_reader_->set_socket(rtcp_socket_);
|
||||
rtcp_reader_->map_ssrc_to_rtcp(remote_ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
|
||||
}
|
||||
|
||||
rtp_error_t ret = RTP_OK;
|
||||
|
@ -271,7 +278,10 @@ rtp_error_t uvgrtp::rtcp::start()
|
|||
socket_address_ = rtcp_socket_->create_sockaddr(AF_INET, remote_addr_, dst_port_);
|
||||
}
|
||||
report_generator_.reset(new std::thread(rtcp_runner, this));
|
||||
report_reader_.reset(new std::thread(rtcp_report_reader, this));
|
||||
//report_reader_.reset(new std::thread(rtcp_report_reader, this));
|
||||
if (new_socket_) {
|
||||
rtcp_reader_->start();
|
||||
}
|
||||
|
||||
return RTP_OK;
|
||||
}
|
||||
|
|
|
@ -34,18 +34,20 @@ uvgrtp::rtcp_reader::~rtcp_reader()
|
|||
|
||||
rtp_error_t uvgrtp::rtcp_reader::start()
|
||||
{
|
||||
report_reader_.reset(new std::thread(rtcp_report_reader, this));
|
||||
|
||||
report_reader_.reset(new std::thread(&uvgrtp::rtcp_reader::rtcp_report_reader, this));
|
||||
active_ = true;
|
||||
return RTP_OK;
|
||||
}
|
||||
|
||||
rtp_error_t uvgrtp::rtcp_reader::stop()
|
||||
{
|
||||
active_ = false;
|
||||
if (report_reader_ && report_reader_->joinable())
|
||||
{
|
||||
UVG_LOG_DEBUG("Waiting for RTCP reader to exit");
|
||||
report_reader_->join();
|
||||
}
|
||||
|
||||
return RTP_OK;
|
||||
}
|
||||
|
||||
void uvgrtp::rtcp_reader::rtcp_report_reader() {
|
||||
|
@ -68,11 +70,13 @@ void uvgrtp::rtcp_reader::rtcp_report_reader() {
|
|||
{
|
||||
uint32_t sender_ssrc = ntohl(*(uint32_t*)&buffer.get()[0 + RTCP_HEADER_SIZE]);
|
||||
for (auto& p : rtcps_map_) {
|
||||
std::shared_ptr<uvgrtp::rtcp> rtcp_ptr = p.second;
|
||||
if (sender_ssrc == p.first.get()->load()) {
|
||||
std::shared_ptr<uvgrtp::rtcp> rtcp_ptr = p.second;
|
||||
(void)rtcp_ptr->handle_incoming_packet(buffer.get(), (size_t)nread);
|
||||
}
|
||||
|
||||
else if (p.first.get()->load() == 0) {
|
||||
(void)rtcp_ptr->handle_incoming_packet(buffer.get(), (size_t)nread);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (ret == RTP_INTERRUPTED) {
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <vector>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
#include <thread>
|
||||
#include <functional>
|
||||
|
||||
|
||||
|
@ -32,6 +33,7 @@ namespace uvgrtp {
|
|||
|
||||
void rtcp_report_reader();
|
||||
bool set_socket(std::shared_ptr<uvgrtp::socket> socket);
|
||||
// Map REMOTE ssrc to rtcp
|
||||
bool map_ssrc_to_rtcp(std::shared_ptr<std::atomic<uint32_t>> ssrc, std::shared_ptr<uvgrtp::rtcp> rtcp);
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in New Issue