Commit e970e01e authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

input: remove/inline IMPUT_CONTROL_SET_DIE

Also make sure that no new controls are pushed after input_Stop().
parent 17f7c2ea
...@@ -241,10 +241,22 @@ int input_Start( input_thread_t *p_input ) ...@@ -241,10 +241,22 @@ int input_Start( input_thread_t *p_input )
void input_Stop( input_thread_t *p_input ) void input_Stop( input_thread_t *p_input )
{ {
/* Set die for input and ALL of this childrens (even (grand-)grand-childrens) /* Set die for input and ALL of this childrens (even (grand-)grand-childrens)
* It is needed here even if it is done in INPUT_CONTROL_SET_DIE handler to */
* unlock the control loop */
ObjectKillChildrens( VLC_OBJECT(p_input) ); ObjectKillChildrens( VLC_OBJECT(p_input) );
input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL );
input_thread_private_t *sys = p_input->p;
vlc_mutex_lock( &sys->lock_control );
/* Discard all pending controls */
for( int i = 0; i < sys->i_control; i++ )
{
input_control_t *ctrl = &sys->control[i];
ControlRelease( ctrl->i_type, ctrl->val );
}
sys->i_control = 0;
sys->is_stopped = true;
vlc_cond_signal( &sys->wait_control );
vlc_mutex_unlock( &sys->lock_control );
} }
/** /**
...@@ -356,8 +368,10 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, ...@@ -356,8 +368,10 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
p_input->p->title = NULL; p_input->p->title = NULL;
p_input->p->i_title_offset = p_input->p->i_seekpoint_offset = 0; p_input->p->i_title_offset = p_input->p->i_seekpoint_offset = 0;
p_input->p->i_state = INIT_S; p_input->p->i_state = INIT_S;
p_input->p->i_rate = INPUT_RATE_DEFAULT; p_input->p->is_running = false;
p_input->p->is_stopped = false;
p_input->p->b_recording = false; p_input->p->b_recording = false;
p_input->p->i_rate = INPUT_RATE_DEFAULT;
memset( &p_input->p->bookmark, 0, sizeof(p_input->p->bookmark) ); memset( &p_input->p->bookmark, 0, sizeof(p_input->p->bookmark) );
TAB_INIT( p_input->p->i_bookmark, p_input->p->pp_bookmark ); TAB_INIT( p_input->p->i_bookmark, p_input->p->pp_bookmark );
TAB_INIT( p_input->p->i_attachment, p_input->p->attachment ); TAB_INIT( p_input->p->i_attachment, p_input->p->attachment );
...@@ -426,7 +440,6 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, ...@@ -426,7 +440,6 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
vlc_mutex_init( &p_input->p->lock_control ); vlc_mutex_init( &p_input->p->lock_control );
vlc_cond_init( &p_input->p->wait_control ); vlc_cond_init( &p_input->p->wait_control );
p_input->p->i_control = 0; p_input->p->i_control = 0;
p_input->p->is_running = false;
/* Create Object Variables for private use only */ /* Create Object Variables for private use only */
input_ConfigVarInit( p_input ); input_ConfigVarInit( p_input );
...@@ -1390,19 +1403,12 @@ static void End( input_thread_t * p_input ) ...@@ -1390,19 +1403,12 @@ static void End( input_thread_t * p_input )
void input_ControlPush( input_thread_t *p_input, void input_ControlPush( input_thread_t *p_input,
int i_type, vlc_value_t *p_val ) int i_type, vlc_value_t *p_val )
{ {
vlc_mutex_lock( &p_input->p->lock_control ); input_thread_private_t *sys = p_input->p;
if( i_type == INPUT_CONTROL_SET_DIE )
{
/* Special case, empty the control */
for( int i = 0; i < p_input->p->i_control; i++ )
{
input_control_t *p_ctrl = &p_input->p->control[i];
ControlRelease( p_ctrl->i_type, p_ctrl->val );
}
p_input->p->i_control = 0;
}
if( p_input->p->i_control >= INPUT_CONTROL_FIFO_SIZE ) vlc_mutex_lock( &sys->lock_control );
if( sys->is_stopped )
;
else if( sys->i_control >= INPUT_CONTROL_FIFO_SIZE )
{ {
msg_Err( p_input, "input control fifo overflow, trashing type=%d", msg_Err( p_input, "input control fifo overflow, trashing type=%d",
i_type ); i_type );
...@@ -1418,10 +1424,10 @@ void input_ControlPush( input_thread_t *p_input, ...@@ -1418,10 +1424,10 @@ void input_ControlPush( input_thread_t *p_input,
else else
memset( &c.val, 0, sizeof(c.val) ); memset( &c.val, 0, sizeof(c.val) );
p_input->p->control[p_input->p->i_control++] = c; sys->control[sys->i_control++] = c;
} }
vlc_cond_signal( &p_input->p->wait_control ); vlc_cond_signal( &sys->wait_control );
vlc_mutex_unlock( &p_input->p->lock_control ); vlc_mutex_unlock( &sys->lock_control );
} }
static int ControlGetReducedIndexLocked( input_thread_t *p_input ) static int ControlGetReducedIndexLocked( input_thread_t *p_input )
...@@ -1469,7 +1475,7 @@ static inline int ControlPop( input_thread_t *p_input, ...@@ -1469,7 +1475,7 @@ static inline int ControlPop( input_thread_t *p_input,
while( p_sys->i_control <= 0 || while( p_sys->i_control <= 0 ||
( b_postpone_seek && ControlIsSeekRequest( p_sys->control[0].i_type ) ) ) ( b_postpone_seek && ControlIsSeekRequest( p_sys->control[0].i_type ) ) )
{ {
if( !vlc_object_alive( p_input ) ) if( p_sys->is_stopped )
{ {
vlc_mutex_unlock( &p_sys->lock_control ); vlc_mutex_unlock( &p_sys->lock_control );
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -1613,13 +1619,6 @@ static bool Control( input_thread_t *p_input, ...@@ -1613,13 +1619,6 @@ static bool Control( input_thread_t *p_input,
switch( i_type ) switch( i_type )
{ {
case INPUT_CONTROL_SET_DIE:
msg_Dbg( p_input, "control: stopping input" );
/* Mark all submodules to die */
ObjectKillChildrens( VLC_OBJECT(p_input) );
break;
case INPUT_CONTROL_SET_POSITION: case INPUT_CONTROL_SET_POSITION:
{ {
if( p_input->p->b_recording ) if( p_input->p->b_recording )
......
...@@ -79,12 +79,14 @@ struct input_thread_private_t ...@@ -79,12 +79,14 @@ struct input_thread_private_t
{ {
/* Global properties */ /* Global properties */
double f_fps; double f_fps;
int i_state;
bool b_can_pause; bool b_can_pause;
bool b_can_rate_control; bool b_can_rate_control;
bool b_can_pace_control; bool b_can_pace_control;
/* Current state */ /* Current state */
int i_state;
bool is_running;
bool is_stopped;
bool b_recording; bool b_recording;
int i_rate; int i_rate;
...@@ -161,7 +163,6 @@ struct input_thread_private_t ...@@ -161,7 +163,6 @@ struct input_thread_private_t
int i_control; int i_control;
input_control_t control[INPUT_CONTROL_FIFO_SIZE]; input_control_t control[INPUT_CONTROL_FIFO_SIZE];
bool is_running;
vlc_thread_t thread; vlc_thread_t thread;
}; };
...@@ -170,8 +171,6 @@ struct input_thread_private_t ...@@ -170,8 +171,6 @@ struct input_thread_private_t
***************************************************************************/ ***************************************************************************/
enum input_control_e enum input_control_e
{ {
INPUT_CONTROL_SET_DIE,
INPUT_CONTROL_SET_STATE, INPUT_CONTROL_SET_STATE,
INPUT_CONTROL_SET_RATE, INPUT_CONTROL_SET_RATE,
......
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