Commit 64099a68 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Fix RTSP Content-Base header and SDP session control attribute

to always include a valid server address
parent 084b43a6
...@@ -46,8 +46,8 @@ struct rtsp_stream_t ...@@ -46,8 +46,8 @@ struct rtsp_stream_t
sout_stream_t *owner; sout_stream_t *owner;
httpd_host_t *host; httpd_host_t *host;
httpd_url_t *url; httpd_url_t *url;
char *psz_control;
char *psz_path; char *psz_path;
unsigned port;
int sessionc; int sessionc;
rtsp_session_t **sessionv; rtsp_session_t **sessionv;
...@@ -66,7 +66,7 @@ rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url ) ...@@ -66,7 +66,7 @@ rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url )
{ {
rtsp_stream_t *rtsp = malloc( sizeof( *rtsp ) ); rtsp_stream_t *rtsp = malloc( sizeof( *rtsp ) );
if( rtsp == NULL ) if( rtsp == NULL || ( url->i_port > 99999 ) )
return NULL; return NULL;
rtsp->owner = p_stream; rtsp->owner = p_stream;
...@@ -77,10 +77,13 @@ rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url ) ...@@ -77,10 +77,13 @@ rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url )
msg_Dbg( p_stream, "rtsp setup: %s : %d / %s\n", msg_Dbg( p_stream, "rtsp setup: %s : %d / %s\n",
url->psz_host, url->i_port, url->psz_path ); url->psz_host, url->i_port, url->psz_path );
rtsp->psz_path = strdup( url->psz_path ? url->psz_path : "/" ); rtsp->port = (url->i_port > 0) ? url->i_port : 554;
if( rtsp->psz_path == NULL ) if( url->psz_path != NULL )
goto error; rtsp->psz_path = strdup( url->psz_path + 1 );
else
rtsp->psz_path = NULL;
#if 0
if( asprintf( &rtsp->psz_control, "rtsp://%s:%d%s", if( asprintf( &rtsp->psz_control, "rtsp://%s:%d%s",
url->psz_host, url->i_port > 0 ? url->i_port : 554, url->psz_host, url->i_port > 0 ? url->i_port : 554,
rtsp->psz_path ) == -1 ) rtsp->psz_path ) == -1 )
...@@ -88,14 +91,16 @@ rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url ) ...@@ -88,14 +91,16 @@ rtsp_stream_t *RtspSetup( sout_stream_t *p_stream, const vlc_url_t *url )
rtsp->psz_control = NULL; rtsp->psz_control = NULL;
goto error; goto error;
} }
#endif
rtsp->host = httpd_HostNew( VLC_OBJECT(p_stream), url->psz_host, rtsp->host = httpd_HostNew( VLC_OBJECT(p_stream), url->psz_host,
url->i_port > 0 ? url->i_port : 554 ); rtsp->port );
if( rtsp->host == NULL ) if( rtsp->host == NULL )
goto error; goto error;
rtsp->url = httpd_UrlNewUnique( rtsp->host, rtsp->psz_path, NULL, NULL, rtsp->url = httpd_UrlNewUnique( rtsp->host,
NULL ); url->psz_path ? url->psz_path : "/", NULL,
NULL, NULL );
if( rtsp->url == NULL ) if( rtsp->url == NULL )
goto error; goto error;
...@@ -167,7 +172,7 @@ rtsp_stream_id_t *RtspAddId( rtsp_stream_t *rtsp, sout_stream_id_t *sid, ...@@ -167,7 +172,7 @@ rtsp_stream_id_t *RtspAddId( rtsp_stream_t *rtsp, sout_stream_id_t *sid,
const char *dst, int ttl, const char *dst, int ttl,
unsigned loport, unsigned hiport ) unsigned loport, unsigned hiport )
{ {
char urlbuf[strlen( rtsp->psz_control ) + 1 + 10]; char urlbuf[sizeof( "//trackID=123" ) + strlen( rtsp->psz_path )];
rtsp_stream_id_t *id = malloc( sizeof( *id ) ); rtsp_stream_id_t *id = malloc( sizeof( *id ) );
httpd_url_t *url; httpd_url_t *url;
...@@ -185,7 +190,8 @@ rtsp_stream_id_t *RtspAddId( rtsp_stream_t *rtsp, sout_stream_id_t *sid, ...@@ -185,7 +190,8 @@ rtsp_stream_id_t *RtspAddId( rtsp_stream_t *rtsp, sout_stream_id_t *sid,
id->hiport = hiport; id->hiport = hiport;
} }
sprintf( urlbuf, "%s/trackID=%d", rtsp->psz_path, num ); snprintf( urlbuf, sizeof( urlbuf ), "/%s/trackID=%u", rtsp->psz_path,
num );
msg_Dbg( rtsp->owner, "RTSP: adding %s\n", urlbuf ); msg_Dbg( rtsp->owner, "RTSP: adding %s\n", urlbuf );
url = id->url = httpd_UrlNewUnique( rtsp->host, urlbuf, NULL, NULL, NULL ); url = id->url = httpd_UrlNewUnique( rtsp->host, urlbuf, NULL, NULL, NULL );
...@@ -306,7 +312,6 @@ static int RtspCallback( httpd_callback_sys_t *p_args, ...@@ -306,7 +312,6 @@ static int RtspCallback( httpd_callback_sys_t *p_args,
{ {
return VLC_SUCCESS; return VLC_SUCCESS;
} }
//fprintf( stderr, "RtspCallback query: type=%d\n", query->i_type );
answer->i_proto = HTTPD_PROTO_RTSP; answer->i_proto = HTTPD_PROTO_RTSP;
answer->i_version= query->i_version; answer->i_version= query->i_version;
...@@ -325,13 +330,30 @@ static int RtspCallback( httpd_callback_sys_t *p_args, ...@@ -325,13 +330,30 @@ static int RtspCallback( httpd_callback_sys_t *p_args,
{ {
case HTTPD_MSG_DESCRIBE: case HTTPD_MSG_DESCRIBE:
{ {
char *psz_sdp = SDPGenerate( rtsp->owner, rtsp->psz_control ); char ip[NI_MAXNUMERICHOST], *ptr;
char control[sizeof("rtsp://[]:12345/") + sizeof( ip )
+ strlen( rtsp->psz_path )];
/* Build self-referential URL */
httpd_ServerIP( cl, ip );
ptr = strchr( ip, '%' );
if( ptr != NULL )
*ptr = '\0';
if( strchr( ip, ':' ) != NULL )
sprintf( control, "rtsp://[%s]:%u/%s", ip, rtsp->port,
( rtsp->psz_path != NULL ) ? rtsp->psz_path : "" );
else
sprintf( control, "rtsp://%s:%u/%s", ip, rtsp->port,
( rtsp->psz_path != NULL ) ? rtsp->psz_path : "" );
ptr = SDPGenerate( rtsp->owner, control );
answer->i_status = 200; answer->i_status = 200;
httpd_MsgAdd( answer, "Content-Type", "%s", "application/sdp" ); httpd_MsgAdd( answer, "Content-Type", "%s", "application/sdp" );
httpd_MsgAdd( answer, "Content-Base", "%s", rtsp->psz_control ); httpd_MsgAdd( answer, "Content-Base", "%s", control );
answer->p_body = (uint8_t *)psz_sdp; answer->p_body = (uint8_t *)ptr;
answer->i_body = strlen( psz_sdp ); answer->i_body = strlen( ptr );
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment