diff options
Diffstat (limited to 'libhb/hb.c')
-rw-r--r-- | libhb/hb.c | 124 |
1 files changed, 38 insertions, 86 deletions
diff --git a/libhb/hb.c b/libhb/hb.c index 64c03b3c4..0d881b888 100644 --- a/libhb/hb.c +++ b/libhb/hb.c @@ -203,94 +203,46 @@ hb_sws_get_context(int srcW, int srcH, enum PixelFormat srcFormat, return ctx; } -int hb_ff_layout_xlat( int64_t ff_channel_layout, int channels ) +uint64_t hb_ff_layout_xlat(uint64_t ff_channel_layout, int nchannels) { - int hb_layout; - - switch( ff_channel_layout ) + uint64_t hb_layout = ff_channel_layout; + if (!hb_layout || + av_get_channel_layout_nb_channels(hb_layout) != nchannels) { - case AV_CH_LAYOUT_MONO: - hb_layout = HB_INPUT_CH_LAYOUT_MONO; - break; - case AV_CH_LAYOUT_STEREO: - case AV_CH_LAYOUT_STEREO_DOWNMIX: - hb_layout = HB_INPUT_CH_LAYOUT_STEREO; - break; - case AV_CH_LAYOUT_SURROUND: - hb_layout = HB_INPUT_CH_LAYOUT_3F; - break; - case AV_CH_LAYOUT_4POINT0: - hb_layout = HB_INPUT_CH_LAYOUT_3F1R; - break; - case AV_CH_LAYOUT_2_2: - case AV_CH_LAYOUT_QUAD: - hb_layout = HB_INPUT_CH_LAYOUT_2F2R; - break; - case AV_CH_LAYOUT_5POINT0: - case AV_CH_LAYOUT_5POINT0_BACK: - hb_layout = HB_INPUT_CH_LAYOUT_3F2R; - break; - case AV_CH_LAYOUT_5POINT1: - case AV_CH_LAYOUT_5POINT1_BACK: - hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE; - break; - case AV_CH_LAYOUT_7POINT0: - hb_layout = HB_INPUT_CH_LAYOUT_3F4R; - break; - case AV_CH_LAYOUT_7POINT1: - hb_layout = HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE; - 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( ff_channel_layout && chans == channels ) - { - return hb_layout; - } - if( !ff_channel_layout ) - { - hb_log( "No channel layout reported by Libav; guessing one from channel count." ); - } - else - { - hb_log( "Channels reported by Libav (%d) != computed layout channels (%d). Guessing layout from channel count.", 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: - hb_log( "Unsupported number of audio channels (%d).", channels ); - hb_layout = 0; - break; + switch (nchannels) + { + // TODO: use av_get_default_channel_layout when available + case 1: + hb_layout = AV_CH_LAYOUT_MONO; + break; + case 2: + hb_layout = AV_CH_LAYOUT_STEREO; + break; + case 3: + hb_layout = AV_CH_LAYOUT_SURROUND; + break; + case 4: + hb_layout = AV_CH_LAYOUT_QUAD; + break; + case 5: + hb_layout = AV_CH_LAYOUT_5POINT0; + break; + case 6: + hb_layout = AV_CH_LAYOUT_5POINT1; + break; + case 7: + hb_layout = AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER; + break; + case 8: + hb_layout = AV_CH_LAYOUT_7POINT1; + break; + default: + // This will likely not sound very good ;) + hb_layout = AV_CH_LAYOUT_STEREO; + hb_error("hb_ff_layout_xlat: unsupported layout 0x%"PRIx64" with %d channels", + ff_channel_layout, nchannels); + break; + } } return hb_layout; } |