@ -59,9 +59,17 @@
# define OFFSET(x) offsetof(RTSPState, x)
# define DEC AV_OPT_FLAG_DECODING_PARAM
# define ENC AV_OPT_FLAG_ENCODING_PARAM
const AVOption ff_rtsp_options [ ] = {
{ " initial_pause " , " Don't start playing the stream immediately " , OFFSET ( initial_pause ) , AV_OPT_TYPE_INT , { 0 } , 0 , 1 , DEC } ,
FF_RTP_FLAG_OPTS ( RTSPState , rtp_muxer_flags ) ,
{ " rtsp_transport " , " RTSP transport protocols " , OFFSET ( lower_transport_mask ) , AV_OPT_TYPE_FLAGS , { 0 } , INT_MIN , INT_MAX , DEC | ENC , " rtsp_transport " } , \
{ " udp " , " UDP " , 0 , AV_OPT_TYPE_CONST , { 1 < < RTSP_LOWER_TRANSPORT_UDP } , 0 , 0 , DEC | ENC , " rtsp_transport " } , \
{ " tcp " , " TCP " , 0 , AV_OPT_TYPE_CONST , { 1 < < RTSP_LOWER_TRANSPORT_TCP } , 0 , 0 , DEC | ENC , " rtsp_transport " } , \
{ " udp_multicast " , " UDP multicast " , 0 , AV_OPT_TYPE_CONST , { 1 < < RTSP_LOWER_TRANSPORT_UDP_MULTICAST } , 0 , 0 , DEC , " rtsp_transport " } ,
{ " http " , " HTTP tunneling " , 0 , AV_OPT_TYPE_CONST , { ( 1 < < RTSP_LOWER_TRANSPORT_HTTP ) } , 0 , 0 , DEC , " rtsp_transport " } ,
{ " rtsp_flags " , " RTSP flags " , OFFSET ( rtsp_flags ) , AV_OPT_TYPE_FLAGS , { 0 } , INT_MIN , INT_MAX , DEC , " rtsp_flags " } ,
{ " filter_src " , " Only receive packets from the negotiated peer IP " , 0 , AV_OPT_TYPE_CONST , { RTSP_FLAG_FILTER_SRC } , 0 , 0 , DEC , " rtsp_flags " } ,
{ NULL } ,
} ;
@ -1317,8 +1325,19 @@ int ff_rtsp_connect(AVFormatContext *s)
if ( ! ff_network_init ( ) )
return AVERROR ( EIO ) ;
redirect :
rt - > control_transport = RTSP_MODE_PLAIN ;
if ( rt - > lower_transport_mask & ( 1 < < RTSP_LOWER_TRANSPORT_HTTP ) ) {
rt - > lower_transport_mask = 1 < < RTSP_LOWER_TRANSPORT_TCP ;
rt - > control_transport = RTSP_MODE_TUNNEL ;
}
/* Only pass through valid flags from here */
rt - > lower_transport_mask & = ( 1 < < RTSP_LOWER_TRANSPORT_NB ) - 1 ;
if ( rt - > rtsp_flags & RTSP_FLAG_FILTER_SRC )
rt - > filter_source = 1 ;
redirect :
lower_transport_mask = rt - > lower_transport_mask ;
/* extract hostname and port */
av_url_split ( NULL , 0 , auth , sizeof ( auth ) ,
host , sizeof ( host ) , & port , path , sizeof ( path ) , s - > filename ) ;
@ -1328,6 +1347,7 @@ redirect:
if ( port < 0 )
port = RTSP_DEFAULT_PORT ;
# if FF_API_RTSP_URL_OPTIONS
/* search for options */
option_list = strrchr ( path , ' ? ' ) ;
if ( option_list ) {
@ -1335,6 +1355,7 @@ redirect:
* the options back into the same string . */
filename = option_list ;
while ( option_list ) {
int handled = 1 ;
/* move the option pointer */
option = + + option_list ;
option_list = strchr ( option_list , ' & ' ) ;
@ -1360,10 +1381,16 @@ redirect:
memmove ( + + filename , option , len ) ;
filename + = len ;
if ( option_list ) * filename = ' & ' ;
handled = 0 ;
}
if ( handled )
av_log ( s , AV_LOG_WARNING , " Options passed via URL are "
" deprecated, use -rtsp_transport "
" and -rtsp_flags instead. \n " ) ;
}
* filename = 0 ;
}
# endif
if ( ! lower_transport_mask )
lower_transport_mask = ( 1 < < RTSP_LOWER_TRANSPORT_NB ) - 1 ;