Re: graphics/blender: compatibility with ffmpeg 9.0

Daniel Dickman <[email protected]>
Newsgroups gmane.os.openbsd.ports
Message-ID <[email protected]>
Is there a reason not to go with the upstram fix for this?

See https://github.com/audaspace/audaspace/commit/8841635

On Mon, 10 Aug 2026, Kirill A. Korinsky wrote:

> 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.