graphics/blender: compatibility with ffmpeg 9.0

Kirill A. Korinsky <[email protected]>
Newsgroups gmane.os.openbsd.ports
Message-ID <[email protected]>
ports@,

I'd like to commit a fix for graphics/blender which switches it away from
deprecated API in ffmpeg which prevents it to build against ffmpeg 9.0

Build tested against ffmpeg-9.0 and ffmpeg-8.1.2

Tests? Ok?

Index: Makefile
===================================================================
RCS file: /cvs/ports/graphics/blender/Makefile,v
diff -u -p -r1.151 Makefile
--- Makefile	2 Mar 2026 15:00:23 -0000	1.151
+++ Makefile	10 Aug 2026 19:59:40 -0000
@@ -9,7 +9,7 @@ COMMENT =	3D creation software
 VERSION =	4.5.3
 V =		${VERSION:R}
 DISTNAME =	blender-${VERSION}
-REVISION =	3
+REVISION =	4
 
 CATEGORIES =	graphics
 
Index: patches/patch-extern_audaspace_plugins_ffmpeg_FFMPEGWriter_cpp
===================================================================
RCS file: patches/patch-extern_audaspace_plugins_ffmpeg_FFMPEGWriter_cpp
diff -N patches/patch-extern_audaspace_plugins_ffmpeg_FFMPEGWriter_cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-extern_audaspace_plugins_ffmpeg_FFMPEGWriter_cpp	10 Aug 2026 19:59:40 -0000
@@ -0,0 +1,105 @@
+Index: extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp
+--- extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp.orig
++++ extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp
+@@ -179,6 +179,10 @@ FFMPEGWriter::FFMPEGWriter(const std::string &filename
+ 	m_input_samples(0),
+ 	m_deinterleave(false)
+ {
++	const enum AVSampleFormat* sample_fmts;
++	const int* supported_samplerates;
++	int num_sample_fmts, num_supported_samplerates, ret;
++
+ 	static const char* formats[] = { nullptr, "ac3", "flac", "matroska", "mp2", "mp3", "ogg", "wav", "adts" };
+ 
+ 	if(avformat_alloc_output_context2(&m_formatCtx, nullptr, formats[format], filename.c_str()) < 0)
+@@ -303,6 +307,11 @@ FFMPEGWriter::FFMPEGWriter(const std::string &filename
+ 		if(!m_codecCtx)
+ 			AUD_THROW(FileException, "File couldn't be written, context creation failed with ffmpeg.");
+ 
++		ret = avcodec_get_supported_config(m_codecCtx, nullptr, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0,
++									   (const void**)&sample_fmts, &num_sample_fmts);
++		if(ret < 0)
++			AUD_THROW(FileException, "File couldn't be written, sample formats couldn't be queried with ffmpeg.");
++
+ 		switch(m_specs.format)
+ 		{
+ 		case FORMAT_U8:
+@@ -330,25 +339,28 @@ FFMPEGWriter::FFMPEGWriter(const std::string &filename
+ 		if(m_formatCtx->oformat->flags & AVFMT_GLOBALHEADER)
+ 			m_codecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+ 
+-		bool format_supported = false;
++		bool format_supported = !sample_fmts;
+ 
+-		for(int i = 0; codec->sample_fmts[i] != -1; i++)
++		if(sample_fmts)
+ 		{
+-			if(av_get_alt_sample_fmt(codec->sample_fmts[i], false) == m_codecCtx->sample_fmt)
++			for(int i = 0; i < num_sample_fmts; i++)
+ 			{
+-				m_deinterleave = av_sample_fmt_is_planar(codec->sample_fmts[i]);
+-				m_codecCtx->sample_fmt = codec->sample_fmts[i];
+-				format_supported = true;
++				if(av_get_alt_sample_fmt(sample_fmts[i], false) == m_codecCtx->sample_fmt)
++				{
++					m_deinterleave = av_sample_fmt_is_planar(sample_fmts[i]);
++					m_codecCtx->sample_fmt = sample_fmts[i];
++					format_supported = true;
++				}
+ 			}
+ 		}
+ 
+ 		if(!format_supported)
+ 		{
+ 			int chosen_index = 0;
+-			auto chosen = av_get_alt_sample_fmt(codec->sample_fmts[chosen_index], false);
+-			for(int i = 1; codec->sample_fmts[i] != -1; i++)
++			auto chosen = av_get_alt_sample_fmt(sample_fmts[chosen_index], false);
++			for(int i = 1; i < num_sample_fmts; i++)
+ 			{
+-				auto fmt = av_get_alt_sample_fmt(codec->sample_fmts[i], false);
++				auto fmt = av_get_alt_sample_fmt(sample_fmts[i], false);
+ 				if((fmt > chosen && chosen < m_codecCtx->sample_fmt) || (fmt > m_codecCtx->sample_fmt && fmt < chosen))
+ 				{
+ 					chosen = fmt;
+@@ -356,7 +368,7 @@ FFMPEGWriter::FFMPEGWriter(const std::string &filename
+ 				}
+ 			}
+ 
+-			m_codecCtx->sample_fmt = codec->sample_fmts[chosen_index];
++			m_codecCtx->sample_fmt = sample_fmts[chosen_index];
+ 			m_deinterleave = av_sample_fmt_is_planar(m_codecCtx->sample_fmt);
+ 			switch(av_get_alt_sample_fmt(m_codecCtx->sample_fmt, false))
+ 			{
+@@ -387,19 +399,24 @@ FFMPEGWriter::FFMPEGWriter(const std::string &filename
+ 
+ 		m_codecCtx->sample_rate = 0;
+ 
+-		if(codec->supported_samplerates)
++		ret = avcodec_get_supported_config(m_codecCtx, nullptr, AV_CODEC_CONFIG_SAMPLE_RATE, 0,
++									   (const void**)&supported_samplerates, &num_supported_samplerates);
++		if(ret < 0)
++			AUD_THROW(FileException, "File couldn't be written, sample rates couldn't be queried with ffmpeg.");
++
++		if(supported_samplerates)
+ 		{
+-			for(int i = 0; codec->supported_samplerates[i]; i++)
++			for(int i = 0; i < num_supported_samplerates; i++)
+ 			{
+-				if(codec->supported_samplerates[i] == m_specs.rate)
++				if(supported_samplerates[i] == m_specs.rate)
+ 				{
+-					m_codecCtx->sample_rate = codec->supported_samplerates[i];
++					m_codecCtx->sample_rate = supported_samplerates[i];
+ 					break;
+ 				}
+-				else if((codec->supported_samplerates[i] > m_codecCtx->sample_rate && m_specs.rate > m_codecCtx->sample_rate) ||
+-						(codec->supported_samplerates[i] < m_codecCtx->sample_rate && m_specs.rate < codec->supported_samplerates[i]))
++				else if((supported_samplerates[i] > m_codecCtx->sample_rate && m_specs.rate > m_codecCtx->sample_rate) ||
++						(supported_samplerates[i] < m_codecCtx->sample_rate && m_specs.rate < supported_samplerates[i]))
+ 				{
+-					m_codecCtx->sample_rate = codec->supported_samplerates[i];
++					m_codecCtx->sample_rate = supported_samplerates[i];
+ 				}
+ 			}
+ 		}


-- 
wbr, Kirill
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.