* 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
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;
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_rescale_ts;
+
+ bool b_eof; /* eof of demuxer */
+ double f_fps;
/* Clock average variation */
int i_cr_average;
/** 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;
/* */
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;
int i_slave;
input_source_t **slave;
+ /* pts delay fixup */
+ struct {
+ int i_num_faulty;
+ bool to_high;
+ bool auto_adjust;
+ } pts_adjust;
+
/* Stats counters */
struct {
counter_t *p_read_packets;
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 == true )
+ {
+ 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
**********************************************************************/
{
char *psz_artist;
char *psz_album;
- vlc_bool_t b_found;
+ char *psz_arturl;
+ 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 */
#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 );
+stream_t *stream_AccessNew( access_t *p_access, bool );
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 );
+void input_DecoderDiscontinuity( decoder_t * p_dec, bool b_flush );
+bool input_DecoderEmpty( decoder_t * p_dec );
+int input_DecoderSetCcState( decoder_t *, bool b_decode, int i_channel );
+int input_DecoderGetCcState( decoder_t *, bool *pb_decode, int i_channel );
+void input_DecoderIsCcPresent( decoder_t *, bool pb_present[4] );
/* es_out.c */
-es_out_t *input_EsOutNew( input_thread_t * );
+es_out_t *input_EsOutNew( input_thread_t *, int i_rate );
void input_EsOutDelete( es_out_t * );
es_out_id_t *input_EsOutGetFromID( es_out_t *, int i_id );
-void input_EsOutDiscontinuity( es_out_t *, vlc_bool_t b_flush, vlc_bool_t b_audio );
void input_EsOutSetDelay( es_out_t *, int i_cat, int64_t );
-void input_EsOutSetRate( es_out_t * );
-vlc_bool_t input_EsOutDecodersEmpty( es_out_t * );
+void input_EsOutChangeRate( es_out_t *, int );
+void input_EsOutChangeState( es_out_t * );
+void input_EsOutChangePosition( es_out_t * );
+bool input_EsOutDecodersEmpty( es_out_t * );
/* clock.c */
enum /* Synchro states */
mtime_t last_update;
int i_synchro_state;
- vlc_bool_t b_master;
+ bool b_master;
int i_rate;
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_ClockInit( input_clock_t *, bool b_master, int i_cr_average, int i_rate );
void input_ClockSetPCR( input_thread_t *, input_clock_t *, mtime_t );
+void input_ClockResetPCR( 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 );
+void input_ClockSetRate( input_clock_t *cl, int i_rate );
/* 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 ** );
+void MRLSplit( char *, const char **, const char **, char ** );
+
+static inline void input_ChangeStateWithVarCallback( input_thread_t *p_input, int state, bool callback )
+{
+ const bool changed = p_input->i_state != state;
+
+ p_input->i_state = state;
+
+ input_item_SetHasErrorWhenReading( p_input->p->input.p_item, (state == ERROR_S) );
+
+ if( callback )
+ {
+ var_SetInteger( p_input, "state", state );
+ }
+ else
+ {
+ vlc_value_t val;
+ val.i_int = 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;
+ vlc_event_send( &p_input->p->event_manager, &event );
+ }
+}
static inline void input_ChangeState( input_thread_t *p_input, int state )
{
- vlc_value_t val;
- val.i_int = p_input->i_state = state;
- var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL );
+ input_ChangeStateWithVarCallback( p_input, state, true );
}
+
/* 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,
+#define access_New( a, b, c, d ) __access_New(VLC_OBJECT(a), b, c, d )
+access_t * __access_New( vlc_object_t *p_obj, const char *psz_access,
+ const char *psz_demux, const char *psz_path );
+access_t * access_FilterNew( access_t *p_source,
const char *psz_access_filter );
-void access2_Delete( access_t * );
+void access_Delete( access_t * );
/* Demuxer */
#include <vlc_demux.h>
/* 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 );
+#define demux_New( a, b, c, d, e, f,g ) __demux_New(VLC_OBJECT(a),b,c,d,e,f,g)
+demux_t *__demux_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, bool );
-void demux2_Delete(demux_t *);
+void demux_Delete(demux_t *);
-static inline int demux2_Demux( demux_t *p_demux )
+static inline int demux_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 )
+static inline int demux_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, ... )
+static inline int demux_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 );
+ i_result = demux_vaControl( p_demux, i_query, args );
va_end( args );
return i_result;
}
-#if defined(__PLUGIN__) || defined(__BUILTIN__)
-# warning This is an internal header, something is wrong if you see this message.
-#else
/* Stream */
/**
* stream_t definition
/* UTF-16 and UTF-32 file reading */
vlc_iconv_t conv;
int i_char_width;
- vlc_bool_t b_little_endian;
+ bool b_little_endian;
};
#include <libvlc.h>
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" );
+ VLC_OBJECT_GENERIC, "stream" );
}
-#endif
#endif