Browse Source

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

Justin Ruggles 16 years ago
parent
commit
be233a5691
3 changed files with 15 additions and 0 deletions
  1. 2 0
      ffmpeg.c
  2. 9 0
      libavcodec/audioconvert.c
  3. 4 0
      libavcodec/audioconvert.h

+ 2 - 0
ffmpeg.c

@@ -3212,6 +3212,8 @@ static void new_audio_stream(AVFormatContext *oc)
         audio_enc->channels = audio_channels;
         audio_enc->channels = audio_channels;
         audio_enc->sample_fmt = audio_sample_fmt;
         audio_enc->sample_fmt = audio_sample_fmt;
         audio_enc->channel_layout = channel_layout;
         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){
         if(codec && codec->sample_fmts){
             const enum SampleFormat *p= codec->sample_fmts;
             const enum SampleFormat *p= codec->sample_fmts;

+ 9 - 0
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 {
 struct AVAudioConvert {
     int in_channels, out_channels;
     int in_channels, out_channels;
     int fmt_pair;
     int fmt_pair;

+ 4 - 0
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);
 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;
 struct AVAudioConvert;
 typedef struct AVAudioConvert AVAudioConvert;
 typedef struct AVAudioConvert AVAudioConvert;