diff --git a/games/retroarch/files/patch-ffmpeg9 b/games/retroarch/files/patch-ffmpeg9 new file mode 100644 index 000000000000..950c5961bd38 --- /dev/null +++ b/games/retroarch/files/patch-ffmpeg9 @@ -0,0 +1,74 @@ +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; + } + }