* discontinuity
*****************************************************************************/
void input_ClockInit( input_thread_t *p_input,
- input_clock_t *cl, vlc_bool_t b_master, int i_cr_average )
+ input_clock_t *cl, vlc_bool_t b_master, int i_cr_average, int i_rate )
{
cl->i_synchro_state = SYNCHRO_START;
cl->sysdate_ref = 0;
cl->delta_cr = 0;
cl->i_delta_cr_residue = 0;
- cl->i_rate = p_input->p->i_rate;
+ cl->i_rate = i_rate;
cl->i_cr_average = i_cr_average;
* warning from the stream control facilities (dd-edited
* stream ?). */
msg_Warn( p_input, "clock gap, unexpected stream discontinuity" );
- input_ClockInit( p_input, cl, cl->b_master, cl->i_cr_average );
+ input_ClockInit( p_input, cl, cl->b_master, cl->i_cr_average, cl->i_rate );
/* Feed synchro with a new reference point. */
msg_Warn( p_input, "feeding synchro with a new reference point trying to recover from clock gap" );
ClockNewRef( cl, i_clock,
/*****************************************************************************
* input_ClockSetRate:
*****************************************************************************/
-void input_ClockSetRate( input_thread_t *p_input, input_clock_t *cl )
+void input_ClockSetRate( input_thread_t *p_input, input_clock_t *cl, int i_rate )
{
/* Move the reference point */
if( cl->i_synchro_state == SYNCHRO_OK )
ClockNewRef( cl, cl->last_cr, cl->last_sysdate );
- cl->i_rate = p_input->p->i_rate;
+ cl->i_rate = i_rate;
}
/* delay */
int64_t i_audio_delay;
int64_t i_spu_delay;
+
+ /* Rate used to rescale ES ts */
+ int i_rate;
};
static es_out_id_t *EsOutAdd ( es_out_t *, es_format_t * );
/*****************************************************************************
* input_EsOutNew:
*****************************************************************************/
-es_out_t *input_EsOutNew( input_thread_t *p_input )
+es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate )
{
es_out_t *out = malloc( sizeof( es_out_t ) );
es_out_sys_t *p_sys = malloc( sizeof( es_out_sys_t ) );
p_sys->i_audio_delay= 0;
p_sys->i_spu_delay = 0;
+ p_sys->i_rate = i_rate;
+
return out;
}
input_DecoderDiscontinuity( es->p_dec, b_flush );
}
}
-void input_EsOutChangeRate( es_out_t *out )
+void input_EsOutChangeRate( es_out_t *out, int i_rate )
{
es_out_sys_t *p_sys = out->p_sys;
int i;
+ p_sys->i_rate = i_rate;
EsOutDiscontinuity( out, VLC_FALSE, VLC_FALSE );
for( i = 0; i < p_sys->i_pgrm; i++ )
- input_ClockSetRate( p_sys->p_input, &p_sys->pgrm[i]->clock );
+ input_ClockSetRate( p_sys->p_input, &p_sys->pgrm[i]->clock, i_rate );
}
void input_EsOutSetDelay( es_out_t *out, int i_cat, int64_t i_delay )
p_pgrm->psz_now_playing = NULL;
p_pgrm->psz_publisher = NULL;
p_pgrm->p_epg = NULL;
- input_ClockInit( p_input, &p_pgrm->clock, VLC_FALSE, p_input->p->input.i_cr_average );
+ input_ClockInit( p_input, &p_pgrm->clock, VLC_FALSE, p_input->p->input.i_cr_average, p_sys->i_rate );
/* Append it */
TAB_APPEND( p_sys->i_pgrm, p_sys->pgrm, p_pgrm );
}
}
- p_block->i_rate = p_input->p->i_rate;
+ p_block->i_rate = p_sys->i_rate;
/* TODO handle mute */
if( es->p_dec &&
( es->fmt.i_cat != AUDIO_ES ||
- ( p_input->p->i_rate >= INPUT_RATE_DEFAULT/AOUT_MAX_INPUT_RATE &&
- p_input->p->i_rate <= INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE ) ) )
+ ( p_sys->i_rate >= INPUT_RATE_DEFAULT/AOUT_MAX_INPUT_RATE &&
+ p_sys->i_rate <= INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE ) ) )
{
vlc_bool_t pb_cc[4];
vlc_bool_t b_cc_new = VLC_FALSE;
}
/* Create es out */
- p_input->p->p_es_out = input_EsOutNew( p_input );
+ p_input->p->p_es_out = input_EsOutNew( p_input, p_input->p->i_rate );
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ACTIVE, VLC_FALSE );
es_out_Control( p_input->p->p_es_out, ES_OUT_SET_MODE, ES_OUT_MODE_NONE );
p_input->p->i_rate = i_rate;
- input_EsOutChangeRate( p_input->p->p_es_out );
+ input_EsOutChangeRate( p_input->p->p_es_out, i_rate );
b_force_update = VLC_TRUE;
}
void input_DecoderIsCcPresent( decoder_t *, vlc_bool_t 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_EsOutSetDelay( es_out_t *, int i_cat, int64_t );
-void input_EsOutChangeRate( es_out_t * );
+void input_EsOutChangeRate( es_out_t *, int );
void input_EsOutChangeState( es_out_t * );
void input_EsOutChangePosition( es_out_t * );
vlc_bool_t input_EsOutDecodersEmpty( es_out_t * );
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_thread_t *, input_clock_t *, vlc_bool_t b_master, int i_cr_average, int i_rate );
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 );
+void input_ClockSetRate( input_thread_t *, input_clock_t *cl, int i_rate );
/* Subtitles */
char **subtitles_Detect( input_thread_t *, char* path, const char *fname );