From 40dcae69ef7f68352203ba0dd5b4f05c5d833d15 Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Thu, 4 Dec 2025 16:47:44 +0100 Subject: [PATCH] freeswitch: backport mod_av patch for FFmpeg 6.0+ support Backport mod_av patch for FFmpeg 6.0+ support to fix compilation error on x86 target. Signed-off-by: Christian Marangi --- net/freeswitch/Makefile | 2 +- ...01-mod_av-Add-support-for-FFmpeg-6.0.patch | 55 ++++++ ...02-mod_av-Add-support-for-FFmpeg-6.1.patch | 98 ++++++++++ ...03-mod_av-Add-support-for-FFmpeg-7.0.patch | 167 ++++++++++++++++++ ...04-mod_av-Add-support-for-FFmpeg-7.1.patch | 33 ++++ 5 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 net/freeswitch/patches/066-01-mod_av-Add-support-for-FFmpeg-6.0.patch create mode 100644 net/freeswitch/patches/066-02-mod_av-Add-support-for-FFmpeg-6.1.patch create mode 100644 net/freeswitch/patches/066-03-mod_av-Add-support-for-FFmpeg-7.0.patch create mode 100644 net/freeswitch/patches/066-04-mod_av-Add-support-for-FFmpeg-7.1.patch diff --git a/net/freeswitch/Makefile b/net/freeswitch/Makefile index ec69e38..3f869cf 100644 --- a/net/freeswitch/Makefile +++ b/net/freeswitch/Makefile @@ -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 index 0000000..173b09a --- /dev/null +++ b/net/freeswitch/patches/066-01-mod_av-Add-support-for-FFmpeg-6.0.patch @@ -0,0 +1,55 @@ +From 9dccd0b6e6761434d54d75d6385cdc7a7b3fa39c Mon Sep 17 00:00:00 2001 +From: Jakub Karolczyk +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 index 0000000..35fac09 --- /dev/null +++ b/net/freeswitch/patches/066-02-mod_av-Add-support-for-FFmpeg-6.1.patch @@ -0,0 +1,98 @@ +From 58776f3eed03951e3a712c5124a12616f5aa735f Mon Sep 17 00:00:00 2001 +From: Jakub Karolczyk +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 index 0000000..57b8948 --- /dev/null +++ b/net/freeswitch/patches/066-03-mod_av-Add-support-for-FFmpeg-7.0.patch @@ -0,0 +1,167 @@ +From 1fd9ac9dd1bdae6e1bd794119f8e5328fe4c7f6c Mon Sep 17 00:00:00 2001 +From: Jakub Karolczyk +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 index 0000000..9b84fb2 --- /dev/null +++ b/net/freeswitch/patches/066-04-mod_av-Add-support-for-FFmpeg-7.1.patch @@ -0,0 +1,33 @@ +From 066b92c5894b07a4879a26a9f6a1cdcf59e016ea Mon Sep 17 00:00:00 2001 +From: Andrey Volk +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) -- 2.30.2