Commit fa5084f6 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

aout_InputPlay: compute drift once (rather than 2-4 times)

parent 2685a8b2
...@@ -581,12 +581,17 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -581,12 +581,17 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
/* If the audio drift is too big then it's not worth trying to resample /* If the audio drift is too big then it's not worth trying to resample
* the audio. */ * the audio. */
mtime_t i_pts_tolerance = 3 * AOUT_PTS_TOLERANCE * i_input_rate / INPUT_RATE_DEFAULT; if( !start_date )
if ( start_date != 0 && start_date = p_buffer->i_pts;
( start_date < p_buffer->i_pts - i_pts_tolerance ) )
mtime_t tolerance = 3 * AOUT_PTS_TOLERANCE
* i_input_rate / INPUT_RATE_DEFAULT;
mtime_t drift = start_date - p_buffer->i_pts;
if( drift < -tolerance )
{ {
msg_Warn( p_aout, "audio drift is too big (%"PRId64"), clearing out", msg_Warn( p_aout, "buffer way too early (%"PRId64"), clearing queue",
start_date - p_buffer->i_pts ); drift );
aout_lock_input_fifos( p_aout ); aout_lock_input_fifos( p_aout );
aout_FifoSet( &p_input->mixer.fifo, 0 ); aout_FifoSet( &p_input->mixer.fifo, 0 );
aout_unlock_input_fifos( p_aout ); aout_unlock_input_fifos( p_aout );
...@@ -594,19 +599,16 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -594,19 +599,16 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
msg_Warn( p_aout, "timing screwed, stopping resampling" ); msg_Warn( p_aout, "timing screwed, stopping resampling" );
inputResamplingStop( p_input ); inputResamplingStop( p_input );
p_buffer->i_flags |= BLOCK_FLAG_DISCONTINUITY; p_buffer->i_flags |= BLOCK_FLAG_DISCONTINUITY;
start_date = 0; start_date = p_buffer->i_pts;
} }
else if ( start_date != 0 && else if( drift > +tolerance )
( start_date > p_buffer->i_pts + i_pts_tolerance) )
{ {
msg_Warn( p_aout, "audio drift is too big (%"PRId64"), dropping buffer", msg_Warn( p_aout, "buffer way too late (%"PRId64"), dropping buffer",
start_date - p_buffer->i_pts ); drift );
inputDrop( p_input, p_buffer ); inputDrop( p_input, p_buffer );
return 0; return 0;
} }
if ( start_date == 0 ) start_date = p_buffer->i_pts;
#ifndef AOUT_PROCESS_BEFORE_CHEKS #ifndef AOUT_PROCESS_BEFORE_CHEKS
/* Run pre-filters. */ /* Run pre-filters. */
aout_FiltersPlay( p_input->pp_filters, p_input->i_nb_filters, &p_buffer ); aout_FiltersPlay( p_input->pp_filters, p_input->i_nb_filters, &p_buffer );
...@@ -617,8 +619,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -617,8 +619,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
/* Run the resampler if needed. /* Run the resampler if needed.
* We first need to calculate the output rate of this resampler. */ * We first need to calculate the output rate of this resampler. */
if ( ( p_input->i_resampling_type == AOUT_RESAMPLING_NONE ) && if ( ( p_input->i_resampling_type == AOUT_RESAMPLING_NONE ) &&
( start_date < p_buffer->i_pts - AOUT_PTS_TOLERANCE ( drift < -AOUT_PTS_TOLERANCE || drift > +AOUT_PTS_TOLERANCE ) &&
|| start_date > p_buffer->i_pts + AOUT_PTS_TOLERANCE ) &&
p_input->i_nb_resamplers > 0 ) p_input->i_nb_resamplers > 0 )
{ {
/* Can happen in several circumstances : /* Can happen in several circumstances :
...@@ -628,20 +629,13 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -628,20 +629,13 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
* synchronization * synchronization
* Solution : resample the buffer to avoid a scratch. * Solution : resample the buffer to avoid a scratch.
*/ */
mtime_t drift = p_buffer->i_pts - start_date;
p_input->i_resamp_start_date = now; p_input->i_resamp_start_date = now;
p_input->i_resamp_start_drift = (int)drift; p_input->i_resamp_start_drift = (int)-drift;
p_input->i_resampling_type = (drift < 0) ? AOUT_RESAMPLING_DOWN
if ( drift > 0 ) : AOUT_RESAMPLING_UP;
p_input->i_resampling_type = AOUT_RESAMPLING_DOWN; msg_Warn( p_aout, (drift < 0)
else ? "buffer too early (%"PRId64"), down-sampling"
p_input->i_resampling_type = AOUT_RESAMPLING_UP; : "buffer too late (%"PRId64"), up-sampling", drift );
msg_Warn( p_aout, "buffer is %"PRId64" %s, triggering %ssampling",
drift > 0 ? drift : -drift,
drift > 0 ? "in advance" : "late",
drift > 0 ? "down" : "up");
} }
if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE ) if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE )
...@@ -651,13 +645,9 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -651,13 +645,9 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
* it isn't too audible to the listener. */ * it isn't too audible to the listener. */
if( p_input->i_resampling_type == AOUT_RESAMPLING_UP ) if( p_input->i_resampling_type == AOUT_RESAMPLING_UP )
{
p_input->pp_resamplers[0]->fmt_in.audio.i_rate += 2; /* Hz */ p_input->pp_resamplers[0]->fmt_in.audio.i_rate += 2; /* Hz */
}
else else
{
p_input->pp_resamplers[0]->fmt_in.audio.i_rate -= 2; /* Hz */ p_input->pp_resamplers[0]->fmt_in.audio.i_rate -= 2; /* Hz */
}
/* Check if everything is back to normal, in which case we can stop the /* Check if everything is back to normal, in which case we can stop the
* resampling */ * resampling */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment