From d4ec9513dc3cee764d5d3bc03c3b6ea95cdaaaaf Mon Sep 17 00:00:00 2001 From: jstebbins Date: Mon, 28 Oct 2013 23:44:52 +0000 Subject: libhb: fix BD audio detection problem BDs can (and occasionally do) have different audio stream types in different clips that compose a playlist. We try to pick the audios that appear in the most clips, but this breaks down when there are only 2 clips to choose from. So in the case of only 2 clips, choose audio from the longest clip. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5863 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- libhb/bd.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'libhb') diff --git a/libhb/bd.c b/libhb/bd.c index df7f3d492..4251d0403 100644 --- a/libhb/bd.c +++ b/libhb/bd.c @@ -385,30 +385,39 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration ) hb_log( "bd: aspect = %g", title->container_aspect ); /* Detect audio */ - // All BD clips are not all required to have the same audio. - // But clips that have seamless transition are required - // to have the same audio as the previous clip. - // So find the clip that has the most other clips with the - // matching audio. // Max primary BD audios is 32 int matches; int most_audio = 0; int audio_clip_index = 0; - for ( ii = 0; ii < ti->clip_count; ii++ ) + if (ti->clip_count > 2) { - matches = 0; - for ( jj = 0; jj < ti->clip_count; jj++ ) + // All BD clips are not all required to have the same audio. + // But clips that have seamless transition are required + // to have the same audio as the previous clip. + // So find the clip that has the most other clips with the + // matching audio. + for ( ii = 0; ii < ti->clip_count; ii++ ) { - if ( bd_audio_equal( &ti->clips[ii], &ti->clips[jj] ) ) + matches = 0; + for ( jj = 0; jj < ti->clip_count; jj++ ) { - matches++; + if ( bd_audio_equal( &ti->clips[ii], &ti->clips[jj] ) ) + { + matches++; + } + } + if ( matches > most_audio ) + { + most_audio = matches; + audio_clip_index = ii; } } - if ( matches > most_audio ) - { - most_audio = matches; - audio_clip_index = ii; - } + } + else if (ti->clip_count == 2) + { + // If there are only 2 clips, pick audios from the longer clip + if (ti->clips[0].pkt_count < ti->clips[1].pkt_count) + audio_clip_index = 1; } // Add all the audios found in the above clip. -- cgit v1.2.3