diff options
author | jstebbins <[email protected]> | 2010-04-24 17:36:07 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2010-04-24 17:36:07 +0000 |
commit | 8d7bf485002a1d9358254632f13be1f392d2ba81 (patch) | |
tree | 362e54689f86d0df32a65b8254f132ffe71e1780 /libhb/hb.c | |
parent | a5687f98414788475d8ba26ca6db176b0b2c5a4a (diff) |
add test to ensure that ffmpeg's reported audio layout agrees with channel count
a crash report from a user leads me to believe ffmpeg is giving us
a channel layout that has a different number of channels than the
channel count it tells us.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3260 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/hb.c')
-rw-r--r-- | libhb/hb.c | 96 |
1 files changed, 72 insertions, 24 deletions
diff --git a/libhb/hb.c b/libhb/hb.c index 30fce039c..1a725659e 100644 --- a/libhb/hb.c +++ b/libhb/hb.c @@ -86,47 +86,95 @@ int hb_avcodec_close(AVCodecContext *avctx) int hb_ff_layout_xlat(int64_t ff_channel_layout, int channels) { + int hb_layout; + switch (ff_channel_layout) { case CH_LAYOUT_MONO: - return HB_INPUT_CH_LAYOUT_MONO; + hb_layout = HB_INPUT_CH_LAYOUT_MONO; + break; case CH_LAYOUT_STEREO: - return HB_INPUT_CH_LAYOUT_STEREO; + hb_layout = HB_INPUT_CH_LAYOUT_STEREO; + break; case CH_LAYOUT_SURROUND: - return HB_INPUT_CH_LAYOUT_3F; + hb_layout = HB_INPUT_CH_LAYOUT_3F; + break; case CH_LAYOUT_4POINT0: - return HB_INPUT_CH_LAYOUT_3F1R; + hb_layout = HB_INPUT_CH_LAYOUT_3F1R; + break; case CH_LAYOUT_2_2: - return HB_INPUT_CH_LAYOUT_2F2R; + hb_layout = HB_INPUT_CH_LAYOUT_2F2R; + break; case CH_LAYOUT_QUAD: - return HB_INPUT_CH_LAYOUT_2F2R; + hb_layout = HB_INPUT_CH_LAYOUT_2F2R; + break; case CH_LAYOUT_5POINT0: - // ffmpeg like to neglect to signal LFE - if (channels == 6) - return HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; - return HB_INPUT_CH_LAYOUT_3F2R; + hb_layout = HB_INPUT_CH_LAYOUT_3F2R; + break; case CH_LAYOUT_5POINT1: - return HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; + hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; + break; case CH_LAYOUT_5POINT0_BACK: - // ffmpeg like to neglect to signal LFE - if (channels == 6) - return HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; - return HB_INPUT_CH_LAYOUT_3F2R; + hb_layout = HB_INPUT_CH_LAYOUT_3F2R; + break; case CH_LAYOUT_5POINT1_BACK: - return HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; + hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; + break; case CH_LAYOUT_7POINT0: - // ffmpeg like to neglect to signal LFE - if (channels == 8) - return HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE; - return HB_INPUT_CH_LAYOUT_3F4R; + hb_layout = HB_INPUT_CH_LAYOUT_3F4R; + break; case CH_LAYOUT_7POINT1: - return HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE; + hb_layout = HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE; + break; case CH_LAYOUT_STEREO_DOWNMIX: - return HB_INPUT_CH_LAYOUT_STEREO; + hb_layout = HB_INPUT_CH_LAYOUT_STEREO; + break; + default: + hb_layout = HB_INPUT_CH_LAYOUT_STEREO; + break; + } + // Now make sure the chosen layout agrees with the number of channels + // ffmpeg tells us there are. It seems ffmpeg is sometimes confused + // about this. So we will make a best guess based on the number + // of channels. + int chans = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT( hb_layout ); + if ( chans == channels ) + { + return hb_layout; + } + hb_log( "Channels reported by ffmpeg (%d) != computed layout channels (%d).\n", channels, chans ); + switch (channels) + { + case 1: + hb_layout = HB_INPUT_CH_LAYOUT_MONO; + break; + case 2: + hb_layout = HB_INPUT_CH_LAYOUT_STEREO; + break; + case 3: + hb_layout = HB_INPUT_CH_LAYOUT_3F; + break; + case 4: + hb_layout = HB_INPUT_CH_LAYOUT_3F1R; + break; + case 5: + hb_layout = HB_INPUT_CH_LAYOUT_3F2R; + break; + case 6: + hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; + break; + case 7: + hb_layout = HB_INPUT_CH_LAYOUT_3F4R; + break; + case 8: + hb_layout = HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE; + break; default: - return HB_INPUT_CH_LAYOUT_STEREO; + hb_log("Unsupported number of audio channels (%d).\n", channels); + hb_layout = 0; + break; } - return HB_INPUT_CH_LAYOUT_STEREO; + return hb_layout; } /** |