[FFmpeg-devel] [PATCH]Warn if vorbis files with wrong channel layout are encoded

Carl Eugen Hoyos cehoyos at ag.or.at
Thu Apr 14 21:18:44 CEST 2011


Hi!

I'm going to commit if nobody objects, but I'd be happy if somebody from the 
language police comments. (I prefer AV_LOG_ERROR because the resulting streams 
are mostly unusable.)

Carl Eugen
-------------- next part --------------
diff --git a/libavcodec/libvorbis.c b/libavcodec/libvorbis.c
index 9324b28..acbaa8c 100644
--- a/libavcodec/libvorbis.c
+++ b/libavcodec/libvorbis.c
@@ -96,6 +96,32 @@ static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avcco
         vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &context->iblock);
     }
 
+    if (avccontext->channels == 3 &&
+            avccontext->channel_layout != (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) ||
+        avccontext->channels == 4 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_2_2 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_QUAD ||
+        avccontext->channels == 5 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_5POINT0 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_5POINT0_BACK ||
+        avccontext->channels == 6 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_5POINT1 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_5POINT1_BACK ||
+        avccontext->channels == 7 &&
+            avccontext->channel_layout != (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) ||
+        avccontext->channels == 8 &&
+            avccontext->channel_layout != AV_CH_LAYOUT_7POINT1) {
+        if (avccontext->channel_layout) {
+            av_log(avccontext, AV_LOG_ERROR, "Channel layout not supported by Vorbis, "
+                                             "output stream will have incorrect "
+                                             "channel layout.\n");
+        } else {
+            av_log(avccontext, AV_LOG_WARNING, "No channel layout specified. The encoder "
+                                               "will use Vorbis channel layout for "
+                                               "%d channels.\n", avccontext->channels);
+        }
+    }
+
     return vorbis_encode_setup_init(vi);
 }
 


More information about the ffmpeg-devel mailing list