Commit 3efe5e8a authored by Laurent Aimar's avatar Laurent Aimar

Split (virtually) display and demux es_out.

parent fccbbf97
......@@ -2329,16 +2329,22 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
case ES_OUT_SET_PAUSE_STATE:
{
const bool b = (bool)va_arg( args, int );
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 );
EsOutChangePause( out, b, i_date );
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;
......@@ -2347,6 +2353,7 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
case ES_OUT_SET_TIME:
{
const mtime_t i_date = (mtime_t)va_arg( args, mtime_t );
assert( i_date == -1 );
EsOutChangePosition( out );
......
......@@ -54,10 +54,10 @@ enum es_out_query_private_e
ES_OUT_SET_RECORD_STATE, /* arg1=bool res=can fail */
/* Set pause state */
ES_OUT_SET_PAUSE_STATE, /* arg1=bool arg2=mtime_t res=can fail */
ES_OUT_SET_PAUSE_STATE, /* arg1=bool b_source_paused, bool b_paused arg2=mtime_t res=can fail */
/* Set rate */
ES_OUT_SET_RATE, /* arg1=int i_rate res=can fail */
ES_OUT_SET_RATE, /* arg1=int i_source_rate arg2=int i_rate res=can fail */
/* Set a new time */
ES_OUT_SET_TIME, /* arg1=mtime_t res=can fail */
......@@ -104,13 +104,13 @@ static inline int es_out_SetRecordState( es_out_t *p_out, bool b_record )
{
return es_out_Control( p_out, ES_OUT_SET_RECORD_STATE, b_record );
}
static inline int es_out_SetPauseState( es_out_t *p_out, bool b_paused, mtime_t i_date )
static inline int es_out_SetPauseState( es_out_t *p_out, bool b_source_paused, bool b_paused, mtime_t i_date )
{
return es_out_Control( p_out, ES_OUT_SET_PAUSE_STATE, b_paused, i_date );
return es_out_Control( p_out, ES_OUT_SET_PAUSE_STATE, b_source_paused, b_paused, i_date );
}
static inline int es_out_SetRate( es_out_t *p_out, int i_rate )
static inline int es_out_SetRate( es_out_t *p_out, int i_source_rate, int i_rate )
{
return es_out_Control( p_out, ES_OUT_SET_RATE, i_rate );
return es_out_Control( p_out, ES_OUT_SET_RATE, i_source_rate, i_rate );
}
static inline int es_out_SetTime( es_out_t *p_out, mtime_t i_date )
{
......
......@@ -200,7 +200,8 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
p_input->p->b_recording = false;
TAB_INIT( p_input->p->i_bookmark, p_input->p->bookmark );
TAB_INIT( p_input->p->i_attachment, p_input->p->attachment );
p_input->p->p_es_out = NULL;
p_input->p->p_es_out_display =
p_input->p->p_es_out = NULL;
p_input->p->p_sout = NULL;
p_input->p->b_out_pace_control = false;
p_input->i_pts_delay = 0;
......@@ -1182,7 +1183,8 @@ static int Init( input_thread_t * p_input )
#endif
/* Create es out */
p_input->p->p_es_out = input_EsOutNew( p_input, p_input->p->i_rate );
p_input->p->p_es_out =
p_input->p->p_es_out_display = input_EsOutNew( p_input, p_input->p->i_rate );
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ACTIVE, false );
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_MODE, ES_OUT_MODE_NONE );
......@@ -1262,6 +1264,10 @@ static int Init( input_thread_t * p_input )
error:
input_ChangeState( p_input, ERROR_S );
if( p_input->p->p_es_out_display )
{
//TODO
}
if( p_input->p->p_es_out )
es_out_Delete( p_input->p->p_es_out );
#ifdef ENABLE_SOUT
......@@ -1304,6 +1310,7 @@ error:
p_input->p->input.p_stream = NULL;
p_input->p->input.p_access = NULL;
p_input->p->p_es_out = NULL;
p_input->p->p_es_out_display = NULL;
p_input->p->p_sout = NULL;
return VLC_EGENERIC;
......@@ -1350,6 +1357,10 @@ static void End( input_thread_t * p_input )
free( p_input->p->slave );
/* Unload all modules */
if( p_input->p->p_es_out_display )
{
//TODO
}
if( p_input->p->p_es_out )
es_out_Delete( p_input->p->p_es_out );
......@@ -1511,7 +1522,7 @@ static void ControlPause( input_thread_t *p_input, mtime_t i_control_date )
/* */
if( !i_ret )
es_out_SetPauseState( p_input->p->p_es_out, true, i_control_date );
es_out_SetPauseState( p_input->p->p_es_out, true, true, i_control_date );
}
static void ControlUnpause( input_thread_t *p_input, mtime_t i_control_date )
{
......@@ -1537,7 +1548,7 @@ static void ControlUnpause( input_thread_t *p_input, mtime_t i_control_date )
/* */
if( !i_ret )
es_out_SetPauseState( p_input->p->p_es_out, false, i_control_date );
es_out_SetPauseState( p_input->p->p_es_out, false, false, i_control_date );
}
static bool Control( input_thread_t *p_input, int i_type,
......@@ -1787,7 +1798,7 @@ static bool Control( input_thread_t *p_input, int i_type,
/* FIXME do we need a RESET_PCR when !p_input->p->input.b_rescale_ts ? */
if( p_input->p->input.b_rescale_ts )
es_out_SetRate( p_input->p->p_es_out, i_rate );
es_out_SetRate( p_input->p->p_es_out, i_rate, i_rate );
b_force_update = true;
}
......@@ -1805,20 +1816,20 @@ static bool Control( input_thread_t *p_input, int i_type,
case INPUT_CONTROL_SET_ES:
/* No need to force update, es_out does it if needed */
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ES_BY_ID, val.i_int );
es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_BY_ID, val.i_int );
break;
case INPUT_CONTROL_RESTART_ES:
es_out_Control( p_input->p->p_es_out, ES_OUT_RESTART_ES_BY_ID, val.i_int );
es_out_Control( p_input->p->p_es_out_display, ES_OUT_RESTART_ES_BY_ID, val.i_int );
break;
case INPUT_CONTROL_SET_AUDIO_DELAY:
if( !es_out_SetDelay( p_input->p->p_es_out, AUDIO_ES, val.i_time ) )
if( !es_out_SetDelay( p_input->p->p_es_out_display, AUDIO_ES, val.i_time ) )
var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, &val, NULL );
break;
case INPUT_CONTROL_SET_SPU_DELAY:
if( !es_out_SetDelay( p_input->p->p_es_out, SPU_ES, val.i_time ) )
if( !es_out_SetDelay( p_input->p->p_es_out_display, SPU_ES, val.i_time ) )
var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, &val, NULL );
break;
......@@ -2029,7 +2040,7 @@ static bool Control( input_thread_t *p_input, int i_type,
}
else
{
if( es_out_SetRecordState( p_input->p->p_es_out, val.b_bool ) )
if( es_out_SetRecordState( p_input->p->p_es_out_display, val.b_bool ) )
val.b_bool = false;
}
p_input->p->b_recording = val.b_bool;
......@@ -3099,8 +3110,8 @@ static void SubtitleAdd( input_thread_t *p_input, char *psz_subtitle, bool b_for
{
const int i_id = list.p_list->p_values[count.i_int].i_int;
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ES_DEFAULT_BY_ID, i_id );
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ES_BY_ID, i_id );
es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_DEFAULT_BY_ID, i_id );
es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_BY_ID, i_id );
}
var_Change( p_input, "spu-es", VLC_VAR_FREELIST, &list, NULL );
}
......
......@@ -109,6 +109,7 @@ struct input_thread_private_t
/* Output */
es_out_t *p_es_out;
es_out_t *p_es_out_display;
sout_instance_t *p_sout; /* XXX Move it to es_out ? */
bool b_out_pace_control; /* idem ? */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment