diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2009-04-19 14:05:55 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2009-04-19 14:05:55 +0000 |
commit | be233a569165ad39a63ff2137763a123cd4f2562 (patch) | |
tree | e4445370847f8297dad61cf77ed50443cae64fa1 | |
parent | dc1ed614328edaf05745925392a2765c0ed49c92 (diff) | |
download | ffmpeg-be233a569165ad39a63ff2137763a123cd4f2562.tar.gz |
Check that channel layout is compatible with number of channels for
output audio stream.
Originally committed as revision 18621 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | ffmpeg.c | 2 | ||||
-rw-r--r-- | libavcodec/audioconvert.c | 9 | ||||
-rw-r--r-- | libavcodec/audioconvert.h | 4 |
3 files changed, 15 insertions, 0 deletions
@@ -3212,6 +3212,8 @@ static void new_audio_stream(AVFormatContext *oc) audio_enc->channels = audio_channels; audio_enc->sample_fmt = audio_sample_fmt; audio_enc->channel_layout = channel_layout; + if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels) + audio_enc->channel_layout = 0; if(codec && codec->sample_fmts){ const enum SampleFormat *p= codec->sample_fmts; diff --git a/libavcodec/audioconvert.c b/libavcodec/audioconvert.c index b0a8afacb4..5842801093 100644 --- a/libavcodec/audioconvert.c +++ b/libavcodec/audioconvert.c @@ -153,6 +153,15 @@ void avcodec_get_channel_layout_string(char *buf, int buf_size, int nb_channels, } } +int avcodec_channel_layout_num_channels(int64_t channel_layout) +{ + int count; + uint64_t x = channel_layout; + for (count = 0; x; count++) + x &= x-1; // unset lowest set bit + return count; +} + struct AVAudioConvert { int in_channels, out_channels; int fmt_pair; diff --git a/libavcodec/audioconvert.h b/libavcodec/audioconvert.h index 157bd44e21..46ba3d3929 100644 --- a/libavcodec/audioconvert.h +++ b/libavcodec/audioconvert.h @@ -73,6 +73,10 @@ void avcodec_get_channel_layout_string(char *buf, int buf_size, int nb_channels, */ int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name); +/** + * @return the number of channels in the channel layout. + */ +int avcodec_channel_layout_num_channels(int64_t channel_layout); struct AVAudioConvert; typedef struct AVAudioConvert AVAudioConvert; |