mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-10-12 02:09:17 +00:00
recording: support AV_SAMPLE_FMT_FLT
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user