@ -922,6 +922,10 @@ make_setup_request (AVFormatContext *s, const char *host, int port, int protocol
" Transport: %s \r \n " ,
rtsp_st - > control_url , transport ) ;
rtsp_send_cmd ( s , cmd , reply , NULL ) ;
if ( reply - > status_code = = 461 /* Unsupported protocol */ & & i = = 0 ) {
err = 1 ;
goto fail ;
} else
if ( reply - > status_code ! = RTSP_STATUS_OK | |
reply - > nb_transports ! = 1 ) {
err = AVERROR_INVALIDDATA ;
@ -1003,6 +1007,12 @@ make_setup_request (AVFormatContext *s, const char *host, int port, int protocol
return 0 ;
fail :
for ( i = 0 ; i < rt - > nb_rtsp_streams ; i + + ) {
if ( rt - > rtsp_streams [ i ] - > rtp_handle ) {
url_close ( rt - > rtsp_streams [ i ] - > rtp_handle ) ;
rt - > rtsp_streams [ i ] - > rtp_handle = NULL ;
}
}
return err ;
}
@ -1045,7 +1055,7 @@ static int rtsp_read_header(AVFormatContext *s,
}
if ( ! protocol_mask )
protocol_mask = rtsp_default_protocols ;
protocol_mask = ( 1 < < RTSP_PROTOCOL_RTP_LAST ) - 1 ;
/* open the tcp connexion */
snprintf ( tcpname , sizeof ( tcpname ) , " tcp://%s:%d " , host , port ) ;
@ -1077,9 +1087,18 @@ static int rtsp_read_header(AVFormatContext *s,
goto fail ;
}
err = make_setup_request ( s , host , port , protocol_mask ) ;
if ( err )
do {
int protocol = protocol_mask & ~ ( protocol_mask - 1 ) ;
err = make_setup_request ( s , host , port , protocol ) ;
if ( err < 0 )
goto fail ;
protocol_mask & = ~ protocol ;
if ( protocol_mask = = 0 & & err = = 1 ) {
err = AVERROR ( EPROTONOSUPPORT ) ;
goto fail ;
}
} while ( err ) ;
rt - > state = RTSP_STATE_IDLE ;
rt - > seek_timestamp = 0 ; /* default is to start stream at position