#include <vlc_network.h>
#include <vlc_charset.h>
#include <vlc_strings.h>
+#include <vlc_rand.h>
#ifndef WIN32
# include <locale.h>
/* ES list */
int i_es;
media_es_t **es;
- char *psz_mux;
+ const char *psz_mux;
bool b_raw;
/* RTSP client */
int i_session_timeout;
/* List of media */
- vlc_mutex_t lock_media;
int i_media_id;
int i_media;
vod_media_t **media;
vlc_UrlClean( &url );
- vlc_mutex_init( &p_sys->lock_media );
-
TAB_INIT( p_sys->i_media, p_sys->media );
p_sys->i_media_id = 0;
msg_Err( p_vod, "rtsp vod leaking %d medias", p_sys->i_media );
TAB_CLEAN( p_sys->i_media, p_sys->media );
- vlc_mutex_destroy( &p_sys->lock_media );
-
free( p_sys->psz_path );
free( p_sys->psz_raw_mux );
free( p_sys );
msg_Dbg( p_vod, "deleting media: %s", p_media->psz_rtsp_path );
- vlc_mutex_lock( &p_sys->lock_media );
TAB_REMOVE( p_sys->i_media, p_sys->media, p_media );
- vlc_mutex_unlock( &p_sys->lock_media );
httpd_UrlDelete( p_media->p_rtsp_url );
vlc_mutex_destroy( &p_media->lock );
- free( p_media->psz_mux );
free( p_media );
}
static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
{
char *psz_urlc;
+
+ if( p_media->i_payload_type >= 128 )
+ {
+ msg_Err( p_vod, "too many elementary streams");
+ return VLC_EGENERIC;
+ }
+
media_es_t *p_es = calloc( 1, sizeof(media_es_t) );
if( !p_es )
return VLC_ENOMEM;
- free( p_media->psz_mux );
p_media->psz_mux = NULL;
/* TODO: update SDP, etc... */
}
break;
case VLC_FOURCC( 'm', 'p', '2', 't' ):
- p_media->psz_mux = strdup("ts");
+ p_media->psz_mux = "ts";
p_es->i_payload_type = 33;
p_es->psz_ptname = "MP2T";
break;
case VLC_FOURCC( 'm', 'p', '2', 'p' ):
- p_media->psz_mux = strdup("ps");
+ p_media->psz_mux = "ps";
p_es->i_payload_type = p_media->i_payload_type++;
p_es->psz_ptname = "MP2P";
break;
if ( cmd.i_type == RTSP_CMD_TYPE_ADD )
{
- vlc_mutex_lock( &p_sys->lock_media );
TAB_APPEND( p_sys->i_media, p_sys->media, cmd.p_media );
- vlc_mutex_unlock( &p_sys->lock_media );
goto next;
}
}
/* */
- vlc_mutex_lock( &p_sys->lock_media );
for( i = 0; i < p_sys->i_media; i++ )
{
if( p_sys->media[i]->id == cmd.i_media_id )
}
if( i >= p_sys->i_media )
{
- vlc_mutex_unlock( &p_sys->lock_media );
goto next;
}
p_media = p_sys->media[i];
default:
break;
}
- vlc_mutex_unlock( &p_sys->lock_media );
next:
free( cmd.psz_session );
if( strstr( psz_transport, "MP2T/H2221/UDP" ) ||
strstr( psz_transport, "RAW/RAW/UDP" ) )
{
- free( p_media->psz_mux );
- p_media->psz_mux = NULL;
- p_media->psz_mux = strdup( p_vod->p_sys->psz_raw_mux );
+ p_media->psz_mux = p_vod->p_sys->psz_raw_mux;
p_media->b_raw = true;
}
answer->p_body = NULL;
break;
}
- if( asprintf( &psz_new, "%d", rand() ) < 0 )
+#warning Should use secure randomness here! (spoofing risk)
+ if( asprintf( &psz_new, "%lu", vlc_mrand48() ) < 0 )
return VLC_ENOMEM;
psz_session = psz_new;
{
double f_pos = ParseNPT (psz_position + 4);
msg_Dbg( p_vod, "seeking request: %s", psz_position );
- f_pos /= ((double)(p_media->i_length))/1000 /1000 / 100;
+ f_pos /= ((double)(p_media->i_length)) / CLOCK_FREQ / 100;
CommandPush( p_vod, RTSP_CMD_TYPE_SEEK, p_media,
psz_session, f_pos, NULL );
}
psz_session, f_scale, NULL );
}
- if( p_rtsp->b_paused == true )
+ if( p_rtsp->b_paused )
{
p_rtsp->b_paused = false;
CommandPush( p_vod, RTSP_CMD_TYPE_PAUSE, p_media,
p_rtsp = RtspClientGet( p_media, psz_session );
if( !p_rtsp ) break;
- CommandPush( p_vod, RTSP_CMD_TYPE_PAUSE, p_media, psz_session,
- 0, NULL );
- p_rtsp->b_paused = true;
+ if( !p_rtsp->b_paused )
+ {
+ CommandPush( p_vod, RTSP_CMD_TYPE_PAUSE, p_media, psz_session,
+ 0, NULL );
+ p_rtsp->b_paused = true;
+ }
answer->i_status = 200;
answer->i_body = 0;
return VLC_EGENERIC;
}
- httpd_MsgAdd( answer, "Server", "VLC Server" );
+ httpd_MsgAdd( answer, "Server", "VLC/%s", VERSION );
httpd_MsgAdd( answer, "Content-Length", "%d", answer->i_body );
psz_cseq = httpd_MsgGet( query, "Cseq" );
psz_cseq ? i_cseq = atoi( psz_cseq ) : 0;
answer->p_body = NULL;
break;
}
- if( asprintf( &psz_new, "%d", rand() ) < 0 )
+#warning Session ID should be securely random (spoofing risk)
+ if( asprintf( &psz_new, "%lu", vlc_mrand48() ) < 0 )
return VLC_ENOMEM;
psz_session = psz_new;
if( strstr( psz_transport, "MP2T/H2221/UDP" ) )
{
httpd_MsgAdd( answer, "Transport",
- "MP2T/H2221/UDP;client_port=%d-%d",
+ "MP2T/H2221/UDP;unicast;client_port=%d-%d",
p_rtsp_es->i_port, p_rtsp_es->i_port + 1 );
}
else if( strstr( psz_transport, "RAW/RAW/UDP" ) )
{
httpd_MsgAdd( answer, "Transport",
- "RAW/RAW/UDP;client_port=%d-%d",
+ "RAW/RAW/UDP;unicast;client_port=%d-%d",
p_rtsp_es->i_port, p_rtsp_es->i_port + 1 );
}
}
else
{
httpd_MsgAdd( answer, "Transport",
- "RTP/AVP/UDP;client_port=%d-%d",
+ "RTP/AVP/UDP;unicast;client_port=%d-%d",
p_rtsp_es->i_port, p_rtsp_es->i_port + 1 );
}
}
{
double f_pos = ParseNPT (psz_position + 4);
msg_Dbg( p_vod, "seeking request: %s", psz_position );
- f_pos /= ((double)(p_media->i_length))/1000 /1000 / 100;
+ f_pos /= ((double)(p_media->i_length)) / CLOCK_FREQ / 100;
CommandPush( p_vod, RTSP_CMD_TYPE_SEEK, p_media,
psz_session, f_pos, NULL );
}
p_rtsp = RtspClientGet( p_media, psz_session );
if( !p_rtsp ) break;
- CommandPush( p_vod, RTSP_CMD_TYPE_PAUSE, p_media, psz_session,
- 0, NULL );
- p_rtsp->b_paused = true;
+ if( !p_rtsp->b_paused )
+ {
+ CommandPush( p_vod, RTSP_CMD_TYPE_PAUSE, p_media, psz_session,
+ 0, NULL );
+ p_rtsp->b_paused = true;
+ }
answer->i_status = 200;
answer->i_body = 0;
break;
}
- httpd_MsgAdd( answer, "Server", "VLC Server" );
+ httpd_MsgAdd( answer, "Server", "VLC/%s", VERSION );
httpd_MsgAdd( answer, "Content-Length", "%d", answer->i_body );
psz_cseq = httpd_MsgGet( query, "Cseq" );
if (psz_cseq)