#include <vlc_network.h>
#include <vlc_charset.h>
#include <vlc_strings.h>
+#include <vlc_rand.h>
#ifndef WIN32
# include <locale.h>
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 );
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;
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 );
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;
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;
{
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;