diff --git a/multimedia/libopenshot/files/patch-ffmpeg9 b/multimedia/libopenshot/files/patch-ffmpeg9 new file mode 100644 index 000000000000..d6e971fb04de --- /dev/null +++ b/multimedia/libopenshot/files/patch-ffmpeg9 @@ -0,0 +1,134 @@ +--- src/FFmpegWriter.cpp 2026-04-03 01:34:37.000000000 +0200 ++++ src/FFmpegWriter.cpp 2026-08-13 19:59:55.020084338 +0200 +@@ -1042,38 +1042,60 @@ + #endif + + // Set valid sample rate (or throw error) +- if (codec->supported_samplerates) { +- int i; +- for (i = 0; codec->supported_samplerates[i] != 0; i++) +- if (info.sample_rate == codec->supported_samplerates[i]) { +- // Set the valid sample rate +- c->sample_rate = info.sample_rate; +- break; +- } +- if (codec->supported_samplerates[i] == 0) +- throw InvalidSampleRate("An invalid sample rate was detected for this codec.", path); +- } else +- // Set sample rate +- c->sample_rate = info.sample_rate; ++ // AVCodec.supported_samplerates removed in FFmpeg 9+ ++ { ++ const int *supported_samplerates = NULL; ++#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100) ++ if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_SAMPLE_RATE, 0, ++ (const void **)&supported_samplerates, NULL) < 0) ++ supported_samplerates = NULL; ++#else ++ supported_samplerates = codec->supported_samplerates; ++#endif ++ if (supported_samplerates) { ++ int i; ++ for (i = 0; supported_samplerates[i] != 0; i++) ++ if (info.sample_rate == supported_samplerates[i]) { ++ // Set the valid sample rate ++ c->sample_rate = info.sample_rate; ++ break; ++ } ++ if (supported_samplerates[i] == 0) ++ throw InvalidSampleRate("An invalid sample rate was detected for this codec.", path); ++ } else ++ // Set sample rate ++ c->sample_rate = info.sample_rate; ++ } + + uint64_t channel_layout = info.channel_layout; + #if HAVE_CH_LAYOUT + // Set a valid number of channels (or throw error) ++ // AVCodec.ch_layouts removed in FFmpeg 9+ + AVChannelLayout ch_layout; + av_channel_layout_from_mask(&ch_layout, info.channel_layout); +- if (codec->ch_layouts) { +- int i; +- for (i = 0; av_channel_layout_check(&codec->ch_layouts[i]); i++) +- if (av_channel_layout_compare(&ch_layout, &codec->ch_layouts[i])) { +- // Set valid channel layout +- av_channel_layout_copy(&c->ch_layout, &ch_layout); +- break; +- } +- if (!av_channel_layout_check(&codec->ch_layouts[i])) +- throw InvalidChannels("An invalid channel layout was detected (i.e. MONO / STEREO).", path); +- } else +- // Set valid channel layout +- av_channel_layout_copy(&c->ch_layout, &ch_layout); ++ { ++ const AVChannelLayout *ch_layouts = NULL; ++#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100) ++ if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_CHANNEL_LAYOUT, 0, ++ (const void **)&ch_layouts, NULL) < 0) ++ ch_layouts = NULL; ++#else ++ ch_layouts = codec->ch_layouts; ++#endif ++ if (ch_layouts) { ++ int i; ++ for (i = 0; av_channel_layout_check(&ch_layouts[i]); i++) ++ if (av_channel_layout_compare(&ch_layout, &ch_layouts[i])) { ++ // Set valid channel layout ++ av_channel_layout_copy(&c->ch_layout, &ch_layout); ++ break; ++ } ++ if (!av_channel_layout_check(&ch_layouts[i])) ++ throw InvalidChannels("An invalid channel layout was detected (i.e. MONO / STEREO).", path); ++ } else ++ // Set valid channel layout ++ av_channel_layout_copy(&c->ch_layout, &ch_layout); ++ } + #else + // Set a valid number of channels (or throw error) + if (codec->channel_layouts) { +@@ -1092,11 +1114,22 @@ + #endif + + // Choose a valid sample_fmt +- if (codec->sample_fmts) { +- for (int i = 0; codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; i++) { +- // Set sample format to 1st valid format (and then exit loop) +- c->sample_fmt = codec->sample_fmts[i]; +- break; ++ // AVCodec.sample_fmts removed in FFmpeg 9+ ++ { ++ const enum AVSampleFormat *sample_fmts = NULL; ++#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100) ++ if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, ++ (const void **)&sample_fmts, NULL) < 0) ++ sample_fmts = NULL; ++#else ++ sample_fmts = codec->sample_fmts; ++#endif ++ if (sample_fmts) { ++ for (int i = 0; sample_fmts[i] != AV_SAMPLE_FMT_NONE; i++) { ++ // Set sample format to 1st valid format (and then exit loop) ++ c->sample_fmt = sample_fmts[i]; ++ break; ++ } + } + } + if (c->sample_fmt == AV_SAMPLE_FMT_NONE) { +@@ -1297,7 +1330,15 @@ + #endif + + // Find all supported pixel formats for this codec +- const PixelFormat *supported_pixel_formats = codec->pix_fmts; ++ // AVCodec.pix_fmts removed in FFmpeg 9+ ++ const PixelFormat *supported_pixel_formats = NULL; ++#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100) ++ if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_PIX_FORMAT, 0, ++ (const void **)&supported_pixel_formats, NULL) < 0) ++ supported_pixel_formats = NULL; ++#else ++ supported_pixel_formats = codec->pix_fmts; ++#endif + while (supported_pixel_formats != NULL && *supported_pixel_formats != PIX_FMT_NONE) { + // Assign the 1st valid pixel format (if one is missing) + if (c->pix_fmt == PIX_FMT_NONE)