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 */
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 */
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 */
/* Buffer of pending actions */
vlc_mutex_t lock_control;
+ vlc_cond_t wait_control;
int i_control;
struct
{
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 */
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 )
+ else if( p_input->p->i_control >= INPUT_CONTROL_FIFO_SIZE )
{
msg_Err( p_input, "input control fifo overflow, trashing type=%d",
i_type );
p_input->p->i_control++;
}
+ vlc_cond_signal( &p_input->p->wait_control );
vlc_mutex_unlock( &p_input->p->lock_control );
}
void stream_AccessUpdate( stream_t *s );
/* decoder.c */
+#define BLOCK_FLAG_CORE_FLUSH (1 <<BLOCK_FLAG_CORE_PRIVATE_SHIFT)
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 );
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 );
+mtime_t input_EsOutGetWakeup( es_out_t * );
void input_EsOutSetDelay( es_out_t *, int i_cat, int64_t );
+int input_EsOutSetRecord( es_out_t *, bool b_record );
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 */
-{
- SYNCHRO_OK = 0,
- SYNCHRO_START = 1,
- SYNCHRO_REINIT = 2,
-};
+typedef struct input_clock_t input_clock_t;
-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;
-
- bool b_master;
-
- int i_rate;
-
- /* Config */
- int i_cr_average;
- int i_delta_cr_residue;
-} input_clock_t;
-
-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 );
+input_clock_t *input_ClockNew( bool b_master, int i_cr_average, int i_rate );
+void input_ClockDelete( input_clock_t * );
+
+void input_ClockSetPCR( input_thread_t *, input_clock_t *, mtime_t i_clock, mtime_t i_system );
void input_ClockResetPCR( input_clock_t * );
mtime_t input_ClockGetTS( input_thread_t *, input_clock_t *, mtime_t );
void input_ClockSetRate( input_clock_t *cl, int i_rate );
+void input_ClockSetMaster( input_clock_t *cl, bool b_master );
+mtime_t input_ClockGetWakeup( input_thread_t *, input_clock_t *cl );
/* Subtitles */
char **subtitles_Detect( input_thread_t *, char* path, const char *fname );
int subtitles_Filter( const char *);
-static inline void input_ChangeStateWithVarCallback( input_thread_t *p_input, int state, bool callback )
+static inline void input_ChangeStateWithVarCallback( input_thread_t *p_input, int i_state, bool callback )
{
- const bool changed = p_input->i_state != state;
+ const bool changed = p_input->i_state != i_state;
- p_input->i_state = 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;
- input_item_SetHasErrorWhenReading( p_input->p->input.p_item, (state == ERROR_S) );
+ 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 );
}
}
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 */