commit: 6c763cc787adb6ed87c26428744fdfe324d102a8 Author: Ionen Wolkens <ionen <AT> gentoo <DOT> org> AuthorDate: Wed Mar 12 15:57:57 2025 +0000 Commit: Ionen Wolkens <ionen <AT> gentoo <DOT> org> CommitDate: Wed Mar 12 17:21:41 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=6c763cc7
media-gfx/blender: quick fix for ffmpeg-7 Only fixing ~arch 4.3.2 given haven't tested muchand haven't tried the other slots at all (could be missing more). Ideally all slots need fixes so leaving bug #951199 open, will let maintainers decide how to handle that. Bug: https://bugs.gentoo.org/951199 Signed-off-by: Ionen Wolkens <ionen <AT> gentoo.org> media-gfx/blender/blender-4.3.2-r1.ebuild | 1 + .../blender/files/blender-4.3.2-ffmpeg7.patch | 151 +++++++++++++++++++++ 2 files changed, 152 insertions(+) diff --git a/media-gfx/blender/blender-4.3.2-r1.ebuild b/media-gfx/blender/blender-4.3.2-r1.ebuild index 8e849ba27514..71102af8a31b 100644 --- a/media-gfx/blender/blender-4.3.2-r1.ebuild +++ b/media-gfx/blender/blender-4.3.2-r1.ebuild @@ -184,6 +184,7 @@ PATCHES=( "${FILESDIR}/${PN}-4.0.2-CUDA_NVCC_FLAGS.patch" "${FILESDIR}/${PN}-4.1.1-FindLLVM.patch" "${FILESDIR}/${PN}-4.1.1-numpy.patch" + "${FILESDIR}/${PN}-4.3.2-ffmpeg7.patch" ) blender_check_requirements() { diff --git a/media-gfx/blender/files/blender-4.3.2-ffmpeg7.patch b/media-gfx/blender/files/blender-4.3.2-ffmpeg7.patch new file mode 100644 index 000000000000..c16c18124dd0 --- /dev/null +++ b/media-gfx/blender/files/blender-4.3.2-ffmpeg7.patch @@ -0,0 +1,151 @@ +https://bugs.gentoo.org/951199 + +Backport of [1] plus a chunk from [2] for another anim_movie.cc issue. + +[1] https://projects.blender.org/blender/blender/commit/b1ca2f09dba5c4a6d21806ab913a2374bf7b3b8f +[2] https://projects.blender.org/blender/blender/pulls/121947 +--- a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp ++++ b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp +@@ -28,7 +28,12 @@ + AUD_NAMESPACE_BEGIN + ++/* FFmpeg < 4.0 */ + #if LIBAVCODEC_VERSION_MAJOR < 58 + #define FFMPEG_OLD_CODE + #endif ++/* FFmpeg < 5.0 */ ++#if LIBAVCODEC_VERSION_MAJOR < 59 ++#define FFMPEG_OLD_CH_LAYOUT ++#endif + + SampleFormat FFMPEGReader::convertSampleFormat(AVSampleFormat format) +@@ -113,5 +118,11 @@ + break; + +- int data_size = av_samples_get_buffer_size(nullptr, m_codecCtx->channels, m_frame->nb_samples, m_codecCtx->sample_fmt, 1); ++ #ifdef FFMPEG_OLD_CH_LAYOUT ++ int channels = m_codecCtx->channels; ++ #else ++ int channels = m_codecCtx->ch_layout.nb_channels; ++ #endif ++ ++ int data_size = av_samples_get_buffer_size(nullptr, channels, m_frame->nb_samples, m_codecCtx->sample_fmt, 1); + + if(buf_size - buf_pos < data_size) +@@ -123,10 +134,10 @@ + if(m_tointerleave) + { +- int single_size = data_size / m_codecCtx->channels / m_frame->nb_samples; +- for(int channel = 0; channel < m_codecCtx->channels; channel++) ++ int single_size = data_size / channels / m_frame->nb_samples; ++ for(int channel = 0; channel < channels; channel++) + { + for(int i = 0; i < m_frame->nb_samples; i++) + { +- std::memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((m_codecCtx->channels * i) + channel) * single_size, ++ std::memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((channels * i) + channel) * single_size, + m_frame->data[channel] + i * single_size, single_size); + } +@@ -208,5 +219,10 @@ + AUD_THROW(FileException, "File couldn't be read, ffmpeg codec couldn't be opened."); + +- m_specs.channels = (Channels) m_codecCtx->channels; ++ #ifdef FFMPEG_OLD_CH_LAYOUT ++ int channels = m_codecCtx->channels; ++ #else ++ int channels = m_codecCtx->ch_layout.nb_channels; ++ #endif ++ m_specs.channels = (Channels) channels; + m_tointerleave = av_sample_fmt_is_planar(m_codecCtx->sample_fmt); + +@@ -346,5 +362,10 @@ + info.specs.format = convertSampleFormat(m_formatCtx->streams[i]->codec->sample_fmt); + #else +- info.specs.channels = Channels(m_formatCtx->streams[i]->codecpar->channels); ++ #ifdef FFMPEG_OLD_CH_LAYOUT ++ int channels = m_formatCtx->streams[i]->codecpar->channels; ++ #else ++ int channels = m_formatCtx->streams[i]->codecpar->ch_layout.nb_channels; ++ #endif ++ info.specs.channels = Channels(channels); + info.specs.rate = m_formatCtx->streams[i]->codecpar->sample_rate; + info.specs.format = convertSampleFormat(AVSampleFormat(m_formatCtx->streams[i]->codecpar->format)); +--- a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp ++++ b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp +@@ -31,7 +31,12 @@ + AUD_NAMESPACE_BEGIN + ++/* FFmpeg < 4.0 */ + #if LIBAVCODEC_VERSION_MAJOR < 58 + #define FFMPEG_OLD_CODE + #endif ++/* FFmpeg < 5.0 */ ++#if LIBAVCODEC_VERSION_MAJOR < 59 ++#define FFMPEG_OLD_CH_LAYOUT ++#endif + + void FFMPEGWriter::encode() +@@ -78,6 +83,11 @@ + m_frame->nb_samples = m_input_samples; + m_frame->format = m_codecCtx->sample_fmt; ++#ifdef FFMPEG_OLD_CH_LAYOUT + m_frame->channel_layout = m_codecCtx->channel_layout; + m_frame->channels = m_specs.channels; ++#else ++ if(av_channel_layout_copy(&m_frame->ch_layout, &m_codecCtx->ch_layout) < 0) ++ AUD_THROW(FileException, "File couldn't be written, couldn't copy audio channel layout."); ++#endif + + if(avcodec_fill_audio_frame(m_frame, m_specs.channels, m_codecCtx->sample_fmt, reinterpret_cast<data_t*>(data), m_input_buffer.getSize(), 0) < 0) +@@ -406,6 +416,11 @@ + m_codecCtx->codec_type = AVMEDIA_TYPE_AUDIO; + m_codecCtx->bit_rate = bitrate; ++#ifdef FFMPEG_OLD_CH_LAYOUT + m_codecCtx->channel_layout = channel_layout; + m_codecCtx->channels = m_specs.channels; ++#else ++ av_channel_layout_uninit(&m_codecCtx->ch_layout); ++ av_channel_layout_from_mask(&m_codecCtx->ch_layout, channel_layout); ++#endif + m_stream->time_base.num = m_codecCtx->time_base.num = 1; + m_stream->time_base.den = m_codecCtx->time_base.den = m_codecCtx->sample_rate; +--- a/intern/ffmpeg/ffmpeg_compat.h ++++ b/intern/ffmpeg/ffmpeg_compat.h +@@ -41,4 +41,11 @@ + #endif + ++#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(58, 29, 100) ++/* In ffmpeg 6.1 usage of the "key_frame" variable from "AVFrame" has been deprecated. ++ * used the new method to query for the "AV_FRAME_FLAG_KEY" flag instead. ++ */ ++# define FFMPEG_OLD_KEY_FRAME_QUERY_METHOD ++#endif ++ + #if (LIBAVFORMAT_VERSION_MAJOR < 59) + /* For versions older than ffmpeg 5.0, use the old channel layout variables. +--- a/source/blender/imbuf/intern/anim_movie.cc ++++ b/source/blender/imbuf/intern/anim_movie.cc +@@ -657,5 +657,9 @@ + anim->cur_pts = av_get_pts_from_frame(anim->pFrame); + ++# ifdef FFMPEG_OLD_KEY_FRAME_QUERY_METHOD + if (anim->pFrame->key_frame) { ++# else ++ if (anim->pFrame->flags & AV_FRAME_FLAG_KEY) { ++# endif + anim->cur_key_frame_pts = anim->cur_pts; + } +@@ -1036,9 +1040,8 @@ + AVFormatContext *format_ctx = anim->pFormatCtx; + +- if (format_ctx->iformat->read_seek2 || format_ctx->iformat->read_seek) { +- ret = av_seek_frame(anim->pFormatCtx, anim->videoStream, seek_pos, AVSEEK_FLAG_BACKWARD); +- } +- else { +- ret = ffmpeg_generic_seek_workaround(anim, &seek_pos, pts_to_search); ++ int ret = av_seek_frame(anim->pFormatCtx, anim->videoStream, seek_pos, AVSEEK_FLAG_BACKWARD); ++ ++ if (ret < 0) { ++ ret = ffmpeg_generic_seek_workaround(anim, &seek_pos, pts_to_search);\ + av_log(anim->pFormatCtx, + AV_LOG_DEBUG,
