@ -245,8 +245,9 @@ static int udp_port(struct sockaddr_storage *addr, int addr_len)
int udp_set_remote_url ( URLContext * h , const char * uri )
int udp_set_remote_url ( URLContext * h , const char * uri )
{
{
UDPContext * s = h - > priv_data ;
UDPContext * s = h - > priv_data ;
char hostname [ 256 ] ;
char hostname [ 256 ] , buf [ 10 ] ;
int port ;
int port ;
const char * p ;
av_url_split ( NULL , 0 , NULL , 0 , hostname , sizeof ( hostname ) , & port , NULL , 0 , uri ) ;
av_url_split ( NULL , 0 , NULL , 0 , hostname , sizeof ( hostname ) , & port , NULL , 0 , uri ) ;
@ -256,6 +257,21 @@ int udp_set_remote_url(URLContext *h, const char *uri)
return AVERROR ( EIO ) ;
return AVERROR ( EIO ) ;
}
}
s - > is_multicast = ff_is_multicast_address ( ( struct sockaddr * ) & s - > dest_addr ) ;
s - > is_multicast = ff_is_multicast_address ( ( struct sockaddr * ) & s - > dest_addr ) ;
p = strchr ( uri , ' ? ' ) ;
if ( p ) {
if ( find_info_tag ( buf , sizeof ( buf ) , " connect " , p ) ) {
int was_connected = s - > is_connected ;
s - > is_connected = strtol ( buf , NULL , 10 ) ;
if ( s - > is_connected & & ! was_connected ) {
if ( connect ( s - > udp_fd , ( struct sockaddr * ) & s - > dest_addr ,
s - > dest_addr_len ) ) {
s - > is_connected = 0 ;
av_log ( NULL , AV_LOG_ERROR , " connect: %s \n " , strerror ( errno ) ) ;
return AVERROR ( EIO ) ;
}
}
}
}
return 0 ;
return 0 ;
}
}