瀏覽代碼

libobs: Allow encoders to request unclamped audio mix

This is useful for formats such as 32-bit float PCM which providers
greater flexibility in editing by retaining information that would
otherwise be clipped.
derrod 2 年之前
父節點
當前提交
dcee4fc61a
共有 2 個文件被更改,包括 9 次插入1 次删除
  1. 8 1
      libobs/media-io/audio-io.c
  2. 1 0
      libobs/media-io/audio-io.h

+ 8 - 1
libobs/media-io/audio-io.c

@@ -59,6 +59,7 @@ static inline void audio_input_free(struct audio_input *input)
 struct audio_mix {
 	DARRAY(struct audio_input) inputs;
 	float buffer[MAX_AUDIO_CHANNELS][AUDIO_OUTPUT_FRAMES];
+	float buffer_unclamped[MAX_AUDIO_CHANNELS][AUDIO_OUTPUT_FRAMES];
 };
 
 struct audio_output {
@@ -116,8 +117,12 @@ static inline void do_audio_output(struct audio_output *audio, size_t mix_idx,
 	for (size_t i = mix->inputs.num; i > 0; i--) {
 		struct audio_input *input = mix->inputs.array + (i - 1);
 
+		float(*buf)[AUDIO_OUTPUT_FRAMES] =
+			input->conversion.allow_clipping ? mix->buffer_unclamped
+							 : mix->buffer;
 		for (size_t i = 0; i < audio->planes; i++)
-			data.data[i] = (uint8_t *)mix->buffer[i];
+			data.data[i] = (uint8_t *)buf[i];
+
 		data.frames = frames;
 		data.timestamp = timestamp;
 
@@ -142,6 +147,8 @@ static inline void clamp_audio_output(struct audio_output *audio, size_t bytes)
 		for (size_t plane = 0; plane < audio->planes; plane++) {
 			float *mix_data = mix->buffer[plane];
 			float *mix_end = &mix_data[float_size];
+			/* Unclamped mix is copied directly. */
+			memcpy(mix->buffer_unclamped[plane], mix_data, bytes);
 
 			while (mix_data < mix_end) {
 				float val = *mix_data;

+ 1 - 0
libobs/media-io/audio-io.h

@@ -105,6 +105,7 @@ struct audio_convert_info {
 	uint32_t samples_per_sec;
 	enum audio_format format;
 	enum speaker_layout speakers;
+	bool allow_clipping;
 };
 
 static inline uint32_t get_audio_channels(enum speaker_layout speakers)