recording: support AV_SAMPLE_FMT_FLT

This commit is contained in:
Megamouse
2026-08-02 23:46:45 +02:00
parent 9d91ba6168
commit 401cc4ae8f
2 changed files with 38 additions and 2 deletions
+37 -2
View File
@@ -409,6 +409,40 @@ namespace utils
return best_sample_rate;
}
static int select_sample_format(const AVCodec* codec)
{
constexpr AVSampleFormat default_sample_format = AV_SAMPLE_FMT_FLTP;
if (!codec)
return default_sample_format;
const void* sample_formats = nullptr;
int num = 0;
if (const int err = avcodec_get_supported_config(nullptr, codec, AVCodecConfig::AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, &sample_formats, &num))
{
media_log.error("select_sample_format: avcodec_get_supported_config error: %d='%s'", err, av_error_to_string(err));
return default_sample_format;
}
if (!sample_formats)
return default_sample_format;
int i = 0;
std::set<AVSampleFormat> formats;
for (const AVSampleFormat* sample_format = static_cast<const AVSampleFormat*>(sample_formats); sample_format && *sample_format != AV_SAMPLE_FMT_NONE && i < num; sample_format++, i++)
{
media_log.notice("select_sample_format: found sample format: '%s'", av_get_sample_fmt_name(*sample_format));
formats.insert(*sample_format);
}
if (formats.contains(AV_SAMPLE_FMT_FLT)) return AV_SAMPLE_FMT_FLT;
if (formats.contains(AV_SAMPLE_FMT_FLTP)) return AV_SAMPLE_FMT_FLTP;
media_log.warning("select_sample_format: using default sample format: '%s'", av_get_sample_fmt_name(default_sample_format));
return default_sample_format;
}
AVChannelLayout get_preferred_channel_layout(int channels)
{
switch (channels)
@@ -1148,13 +1182,14 @@ namespace utils
}
m_sample_rate = select_sample_rate(av.audio.codec);
m_sample_format = select_sample_format(av.audio.codec);
av.audio.context->codec_id = av.format_context->oformat->audio_codec;
av.audio.context->codec_type = AVMEDIA_TYPE_AUDIO;
av.audio.context->bit_rate = m_audio_bitrate_bps;
av.audio.context->sample_rate = m_sample_rate;
av.audio.context->time_base = {.num = 1, .den = av.audio.context->sample_rate};
av.audio.context->sample_fmt = AV_SAMPLE_FMT_FLTP; // AV_SAMPLE_FMT_FLT is not supported in regular AC3
av.audio.context->sample_fmt = static_cast<AVSampleFormat>(m_sample_format);
av.audio.stream->time_base = av.audio.context->time_base;
// check that the encoder supports the format
@@ -1186,7 +1221,7 @@ namespace utils
return;
}
av.audio.frame->format = AV_SAMPLE_FMT_FLTP;
av.audio.frame->format = static_cast<AVSampleFormat>(m_sample_format);
av.audio.frame->nb_samples = av.audio.context->frame_size;
if (int err = av_channel_layout_copy(&av.audio.frame->ch_layout, &av.audio.context->ch_layout); err < 0)
+1
View File
@@ -111,6 +111,7 @@ namespace utils
atomic_t<bool> m_flush = false;
u32 m_framerate = 30;
u32 m_sample_rate = 48000;
s32 m_sample_format = -1;
static constexpr u32 m_samples_per_block = 256;
};
}