[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: