Bug#1081061: fix compilation of blender against ffmpeg 7
package: blender
Version: 4.1.1+dfsg-3
The source code of blender is incompatible with the current version of FFmpeg 7, leading to a crash when trying to compile against it.
The attached patch fixes the issues, allowing successful compilation.
I am using Ubuntu 24.04 and Debian Unstable.
diff -Nru blender-4.1.1.orig/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp blender-4.1.1/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
--- blender-4.1.1.orig/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp 2024-02-07 07:53:42
+++ blender-4.1.1/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp 2024-09-06 21:25:53
@@ -112,7 +112,7 @@
if(ret != 0)
break;
- int data_size = av_samples_get_buffer_size(nullptr, m_codecCtx->channels, m_frame->nb_samples, m_codecCtx->sample_fmt, 1);
+ int data_size = av_samples_get_buffer_size(nullptr, m_codecCtx->ch_layout.nb_channels, m_frame->nb_samples, m_codecCtx->sample_fmt, 1);
if(buf_size - buf_pos < data_size)
{
@@ -122,12 +122,12 @@
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 / m_codecCtx->ch_layout.nb_channels / m_frame->nb_samples;
+ for(int channel = 0; channel < m_codecCtx->ch_layout.nb_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 + ((m_codecCtx->ch_layout.nb_channels * i) + channel) * single_size,
m_frame->data[channel] + i * single_size, single_size);
}
}
@@ -207,7 +207,7 @@
if(avcodec_open2(m_codecCtx, aCodec, nullptr) < 0)
AUD_THROW(FileException, "File couldn't be read, ffmpeg codec couldn't be opened.");
- m_specs.channels = (Channels) m_codecCtx->channels;
+ m_specs.channels = (Channels) m_codecCtx->ch_layout.nb_channels;
m_tointerleave = av_sample_fmt_is_planar(m_codecCtx->sample_fmt);
switch(av_get_packed_sample_fmt(m_codecCtx->sample_fmt))
@@ -345,7 +345,7 @@
info.specs.rate = m_formatCtx->streams[i]->codec->sample_rate;
info.specs.format = convertSampleFormat(m_formatCtx->streams[i]->codec->sample_fmt);
#else
- info.specs.channels = Channels(m_formatCtx->streams[i]->codecpar->channels);
+ info.specs.channels = Channels(m_formatCtx->streams[i]->codecpar->ch_layout.nb_channels);
info.specs.rate = m_formatCtx->streams[i]->codecpar->sample_rate;
info.specs.format = convertSampleFormat(AVSampleFormat(m_formatCtx->streams[i]->codecpar->format));
#endif
diff -Nru blender-4.1.1.orig/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp blender-4.1.1/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp
--- blender-4.1.1.orig/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp 2024-02-07 07:53:42
+++ blender-4.1.1/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp 2024-09-07 12:36:42
@@ -77,8 +77,7 @@
m_frame->nb_samples = m_input_samples;
m_frame->format = m_codecCtx->sample_fmt;
- m_frame->channel_layout = m_codecCtx->channel_layout;
- m_frame->channels = m_specs.channels;
+ av_channel_layout_copy(&m_frame->ch_layout, &m_codecCtx->ch_layout);
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)
AUD_THROW(FileException, "File couldn't be written, filling the audio frame failed with ffmpeg.");
@@ -237,33 +236,33 @@
break;
}
- uint64_t channel_layout = 0;
+ AVChannelLayout channel_layout{};
switch(m_specs.channels)
{
case CHANNELS_MONO:
- channel_layout = AV_CH_LAYOUT_MONO;
+ channel_layout = AV_CHANNEL_LAYOUT_MONO;
break;
case CHANNELS_STEREO:
- channel_layout = AV_CH_LAYOUT_STEREO;
+ channel_layout = AV_CHANNEL_LAYOUT_STEREO;
break;
case CHANNELS_STEREO_LFE:
- channel_layout = AV_CH_LAYOUT_2POINT1;
+ channel_layout = AV_CHANNEL_LAYOUT_2POINT1;
break;
case CHANNELS_SURROUND4:
- channel_layout = AV_CH_LAYOUT_QUAD;
+ channel_layout = AV_CHANNEL_LAYOUT_QUAD;
break;
case CHANNELS_SURROUND5:
- channel_layout = AV_CH_LAYOUT_5POINT0_BACK;
+ channel_layout = AV_CHANNEL_LAYOUT_5POINT0_BACK;
break;
case CHANNELS_SURROUND51:
- channel_layout = AV_CH_LAYOUT_5POINT1_BACK;
+ channel_layout = AV_CHANNEL_LAYOUT_5POINT1_BACK;
break;
case CHANNELS_SURROUND61:
- channel_layout = AV_CH_LAYOUT_6POINT1_BACK;
+ channel_layout = AV_CHANNEL_LAYOUT_6POINT1_BACK;
break;
case CHANNELS_SURROUND71:
- channel_layout = AV_CH_LAYOUT_7POINT1;
+ channel_layout = AV_CHANNEL_LAYOUT_7POINT1;
break;
default:
AUD_THROW(FileException, "File couldn't be written, channel layout not supported.");
@@ -405,8 +404,7 @@
m_codecCtx->codec_type = AVMEDIA_TYPE_AUDIO;
m_codecCtx->bit_rate = bitrate;
- m_codecCtx->channel_layout = channel_layout;
- m_codecCtx->channels = m_specs.channels;
+ av_channel_layout_copy(&m_codecCtx->ch_layout, &channel_layout);
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;
diff -Nru blender-4.1.1.orig/source/blender/imbuf/intern/anim_movie.cc blender-4.1.1/source/blender/imbuf/intern/anim_movie.cc
--- blender-4.1.1.orig/source/blender/imbuf/intern/anim_movie.cc 2024-02-19 12:21:37
+++ blender-4.1.1/source/blender/imbuf/intern/anim_movie.cc 2024-09-07 13:40:11
@@ -1319,7 +1319,8 @@
AVFormatContext *format_ctx = anim->pFormatCtx;
- if (format_ctx->iformat->read_seek2 || format_ctx->iformat->read_seek) {
+ if (!(format_ctx->iformat->flags & AVFMT_NOTIMESTAMPS)) {
+
ret = av_seek_frame(anim->pFormatCtx, anim->videoStream, seek_pos, AVSEEK_FLAG_BACKWARD);
}
else {
Reply to: