@@ -854,6 +854,7 @@ static gboolean ipv6_disabled = FALSE;
854
854
static janus_callbacks * gateway = NULL ;
855
855
856
856
static char * local_ip = NULL , * sdp_ip = NULL , * local_media_ip = NULL ;
857
+ static janus_network_address janus_network_local_media_ip = { 0 };
857
858
static int keepalive_interval = 120 ;
858
859
static gboolean behind_nat = FALSE;
859
860
static char * user_agent ;
@@ -1882,11 +1883,11 @@ int janus_sip_init(janus_callbacks *callback, const char *config_path) {
1882
1883
}
1883
1884
1884
1885
item = janus_config_get (config , config_general , janus_config_type_item , "local_media_ip" );
1885
- if (item && item -> value )
1886
+ if (item && item -> value && strlen ( item -> value ) > 0 )
1886
1887
local_media_ip = g_strdup (item -> value );
1887
1888
1888
1889
item = janus_config_get (config , config_general , janus_config_type_item , "sdp_ip" );
1889
- if (item && item -> value ) {
1890
+ if (item && item -> value && strlen ( item -> value ) > 0 ) {
1890
1891
sdp_ip = g_strdup (item -> value );
1891
1892
JANUS_LOG (LOG_VERB , "IP to advertise in SDP: %s\n" , sdp_ip );
1892
1893
}
@@ -2003,6 +2004,25 @@ int janus_sip_init(janus_callbacks *callback, const char *config_path) {
2003
2004
}
2004
2005
JANUS_LOG (LOG_VERB , "Local IP set to %s\n" , local_ip );
2005
2006
2007
+ /* Since we might have to derive SDP connection address from local_media_ip make sure it has a meaningful value
2008
+ * for the purpose of using it in the SDP c= header */
2009
+ janus_network_address_nullify (& janus_network_local_media_ip );
2010
+ if (local_media_ip ) {
2011
+ if (janus_network_string_to_address (janus_network_query_options_any_ip , local_media_ip , & janus_network_local_media_ip ) != 0 ) {
2012
+ JANUS_LOG (LOG_ERR , "Invalid local media IP address [%s]...\n" , local_media_ip );
2013
+ return -1 ;
2014
+ }
2015
+ if ((janus_network_local_media_ip .family == AF_INET && janus_network_local_media_ip .ipv4 .s_addr == INADDR_ANY ) ||
2016
+ (janus_network_local_media_ip .family == AF_INET6 && IN6_IS_ADDR_UNSPECIFIED (& janus_network_local_media_ip .ipv6 ))) {
2017
+ janus_network_address_nullify (& janus_network_local_media_ip );
2018
+ }
2019
+ }
2020
+ JANUS_LOG (LOG_VERB , "Binding media address set to [%s]...\n" , janus_network_address_is_null (& janus_network_local_media_ip ) ? "any" : local_media_ip );
2021
+ if (!sdp_ip ) {
2022
+ sdp_ip = janus_network_address_is_null (& janus_network_local_media_ip ) ? local_ip : local_media_ip ;
2023
+ JANUS_LOG (LOG_VERB , "IP to advertise in SDP: %s\n" , sdp_ip );
2024
+ }
2025
+
2006
2026
/* Setup sofia */
2007
2027
su_init ();
2008
2028
if (notify_events && callback -> events_is_enabled ()) {
@@ -2022,19 +2042,29 @@ int janus_sip_init(janus_callbacks *callback, const char *config_path) {
2022
2042
/* This is the callback we'll need to invoke to contact the Janus core */
2023
2043
gateway = callback ;
2024
2044
2025
- /* Finally, let's check if IPv6 is disabled, as we may need to know for RTP/RTCP sockets */
2026
- int fd = socket (AF_INET6 , SOCK_DGRAM , IPPROTO_UDP );
2027
- if (fd <= 0 ) {
2028
- ipv6_disabled = TRUE;
2029
- } else {
2030
- int v6only = 0 ;
2031
- if (setsockopt (fd , IPPROTO_IPV6 , IPV6_V6ONLY , & v6only , sizeof (v6only )) != 0 )
2045
+ if (janus_network_address_is_null (& janus_network_local_media_ip ) ||
2046
+ janus_network_local_media_ip .family == AF_INET6 ) {
2047
+ /* Finally, let's check if IPv6 is disabled, as we may need to know for RTP/RTCP sockets */
2048
+ int fd = socket (AF_INET6 , SOCK_DGRAM , IPPROTO_UDP );
2049
+ if (fd <= 0 ) {
2032
2050
ipv6_disabled = TRUE;
2033
- }
2034
- if (fd > 0 )
2035
- close (fd );
2036
- if (ipv6_disabled ) {
2037
- JANUS_LOG (LOG_WARN , "IPv6 disabled, will only use IPv4 for RTP/RTCP sockets (SIP)\n" );
2051
+ } else {
2052
+ int v6only = 0 ;
2053
+ if (setsockopt (fd , IPPROTO_IPV6 , IPV6_V6ONLY , & v6only , sizeof (v6only )) != 0 )
2054
+ ipv6_disabled = TRUE;
2055
+ }
2056
+ if (fd > 0 )
2057
+ close (fd );
2058
+ if (ipv6_disabled ) {
2059
+ if (!janus_network_address_is_null (& janus_network_local_media_ip )) {
2060
+ JANUS_LOG (LOG_ERR , "IPv6 disabled and local media address is IPv6...\n" );
2061
+ return -1 ;
2062
+ }
2063
+ JANUS_LOG (LOG_WARN , "IPv6 disabled, will only use IPv4 for RTP/RTCP sockets (SIP)\n" );
2064
+ }
2065
+ } else if (janus_network_local_media_ip .family == AF_INET ) {
2066
+ /* Disable if we have a specified IPv4 address for RTP/RTCP sockets */
2067
+ ipv6_disabled = TRUE;
2038
2068
}
2039
2069
2040
2070
g_atomic_int_set (& initialized , 1 );
@@ -6489,7 +6519,7 @@ char *janus_sip_sdp_manipulate(janus_sip_session *session, janus_sdp *sdp, gbool
6489
6519
JANUS_LOG (LOG_VERB , "Setting protocol to %s\n" , session -> media .require_srtp ? "RTP/SAVP" : "RTP/AVP" );
6490
6520
if (sdp -> c_addr ) {
6491
6521
g_free (sdp -> c_addr );
6492
- sdp -> c_addr = g_strdup (sdp_ip ? sdp_ip : ( local_media_ip ? local_media_ip : local_ip ) );
6522
+ sdp -> c_addr = g_strdup (sdp_ip );
6493
6523
}
6494
6524
int opusred_pt = answer ? janus_sdp_get_opusred_pt (sdp , -1 ) : -1 ;
6495
6525
GList * temp = sdp -> m_lines ;
@@ -6523,7 +6553,7 @@ char *janus_sip_sdp_manipulate(janus_sip_session *session, janus_sdp *sdp, gbool
6523
6553
}
6524
6554
}
6525
6555
g_free (m -> c_addr );
6526
- m -> c_addr = g_strdup (sdp_ip ? sdp_ip : ( local_media_ip ? local_media_ip : local_ip ) );
6556
+ m -> c_addr = g_strdup (sdp_ip );
6527
6557
if (answer && (m -> type == JANUS_SDP_AUDIO || m -> type == JANUS_SDP_VIDEO )) {
6528
6558
/* Check which codec was negotiated eventually */
6529
6559
int pt = -1 ;
@@ -6625,18 +6655,24 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6625
6655
session -> media .pipefd [1 ] = -1 ;
6626
6656
}
6627
6657
}
6658
+ gboolean use_ipv6_address_family = !ipv6_disabled &&
6659
+ (janus_network_address_is_null (& janus_network_local_media_ip ) || janus_network_local_media_ip .family == AF_INET6 );
6660
+ socklen_t addrlen = use_ipv6_address_family ? sizeof (struct sockaddr_in6 ) : sizeof (struct sockaddr_in );
6628
6661
/* Start */
6629
6662
int attempts = 100 ; /* FIXME Don't retry forever */
6630
6663
if (session -> media .has_audio ) {
6631
- JANUS_LOG (LOG_VERB , "Allocating audio ports:\n" );
6664
+ JANUS_LOG (LOG_VERB , "Allocating audio ports using address [%s]\n" ,
6665
+ janus_network_address_is_null (& janus_network_local_media_ip ) ? "any" : local_media_ip );
6632
6666
struct sockaddr_storage audio_rtp_address , audio_rtcp_address ;
6633
6667
while (session -> media .local_audio_rtp_port == 0 || session -> media .local_audio_rtcp_port == 0 ) {
6634
6668
if (attempts == 0 ) /* Too many failures */
6635
6669
return -1 ;
6670
+ memset (& audio_rtp_address , 0 , sizeof (audio_rtp_address ));
6671
+ memset (& audio_rtcp_address , 0 , sizeof (audio_rtcp_address ));
6636
6672
if (session -> media .audio_rtp_fd == -1 ) {
6637
- session -> media .audio_rtp_fd = socket (! ipv6_disabled ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6673
+ session -> media .audio_rtp_fd = socket (use_ipv6_address_family ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6638
6674
int v6only = 0 ;
6639
- if (! ipv6_disabled && session -> media .audio_rtp_fd != -1 &&
6675
+ if (use_ipv6_address_family && session -> media .audio_rtp_fd != -1 &&
6640
6676
setsockopt (session -> media .audio_rtp_fd , IPPROTO_IPV6 , IPV6_V6ONLY , & v6only , sizeof (v6only )) != 0 ) {
6641
6677
JANUS_LOG (LOG_WARN , "Error setting v6only to false on audio RTP socket (error=%s)\n" ,
6642
6678
g_strerror (errno ));
@@ -6652,9 +6688,9 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6652
6688
}
6653
6689
}
6654
6690
if (session -> media .audio_rtcp_fd == -1 ) {
6655
- session -> media .audio_rtcp_fd = socket (! ipv6_disabled ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6691
+ session -> media .audio_rtcp_fd = socket (use_ipv6_address_family ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6656
6692
int v6only = 0 ;
6657
- if (! ipv6_disabled && session -> media .audio_rtcp_fd != -1 &&
6693
+ if (use_ipv6_address_family && session -> media .audio_rtcp_fd != -1 &&
6658
6694
setsockopt (session -> media .audio_rtcp_fd , IPPROTO_IPV6 , IPV6_V6ONLY , & v6only , sizeof (v6only )) != 0 ) {
6659
6695
JANUS_LOG (LOG_WARN , "Error setting v6only to false on audio RTCP socket (error=%s)\n" ,
6660
6696
g_strerror (errno ));
@@ -6667,39 +6703,40 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6667
6703
int rtp_port = g_random_int_range (rtp_range_min , rtp_range_max );
6668
6704
if (rtp_port % 2 )
6669
6705
rtp_port ++ ; /* Pick an even port for RTP */
6670
- if (! ipv6_disabled ) {
6706
+ if (use_ipv6_address_family ) {
6671
6707
struct sockaddr_in6 * addr = (struct sockaddr_in6 * )& audio_rtp_address ;
6672
6708
addr -> sin6_family = AF_INET6 ;
6673
6709
addr -> sin6_port = htons (rtp_port );
6674
- addr -> sin6_addr = in6addr_any ;
6710
+ addr -> sin6_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? in6addr_any : janus_network_local_media_ip . ipv6 ;
6675
6711
} else {
6676
6712
struct sockaddr_in * addr = (struct sockaddr_in * )& audio_rtp_address ;
6677
6713
addr -> sin_family = AF_INET ;
6678
6714
addr -> sin_port = htons (rtp_port );
6679
- addr -> sin_addr .s_addr = INADDR_ANY ;
6715
+ addr -> sin_addr .s_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? INADDR_ANY : janus_network_local_media_ip . ipv4 . s_addr ;
6680
6716
}
6681
- if (bind (session -> media .audio_rtp_fd , (struct sockaddr * )(& audio_rtp_address ), sizeof ( audio_rtp_address ) ) < 0 ) {
6682
- JANUS_LOG (LOG_ERR , "Bind failed for audio RTP (port %d), trying a different one...\n" , rtp_port );
6717
+ if (bind (session -> media .audio_rtp_fd , (struct sockaddr * )(& audio_rtp_address ), addrlen ) < 0 ) {
6718
+ JANUS_LOG (LOG_ERR , "Bind failed for audio RTP (port %d), error (%s), trying a different one...\n" , rtp_port , g_strerror ( errno ) );
6683
6719
close (session -> media .audio_rtp_fd );
6684
6720
session -> media .audio_rtp_fd = -1 ;
6685
6721
attempts -- ;
6686
6722
continue ;
6687
6723
}
6688
- JANUS_LOG (LOG_VERB , "Audio RTP listener bound to %s:%d(%d)\n" , (local_media_ip ? local_media_ip : local_ip ), rtp_port , session -> media .audio_rtp_fd );
6724
+ JANUS_LOG (LOG_VERB , "Audio RTP listener bound to [%s]:%d(%d)\n" ,
6725
+ janus_network_address_is_null (& janus_network_local_media_ip ) ? "any" : local_media_ip , rtp_port , session -> media .audio_rtp_fd );
6689
6726
int rtcp_port = rtp_port + 1 ;
6690
- if (! ipv6_disabled ) {
6727
+ if (use_ipv6_address_family ) {
6691
6728
struct sockaddr_in6 * addr = (struct sockaddr_in6 * )& audio_rtcp_address ;
6692
6729
addr -> sin6_family = AF_INET6 ;
6693
6730
addr -> sin6_port = htons (rtcp_port );
6694
- addr -> sin6_addr = in6addr_any ;
6731
+ addr -> sin6_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? in6addr_any : janus_network_local_media_ip . ipv6 ;
6695
6732
} else {
6696
6733
struct sockaddr_in * addr = (struct sockaddr_in * )& audio_rtcp_address ;
6697
6734
addr -> sin_family = AF_INET ;
6698
6735
addr -> sin_port = htons (rtcp_port );
6699
- addr -> sin_addr .s_addr = INADDR_ANY ;
6736
+ addr -> sin_addr .s_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? INADDR_ANY : janus_network_local_media_ip . ipv4 . s_addr ;
6700
6737
}
6701
- if (bind (session -> media .audio_rtcp_fd , (struct sockaddr * )(& audio_rtcp_address ), sizeof ( audio_rtcp_address ) ) < 0 ) {
6702
- JANUS_LOG (LOG_ERR , "Bind failed for audio RTCP (port %d), trying a different one...\n" , rtcp_port );
6738
+ if (bind (session -> media .audio_rtcp_fd , (struct sockaddr * )(& audio_rtcp_address ), addrlen ) < 0 ) {
6739
+ JANUS_LOG (LOG_ERR , "Bind failed for audio RTCP (port %d), error (%s), trying a different one...\n" , rtcp_port , g_strerror ( errno ) );
6703
6740
/* RTP socket is not valid anymore, reset it */
6704
6741
close (session -> media .audio_rtp_fd );
6705
6742
session -> media .audio_rtp_fd = -1 ;
@@ -6708,21 +6745,24 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6708
6745
attempts -- ;
6709
6746
continue ;
6710
6747
}
6711
- JANUS_LOG (LOG_VERB , "Audio RTCP listener bound to %s :%d(%d)\n" , ( local_media_ip ? local_media_ip : local_ip ) , rtcp_port , session -> media .audio_rtcp_fd );
6748
+ JANUS_LOG (LOG_VERB , "Audio RTCP listener bound to [%s] :%d(%d)\n" , janus_network_address_is_null ( & janus_network_local_media_ip ) ? "any" : local_media_ip , rtcp_port , session -> media .audio_rtcp_fd );
6712
6749
session -> media .local_audio_rtp_port = rtp_port ;
6713
6750
session -> media .local_audio_rtcp_port = rtcp_port ;
6714
6751
}
6715
6752
}
6716
6753
if (session -> media .has_video ) {
6717
- JANUS_LOG (LOG_VERB , "Allocating video ports:\n" );
6754
+ JANUS_LOG (LOG_VERB , "Allocating video ports using address [%s]\n" ,
6755
+ janus_network_address_is_null (& janus_network_local_media_ip ) ?"any" : local_media_ip );
6718
6756
struct sockaddr_storage video_rtp_address , video_rtcp_address ;
6719
6757
while (session -> media .local_video_rtp_port == 0 || session -> media .local_video_rtcp_port == 0 ) {
6720
6758
if (attempts == 0 ) /* Too many failures */
6721
6759
return -1 ;
6760
+ memset (& video_rtp_address , 0 , sizeof (video_rtp_address ));
6761
+ memset (& video_rtcp_address , 0 , sizeof (video_rtcp_address ));
6722
6762
if (session -> media .video_rtp_fd == -1 ) {
6723
- session -> media .video_rtp_fd = socket (! ipv6_disabled ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6763
+ session -> media .video_rtp_fd = socket (use_ipv6_address_family ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6724
6764
int v6only = 0 ;
6725
- if (! ipv6_disabled && session -> media .video_rtp_fd != -1 &&
6765
+ if (use_ipv6_address_family && session -> media .video_rtp_fd != -1 &&
6726
6766
setsockopt (session -> media .video_rtp_fd , IPPROTO_IPV6 , IPV6_V6ONLY , & v6only , sizeof (v6only )) != 0 ) {
6727
6767
JANUS_LOG (LOG_WARN , "Error setting v6only to false on video RTP socket (error=%s)\n" ,
6728
6768
g_strerror (errno ));
@@ -6738,9 +6778,9 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6738
6778
}
6739
6779
}
6740
6780
if (session -> media .video_rtcp_fd == -1 ) {
6741
- session -> media .video_rtcp_fd = socket (! ipv6_disabled ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6781
+ session -> media .video_rtcp_fd = socket (use_ipv6_address_family ? AF_INET6 : AF_INET , SOCK_DGRAM , 0 );
6742
6782
int v6only = 0 ;
6743
- if (! ipv6_disabled && session -> media .video_rtcp_fd != -1 &&
6783
+ if (use_ipv6_address_family && session -> media .video_rtcp_fd != -1 &&
6744
6784
setsockopt (session -> media .video_rtcp_fd , IPPROTO_IPV6 , IPV6_V6ONLY , & v6only , sizeof (v6only )) != 0 ) {
6745
6785
JANUS_LOG (LOG_WARN , "Error setting v6only to false on video RTCP socket (error=%s)\n" ,
6746
6786
g_strerror (errno ));
@@ -6753,39 +6793,40 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6753
6793
int rtp_port = g_random_int_range (rtp_range_min , rtp_range_max );
6754
6794
if (rtp_port % 2 )
6755
6795
rtp_port ++ ; /* Pick an even port for RTP */
6756
- if (! ipv6_disabled ) {
6796
+ if (use_ipv6_address_family ) {
6757
6797
struct sockaddr_in6 * addr = (struct sockaddr_in6 * )& video_rtp_address ;
6758
6798
addr -> sin6_family = AF_INET6 ;
6759
6799
addr -> sin6_port = htons (rtp_port );
6760
- addr -> sin6_addr = in6addr_any ;
6800
+ addr -> sin6_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? in6addr_any : janus_network_local_media_ip . ipv6 ;
6761
6801
} else {
6762
6802
struct sockaddr_in * addr = (struct sockaddr_in * )& video_rtp_address ;
6763
6803
addr -> sin_family = AF_INET ;
6764
6804
addr -> sin_port = htons (rtp_port );
6765
- addr -> sin_addr .s_addr = INADDR_ANY ;
6805
+ addr -> sin_addr .s_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? INADDR_ANY : janus_network_local_media_ip . ipv4 . s_addr ;
6766
6806
}
6767
- if (bind (session -> media .video_rtp_fd , (struct sockaddr * )(& video_rtp_address ), sizeof ( video_rtp_address ) ) < 0 ) {
6768
- JANUS_LOG (LOG_ERR , "Bind failed for video RTP (port %d), trying a different one...\n" , rtp_port );
6807
+ if (bind (session -> media .video_rtp_fd , (struct sockaddr * )(& video_rtp_address ), addrlen ) < 0 ) {
6808
+ JANUS_LOG (LOG_ERR , "Bind failed for video RTP (port %d), error (%s), trying a different one...\n" , rtp_port , g_strerror ( errno ) );
6769
6809
close (session -> media .video_rtp_fd );
6770
6810
session -> media .video_rtp_fd = -1 ;
6771
6811
attempts -- ;
6772
6812
continue ;
6773
6813
}
6774
- JANUS_LOG (LOG_VERB , "Video RTP listener bound to %s:%d(%d)\n" , (local_media_ip ? local_media_ip : local_ip ), rtp_port , session -> media .video_rtp_fd );
6814
+ JANUS_LOG (LOG_VERB , "Video RTP listener bound to [%s]:%d(%d)\n" ,
6815
+ janus_network_address_is_null (& janus_network_local_media_ip ) ? "any" : local_media_ip , rtp_port , session -> media .video_rtp_fd );
6775
6816
int rtcp_port = rtp_port + 1 ;
6776
- if (! ipv6_disabled ) {
6817
+ if (use_ipv6_address_family ) {
6777
6818
struct sockaddr_in6 * addr = (struct sockaddr_in6 * )& video_rtcp_address ;
6778
6819
addr -> sin6_family = AF_INET6 ;
6779
6820
addr -> sin6_port = htons (rtcp_port );
6780
- addr -> sin6_addr = in6addr_any ;
6821
+ addr -> sin6_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? in6addr_any : janus_network_local_media_ip . ipv6 ;
6781
6822
} else {
6782
6823
struct sockaddr_in * addr = (struct sockaddr_in * )& video_rtcp_address ;
6783
6824
addr -> sin_family = AF_INET ;
6784
6825
addr -> sin_port = htons (rtcp_port );
6785
- addr -> sin_addr .s_addr = INADDR_ANY ;
6826
+ addr -> sin_addr .s_addr = janus_network_address_is_null ( & janus_network_local_media_ip ) ? INADDR_ANY : janus_network_local_media_ip . ipv4 . s_addr ;
6786
6827
}
6787
- if (bind (session -> media .video_rtcp_fd , (struct sockaddr * )(& video_rtcp_address ), sizeof ( video_rtcp_address ) ) < 0 ) {
6788
- JANUS_LOG (LOG_ERR , "Bind failed for video RTCP (port %d), trying a different one...\n" , rtcp_port );
6828
+ if (bind (session -> media .video_rtcp_fd , (struct sockaddr * )(& video_rtcp_address ), addrlen ) < 0 ) {
6829
+ JANUS_LOG (LOG_ERR , "Bind failed for video RTCP (port %d), error (%s), trying a different one...\n" , rtcp_port , g_strerror ( errno ) );
6789
6830
/* RTP socket is not valid anymore, reset it */
6790
6831
close (session -> media .video_rtp_fd );
6791
6832
session -> media .video_rtp_fd = -1 ;
@@ -6794,7 +6835,8 @@ static int janus_sip_allocate_local_ports(janus_sip_session *session, gboolean u
6794
6835
attempts -- ;
6795
6836
continue ;
6796
6837
}
6797
- JANUS_LOG (LOG_VERB , "Video RTCP listener bound to %s:%d(%d)\n" , (local_media_ip ? local_media_ip : local_ip ), rtcp_port , session -> media .video_rtcp_fd );
6838
+ JANUS_LOG (LOG_VERB , "Video RTCP listener bound to [%s]:%d(%d)\n" ,
6839
+ janus_network_address_is_null (& janus_network_local_media_ip ) ? "any" : local_media_ip , rtcp_port , session -> media .video_rtcp_fd );
6798
6840
session -> media .local_video_rtp_port = rtp_port ;
6799
6841
session -> media .local_video_rtcp_port = rtcp_port ;
6800
6842
}
0 commit comments