aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2009-04-19 14:05:55 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2009-04-19 14:05:55 +0000
commitbe233a569165ad39a63ff2137763a123cd4f2562 (patch)
treee4445370847f8297dad61cf77ed50443cae64fa1
parentdc1ed614328edaf05745925392a2765c0ed49c92 (diff)
downloadffmpeg-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.c2
-rw-r--r--libavcodec/audioconvert.c9
-rw-r--r--libavcodec/audioconvert.h4
3 files changed, 15 insertions, 0 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 200d57dfef..c050512ae2 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -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;