Commit e6f64322 authored by Jean-Marc Dressler's avatar Jean-Marc Dressler

- Correction du bug de la synchro.

  Le probl�me provenait d'un d�calage d'une seconde qui avait �t� rajout�
  dans le calcul de la date dans audio_output.c :
  p_aout->date = -1000000 + mdate() + ( (((mtime_t)(l_bytes / 4)) * 1000000)
                                        / ((mtime_t)p_aout->l_rate) );
  C'est le -1000000 qui faisait retarder le son d'exactement une seconde.
  J'aimerais bien savoir pourquoi il a �t� rajout� car peut-�tre y-a-t-il
  d'autres bugs similaires qui ne sont pas visibles pour l'instant.

- Nettoyage d'une partie du code de audio_decoder_thread.c
  Il est vraiment tr�s dommage que les conventions de codage ne soient pas
  respect�es, si il y en a ce n'est pas pour rien. De plus le m�lange
  d'espaces et de tabulations rend le code tr�s peu lisible. Je le
  rappelle, nous n'utilisons que des indentations de 4 espaces et toute
  tabulation est proscrite. Il serait bien de changer le reste du code
  pour qu'il respecte les conventions et reste ainsi facilement lisible
  par tout le monde.
parent e3f56bd8
...@@ -216,71 +216,79 @@ static void RunThread (adec_thread_t * p_adec) ...@@ -216,71 +216,79 @@ static void RunThread (adec_thread_t * p_adec)
msleep (INPUT_PTS_DELAY); msleep (INPUT_PTS_DELAY);
/* Initializing the audio decoder thread */ /* Initializing the audio decoder thread */
if (InitThread (p_adec)) { if( InitThread (p_adec) )
{
p_adec->b_error = 1; p_adec->b_error = 1;
} }
sync = 0; sync = 0;
/* Audio decoder thread's main loop */ /* Audio decoder thread's main loop */
while ((!p_adec->b_die) && (!p_adec->b_error)) { while( (!p_adec->b_die) && (!p_adec->b_error) )
s16 * buffer; {
adec_sync_info_t sync_info; s16 * buffer;
adec_sync_info_t sync_info;
if (!sync) { /* have to find a synchro point */
adec_byte_stream_t * p_byte_stream; if (!sync)
{
printf ("sync\n"); /* have to find a synchro point */
adec_byte_stream_t * p_byte_stream;
p_adec->align = 0;
printf ("sync\n");
p_byte_stream = adec_byte_stream (&p_adec->audio_decoder);
do { p_adec->align = 0;
adec_byte_stream_next (p_byte_stream); p_byte_stream = adec_byte_stream (&p_adec->audio_decoder);
} while ((!p_adec->align) && do
(!p_adec->b_die) && {
(!p_adec->b_error)); adec_byte_stream_next (p_byte_stream);
} while ((!p_adec->align) && (!p_adec->b_die) && (!p_adec->b_error));
sync = 1;
} sync = 1;
}
if (DECODER_FIFO_START(p_adec->fifo)->b_has_pts) {
p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = DECODER_FIFO_START(p_adec->fifo)->i_pts; if( DECODER_FIFO_START(p_adec->fifo)->b_has_pts )
DECODER_FIFO_START(p_adec->fifo)->b_has_pts = 0; {
} else { p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = DECODER_FIFO_START(p_adec->fifo)->i_pts;
p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE; DECODER_FIFO_START(p_adec->fifo)->b_has_pts = 0;
} }
else
{
p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE;
}
if (adec_sync_frame (&p_adec->audio_decoder, &sync_info)) { if( adec_sync_frame (&p_adec->audio_decoder, &sync_info) )
sync = 0; {
goto bad_frame; sync = 0;
} goto bad_frame;
}
p_adec->p_aout_fifo->l_rate = sync_info.sample_rate; p_adec->p_aout_fifo->l_rate = sync_info.sample_rate;
buffer = ((s16 *)p_adec->p_aout_fifo->buffer) + (p_adec->p_aout_fifo->l_end_frame * ADEC_FRAME_SIZE); buffer = ((s16 *)p_adec->p_aout_fifo->buffer) + (p_adec->p_aout_fifo->l_end_frame * ADEC_FRAME_SIZE);
if (adec_decode_frame (&p_adec->audio_decoder, buffer)) { if( adec_decode_frame (&p_adec->audio_decoder, buffer) )
sync = 0; {
goto bad_frame; sync = 0;
} goto bad_frame;
}
vlc_mutex_lock (&p_adec->p_aout_fifo->data_lock); vlc_mutex_lock (&p_adec->p_aout_fifo->data_lock);
p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE; p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
vlc_cond_signal (&p_adec->p_aout_fifo->data_wait); vlc_cond_signal (&p_adec->p_aout_fifo->data_wait);
vlc_mutex_unlock (&p_adec->p_aout_fifo->data_lock); vlc_mutex_unlock (&p_adec->p_aout_fifo->data_lock);
bad_frame: bad_frame:
} }
/* If b_error is set, the audio decoder thread enters the error loop */ /* If b_error is set, the audio decoder thread enters the error loop */
if (p_adec->b_error) { if( p_adec->b_error )
ErrorThread (p_adec); {
ErrorThread( p_adec );
} }
/* End of the audio decoder thread */ /* End of the audio decoder thread */
EndThread (p_adec); EndThread( p_adec );
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -1113,7 +1113,7 @@ void aout_Thread_S16_Stereo( aout_thread_t * p_aout ) ...@@ -1113,7 +1113,7 @@ void aout_Thread_S16_Stereo( aout_thread_t * p_aout )
} }
l_bytes = p_aout->p_sys_getbufinfo( p_aout, l_buffer_limit ); l_bytes = p_aout->p_sys_getbufinfo( p_aout, l_buffer_limit );
p_aout->date = -1000000 + mdate() + ((((mtime_t)(l_bytes / 4)) * 1000000) / ((mtime_t)p_aout->l_rate)); /* sizeof(s16) << (p_aout->b_stereo) == 4 */ p_aout->date = mdate() + ((((mtime_t)(l_bytes / 4)) * 1000000) / ((mtime_t)p_aout->l_rate)); /* sizeof(s16) << (p_aout->b_stereo) == 4 */
p_aout->p_sys_playsamples( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * sizeof(s16) ); p_aout->p_sys_playsamples( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * sizeof(s16) );
if ( l_bytes > (l_buffer_limit * sizeof(s16)) ) if ( l_bytes > (l_buffer_limit * sizeof(s16)) )
{ {
......
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