Browse Source

obs-ffmpeg: Add unclamped 32-bit floating point PCM encoder

derrod 2 years ago
parent
commit
1a51aad582

+ 1 - 0
plugins/obs-ffmpeg/data/locale/en-US.ini

@@ -5,6 +5,7 @@ FFmpegALAC="FFmpeg ALAC (24-bit)"
 FFmpegFLAC="FFmpeg FLAC (16-bit)"
 FFmpegPCM16Bit="FFmpeg PCM (16-bit)"
 FFmpegPCM24Bit="FFmpeg PCM (24-bit)"
+FFmpegPCM32BitFloat="FFmpeg PCM (32-bit float)"
 FFmpegOpts="FFmpeg Options"
 FFmpegOpts.ToolTip.Source="Allows you to set FFmpeg options. This only accepts options in the option=value format.\nMultiple options can be set by separating them with a space.\nExample: rtsp_transport=tcp rtsp_flags=prefer_tcp"
 Bitrate="Bitrate"

+ 32 - 0
plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c

@@ -107,6 +107,12 @@ static const char *pcm24_getname(void *unused)
 	return obs_module_text("FFmpegPCM24Bit");
 }
 
+static const char *pcm32_getname(void *unused)
+{
+	UNUSED_PARAMETER(unused);
+	return obs_module_text("FFmpegPCM32BitFloat");
+}
+
 static const char *alac_getname(void *unused)
 {
 	UNUSED_PARAMETER(unused);
@@ -347,6 +353,11 @@ static void *pcm24_create(obs_data_t *settings, obs_encoder_t *encoder)
 	return enc_create(settings, encoder, "pcm_s24le", NULL);
 }
 
+static void *pcm32_create(obs_data_t *settings, obs_encoder_t *encoder)
+{
+	return enc_create(settings, encoder, "pcm_f32le", NULL);
+}
+
 static void *alac_create(obs_data_t *settings, obs_encoder_t *encoder)
 {
 	return enc_create(settings, encoder, "alac", NULL);
@@ -475,6 +486,12 @@ static void enc_audio_info(void *data, struct audio_convert_info *info)
 		info->speakers = SPEAKERS_UNKNOWN;
 }
 
+static void enc_audio_info_float(void *data, struct audio_convert_info *info)
+{
+	enc_audio_info(data, info);
+	info->allow_clipping = true;
+}
+
 static size_t enc_frame_size(void *data)
 {
 	struct enc_encoder *enc = data;
@@ -541,6 +558,21 @@ struct obs_encoder_info pcm24_encoder_info = {
 	.get_audio_info = enc_audio_info,
 };
 
+struct obs_encoder_info pcm32_encoder_info = {
+	.id = "ffmpeg_pcm_f32le",
+	.type = OBS_ENCODER_AUDIO,
+	.codec = "pcm_f32le",
+	.get_name = pcm32_getname,
+	.create = pcm32_create,
+	.destroy = enc_destroy,
+	.encode = enc_encode,
+	.get_frame_size = enc_frame_size,
+	.get_defaults = enc_defaults,
+	.get_properties = enc_properties,
+	.get_extra_data = enc_extra_data,
+	.get_audio_info = enc_audio_info_float,
+};
+
 struct obs_encoder_info alac_encoder_info = {
 	.id = "ffmpeg_alac",
 	.type = OBS_ENCODER_AUDIO,

+ 2 - 0
plugins/obs-ffmpeg/obs-ffmpeg.c

@@ -38,6 +38,7 @@ extern struct obs_encoder_info aac_encoder_info;
 extern struct obs_encoder_info opus_encoder_info;
 extern struct obs_encoder_info pcm_encoder_info;
 extern struct obs_encoder_info pcm24_encoder_info;
+extern struct obs_encoder_info pcm32_encoder_info;
 extern struct obs_encoder_info alac_encoder_info;
 extern struct obs_encoder_info flac_encoder_info;
 extern struct obs_encoder_info h264_nvenc_encoder_info;
@@ -393,6 +394,7 @@ bool obs_module_load(void)
 	obs_register_encoder(&opus_encoder_info);
 	obs_register_encoder(&pcm_encoder_info);
 	obs_register_encoder(&pcm24_encoder_info);
+	obs_register_encoder(&pcm32_encoder_info);
 	obs_register_encoder(&alac_encoder_info);
 	obs_register_encoder(&flac_encoder_info);
 #ifndef __APPLE__