diff options
author | titer <[email protected]> | 2006-02-23 14:37:47 +0000 |
---|---|---|
committer | titer <[email protected]> | 2006-02-23 14:37:47 +0000 |
commit | d361af3d7e5f914069e0b5ce49a97b9f97faca95 (patch) | |
tree | 16579f538531a32b8384f914ac536e8cbb962f0d /libhb | |
parent | df70394f44cafec40e756803cb9544757add4e17 (diff) |
Softer resampling when audio dates are messed up (fix for LPCM issues).
Disabled verbose in the OS X UI
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@30 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r-- | libhb/declpcm.c | 23 | ||||
-rw-r--r-- | libhb/sync.c | 29 |
2 files changed, 15 insertions, 37 deletions
diff --git a/libhb/declpcm.c b/libhb/declpcm.c index 59163c366..5b9d5a3b6 100644 --- a/libhb/declpcm.c +++ b/libhb/declpcm.c @@ -12,8 +12,6 @@ struct hb_work_object_s hb_job_t * job; hb_audio_t * audio; - - int64_t pts_last; }; static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, @@ -51,22 +49,11 @@ static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, break; } - count = ( in->size - 6 ) / 2; - out = hb_buffer_init( count * sizeof( float ) ); - duration = count * 90000 / samplerate / 2; - if( w->pts_last > 0 && - in->start < w->pts_last + duration / 6 && - in->start > w->pts_last - duration / 6 ) - { - /* Workaround for DVDs where dates aren't exact */ - out->start = w->pts_last; - } - else - { - out->start = in->start; - } + count = ( in->size - 6 ) / 2; + out = hb_buffer_init( count * sizeof( float ) ); + duration = count * 90000 / samplerate / 2; + out->start = in->start; out->stop = out->start + duration; - w->pts_last = out->stop; samples_u8 = in->data + 6; samples_fl32 = (float *) out->data; @@ -106,8 +93,6 @@ hb_work_object_t * hb_work_declpcm_init( hb_job_t * job, hb_audio_t * audio ) w->job = job; w->audio = audio; - w->pts_last = -1; - return w; } diff --git a/libhb/sync.c b/libhb/sync.c index 32ddb52b7..61e567bbc 100644 --- a/libhb/sync.c +++ b/libhb/sync.c @@ -465,17 +465,18 @@ static void SyncAudio( hb_work_object_t * w, int i ) start = pts_expected - w->pts_offset; } - if( ( buf->start + buf->stop ) / 2 < pts_expected ) + /* Tolerance: 100 ms */ + if( buf->start < pts_expected - 9000 ) { /* Late audio, trash it */ + hb_log( "sync: trashing late audio" ); buf = hb_fifo_get( audio->fifo_raw ); hb_buffer_close( &buf ); continue; } - - if( buf->start > pts_expected + ( buf->stop - buf->start ) / 2 ) + else if( buf->start > pts_expected + 9000 ) { - /* Audio push, send a frame of silence */ + /* Missing audio, send a frame of silence */ InsertSilence( w, i ); continue; } @@ -495,24 +496,16 @@ static void SyncAudio( hb_work_object_t * w, int i ) int count_in, count_out; count_in = buf_raw->size / 2 / sizeof( float ); - count_out = ( buf->stop - pts_expected ) * job->arate / 90000; + count_out = ( buf_raw->stop - buf_raw->start ) * job->arate / 90000; + if( buf->start < pts_expected - 1500 ) + count_out--; + else if( buf->start > pts_expected + 1500 ) + count_out++; sync->data.data_in = (float *) buf_raw->data; sync->data.input_frames = count_in; - - if( buf->start < pts_expected - ( buf->stop - buf->start ) / 5 ) - { - /* Avoid too heavy downsampling, trash the beginning of - the buffer instead */ - int drop; - drop = count_in * ( pts_expected - buf->start ) / - ( buf->stop - buf->start ); - sync->data.data_in += 2 * drop; - sync->data.input_frames -= drop; - hb_log( "dropping %d of %d samples", drop, count_in ); - } - sync->data.output_frames = count_out; + sync->data.src_ratio = (double) sync->data.output_frames / (double) sync->data.input_frames; |