Просмотр исходного кода

coreaudio-encoder: Fix encoding of 4.0 speaker layout

For four channels, coreaudio encoder defaults to quad
(FL FR, BL BR).
So 4.0 needs to be explicitly set for the encoder.
pkv 5 лет назад
Родитель
Сommit
2ab549e1c1
2 измененных файлов с 39 добавлено и 1 удалено
  1. 21 1
      plugins/coreaudio-encoder/encoder.cpp
  2. 18 0
      plugins/coreaudio-encoder/windows-imports.h

+ 21 - 1
plugins/coreaudio-encoder/encoder.cpp

@@ -597,14 +597,34 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
 
 	/*
 	 * Fix channel map differences between CoreAudio AAC, FFmpeg, Wav
-	 * New channel mappings below assume 2.1, 4.1, 5.1, 7.1 resp.
+	 * New channel mappings below assume 2.1, 4.0, 4.1, 5.1, 7.1 resp.
 	 */
+
 	if (ca->channels == 3) {
 		SInt32 channelMap3[3] = {2, 0, 1};
 		AudioConverterSetProperty(ca->converter,
 					  kAudioConverterChannelMap,
 					  sizeof(channelMap3), channelMap3);
 
+	} else if (ca->channels == 4) {
+		/*
+		 * For four channels coreaudio encoder has default channel "quad"
+		 * instead of 4.0. So explicitly set channel layout to
+		 * kAudioChannelLayoutTag_MPEG_4_0_B = (116L << 16) | 4.
+		 */
+		AudioChannelLayout inAcl = {0};
+		inAcl.mChannelLayoutTag = (116L << 16) | 4;
+		AudioConverterSetProperty(ca->converter,
+					  kAudioConverterInputChannelLayout,
+					  sizeof(inAcl), &inAcl);
+		AudioConverterSetProperty(ca->converter,
+					  kAudioConverterOutputChannelLayout,
+					  sizeof(inAcl), &inAcl);
+		SInt32 channelMap4[4] = {2, 0, 1, 3};
+		AudioConverterSetProperty(ca->converter,
+					  kAudioConverterChannelMap,
+					  sizeof(channelMap4), channelMap4);
+
 	} else if (ca->channels == 5) {
 		SInt32 channelMap5[5] = {2, 0, 1, 3, 4};
 		AudioConverterSetProperty(ca->converter,

+ 18 - 0
plugins/coreaudio-encoder/windows-imports.h

@@ -61,6 +61,24 @@ struct AudioStreamPacketDescription {
 };
 typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;
 
+typedef UInt32 AudioChannelLabel;
+typedef UInt32 AudioChannelLayoutTag;
+
+struct AudioChannelDescription {
+	AudioChannelLabel mChannelLabel;
+	UInt32 mChannelFlags;
+	float mCoordinates[3];
+};
+typedef struct AudioChannelDescription AudioChannelDescription;
+
+struct AudioChannelLayout {
+	AudioChannelLayoutTag mChannelLayoutTag;
+	UInt32 mChannelBitmap;
+	UInt32 mNumberChannelDescriptions;
+	AudioChannelDescription mChannelDescriptions[kVariableLengthArray];
+};
+typedef struct AudioChannelLayout AudioChannelLayout;
+
 typedef OSStatus (*AudioConverterComplexInputDataProc)(
 	AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets,
 	AudioBufferList *ioData,