multiplex: Improve documentation in rtcp_reader

This commit is contained in:
Heikki Tampio 2023-05-10 15:05:42 +03:00
parent d433eb45e7
commit d38aea6adc
6 changed files with 53 additions and 40 deletions

View File

@ -678,10 +678,7 @@ namespace uvgrtp {
std::map<std::string, std::deque<rtcp_app_packet>> app_packets_; // sent one at a time per name
// APPs for hook
std::multimap<std::string, std::function <std::unique_ptr<uint8_t[]>(uint8_t& subtype, uint32_t& payload_len)>> outgoing_app_hooks_;
bool hooked_app_;
bool new_socket_;
uvgrtp::frame::rtcp_sdes_item cnameItem_;
char cname_[255];

View File

@ -469,7 +469,7 @@ rtp_error_t uvgrtp::media_stream::start_components()
rtcp_socket = sfp_->create_new_socket();
rtcp_reader = sfp_->install_rtcp_reader(rtcp_port);
rtcp_reader->set_socket(rtcp_socket, rtcp_port);
rtcp_reader->set_socket(rtcp_socket);
rtcp_->set_socket(rtcp_socket);
rtcp_reader->map_ssrc_to_rtcp(remote_ssrc_, rtcp_);
}

View File

@ -77,7 +77,6 @@ uvgrtp::rtcp::rtcp(std::shared_ptr<uvgrtp::rtp> rtp, std::shared_ptr<std::atomic
ourItems_(),
bye_ssrcs_(false),
hooked_app_(false),
new_socket_(false),
mtu_size_(MAX_IPV4_PAYLOAD)
{
clock_rate_ = rtp->get_clock_rate();
@ -204,32 +203,10 @@ rtp_error_t uvgrtp::rtcp::start()
{
active_ = true;
ipv6_ = sfp_->get_ipv6();
/*
// Source port is given and is not in use -> create new socket
if (local_port_ != 0 && !sfp_->is_port_in_use(local_port_)) {
rtcp_socket_ = sfp_->create_new_socket();
new_socket_ = true;
rtcp_reader_ = sfp_->install_rtcp_reader(local_port_);
rtcp_reader_->set_socket(rtcp_socket_, local_port_);
rtcp_reader_->map_ssrc_to_rtcp(remote_ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
}
// Source port is in use -> fetch the existing socket
else {
rtcp_socket_ = sfp_->get_socket_ptr(local_port_);
if (!rtcp_socket_) {
// This should not ever happen. However if it does, you could just create a new socket like above
UVG_LOG_ERROR("No RTCP socket found");
return RTP_GENERIC_ERROR;
}
rtcp_reader_ = sfp_->get_rtcp_reader(local_port_);
rtcp_socket_ = sfp_->get_socket_ptr(local_port_);
rtcp_reader_->map_ssrc_to_rtcp(remote_ssrc_, std::shared_ptr<uvgrtp::rtcp>(this));
}
*/
rtcp_reader_ = sfp_->get_rtcp_reader(local_port_);
rtp_error_t ret = RTP_OK;
/* Set read timeout (5s for now)
*
* This means that the socket is listened for 5s at a time and after the timeout,
@ -301,7 +278,7 @@ rtp_error_t uvgrtp::rtcp::stop()
report_generator_->join();
}
if (rtcp_reader_ && rtcp_reader_->clear_rtcp_from_reader(remote_ssrc_, local_port_ == 1)) {
if (rtcp_reader_ && rtcp_reader_->clear_rtcp_from_reader(remote_ssrc_) == 1) {
sfp_->clear_port(local_port_, rtcp_socket_, nullptr);
}
return ret;

View File

@ -97,21 +97,21 @@ void uvgrtp::rtcp_reader::rtcp_report_reader() {
UVG_LOG_DEBUG("Exited RTCP report reader loop");
}
bool uvgrtp::rtcp_reader::set_socket(std::shared_ptr<uvgrtp::socket> socket, uint16_t port)
rtp_error_t uvgrtp::rtcp_reader::set_socket(std::shared_ptr<uvgrtp::socket> socket)
{
socket_ = socket;
return true;
return RTP_OK;
}
bool uvgrtp::rtcp_reader::map_ssrc_to_rtcp(std::shared_ptr<std::atomic<uint32_t>> ssrc, std::shared_ptr<uvgrtp::rtcp> rtcp)
rtp_error_t uvgrtp::rtcp_reader::map_ssrc_to_rtcp(std::shared_ptr<std::atomic<uint32_t>> ssrc, std::shared_ptr<uvgrtp::rtcp> rtcp)
{
map_mutex_.lock();
rtcps_map_[ssrc] = rtcp;
map_mutex_.unlock();
return true;
return RTP_OK;
}
int uvgrtp::rtcp_reader::clear_rtcp_from_reader(std::shared_ptr<std::atomic<std::uint32_t>> remote_ssrc, uint16_t port)
int uvgrtp::rtcp_reader::clear_rtcp_from_reader(std::shared_ptr<std::atomic<std::uint32_t>> remote_ssrc)
{
map_mutex_.lock();
if (rtcps_map_.find(remote_ssrc) != rtcps_map_.end()) {

View File

@ -24,21 +24,53 @@ namespace uvgrtp {
class rtcp;
class socket;
/* Every RTCP socket will have an RTCP reader that receives packets and distributes them to the correct RTCP
* objects. RTCP objects are mapped via REMOTE SSRCs, the SSRC that they will be receiving packets from.
* If NO socket multiplexing is done, this will be 0 by default. If there IS socket multiplexing, this will be the
* remote SSRC of the media stream, set via the RCC_REMOTE_SSRC context flag.
*/
class rtcp_reader {
public:
rtcp_reader();
~rtcp_reader();
/* Start the report reader thread
*
* Return RTP_OK on success */
rtp_error_t start();
/* Stop the report reader thread
*
* Return RTP_OK on success */
rtp_error_t stop();
void rtcp_report_reader();
bool set_socket(std::shared_ptr<uvgrtp::socket> socket, uint16_t port);
// Map REMOTE ssrc to rtcp
bool map_ssrc_to_rtcp(std::shared_ptr<std::atomic<uint32_t>> ssrc, std::shared_ptr<uvgrtp::rtcp> rtcp);
int clear_rtcp_from_reader(std::shared_ptr<std::atomic<std::uint32_t>> remote_ssrc, uint16_t port);
/* Set the RTCP readers socket
*
* Return true on success */
rtp_error_t set_socket(std::shared_ptr<uvgrtp::socket> socket);
/* Map a new RTCP object into a remote SSRC
*
* Param ssrc SSRC of the REMOTE stream that the given RTCP will receive from
* Param rtcp RTCP object
* Return RTP_OK on success */
rtp_error_t map_ssrc_to_rtcp(std::shared_ptr<std::atomic<uint32_t>> ssrc, std::shared_ptr<uvgrtp::rtcp> rtcp);
/* Clear an RTCP object with the given REMOTE SSRC from the RTCP reader
*
* Param remote_ssrc REMOTE SSRC of the RTCP that will be removed from the reader
* Return 0 if the RTCP object is removed
* Return 1 if the RTCP object is removed AND the reader has no RTCP objects left -> which
* means that the reader will be stopped and RTCP is free to clear the port */
int clear_rtcp_from_reader(std::shared_ptr<std::atomic<std::uint32_t>> remote_ssrc);
private:
void rtcp_report_reader();
bool active_;
std::shared_ptr<uvgrtp::socket> socket_;
std::map<std::shared_ptr<std::atomic<uint32_t>>, std::shared_ptr<uvgrtp::rtcp>> rtcps_map_;

View File

@ -74,10 +74,17 @@ namespace uvgrtp {
* Return pointer to RTCP reader */
std::shared_ptr <uvgrtp::rtcp_reader> get_rtcp_reader(uint16_t port);
/* Clear all receiver modules from the given socket + port combo
*
* Param socket socket to be cleared
* Param port port to be cleared
* Param flow that will be cleared from the socket
* true on success */
bool clear_port(uint16_t port, std::shared_ptr<uvgrtp::socket> socket, std::shared_ptr<uvgrtp::reception_flow> flow);
/// \cond DO_NOT_DOCUMENT
bool get_ipv6() const;
bool is_port_in_use(uint16_t port) const;
bool clear_port(uint16_t port, std::shared_ptr<uvgrtp::socket> socket, std::shared_ptr<uvgrtp::reception_flow> flow);
/// \endcond
private: