From e9c58084db249845af88011a1e3c5d7b9ec05a76 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Tue, 2 Jul 2019 05:14:56 +0400 Subject: [PATCH] FS-11911: [mod_av] Fix mod_av on Debian Buster --- configure.ac | 3 + src/mod/applications/mod_av/Makefile.am | 16 ++++-- src/mod/applications/mod_av/avcodec.c | 8 +++ src/mod/applications/mod_av/avformat.c | 76 +++++++++++++++++-------- src/mod/applications/mod_av/mod_av.c | 10 ++++ 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/configure.ac b/configure.ac index 8cab4a889d..0f24452937 100644 --- a/configure.ac +++ b/configure.ac @@ -1364,6 +1364,9 @@ PKG_CHECK_MODULES([AVRESAMPLE], [libavresample >= 2.1.0],[ AM_CONDITIONAL([HAVE_AVRESAMPLE],[true])],[ AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_AVRESAMPLE],[false])]) +PKG_CHECK_MODULES([SWRESAMPLE], [libswresample >= 2.1.0],[ + AM_CONDITIONAL([HAVE_SWRESAMPLE],[true])],[ + AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SWRESAMPLE],[false])]) PKG_CHECK_MODULES([SWSCALE], [libswscale >= 3.0.0],[ AM_CONDITIONAL([HAVE_SWSCALE],[true])],[ diff --git a/src/mod/applications/mod_av/Makefile.am b/src/mod/applications/mod_av/Makefile.am index 675eb514b0..4400f07095 100644 --- a/src/mod/applications/mod_av/Makefile.am +++ b/src/mod/applications/mod_av/Makefile.am @@ -3,20 +3,28 @@ MODNAME=mod_av if HAVE_AVFORMAT +if HAVE_SWRESAMPLE +RESAMPLE_CFLAGS = $(SWRESAMPLE_CFLAGS) +RESAMPLE_LIBS = $(SWRESAMPLE_LIBS) +else +RESAMPLE_CFLAGS = $(AVRESAMPLE_CFLAGS) -DUSE_AVRESAMPLE +RESAMPLE_LIBS = $(AVRESAMPLE_LIBS) +endif + noinst_LTLIBRARIES = libavmod.la libavmod_la_SOURCES = mod_av.c avformat.c avcodec.c -libavmod_la_CFLAGS = $(AM_CFLAGS) $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(AVRESAMPLE_CFALGS) +libavmod_la_CFLAGS = $(AM_CFLAGS) $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(RESAMPLE_CFLAGS) mod_LTLIBRARIES = mod_av.la mod_av_la_SOURCES = -mod_av_la_LIBADD = libavmod.la $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS) +mod_av_la_LIBADD = libavmod.la $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(RESAMPLE_LIBS) mod_av_la_LDFLAGS = -avoid-version -module -no-undefined -shared -lm -lz bin_PROGRAMS = test/test_mod_av test/test_avformat -AM_CFLAGS = $(SWITCH_AM_CFLAGS) -I../ $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(AVRESAMPLE_CFALGS) -AM_LDFLAGS = $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS) -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) +AM_CFLAGS = $(SWITCH_AM_CFLAGS) -I../ $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(RESAMPLE_CFLAGS) +AM_LDFLAGS = $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(RESAMPLE_LIBS) -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) TESTS = $(bin_PROGRAMS) test_test_mod_av_LDADD = libavmod.la $(switch_builddir)/libfreeswitch.la diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c index 594999310c..f72b92089b 100644 --- a/src/mod/applications/mod_av/avcodec.c +++ b/src/mod/applications/mod_av/avcodec.c @@ -197,7 +197,9 @@ static void dump_encoder_ctx(AVCodecContext *ctx) my_dump_int64(request_channel_layout); my_dump_enum(audio_service_type); my_dump_enum(request_sample_fmt); +#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57,106,102)) my_dump_int(refcounted_frames); +#endif my_dump_float(qcompress); ///< amount of qscale change between easy & hard scenes (0.0-1.0) my_dump_float(qblur); ///< amount of qscale smoothing over time (0.0-1.0) my_dump_int(qmin); @@ -1755,7 +1757,13 @@ static char get_media_type_char(enum AVMediaType type) static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev, int encoder) { +#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,10,100)) while ((prev = av_codec_next(prev))) { +#else + void *i; + + while ((prev = av_codec_iterate(&i))) { +#endif if (prev->id == id && (encoder ? av_codec_is_encoder(prev) : av_codec_is_decoder(prev))) return prev; diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c index 67628da7cd..362ef5adca 100644 --- a/src/mod/applications/mod_av/avformat.c +++ b/src/mod/applications/mod_av/avformat.c @@ -39,8 +39,21 @@ GCC_DIAG_OFF(deprecated-declarations) #include #include #include -#include #include +#ifdef USE_AVRESAMPLE +#include +#define SwrContext AVAudioResampleContext +#define swr_alloc avresample_alloc_context +#define swr_init avresample_open +#define swr_free avresample_free +#define swr_get_out_samples avresample_get_out_samples +#define swr_get_out_samples avresample_get_out_samples +#define swr_convert(ctx, odata, osamples, idata, isamples) \ + avresample_convert(ctx, odata, osamples, 0, idata, isamples, 0) +#else +#include +#endif + GCC_DIAG_ON(deprecated-declarations) #define SCALE_FLAGS SWS_BICUBIC #define DFT_RECORD_OFFSET 0 @@ -77,7 +90,7 @@ typedef struct MediaStream { // audio int channels; int sample_rate; - struct AVAudioResampleContext *resample_ctx; + struct SwrContext *resample_ctx; //video int width; @@ -365,8 +378,15 @@ static int mod_avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputF } else s->priv_data = NULL; - if (filename) + if (filename) { +#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,7,100)) av_strlcpy(s->filename, filename, sizeof(s->filename)); +#else + s->url = strdup(filename); + switch_assert(s->url); +#endif + } + *avctx = s; return 0; nomem: @@ -684,15 +704,12 @@ GCC_DIAG_ON(deprecated-declarations) mst->frame->nb_samples = c->frame_size; } - - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "sample_rate: %d nb_samples: %d\n", mst->frame->sample_rate, mst->frame->nb_samples); if (c->sample_fmt != AV_SAMPLE_FMT_S16) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "sample_fmt %d != AV_SAMPLE_FMT_S16, start resampler\n", c->sample_fmt); - mst->resample_ctx = avresample_alloc_context(); + mst->resample_ctx = swr_alloc(); if (!mst->resample_ctx) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate resampler context\n"); @@ -709,7 +726,7 @@ GCC_DIAG_ON(deprecated-declarations) av_opt_set_int(mst->resample_ctx, "out_sample_fmt", c->sample_fmt, 0); av_opt_set_int(mst->resample_ctx, "out_channel_layout", c->channel_layout, 0); - if ((ret = avresample_open(mst->resample_ctx)) < 0) { + if ((ret = swr_init(mst->resample_ctx)) < 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to initialize the resampling context\n"); av_free(mst->resample_ctx); mst->resample_ctx = NULL; @@ -960,7 +977,7 @@ static void close_stream(AVFormatContext *fc, MediaStream *mst) { if (!mst->active) return; - if (mst->resample_ctx) avresample_free(&mst->resample_ctx); + if (mst->resample_ctx) swr_free(&mst->resample_ctx); if (mst->sws_ctx) sws_freeContext(mst->sws_ctx); if (mst->frame) av_frame_free(&mst->frame); if (mst->tmp_frame) av_frame_free(&mst->tmp_frame); @@ -994,8 +1011,8 @@ static int is_device(const AVClass *avclass) } void show_formats(switch_stream_handle_t *stream) { - AVInputFormat *ifmt = NULL; - AVOutputFormat *ofmt = NULL; + const AVInputFormat *ifmt = NULL; + const AVOutputFormat *ofmt = NULL; const char *last_name; // int is_dev; @@ -1013,7 +1030,14 @@ void show_formats(switch_stream_handle_t *stream) { const char *name = NULL; const char *long_name = NULL; +#if (LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58,9,100)) while ((ofmt = av_oformat_next(ofmt))) { +#else + void *i; + + while ((ofmt = av_muxer_iterate(&i))) { +#endif + is_dev = is_device(ofmt->priv_class); if ((name == NULL || strcmp(ofmt->name, name) < 0) && @@ -1024,7 +1048,11 @@ void show_formats(switch_stream_handle_t *stream) { } } +#if (LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58,9,100)) while ((ifmt = av_iformat_next(ifmt))) { +#else + while ((ifmt = av_demuxer_iterate(&i))) { +#endif is_dev = is_device(ifmt->priv_class); if ((name == NULL || strcmp(ifmt->name, name) < 0) && @@ -1058,11 +1086,11 @@ static void mod_avformat_destroy_output_context(av_file_context_t *context) close_stream(context->fc, &context->audio_st[1]); if (context->audio_st[0].resample_ctx) { - avresample_free(&context->audio_st[0].resample_ctx); + swr_free(&context->audio_st[0].resample_ctx); } if (context->audio_st[1].resample_ctx) { - avresample_free(&context->audio_st[1].resample_ctx); + swr_free(&context->audio_st[1].resample_ctx); } avformat_close_input(&context->fc); @@ -1210,7 +1238,7 @@ GCC_DIAG_OFF(deprecated-declarations) GCC_DIAG_ON(deprecated-declarations) int x; for (x = 0; x < context->has_audio && x < 2 && c[x]; x++) { - AVAudioResampleContext *resample_ctx = avresample_alloc_context(); + struct SwrContext *resample_ctx = swr_alloc(); if (resample_ctx) { int ret; @@ -1225,7 +1253,7 @@ GCC_DIAG_ON(deprecated-declarations) av_opt_set_int(resample_ctx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); av_opt_set_int(resample_ctx, "out_channel_layout", handle->channels == 2 ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO, 0); - if ((ret = avresample_open(resample_ctx)) < 0) { + if ((ret = swr_init(resample_ctx)) < 0) { char errbuf[1024]; av_strerror(ret, errbuf, 1024); @@ -1510,17 +1538,17 @@ GCC_DIAG_ON(deprecated-declarations) // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "got data frm->format: %d samples: %d\n", in_frame.format, in_frame.nb_samples); if (context->audio_st[0].resample_ctx) { - int out_samples = avresample_get_out_samples(context->audio_st[0].resample_ctx, in_frame.nb_samples); + int out_samples = swr_get_out_samples(context->audio_st[0].resample_ctx, in_frame.nb_samples); int ret; uint8_t *data[2] = { 0 }; data[0] = malloc(out_samples * context->audio_st[0].channels * 2); switch_assert(data[0]); - ret = avresample_convert(context->audio_st[0].resample_ctx, data, 0, out_samples, - in_frame.data, 0, in_frame.nb_samples); + ret = swr_convert(context->audio_st[0].resample_ctx, data, out_samples, + (const uint8_t **)in_frame.data, in_frame.nb_samples); - // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "out_samples: %d ret: %d delay: %d buffer: %zu\n", out_samples, ret, avresample_get_delay(context->audio_st[0].resample_ctx), switch_buffer_inuse(context->audio_buffer)); + // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "out_samples: %d ret: %d delay: %ld buffer: %zu\n", out_samples, ret, swr_get_delay(context->audio_st[0].resample_ctx, 8000), switch_buffer_inuse(context->audio_buffer)); if (ret) { switch_mutex_lock(context->mutex); @@ -1639,8 +1667,6 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "sample rate: %d, channels: %d\n", handle->samplerate, handle->channels); - av_register_all(); - if (switch_test_flag(handle, SWITCH_FILE_FLAG_READ)) { if (open_input_file(context, handle, path) != SWITCH_STATUS_SUCCESS) { //clean up; @@ -2009,14 +2035,14 @@ GCC_DIAG_ON(deprecated-declarations) use_frame = context->audio_st[j].frame; if (context->audio_st[j].resample_ctx) { - int out_samples = avresample_get_out_samples(context->audio_st[j].resample_ctx, context->audio_st[j].frame->nb_samples); + int out_samples = swr_get_out_samples(context->audio_st[j].resample_ctx, context->audio_st[j].frame->nb_samples); av_frame_make_writable(context->audio_st[j].tmp_frame); /* convert to destination format */ - ret = avresample_convert(context->audio_st[j].resample_ctx, - context->audio_st[j].tmp_frame->data, 0, out_samples, - (uint8_t **)context->audio_st[j].frame->data, 0, context->audio_st[j].frame->nb_samples); + ret = swr_convert(context->audio_st[j].resample_ctx, + context->audio_st[j].tmp_frame->data, out_samples, + (const uint8_t **)context->audio_st[j].frame->data, context->audio_st[j].frame->nb_samples); if (ret < 0) { char ebuf[255] = ""; diff --git a/src/mod/applications/mod_av/mod_av.c b/src/mod/applications/mod_av/mod_av.c index 68f363bff5..4716b60804 100644 --- a/src/mod/applications/mod_av/mod_av.c +++ b/src/mod/applications/mod_av/mod_av.c @@ -128,7 +128,11 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_av_shutdown) mod_avcodec_shutdown(); avformat_network_deinit(); av_log_set_callback(NULL); + +#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,9,100)) av_lockmgr_register(NULL); +#endif + return SWITCH_STATUS_SUCCESS; } @@ -190,11 +194,17 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_av_load) { switch_api_interface_t *api_interface = NULL; +#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,9,100)) av_lockmgr_register(&mod_av_lockmgr_cb); +#endif + av_log_set_callback(log_callback); av_log_set_level(AV_LOG_INFO); avformat_network_init(); + +#if (LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58,9,100)) av_register_all(); +#endif av_log(NULL, AV_LOG_INFO, "%s %d\n", "av_log callback installed, level=", av_log_get_level());