Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
graphics/blender: compatibility with ffmpeg 9.0
To:
OpenBSD ports <ports@openbsd.org>
Date:
Mon, 10 Aug 2026 23:15:22 +0200

Download raw body.

Thread
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