X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Fdec.c;h=ddd2f69008514a810f1c5c6097f461c5774c75e8;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=ea443efdf0a3c962204e20c57746879b666b2f6b;hpb=c22195b458f8bf44b4dbd5f424031e0add08e5d0;p=vlc diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index ea443efdf0..ddd2f69008 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -32,10 +32,6 @@ #include -#ifdef HAVE_ALLOCA_H -# include -#endif - #include #include @@ -269,7 +265,7 @@ aout_buffer_t * aout_DecNewBuffer( aout_input_t * p_input, /* This necessarily allocates in the heap. */ p_buffer = aout_BufferAlloc( &p_input->input_alloc, duration, NULL ); if( p_buffer != NULL ) - p_buffer->i_nb_bytes = i_nb_samples * p_input->input.i_bytes_per_frame + p_buffer->i_buffer = i_nb_samples * p_input->input.i_bytes_per_frame / p_input->input.i_frame_length; /* Suppose the decoder doesn't have more than one buffered buffer */ @@ -281,7 +277,7 @@ aout_buffer_t * aout_DecNewBuffer( aout_input_t * p_input, return NULL; p_buffer->i_nb_samples = i_nb_samples; - p_buffer->start_date = p_buffer->end_date = 0; + p_buffer->i_pts = p_buffer->i_length = 0; return p_buffer; } @@ -304,17 +300,19 @@ int aout_DecPlay( aout_instance_t * p_aout, aout_input_t * p_input, assert( i_input_rate >= INPUT_RATE_DEFAULT / AOUT_MAX_INPUT_RATE && i_input_rate <= INPUT_RATE_DEFAULT * AOUT_MAX_INPUT_RATE ); - assert( p_buffer->start_date > 0 ); + assert( p_buffer->i_pts > 0 ); - p_buffer->end_date = p_buffer->start_date - + (mtime_t)p_buffer->i_nb_samples * 1000000 + p_buffer->i_length = (mtime_t)p_buffer->i_nb_samples * 1000000 / p_input->input.i_rate; + aout_lock_mixer( p_aout ); aout_lock_input( p_aout, p_input ); if( p_input->b_error ) { aout_unlock_input( p_aout, p_input ); + aout_unlock_mixer( p_aout ); + aout_BufferFree( p_buffer ); return -1; } @@ -328,16 +326,19 @@ int aout_DecPlay( aout_instance_t * p_aout, aout_input_t * p_input, p_new_buffer = aout_BufferAlloc( &p_input->input_alloc, duration, NULL); vlc_memcpy( p_new_buffer->p_buffer, p_buffer->p_buffer, - p_buffer->i_nb_bytes ); + p_buffer->i_buffer ); p_new_buffer->i_nb_samples = p_buffer->i_nb_samples; - p_new_buffer->i_nb_bytes = p_buffer->i_nb_bytes; - p_new_buffer->start_date = p_buffer->start_date; - p_new_buffer->end_date = p_buffer->end_date; + p_new_buffer->i_buffer = p_buffer->i_buffer; + p_new_buffer->i_pts = p_buffer->i_pts; + p_new_buffer->i_length = p_buffer->i_length; aout_BufferFree( p_buffer ); p_buffer = p_new_buffer; p_input->b_changed = false; } + aout_InputCheckAndRestart( p_aout, p_input ); + aout_unlock_mixer( p_aout ); + int i_ret = aout_InputPlay( p_aout, p_input, p_buffer, i_input_rate ); aout_unlock_input( p_aout, p_input ); @@ -383,8 +384,7 @@ void aout_DecChangePause( aout_instance_t *p_aout, aout_input_t *p_input, bool b aout_lock_mixer( p_aout ); for( aout_buffer_t *p = p_input->mixer.fifo.p_first; p != NULL; p = p->p_next ) { - p->start_date += i_duration; - p->end_date += i_duration; + p->i_pts += i_duration; } aout_unlock_mixer( p_aout ); }