[vlc-commits] input: remove/inline IMPUT_CONTROL_SET_DIE
Rémi Denis-Courmont
git at videolan.org
Sun Jun 7 21:43:50 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jun 7 22:01:07 2015 +0300| [e970e01e841373a64506d5886a3317599779e728] | committer: Rémi Denis-Courmont
input: remove/inline IMPUT_CONTROL_SET_DIE
Also make sure that no new controls are pushed after input_Stop().
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e970e01e841373a64506d5886a3317599779e728
---
src/input/input.c | 55 ++++++++++++++++++++++----------------------
src/input/input_internal.h | 7 +++---
2 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/src/input/input.c b/src/input/input.c
index 8208acd..9fa344e 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -241,10 +241,22 @@ int input_Start( 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)
- * 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) );
- 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,
p_input->p->title = NULL;
p_input->p->i_title_offset = p_input->p->i_seekpoint_offset = 0;
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->i_rate = INPUT_RATE_DEFAULT;
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_attachment, p_input->p->attachment );
@@ -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_cond_init( &p_input->p->wait_control );
p_input->p->i_control = 0;
- p_input->p->is_running = false;
/* Create Object Variables for private use only */
input_ConfigVarInit( p_input );
@@ -1390,19 +1403,12 @@ static void End( input_thread_t * p_input )
void input_ControlPush( input_thread_t *p_input,
int i_type, vlc_value_t *p_val )
{
- vlc_mutex_lock( &p_input->p->lock_control );
- 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;
- }
+ input_thread_private_t *sys = p_input->p;
- 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",
i_type );
@@ -1418,10 +1424,10 @@ void input_ControlPush( input_thread_t *p_input,
else
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_mutex_unlock( &p_input->p->lock_control );
+ vlc_cond_signal( &sys->wait_control );
+ vlc_mutex_unlock( &sys->lock_control );
}
static int ControlGetReducedIndexLocked( input_thread_t *p_input )
@@ -1469,7 +1475,7 @@ static inline int ControlPop( input_thread_t *p_input,
while( p_sys->i_control <= 0 ||
( 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 );
return VLC_EGENERIC;
@@ -1613,13 +1619,6 @@ static bool Control( input_thread_t *p_input,
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:
{
if( p_input->p->b_recording )
diff --git a/src/input/input_internal.h b/src/input/input_internal.h
index fa8c2b1..e49f295 100644
--- a/src/input/input_internal.h
+++ b/src/input/input_internal.h
@@ -79,12 +79,14 @@ struct input_thread_private_t
{
/* Global properties */
double f_fps;
- int i_state;
bool b_can_pause;
bool b_can_rate_control;
bool b_can_pace_control;
/* Current state */
+ int i_state;
+ bool is_running;
+ bool is_stopped;
bool b_recording;
int i_rate;
@@ -161,7 +163,6 @@ struct input_thread_private_t
int i_control;
input_control_t control[INPUT_CONTROL_FIFO_SIZE];
- bool is_running;
vlc_thread_t thread;
};
@@ -170,8 +171,6 @@ struct input_thread_private_t
***************************************************************************/
enum input_control_e
{
- INPUT_CONTROL_SET_DIE,
-
INPUT_CONTROL_SET_STATE,
INPUT_CONTROL_SET_RATE,
More information about the vlc-commits
mailing list