+ free( p_es );
+}
+
+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 )
+{
+ rtsp_cmd_t cmd;
+ block_t *p_cmd;
+
+ 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 )
+ cmd.psz_session = strdup(psz_session);
+ cmd.f_arg = f_arg;
+ if( psz_arg )
+ cmd.psz_arg = strdup(psz_arg);
+
+ p_cmd = block_New( p_vod, sizeof(rtsp_cmd_t) );
+ memcpy( p_cmd->p_buffer, &cmd, sizeof(cmd) );
+
+ block_FifoPut( p_vod->p_sys->p_fifo_cmd, p_cmd );
+}
+
+static void* CommandThread( vlc_object_t *p_this )
+{
+ vod_t *p_vod = (vod_t*)p_this;
+ vod_sys_t *p_sys = p_vod->p_sys;
+ int canc = vlc_savecancel ();
+
+ while( vlc_object_alive (p_vod) )
+ {
+ block_t *p_block_cmd = block_FifoGet( p_sys->p_fifo_cmd );
+ rtsp_cmd_t cmd;
+ vod_media_t *p_media = NULL;
+ int i;
+
+ if( !p_block_cmd )
+ break;
+
+ memcpy( &cmd, p_block_cmd->p_buffer, sizeof(cmd) );
+ block_Release( p_block_cmd );
+
+ if( cmd.i_type == RTSP_CMD_TYPE_NONE )
+ break;
+
+ if ( cmd.i_type == RTSP_CMD_TYPE_ADD )
+ {
+ TAB_APPEND( p_sys->i_media, p_sys->media, cmd.p_media );
+ goto next;
+ }
+
+ if ( cmd.i_type == RTSP_CMD_TYPE_DEL )
+ {
+ MediaDel(p_vod, cmd.p_media);
+ goto next;
+ }
+
+ /* */
+ for( i = 0; i < p_sys->i_media; i++ )
+ {
+ if( p_sys->media[i]->id == cmd.i_media_id )
+ break;
+ }
+ if( i >= p_sys->i_media )
+ {
+ goto next;
+ }
+ p_media = p_sys->media[i];
+
+ switch( cmd.i_type )
+ {
+ case RTSP_CMD_TYPE_PLAY:
+ vod_MediaControl( p_vod, p_media, cmd.psz_session,
+ VOD_MEDIA_PLAY, cmd.psz_arg );
+ break;
+ case RTSP_CMD_TYPE_PAUSE:
+ vod_MediaControl( p_vod, p_media, cmd.psz_session,
+ VOD_MEDIA_PAUSE );
+ break;
+
+ case RTSP_CMD_TYPE_STOP:
+ vod_MediaControl( p_vod, p_media, cmd.psz_session, VOD_MEDIA_STOP );
+ break;
+
+ case RTSP_CMD_TYPE_SEEK:
+ vod_MediaControl( p_vod, p_media, cmd.psz_session,
+ VOD_MEDIA_SEEK, cmd.f_arg );
+ break;
+
+ case RTSP_CMD_TYPE_REWIND:
+ vod_MediaControl( p_vod, p_media, cmd.psz_session,
+ VOD_MEDIA_REWIND, cmd.f_arg );
+ break;
+
+ case RTSP_CMD_TYPE_FORWARD:
+ vod_MediaControl( p_vod, p_media, cmd.psz_session,
+ VOD_MEDIA_FORWARD, cmd.f_arg );
+ break;
+
+ default:
+ break;
+ }
+
+ next:
+ free( cmd.psz_session );
+ free( cmd.psz_arg );
+ }
+
+ vlc_restorecancel (canc);
+ return NULL;