X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput_internal.h;h=27e7116a1be7f3d692bb89d778ae95a24d76daec;hb=03b02bd6588ba7e16b54bd1017830d02ae18dfd9;hp=a825e538d4e4e1363ac0b12ecaa4075c2e93e1b4;hpb=2f05f4753cd0528be9cef8f607ca934216283c0f;p=vlc diff --git a/src/input/input_internal.h b/src/input/input_internal.h index a825e538d4..27e7116a1b 100644 --- a/src/input/input_internal.h +++ b/src/input/input_internal.h @@ -63,6 +63,7 @@ typedef struct bool b_can_pause; bool b_can_pace_control; bool b_can_rate_control; + bool b_can_stream_record; bool b_rescale_ts; bool b_eof; /* eof of demuxer */ @@ -84,6 +85,7 @@ struct input_thread_private_t bool b_can_rate_control; int i_rate; + bool b_recording; /* */ int64_t i_start; /* :start-time,0 by default */ int64_t i_stop; /* :stop-time, 0 if none */ @@ -116,10 +118,11 @@ struct input_thread_private_t input_source_t **slave; /* pts delay fixup */ - struct { + struct + { int i_num_faulty; - bool to_high; - bool auto_adjust; + bool b_to_high; + bool b_auto_adjust; } pts_adjust; /* Stats counters */ @@ -144,6 +147,7 @@ struct input_thread_private_t /* Buffer of pending actions */ vlc_mutex_t lock_control; + vlc_cond_t wait_control; int i_control; struct { @@ -186,11 +190,16 @@ enum input_control_e INPUT_CONTROL_SET_BOOKMARK, INPUT_CONTROL_SET_ES, + INPUT_CONTROL_RESTART_ES, INPUT_CONTROL_SET_AUDIO_DELAY, INPUT_CONTROL_SET_SPU_DELAY, INPUT_CONTROL_ADD_SLAVE, + + INPUT_CONTROL_ADD_SUBTITLE, + + INPUT_CONTROL_SET_RECORD_STATE, }; /* Internal helpers */ @@ -205,15 +214,13 @@ static inline void input_ControlPush( input_thread_t *p_input, p_input->p->control[0].i_type = i_type; memset( &p_input->p->control[0].val, 0, sizeof( vlc_value_t ) ); } + else if( p_input->p->i_control >= INPUT_CONTROL_FIFO_SIZE ) + { + msg_Err( p_input, "input control fifo overflow, trashing type=%d", + i_type ); + } else { - if( p_input->p->i_control >= INPUT_CONTROL_FIFO_SIZE ) - { - msg_Err( p_input, "input control fifo overflow, trashing type=%d", - i_type ); - vlc_mutex_unlock( &p_input->p->lock_control ); - return; - } p_input->p->control[p_input->p->i_control].i_type = i_type; if( p_val ) p_input->p->control[p_input->p->i_control].val = *p_val; @@ -223,6 +230,7 @@ static inline void input_ControlPush( input_thread_t *p_input, p_input->p->i_control++; } + vlc_cond_signal( &p_input->p->wait_control ); vlc_mutex_unlock( &p_input->p->lock_control ); } @@ -242,7 +250,7 @@ static inline void input_item_SetPreparsed( input_item_t *p_i, bool preparsed ) new_status = p_i->p_meta->i_status | ITEM_PREPARSED; else new_status = p_i->p_meta->i_status & ~ITEM_PREPARSED; - if ( p_i->p_meta->i_status != new_status ) + if( p_i->p_meta->i_status != new_status ) { p_i->p_meta->i_status = new_status; send_event = true; @@ -250,7 +258,7 @@ static inline void input_item_SetPreparsed( input_item_t *p_i, bool preparsed ) vlc_mutex_unlock( &p_i->lock ); - if ( send_event == true ) + if( send_event ) { vlc_event_t event; event.type = vlc_InputItemPreparsedChanged; @@ -281,6 +289,7 @@ static inline void input_item_SetArtFetched( input_item_t *p_i, bool artfetched p_i->p_meta->i_status &= ~ITEM_ART_FETCHED; } +void input_item_SetHasErrorWhenReading( input_item_t *p_i, bool error ); /********************************************************************** * Item metadata @@ -327,6 +336,7 @@ void stream_AccessReset( stream_t *s ); void stream_AccessUpdate( stream_t *s ); /* decoder.c */ +#define BLOCK_FLAG_CORE_FLUSH (1 <i_state != state; + const bool changed = p_input->i_state != i_state; + + p_input->i_state = i_state; + if( i_state == ERROR_S ) + p_input->b_error = true; + else if( i_state == END_S ) + p_input->b_eof = true; - p_input->i_state = state; + input_item_SetHasErrorWhenReading( p_input->p->input.p_item, (i_state == ERROR_S) ); if( callback ) { - var_SetInteger( p_input, "state", state ); + var_SetInteger( p_input, "state", i_state ); } else { vlc_value_t val; - val.i_int = state; + val.i_int = i_state; var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL ); } if( changed ) { vlc_event_t event; event.type = vlc_InputStateChanged; - event.u.input_state_changed.new_state = state; + event.u.input_state_changed.new_state = i_state; vlc_event_send( &p_input->p->event_manager, &event ); } } @@ -414,6 +408,10 @@ static inline void input_ChangeState( input_thread_t *p_input, int state ) input_ChangeStateWithVarCallback( p_input, state, true ); } +/* Helpers FIXME to export without input_ prefix */ +char *input_CreateFilename( vlc_object_t *p_obj, const char *psz_path, const char *psz_prefix, const char *psz_extension ); + +#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%H:%M:%S-$ N-$ p" /* Access */ @@ -461,8 +459,8 @@ struct stream_t VLC_COMMON_MEMBERS /*block_t *(*pf_block) ( stream_t *, int i_size );*/ - int (*pf_read) ( stream_t *, void *p_read, int i_read ); - int (*pf_peek) ( stream_t *, const uint8_t **pp_peek, int i_peek ); + int (*pf_read) ( stream_t *, void *p_read, unsigned int i_read ); + int (*pf_peek) ( stream_t *, const uint8_t **pp_peek, unsigned int i_peek ); int (*pf_control)( stream_t *, int i_query, va_list ); void (*pf_destroy)( stream_t *);