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

Reply via email to