From 9abe8822ba60526b4f02fb0fbf4634f4eb9bf51d Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Fri, 14 Aug 2020 00:57:49 +0100 Subject: [PATCH] amr: replace 3GPP reference library with vo-amrwbenc The 3GPP reference code has licensing restrictions and isn't commonly available as a package. Between them, the opencore and vo-amrwbenc cover the same functionality, so use those instead. --- INSTALL | 2 +- configure.ac | 18 +++----- src/amr-nb.c | 66 ++++++---------------------- src/amr-wb.c | 54 +++++++++-------------- src/amr.h | 138 ++++++++++++++++++++++++++++------------------------------- 5 files changed, 106 insertions(+), 172 deletions(-) diff --git a/INSTALL b/INSTALL index cd3542f0..3e8e272e 100644 --- a/INSTALL +++ b/INSTALL @@ -17,7 +17,7 @@ libraries, where to get them (if not from your OS distribution), and their licence types, is as follows: OpencoreAMR-NB/WB http://sourceforge.net/projects/opencore-amr Apache -AMR-NB/WB http://www.penguin.cz/~utx/amr See library web page +VisualOn AMR-WB http://sourceforge.net/projects/opencore-amr Apache AO http://xiph.org/ao GPL FLAC http://flac.sourceforge.net BSD LADSPA http://www.ladspa.org LGPL + plugins' licence diff --git a/configure.ac b/configure.ac index 213402ec..42ab2a6c 100644 --- a/configure.ac +++ b/configure.ac @@ -448,14 +448,13 @@ AC_OPTIONAL_FORMAT(flac, FLAC, dnl When enable_dl_amrbw, do not let add libraries to be linked in dnl since they will be dlopen()'ed instead. ac_sox_save_AMRWB_LIBS="$AMRWB_LIBS" -tmp_using_amrwb=$opt_default +tmp_using_amrwb=no AC_CHECK_HEADERS(opencore-amrwb/dec_if.h, - [AC_CHECK_LIB(opencore-amrwb, D_IF_init, - AMRWB_LIBS="$AMRWB_LIBS -lopencore-amrwb", tmp_using_amrwb=no)], - [AC_CHECK_HEADERS(amrwb/dec.h, - [AC_CHECK_LIB(amrwb, D_IF_init, - AMRWB_LIBS="$AMRWB_LIBS -lamrwb",tmp_using_amrwb=no)], - tmp_using_amrwb=no)]) + [AC_CHECK_LIB(opencore-amrwb, D_IF_init, + [AMRWB_LIBS="$AMRWB_LIBS -lopencore-amrwb"; tmp_using_amrwb=$opt_default])]) +AC_CHECK_HEADERS(vo-amrwbenc/enc_if.h, + [AC_CHECK_LIB(vo-amrwbenc, E_IF_init, + AMRWB_LIBS="$AMRWB_LIBS -lvo-amrwbenc"; tmp_using_amrwb=$opt_default)]) AC_ARG_ENABLE(dl_amrwb, AS_HELP_STRING([--enable-dl-amrwb], [Dlopen amrbw instead of linking in.]), @@ -479,10 +478,7 @@ tmp_using_amrnb=$opt_default AC_CHECK_HEADERS(opencore-amrnb/interf_dec.h, [AC_CHECK_LIB(opencore-amrnb, Decoder_Interface_init, AMRNB_LIBS="$AMRNB_LIBS -lopencore-amrnb", tmp_using_amrnb=no)], - [AC_CHECK_HEADER(amrnb/sp_dec.h, - [AC_CHECK_LIB(amrnb, Decoder_Interface_init, - AMRNB_LIBS="$AMRNB_LIBS -lamrnb", tmp_using_amrnb=no)], - tmp_using_amrnb=no)]) + [tmp_using_amrnb=no]) AC_ARG_ENABLE(dl_amrnb, AS_HELP_STRING([--enable-dl-amrnb], [Dlopen amrnb instead of linking in.]), diff --git a/src/amr-nb.c b/src/amr-nb.c index 6524cb2d..c68ad2bd 100644 --- a/src/amr-nb.c +++ b/src/amr-nb.c @@ -16,11 +16,10 @@ */ /* - * In order to use the AMR format with SoX, you need to have an AMR - * library installed at SoX build time. Currently, the SoX build system - * recognizes two AMR implementations, in the following order: - * http://opencore-amr.sourceforge.net/ - * http://ftp.penguin.cz/pub/users/utx/amr/ + * In order to use the AMR format with SoX, you need to have an + * AMR library installed at SoX build time. The SoX build system + * recognizes the AMR implementations available from + * http://opencore-amr.sourceforge.net/ */ #include "sox_i.h" @@ -54,10 +53,8 @@ static char const amrnb_magic[] = "#!AMR\n"; /* OpenCore definitions: */ -#if defined(HAVE_OPENCORE_AMRNB_INTERF_DEC_H) || defined(DL_AMRNB) - #define AMR_OPENCORE 1 - #define AMR_OPENCORE_ENABLE_ENCODE 1 -#endif +#define AMR_OPENCORE 1 +#define AMR_OPENCORE_ENABLE_ENCODE 1 #define AMR_OPENCORE_FUNC_ENTRIES(f,x) \ AMR_FUNC(f,x, void*, Encoder_Interface_init, (int dtx)) \ @@ -67,17 +64,17 @@ static char const amrnb_magic[] = "#!AMR\n"; AMR_FUNC(f,x, void, Decoder_Interface_Decode, (void* state, const unsigned char* in, short* out, int bfi)) \ AMR_FUNC(f,x, void, Decoder_Interface_exit, (void* state)) \ -#define AmrOpencoreEncoderInit() \ +#define AmrEncoderInit() \ Encoder_Interface_init(1) -#define AmrOpencoreEncoderEncode(state, mode, in, out, forceSpeech) \ +#define AmrEncoderEncode(state, mode, in, out, forceSpeech) \ Encoder_Interface_Encode(state, mode, in, out, forceSpeech) -#define AmrOpencoreEncoderExit(state) \ +#define AmrEncoderExit(state) \ Encoder_Interface_exit(state) -#define AmrOpencoreDecoderInit() \ +#define AmrDecoderInit() \ Decoder_Interface_init() -#define AmrOpencoreDecoderDecode(state, in, out, bfi) \ +#define AmrDecoderDecode(state, in, out, bfi) \ Decoder_Interface_Decode(state, in, out, bfi) -#define AmrOpencoreDecoderExit(state) \ +#define AmrDecoderExit(state) \ Decoder_Interface_exit(state) #define AMR_OPENCORE_DESC "amr-nb OpenCore library" @@ -90,43 +87,4 @@ static const char* const amr_opencore_library_names[] = NULL }; -/* 3GPP (reference implementation) definitions: */ - -#if !defined(HAVE_OPENCORE_AMRNB_INTERF_DEC_H) || defined(DL_AMRNB) - #define AMR_GP3 1 -#endif - -#define AMR_GP3_FUNC_ENTRIES(f,x) \ - AMR_FUNC(f,x, void*, VADxEncoder_Interface_init, (int dtx, char vad2_code)) \ - AMR_FUNC(f,x, int, GP3VADxEncoder_Interface_Encode, (void* state, enum amrnb_mode mode, short* in, unsigned char* out, int forceSpeech, char vad2_code)) \ - AMR_FUNC(f,x, void, Encoder_Interface_exit, (void* state)) \ - AMR_FUNC(f,x, void*, Decoder_Interface_init, (void)) \ - AMR_FUNC(f,x, void, GP3Decoder_Interface_Decode, (void* state, unsigned char* in, short* out, int bfi)) \ - AMR_FUNC(f,x, void, Decoder_Interface_exit, (void* state)) \ - -#define AmrGp3EncoderInit() \ - VADxEncoder_Interface_init(1, 0) -#define AmrGp3EncoderEncode(state, mode, in, out, forceSpeech) \ - GP3VADxEncoder_Interface_Encode(state, mode, in, out, forceSpeech, 0) -#define AmrGp3EncoderExit(state) \ - Encoder_Interface_exit(state) -#define AmrGp3DecoderInit() \ - Decoder_Interface_init() -#define AmrGp3DecoderDecode(state, in, out, bfi) \ - GP3Decoder_Interface_Decode(state, in, out, bfi) -#define AmrGp3DecoderExit(state) \ - Decoder_Interface_exit(state) - -#define AMR_GP3_DESC "amr-nb 3GPP reference library" -static const char* const amr_gp3_library_names[] = -{ -#ifdef DL_AMRWB - "libamrnb-3", - "libamrnb", - "amrnb", - "cygamrnb-3", -#endif - NULL -}; - #include "amr.h" diff --git a/src/amr-wb.c b/src/amr-wb.c index 5021e867..7b5a66d8 100644 --- a/src/amr-wb.c +++ b/src/amr-wb.c @@ -16,11 +16,10 @@ */ /* - * In order to use the AMR format with SoX, you need to have an AMR - * library installed at SoX build time. Currently, the SoX build system - * recognizes two AMR implementations, in the following order: - * http://opencore-amr.sourceforge.net/ - * http://ftp.penguin.cz/pub/users/utx/amr/ + * In order to use the AMR format with SoX, you need to have an + * AMR library installed at SoX build time. The SoX build system + * recognizes the AMR implementations available from + * http://opencore-amr.sourceforge.net/ */ #include "sox_i.h" @@ -33,7 +32,7 @@ static char const amrwb_magic[] = "#!AMR-WB\n"; #define amr_magic amrwb_magic #define amr_priv_t amrwb_priv_t #define amr_opencore_funcs amrwb_opencore_funcs -#define amr_gp3_funcs amrwb_gp3_funcs +#define amr_vo_funcs amrwb_vo_funcs #define AMR_CODED_MAX 61 /* NB_SERIAL_MAX */ #define AMR_ENCODING SOX_ENCODING_AMR_WB @@ -62,11 +61,11 @@ static char const amrwb_magic[] = "#!AMR-WB\n"; AMR_FUNC(f,x, void, D_IF_decode, (void* state, const unsigned char* in, short* out, int bfi)) \ AMR_FUNC(f,x, void, D_IF_exit, (void* state)) \ -#define AmrOpencoreDecoderInit() \ +#define AmrDecoderInit() \ D_IF_init() -#define AmrOpencoreDecoderDecode(state, in, out, bfi) \ +#define AmrDecoderDecode(state, in, out, bfi) \ D_IF_decode(state, in, out, bfi) -#define AmrOpencoreDecoderExit(state) \ +#define AmrDecoderExit(state) \ D_IF_exit(state) #define AMR_OPENCORE_DESC "amr-wb OpenCore library" @@ -79,41 +78,30 @@ static const char* const amr_opencore_library_names[] = NULL }; -/* 3GPP (reference implementation) definitions: */ +/* VO definitions: */ -#if !defined(HAVE_OPENCORE_AMRWB_DEC_IF_H) || defined(DL_AMRWB) - #define AMR_GP3 1 +#if defined(HAVE_VO_AMRWBENC_ENC_IF_H) || defined(DL_AMRWB) + #define AMR_VO 1 #endif -#define AMR_GP3_FUNC_ENTRIES(f,x) \ +#define AMR_VO_FUNC_ENTRIES(f,x) \ AMR_FUNC(f,x, void*, E_IF_init, (void)) \ - AMR_FUNC(f,x, int, GP3E_IF_encode,(void* state, int16_t mode, int16_t* in, uint8_t* out, int16_t dtx)) \ + AMR_FUNC(f,x, int, E_IF_encode,(void* state, int16_t mode, int16_t* in, uint8_t* out, int16_t dtx)) \ AMR_FUNC(f,x, void, E_IF_exit, (void* state)) \ - AMR_FUNC(f,x, void*, D_IF_init, (void)) \ - AMR_FUNC(f,x, void, GP3D_IF_decode,(void* state, uint8_t* in, int16_t* out, int32_t bfi)) \ - AMR_FUNC(f,x, void, D_IF_exit, (void* state)) \ -#define AmrGp3EncoderInit() \ +#define AmrEncoderInit() \ E_IF_init() -#define AmrGp3EncoderEncode(state, mode, in, out, forceSpeech) \ - GP3E_IF_encode(state, mode, in, out, forceSpeech) -#define AmrGp3EncoderExit(state) \ +#define AmrEncoderEncode(state, mode, in, out, forceSpeech) \ + E_IF_encode(state, mode, in, out, forceSpeech) +#define AmrEncoderExit(state) \ E_IF_exit(state) -#define AmrGp3DecoderInit() \ - D_IF_init() -#define AmrGp3DecoderDecode(state, in, out, bfi) \ - GP3D_IF_decode(state, in, out, bfi) -#define AmrGp3DecoderExit(state) \ - D_IF_exit(state) -#define AMR_GP3_DESC "amr-wb 3GPP reference library" -static const char* const amr_gp3_library_names[] = +#define AMR_VO_DESC "amr-wb VisualOn library" +static const char* const amr_vo_library_names[] = { #ifdef DL_AMRWB - "libamrwb-3", - "libamrwb", - "amrwb", - "cygamrwb-3", + "libvo-amrwbenc", + "libvo-amrwbenc-0", #endif NULL }; diff --git a/src/amr.h b/src/amr.h index 12fb52b5..fe4ef368 100644 --- a/src/amr.h +++ b/src/amr.h @@ -28,49 +28,38 @@ typedef struct amr_opencore_funcs { #endif /* AMR_OPENCORE */ -#ifdef AMR_GP3 - -LSX_DLENTRIES_TO_FUNCTIONS(AMR_GP3_FUNC_ENTRIES) - -typedef struct amr_gp3_funcs { - LSX_DLENTRIES_TO_PTRS(AMR_GP3_FUNC_ENTRIES, amr_dl); -} amr_gp3_funcs; - -#endif /* AMR_GP3 */ - -#if defined(AMR_OPENCORE) && defined (AMR_GP3) - #define AMR_CALL(p, opencoreFunc, gp3Func, args) \ - ((p)->loaded_opencore ? ((p)->opencore.opencoreFunc args) : ((p)->gp3.gp3Func args)) - #if AMR_OPENCORE_ENABLE_ENCODE - #define AMR_CALL_ENCODER AMR_CALL - #else - #define AMR_CALL_ENCODER(p, opencoreFunc, gp3Func, args) \ - ((p)->gp3.gp3Func args) - #endif -#elif defined(AMR_OPENCORE) - #define AMR_CALL(p, opencoreFunc, gp3Func, args) \ - ((p)->opencore.opencoreFunc args) - #define AMR_CALL_ENCODER AMR_CALL -#elif defined(AMR_GP3) - #define AMR_CALL(p, opencoreFunc, gp3Func, args) \ - ((p)->gp3.gp3Func args) - #define AMR_CALL_ENCODER AMR_CALL +#ifdef AMR_VO + +LSX_DLENTRIES_TO_FUNCTIONS(AMR_VO_FUNC_ENTRIES) + +typedef struct amr_vo_funcs { + LSX_DLENTRIES_TO_PTRS(AMR_VO_FUNC_ENTRIES, amr_dl); +} amr_vo_funcs; + +#endif /* AMR_VO */ + +#define AMR_CALL(p, func, args) ((p)->opencore.func args) + +#ifdef AMR_VO + #define AMR_CALL_ENCODER(p, func, args) ((p)->vo.func args) +#else + #define AMR_CALL_ENCODER(p, func, args) ((p)->opencore.func args) #endif typedef struct amr_priv_t { void* state; unsigned mode; size_t pcm_index; - int loaded_opencore; #ifdef AMR_OPENCORE amr_opencore_funcs opencore; #endif /* AMR_OPENCORE */ -#ifdef AMR_GP3 - amr_gp3_funcs gp3; -#endif /* AMR_GP3 */ +#ifdef AMR_VO + amr_vo_funcs vo; +#endif /* AMR_VO */ short pcm[AMR_FRAME]; } priv_t; +#ifdef AMR_OPENCORE static size_t decode_1_frame(sox_format_t * ft) { priv_t * p = (priv_t *)ft->priv; @@ -87,9 +76,10 @@ static size_t decode_1_frame(sox_format_t * ft) n--; if (lsx_readbuf(ft, &coded[1], n) != n) return AMR_FRAME; - AMR_CALL(p, AmrOpencoreDecoderDecode, AmrGp3DecoderDecode, (p->state, coded, p->pcm, 0)); + AMR_CALL(p, AmrDecoderDecode, (p->state, coded, p->pcm, 0)); return 0; } +#endif static int openlibrary(priv_t* p, int encoding) { @@ -108,42 +98,28 @@ static int openlibrary(priv_t* p, int encoding) amr_opencore_library_names, open_library_result); if (!open_library_result) - { - p->loaded_opencore = 1; return SOX_SUCCESS; - } - } - else - { - lsx_report("Not attempting to load " AMR_OPENCORE_DESC " because it does not support encoding."); + lsx_fail("Unable to open " AMR_OPENCORE_DESC); + return SOX_EOF; } #endif /* AMR_OPENCORE */ -#ifdef AMR_GP3 - LSX_DLLIBRARY_TRYOPEN( - 0, - &p->gp3, - amr_dl, - AMR_GP3_FUNC_ENTRIES, - AMR_GP3_DESC, - amr_gp3_library_names, - open_library_result); - if (!open_library_result) - return SOX_SUCCESS; -#endif /* AMR_GP3 */ +#ifdef AMR_VO + if (encoding) { + LSX_DLLIBRARY_TRYOPEN( + 0, + &p->vo, + amr_dl, + AMR_VO_FUNC_ENTRIES, + AMR_VO_DESC, + amr_vo_library_names, + open_library_result); + if (!open_library_result) + return SOX_SUCCESS; + lsx_fail("Unable to open " AMR_VO_DESC); + } +#endif /* AMR_VO */ - lsx_fail( - "Unable to open " -#ifdef AMR_OPENCORE - AMR_OPENCORE_DESC -#endif -#if defined(AMR_OPENCORE) && defined(AMR_GP3) - " or " -#endif -#ifdef AMR_GP3 - AMR_GP3_DESC -#endif - "."); return SOX_EOF; } @@ -152,11 +128,12 @@ static void closelibrary(priv_t* p) #ifdef AMR_OPENCORE LSX_DLLIBRARY_CLOSE(&p->opencore, amr_dl); #endif -#ifdef AMR_GP3 - LSX_DLLIBRARY_CLOSE(&p->gp3, amr_dl); +#ifdef AMR_VO + LSX_DLLIBRARY_CLOSE(&p->vo, amr_dl); #endif } +#ifdef AMR_OPENCORE static size_t amr_duration_frames(sox_format_t * ft) { off_t frame_size, data_start_offset = lsx_tell(ft); @@ -178,9 +155,14 @@ static size_t amr_duration_frames(sox_format_t * ft) lsx_seeki(ft, data_start_offset, SEEK_SET); return frames; } +#endif static int startread(sox_format_t * ft) { +#if !defined(AMR_OPENCORE) + lsx_fail_errno(ft, SOX_EOF, "SoX was compiled without AMR-WB decoding support."); + return SOX_EOF; +#else priv_t * p = (priv_t *)ft->priv; char buffer[sizeof(amr_magic) - 1]; int open_library_result; @@ -197,7 +179,7 @@ static int startread(sox_format_t * ft) return open_library_result; p->pcm_index = AMR_FRAME; - p->state = AMR_CALL(p, AmrOpencoreDecoderInit, AmrGp3DecoderInit, ()); + p->state = AMR_CALL(p, AmrDecoderInit, ()); if (!p->state) { closelibrary(p); @@ -211,8 +193,11 @@ static int startread(sox_format_t * ft) ft->signal.length = ft->signal.length != SOX_IGNORE_LENGTH && ft->seekable? (size_t)(amr_duration_frames(ft) * .02 * ft->signal.rate +.5) : SOX_UNSPEC; return SOX_SUCCESS; +#endif } +#ifdef AMR_OPENCORE + static size_t read_samples(sox_format_t * ft, sox_sample_t * buf, size_t len) { priv_t * p = (priv_t *)ft->priv; @@ -231,14 +216,21 @@ static size_t read_samples(sox_format_t * ft, sox_sample_t * buf, size_t len) static int stopread(sox_format_t * ft) { priv_t * p = (priv_t *)ft->priv; - AMR_CALL(p, AmrOpencoreDecoderExit, AmrGp3DecoderExit, (p->state)); + AMR_CALL(p, AmrDecoderExit, (p->state)); closelibrary(p); return SOX_SUCCESS; } +#else + +#define read_samples NULL +#define stopread NULL + +#endif + static int startwrite(sox_format_t * ft) { -#if !defined(AMR_GP3) && !AMR_OPENCORE_ENABLE_ENCODE +#if !defined(AMR_VO) && !AMR_OPENCORE_ENABLE_ENCODE lsx_fail_errno(ft, SOX_EOF, "SoX was compiled without AMR-WB encoding support."); return SOX_EOF; #else @@ -258,7 +250,7 @@ static int startwrite(sox_format_t * ft) if (open_library_result != SOX_SUCCESS) return open_library_result; - p->state = AMR_CALL_ENCODER(p, AmrOpencoreEncoderInit, AmrGp3EncoderInit, ()); + p->state = AMR_CALL_ENCODER(p, AmrEncoderInit, ()); if (!p->state) { closelibrary(p); @@ -272,13 +264,13 @@ static int startwrite(sox_format_t * ft) #endif } -#if defined(AMR_GP3) || AMR_OPENCORE_ENABLE_ENCODE +#if defined(AMR_VO) || AMR_OPENCORE_ENABLE_ENCODE static sox_bool encode_1_frame(sox_format_t * ft) { priv_t * p = (priv_t *)ft->priv; uint8_t coded[AMR_CODED_MAX]; - int n = AMR_CALL_ENCODER(p, AmrOpencoreEncoderEncode, AmrGp3EncoderEncode, (p->state, p->mode, p->pcm, coded, 1)); + int n = AMR_CALL_ENCODER(p, AmrEncoderEncode, (p->state, p->mode, p->pcm, coded, 1)); sox_bool result = lsx_writebuf(ft, coded, (size_t) (size_t) (unsigned)n) == (unsigned)n; if (!result) lsx_fail_errno(ft, errno, "write error"); @@ -314,7 +306,7 @@ static int stopwrite(sox_format_t * ft) if (!encode_1_frame(ft)) result = SOX_EOF; } - AMR_CALL_ENCODER(p, AmrOpencoreEncoderExit, AmrGp3EncoderExit, (p->state)); + AMR_CALL_ENCODER(p, AmrEncoderExit, (p->state)); return result; } @@ -323,7 +315,7 @@ static int stopwrite(sox_format_t * ft) #define write_samples NULL #define stopwrite NULL -#endif /* defined(AMR_GP3) || AMR_OPENCORE_ENABLE_ENCODE */ +#endif /* defined(AMR_VO) || AMR_OPENCORE_ENABLE_ENCODE */ sox_format_handler_t const * AMR_FORMAT_FN(void); sox_format_handler_t const * AMR_FORMAT_FN(void) -- 2.11.4.GIT