diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index cfe0b6acd0..b2a9e2038a 100644 --- record/drivers/record_ffmpeg.c +++ record/drivers/record_ffmpeg.c @@ -226,28 +226,30 @@ static void ffmpeg_audio_resolve_format(struct ff_audio_info *audio, { audio->codec->sample_fmt = AV_SAMPLE_FMT_NONE; - if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_FLTP, codec->sample_fmts)) + const enum AVSampleFormat *codec_sample_fmts = NULL; + avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, (const void**)&codec_sample_fmts, NULL); + if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_FLTP, codec_sample_fmts)) { audio->codec->sample_fmt = AV_SAMPLE_FMT_FLTP; audio->use_float = true; audio->is_planar = true; RARCH_LOG("[FFmpeg] Using sample format FLTP.\n"); } - else if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_FLT, codec->sample_fmts)) + else if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_FLT, codec_sample_fmts)) { audio->codec->sample_fmt = AV_SAMPLE_FMT_FLT; audio->use_float = true; audio->is_planar = false; RARCH_LOG("[FFmpeg] Using sample format FLT.\n"); } - else if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_S16P, codec->sample_fmts)) + else if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_S16P, codec_sample_fmts)) { audio->codec->sample_fmt = AV_SAMPLE_FMT_S16P; audio->use_float = false; audio->is_planar = true; RARCH_LOG("[FFmpeg] Using sample format S16P.\n"); } - else if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_S16, codec->sample_fmts)) + else if (ffmpeg_codec_has_sample_format(AV_SAMPLE_FMT_S16, codec_sample_fmts)) { audio->codec->sample_fmt = AV_SAMPLE_FMT_S16; audio->use_float = false; @@ -264,19 +266,21 @@ static void ffmpeg_audio_resolve_sample_rate(ffmpeg_t *handle, struct record_params *param = &handle->params; /* We'll have to force resampling to some supported sampling rate. */ - if (codec->supported_samplerates && !params->sample_rate) + const int *codec_supported_samplerates = NULL; + avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_SAMPLE_RATE, 0, (const void**)&codec_supported_samplerates, NULL); + if (codec_supported_samplerates && !params->sample_rate) { unsigned i; int input_rate = (int)param->samplerate; /* Favor closest sampling rate, but always prefer ratio > 1.0. */ - int best_rate = codec->supported_samplerates[0]; + int best_rate = codec_supported_samplerates[0]; int best_diff = best_rate - input_rate; - for (i = 1; codec->supported_samplerates[i]; i++) + for (i = 1; codec_supported_samplerates[i]; i++) { bool better_rate = false; - int diff = codec->supported_samplerates[i] - input_rate; + int diff = codec_supported_samplerates[i] - input_rate; if (best_diff < 0) better_rate = (diff > best_diff); @@ -285,7 +289,7 @@ static void ffmpeg_audio_resolve_sample_rate(ffmpeg_t *handle, if (better_rate) { - best_rate = codec->supported_samplerates[i]; + best_rate = codec_supported_samplerates[i]; best_diff = diff; } }