+ case ES_OUT_GET_WAKE_UP:
+ {
+ mtime_t *pi_wakeup = (mtime_t*)va_arg( args, mtime_t* );
+ *pi_wakeup = EsOutGetWakeup( out );
+ return VLC_SUCCESS;
+ }
+
+ case ES_OUT_SET_ES_BY_ID:
+ case ES_OUT_RESTART_ES_BY_ID:
+ case ES_OUT_SET_ES_DEFAULT_BY_ID:
+ {
+ const int i_id = (int)va_arg( args, int );
+ es_out_id_t *p_es = EsOutGetFromID( out, i_id );
+ int i_new_query;
+
+ switch( i_query )
+ {
+ case ES_OUT_SET_ES_BY_ID: i_new_query = ES_OUT_SET_ES; break;
+ case ES_OUT_RESTART_ES_BY_ID: i_new_query = ES_OUT_RESTART_ES; break;
+ case ES_OUT_SET_ES_DEFAULT_BY_ID: i_new_query = ES_OUT_SET_ES_DEFAULT; break;
+ default:
+ assert(0);
+ }
+ /* TODO if the lock is made non recursive it should be changed */
+ return es_out_Control( out, i_new_query, p_es );
+ }
+
+ case ES_OUT_GET_BUFFERING:
+ pb = (bool *)va_arg( args, bool* );
+ *pb = p_sys->b_buffering;
+ return VLC_SUCCESS;
+
+ case ES_OUT_GET_EMPTY:
+ pb = (bool *)va_arg( args, bool* );
+ *pb = EsOutDecodersIsEmpty( out );
+ return VLC_SUCCESS;
+
+ case ES_OUT_SET_DELAY:
+ {
+ const int i_cat = (int)va_arg( args, int );
+ const mtime_t i_delay = (mtime_t)va_arg( args, mtime_t );
+ EsOutSetDelay( out, i_cat, i_delay );
+ return VLC_SUCCESS;
+ }
+
+ case ES_OUT_SET_RECORD_STATE:
+ b = (bool) va_arg( args, int );
+ return EsOutSetRecord( out, b );
+
+ case ES_OUT_SET_PAUSE_STATE:
+ {
+ const bool b_source_paused = (bool)va_arg( args, int );
+ const bool b_paused = (bool)va_arg( args, int );
+ const mtime_t i_date = (mtime_t) va_arg( args, mtime_t );
+
+ assert( !b_source_paused == !b_paused );
+ EsOutChangePause( out, b_paused, i_date );
+
+ return VLC_SUCCESS;
+ }
+
+ case ES_OUT_SET_RATE:
+ {
+ const int i_src_rate = (int)va_arg( args, int );
+ const int i_rate = (int)va_arg( args, int );
+
+ assert( i_src_rate == i_rate );
+ EsOutChangeRate( out, i_rate );
+
+ return VLC_SUCCESS;
+ }
+
+ case ES_OUT_SET_TIME:
+ {
+ const mtime_t i_date = (mtime_t)va_arg( args, mtime_t );
+
+ assert( i_date == -1 );
+ EsOutChangePosition( out );
+
+ return VLC_SUCCESS;
+ }
+
+ case ES_OUT_SET_FRAME_NEXT:
+ EsOutFrameNext( out );
+ return VLC_SUCCESS;
+
+ case ES_OUT_SET_TIMES:
+ {
+ double f_position = (double)va_arg( args, double );
+ mtime_t i_time = (mtime_t)va_arg( args, mtime_t );
+ mtime_t i_length = (mtime_t)va_arg( args, mtime_t );
+
+ /* Fix for buffering delay */
+ const mtime_t i_delay = EsOutGetBuffering( out );
+
+ i_time -= i_delay;
+ if( i_time < 0 )
+ i_time = 0;
+
+ if( i_length > 0 )
+ f_position -= (double)i_delay / i_length;
+ if( f_position < 0 )
+ f_position = 0;
+
+ input_SendEventTimes( p_sys->p_input, f_position, i_time, i_length );
+ return VLC_SUCCESS;
+ }
+