Fix T56905: unsupported channel layout error writing AAC audio.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 28 Sep 2018 10:03:15 +0000 (12:03 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 28 Sep 2018 10:07:05 +0000 (12:07 +0200)
This uses same mapping as Audaspace to specify channel layout, which was
missing before.

source/blender/blenkernel/intern/writeffmpeg.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_scene.c

index 2bee16a..68083b4 100644 (file)
@@ -736,6 +736,26 @@ static AVStream *alloc_audio_stream(FFMpegContext *context, RenderData *rd, int
        c->sample_fmt = AV_SAMPLE_FMT_S16;
        c->channels = rd->ffcodecdata.audio_channels;
 
+#ifdef FFMPEG_HAVE_FRAME_CHANNEL_LAYOUT
+       switch (rd->ffcodecdata.audio_channels) {
+               case FFM_CHANNELS_MONO:
+                       c->channel_layout = AV_CH_LAYOUT_MONO;
+                       break;
+               case FFM_CHANNELS_STEREO:
+                       c->channel_layout = AV_CH_LAYOUT_STEREO;
+                       break;
+               case FFM_CHANNELS_SURROUND4:
+                       c->channel_layout = AV_CH_LAYOUT_QUAD;
+                       break;
+               case FFM_CHANNELS_SURROUND51:
+                       c->channel_layout = AV_CH_LAYOUT_5POINT1_BACK;
+                       break;
+               case FFM_CHANNELS_SURROUND71:
+                       c->channel_layout = AV_CH_LAYOUT_7POINT1;
+                       break;
+       }
+#endif
+
        if (request_float_audio_buffer(codec_id)) {
                /* mainly for AAC codec which is experimental */
                c->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
index 505b89f..c7bba86 100644 (file)
@@ -141,6 +141,14 @@ typedef enum eFFMpegCrf {
        FFM_CRF_LOWEST = 32,
 } eFFMpegCrf;
 
+typedef enum eFFMpegAudioChannels {
+       FFM_CHANNELS_MONO = 1,
+       FFM_CHANNELS_STEREO = 2,
+       FFM_CHANNELS_SURROUND4 = 4,
+       FFM_CHANNELS_SURROUND51 = 6,
+       FFM_CHANNELS_SURROUND71 = 8,
+} eFFMpegAudioChannels;
+
 typedef struct FFMpegCodecData {
        int type;
        int codec;
index 3c8cc9e..d6c45fd 100644 (file)
@@ -5498,11 +5498,11 @@ static void rna_def_scene_ffmpeg_settings(BlenderRNA *brna)
 #endif
 
        static const EnumPropertyItem audio_channel_items[] = {
-               {1, "MONO", 0, "Mono", "Set audio channels to mono"},
-               {2, "STEREO", 0, "Stereo", "Set audio channels to stereo"},
-               {4, "SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels"},
-               {6, "SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound"},
-               {8, "SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound"},
+               {FFM_CHANNELS_MONO, "MONO", 0, "Mono", "Set audio channels to mono"},
+               {FFM_CHANNELS_STEREO, "STEREO", 0, "Stereo", "Set audio channels to stereo"},
+               {FFM_CHANNELS_SURROUND4, "SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels"},
+               {FFM_CHANNELS_SURROUND51, "SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound"},
+               {FFM_CHANNELS_SURROUND71, "SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound"},
                {0, NULL, 0, NULL, NULL}
        };