multiplex: Add socket types to create_socket()

This commit is contained in:
Heikki Tampio 2023-05-10 15:38:15 +03:00
parent d9aae2d5bf
commit 1b6ab97a54
3 changed files with 15 additions and 11 deletions

View File

@ -103,7 +103,7 @@ rtp_error_t uvgrtp::media_stream::init_connection()
if (ipv6_ && src_port_ != 0 && local_address_ != "") {
multicast_sockaddr6_ = uvgrtp::socket::create_ip6_sockaddr(local_address_, src_port_);
if (uvgrtp::socket::is_multicast(multicast_sockaddr6_)) {
socket_ = sfp_->create_new_socket();
socket_ = sfp_->create_new_socket(2);
new_socket_ = true;
multicast = true;
}
@ -111,7 +111,7 @@ rtp_error_t uvgrtp::media_stream::init_connection()
else if (src_port_ != 0 && local_address_ != "") {
multicast_sockaddr_ = uvgrtp::socket::create_sockaddr(AF_INET, local_address_, src_port_);
if (uvgrtp::socket::is_multicast(multicast_sockaddr_)) {
socket_ = sfp_->create_new_socket();
socket_ = sfp_->create_new_socket(2);
new_socket_ = true;
multicast = true;
}
@ -121,14 +121,14 @@ rtp_error_t uvgrtp::media_stream::init_connection()
// socket if socket multiplexing is used
// Source port is given and is not in use -> create new socket
if (!multicast && src_port_ != 0 && !sfp_->is_port_in_use(src_port_)) {
socket_ = sfp_->create_new_socket();
socket_ = sfp_->create_new_socket(2);
new_socket_ = true;
}
// Source port is in use -> fetch the existing socket
else if (!multicast) {
socket_ = sfp_->get_socket_ptr(src_port_);
if (!socket_) {
socket_ = sfp_->create_new_socket();
socket_ = sfp_->create_new_socket(2);
new_socket_ = true;
}
}
@ -466,7 +466,7 @@ rtp_error_t uvgrtp::media_stream::start_components()
// any socket multiplexing, it will be 0 by default
if (!sfp_->is_port_in_use(rtcp_port)) {
rtcp_socket = sfp_->create_new_socket();
rtcp_socket = sfp_->create_new_socket(1);
rtcp_reader = sfp_->install_rtcp_reader(rtcp_port);
rtcp_reader->set_socket(rtcp_socket);

View File

@ -68,7 +68,7 @@ rtp_error_t uvgrtp::socketfactory::set_local_interface(std::string local_addr)
return RTP_OK;
}
std::shared_ptr<uvgrtp::socket> uvgrtp::socketfactory::create_new_socket()
std::shared_ptr<uvgrtp::socket> uvgrtp::socketfactory::create_new_socket(int type)
{
rtp_error_t ret = RTP_OK;
std::shared_ptr<uvgrtp::socket> socket = std::make_shared<uvgrtp::socket>(rce_flags_);
@ -96,9 +96,13 @@ std::shared_ptr<uvgrtp::socket> uvgrtp::socketfactory::create_new_socket()
socket_mutex_.lock();
used_sockets_.push_back(socket);
socket_mutex_.unlock();
std::shared_ptr<uvgrtp::reception_flow> flow = std::shared_ptr<uvgrtp::reception_flow>(new uvgrtp::reception_flow());
std::pair pair = std::make_pair(flow, socket);
reception_flows_.insert(pair);
// If the socket is a type 2 (non-RTCP) socket, install a reception_flow
if (type == 2) {
std::shared_ptr<uvgrtp::reception_flow> flow = std::shared_ptr<uvgrtp::reception_flow>(new uvgrtp::reception_flow());
std::pair pair = std::make_pair(flow, socket);
reception_flows_.insert(pair);
}
return socket;
}

View File

@ -27,7 +27,6 @@ namespace uvgrtp {
* This is also true for RTCP: the rtcp_reader will distribute received packets depending on the
* SSRCs in the packets
*/
// TODO: currently RTCP sockets get both a reception_flow and an rtcp_reader. This is not necessary
class socketfactory {
@ -45,8 +44,9 @@ namespace uvgrtp {
/* Create a new socket. Depending on if the local address was IPv4 or IPv6, the socket
* will use the correct IP version
*
* Param type 1 RTCP socket, 2 for any other type of a socket
* Return the created socket on success, nullptr otherwise */
std::shared_ptr<uvgrtp::socket> create_new_socket();
std::shared_ptr<uvgrtp::socket> create_new_socket(int type);
/* Bind socket to the local IP address and given port
*