multiplex: Improve documentation in rtcp_reader
This commit is contained in:
parent
d433eb45e7
commit
d38aea6adc
|
@ -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];
|
||||
|
|
|
@ -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_);
|
||||
}
|
||||
|
|
27
src/rtcp.cc
27
src/rtcp.cc
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue