X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Frtsp.c;h=53ba65e1fbb30421f685fbf1d5c7effa210e7f23;hb=8c243091fba7a458af7716f1f69b54a083910554;hp=9e7f97fb988631cbc56a9953574a58156418fd52;hpb=724461bdf250e856eb32f6c0b7c51b065e482982;p=vlc diff --git a/modules/misc/rtsp.c b/modules/misc/rtsp.c index 9e7f97fb98..53ba65e1fb 100644 --- a/modules/misc/rtsp.c +++ b/modules/misc/rtsp.c @@ -36,9 +36,9 @@ #include #include -#include "vlc_httpd.h" -#include "vlc_vod.h" -#include "vlc_url.h" +#include +#include +#include #include #include #include @@ -219,10 +219,25 @@ typedef enum RTSP_CMD_TYPE_SEEK, RTSP_CMD_TYPE_REWIND, RTSP_CMD_TYPE_FORWARD, + + RTSP_CMD_TYPE_ADD, + RTSP_CMD_TYPE_DEL, } rtsp_cmd_type_t; +/* */ +typedef struct +{ + int i_type; + int i_media_id; + vod_media_t *p_media; + char *psz_session; + char *psz_arg; + double f_arg; +} rtsp_cmd_t; + static vod_media_t *MediaNew( vod_t *, const char *, input_item_t * ); static void MediaDel( vod_t *, vod_media_t * ); +static void MediaAskDel ( vod_t *, vod_media_t * ); static int MediaAddES( vod_t *, vod_media_t *, es_format_t * ); static void MediaDelES( vod_t *, vod_media_t *, es_format_t * ); @@ -302,7 +317,7 @@ static int Open( vlc_object_t *p_this ) p_sys->i_media_id = 0; p_vod->pf_media_new = MediaNew; - p_vod->pf_media_del = MediaDel; + p_vod->pf_media_del = MediaAskDel; p_vod->pf_media_add_es = MediaAddES; p_vod->pf_media_del_es = MediaDelES; @@ -337,12 +352,24 @@ static void Close( vlc_object_t * p_this ) { vod_t *p_vod = (vod_t *)p_this; vod_sys_t *p_sys = p_vod->p_sys; + block_t *p_block_cmd; + rtsp_cmd_t cmd; /* Stop command thread */ vlc_object_kill( p_vod ); CommandPush( p_vod, RTSP_CMD_TYPE_NONE, NULL, NULL, 0.0, NULL ); vlc_thread_join( p_vod ); + while( block_FifoCount( p_sys->p_fifo_cmd ) > 0 ) + { + p_block_cmd = block_FifoGet( p_sys->p_fifo_cmd ); + memcpy( &cmd, p_block_cmd->p_buffer, sizeof(cmd) ); + block_Release( p_block_cmd ); + if ( cmd.i_type == RTSP_CMD_TYPE_DEL ) + MediaDel(p_vod, cmd.p_media); + free( cmd.psz_session ); + free( cmd.psz_arg ); + } block_FifoRelease( p_sys->p_fifo_cmd ); httpd_HostDelete( p_sys->p_rtsp_host ); @@ -432,10 +459,6 @@ static vod_media_t *MediaNew( vod_t *p_vod, const char *psz_name, p_media->p_vod = p_vod; - vlc_mutex_lock( &p_sys->lock_media ); - TAB_APPEND( p_sys->i_media, p_sys->media, p_media ); - vlc_mutex_unlock( &p_sys->lock_media ); - vlc_mutex_init( &p_media->lock ); p_media->psz_session_name = strdup(""); p_media->psz_session_description = strdup(""); @@ -459,9 +482,15 @@ static vod_media_t *MediaNew( vod_t *p_vod, const char *psz_name, } vlc_mutex_unlock( &p_item->lock ); + CommandPush( p_vod, RTSP_CMD_TYPE_ADD, p_media, NULL, 0.0, NULL ); return p_media; } +static void MediaAskDel ( vod_t *p_vod, vod_media_t *p_media ) +{ + CommandPush( p_vod, RTSP_CMD_TYPE_DEL, p_media, NULL, 0.0, NULL ); +} + static void MediaDel( vod_t *p_vod, vod_media_t *p_media ) { vod_sys_t *p_sys = p_vod->p_sys; @@ -542,7 +571,6 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt ) p_es->psz_rtpmap = NULL; break; case VLC_CODEC_MPGA: - case VLC_FOURCC( 'm', 'p', '3', ' ' ): p_es->i_payload_type = 14; p_es->psz_rtpmap = strdup( "MPA/90000" ); break; @@ -780,17 +808,6 @@ static void MediaDelES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt) free( p_es ); } -/* */ -typedef struct -{ - int i_type; - int i_media_id; - //vod_media_t *p_media; - char *psz_session; - char *psz_arg; - double f_arg; -} rtsp_cmd_t; - static void CommandPush( vod_t *p_vod, rtsp_cmd_type_t i_type, vod_media_t *p_media, const char *psz_session, double f_arg, const char *psz_arg ) { @@ -799,6 +816,7 @@ static void CommandPush( vod_t *p_vod, rtsp_cmd_type_t i_type, vod_media_t *p_me memset( &cmd, 0, sizeof(cmd) ); cmd.i_type = i_type; + cmd.p_media = p_media; if( p_media ) cmd.i_media_id = p_media->id; if( psz_session ) @@ -835,6 +853,20 @@ static void* CommandThread( vlc_object_t *p_this ) if( cmd.i_type == RTSP_CMD_TYPE_NONE ) 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; + } + + if ( cmd.i_type == RTSP_CMD_TYPE_DEL ) + { + MediaDel(p_vod, cmd.p_media); + goto next; + } + /* */ vlc_mutex_lock( &p_sys->lock_media ); for( i = 0; i < p_sys->i_media; i++ ) @@ -843,7 +875,10 @@ static void* CommandThread( vlc_object_t *p_this ) break; } if( i >= p_sys->i_media ) + { + vlc_mutex_unlock( &p_sys->lock_media ); goto next; + } p_media = p_sys->media[i]; switch( cmd.i_type ) @@ -879,9 +914,9 @@ static void* CommandThread( vlc_object_t *p_this ) default: break; } + vlc_mutex_unlock( &p_sys->lock_media ); next: - vlc_mutex_unlock( &p_sys->lock_media ); free( cmd.psz_session ); free( cmd.psz_arg ); } @@ -1388,6 +1423,13 @@ static int RtspCallbackES( httpd_callback_sys_t *p_args, httpd_client_t *cl, psz_session = psz_new; p_rtsp = RtspClientNew( p_media, psz_new ); + if( !p_rtsp ) + { + answer->i_status = 454; + answer->i_body = 0; + answer->p_body = NULL; + break; + } } else {