+ 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 )
+{
+ rtsp_cmd_t cmd;
+ block_t *p_cmd;
+
+ memset( &cmd, 0, sizeof(cmd) );
+ cmd.i_type = i_type;
+ 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;
+
+ while( !p_vod->b_die )
+ {
+ 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;
+
+ /* */
+ 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 )
+ 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:
+ vlc_mutex_unlock( &p_sys->lock_media );
+ if( cmd.psz_session )
+ free( cmd.psz_session );
+ if( cmd.psz_arg )
+ free( cmd.psz_arg );
+ }