freeswitch: backport mod_av patch for FFmpeg 6.0+ support master
authorChristian Marangi <[email protected]>
Thu, 4 Dec 2025 15:47:44 +0000 (16:47 +0100)
committerChristian Marangi <[email protected]>
Thu, 4 Dec 2025 15:47:44 +0000 (16:47 +0100)
Backport mod_av patch for FFmpeg 6.0+ support to fix compilation error
on x86 target.

Signed-off-by: Christian Marangi <[email protected]>
net/freeswitch/Makefile
net/freeswitch/patches/066-01-mod_av-Add-support-for-FFmpeg-6.0.patch [new file with mode: 0644]
net/freeswitch/patches/066-02-mod_av-Add-support-for-FFmpeg-6.1.patch [new file with mode: 0644]
net/freeswitch/patches/066-03-mod_av-Add-support-for-FFmpeg-7.0.patch [new file with mode: 0644]
net/freeswitch/patches/066-04-mod_av-Add-support-for-FFmpeg-7.1.patch [new file with mode: 0644]

index ec69e380270f580c748f62202b93557fe25473e5..3f869cf3caa7234ee40f3254f1c9cb00374ac530 100644 (file)
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=freeswitch
 PKG_VERSION:=1.10.12
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 PKG_MAINTAINER:=
 
 PKG_SOURCE:=freeswitch-$(PKG_VERSION).-release.tar.xz
diff --git a/net/freeswitch/patches/066-01-mod_av-Add-support-for-FFmpeg-6.0.patch b/net/freeswitch/patches/066-01-mod_av-Add-support-for-FFmpeg-6.0.patch
new file mode 100644 (file)
index 0000000..173b09a
--- /dev/null
@@ -0,0 +1,55 @@
+From 9dccd0b6e6761434d54d75d6385cdc7a7b3fa39c Mon Sep 17 00:00:00 2001
+From: Jakub Karolczyk <[email protected]>
+Date: Wed, 8 May 2024 10:53:58 +0100
+Subject: [PATCH 1/4] [mod_av] Add support for FFmpeg 6.0
+
+---
+ src/mod/applications/mod_av/avformat.c | 11 +++++++++++
+ src/mod/applications/mod_av/mod_av.h   |  1 +
+ 2 files changed, 12 insertions(+)
+
+--- a/src/mod/applications/mod_av/avformat.c
++++ b/src/mod/applications/mod_av/avformat.c
+@@ -416,6 +416,7 @@ static int interrupt_cb(void *cp)
+ }
+  
++#if (LIBAVFORMAT_VERSION_MAJOR < LIBAVFORMAT_6_V)
+ static int mod_avformat_alloc_output_context2(AVFormatContext **avctx, const char *format, const char *filename, av_file_context_t *context)
+ {
+       AVFormatContext *s = avformat_alloc_context();
+@@ -489,6 +490,7 @@ error:
+       return ret;
+ }
++#endif
+ static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
+ {
+@@ -2235,7 +2237,16 @@ static switch_status_t av_file_open(swit
+               return SWITCH_STATUS_SUCCESS;
+       }
++#if (LIBAVFORMAT_VERSION_MAJOR < LIBAVFORMAT_6_V)
+       mod_avformat_alloc_output_context2(&context->fc, format, (char *)file, context);
++#else
++      avformat_alloc_output_context2(&context->fc, NULL, format, (char *)file);
++
++      if (context->fc) {
++              context->fc->interrupt_callback.callback = interrupt_cb;
++              context->fc->interrupt_callback.opaque = context;
++      }
++#endif
+       if (!context->fc) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Could not deduce output format from file extension\n");
+--- a/src/mod/applications/mod_av/mod_av.h
++++ b/src/mod/applications/mod_av/mod_av.h
+@@ -42,6 +42,7 @@
+ #define LIBAVCODEC_V 59
+ #define LIBAVFORMAT_V 59
++#define LIBAVFORMAT_6_V 60
+ #define LIBAVUTIL_V 57
+ struct mod_av_globals {
diff --git a/net/freeswitch/patches/066-02-mod_av-Add-support-for-FFmpeg-6.1.patch b/net/freeswitch/patches/066-02-mod_av-Add-support-for-FFmpeg-6.1.patch
new file mode 100644 (file)
index 0000000..35fac09
--- /dev/null
@@ -0,0 +1,98 @@
+From 58776f3eed03951e3a712c5124a12616f5aa735f Mon Sep 17 00:00:00 2001
+From: Jakub Karolczyk <[email protected]>
+Date: Wed, 8 May 2024 12:27:08 +0100
+Subject: [PATCH 2/4] [mod_av] Add support for FFmpeg 6.1
+
+---
+ src/mod/applications/mod_av/avcodec.c  | 11 ++++++++++-
+ src/mod/applications/mod_av/avformat.c | 13 ++++++++++++-
+ src/mod/applications/mod_av/mod_av.h   | 11 +++++++----
+ 3 files changed, 29 insertions(+), 6 deletions(-)
+
+--- a/src/mod/applications/mod_av/avcodec.c
++++ b/src/mod/applications/mod_av/avcodec.c
+@@ -1557,7 +1557,11 @@ static switch_status_t switch_h264_encod
+               }
+                avframe->pict_type = AV_PICTURE_TYPE_I;
++#if (LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V)
++               avframe->flags |= AV_FRAME_FLAG_KEY;
++#else
+                avframe->key_frame = 1;
++#endif
+                context->last_keyframe_request = switch_time_now();
+       }
+@@ -1600,9 +1604,14 @@ GCC_DIAG_ON(deprecated-declarations)
+               }
+ #endif
++#if (LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V)
++      if (context->need_key_frame && (avframe->flags & AV_FRAME_FLAG_KEY)) {
++              avframe->flags &= ~AV_FRAME_FLAG_KEY;
++#else
+       if (context->need_key_frame && avframe->key_frame == 1) {
+-              avframe->pict_type = 0;
+               avframe->key_frame = 0;
++#endif
++              avframe->pict_type = 0;
+               context->need_key_frame = 0;
+       }
+--- a/src/mod/applications/mod_av/avformat.c
++++ b/src/mod/applications/mod_av/avformat.c
+@@ -623,8 +623,13 @@ static switch_status_t add_stream(av_fil
+               c->rc_initial_buffer_occupancy = buffer_bytes * 8;
+               if (codec_id == AV_CODEC_ID_H264) {
++#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++GCC_DIAG_OFF(deprecated-declarations)
++#endif
+                       c->ticks_per_frame = 2;
+-
++#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++GCC_DIAG_ON(deprecated-declarations)
++#endif
+                       c->flags|=AV_CODEC_FLAG_LOOP_FILTER;   // flags=+loop
+                       c->me_cmp|= 1;  // cmp=+chroma, where CHROMA = 1
+@@ -3212,6 +3217,9 @@ static switch_status_t av_file_read_vide
+       if ((c = av_get_codec_context(mst)) && c->time_base.num) {
+               cp = av_stream_get_parser(st);
++#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++GCC_DIAG_OFF(deprecated-declarations)
++#endif
+               ticks = cp ? cp->repeat_pict + 1 : c->ticks_per_frame;
+               // mst->next_pts += ((int64_t)AV_TIME_BASE * st->codec->time_base.num * ticks) / st->codec->time_base.den;
+       }
+@@ -3221,6 +3229,9 @@ static switch_status_t av_file_read_vide
+                       context->video_start_time, ticks, c ? c->ticks_per_frame : -1, st->time_base.num, st->time_base.den, c ? c->time_base.num : -1, c ? c->time_base.den : -1,
+                       st->start_time, st->duration == AV_NOPTS_VALUE ? context->fc->duration / AV_TIME_BASE * 1000 : st->duration, st->nb_frames, av_q2d(st->time_base));
+       }
++#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++GCC_DIAG_ON(deprecated-declarations)
++#endif
+  again:
+--- a/src/mod/applications/mod_av/mod_av.h
++++ b/src/mod/applications/mod_av/mod_av.h
+@@ -40,10 +40,13 @@
+ #ifndef MOD_AV_H
+ #define MOD_AV_H
+-#define LIBAVCODEC_V 59
+-#define LIBAVFORMAT_V 59
+-#define LIBAVFORMAT_6_V 60
+-#define LIBAVUTIL_V 57
++#define LIBAVCODEC_V 59 /* FFmpeg version >= 5.1 */
++#define LIBAVCODEC_6_V 60 /* FFmpeg version >= 6.0 */
++#define LIBAVCODEC_61_V 31 /* FFmpeg version >= 6.1 */
++#define LIBAVFORMAT_V 59 /* FFmpeg version >= 5.1 */
++#define LIBAVFORMAT_6_V 60 /* FFmpeg version >= 6.0 */
++#define LIBAVFORMAT_61_V 16 /* FFmpeg version >= 6.1 */
++#define LIBAVUTIL_V 57 /* FFmpeg version >= 5.1 */
+ struct mod_av_globals {
+       int debug;
diff --git a/net/freeswitch/patches/066-03-mod_av-Add-support-for-FFmpeg-7.0.patch b/net/freeswitch/patches/066-03-mod_av-Add-support-for-FFmpeg-7.0.patch
new file mode 100644 (file)
index 0000000..57b8948
--- /dev/null
@@ -0,0 +1,167 @@
+From 1fd9ac9dd1bdae6e1bd794119f8e5328fe4c7f6c Mon Sep 17 00:00:00 2001
+From: Jakub Karolczyk <[email protected]>
+Date: Thu, 9 May 2024 11:45:38 +0100
+Subject: [PATCH 3/4] [mod_av] Add support for FFmpeg 7.0
+
+---
+ src/mod/applications/mod_av/avcodec.c  | 36 +++++++++++++++++++++++---
+ src/mod/applications/mod_av/avformat.c | 17 +++++++++---
+ src/mod/applications/mod_av/mod_av.h   |  2 ++
+ 3 files changed, 47 insertions(+), 8 deletions(-)
+
+--- a/src/mod/applications/mod_av/avcodec.c
++++ b/src/mod/applications/mod_av/avcodec.c
+@@ -1227,8 +1227,14 @@ static switch_status_t open_encoder(h264
+       if (context->encoder_ctx) {
+               if (avcodec_is_open(context->encoder_ctx)) {
++#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
+                       avcodec_close(context->encoder_ctx);
++#else
++                      /* avcodec_close() will be called in avcodec_free_context() */
++                      avcodec_free_context(&context->encoder_ctx);
++#endif
+               }
++
+               av_free(context->encoder_ctx);
+               context->encoder_ctx = NULL;
+       }
+@@ -1320,8 +1326,14 @@ FF_ENABLE_DEPRECATION_WARNINGS
+               if (context->encoder_ctx) {
+                       if (avcodec_is_open(context->encoder_ctx)) {
++#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
+                               avcodec_close(context->encoder_ctx);
++#else
++                              /* avcodec_close() will be called in avcodec_free_context() */
++                              avcodec_free_context(&context->encoder_ctx);
++#endif
+                       }
++
+                       av_free(context->encoder_ctx);
+                       context->encoder_ctx = NULL;
+               }
+@@ -1557,7 +1569,7 @@ static switch_status_t switch_h264_encod
+               }
+                avframe->pict_type = AV_PICTURE_TYPE_I;
+-#if (LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V)
++#if ((LIBAVCODEC_VERSION_MAJOR == LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V) || LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_7_V)
+                avframe->flags |= AV_FRAME_FLAG_KEY;
+ #else
+                avframe->key_frame = 1;
+@@ -1604,7 +1616,7 @@ GCC_DIAG_ON(deprecated-declarations)
+               }
+ #endif
+-#if (LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V)
++#if ((LIBAVCODEC_VERSION_MAJOR == LIBAVCODEC_6_V && LIBAVCODEC_VERSION_MINOR >= LIBAVCODEC_61_V) || LIBAVCODEC_VERSION_MAJOR >= LIBAVCODEC_7_V)
+       if (context->need_key_frame && (avframe->flags & AV_FRAME_FLAG_KEY)) {
+               avframe->flags &= ~AV_FRAME_FLAG_KEY;
+ #else
+@@ -1871,14 +1883,30 @@ static switch_status_t switch_h264_destr
+       switch_buffer_destroy(&context->nalu_buffer);
+       if (context->decoder_ctx) {
+-              if (avcodec_is_open(context->decoder_ctx)) avcodec_close(context->decoder_ctx);
++              if (avcodec_is_open(context->decoder_ctx)) {
++#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
++                              avcodec_close(context->decoder_ctx);
++#else
++                              /* avcodec_close() will be called in avcodec_free_context() */
++                              avcodec_free_context(&context->decoder_ctx);
++#endif
++              }
++
+               av_free(context->decoder_ctx);
+       }
+       switch_img_free(&context->img);
+       if (context->encoder_ctx) {
+-              if (avcodec_is_open(context->encoder_ctx)) avcodec_close(context->encoder_ctx);
++              if (avcodec_is_open(context->encoder_ctx)) {
++#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
++                      avcodec_close(context->encoder_ctx);
++#else
++                      /* avcodec_close() will be called in avcodec_free_context() */
++                      avcodec_free_context(&context->encoder_ctx);
++#endif
++              }
++
+               av_free(context->encoder_ctx);
+       }
+--- a/src/mod/applications/mod_av/avformat.c
++++ b/src/mod/applications/mod_av/avformat.c
+@@ -623,11 +623,11 @@ static switch_status_t add_stream(av_fil
+               c->rc_initial_buffer_occupancy = buffer_bytes * 8;
+               if (codec_id == AV_CODEC_ID_H264) {
+-#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
+ GCC_DIAG_OFF(deprecated-declarations)
+ #endif
+                       c->ticks_per_frame = 2;
+-#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
+ GCC_DIAG_ON(deprecated-declarations)
+ #endif
+@@ -1417,7 +1417,11 @@ static switch_status_t open_input_file(a
+               switch_goto_status(SWITCH_STATUS_FALSE, err);
+       }
++#if (LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
++      handle->seekable = !(context->fc->iformat->flags & AVFMT_NOTIMESTAMPS);
++#else
+       handle->seekable = context->fc->iformat->read_seek2 ? 1 : (context->fc->iformat->read_seek ? 1 : 0);
++#endif
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "file %s is %sseekable\n", filename, handle->seekable ? "" : "not ");
+       /** Get information on the input file (number of streams etc.). */
+@@ -1509,7 +1513,12 @@ static switch_status_t open_input_file(a
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not open input audio codec channel 2 (error '%s')\n", get_error_text(error, ebuf, sizeof(ebuf)));
+               if ((cc = av_get_codec_context(&context->audio_st[0]))) {
++#if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_7_V)
+                       avcodec_close(cc);
++#else
++                      /* avcodec_close() will be called in avcodec_free_context() */
++                      avcodec_free_context(&cc);
++#endif
+               }
+               context->has_audio = 0;
+@@ -3217,7 +3226,7 @@ static switch_status_t av_file_read_vide
+       if ((c = av_get_codec_context(mst)) && c->time_base.num) {
+               cp = av_stream_get_parser(st);
+-#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
+ GCC_DIAG_OFF(deprecated-declarations)
+ #endif
+               ticks = cp ? cp->repeat_pict + 1 : c->ticks_per_frame;
+@@ -3229,7 +3238,7 @@ GCC_DIAG_OFF(deprecated-declarations)
+                       context->video_start_time, ticks, c ? c->ticks_per_frame : -1, st->time_base.num, st->time_base.den, c ? c->time_base.num : -1, c ? c->time_base.den : -1,
+                       st->start_time, st->duration == AV_NOPTS_VALUE ? context->fc->duration / AV_TIME_BASE * 1000 : st->duration, st->nb_frames, av_q2d(st->time_base));
+       }
+-#if (LIBAVFORMAT_VERSION_MAJOR >= LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V)
++#if ((LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_6_V && LIBAVFORMAT_VERSION_MINOR >= LIBAVFORMAT_61_V) || LIBAVFORMAT_VERSION_MAJOR == LIBAVFORMAT_7_V)
+ GCC_DIAG_ON(deprecated-declarations)
+ #endif
+--- a/src/mod/applications/mod_av/mod_av.h
++++ b/src/mod/applications/mod_av/mod_av.h
+@@ -42,9 +42,11 @@
+ #define LIBAVCODEC_V 59 /* FFmpeg version >= 5.1 */
+ #define LIBAVCODEC_6_V 60 /* FFmpeg version >= 6.0 */
++#define LIBAVCODEC_7_V 61 /* FFmpeg version >= 7.0 */
+ #define LIBAVCODEC_61_V 31 /* FFmpeg version >= 6.1 */
+ #define LIBAVFORMAT_V 59 /* FFmpeg version >= 5.1 */
+ #define LIBAVFORMAT_6_V 60 /* FFmpeg version >= 6.0 */
++#define LIBAVFORMAT_7_V 61 /* FFmpeg version >= 7.0 */
+ #define LIBAVFORMAT_61_V 16 /* FFmpeg version >= 6.1 */
+ #define LIBAVUTIL_V 57 /* FFmpeg version >= 5.1 */
diff --git a/net/freeswitch/patches/066-04-mod_av-Add-support-for-FFmpeg-7.1.patch b/net/freeswitch/patches/066-04-mod_av-Add-support-for-FFmpeg-7.1.patch
new file mode 100644 (file)
index 0000000..9b84fb2
--- /dev/null
@@ -0,0 +1,33 @@
+From 066b92c5894b07a4879a26a9f6a1cdcf59e016ea Mon Sep 17 00:00:00 2001
+From: Andrey Volk <[email protected]>
+Date: Fri, 11 Jul 2025 13:39:48 +0300
+Subject: [PATCH 4/4] [mod_av] Add support for FFmpeg 7.1
+
+---
+ src/mod/applications/mod_av/avformat.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/src/mod/applications/mod_av/avformat.c
++++ b/src/mod/applications/mod_av/avformat.c
+@@ -557,7 +557,21 @@ static switch_status_t add_stream(av_fil
+       switch ((*codec)->type) {
+       case AVMEDIA_TYPE_AUDIO:
++#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100)
++              /*
++                 Changelog says 61.12.100 but commit changes version actually to 61.13.100
++                 https://github.com/FFmpeg/FFmpeg/commit/3305767560a6303f474fffa3afb10c500059b455
++               */
++              {
++                      const enum AVSampleFormat *sample_fmts = NULL;
++                      int fmts_count = 0;
++                      int ret = avcodec_get_supported_config(c, *codec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, (const void**)&sample_fmts, &fmts_count);
++
++                      c->sample_fmt = (ret >= 0 && fmts_count && sample_fmts) ? sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
++              }
++#else
+               c->sample_fmt  = (*codec)->sample_fmts ? (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
++#endif
+               c->bit_rate    = 128000;
+               c->sample_rate = mst->sample_rate = context->handle->samplerate;
+ #if (LIBAVCODEC_VERSION_MAJOR < LIBAVCODEC_V)