X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput_internal.h;h=993ce97d00b525bf5412af4c8c24220318f9053b;hb=3110258d24150892b6fbff19d5868a004e0c26af;hp=06ee78cc0c22ae1bf936f1175d4225ec2f0ce73b;hpb=a0429d0043a4cbf10f226879138bb8125eeb91f4;p=vlc diff --git a/src/input/input_internal.h b/src/input/input_internal.h index 06ee78cc0c..993ce97d00 100644 --- a/src/input/input_internal.h +++ b/src/input/input_internal.h @@ -21,12 +21,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#if defined(__PLUGIN__) || defined(__BUILTIN__) || !defined(__LIBVLC__) +# error This header file can only be included from LibVLC. +#endif + #ifndef _INPUT_INTERNAL_H #define _INPUT_INTERNAL_H 1 #include #include #include +#include /***************************************************************************** * Private input fields @@ -43,7 +48,7 @@ typedef struct demux_t *p_demux; /* Title infos for that input */ - vlc_bool_t b_title_demux; /* Titles/Seekpoints provided by demux */ + bool b_title_demux; /* Titles/Seekpoints provided by demux */ int i_title; input_title_t **title; @@ -56,9 +61,13 @@ typedef struct int i_seekpoint_end; /* Properties */ - vlc_bool_t b_can_pace_control; - vlc_bool_t b_can_pause; - vlc_bool_t b_eof; /* eof of demuxer */ + 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 */ double f_fps; /* Clock average variation */ @@ -69,10 +78,15 @@ typedef struct /** Private input fields */ struct input_thread_private_t { + /* Object's event manager */ + vlc_event_manager_t event_manager; + /* Global properties */ - vlc_bool_t b_can_pause; + bool b_can_pause; + 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 */ @@ -94,10 +108,9 @@ struct input_thread_private_t input_attachment_t **attachment; /* Output */ - es_out_t *p_es_out; + es_out_t *p_es_out; sout_instance_t *p_sout; /* XXX Move it to es_out ? */ - vlc_bool_t b_sout_keep; - vlc_bool_t b_out_pace_control; /* idem ? */ + bool b_out_pace_control; /* idem ? */ /* Main input properties */ input_source_t input; @@ -127,6 +140,7 @@ struct input_thread_private_t /* Buffer of pending actions */ vlc_mutex_t lock_control; + vlc_cond_t wait_control; int i_control; struct { @@ -169,11 +183,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 */ @@ -188,15 +207,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; @@ -206,9 +223,67 @@ 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 ); } +/** Stuff moved out of vlc_input.h -- FIXME: should probably not be inline + * anyway. */ + +static inline void input_item_SetPreparsed( input_item_t *p_i, bool preparsed ) +{ + bool send_event = false; + + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + vlc_mutex_lock( &p_i->lock ); + int new_status; + if( 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 ) + { + p_i->p_meta->i_status = new_status; + send_event = true; + } + + vlc_mutex_unlock( &p_i->lock ); + + if( send_event ) + { + vlc_event_t event; + event.type = vlc_InputItemPreparsedChanged; + event.u.input_item_preparsed_changed.new_status = new_status; + vlc_event_send( &p_i->event_manager, &event ); + } +} + +static inline void input_item_SetArtNotFound( input_item_t *p_i, bool notfound ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + if( notfound ) + p_i->p_meta->i_status |= ITEM_ART_NOTFOUND; + else + p_i->p_meta->i_status &= ~ITEM_ART_NOTFOUND; +} + +static inline void input_item_SetArtFetched( input_item_t *p_i, bool artfetched ) +{ + if( !p_i->p_meta ) + p_i->p_meta = vlc_meta_New(); + + if( artfetched ) + p_i->p_meta->i_status |= ITEM_ART_FETCHED; + else + p_i->p_meta->i_status &= ~ITEM_ART_FETCHED; +} + +void input_item_SetHasErrorWhenReading( input_item_t *p_i, bool error ); + /********************************************************************** * Item metadata **********************************************************************/ @@ -217,13 +292,10 @@ typedef struct playlist_album_t char *psz_artist; char *psz_album; char *psz_arturl; - vlc_bool_t b_found; + bool b_found; } playlist_album_t; -int input_MetaFetch ( playlist_t *, input_item_t * ); int input_ArtFind ( playlist_t *, input_item_t * ); -vlc_bool_t input_MetaSatisfied ( playlist_t*, input_item_t*, - uint32_t*, uint32_t* ); int input_DownloadAndCacheArt ( playlist_t *, input_item_t * ); /* Becarefull; p_item lock HAS to be taken */ @@ -240,155 +312,59 @@ input_stats_t *stats_NewInputStats( input_thread_t *p_input ); #define input_CreateThreadExtended(a,b,c,d) __input_CreateThreadExtended(VLC_OBJECT(a),b,c,d) input_thread_t *__input_CreateThreadExtended ( vlc_object_t *, input_item_t *, const char *, sout_instance_t * ); -void input_DestroyThreadExtended( input_thread_t *p_input, sout_instance_t ** ); +sout_instance_t * input_DetachSout( input_thread_t *p_input ); /* var.c */ void input_ControlVarInit ( input_thread_t * ); -void input_ControlVarClean( input_thread_t * ); +void input_ControlVarStop( input_thread_t * ); void input_ControlVarNavigation( input_thread_t * ); void input_ControlVarTitle( input_thread_t *, int i_title ); void input_ConfigVarInit ( input_thread_t * ); -/* stream.c */ -stream_t *stream_AccessNew( access_t *p_access, vlc_bool_t ); -void stream_AccessDelete( stream_t *s ); -void stream_AccessReset( stream_t *s ); -void stream_AccessUpdate( stream_t *s ); - -/* decoder.c */ -void input_DecoderDiscontinuity( decoder_t * p_dec, vlc_bool_t b_flush ); -vlc_bool_t input_DecoderEmpty( decoder_t * p_dec ); -int input_DecoderSetCcState( decoder_t *, vlc_bool_t b_decode, int i_channel ); -int input_DecoderGetCcState( decoder_t *, vlc_bool_t *pb_decode, int i_channel ); -void input_DecoderIsCcPresent( decoder_t *, vlc_bool_t pb_present[4] ); - -/* es_out.c */ -es_out_t *input_EsOutNew( input_thread_t * ); -void input_EsOutDelete( es_out_t * ); -es_out_id_t *input_EsOutGetFromID( es_out_t *, int i_id ); -void input_EsOutSetDelay( es_out_t *, int i_cat, int64_t ); -void input_EsOutChangeRate( es_out_t * ); -void input_EsOutChangeState( es_out_t * ); -void input_EsOutChangePosition( es_out_t * ); -vlc_bool_t input_EsOutDecodersEmpty( es_out_t * ); - -/* clock.c */ -enum /* Synchro states */ -{ - SYNCHRO_OK = 0, - SYNCHRO_START = 1, - SYNCHRO_REINIT = 2, -}; - -typedef struct -{ - /* Synchronization information */ - mtime_t delta_cr; - mtime_t cr_ref, sysdate_ref; - mtime_t last_sysdate; - mtime_t last_cr; /* reference to detect unexpected stream - * discontinuities */ - mtime_t last_pts; - mtime_t last_update; - int i_synchro_state; - - vlc_bool_t b_master; - - int i_rate; - - /* Config */ - int i_cr_average; - int i_delta_cr_residue; -} input_clock_t; - -void input_ClockInit( input_thread_t *, input_clock_t *, vlc_bool_t b_master, int i_cr_average ); -void input_ClockSetPCR( input_thread_t *, input_clock_t *, mtime_t ); -void input_ClockResetPCR( input_thread_t *, input_clock_t * ); -mtime_t input_ClockGetTS( input_thread_t *, input_clock_t *, mtime_t ); -void input_ClockSetRate( input_thread_t *, input_clock_t *cl ); - /* Subtitles */ char **subtitles_Detect( input_thread_t *, char* path, const char *fname ); int subtitles_Filter( const char *); -void MRLSplit( vlc_object_t *, char *, const char **, const char **, char ** ); - -static inline void input_ChangeState( input_thread_t *p_input, int state ) +static inline void input_ChangeStateWithVarCallback( input_thread_t *p_input, int i_state, bool callback ) { - var_SetInteger( p_input, "state", p_input->i_state = state ); -} - -/* Access */ - -#define access2_New( a, b, c, d, e ) __access2_New(VLC_OBJECT(a), b, c, d, e ) -access_t * __access2_New( vlc_object_t *p_obj, const char *psz_access, - const char *psz_demux, const char *psz_path, - vlc_bool_t b_quick ); -access_t * access2_FilterNew( access_t *p_source, - const char *psz_access_filter ); -void access2_Delete( access_t * ); + const bool changed = p_input->i_state != i_state; -/* Demuxer */ -#include - -/* stream_t *s could be null and then it mean a access+demux in one */ -#define demux2_New( a, b, c, d, e, f,g ) __demux2_New(VLC_OBJECT(a),b,c,d,e,f,g) -demux_t *__demux2_New(vlc_object_t *p_obj, const char *psz_access, const char *psz_demux, const char *psz_path, stream_t *s, es_out_t *out, vlc_bool_t ); + 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; -void demux2_Delete(demux_t *); + input_item_SetHasErrorWhenReading( p_input->p->input.p_item, (i_state == ERROR_S) ); -static inline int demux2_Demux( demux_t *p_demux ) -{ - return p_demux->pf_demux( p_demux ); -} -static inline int demux2_vaControl( demux_t *p_demux, int i_query, va_list args ) -{ - return p_demux->pf_control( p_demux, i_query, args ); -} -static inline int demux2_Control( demux_t *p_demux, int i_query, ... ) -{ - va_list args; - int i_result; - - va_start( args, i_query ); - i_result = demux2_vaControl( p_demux, i_query, args ); - va_end( args ); - return i_result; + if( callback ) + { + var_SetInteger( p_input, "state", i_state ); + } + else + { + vlc_value_t val; + 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 = i_state; + vlc_event_send( &p_input->p->event_manager, &event ); + } } -#if defined(__PLUGIN__) || defined(__BUILTIN__) -# warning This is an internal header, something is wrong if you see this message. -#else -/* Stream */ -/** - * stream_t definition - */ -struct stream_t +static inline void input_ChangeState( input_thread_t *p_input, int state ) { - 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_control)( stream_t *, int i_query, va_list ); - void (*pf_destroy)( stream_t *); - - stream_sys_t *p_sys; - - /* UTF-16 and UTF-32 file reading */ - vlc_iconv_t conv; - int i_char_width; - vlc_bool_t b_little_endian; -}; + input_ChangeStateWithVarCallback( p_input, state, true ); +} -#include +/* 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 ); -static inline stream_t *vlc_stream_create( vlc_object_t *obj ) -{ - return (stream_t *)vlc_custom_create( obj, sizeof(stream_t), - VLC_OBJECT_STREAM, "stream" ); -} -#endif +#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%H:%M:%S-$ N-$ p" #endif