From fe6d69c061c3f143c47eaf6f383172e1dc1312fb Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 19 Feb 2021 22:09:10 -0500 Subject: [PATCH] import-tar --- Makefile | 4 +- Makefile.moddir_rules | 2 +- addons/app_mysql.c | 1 + addons/cdr_mysql.c | 1 + addons/chan_mobile.c | 1 + addons/chan_ooh323.c | 1 + addons/format_mp3.c | 1 + addons/mp3/MPGLIB_README | 39 - addons/mp3/MPGLIB_TODO | 2 - addons/mp3/Makefile | 24 - addons/mp3/README | 1 - addons/mp3/common.c | 267 -- addons/mp3/dct64_i386.c | 335 -- addons/mp3/decode_i386.c | 153 - addons/mp3/decode_ntom.c | 219 - addons/mp3/huffman.h | 332 -- addons/mp3/interface.c | 325 -- addons/mp3/layer3.c | 2029 -------- addons/mp3/mpg123.h | 132 - addons/mp3/mpglib.h | 75 - addons/mp3/tabinit.c | 81 - addons/res_config_mysql.c | 1 + apps/Makefile | 20 - build_tools/cflags-devmode.xml | 3 + build_tools/cflags.xml | 6 +- build_tools/make_build_h | 8 - build_tools/menuselect-deps.in | 3 - channels/chan_mgcp.c | 1 + channels/chan_motif.c | 152 +- channels/chan_sip.c | 8 +- channels/chan_vpb.cc | 2 +- channels/console_video.h | 4 +- codecs/Makefile | 1 + codecs/codec_amr.c | 405 -- codecs/codec_ilbc.c | 1 - codecs/ex_amr.h | 49 - configure.ac | 24 +- contrib/asterisk.service | 49 - contrib/scripts/asterisk_cleanup | 18 - contrib/scripts/astgenkey | 4 - contrib/scripts/live_ast | 38 - debian/50-asterisk | 17 - debian/NEWS | 74 - debian/README.Debian | 325 -- debian/README.source | 44 - debian/TODO.Debian | 3 - debian/ast_config/manager.conf | 16 - debian/ast_config/manager.d/README.conf | 3 - debian/ast_config/modules.conf | 73 - debian/asterisk-config-custom | 364 -- debian/asterisk-config-custom.1 | 74 - debian/asterisk-config.dirs | 1 - debian/asterisk-config.examples | 5 - debian/asterisk-config.install | 2 - debian/asterisk-config.lintian-overrides | 1 - debian/asterisk-config.postinst | 51 - debian/asterisk-config.preinst | 59 - debian/asterisk-dahdi.install | 5 - debian/asterisk-dev.install | 2 - debian/asterisk-dev.links | 1 - debian/asterisk-doc.docs | 11 - debian/asterisk-mobile.install | 1 - debian/asterisk-modules.install | 1 - debian/asterisk-modules.lintian-overrides | 3 - debian/asterisk-mp3.install | 1 - debian/asterisk-mysql.install | 3 - debian/asterisk-ooh323.install | 1 - debian/asterisk-tests.install | 2 - debian/asterisk-tests.lintian-overrides | 2 - debian/asterisk-voicemail-imapstorage.install | 1 - debian/asterisk-voicemail-odbcstorage.install | 1 - debian/asterisk-voicemail.install | 1 - debian/asterisk-vpb.install | 1 - debian/asterisk.default | 72 - debian/asterisk.dirs | 22 - debian/asterisk.docs | 6 - debian/asterisk.examples | 4 - debian/asterisk.init | 224 - debian/asterisk.install | 10 - debian/asterisk.links | 4 - debian/asterisk.lintian-overrides | 6 - debian/asterisk.logrotate | 9 - debian/asterisk.manpages | 4 - debian/asterisk.postinst | 111 - debian/asterisk.postrm | 11 - debian/asterisk.prerm | 8 - debian/asterisk.startup.conf | 44 - debian/astgenkey.8 | 129 - debian/astman.1 | 102 - debian/autosupport.8 | 41 - debian/backports/lenny | 12 - debian/backports/squeeze | 11 - debian/changelog | 3417 -------------- debian/clean | 6 - debian/compat | 1 - debian/control | 361 -- debian/copyright | 750 --- debian/copyright-check | 11 - debian/copyright.pjproject | 334 -- debian/copyright_hints | 2380 ---------- debian/debhelper/asterisk.pm | 8 - debian/debhelper/dh_asterisk | 82 - debian/dummyprogs/fetch | 10 - debian/gbp.conf | 7 - debian/patches/AST-2019-002.patch | 40 - debian/patches/AST-2019-003.patch | 39 - debian/patches/aelparse_enable.patch | 16 - debian/patches/amr.patch | 1221 ----- debian/patches/apply-patch-from-eta.patch | 315 -- debian/patches/astdatadir | 21 - debian/patches/astgenkey-security | 21 - debian/patches/autoreconf-pjproject | 22 - debian/patches/build-reproducibly | 28 - debian/patches/enable_addons | 72 - debian/patches/ffmpeg-detection.patch | 42 - debian/patches/ffmpeg-includes.patch | 21 - debian/patches/h323-extra-target | 20 - debian/patches/h323-no-deps-on-asterisk | 42 - .../patches/h323-workaround-openh323-segfault | 32 - debian/patches/hack-multiple-app-voicemail | 64 - debian/patches/ilbc_disable | 34 - debian/patches/make-clean-fixes | 34 - debian/patches/mpglib | 4066 ----------------- debian/patches/no_native_arch.patch | 18 - debian/patches/reenable | 25 - debian/patches/series | 40 - debian/patches/smsq_enable.patch | 17 - debian/patches/sound_files | 31 - debian/patches/systemd.patch | 144 - debian/patches/test_framework.patch | 34 - debian/patches/vp8.patch | 213 - debian/pjproject_2.8~dfsg.orig.tar.bz2 | Bin 3632716 -> 0 bytes debian/rules | 188 - debian/rules.copyright-check | 4 - debian/safe_asterisk.8 | 62 - debian/source/format | 1 - debian/source/include-binaries | 1 - debian/source/lintian-overrides | 5 - debian/tests/asttestmods | 69 - debian/tests/control | 3 - debian/tests/testmods/asterisk | 18 - debian/upstream/073B0C1FC9B2E352.key | 55 - debian/upstream/123FD04E861FFB7D.key | 28 - debian/upstream/368AB332B59975F3.key | 34 - debian/upstream/6CB44E557BD982D8.key | 28 - debian/upstream/7C2C8A8BCB3F61BD.key | 56 - debian/upstream/8438CBA18D0CAA72.key | 28 - debian/upstream/9C59F000777DCC45.key | 28 - debian/upstream/9E76E3A42341CE04.key | 69 - debian/upstream/DAB29B236B940F89.key | 42 - debian/upstream/signing-key.asc | 368 -- debian/watch | 4 - include/asterisk/amr.h | 19 - include/asterisk/format_cache.h | 10 - main/codec_builtin.c | 50 - main/format_cache.c | 16 - main/rtp_engine.c | 6 - makeopts.in | 7 - res/res_format_attr_amr.c | 488 -- res/res_pjsip_messaging.c | 9 +- res/res_xmpp.c | 8 +- sounds/sounds.xml | 2 + third-party/pjproject/Makefile | 5 - utils/utils.xml | 4 +- 164 files changed, 39 insertions(+), 22516 deletions(-) delete mode 100644 addons/mp3/MPGLIB_README delete mode 100644 addons/mp3/MPGLIB_TODO delete mode 100644 addons/mp3/Makefile delete mode 100644 addons/mp3/README delete mode 100644 addons/mp3/common.c delete mode 100644 addons/mp3/dct64_i386.c delete mode 100644 addons/mp3/decode_i386.c delete mode 100644 addons/mp3/decode_ntom.c delete mode 100644 addons/mp3/huffman.h delete mode 100644 addons/mp3/interface.c delete mode 100644 addons/mp3/layer3.c delete mode 100644 addons/mp3/mpg123.h delete mode 100644 addons/mp3/mpglib.h delete mode 100644 addons/mp3/tabinit.c delete mode 100644 codecs/codec_amr.c delete mode 100644 codecs/ex_amr.h delete mode 100644 contrib/asterisk.service delete mode 100644 contrib/scripts/asterisk_cleanup delete mode 100755 debian/50-asterisk delete mode 100644 debian/NEWS delete mode 100644 debian/README.Debian delete mode 100644 debian/README.source delete mode 100644 debian/TODO.Debian delete mode 100644 debian/ast_config/manager.conf delete mode 100644 debian/ast_config/manager.d/README.conf delete mode 100644 debian/ast_config/modules.conf delete mode 100644 debian/asterisk-config-custom delete mode 100644 debian/asterisk-config-custom.1 delete mode 100644 debian/asterisk-config.dirs delete mode 100644 debian/asterisk-config.examples delete mode 100644 debian/asterisk-config.install delete mode 100644 debian/asterisk-config.lintian-overrides delete mode 100644 debian/asterisk-config.postinst delete mode 100644 debian/asterisk-config.preinst delete mode 100644 debian/asterisk-dahdi.install delete mode 100644 debian/asterisk-dev.install delete mode 100644 debian/asterisk-dev.links delete mode 100644 debian/asterisk-doc.docs delete mode 100644 debian/asterisk-mobile.install delete mode 100644 debian/asterisk-modules.install delete mode 100644 debian/asterisk-modules.lintian-overrides delete mode 100644 debian/asterisk-mp3.install delete mode 100644 debian/asterisk-mysql.install delete mode 100644 debian/asterisk-ooh323.install delete mode 100644 debian/asterisk-tests.install delete mode 100644 debian/asterisk-tests.lintian-overrides delete mode 100644 debian/asterisk-voicemail-imapstorage.install delete mode 100644 debian/asterisk-voicemail-odbcstorage.install delete mode 100644 debian/asterisk-voicemail.install delete mode 100644 debian/asterisk-vpb.install delete mode 100644 debian/asterisk.default delete mode 100644 debian/asterisk.dirs delete mode 100644 debian/asterisk.docs delete mode 100644 debian/asterisk.examples delete mode 100644 debian/asterisk.init delete mode 100644 debian/asterisk.install delete mode 100644 debian/asterisk.links delete mode 100644 debian/asterisk.lintian-overrides delete mode 100644 debian/asterisk.logrotate delete mode 100644 debian/asterisk.manpages delete mode 100644 debian/asterisk.postinst delete mode 100644 debian/asterisk.postrm delete mode 100644 debian/asterisk.prerm delete mode 100644 debian/asterisk.startup.conf delete mode 100644 debian/astgenkey.8 delete mode 100644 debian/astman.1 delete mode 100644 debian/autosupport.8 delete mode 100755 debian/backports/lenny delete mode 100755 debian/backports/squeeze delete mode 100644 debian/changelog delete mode 100644 debian/clean delete mode 100644 debian/compat delete mode 100644 debian/control delete mode 100644 debian/copyright delete mode 100755 debian/copyright-check delete mode 100644 debian/copyright.pjproject delete mode 100644 debian/copyright_hints delete mode 100644 debian/debhelper/asterisk.pm delete mode 100755 debian/debhelper/dh_asterisk delete mode 100755 debian/dummyprogs/fetch delete mode 100644 debian/gbp.conf delete mode 100644 debian/patches/AST-2019-002.patch delete mode 100644 debian/patches/AST-2019-003.patch delete mode 100644 debian/patches/aelparse_enable.patch delete mode 100644 debian/patches/amr.patch delete mode 100644 debian/patches/apply-patch-from-eta.patch delete mode 100644 debian/patches/astdatadir delete mode 100644 debian/patches/astgenkey-security delete mode 100644 debian/patches/autoreconf-pjproject delete mode 100644 debian/patches/build-reproducibly delete mode 100644 debian/patches/enable_addons delete mode 100644 debian/patches/ffmpeg-detection.patch delete mode 100644 debian/patches/ffmpeg-includes.patch delete mode 100644 debian/patches/h323-extra-target delete mode 100644 debian/patches/h323-no-deps-on-asterisk delete mode 100644 debian/patches/h323-workaround-openh323-segfault delete mode 100644 debian/patches/hack-multiple-app-voicemail delete mode 100644 debian/patches/ilbc_disable delete mode 100644 debian/patches/make-clean-fixes delete mode 100644 debian/patches/mpglib delete mode 100644 debian/patches/no_native_arch.patch delete mode 100644 debian/patches/reenable delete mode 100644 debian/patches/series delete mode 100644 debian/patches/smsq_enable.patch delete mode 100644 debian/patches/sound_files delete mode 100644 debian/patches/systemd.patch delete mode 100644 debian/patches/test_framework.patch delete mode 100644 debian/patches/vp8.patch delete mode 100644 debian/pjproject_2.8~dfsg.orig.tar.bz2 delete mode 100755 debian/rules delete mode 100755 debian/rules.copyright-check delete mode 100644 debian/safe_asterisk.8 delete mode 100644 debian/source/format delete mode 100644 debian/source/include-binaries delete mode 100644 debian/source/lintian-overrides delete mode 100755 debian/tests/asttestmods delete mode 100644 debian/tests/control delete mode 100755 debian/tests/testmods/asterisk delete mode 100644 debian/upstream/073B0C1FC9B2E352.key delete mode 100644 debian/upstream/123FD04E861FFB7D.key delete mode 100644 debian/upstream/368AB332B59975F3.key delete mode 100644 debian/upstream/6CB44E557BD982D8.key delete mode 100644 debian/upstream/7C2C8A8BCB3F61BD.key delete mode 100644 debian/upstream/8438CBA18D0CAA72.key delete mode 100644 debian/upstream/9C59F000777DCC45.key delete mode 100644 debian/upstream/9E76E3A42341CE04.key delete mode 100644 debian/upstream/DAB29B236B940F89.key delete mode 100644 debian/upstream/signing-key.asc delete mode 100644 debian/watch delete mode 100644 include/asterisk/amr.h delete mode 100644 res/res_format_attr_amr.c diff --git a/Makefile b/Makefile index bfb19e6..8911c6a 100644 --- a/Makefile +++ b/Makefile @@ -484,7 +484,7 @@ doc/core-en_US.xml: makeopts .lastclean $(XML_core_en_US) @echo "" >> $@ @for x in $(MOD_SUBDIRS); do \ printf "$$x " ; \ - for i in `find $$x -name '*.c' | LC_ALL=C sort`; do \ + for i in `find $$x -name '*.c'`; do \ $(AWK) -f build_tools/get_documentation $$i >> $@ ; \ done ; \ done @@ -909,8 +909,6 @@ install-logrotate: rm -f contrib/scripts/asterisk.logrotate.tmp config: - $(INSTALL) -d $(DESTDIR)/lib/systemd/system - ./build_tools/install_subst -d contrib/asterisk.service $(DESTDIR)/lib/systemd/system/asterisk.service @if [ -f /etc/redhat-release -o -f /etc/fedora-release ]; then \ ./build_tools/install_subst contrib/init.d/rc.redhat.asterisk "$(DESTDIR)/etc/rc.d/init.d/asterisk"; \ if [ ! -f "$(DESTDIR)/etc/sysconfig/asterisk" ] ; then \ diff --git a/Makefile.moddir_rules b/Makefile.moddir_rules index f7401de..c9f94f9 100644 --- a/Makefile.moddir_rules +++ b/Makefile.moddir_rules @@ -29,7 +29,7 @@ include $(ASTTOPDIR)/Makefile.rules # Use MODULE_EXCLUDE to specify additional modules to exclude. ifneq ($(MODULE_PREFIX),) - ALL_C_MODS:=$(MODS_C_ADDITIONAL) + ALL_C_MODS:= ALL_CC_MODS:= ALL_C_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.c,%,$(wildcard $(p)_*.c))) ALL_CC_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.cc,%,$(wildcard $(p)_*.cc))) diff --git a/addons/app_mysql.c b/addons/app_mysql.c index 123d37c..1a79afe 100644 --- a/addons/app_mysql.c +++ b/addons/app_mysql.c @@ -34,6 +34,7 @@ /*** MODULEINFO mysqlclient + no deprecated func_odbc ***/ diff --git a/addons/cdr_mysql.c b/addons/cdr_mysql.c index c17a434..61d5d5c 100644 --- a/addons/cdr_mysql.c +++ b/addons/cdr_mysql.c @@ -35,6 +35,7 @@ /*** MODULEINFO mysqlclient + no deprecated cdr_adaptive_odbc ***/ diff --git a/addons/chan_mobile.c b/addons/chan_mobile.c index 3aaf82f..427977d 100644 --- a/addons/chan_mobile.c +++ b/addons/chan_mobile.c @@ -36,6 +36,7 @@ /*** MODULEINFO bluetooth + no extended ***/ diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index 34cdb1e..6a65b5f 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -18,6 +18,7 @@ /*** MODULEINFO + no extended ***/ diff --git a/addons/format_mp3.c b/addons/format_mp3.c index 35d452e..f4b0a2a 100644 --- a/addons/format_mp3.c +++ b/addons/format_mp3.c @@ -28,6 +28,7 @@ */ /*** MODULEINFO + no extended ***/ diff --git a/addons/mp3/MPGLIB_README b/addons/mp3/MPGLIB_README deleted file mode 100644 index 3c5f337..0000000 --- a/addons/mp3/MPGLIB_README +++ /dev/null @@ -1,39 +0,0 @@ -MP3 library ------------ -Version 0.2 - -This decoder is a 'light' version (thrown out all unnecessay parts) -from the mpg123 package. I made this for a company. - -Currently only Layer3 is enabled to save some space. Layer1,2 isn't -tested at all. The interface will not change significantly. -A backport to the mpg123 package is planed. - -comiled and tested only on Solaris 2.6 -main.c contains a simple demo application for library. - -COPYING: you may use this source under GPL terms! - -PLEASE NOTE: This software may contain patented alogrithm (at least - patented in some countries). It may be not allowed to sell/use products - based on this source code in these countries. Check this out first! - -COPYRIGHT of MP3 music: - Please note, that the duplicating of copyrighted music without explicit - permission violates the rights of the owner. - -SENDING PATCHES: - Maybe I change the copyright policy (ie some kind of more free BSD licencse). - Please consider this when sending patches/changes. - I also want to have the freedom to sell the code to companies that - can not use the code under GPL. So, if you send me significant patches, - I need your explicit permission to do this. Of course, there will also - be the GPLed open source version of the 100% same code. - For the case you cannot accept this: the code is GPL, it's your freedom - to distribute your changes again under GPL. - -FEEDBACK: - I'm interessted to here from you, when you use this package as part - of another project. - - diff --git a/addons/mp3/MPGLIB_TODO b/addons/mp3/MPGLIB_TODO deleted file mode 100644 index 4037110..0000000 --- a/addons/mp3/MPGLIB_TODO +++ /dev/null @@ -1,2 +0,0 @@ - -apply 'VBR' bugfix diff --git a/addons/mp3/Makefile b/addons/mp3/Makefile deleted file mode 100644 index 7cd0b58..0000000 --- a/addons/mp3/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -MP3OBJS=common.o dct64_i386.o decode_ntom.o layer3.o tabinit.o interface.o - -ifeq ($(OSARCH),FreeBSD) -OSVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk) -CFLAGS+=$(if $(OSVERSION)<500016,-D_THREAD_SAFE) -LIBS+=$(if $(OSVERSION)<502102,-lc_r,-pthread) -INCLUDE+=-I/usr/local/include -CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi) -endif # FreeBSD - -ifeq ($(OSARCH),NetBSD) -CFLAGS+=-pthread -INCLUDE+=-I/usr/local/include -endif - -ifeq ($(OSARCH),OpenBSD) -CFLAGS+=-pthread -endif - -all: $(MP3OBJS) - -clean: - rm -f *.o *.so *~ - rm -f .*.o.d diff --git a/addons/mp3/README b/addons/mp3/README deleted file mode 100644 index 8b13789..0000000 --- a/addons/mp3/README +++ /dev/null @@ -1 +0,0 @@ - diff --git a/addons/mp3/common.c b/addons/mp3/common.c deleted file mode 100644 index 9a6fd8c..0000000 --- a/addons/mp3/common.c +++ /dev/null @@ -1,267 +0,0 @@ -#include "asterisk.h" -#include "asterisk/logger.h" - -#include -#include -#include - -#include -#include -#include - -#include "mpg123.h" -#include "mpglib.h" - -struct parameter param = { 1 , 1 , 0 , 0 }; - -int tabsel_123[2][3][16] = { - { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, - {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, - {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, - - { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, - {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, - {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } -}; - -long freqs[9] = { 44100, 48000, 32000, - 22050, 24000, 16000 , - 11025 , 12000 , 8000 }; - - -#if 0 -static void get_II_stuff(struct frame *fr) -{ - static int translate[3][2][16] = - { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } , - { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } , - { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } , - { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } , - { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } , - { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } }; - - int table,sblim; - static struct al_table *tables[5] = - { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 }; - static int sblims[5] = { 27 , 30 , 8, 12 , 30 }; - - if(fr->lsf) - table = 4; - else - table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index]; - sblim = sblims[table]; - - fr->alloc = tables[table]; - fr->II_sblimit = sblim; -} -#endif - -#define HDRCMPMASK 0xfffffd00 - -#if 0 -int head_check(unsigned long head) -{ - if( (head & 0xffe00000) != 0xffe00000) - return FALSE; - if(!((head>>17)&3)) - return FALSE; - if( ((head>>12)&0xf) == 0xf) - return FALSE; - if( ((head>>10)&0x3) == 0x3 ) - return FALSE; - return TRUE; -} -#endif - - -/* - * the code a header and write the information - * into the frame structure - */ -int decode_header(struct frame *fr,unsigned long newhead) -{ - if( newhead & (1<<20) ) { - fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1; - fr->mpeg25 = 0; - } - else { - fr->lsf = 1; - fr->mpeg25 = 1; - } - - fr->lay = 4-((newhead>>17)&3); - if( ((newhead>>10)&0x3) == 0x3) { - ast_log(LOG_WARNING,"Stream error\n"); - return (0); - } - if(fr->mpeg25) { - fr->sampling_frequency = 6 + ((newhead>>10)&0x3); - } - else - fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); - fr->error_protection = ((newhead>>16)&0x1)^0x1; - - if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */ - fr->bitrate_index = ((newhead>>12)&0xf); - - fr->bitrate_index = ((newhead>>12)&0xf); - fr->padding = ((newhead>>9)&0x1); - fr->extension = ((newhead>>8)&0x1); - fr->mode = ((newhead>>6)&0x3); - fr->mode_ext = ((newhead>>4)&0x3); - fr->copyright = ((newhead>>3)&0x1); - fr->original = ((newhead>>2)&0x1); - fr->emphasis = newhead & 0x3; - - fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; - - if(!fr->bitrate_index) - { - ast_log(LOG_WARNING,"Free format not supported.\n"); - return (0); - } - - switch(fr->lay) - { - case 1: -#if 0 - fr->do_layer = do_layer1; - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? - (fr->mode_ext<<2)+4 : 32; - fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; - fr->framesize /= freqs[fr->sampling_frequency]; - fr->framesize = ((fr->framesize+fr->padding)<<2)-4; -#else - ast_log(LOG_WARNING,"Layer 1 not supported!\n"); -#endif - break; - case 2: -#if 0 - fr->do_layer = do_layer2; - get_II_stuff(fr); - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? - (fr->mode_ext<<2)+4 : fr->II_sblimit; - fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; - fr->framesize /= freqs[fr->sampling_frequency]; - fr->framesize += fr->padding - 4; -#else - ast_log(LOG_WARNING,"Layer 2 not supported!\n"); -#endif - break; - case 3: -#if 0 - fr->do_layer = do_layer3; - if(fr->lsf) - ssize = (fr->stereo == 1) ? 9 : 17; - else - ssize = (fr->stereo == 1) ? 17 : 32; -#endif - -#if 0 - if(fr->error_protection) - ssize += 2; -#endif - fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; - fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf); - fr->framesize = fr->framesize + fr->padding - 4; - break; - default: - ast_log(LOG_WARNING,"Sorry, unknown layer type.\n"); - return (0); - } - return 1; -} - -#if 0 -void print_header(struct frame *fr) -{ - static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; - static char *layers[4] = { "Unknown" , "I", "II", "III" }; - - ast_log(LOG_WARNING,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", - fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), - layers[fr->lay],freqs[fr->sampling_frequency], - modes[fr->mode],fr->mode_ext,fr->framesize+4); - ast_log(LOG_WARNING,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n", - fr->stereo,fr->copyright?"Yes":"No", - fr->original?"Yes":"No",fr->error_protection?"Yes":"No", - fr->emphasis); - ast_log(LOG_WARNING,"Bitrate: %d Kbits/s, Extension value: %d\n", - tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension); -} - -void print_header_compact(struct frame *fr) -{ - static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" }; - static char *layers[4] = { "Unknown" , "I", "II", "III" }; - - ast_log(LOG_WARNING,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n", - fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), - layers[fr->lay], - tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index], - freqs[fr->sampling_frequency], modes[fr->mode]); -} - -#endif - -unsigned int getbits(struct mpstr *mp, int number_of_bits) -{ - unsigned long rval; - - if(!number_of_bits) - return 0; - - { - rval = (mp->worksample).wordpointer[0]; - rval <<= 8; - rval |= (mp->worksample).wordpointer[1]; - rval <<= 8; - rval |= (mp->worksample).wordpointer[2]; - rval <<= (mp->worksample).bitindex; - rval &= 0xffffff; - - (mp->worksample).bitindex += number_of_bits; - - rval >>= (24-number_of_bits); - - (mp->worksample).wordpointer += ((mp->worksample).bitindex>>3); - (mp->worksample).bitindex &= 7; - } - return rval; -} - -unsigned int getbits_fast(struct mpstr *mp, int number_of_bits) -{ - unsigned long rval; - - { - rval = (mp->worksample).wordpointer[0]; - rval <<= 8; - rval |= (mp->worksample).wordpointer[1]; - rval <<= (mp->worksample).bitindex; - rval &= 0xffff; - (mp->worksample).bitindex += number_of_bits; - - rval >>= (16-number_of_bits); - - (mp->worksample).wordpointer += ((mp->worksample).bitindex>>3); - (mp->worksample).bitindex &= 7; - } - return rval; -} - -unsigned int get1bit(struct mpstr *mp) -{ - unsigned char rval; - - rval = *((mp->worksample).wordpointer) << (mp->worksample).bitindex; - - (mp->worksample).bitindex++; - (mp->worksample).wordpointer += ((mp->worksample).bitindex>>3); - (mp->worksample).bitindex &= 7; - - return rval>>7; -} - - - diff --git a/addons/mp3/dct64_i386.c b/addons/mp3/dct64_i386.c deleted file mode 100644 index c6b5d88..0000000 --- a/addons/mp3/dct64_i386.c +++ /dev/null @@ -1,335 +0,0 @@ - -/* - * Discrete Cosine Tansform (DCT) for subband synthesis - * optimized for machines with no auto-increment. - * The performance is highly compiler dependend. Maybe - * the dct64.c version for 'normal' processor may be faster - * even for Intel processors. - */ - -#include "mpg123.h" - -/* - * the call via dct64 is a trick to force GCC to use - * (new) registers for the b1,b2 pointer to the bufs[xx] field - */ -void dct64(real *a,real *b,real *c); - -static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples) -{ - { - register real *costab = pnts[0]; - - b1[0x00] = samples[0x00] + samples[0x1F]; - b1[0x01] = samples[0x01] + samples[0x1E]; - b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; - b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; - - b1[0x02] = samples[0x02] + samples[0x1D]; - b1[0x03] = samples[0x03] + samples[0x1C]; - b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; - b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; - - b1[0x04] = samples[0x04] + samples[0x1B]; - b1[0x05] = samples[0x05] + samples[0x1A]; - b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; - b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; - - b1[0x06] = samples[0x06] + samples[0x19]; - b1[0x07] = samples[0x07] + samples[0x18]; - b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; - b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; - - b1[0x08] = samples[0x08] + samples[0x17]; - b1[0x09] = samples[0x09] + samples[0x16]; - b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; - b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; - - b1[0x0A] = samples[0x0A] + samples[0x15]; - b1[0x0B] = samples[0x0B] + samples[0x14]; - b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; - b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; - - b1[0x0C] = samples[0x0C] + samples[0x13]; - b1[0x0D] = samples[0x0D] + samples[0x12]; - b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; - b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; - - b1[0x0E] = samples[0x0E] + samples[0x11]; - b1[0x0F] = samples[0x0F] + samples[0x10]; - b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; - b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; - - } - - - { - register real *costab = pnts[1]; - - b2[0x00] = b1[0x00] + b1[0x0F]; - b2[0x01] = b1[0x01] + b1[0x0E]; - b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; - b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; - - b2[0x02] = b1[0x02] + b1[0x0D]; - b2[0x03] = b1[0x03] + b1[0x0C]; - b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; - b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; - - b2[0x04] = b1[0x04] + b1[0x0B]; - b2[0x05] = b1[0x05] + b1[0x0A]; - b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; - b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; - - b2[0x06] = b1[0x06] + b1[0x09]; - b2[0x07] = b1[0x07] + b1[0x08]; - b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; - b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; - - /* */ - - b2[0x10] = b1[0x10] + b1[0x1F]; - b2[0x11] = b1[0x11] + b1[0x1E]; - b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; - b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; - - b2[0x12] = b1[0x12] + b1[0x1D]; - b2[0x13] = b1[0x13] + b1[0x1C]; - b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; - b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; - - b2[0x14] = b1[0x14] + b1[0x1B]; - b2[0x15] = b1[0x15] + b1[0x1A]; - b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; - b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; - - b2[0x16] = b1[0x16] + b1[0x19]; - b2[0x17] = b1[0x17] + b1[0x18]; - b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; - b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; - } - - { - register real *costab = pnts[2]; - - b1[0x00] = b2[0x00] + b2[0x07]; - b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; - b1[0x01] = b2[0x01] + b2[0x06]; - b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; - b1[0x02] = b2[0x02] + b2[0x05]; - b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; - b1[0x03] = b2[0x03] + b2[0x04]; - b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; - - b1[0x08] = b2[0x08] + b2[0x0F]; - b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; - b1[0x09] = b2[0x09] + b2[0x0E]; - b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; - b1[0x0A] = b2[0x0A] + b2[0x0D]; - b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; - b1[0x0B] = b2[0x0B] + b2[0x0C]; - b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; - - b1[0x10] = b2[0x10] + b2[0x17]; - b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; - b1[0x11] = b2[0x11] + b2[0x16]; - b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; - b1[0x12] = b2[0x12] + b2[0x15]; - b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; - b1[0x13] = b2[0x13] + b2[0x14]; - b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; - - b1[0x18] = b2[0x18] + b2[0x1F]; - b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; - b1[0x19] = b2[0x19] + b2[0x1E]; - b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; - b1[0x1A] = b2[0x1A] + b2[0x1D]; - b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; - b1[0x1B] = b2[0x1B] + b2[0x1C]; - b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; - } - - { - register real const cos0 = pnts[3][0]; - register real const cos1 = pnts[3][1]; - - b2[0x00] = b1[0x00] + b1[0x03]; - b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; - b2[0x01] = b1[0x01] + b1[0x02]; - b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; - - b2[0x04] = b1[0x04] + b1[0x07]; - b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; - b2[0x05] = b1[0x05] + b1[0x06]; - b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; - - b2[0x08] = b1[0x08] + b1[0x0B]; - b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; - b2[0x09] = b1[0x09] + b1[0x0A]; - b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; - - b2[0x0C] = b1[0x0C] + b1[0x0F]; - b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; - b2[0x0D] = b1[0x0D] + b1[0x0E]; - b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; - - b2[0x10] = b1[0x10] + b1[0x13]; - b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; - b2[0x11] = b1[0x11] + b1[0x12]; - b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; - - b2[0x14] = b1[0x14] + b1[0x17]; - b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; - b2[0x15] = b1[0x15] + b1[0x16]; - b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; - - b2[0x18] = b1[0x18] + b1[0x1B]; - b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; - b2[0x19] = b1[0x19] + b1[0x1A]; - b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; - - b2[0x1C] = b1[0x1C] + b1[0x1F]; - b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; - b2[0x1D] = b1[0x1D] + b1[0x1E]; - b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; - } - - { - register real const cos0 = pnts[4][0]; - - b1[0x00] = b2[0x00] + b2[0x01]; - b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; - b1[0x02] = b2[0x02] + b2[0x03]; - b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; - b1[0x02] += b1[0x03]; - - b1[0x04] = b2[0x04] + b2[0x05]; - b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; - b1[0x06] = b2[0x06] + b2[0x07]; - b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; - b1[0x06] += b1[0x07]; - b1[0x04] += b1[0x06]; - b1[0x06] += b1[0x05]; - b1[0x05] += b1[0x07]; - - b1[0x08] = b2[0x08] + b2[0x09]; - b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; - b1[0x0A] = b2[0x0A] + b2[0x0B]; - b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; - b1[0x0A] += b1[0x0B]; - - b1[0x0C] = b2[0x0C] + b2[0x0D]; - b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; - b1[0x0E] = b2[0x0E] + b2[0x0F]; - b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; - b1[0x0E] += b1[0x0F]; - b1[0x0C] += b1[0x0E]; - b1[0x0E] += b1[0x0D]; - b1[0x0D] += b1[0x0F]; - - b1[0x10] = b2[0x10] + b2[0x11]; - b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; - b1[0x12] = b2[0x12] + b2[0x13]; - b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; - b1[0x12] += b1[0x13]; - - b1[0x14] = b2[0x14] + b2[0x15]; - b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; - b1[0x16] = b2[0x16] + b2[0x17]; - b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; - b1[0x16] += b1[0x17]; - b1[0x14] += b1[0x16]; - b1[0x16] += b1[0x15]; - b1[0x15] += b1[0x17]; - - b1[0x18] = b2[0x18] + b2[0x19]; - b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; - b1[0x1A] = b2[0x1A] + b2[0x1B]; - b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; - b1[0x1A] += b1[0x1B]; - - b1[0x1C] = b2[0x1C] + b2[0x1D]; - b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; - b1[0x1E] = b2[0x1E] + b2[0x1F]; - b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; - b1[0x1E] += b1[0x1F]; - b1[0x1C] += b1[0x1E]; - b1[0x1E] += b1[0x1D]; - b1[0x1D] += b1[0x1F]; - } - - out0[0x10*16] = b1[0x00]; - out0[0x10*12] = b1[0x04]; - out0[0x10* 8] = b1[0x02]; - out0[0x10* 4] = b1[0x06]; - out0[0x10* 0] = b1[0x01]; - out1[0x10* 0] = b1[0x01]; - out1[0x10* 4] = b1[0x05]; - out1[0x10* 8] = b1[0x03]; - out1[0x10*12] = b1[0x07]; - -#if 1 - out0[0x10*14] = b1[0x08] + b1[0x0C]; - out0[0x10*10] = b1[0x0C] + b1[0x0a]; - out0[0x10* 6] = b1[0x0A] + b1[0x0E]; - out0[0x10* 2] = b1[0x0E] + b1[0x09]; - out1[0x10* 2] = b1[0x09] + b1[0x0D]; - out1[0x10* 6] = b1[0x0D] + b1[0x0B]; - out1[0x10*10] = b1[0x0B] + b1[0x0F]; - out1[0x10*14] = b1[0x0F]; -#else - b1[0x08] += b1[0x0C]; - out0[0x10*14] = b1[0x08]; - b1[0x0C] += b1[0x0a]; - out0[0x10*10] = b1[0x0C]; - b1[0x0A] += b1[0x0E]; - out0[0x10* 6] = b1[0x0A]; - b1[0x0E] += b1[0x09]; - out0[0x10* 2] = b1[0x0E]; - b1[0x09] += b1[0x0D]; - out1[0x10* 2] = b1[0x09]; - b1[0x0D] += b1[0x0B]; - out1[0x10* 6] = b1[0x0D]; - b1[0x0B] += b1[0x0F]; - out1[0x10*10] = b1[0x0B]; - out1[0x10*14] = b1[0x0F]; -#endif - - { - real tmp; - tmp = b1[0x18] + b1[0x1C]; - out0[0x10*15] = tmp + b1[0x10]; - out0[0x10*13] = tmp + b1[0x14]; - tmp = b1[0x1C] + b1[0x1A]; - out0[0x10*11] = tmp + b1[0x14]; - out0[0x10* 9] = tmp + b1[0x12]; - tmp = b1[0x1A] + b1[0x1E]; - out0[0x10* 7] = tmp + b1[0x12]; - out0[0x10* 5] = tmp + b1[0x16]; - tmp = b1[0x1E] + b1[0x19]; - out0[0x10* 3] = tmp + b1[0x16]; - out0[0x10* 1] = tmp + b1[0x11]; - tmp = b1[0x19] + b1[0x1D]; - out1[0x10* 1] = tmp + b1[0x11]; - out1[0x10* 3] = tmp + b1[0x15]; - tmp = b1[0x1D] + b1[0x1B]; - out1[0x10* 5] = tmp + b1[0x15]; - out1[0x10* 7] = tmp + b1[0x13]; - tmp = b1[0x1B] + b1[0x1F]; - out1[0x10* 9] = tmp + b1[0x13]; - out1[0x10*11] = tmp + b1[0x17]; - out1[0x10*13] = b1[0x17] + b1[0x1F]; - out1[0x10*15] = b1[0x1F]; - } -} - -/* - * the call via dct64 is a trick to force GCC to use - * (new) registers for the b1,b2 pointer to the bufs[xx] field - */ -void dct64(real *a,real *b,real *c) -{ - real bufs[0x40]; - dct64_1(a,b,bufs,bufs+0x20,c); -} - diff --git a/addons/mp3/decode_i386.c b/addons/mp3/decode_i386.c deleted file mode 100644 index 83e0544..0000000 --- a/addons/mp3/decode_i386.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Mpeg Layer-1,2,3 audio decoder - * ------------------------------ - * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. - * See also 'README' - * - * slighlty optimized for machines without autoincrement/decrement. - * The performance is highly compiler dependend. Maybe - * the decode.c version for 'normal' processor may be faster - * even for Intel processors. - */ - -#include -#include -#include - - -#include "mpglib.h" - - - - /* old WRITE_SAMPLE */ -#define WRITE_SAMPLE(samples,sum,clip) \ - if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ - else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ - else { *(samples) = sum; } - -int synth_1to1_mono(struct mpstr *mp,real *bandPtr,unsigned char *samples,int *pnt) -{ - short samples_tmp[64]; - short *tmp1 = samples_tmp; - int i,ret; - int pnt1 = 0; - - ret = synth_1to1(mp,bandPtr,0,(unsigned char *) samples_tmp,&pnt1); - samples += *pnt; - - for(i=0;i<32;i++) { - *( (short *) samples) = *tmp1; - samples += 2; - tmp1 += 2; - } - *pnt += 64; - - return ret; -} - - -int synth_1to1(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt) -{ - static const int step = 2; - int bo; - short *samples = (short *) (out + *pnt); - - real *b0,(*buf)[0x110]; - int clip = 0; - int bo1; - - bo = mp->synth_bo; - - if(!channel) { - bo--; - bo &= 0xf; - buf = mp->synth_buffs[0]; - } - else { - samples++; - buf = mp->synth_buffs[1]; - } - - if(bo & 0x1) { - b0 = buf[0]; - bo1 = bo; - dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); - } - else { - b0 = buf[1]; - bo1 = bo+1; - dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); - } - - mp->synth_bo = bo; - - { - register int j; - real *window = decwin + 16 - bo1; - - for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step) - { - real sum; - sum = window[0x0] * b0[0x0]; - sum -= window[0x1] * b0[0x1]; - sum += window[0x2] * b0[0x2]; - sum -= window[0x3] * b0[0x3]; - sum += window[0x4] * b0[0x4]; - sum -= window[0x5] * b0[0x5]; - sum += window[0x6] * b0[0x6]; - sum -= window[0x7] * b0[0x7]; - sum += window[0x8] * b0[0x8]; - sum -= window[0x9] * b0[0x9]; - sum += window[0xA] * b0[0xA]; - sum -= window[0xB] * b0[0xB]; - sum += window[0xC] * b0[0xC]; - sum -= window[0xD] * b0[0xD]; - sum += window[0xE] * b0[0xE]; - sum -= window[0xF] * b0[0xF]; - - WRITE_SAMPLE(samples,sum,clip); - } - - { - real sum; - sum = window[0x0] * b0[0x0]; - sum += window[0x2] * b0[0x2]; - sum += window[0x4] * b0[0x4]; - sum += window[0x6] * b0[0x6]; - sum += window[0x8] * b0[0x8]; - sum += window[0xA] * b0[0xA]; - sum += window[0xC] * b0[0xC]; - sum += window[0xE] * b0[0xE]; - WRITE_SAMPLE(samples,sum,clip); - b0-=0x10,window-=0x20,samples+=step; - } - window += bo1<<1; - - for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step) - { - real sum; - sum = -window[-0x1] * b0[0x0]; - sum -= window[-0x2] * b0[0x1]; - sum -= window[-0x3] * b0[0x2]; - sum -= window[-0x4] * b0[0x3]; - sum -= window[-0x5] * b0[0x4]; - sum -= window[-0x6] * b0[0x5]; - sum -= window[-0x7] * b0[0x6]; - sum -= window[-0x8] * b0[0x7]; - sum -= window[-0x9] * b0[0x8]; - sum -= window[-0xA] * b0[0x9]; - sum -= window[-0xB] * b0[0xA]; - sum -= window[-0xC] * b0[0xB]; - sum -= window[-0xD] * b0[0xC]; - sum -= window[-0xE] * b0[0xD]; - sum -= window[-0xF] * b0[0xE]; - sum -= window[-0x0] * b0[0xF]; - - WRITE_SAMPLE(samples,sum,clip); - } - } - *pnt += 128; - - return clip; -} - diff --git a/addons/mp3/decode_ntom.c b/addons/mp3/decode_ntom.c deleted file mode 100644 index e6b10a4..0000000 --- a/addons/mp3/decode_ntom.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Mpeg Layer-1,2,3 audio decoder - * ------------------------------ - * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. - * See also 'README' - * - * N->M down/up sampling. Not optimized for speed. - */ - -#include "asterisk.h" -#include "asterisk/logger.h" -#include -#include -#include - -#include "mpg123.h" -#include "mpglib.h" - -#define WRITE_SAMPLE(samples,sum,clip) \ - if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ - else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ - else { *(samples) = sum; } - -#define NTOM_MUL (32768) -static unsigned long ntom_val[2] = { NTOM_MUL>>1,NTOM_MUL>>1 }; -static unsigned long ntom_step = NTOM_MUL; - - -int synth_ntom_set_step(long m,long n) -{ - if(param.verbose > 1) - ast_log(LOG_WARNING,"Init rate converter: %ld->%ld\n",m,n); - - if(n >= 96000 || m >= 96000 || m == 0 || n == 0) { - ast_log(LOG_WARNING,"NtoM converter: illegal rates\n"); - return (1); - } - - n *= NTOM_MUL; - ntom_step = n / m; - - if(ntom_step > 8*NTOM_MUL) { - ast_log(LOG_WARNING,"max. 1:8 conversion allowed!\n"); - return (1); - } - - ntom_val[0] = ntom_val[1] = NTOM_MUL>>1; - - return (0); - -} - - -int synth_ntom_mono (struct mpstr *mp, real *bandPtr,unsigned char *samples,int *pnt) -{ - short samples_tmp[8*64]; - short *tmp1 = samples_tmp; - int i,ret; - int pnt1 = 0; - - ret = synth_ntom(mp, bandPtr,0,(unsigned char *) samples_tmp,&pnt1); - samples += *pnt; - - for(i=0;i<(pnt1>>2);i++) { - *( (short *)samples) = *tmp1; - samples += 2; - tmp1 += 2; - } - *pnt += pnt1 >> 1; - - return ret; -} - - - -int synth_ntom(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt) -{ - static const int step = 2; - int bo; - short *samples = (short *) (out + *pnt); - - real *b0,(*buf)[0x110]; - int clip = 0; - int bo1; - int ntom; - - bo = mp->synth_bo; - - if(!channel) { - bo--; - bo &= 0xf; - buf = mp->synth_buffs[0]; - ntom = ntom_val[1] = ntom_val[0]; - } - else { - samples++; - out += 2; /* to compute the right *pnt value */ - buf = mp->synth_buffs[1]; - ntom = ntom_val[1]; - } - - if(bo & 0x1) { - b0 = buf[0]; - bo1 = bo; - dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); - } - else { - b0 = buf[1]; - bo1 = bo+1; - dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); - } - - mp->synth_bo = bo; - - { - register int j; - real *window = (mp->decwin) + 16 - bo1; - - for (j=16;j;j--,window+=0x10) - { - real sum; - - ntom += ntom_step; - if(ntom < NTOM_MUL) { - window += 16; - b0 += 16; - continue; - } - - sum = *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - sum += *window++ * *b0++; - sum -= *window++ * *b0++; - - while(ntom >= NTOM_MUL) { - WRITE_SAMPLE(samples,sum,clip); - samples += step; - ntom -= NTOM_MUL; - } - } - - ntom += ntom_step; - if(ntom >= NTOM_MUL) - { - real sum; - sum = window[0x0] * b0[0x0]; - sum += window[0x2] * b0[0x2]; - sum += window[0x4] * b0[0x4]; - sum += window[0x6] * b0[0x6]; - sum += window[0x8] * b0[0x8]; - sum += window[0xA] * b0[0xA]; - sum += window[0xC] * b0[0xC]; - sum += window[0xE] * b0[0xE]; - - while(ntom >= NTOM_MUL) { - WRITE_SAMPLE(samples,sum,clip); - samples += step; - ntom -= NTOM_MUL; - } - } - - b0-=0x10,window-=0x20; - window += bo1<<1; - - for (j=15;j;j--,b0-=0x20,window-=0x10) - { - real sum; - - ntom += ntom_step; - if(ntom < NTOM_MUL) { - window -= 16; - b0 += 16; - continue; - } - - sum = -*(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - sum -= *(--window) * *b0++; - - while(ntom >= NTOM_MUL) { - WRITE_SAMPLE(samples,sum,clip); - samples += step; - ntom -= NTOM_MUL; - } - } - } - - ntom_val[channel] = ntom; - *pnt = ((unsigned char *) samples - out); - - return clip; -} - - diff --git a/addons/mp3/huffman.h b/addons/mp3/huffman.h deleted file mode 100644 index 7fec0d5..0000000 --- a/addons/mp3/huffman.h +++ /dev/null @@ -1,332 +0,0 @@ -/* - * huffman tables ... recalcualted to work with my optimzed - * decoder scheme (MH) - * - * probably we could save a few bytes of memory, because the - * smaller tables are often the part of a bigger table - */ - -struct newhuff -{ - unsigned int linbits; - short *table; -}; - -static short tab0[] = -{ - 0 -}; - -static short tab1[] = -{ - -5, -3, -1, 17, 1, 16, 0 -}; - -static short tab2[] = -{ - -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1, - 16, 0 -}; - -static short tab3[] = -{ - -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1, - 1, 0 -}; - -static short tab5[] = -{ - -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19, - 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16, - 0 -}; - -static short tab6[] = -{ - -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19, - 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16, - 0 -}; - -static short tab7[] = -{ - -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83, - -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1, - 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7, - -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18, - -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0 -}; - -static short tab8[] = -{ - -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83, - -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52, - 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4, - 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1, - 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0 -}; - -static short tab9[] = -{ - -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1, - 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67, - -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5, - -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2, - 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0 -}; - -static short tab10[] = -{ --125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118, - 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3, - -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1, - 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23, - -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81, - -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7, - -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1, - 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1, - 2, 32, 17, -1, 1, 16, 0 -}; - -static short tab11[] = -{ --121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117, - -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55, - -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114, - -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96, - -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38, - 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1, - 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50, - -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2, - 32, 17, -3, -1, 1, 16, 0 -}; - -static short tab12[] = -{ --115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87, - 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115, - 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7, - 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5, - -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37, - 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4, - 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3, - -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1, - 2, 32, 0, 17, -1, 1, 16 -}; - -static short tab13[] = -{ --509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9, - -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238, - 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1, - 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249, - 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158, - -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1, - 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245, - 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1, - 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15, - -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1, - 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1, - 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1, - 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3, - -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1, - 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5, - -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167, - 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76, - 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137, - 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106, - -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43, - -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178, - -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1, - 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161, - -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88, - -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1, - 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25, - 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100, - 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113, - -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38, - -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6, - 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81, - -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11, - -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3, - -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, - 0 -}; - -static short tab15[] = -{ --495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239, - -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237, - 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3, - -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219, - -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173, - -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246, - -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9, - -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243, - 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1, - 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1, - 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3, - -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5, - -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124, - 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1, - 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183, - -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76, - -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1, - 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15, - -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106, - -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5, - -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74, - -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1, - 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134, - 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29, - -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7, - -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7, - -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86, - -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100, - 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69, - -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9, - -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1, - 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20, - 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48, - 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16, - 0 -}; - -static short tab16[] = -{ --509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223, - 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3, - -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5, - -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19, - -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1, - 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5, - -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125, - 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13, - -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3, - -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186, - -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1, - 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169, - -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213, - -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154, - 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1, - 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1, - 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45, - -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107, - -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12, - -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1, - 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74, - 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33, - -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3, - -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147, - -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1, - 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3, - -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1, - 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3, - -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1, - 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9, - -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33, - -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, - -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1, - 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, - 0 -}; - -static short tab24[] = -{ --451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1, - 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9, - -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79, - 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31, - 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1, - 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3, - -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3, - -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235, --143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3, - -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9, - -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1, - 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185, - 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199, - 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3, - -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3, - -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196, - -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1, - 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1, - 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10, - 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9, - 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165, - 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135, - -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104, - -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3, - -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3, - -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7, - -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86, - 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15, - -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84, - -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1, - 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5, - 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5, - -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1, - 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16, - 0 -}; - -static short tab_c0[] = -{ - -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5, - 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8, - 0 -}; - -static short tab_c1[] = -{ - -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9, - 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1, - 0 -}; - - - -static struct newhuff ht[] = -{ - { /* 0 */ 0 , tab0 } , - { /* 2 */ 0 , tab1 } , - { /* 3 */ 0 , tab2 } , - { /* 3 */ 0 , tab3 } , - { /* 0 */ 0 , tab0 } , - { /* 4 */ 0 , tab5 } , - { /* 4 */ 0 , tab6 } , - { /* 6 */ 0 , tab7 } , - { /* 6 */ 0 , tab8 } , - { /* 6 */ 0 , tab9 } , - { /* 8 */ 0 , tab10 } , - { /* 8 */ 0 , tab11 } , - { /* 8 */ 0 , tab12 } , - { /* 16 */ 0 , tab13 } , - { /* 0 */ 0 , tab0 } , - { /* 16 */ 0 , tab15 } , - - { /* 16 */ 1 , tab16 } , - { /* 16 */ 2 , tab16 } , - { /* 16 */ 3 , tab16 } , - { /* 16 */ 4 , tab16 } , - { /* 16 */ 6 , tab16 } , - { /* 16 */ 8 , tab16 } , - { /* 16 */ 10, tab16 } , - { /* 16 */ 13, tab16 } , - { /* 16 */ 4 , tab24 } , - { /* 16 */ 5 , tab24 } , - { /* 16 */ 6 , tab24 } , - { /* 16 */ 7 , tab24 } , - { /* 16 */ 8 , tab24 } , - { /* 16 */ 9 , tab24 } , - { /* 16 */ 11, tab24 } , - { /* 16 */ 13, tab24 } -}; - -static struct newhuff htc[] = -{ - { /* 1 , 1 , */ 0 , tab_c0 } , - { /* 1 , 1 , */ 0 , tab_c1 } -}; - - diff --git a/addons/mp3/interface.c b/addons/mp3/interface.c deleted file mode 100644 index 2f3e3c3..0000000 --- a/addons/mp3/interface.c +++ /dev/null @@ -1,325 +0,0 @@ -#define WRAP_LIBC_MALLOC -#define ASTMM_LIBC ASTMM_REDIRECT -#include "asterisk.h" -#include "asterisk/logger.h" - -#include -#include - -#include "mpg123.h" -#include "mpglib.h" - - -void InitMP3Constants(void) -{ - init_layer3_const(); - make_decode_tables_const(); - -} - - -BOOL InitMP3(struct mpstr *mp, long outscale) -{ - /* quiet 4096 med 8192 */ - - memset(mp,0,sizeof(struct mpstr)); - - mp->framesize = 0; - mp->fsizeold = -1; - mp->bsize = 0; - mp->head = mp->tail = NULL; - mp->fr.single = 3; /* force mono */ - mp->bsnum = 0; - mp->synth_bo = 1; - mp->outsamplerate = 8000; - - make_decode_tables_scale(mp, outscale); - - init_layer3_sample_limits(mp, SBLIMIT); - - return !0; -} - -void ExitMP3(struct mpstr *mp) -{ - struct buf *b,*bn; - - b = mp->tail; - while(b) { - free(b->pnt); - bn = b->next; - free(b); - b = bn; - } -} - -static struct buf *addbuf(struct mpstr *mp,char *buf,int size) -{ - struct buf *nbuf; - - nbuf = malloc( sizeof(struct buf) ); - if(!nbuf) { - ast_log(LOG_WARNING,"Out of memory!\n"); - return NULL; - } - nbuf->pnt = malloc(size); - if(!nbuf->pnt) { - free(nbuf); - return NULL; - } - nbuf->size = size; - memcpy(nbuf->pnt,buf,size); - nbuf->next = NULL; - nbuf->prev = mp->head; - nbuf->pos = 0; - - if(!mp->tail) { - mp->tail = nbuf; - } - else { - mp->head->next = nbuf; - } - - mp->head = nbuf; - mp->bsize += size; - - return nbuf; -} - -static void remove_buf(struct mpstr *mp) -{ - struct buf *buf = mp->tail; - - mp->tail = buf->next; - if(mp->tail) - mp->tail->prev = NULL; - else { - mp->tail = mp->head = NULL; - } - - free(buf->pnt); - free(buf); - -} - -static int read_buf_byte(int *error, struct mpstr *mp) -{ - unsigned int b;int pos; - - pos = mp->tail->pos; - while(pos >= mp->tail->size) { - remove_buf(mp); - pos = mp->tail->pos; - if(!mp->tail) { - /* We may pick up this error a few times*/ - /* But things have gone pear shaped */ - ast_log(LOG_WARNING,"Fatal Buffer error!\n"); - *error = 1; - return (0); - } - } - - b = mp->tail->pnt[pos]; - mp->bsize--; - mp->tail->pos++; - - - return b; -} - -static int read_head(struct mpstr *mp) -{ - unsigned long head; - int error=0; - - - head = read_buf_byte(&error, mp); - head <<= 8; - head |= read_buf_byte(&error, mp); - head <<= 8; - head |= read_buf_byte(&error, mp); - head <<= 8; - head |= read_buf_byte(&error, mp); - - mp->header = head; - - if(error){ - return (1); - }else - return (0); - -} - -static int head_check(unsigned long head) -{ - if( (head & 0xffe00000) != 0xffe00000) - return FALSE; - if(!((head>>17)&3)) - return FALSE; - if( ((head>>12)&0xf) == 0xf || ((head>>12)&0xf) == 0) - return FALSE; - if( ((head>>10)&0x3) == 0x3 ) - return FALSE; - if ((head & 0xffff0000) == 0xfffe0000) - return FALSE; - - return TRUE; -} - -static int head_shift(struct mpstr *mp) -{ - unsigned long head; - int error = 0; - - head = mp->header; - - head <<= 8; - head |= read_buf_byte(&error, mp); - - mp->header = head; - - if (error){ - return (1); - }else - return (0); - -} - - -int decodeMP3(struct mpstr *mp,char *in,int isize,char *out, - int osize,int *done) -{ - int len; - long n,m; - int down_sample_sblimit; - - if(osize < 4608) { - ast_log(LOG_WARNING,"To less out space\n"); - return MP3_ERR; - } - - if(in) { - if(addbuf(mp,in,isize) == NULL) { - return MP3_ERR; - } - } - - /* First decode header */ - if(mp->framesize == 0) { - if(mp->bsize < 4) { - return MP3_NEED_MORE; - } - if (read_head(mp)) - return MP3_ERR; - - if(!head_check(mp->header) ) { - int i; - - ast_log(LOG_WARNING,"Junk at the beginning of frame %08lx\n",mp->header); - - /* step in byte steps through next 64K */ - for(i=0;i<65536;i++) { - if(!mp->bsize) - return MP3_NEED_MORE; - - if(head_shift(mp)) - return MP3_ERR; - - if(head_check(mp->header)) - break; - } - if(i == 65536) { - ast_log(LOG_WARNING,"Giving up searching valid MPEG header\n"); - return MP3_ERR; - } - } - - decode_header(&mp->fr,mp->header); - mp->framesize = mp->fr.framesize; - - if (!mp->initmp3){ - mp->initmp3 = 1; - - n = freqs[mp->fr.sampling_frequency]; - if (mp->outsamplerate) { - m = mp->outsamplerate; - } - else { - m =n; - } - - if (synth_ntom_set_step(n,m)) - return MP3_ERR; - - - if(n>m) { - down_sample_sblimit = SBLIMIT * m; - down_sample_sblimit /= n; - } - else { - down_sample_sblimit = SBLIMIT; - } - - init_layer3_sample_limits(mp, down_sample_sblimit); - - } - } - - - if(mp->fr.framesize > mp->bsize) - return MP3_NEED_MORE; - - (mp->worksample).wordpointer = mp->bsspace[mp->bsnum] + 512; - mp->bsnum = (mp->bsnum + 1) & 0x1; - (mp->worksample).bitindex = 0; - - len = 0; - while(len < mp->framesize) { - int nlen; - int blen = mp->tail->size - mp->tail->pos; - if( (mp->framesize - len) <= blen) { - nlen = mp->framesize-len; - } - else { - nlen = blen; - } - memcpy((mp->worksample).wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen); - len += nlen; - mp->tail->pos += nlen; - mp->bsize -= nlen; - if(mp->tail->pos == mp->tail->size) { - remove_buf(mp); - } - } - - *done = 0; - if(mp->fr.error_protection) - getbits(mp, 16); - - if (do_layer3(mp,(unsigned char *) out,done)) - return MP3_ERR; - - mp->fsizeold = mp->framesize; - mp->framesize = 0; - - return MP3_OK; -} - -int set_pointer(struct mpstr *mp, long backstep) -{ - unsigned char *bsbufold; - if(mp->fsizeold < 0 && backstep > 0) { - ast_log(LOG_WARNING,"Can't step back %ld!\n",backstep); - return MP3_ERR; - } - bsbufold = mp->bsspace[mp->bsnum] + 512; - (mp->worksample).wordpointer -= backstep; - if (backstep) - memcpy((mp->worksample).wordpointer,bsbufold+mp->fsizeold-backstep,backstep); - (mp->worksample).bitindex = 0; - return MP3_OK; -} - - - - diff --git a/addons/mp3/layer3.c b/addons/mp3/layer3.c deleted file mode 100644 index e635576..0000000 --- a/addons/mp3/layer3.c +++ /dev/null @@ -1,2029 +0,0 @@ -/* - * Mpeg Layer-3 audio decoder - * -------------------------- - * copyright (c) 1995,1996,1997 by Michael Hipp. - * All rights reserved. See also 'README' - */ - -#include "asterisk.h" -#include "asterisk/logger.h" -#include -#include "mpg123.h" -#include "mpglib.h" -#include "huffman.h" - -#define MPEG1 - -/* These should all be constants setup once using init_layer3_const */ -static real ispow[8207]; -static real aa_ca[8],aa_cs[8]; -static real COS1[12][6]; -static real win[4][36]; -static real win1[4][36]; -static real gainpow2[256+118+4]; -static real COS9[9]; -static real COS6_1,COS6_2; -static real tfcos36[9]; -static real tfcos12[3]; - -struct bandInfoStruct { - short longIdx[23]; - short longDiff[22]; - short shortIdx[14]; - short shortDiff[13]; -}; - - -struct bandInfoStruct bandInfo[9] = { - -/* MPEG 1.0 */ - { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, - {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, - {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, - {4,4,4,4,6,8,10,12,14,18,22,30,56} } , - - { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, - {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, - {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, - {4,4,4,4,6,6,10,12,14,16,20,26,66} } , - - { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , - {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , - {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , - {4,4,4,4,6,8,12,16,20,26,34,42,12} } , - -/* MPEG 2.0 */ - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , - {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , - {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , - - { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, - {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } , - {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , - {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , - - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, - {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, - {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , -/* MPEG 2.5 */ - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, - {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, - {4,4,4,6,8,10,12,14,18,24,30,40,18} }, - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, - {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, - {4,4,4,6,8,10,12,14,18,24,30,40,18} }, - { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, - {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2}, - {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576}, - {8,8,8,12,16,20,24,28,36,2,2,2,26} } , -}; - -static int mapbuf0[9][152]; -static int mapbuf1[9][156]; -static int mapbuf2[9][44]; -static int *map[9][3]; -static int *mapend[9][3]; - -static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ -static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ - -static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16]; -static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16]; - -/* - * init constant tables for layer-3 - */ -void init_layer3_const(void) -{ - int i,j,k,l; - - for(i=-256;i<118+4;i++) - gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) ); - - for(i=0;i<8207;i++) - ispow[i] = pow((double)i,(double)4.0/3.0); - - for (i=0;i<8;i++) - { - static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037}; - double sq=sqrt(1.0+Ci[i]*Ci[i]); - aa_cs[i] = 1.0/sq; - aa_ca[i] = Ci[i]/sq; - } - - for(i=0;i<18;i++) - { - win[0][i] = win[1][i] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 ); - win[0][i+18] = win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); - } - for(i=0;i<6;i++) - { - win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); - win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 ); - win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 ); - win[1][i+30] = win[3][i] = 0.0; - win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 ); - } - - for(i=0;i<9;i++) - COS9[i] = cos( M_PI / 18.0 * (double) i); - - for(i=0;i<9;i++) - tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 ); - for(i=0;i<3;i++) - tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 ); - - COS6_1 = cos( M_PI / 6.0 * (double) 1); - COS6_2 = cos( M_PI / 6.0 * (double) 2); - - for(i=0;i<12;i++) - { - win[2][i] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 ); - for(j=0;j<6;j++) - COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) ); - } - - for(j=0;j<4;j++) { - static int len[4] = { 36,36,12,36 }; - for(i=0;i 0) { - if( i & 1 ) - p1 = pow(base,(i+1.0)*0.5); - else - p2 = pow(base,i*0.5); - } - pow1_1[j][i] = p1; - pow2_1[j][i] = p2; - pow1_2[j][i] = M_SQRT2 * p1; - pow2_2[j][i] = M_SQRT2 * p2; - } - } - - for(j=0;j<9;j++) - { - struct bandInfoStruct *bi = &bandInfo[j]; - int *mp; - int cb,lwin; - short *bdf; - - mp = map[j][0] = mapbuf0[j]; - bdf = bi->longDiff; - for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) { - *mp++ = (*bdf) >> 1; - *mp++ = i; - *mp++ = 3; - *mp++ = cb; - } - bdf = bi->shortDiff+3; - for(cb=3;cb<13;cb++) { - int l = (*bdf++) >> 1; - for(lwin=0;lwin<3;lwin++) { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6*l; - } - mapend[j][0] = mp; - - mp = map[j][1] = mapbuf1[j]; - bdf = bi->shortDiff+0; - for(i=0,cb=0;cb<13;cb++) { - int l = (*bdf++) >> 1; - for(lwin=0;lwin<3;lwin++) { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6*l; - } - mapend[j][1] = mp; - - mp = map[j][2] = mapbuf2[j]; - bdf = bi->longDiff; - for(cb = 0; cb < 22 ; cb++) { - *mp++ = (*bdf++) >> 1; - *mp++ = cb; - } - mapend[j][2] = mp; - - } - - for(i=0;i<5;i++) { - for(j=0;j<6;j++) { - for(k=0;k<6;k++) { - int n = k + j * 6 + i * 36; - i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12); - } - } - } - for(i=0;i<4;i++) { - for(j=0;j<4;j++) { - for(k=0;k<4;k++) { - int n = k + j * 4 + i * 16; - i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12); - } - } - } - for(i=0;i<4;i++) { - for(j=0;j<3;j++) { - int n = j + i * 3; - i_slen2[n+244] = i|(j<<3) | (5<<12); - n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15); - } - } - - for(i=0;i<5;i++) { - for(j=0;j<5;j++) { - for(k=0;k<4;k++) { - for(l=0;l<4;l++) { - int n = l + k * 4 + j * 16 + i * 80; - n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12); - } - } - } - } - for(i=0;i<5;i++) { - for(j=0;j<5;j++) { - for(k=0;k<4;k++) { - int n = k + j * 4 + i * 20; - n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12); - } - } - } -} - -/* MP3 file specific rates */ -void init_layer3_sample_limits(struct mpstr *mp, int down_sample_sblimit) -{ - int i,j; - for(j=0;j<9;j++) { - for(i=0;i<23;i++) { - (mp->longLimit)[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1; - if((mp->longLimit)[j][i] > (down_sample_sblimit) ) - (mp->longLimit)[j][i] = down_sample_sblimit; - } - for(i=0;i<14;i++) { - (mp->shortLimit)[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1; - if((mp->shortLimit)[j][i] > (down_sample_sblimit) ) - (mp->shortLimit)[j][i] = down_sample_sblimit; - } - } -} - - - -/* - * read additional side information - */ -#ifdef MPEG1 -static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si,int stereo, - int ms_stereo,long sfreq,int single) -{ - int ch, gr; - int powdiff = (single == 3) ? 4 : 0; - - si->main_data_begin = getbits(mp, 9); - if (stereo == 1) - si->private_bits = getbits_fast(mp, 5); - else - si->private_bits = getbits_fast(mp, 3); - - for (ch=0; chch[ch].gr[0].scfsi = -1; - si->ch[ch].gr[1].scfsi = getbits_fast(mp, 4); - } - - for (gr=0; gr<2; gr++) - { - for (ch=0; chch[ch].gr[gr]); - - gr_info->part2_3_length = getbits(mp, 12); - gr_info->big_values = getbits_fast(mp, 9); - if(gr_info->big_values > 288) { - ast_log(LOG_WARNING,"big_values too large!\n"); - gr_info->big_values = 288; - } - gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; - if(ms_stereo) - gr_info->pow2gain += 2; - gr_info->scalefac_compress = getbits_fast(mp, 4); -/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ - if(get1bit(mp)) - { - int i; - gr_info->block_type = getbits_fast(mp, 2); - gr_info->mixed_block_flag = get1bit(mp); - gr_info->table_select[0] = getbits_fast(mp, 5); - gr_info->table_select[1] = getbits_fast(mp, 5); - /* - * table_select[2] not needed, because there is no region2, - * but to satisfy some verifications tools we set it either. - */ - gr_info->table_select[2] = 0; - for(i=0;i<3;i++) - gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); - - if(gr_info->block_type == 0) { - ast_log(LOG_WARNING,"Blocktype == 0 and window-switching == 1 not allowed.\n"); - return (1); - } - /* region_count/start parameters are implicit in this case. */ - gr_info->region1start = 36>>1; - gr_info->region2start = 576>>1; - } - else - { - int i,r0c,r1c; - for (i=0; i<3; i++) - gr_info->table_select[i] = getbits_fast(mp, 5); - r0c = getbits_fast(mp, 4); - r1c = getbits_fast(mp, 3); - gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; - gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; - gr_info->block_type = 0; - gr_info->mixed_block_flag = 0; - } - gr_info->preflag = get1bit(mp); - gr_info->scalefac_scale = get1bit(mp); - gr_info->count1table_select = get1bit(mp); - } - } - return (0); - -} -#endif - -/* - * Side Info for MPEG 2.0 / LSF - */ -static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int stereo, - int ms_stereo,long sfreq,int single) -{ - int ch; - int powdiff = (single == 3) ? 4 : 0; - - si->main_data_begin = getbits(mp, 8); - if (stereo == 1) - si->private_bits = get1bit(mp); - else - si->private_bits = getbits_fast(mp, 2); - - for (ch=0; chch[ch].gr[0]); - - gr_info->part2_3_length = getbits(mp, 12); - gr_info->big_values = getbits_fast(mp, 9); - if(gr_info->big_values > 288) { - ast_log(LOG_WARNING,"big_values too large!\n"); - gr_info->big_values = 288; - } - gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; - if(ms_stereo) - gr_info->pow2gain += 2; - gr_info->scalefac_compress = getbits(mp, 9); -/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ - if(get1bit(mp)) - { - int i; - gr_info->block_type = getbits_fast(mp, 2); - gr_info->mixed_block_flag = get1bit(mp); - gr_info->table_select[0] = getbits_fast(mp, 5); - gr_info->table_select[1] = getbits_fast(mp, 5); - /* - * table_select[2] not needed, because there is no region2, - * but to satisfy some verifications tools we set it either. - */ - gr_info->table_select[2] = 0; - for(i=0;i<3;i++) - gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); - - if(gr_info->block_type == 0) { - ast_log(LOG_WARNING,"Blocktype == 0 and window-switching == 1 not allowed.\n"); - return (1); - } - /* region_count/start parameters are implicit in this case. */ -/* check this again! */ - if(gr_info->block_type == 2) - gr_info->region1start = 36>>1; - else if(sfreq == 8) -/* check this for 2.5 and sfreq=8 */ - gr_info->region1start = 108>>1; - else - gr_info->region1start = 54>>1; - gr_info->region2start = 576>>1; - } - else - { - int i,r0c,r1c; - for (i=0; i<3; i++) - gr_info->table_select[i] = getbits_fast(mp, 5); - r0c = getbits_fast(mp, 4); - r1c = getbits_fast(mp, 3); - gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; - gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; - gr_info->block_type = 0; - gr_info->mixed_block_flag = 0; - } - gr_info->scalefac_scale = get1bit(mp); - gr_info->count1table_select = get1bit(mp); - } - return (0); -} - -/* - * read scalefactors - */ -#ifdef MPEG1 -static int III_get_scale_factors_1(struct mpstr *mp, int *scf,struct gr_info_s *gr_info) -{ - static unsigned char slen[2][16] = { - {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}, - {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3} - }; - int numbits; - int num0 = slen[0][gr_info->scalefac_compress]; - int num1 = slen[1][gr_info->scalefac_compress]; - - if (gr_info->block_type == 2) - { - int i=18; - numbits = (num0 + num1) * 18; - - if (gr_info->mixed_block_flag) { - for (i=8;i;i--) - *scf++ = getbits_fast(mp, num0); - i = 9; - numbits -= num0; /* num0 * 17 + num1 * 18 */ - } - - for (;i;i--) - *scf++ = getbits_fast(mp, num0); - for (i = 18; i; i--) - *scf++ = getbits_fast(mp, num1); - *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */ - } - else - { - int i; - int scfsi = gr_info->scfsi; - - if(scfsi < 0) { /* scfsi < 0 => granule == 0 */ - for(i=11;i;i--) - *scf++ = getbits_fast(mp, num0); - for(i=10;i;i--) - *scf++ = getbits_fast(mp, num1); - numbits = (num0 + num1) * 10 + num0; - } - else { - numbits = 0; - if(!(scfsi & 0x8)) { - for (i=6;i;i--) - *scf++ = getbits_fast(mp, num0); - numbits += num0 * 6; - } - else { - *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ - *scf++ = 0; *scf++ = 0; *scf++ = 0; - } - - if(!(scfsi & 0x4)) { - for (i=5;i;i--) - *scf++ = getbits_fast(mp, num0); - numbits += num0 * 5; - } - else { - *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ - *scf++ = 0; *scf++ = 0; - } - - if(!(scfsi & 0x2)) { - for(i=5;i;i--) - *scf++ = getbits_fast(mp, num1); - numbits += num1 * 5; - } - else { - *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ - *scf++ = 0; *scf++ = 0; - } - - if(!(scfsi & 0x1)) { - for (i=5;i;i--) - *scf++ = getbits_fast(mp, num1); - numbits += num1 * 5; - } - else { - *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ - *scf++ = 0; *scf++ = 0; - } - } - - *scf++ = 0; /* no l[21] in original sources */ - } - return numbits; -} -#endif - -static int III_get_scale_factors_2(struct mpstr *mp, int *scf,struct gr_info_s *gr_info,int i_stereo) -{ - unsigned char *pnt; - int i,j; - unsigned int slen; - int n = 0; - int numbits = 0; - - static unsigned char stab[3][6][4] = { - { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} , - { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } , - { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} , - {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } , - { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} , - { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } }; - - if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */ - slen = i_slen2[gr_info->scalefac_compress>>1]; - else - slen = n_slen2[gr_info->scalefac_compress]; - - gr_info->preflag = (slen>>15) & 0x1; - - n = 0; - if( gr_info->block_type == 2 ) { - n++; - if(gr_info->mixed_block_flag) - n++; - } - - pnt = stab[n][(slen>>12)&0x7]; - - for(i=0;i<4;i++) { - int num = slen & 0x7; - slen >>= 3; - if(num) { - for(j=0;j<(int)(pnt[i]);j++) - *scf++ = getbits_fast(mp, num); - numbits += pnt[i] * num; - } - else { - for(j=0;j<(int)(pnt[i]);j++) - *scf++ = 0; - } - } - - n = (n << 1) + 1; - for(i=0;iscalefac_scale; - real *xrpnt = (real *) xr; - int l[3],l3; - int part2remain = gr_info->part2_3_length - part2bits; - int *me; - - { - int bv = gr_info->big_values; - int region1 = gr_info->region1start; - int region2 = gr_info->region2start; - - l3 = ((576>>1)-bv)>>1; -/* - * we may lose the 'odd' bit here !! - * check this later again - */ - if(bv <= region1) { - l[0] = bv; l[1] = 0; l[2] = 0; - } - else { - l[0] = region1; - if(bv <= region2) { - l[1] = bv - l[0]; l[2] = 0; - } - else { - l[1] = region2 - l[0]; l[2] = bv - region2; - } - } - } - - if(gr_info->block_type == 2) { - /* - * decoding with short or mixed mode BandIndex table - */ - int i,max[4]; - int step=0,lwin=0,cb=0; - register real v = 0.0; - register int *m,mc; - - if(gr_info->mixed_block_flag) { - max[3] = -1; - max[0] = max[1] = max[2] = 2; - m = map[sfreq][0]; - me = mapend[sfreq][0]; - } - else { - max[0] = max[1] = max[2] = max[3] = -1; - /* max[3] not really needed in this case */ - m = map[sfreq][1]; - me = mapend[sfreq][1]; - } - - mc = 0; - for(i=0;i<2;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - for(;lp;lp--,mc--) { - register int x,y; - if( (!mc) ) { - mc = *m++; - xrpnt = ((real *) xr) + (*m++); - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit(mp)) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if(x == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - x += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt = -ispow[x] * v; - else - *xrpnt = ispow[x] * v; - } - else if(x) { - max[lwin] = cb; - if(get1bit(mp)) - *xrpnt = -ispow[x] * v; - else - *xrpnt = ispow[x] * v; - part2remain--; - } - else - *xrpnt = 0.0; - xrpnt += step; - if(y == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - y += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt = -ispow[y] * v; - else - *xrpnt = ispow[y] * v; - } - else if(y) { - max[lwin] = cb; - if(get1bit(mp)) - *xrpnt = -ispow[y] * v; - else - *xrpnt = ispow[y] * v; - part2remain--; - } - else - *xrpnt = 0.0; - xrpnt += step; - } - } - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit(mp)) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr) + (*m++); - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - mc--; - } - if( (a & (0x8>>i)) ) { - max[lwin] = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit(mp)) - *xrpnt = -v; - else - *xrpnt = v; - } - else - *xrpnt = 0.0; - xrpnt += step; - } - } - - while( m < me ) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr) + *m++; - if( (*m++) == 3) - step = 1; - else - step = 3; - m++; /* cb */ - } - mc--; - *xrpnt = 0.0; - xrpnt += step; - *xrpnt = 0.0; - xrpnt += step; -/* we could add a little opt. here: - * if we finished a band for window 3 or a long band - * further bands could copied in a simple loop without a - * special 'map' decoding - */ - } - - gr_info->maxband[0] = max[0]+1; - gr_info->maxband[1] = max[1]+1; - gr_info->maxband[2] = max[2]+1; - gr_info->maxbandl = max[3]+1; - - { - int rmax = max[0] > max[1] ? max[0] : max[1]; - rmax = (rmax > max[2] ? rmax : max[2]) + 1; - gr_info->maxb = rmax ? (mp->shortLimit)[sfreq][rmax] : (mp->longLimit)[sfreq][max[3]+1]; - } - - } - else { - /* - * decoding with 'long' BandIndex table (block_type != 2) - */ - int *pretab = gr_info->preflag ? pretab1 : pretab2; - int i,max = -1; - int cb = 0; - register int *m = map[sfreq][2]; - register real v = 0.0; - register int mc = 0; -#if 0 - me = mapend[sfreq][2]; -#endif - - /* - * long hash table values - */ - for(i=0;i<3;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - - for(;lp;lp--,mc--) { - int x,y; - - if(!mc) { - mc = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - cb = *m++; - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit(mp)) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if (x == 15) { - max = cb; - part2remain -= h->linbits+1; - x += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt++ = -ispow[x] * v; - else - *xrpnt++ = ispow[x] * v; - } - else if(x) { - max = cb; - if(get1bit(mp)) - *xrpnt++ = -ispow[x] * v; - else - *xrpnt++ = ispow[x] * v; - part2remain--; - } - else - *xrpnt++ = 0.0; - - if (y == 15) { - max = cb; - part2remain -= h->linbits+1; - y += getbits(mp, h->linbits); - if(get1bit(mp)) - *xrpnt++ = -ispow[y] * v; - else - *xrpnt++ = ispow[y] * v; - } - else if(y) { - max = cb; - if(get1bit(mp)) - *xrpnt++ = -ispow[y] * v; - else - *xrpnt++ = ispow[y] * v; - part2remain--; - } - else - *xrpnt++ = 0.0; - } - } - - /* - * short (count1table) values - */ - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit(mp)) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - mc--; - } - if ( (a & (0x8>>i)) ) { - max = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit(mp)) - *xrpnt++ = -v; - else - *xrpnt++ = v; - } - else - *xrpnt++ = 0.0; - } - } - - /* - * zero part - */ - for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) { - *xrpnt++ = 0.0; - *xrpnt++ = 0.0; - } - - gr_info->maxbandl = max+1; - gr_info->maxb = (mp->longLimit)[sfreq][gr_info->maxbandl]; - } - - while( part2remain > 16 ) { - getbits(mp, 16); /* Dismiss stuffing Bits */ - part2remain -= 16; - } - if(part2remain > 0) - getbits(mp, part2remain); - else if(part2remain < 0) { - ast_log(LOG_WARNING,"mpg123: Can't rewind stream by %d bits!\n",-part2remain); - return 1; /* -> error */ - } - return 0; -} - -#if 0 -static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf, - struct gr_info_s *gr_info,int sfreq,int part2bits) -{ - int shift = 1 + gr_info->scalefac_scale; - real *xrpnt = (real *) xr[1]; - real *xr0pnt = (real *) xr[0]; - int l[3],l3; - int part2remain = gr_info->part2_3_length - part2bits; - int *me; - - { - int bv = gr_info->big_values; - int region1 = gr_info->region1start; - int region2 = gr_info->region2start; - - l3 = ((576>>1)-bv)>>1; -/* - * we may lose the 'odd' bit here !! - * check this later gain - */ - if(bv <= region1) { - l[0] = bv; l[1] = 0; l[2] = 0; - } - else { - l[0] = region1; - if(bv <= region2) { - l[1] = bv - l[0]; l[2] = 0; - } - else { - l[1] = region2 - l[0]; l[2] = bv - region2; - } - } - } - - if(gr_info->block_type == 2) { - int i,max[4]; - int step=0,lwin=0,cb=0; - register real v = 0.0; - register int *m,mc = 0; - - if(gr_info->mixed_block_flag) { - max[3] = -1; - max[0] = max[1] = max[2] = 2; - m = map[sfreq][0]; - me = mapend[sfreq][0]; - } - else { - max[0] = max[1] = max[2] = max[3] = -1; - /* max[3] not really needed in this case */ - m = map[sfreq][1]; - me = mapend[sfreq][1]; - } - - for(i=0;i<2;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - for(;lp;lp--,mc--) { - int x,y; - - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr[1]) + *m; - xr0pnt = ((real *) xr[0]) + *m++; - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit(mp)) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if(x == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - x += getbits(mp, h->linbits); - if(get1bit(mp)) { - real a = ispow[x] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[x] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - } - else if(x) { - max[lwin] = cb; - if(get1bit(mp)) { - real a = ispow[x] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[x] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - part2remain--; - } - else - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - - if(y == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - y += getbits(mp, h->linbits); - if(get1bit(mp)) { - real a = ispow[y] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[y] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - } - else if(y) { - max[lwin] = cb; - if(get1bit(mp)) { - real a = ispow[y] * v; - *xrpnt = *xr0pnt + a; - *xr0pnt -= a; - } - else { - real a = ispow[y] * v; - *xrpnt = *xr0pnt - a; - *xr0pnt += a; - } - part2remain--; - } - else - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - } - } - - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit(mp)) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr[1]) + *m; - xr0pnt = ((real *) xr[0]) + *m++; - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - mc--; - } - if( (a & (0x8>>i)) ) { - max[lwin] = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit(mp)) { - *xrpnt = *xr0pnt + v; - *xr0pnt -= v; - } - else { - *xrpnt = *xr0pnt - v; - *xr0pnt += v; - } - } - else - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - } - } - - while( m < me ) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr[1]) + *m; - xr0pnt = ((real *) xr[0]) + *m++; - if(*m++ == 3) - step = 1; - else - step = 3; - m++; /* cb */ - } - mc--; - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; - *xrpnt = *xr0pnt; - xrpnt += step; - xr0pnt += step; -/* we could add a little opt. here: - * if we finished a band for window 3 or a long band - * further bands could copied in a simple loop without a - * special 'map' decoding - */ - } - - gr_info->maxband[0] = max[0]+1; - gr_info->maxband[1] = max[1]+1; - gr_info->maxband[2] = max[2]+1; - gr_info->maxbandl = max[3]+1; - - { - int rmax = max[0] > max[1] ? max[0] : max[1]; - rmax = (rmax > max[2] ? rmax : max[2]) + 1; - gr_info->maxb = rmax ? (mp->shortLimit)[sfreq][rmax] : (mp->longLimit)[sfreq][max[3]+1]; - } - } - else { - int *pretab = gr_info->preflag ? pretab1 : pretab2; - int i,max = -1; - int cb = 0; - register int mc=0,*m = map[sfreq][2]; - register real v = 0.0; -#if 0 - me = mapend[sfreq][2]; -#endif - - for(i=0;i<3;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - - for(;lp;lp--,mc--) { - int x,y; - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit(mp)) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if (x == 15) { - max = cb; - part2remain -= h->linbits+1; - x += getbits(mp, h->linbits); - if(get1bit(mp)) { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - } - else if(x) { - max = cb; - if(get1bit(mp)) { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[x] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - part2remain--; - } - else - *xrpnt++ = *xr0pnt++; - - if (y == 15) { - max = cb; - part2remain -= h->linbits+1; - y += getbits(mp, h->linbits); - if(get1bit(mp)) { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - } - else if(y) { - max = cb; - if(get1bit(mp)) { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt + a; - *xr0pnt++ -= a; - } - else { - real a = ispow[y] * v; - *xrpnt++ = *xr0pnt - a; - *xr0pnt++ += a; - } - part2remain--; - } - else - *xrpnt++ = *xr0pnt++; - } - } - - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit(mp)) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - mc--; - } - if ( (a & (0x8>>i)) ) { - max = cb; - part2remain--; - if(part2remain <= 0) { - part2remain++; - break; - } - if(get1bit(mp)) { - *xrpnt++ = *xr0pnt + v; - *xr0pnt++ -= v; - } - else { - *xrpnt++ = *xr0pnt - v; - *xr0pnt++ += v; - } - } - else - *xrpnt++ = *xr0pnt++; - } - } - for(i=(&xr[1][SBLIMIT][0]-xrpnt)>>1;i;i--) { - *xrpnt++ = *xr0pnt++; - *xrpnt++ = *xr0pnt++; - } - - gr_info->maxbandl = max+1; - gr_info->maxb = longLimit[sfreq][gr_info->maxbandl]; - } - - while ( part2remain > 16 ) { - getbits(mp, 16); /* Dismiss stuffing Bits */ - part2remain -= 16; - } - if(part2remain > 0 ) - getbits(mp, part2remain); - else if(part2remain < 0) { - ast_log(LOG_WARNING,"mpg123_ms: Can't rewind stream by %d bits!\n",-part2remain); - return 1; /* -> error */ - } - return 0; -} -#endif - -/* - * III_stereo: calculate real channel values for Joint-I-Stereo-mode - */ -static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac, - struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf) -{ - real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf; - struct bandInfoStruct *bi = &bandInfo[sfreq]; - real *tab1,*tab2; - - if(lsf) { - int p = gr_info->scalefac_compress & 0x1; - if(ms_stereo) { - tab1 = pow1_2[p]; tab2 = pow2_2[p]; - } - else { - tab1 = pow1_1[p]; tab2 = pow2_1[p]; - } - } - else { - if(ms_stereo) { - tab1 = tan1_2; tab2 = tan2_2; - } - else { - tab1 = tan1_1; tab2 = tan2_1; - } - } - - if (gr_info->block_type == 2) - { - int lwin,do_l = 0; - if( gr_info->mixed_block_flag ) - do_l = 1; - - for (lwin=0;lwin<3;lwin++) /* process each window */ - { - /* get first band with zero values */ - int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ - if(sfb > 3) - do_l = 0; - - for(;sfb<12;sfb++) - { - is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - sb = bi->shortDiff[sfb]; - idx = bi->shortIdx[sfb] + lwin; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for (; sb > 0; sb--,idx+=3) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } - -#if 1 -/* in the original: copy 10 to 11 , here: copy 11 to 12 -maybe still wrong??? (copy 12 to 13?) */ - is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - sb = bi->shortDiff[12]; - idx = bi->shortIdx[12] + lwin; -#else - is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - sb = bi->shortDiff[11]; - idx = bi->shortIdx[11] + lwin; -#endif - if(is_p != 7) - { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx+=3 ) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } /* end for(lwin; .. ; . ) */ - - if (do_l) - { -/* also check l-part, if ALL bands in the three windows are 'empty' - * and mode = mixed_mode - */ - int sfb = gr_info->maxbandl; - int idx = bi->longIdx[sfb]; - - for ( ; sfb<8; sfb++ ) - { - int sb = bi->longDiff[sfb]; - int is_p = scalefac[sfb]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx++) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - else - idx += sb; - } - } - } - else /* ((gr_info->block_type != 2)) */ - { - int sfb = gr_info->maxbandl; - int is_p,idx = bi->longIdx[sfb]; - for ( ; sfb<21; sfb++) - { - int sb = bi->longDiff[sfb]; - is_p = scalefac[sfb]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx++) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - else - idx += sb; - } - - is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */ - if(is_p != 7) - { - int sb; - real t1 = tab1[is_p],t2 = tab2[is_p]; - - for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ ) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } /* ... */ -} - -static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info) -{ - int sblim; - - if(gr_info->block_type == 2) - { - if(!gr_info->mixed_block_flag) - return; - sblim = 1; - } - else { - sblim = gr_info->maxb-1; - } - - /* 31 alias-reduction operations between each pair of sub-bands */ - /* with 8 butterflies between each pair */ - - { - int sb; - real *xr1=(real *) xr[1]; - - for(sb=sblim;sb;sb--,xr1+=10) - { - int ss; - real *cs=aa_cs,*ca=aa_ca; - real *xr2 = xr1; - - for(ss=7;ss>=0;ss--) - { /* upper and lower butterfly inputs */ - register real bu = *--xr2,bd = *xr1; - *xr2 = (bu * (*cs) ) - (bd * (*ca) ); - *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) ); - } - } - } -} - -/* - DCT insipired by Jeff Tsay's DCT from the maplay package - this is an optimized version with manual unroll. - - References: - [1] S. Winograd: "On Computing the Discrete Fourier Transform", - Mathematics of Computation, Volume 32, Number 141, January 1978, - Pages 175-199 -*/ - -static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf) -{ - { - register real *in = inbuf; - - in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; - in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11]; - in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8]; - in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5]; - in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; - in[2] +=in[1]; in[1] +=in[0]; - - in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9]; - in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1]; - - - { - -#define MACRO0(v) { \ - real tmp; \ - out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \ - out2[8-(v)] = tmp * w[26-(v)]; } \ - sum0 -= sum1; \ - ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \ - ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; -#define MACRO1(v) { \ - real sum0,sum1; \ - sum0 = tmp1a + tmp2a; \ - sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \ - MACRO0(v); } -#define MACRO2(v) { \ - real sum0,sum1; \ - sum0 = tmp2a - tmp1a; \ - sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \ - MACRO0(v); } - - register const real *c = COS9; - register real *out2 = o2; - register real *w = wintab; - register real *out1 = o1; - register real *ts = tsbuf; - - real ta33,ta66,tb33,tb66; - - ta33 = in[2*3+0] * c[3]; - ta66 = in[2*6+0] * c[6]; - tb33 = in[2*3+1] * c[3]; - tb66 = in[2*6+1] * c[6]; - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7]; - tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7]; - tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8]; - tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8]; - - MACRO1(0); - MACRO2(8); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3]; - tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3]; - tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0]; - tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1]; - - MACRO1(1); - MACRO2(7); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1]; - tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1]; - tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4]; - tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4]; - - MACRO1(2); - MACRO2(6); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5]; - tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5]; - tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2]; - tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2]; - - MACRO1(3); - MACRO2(5); - } - - { - real sum0,sum1; - sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0]; - sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4]; - MACRO0(4); - } - } - - } -} - -/* - * new DCT12 - */ -static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts) -{ -#define DCT12_PART1 \ - in5 = in[5*3]; \ - in5 += (in4 = in[4*3]); \ - in4 += (in3 = in[3*3]); \ - in3 += (in2 = in[2*3]); \ - in2 += (in1 = in[1*3]); \ - in1 += (in0 = in[0*3]); \ - \ - in5 += in3; in3 += in1; \ - \ - in2 *= COS6_1; \ - in3 *= COS6_1; \ - -#define DCT12_PART2 \ - in0 += in4 * COS6_2; \ - \ - in4 = in0 + in2; \ - in0 -= in2; \ - \ - in1 += in5 * COS6_2; \ - \ - in5 = (in1 + in3) * tfcos12[0]; \ - in1 = (in1 - in3) * tfcos12[2]; \ - \ - in3 = in4 + in5; \ - in4 -= in5; \ - \ - in2 = in0 + in1; \ - in0 -= in1; - - - { - real in0,in1,in2,in3,in4,in5; - register real *out1 = rawout1; - ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2]; - ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5]; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1]; - ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1]; - ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1]; - ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1]; - } - - DCT12_PART2 - - ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0]; - ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0]; - ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2]; - ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2]; - - ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0]; - ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0]; - ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2]; - ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2]; - } - - in++; - - { - real in0,in1,in2,in3,in4,in5; - register real *out2 = rawout2; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - out2[5-1] = tmp0 * wi[11-1]; - out2[0+1] = tmp0 * wi[6+1]; - ts[(12+1)*SBLIMIT] += tmp1 * wi[1]; - ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1]; - } - - DCT12_PART2 - - out2[5-0] = in2 * wi[11-0]; - out2[0+0] = in2 * wi[6+0]; - out2[0+2] = in3 * wi[6+2]; - out2[5-2] = in3 * wi[11-2]; - - ts[(12+0)*SBLIMIT] += in0 * wi[0]; - ts[(17-0)*SBLIMIT] += in0 * wi[5-0]; - ts[(12+2)*SBLIMIT] += in4 * wi[2]; - ts[(17-2)*SBLIMIT] += in4 * wi[5-2]; - } - - in++; - - { - real in0,in1,in2,in3,in4,in5; - register real *out2 = rawout2; - out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - out2[11-1] = tmp0 * wi[11-1]; - out2[6 +1] = tmp0 * wi[6+1]; - out2[0+1] += tmp1 * wi[1]; - out2[5-1] += tmp1 * wi[5-1]; - } - - DCT12_PART2 - - out2[11-0] = in2 * wi[11-0]; - out2[6 +0] = in2 * wi[6+0]; - out2[6 +2] = in3 * wi[6+2]; - out2[11-2] = in3 * wi[11-2]; - - out2[0+0] += in0 * wi[0]; - out2[5-0] += in0 * wi[5-0]; - out2[0+2] += in4 * wi[2]; - out2[5-2] += in4 * wi[5-2]; - } -} - -/* - * III_hybrid - */ -static void III_hybrid(struct mpstr *mp, real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT], - int ch,struct gr_info_s *gr_info) -{ - real *tspnt = (real *) tsOut; - real (*block)[2][SBLIMIT*SSLIMIT] = mp->hybrid_block; - int *blc = mp->hybrid_blc; - real *rawout1,*rawout2; - int bt; - int sb = 0; - - { - int b = blc[ch]; - rawout1=block[b][ch]; - b=-b+1; - rawout2=block[b][ch]; - blc[ch] = b; - } - - - if(gr_info->mixed_block_flag) { - sb = 2; - dct36(fsIn[0],rawout1,rawout2,win[0],tspnt); - dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1); - rawout1 += 36; rawout2 += 36; tspnt += 2; - } - - bt = gr_info->block_type; - if(bt == 2) { - for (; sbmaxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) { - dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt); - dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1); - } - } - else { - for (; sbmaxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) { - dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt); - dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1); - } - } - - for(;sbfr); - stereo = fr->stereo; - single = fr->single; - sfreq = fr->sampling_frequency; - - - - if(stereo == 1) { /* stream is mono */ - stereo1 = 1; - single = 0; - } - else if(single >= 0) /* stream is stereo, but force to mono */ - stereo1 = 1; - else - stereo1 = 2; - - if(fr->mode == MPG_MD_JOINT_STEREO) { - ms_stereo = fr->mode_ext & 0x2; - i_stereo = fr->mode_ext & 0x1; - } - else - ms_stereo = i_stereo = 0; - - if(fr->lsf) { - granules = 1; - if (III_get_side_info_2(mp, &sideinfo,stereo,ms_stereo,sfreq,single)) - return (MP3_ERR); - } - else { - granules = 2; -#ifdef MPEG1 - if ( III_get_side_info_1(mp, &sideinfo,stereo,ms_stereo,sfreq,single)) - return (MP3_ERR); - -#else - ast_log(LOG_WARNING,"Not supported\n"); -#endif - } - - if(set_pointer(mp, sideinfo.main_data_begin) == MP3_ERR) - return 0; - - for (gr=0;grlsf) - part2bits = III_get_scale_factors_2(mp, scalefacs,gr_info,0); - else { -#ifdef MPEG1 - part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info); -#else - ast_log(LOG_WARNING,"Not supported\n"); -#endif - } - if(III_dequantize_sample(mp, hybridIn[0], scalefacs,gr_info,sfreq,part2bits)) - return (MP3_ERR); - } - if(stereo == 2) { - struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]); - long part2bits; - if(fr->lsf) - part2bits = III_get_scale_factors_2(mp, scalefacs,gr_info,i_stereo); - else { -#ifdef MPEG1 - part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info); -#else - ast_log(LOG_WARNING,"Not supported\n"); -#endif - } - - if(III_dequantize_sample(mp, hybridIn[1],scalefacs,gr_info,sfreq,part2bits)) - return (MP3_ERR); - - if(ms_stereo) { - int i; - for(i=0;ilsf); - - if(ms_stereo || i_stereo || (single == 3) ) { - if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb) - sideinfo.ch[0].gr[gr].maxb = gr_info->maxb; - else - gr_info->maxb = sideinfo.ch[0].gr[gr].maxb; - } - - switch(single) { - case 3: - { - register int i; - register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; - for(i=0;imaxb;i++,in0++) - *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ - } - break; - case 1: - { - register int i; - register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; - for(i=0;imaxb;i++) - *in0++ = *in1++; - } - break; - } - } - - for(ch=0;ch= 0) { - clip += synth_ntom_mono(mp,hybridOut[0][ss],pcm_sample,pcm_point); - } - else { - int p1 = *pcm_point; - clip += synth_ntom(mp,hybridOut[0][ss],0,pcm_sample,&p1); - clip += synth_ntom(mp,hybridOut[1][ss],1,pcm_sample,pcm_point); - } - } - } - - return 0; -} - - diff --git a/addons/mp3/mpg123.h b/addons/mp3/mpg123.h deleted file mode 100644 index e607cc2..0000000 --- a/addons/mp3/mpg123.h +++ /dev/null @@ -1,132 +0,0 @@ -#include -#include -#include - -#ifndef WIN32 -#include -#include -#endif - -#include - -#ifdef _WIN32 -# undef WIN32 -# define WIN32 - -# define M_PI 3.14159265358979323846 -# define M_SQRT2 1.41421356237309504880 -# define REAL_IS_FLOAT -# define NEW_DCT9 - -# define random rand -# define srandom srand - -#endif - -#ifdef REAL_IS_FLOAT -# define real float -#elif defined(REAL_IS_LONG_DOUBLE) -# define real long double -#else -# define real double -#endif - -#ifdef __GNUC__ -#define INLINE inline -#else -#define INLINE -#endif - -/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */ -#define AUDIOBUFSIZE 16384 - -#define FALSE 0 -#define TRUE 1 - -#define SBLIMIT 32 -#define SSLIMIT 18 - -#define MPG_MD_STEREO 0 -#define MPG_MD_JOINT_STEREO 1 -#define MPG_MD_DUAL_CHANNEL 2 -#define MPG_MD_MONO 3 - -#define MAXFRAMESIZE 1792 - - -/* Pre Shift fo 16 to 8 bit converter table */ -#define AUSHIFT (3) - -struct frame { - int stereo; - int jsbound; - int single; - int lsf; - int mpeg25; - int header_change; - int lay; - int error_protection; - int bitrate_index; - int sampling_frequency; - int padding; - int extension; - int mode; - int mode_ext; - int copyright; - int original; - int emphasis; - int framesize; /* computed framesize */ -}; - -struct parameter { - int quiet; /* shut up! */ - int tryresync; /* resync stream after error */ - int verbose; /* verbose level */ - int checkrange; -}; - -extern int decode_header(struct frame *fr,unsigned long newhead); - - - -struct gr_info_s { - int scfsi; - unsigned part2_3_length; - unsigned big_values; - unsigned scalefac_compress; - unsigned block_type; - unsigned mixed_block_flag; - unsigned table_select[3]; - unsigned subblock_gain[3]; - unsigned maxband[3]; - unsigned maxbandl; - unsigned maxb; - unsigned region1start; - unsigned region2start; - unsigned preflag; - unsigned scalefac_scale; - unsigned count1table_select; - real *full_gain[3]; - real *pow2gain; -}; - -struct III_sideinfo -{ - unsigned main_data_begin; - unsigned private_bits; - struct { - struct gr_info_s gr[2]; - } ch[2]; -}; - -struct pcm_workingsample -{ - int bitindex; - unsigned char *wordpointer; -}; - - -extern long freqs[9]; -extern struct parameter param; -extern real *pnts[5]; - diff --git a/addons/mp3/mpglib.h b/addons/mp3/mpglib.h deleted file mode 100644 index 0613222..0000000 --- a/addons/mp3/mpglib.h +++ /dev/null @@ -1,75 +0,0 @@ - -struct buf { - unsigned char *pnt; - long size; - long pos; - struct buf *next; - struct buf *prev; -}; - -struct framebuf { - struct buf *buf; - long pos; - struct frame *next; - struct frame *prev; -}; - -struct mpstr { - struct buf *head,*tail; - int bsize; - int framesize; - int fsizeold; - struct frame fr; - unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */ - real hybrid_block[2][2][SBLIMIT*SSLIMIT]; - int hybrid_blc[2]; - unsigned long header; - int bsnum; - real synth_buffs[2][2][0x110]; - int synth_bo; - long outscale; /* volume control default value 32768 */ - long outsamplerate; /* raw output rate default same as mp3 sample rate*/ - struct pcm_workingsample worksample; /* keep the state of the working sample for threads */ - int initmp3; /* flag for first initialisation */ - int longLimit[9][23]; /*sample limits re setting volume */ - int shortLimit[9][14]; - real decwin[512+32]; /* scale table */ - - }; - -#define BOOL int - -#define MP3_ERR -1 -#define MP3_OK 0 -#define MP3_NEED_MORE 1 - - -void InitMP3Constants(void); -BOOL InitMP3(struct mpstr *mp, long outscale); -int decodeMP3(struct mpstr *mp,char *inmemory,int inmemsize, - char *outmemory,int outmemsize,int *done); -void ExitMP3(struct mpstr *mp); - -extern int synth_ntom_set_step(long,long); -extern int synth_ntom(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt); -extern int synth_ntom_mono (struct mpstr *mp, real *bandPtr,unsigned char *samples,int *pnt); -extern int synth_ntom_8bit (real *,int,unsigned char *,int *); -extern int synth_ntom_mono2stereo (real *,unsigned char *,int *); -extern int synth_ntom_8bit_mono (real *,unsigned char *,int *); -extern int synth_ntom_8bit_mono2stereo (real *,unsigned char *,int *); - -extern void init_layer3_sample_limits(struct mpstr *mp, int down_sample_sblimit); -extern void init_layer3_const(void); -extern int do_layer3(struct mpstr *mp,unsigned char *,int *); - -extern void make_decode_tables_scale(struct mpstr *mp, long scaleval); -extern void make_decode_tables_const(void); -extern void make_conv16to8_table(int); - -extern void dct64(real *,real *,real *); - -extern unsigned int get1bit(struct mpstr *mp); -extern unsigned int getbits(struct mpstr *mp, int); -extern unsigned int getbits_fast(struct mpstr *mp, int); -extern int set_pointer(struct mpstr *mp, long backstep); - diff --git a/addons/mp3/tabinit.c b/addons/mp3/tabinit.c deleted file mode 100644 index d3e49f5..0000000 --- a/addons/mp3/tabinit.c +++ /dev/null @@ -1,81 +0,0 @@ - -#include - -#include "mpg123.h" -#include "mpglib.h" - -static real cos64[16],cos32[8],cos16[4],cos8[2],cos4[1]; -real *pnts[] = { cos64,cos32,cos16,cos8,cos4 }; - -static long intwinbase[] = { - 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, - -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, - -8, -9, -10, -11, -13, -14, -16, -17, -19, -21, - -24, -26, -29, -31, -35, -38, -41, -45, -49, -53, - -58, -63, -68, -73, -79, -85, -91, -97, -104, -111, - -117, -125, -132, -139, -147, -154, -161, -169, -176, -183, - -190, -196, -202, -208, -213, -218, -222, -225, -227, -228, - -228, -227, -224, -221, -215, -208, -200, -189, -177, -163, - -146, -127, -106, -83, -57, -29, 2, 36, 72, 111, - 153, 197, 244, 294, 347, 401, 459, 519, 581, 645, - 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356, - 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962, - 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000, - 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970, - 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388, - -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, - -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, - -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, - -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, - -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082, - -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455, - 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289, - 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617, - 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684, - 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835, - 73415, 73908, 74313, 74630, 74856, 74992, 75038 }; - -void make_decode_tables_const(void) -{ - int i,k,kr,divv; - real *costab; - - for(i=0;i<5;i++) - { - kr=0x10>>i; divv=0x40>>i; - costab = pnts[i]; - for(k=0;kdecwin; - scaleval = -scaleval; - for(i=0,j=0;i<256;i++,j++,table+=32) - { - if(table < (mp->decwin)+512+16) - table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval; - if(i % 32 == 31) - table -= 1023; - if(i % 64 == 63) - scaleval = - scaleval; - } - - for( /* i=256 */ ;i<512;i++,j--,table+=32) - { - if(table < (mp->decwin)+512+16) - table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval; - if(i % 32 == 31) - table -= 1023; - if(i % 64 == 63) - scaleval = - scaleval; - } -} - - diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c index 8675056..edd9385 100644 --- a/addons/res_config_mysql.c +++ b/addons/res_config_mysql.c @@ -24,6 +24,7 @@ /*** MODULEINFO mysqlclient + no extended ***/ diff --git a/apps/Makefile b/apps/Makefile index 0e8e821..589293c 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -15,8 +15,6 @@ MODULE_PREFIX=app MENUSELECT_CATEGORY=APPS MENUSELECT_DESCRIPTION=Applications -MODS_C_ADDITIONAL=app_voicemail_imapstorage app_voicemail_odbcstorage - MENUSELECT_OPTS_app_directory:=$(MENUSELECT_OPTS_app_voicemail) ifneq ($(findstring ODBC_STORAGE,$(MENUSELECT_OPTS_app_voicemail)),) MENUSELECT_DEPENDS_app_voicemail+=$(MENUSELECT_DEPENDS_ODBC_STORAGE) @@ -27,24 +25,6 @@ endif all: _all -add_depends_cmd = sed -i -e '/^\/\*\*\* MODULEINFO/a\\t$(1)<\/depend>' -app_voicemail_imapstorage.c: app_voicemail.c - cp $< $@ - $(call add_depends_cmd,imap_tk) $@ - $(call add_depends_cmd,openssl) $@ - cp app_voicemail.exports.in app_voicemail_imapstorage.exports.in -app_voicemail_odbcstorage.c: app_voicemail.c - cp $< $@ - $(call add_depends_cmd,unixodbc) $@ - cp app_voicemail.exports.in app_voicemail_odbcstorage.exports.in - -dist-clean:: - rm -f app_voicemail_*.c - rm -f app_voicemail_*.exports.in - -app_voicemail_imapstorage.o: _ASTCFLAGS+=-DIMAP_STORAGE -app_voicemail_odbcstorage.o: _ASTCFLAGS+=-DODBC_STORAGE - include $(ASTTOPDIR)/Makefile.moddir_rules $(call MOD_ADD_C,app_confbridge,$(wildcard confbridge/*.c)) diff --git a/build_tools/cflags-devmode.xml b/build_tools/cflags-devmode.xml index 9a5ccb0..9943cc7 100644 --- a/build_tools/cflags-devmode.xml +++ b/build_tools/cflags-devmode.xml @@ -21,4 +21,7 @@ extended + + extended + diff --git a/build_tools/cflags.xml b/build_tools/cflags.xml index 340b230..6a95672 100644 --- a/build_tools/cflags.xml +++ b/build_tools/cflags.xml @@ -125,11 +125,7 @@ core - no - native_arch - - yes - extended + native_arch diff --git a/build_tools/make_build_h b/build_tools/make_build_h index eca65a9..2c8895e 100755 --- a/build_tools/make_build_h +++ b/build_tools/make_build_h @@ -5,14 +5,6 @@ MACHINE=`uname -m | sed 's/\\\\/\\\\\\\\/g'` OS=`uname -s` USER=`id | awk -F")" '{print $1}'| awk -F"(" '{print $2}' | sed 's/\\\\/\\\\\\\\/g'` DATE=`date -u "+%Y-%m-%d %H:%M:%S"` -if [ -n "${SOURCE_DATE_EPOCH}" ]; then - # building reproducibly, faking some data - HOSTNAME='buildd.debian.org' - KERNEL='unknown' - MACHINE='unknown' - USER='nobody' - DATE=`date -u "+%Y-%m-%d %H:%M:%S" -d @${SOURCE_DATE_EPOCH}` -fi cat << END /* * build.h diff --git a/build_tools/menuselect-deps.in b/build_tools/menuselect-deps.in index f438ded..161c67b 100644 --- a/build_tools/menuselect-deps.in +++ b/build_tools/menuselect-deps.in @@ -1,7 +1,4 @@ ALSA=@PBX_ALSA@ -AMR_NB=@PBX_AMR_NB@ -AMR_WB_DECODER=@PBX_AMR_WB_DECODER@ -AMR_WB_ENCODER=@PBX_AMR_WB_ENCODER@ BLUETOOTH=@PBX_BLUETOOTH@ BEANSTALK=@PBX_BEANSTALK@ COROSYNC=@PBX_COROSYNC@ diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 8013175..46342ce 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -34,6 +34,7 @@ */ /*** MODULEINFO + res_pktccops extended ***/ diff --git a/channels/chan_motif.c b/channels/chan_motif.c index 2691d61..a9dd2af 100644 --- a/channels/chan_motif.c +++ b/channels/chan_motif.c @@ -258,8 +258,6 @@ /*! \brief Namespace for XMPP stanzas */ #define XMPP_STANZAS_NS "urn:ietf:params:xml:ns:xmpp-stanzas" -#define DTLS_NS "urn:xmpp:jingle:apps:dtls:0" - /*! \brief The various transport methods supported, from highest priority to lowest priority when doing fallback */ enum jingle_transport { JINGLE_TRANSPORT_ICE_UDP = 3, /*!< XEP-0176 */ @@ -688,7 +686,7 @@ static void jingle_enable_video(struct jingle_session *session) return; } - ast_rtp_instance_set_prop(session->vrtp, AST_RTP_PROPERTY_RTCP, AST_RTP_INSTANCE_RTCP_MUX); + ast_rtp_instance_set_prop(session->vrtp, AST_RTP_PROPERTY_RTCP, 1); ast_rtp_instance_set_channel_id(session->vrtp, ast_channel_uniqueid(session->owner)); ast_channel_set_fd(session->owner, 2, ast_rtp_instance_fd(session->vrtp, 0)); ast_channel_set_fd(session->owner, 3, ast_rtp_instance_fd(session->vrtp, 1)); @@ -699,8 +697,6 @@ static void jingle_enable_video(struct jingle_session *session) } } -static struct ast_rtp_dtls_cfg dtls_cfg; - /*! \brief Internal helper function used to allocate Jingle session on an endpoint */ static struct jingle_session *jingle_alloc(struct jingle_endpoint *endpoint, const char *from, const char *sid) { @@ -759,35 +755,9 @@ static struct jingle_session *jingle_alloc(struct jingle_endpoint *endpoint, con ao2_ref(session, -1); return NULL; } - ast_rtp_instance_set_prop(session->rtp, AST_RTP_PROPERTY_RTCP, 1); ast_rtp_instance_set_prop(session->rtp, AST_RTP_PROPERTY_DTMF, 1); - struct ast_rtp_engine_dtls *dtls; - - if ((dtls = ast_rtp_instance_get_dtls(session->rtp))) { - dtls_cfg.enabled = 1; - dtls_cfg.default_setup = AST_RTP_DTLS_SETUP_ACTPASS; - dtls_cfg.hash = AST_RTP_DTLS_HASH_SHA256; - dtls_cfg.verify = AST_RTP_DTLS_VERIFY_FINGERPRINT; - dtls_cfg.suite = AST_AES_CM_128_HMAC_SHA1_80; - dtls_cfg.ephemeral_cert = 1; - dtls_cfg.certfile = ast_strdup(""); - dtls_cfg.pvtfile = ast_strdup(""); - dtls_cfg.cipher = ast_strdup(""); - dtls_cfg.cafile = ast_strdup(""); - dtls_cfg.capath = ast_strdup(""); - - if (dtls->set_configuration(session->rtp, &dtls_cfg)) { - ast_log(LOG_ERROR, "Attempted to set an invalid DTLS-SRTP configuration on RTP instance '%p'\n", - session->rtp); - } - } - else { - ast_log(LOG_ERROR, "No DTLS-SRTP support present on engine for RTP instance '%p', was it compiled with support for it?\n", - session->rtp); - } - session->maxicecandidates = endpoint->maxicecandidates; session->maxpayloads = endpoint->maxpayloads; @@ -944,49 +914,6 @@ end: iks_delete(response); } -static void jingle_add_fingerprint(struct ast_rtp_instance *rtp, iks *transport) { - struct ast_rtp_engine_dtls *dtls; - if ((dtls = ast_rtp_instance_get_dtls(rtp)) || dtls->active(rtp)) { - // Add the DTLS fingerprint in there as well - iks *fingerprint_node = NULL; - const char *fingerprint; - if (!(fingerprint_node = iks_new("fingerprint"))) { - ast_log(LOG_ERROR, "Failed to allocate stanzas for DTLS"); - return; - } - iks_insert_attrib(fingerprint_node, "xmlns", DTLS_NS); - switch (dtls->get_setup(rtp)) { - case AST_RTP_DTLS_SETUP_ACTIVE: - iks_insert_attrib(fingerprint_node, "setup", "active"); - break; - case AST_RTP_DTLS_SETUP_PASSIVE: - iks_insert_attrib(fingerprint_node, "setup", "passive"); - break; - case AST_RTP_DTLS_SETUP_ACTPASS: - iks_insert_attrib(fingerprint_node, "setup", "actpass"); - break; - case AST_RTP_DTLS_SETUP_HOLDCONN: - iks_insert_attrib(fingerprint_node, "setup", "holdconn"); - break; - default: - break; - } - switch (dtls->get_fingerprint_hash(rtp)) { - case AST_RTP_DTLS_HASH_SHA1: - iks_insert_attrib(fingerprint_node, "hash", "sha-1"); - break; - case AST_RTP_DTLS_HASH_SHA256: - iks_insert_attrib(fingerprint_node, "hash", "sha-256"); - break; - default: - break; - } - fingerprint = dtls->get_fingerprint(rtp); - iks_insert_cdata(fingerprint_node, fingerprint, strlen(fingerprint)); - iks_insert_node(transport, fingerprint_node); - } -} - /*! \brief Internal helper function which adds ICE-UDP candidates to a transport node */ static int jingle_add_ice_udp_candidates_to_transport(struct ast_rtp_instance *rtp, iks *transport, iks **candidates, unsigned int maximum) { @@ -1002,7 +929,6 @@ static int jingle_add_ice_udp_candidates_to_transport(struct ast_rtp_instance *r } iks_insert_attrib(transport, "xmlns", JINGLE_ICE_UDP_NS); - jingle_add_fingerprint(rtp, transport); iks_insert_attrib(transport, "pwd", ice->get_password(rtp)); iks_insert_attrib(transport, "ufrag", ice->get_ufrag(rtp)); @@ -1041,9 +967,7 @@ static int jingle_add_ice_udp_candidates_to_transport(struct ast_rtp_instance *r } iks_insert_node(transport, local_candidate); - if (candidates != NULL) { - candidates[i++] = local_candidate; - } + candidates[i++] = local_candidate; } ao2_iterator_destroy(&it); @@ -1284,7 +1208,7 @@ static void jingle_queue_hangup_with_cause(struct jingle_session *session, int c } /*! \brief Internal function which sends a transport-info message */ -static void jingle_send_transport_info(struct jingle_session *session, const char *from, int actually_initiate) +static void jingle_send_transport_info(struct jingle_session *session, const char *from) { iks *iq, *jingle = NULL, *audio = NULL, *audio_transport = NULL, *video = NULL, *video_transport = NULL; iks *audio_candidates[session->maxicecandidates], *video_candidates[session->maxicecandidates]; @@ -1313,7 +1237,7 @@ static void jingle_send_transport_info(struct jingle_session *session, const cha iks_insert_attrib(jingle, "xmlns", GOOGLE_SESSION_NS); iks_insert_attrib(jingle, "initiator", session->outgoing ? session->connection->jid->full : from); } else { - iks_insert_attrib(jingle, "action", actually_initiate == 1 ? "session-initiate" : "transport-info"); + iks_insert_attrib(jingle, "action", "transport-info"); iks_insert_attrib(jingle, "sid", session->sid); iks_insert_attrib(jingle, "xmlns", JINGLE_NS); } @@ -1460,10 +1384,6 @@ static int jingle_add_payloads_to_description(struct jingle_session *session, st payloads[i++] = payload; } } - iks *rtcp_mux = iks_new("rtcp-mux"); - if (rtcp_mux) { - iks_insert_node(description, rtcp_mux); - } return res; } @@ -1496,8 +1416,6 @@ static int jingle_add_content(struct jingle_session *session, iks *jingle, iks * if (!(res = jingle_add_payloads_to_description(session, rtp, description, payloads, type))) { if (session->transport == JINGLE_TRANSPORT_ICE_UDP) { iks_insert_attrib(transport, "xmlns", JINGLE_ICE_UDP_NS); - jingle_add_ice_udp_candidates_to_transport(rtp, transport, NULL, session->maxicecandidates); - jingle_add_fingerprint(rtp, transport); iks_insert_node(content, transport); } else if (session->transport == JINGLE_TRANSPORT_GOOGLE_V2) { iks_insert_attrib(transport, "xmlns", GOOGLE_TRANSPORT_NS); @@ -1625,7 +1543,7 @@ static int jingle_outgoing_hook(void *data, ikspak *pak) } ao2_unlock(session); - jingle_send_transport_info(session, iks_find_attrib(pak->x, "from"), 0); + jingle_send_transport_info(session, iks_find_attrib(pak->x, "from")); goto end; } @@ -2166,19 +2084,8 @@ static int jingle_interpret_description(struct jingle_session *session, iks *des return -1; } - struct ast_rtp_engine_ice *ice = ast_rtp_instance_get_ice(session->rtp); /* Iterate the codecs updating the relevant RTP instance as we go */ for (codec = iks_child(description); codec; codec = iks_next(codec)) { - if (strcasecmp(iks_name(codec), "rtcp-mux") == 0) { - if (ice) { - ast_log(LOG_NOTICE, "Enabling RTCP MUX for session '%s'\n", session->sid); - ice->change_components(session->rtp, 1); - } - else { - ast_log(LOG_ERROR, "Could not enable RTCP MUX for session '%s' as ICE not available\n", session->sid); - } - continue; - } char *id = iks_find_attrib(codec, "id"), *name = iks_find_attrib(codec, "name"); char *clockrate = iks_find_attrib(codec, "clockrate"); int rtp_id, rtp_clockrate; @@ -2224,53 +2131,10 @@ static int jingle_interpret_ice_udp_transport(struct jingle_session *session, ik if (!ast_strlen_zero(ufrag) && !ast_strlen_zero(pwd)) { ice->set_authentication(rtp, ufrag, pwd); } - iks *fingerprint_node; - if ((fingerprint_node = iks_find_with_attrib(transport, "transport", "xmlns", DTLS_NS))) { - char *dtls_hash, *dtls_fingerprint, *dtls_setup; - dtls_hash = iks_find_attrib(fingerprint_node, "hash"); - dtls_fingerprint = iks_cdata(fingerprint_node); - dtls_setup = iks_find_attrib(fingerprint_node, "setup"); - if (!ast_strlen_zero(dtls_hash) && !ast_strlen_zero(dtls_fingerprint) && !ast_strlen_zero(dtls_setup)) { - struct ast_rtp_engine_dtls *dtls; - if ((dtls = ast_rtp_instance_get_dtls(rtp))) { - ast_log(LOG_NOTICE, "Received DTLS information on session '%s' (hash %s): %s\n", session->sid, dtls_hash, dtls_fingerprint); - if (!strcasecmp(dtls_hash, "sha-1")) { - dtls->set_fingerprint(rtp, AST_RTP_DTLS_HASH_SHA1, dtls_fingerprint); - } else if (!strcasecmp(dtls_hash, "sha-256")) { - dtls->set_fingerprint(rtp, AST_RTP_DTLS_HASH_SHA256, dtls_fingerprint); - } else { - ast_log(LOG_WARNING, "Unsupported fingerprint hash type '%s' received for session '%s'\n", - dtls_hash, session->sid); - } - if (!strcasecmp(dtls_setup, "active")) { - dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_ACTIVE); - } else if (!strcasecmp(dtls_setup, "passive")) { - dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_PASSIVE); - } else if (!strcasecmp(dtls_setup, "actpass")) { - dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_ACTPASS); - } else if (!strcasecmp(dtls_setup, "holdconn")) { - dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_HOLDCONN); - } else { - ast_log(LOG_WARNING, "Unsupported setup attribute dtls_setup '%s' received for session '%s'\n", - dtls_setup, session->sid); - } - } - else { - ast_log(LOG_WARNING, "Received DTLS information on session '%s', but it wasn't enabled\n", session->sid); - } - } - else { - ast_log(LOG_WARNING, "Invalid DTLS information on session '%s'\n", session->sid); - } - } for (candidate = iks_child(transport); candidate; candidate = iks_next(candidate)) { - char *name = iks_name(candidate); - if (strcasecmp(name, "candidate") != 0) { - continue; - } char *component = iks_find_attrib(candidate, "component"), *foundation = iks_find_attrib(candidate, "foundation"); - char *generation = iks_find_attrib(candidate, "generation"); + char *generation = iks_find_attrib(candidate, "generation"), *id = iks_find_attrib(candidate, "id"); char *ip = iks_find_attrib(candidate, "ip"), *port = iks_find_attrib(candidate, "port"); char *priority = iks_find_attrib(candidate, "priority"), *protocol = iks_find_attrib(candidate, "protocol"); char *type = iks_find_attrib(candidate, "type"); @@ -2279,7 +2143,7 @@ static int jingle_interpret_ice_udp_transport(struct jingle_session *session, ik struct ast_sockaddr remote_address = { { 0, } }; /* If this candidate is incomplete skip it */ - if (ast_strlen_zero(component) || ast_strlen_zero(foundation) || ast_strlen_zero(generation) || + if (ast_strlen_zero(component) || ast_strlen_zero(foundation) || ast_strlen_zero(generation) || ast_strlen_zero(id) || ast_strlen_zero(ip) || ast_strlen_zero(port) || ast_strlen_zero(priority) || ast_strlen_zero(protocol) || ast_strlen_zero(type)) { jingle_queue_hangup_with_cause(session, AST_CAUSE_PROTOCOL_ERROR); @@ -2586,7 +2450,7 @@ static void jingle_action_session_initiate(struct jingle_endpoint *endpoint, str /* Only send a transport-info message if we successfully interpreted the available content */ if (!jingle_interpret_content(session, pak)) { - jingle_send_transport_info(session, iks_find_attrib(pak->x, "from"), 0); + jingle_send_transport_info(session, iks_find_attrib(pak->x, "from")); } break; } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index fd744ee..e632a43 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -10965,13 +10965,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action ast_rtp_lookup_mime_multiple2(s3, NULL, newnoncodeccapability, 0, 0)); } - /* When UDPTL is negotiated it is expected that there are no compatible codecs as audio or - * video is not being transported, thus we continue in this function further up if that is - * the case. If we receive an SDP answer containing both a UDPTL stream and another media - * stream however we need to check again to ensure that there is at least one joint codec - * instead of assuming there is one. - */ - if ((portno != -1 || vportno != -1 || tportno != -1) && ast_format_cap_count(newjointcapability)) { + if (portno != -1 || vportno != -1 || tportno != -1) { /* We are now ready to change the sip session and RTP structures with the offered codecs, since they are acceptable */ unsigned int framing; diff --git a/channels/chan_vpb.cc b/channels/chan_vpb.cc index 6dcea5e..e8cd961 100644 --- a/channels/chan_vpb.cc +++ b/channels/chan_vpb.cc @@ -49,7 +49,7 @@ /*** MODULEINFO vpb - yes + no deprecated ***/ diff --git a/channels/console_video.h b/channels/console_video.h index 1bdc659..1c945e4 100644 --- a/channels/console_video.h +++ b/channels/console_video.h @@ -28,9 +28,9 @@ "console {device}" #else -#include +#include #ifndef OLD_FFMPEG -#include /* requires a recent ffmpeg */ +#include /* requires a recent ffmpeg */ #endif #define CONSOLE_VIDEO_CMDS \ diff --git a/codecs/Makefile b/codecs/Makefile index 3935341..86a7dec 100644 --- a/codecs/Makefile +++ b/codecs/Makefile @@ -27,6 +27,7 @@ LIBLPC10 := $(SUB_LPC10)/liblpc10.a SUB_DIRS := \ $(SUB_GSM) \ + $(SUB_ILBC) \ $(SUB_LPC10) \ all: _all diff --git a/codecs/codec_amr.c b/codecs/codec_amr.c deleted file mode 100644 index 7846873..0000000 --- a/codecs/codec_amr.c +++ /dev/null @@ -1,405 +0,0 @@ -/*** MODULEINFO - amr_nb - amr_wb_decoder - amr_wb_encoder -***/ - -#include "asterisk.h" - -/* version 1.0 */ -/* based on codecs/codec_opus.c */ - -#include "asterisk/codec.h" /* for AST_MEDIA_TYPE_AUDIO */ -#include "asterisk/format.h" /* for ast_format_get_attribute_data */ -#include "asterisk/frame.h" /* for ast_frame, etc */ -#include "asterisk/linkedlists.h" /* for AST_LIST_NEXT, etc */ -#include "asterisk/logger.h" /* for ast_log, ast_debug, etc */ -#include "asterisk/module.h" -#include "asterisk/translate.h" /* for ast_trans_pvt, etc */ - -#include -#include -#include -#include - -#include "asterisk/amr.h" - -#define BUFFER_SAMPLES 16000 /* 1000 milliseconds */ - -/* Sample frame data */ -#include "asterisk/slin.h" -#include "ex_amr.h" - -struct amr_coder_pvt { - void *state; /* May be encoder or decoder */ - unsigned int frames; - int16_t buf[BUFFER_SAMPLES]; -}; - -static int lintoamr_new(struct ast_trans_pvt *pvt) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - const unsigned int sample_rate = pvt->t->src_codec.sample_rate; - - struct amr_attr *attr = pvt->explicit_dst ? ast_format_get_attribute_data(pvt->explicit_dst) : NULL; - const int dtx = attr ? attr->vad : 0; - - if (8000 == sample_rate) { - apvt->state = Encoder_Interface_init(dtx); - } else if (16000 == sample_rate) { - apvt->state = E_IF_init(); - } - - if (NULL == apvt->state) { - ast_log(LOG_ERROR, "Error creating the AMR encoder for %d\n", sample_rate); - return -1; - } - - apvt->frames = 0; - ast_debug(3, "Created encoder (%d -> AMR) %p (Format %p)\n", sample_rate, apvt, pvt->explicit_dst); - - return 0; -} - -static int amrtolin_new(struct ast_trans_pvt *pvt) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - const unsigned int sample_rate = pvt->t->dst_codec.sample_rate; - - if (8000 == sample_rate) { - apvt->state = Decoder_Interface_init(); - } else if (16000 == sample_rate) { - apvt->state = D_IF_init(); - } - - if (NULL == apvt->state) { - ast_log(LOG_ERROR, "Error creating the AMR decoder for %d\n", sample_rate); - return -1; - } - - apvt->frames = 0; - ast_debug(3, "Created decoder (AMR -> %d) %p\n", sample_rate, apvt); - - return 0; -} - -static int lintoamr_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - - /* XXX We should look at how old the rest of our stream is, and if it - is too old, then we should overwrite it entirely, otherwise we can - get artifacts of earlier talk that do not belong */ - memcpy(apvt->buf + pvt->samples, f->data.ptr, f->datalen); - pvt->samples += f->samples; - - return 0; -} - -static struct ast_frame *lintoamr_frameout(struct ast_trans_pvt *pvt) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - const unsigned int sample_rate = pvt->t->src_codec.sample_rate; - const unsigned int frame_size = sample_rate / 50; - struct ast_frame *result = NULL; - struct ast_frame *last = NULL; - int samples = 0; /* output samples */ - - struct amr_attr *attr = ast_format_get_attribute_data(pvt->f.subclass.format); - const int dtx = attr ? attr->vad : 0; - const int mode = attr ? attr->mode_current : 0; - const int aligned = attr ? attr->octet_align : 0; - - while (pvt->samples >= frame_size) { - struct ast_frame *current; - const int forceSpeech = 0; /* ignored by underlying API anyway */ - const short *speech = apvt->buf + samples; - unsigned char *out = pvt->outbuf.uc + 1; - int status = -1; /* result value; either error or output bytes */ - - if (8000 == sample_rate) { - status = Encoder_Interface_Encode(apvt->state, mode, speech, out, forceSpeech); - } else if (16000 == sample_rate) { - status = E_IF_encode(apvt->state, mode, speech, out, dtx); - } - - samples += frame_size; - pvt->samples -= frame_size; - - if (status < 0) { - ast_log(LOG_ERROR, "Error encoding the AMR frame\n"); - current = NULL; - } else if (aligned) { - pvt->outbuf.uc[0] = (15 << 4); /* Change-Mode Request (CMR): no */ - /* add one byte, because we added the CMR byte */ - current = ast_trans_frameout(pvt, status + 1, frame_size); - } else { - const int another = ((out[0] >> 7) & 0x01); - const int type = ((out[0] >> 3) & 0x0f); - const int quality = ((out[0] >> 2) & 0x01); - unsigned int i; - - /* to shift in place, clear bits beyond end and at start */ - out[0] = 0; - out[status] = 0; - /* shift in place, 6 bits */ - for (i = 0; i < status; i++) { - out[i] = ((out[i] << 6) | (out[i + 1] >> 2)); - } - /* restore first two bytes: [ CMR |F| FT |Q] */ - out[0] |= ((type << 7) | (quality << 6)); - pvt->outbuf.uc[0] = ((15 << 4) | (another << 3) | (type >> 1)); /* CMR: no */ - - if (8000 == sample_rate) { - /* https://tools.ietf.org/html/rfc4867#section-3.6 */ - const int octets[16] = { 14, 15, 16, 18, 20, 22, 27, 32, 7 }; - - status = octets[type]; - } else if (16000 == sample_rate) { - /* 3GPP TS 26.201, Table A.1b, plus CMR (4 bits) and F (1 bit) / 8 */ - const int octets[16] = { 18, 24, 33, 37, 41, 47, 51, 59, 61, 7 }; - - status = octets[type]; - } - - current = ast_trans_frameout(pvt, status, frame_size); - } - - if (!current) { - continue; - } else if (last) { - AST_LIST_NEXT(last, frame_list) = current; - } else { - result = current; - } - last = current; - } - - /* Move the data at the end of the buffer to the front */ - if (samples) { - memmove(apvt->buf, apvt->buf + samples, pvt->samples * 2); - } - - return result; -} - -static int amrtolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - const unsigned int sample_rate = pvt->t->dst_codec.sample_rate; - const unsigned int frame_size = sample_rate / 50; - - struct amr_attr *attr = ast_format_get_attribute_data(f->subclass.format); - const int aligned = attr ? attr->octet_align : 0; - const unsigned char mode_next = *(unsigned char *) f->data.ptr >> 4; - const int bfi = 0; /* ignored by underlying API anyway */ - unsigned char temp[f->datalen]; - unsigned char *in; - - if (attr && mode_next < 15) { - attr->mode_current = mode_next; - } - - /* - * Decoders expect the "MIME storage format" (RFC 4867 chapter 5) which is - * octet aligned. On the other hand, the "RTP payload format" (chapter 4) - * is prefixed with a change-mode request (CMR; 1 byte in octet-aligned - * mode). Therefore, we do +1 to jump over the first byte. - */ - - if (aligned) { - in = f->data.ptr + 1; - } else { - in = f->data.ptr; - const int another = ((in[0] >> 3) & 0x01); - const int type = ((in[0] << 1 | in[1] >> 7) & 0x0f); - const int quality = ((in[1] >> 6) & 0x01); - unsigned int i; - - /* shift in place, 2 bits */ - for (i = 1; i < (f->datalen - 1); i++) { - temp[i] = ((in[i] << 2) | (in[i + 1] >> 6)); - } - temp[f->datalen - 1] = in[f->datalen - 1] << 2; - /* restore first byte: [F| FT |Q] */ - temp[0] = ((another << 7) | (type << 3) | (quality << 2)); - in = temp; - } - - if ((apvt->frames == 0) && (in[0] & 0x80)) { - apvt->frames = 1; - ast_log(LOG_WARNING, "multiple frames per packet were not tested\n"); - } - - if (8000 == sample_rate) { - Decoder_Interface_Decode(apvt->state, in, pvt->outbuf.i16 + pvt->datalen, bfi); - } else if (16000 == sample_rate) { - D_IF_decode(apvt->state, in, pvt->outbuf.i16 + pvt->datalen, bfi); - } - - pvt->samples += frame_size; - pvt->datalen += frame_size * 2; - - return 0; -} - -static void lintoamr_destroy(struct ast_trans_pvt *pvt) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - const unsigned int sample_rate = pvt->t->src_codec.sample_rate; - - if (!apvt || !apvt->state) { - return; - } - - if (8000 == sample_rate) { - Encoder_Interface_exit(apvt->state); - } else if (16000 == sample_rate) { - E_IF_exit(apvt->state); - } - apvt->state = NULL; - - ast_debug(3, "Destroyed encoder (%d -> AMR) %p\n", sample_rate, apvt); -} - -static void amrtolin_destroy(struct ast_trans_pvt *pvt) -{ - struct amr_coder_pvt *apvt = pvt->pvt; - const unsigned int sample_rate = pvt->t->dst_codec.sample_rate; - - if (!apvt || !apvt->state) { - return; - } - - if (8000 == sample_rate) { - Decoder_Interface_exit(apvt->state); - } else if (16000 == sample_rate) { - D_IF_exit(apvt->state); - } - apvt->state = NULL; - - ast_debug(3, "Destroyed decoder (AMR -> %d) %p\n", sample_rate, apvt); -} - -static struct ast_translator amrtolin = { - .name = "amrtolin", - .src_codec = { - .name = "amr", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 8000, - }, - .dst_codec = { - .name = "slin", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 8000, - }, - .format = "slin", - .newpvt = amrtolin_new, - .framein = amrtolin_framein, - .destroy = amrtolin_destroy, - .sample = amr_sample, - .desc_size = sizeof(struct amr_coder_pvt), - .buffer_samples = BUFFER_SAMPLES / 2, - /* actually: 50 * channels[6] * redundancy[5] * (mode7[31] + CRC[1] + FT[1] + CMR[1]) */ - .buf_size = BUFFER_SAMPLES, -}; - -static struct ast_translator lintoamr = { - .name = "lintoamr", - .src_codec = { - .name = "slin", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 8000, - }, - .dst_codec = { - .name = "amr", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 8000, - }, - .format = "amr", - .newpvt = lintoamr_new, - .framein = lintoamr_framein, - .frameout = lintoamr_frameout, - .destroy = lintoamr_destroy, - .sample = slin8_sample, - .desc_size = sizeof(struct amr_coder_pvt), - .buffer_samples = BUFFER_SAMPLES / 2, - .buf_size = BUFFER_SAMPLES, -}; - -static struct ast_translator amrtolin16 = { - .name = "amrtolin16", - .src_codec = { - .name = "amrwb", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 16000, - }, - .dst_codec = { - .name = "slin", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 16000, - }, - .format = "slin16", - .newpvt = amrtolin_new, - .framein = amrtolin_framein, - .destroy = amrtolin_destroy, - .sample = amrwb_sample, - .desc_size = sizeof(struct amr_coder_pvt), - .buffer_samples = BUFFER_SAMPLES, - /* actually: 50 * channels[6] * redundancy[5] * (mode8[60] + CRC[1] + FT[1] + CMR[1]) */ - .buf_size = BUFFER_SAMPLES * 2, -}; - -static struct ast_translator lin16toamr = { - .name = "lin16toamr", - .src_codec = { - .name = "slin", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 16000, - }, - .dst_codec = { - .name = "amrwb", - .type = AST_MEDIA_TYPE_AUDIO, - .sample_rate = 16000, - }, - .format = "amrwb", - .newpvt = lintoamr_new, - .framein = lintoamr_framein, - .frameout = lintoamr_frameout, - .destroy = lintoamr_destroy, - .sample = slin16_sample, - .desc_size = sizeof(struct amr_coder_pvt), - .buffer_samples = BUFFER_SAMPLES, - .buf_size = BUFFER_SAMPLES * 2, -}; - -static int unload_module(void) -{ - int res; - - res = ast_unregister_translator(&amrtolin); - res |= ast_unregister_translator(&lintoamr); - res |= ast_unregister_translator(&amrtolin16); - res |= ast_unregister_translator(&lin16toamr); - - return res; -} - -static int load_module(void) -{ - int res; - - res = ast_register_translator(&amrtolin); - res |= ast_register_translator(&lintoamr); - res |= ast_register_translator(&amrtolin16); - res |= ast_register_translator(&lin16toamr); - - if (res) { - unload_module(); - return AST_MODULE_LOAD_FAILURE; - } - - return AST_MODULE_LOAD_SUCCESS; -} - -AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "AMR Coder/Decoder"); diff --git a/codecs/codec_ilbc.c b/codecs/codec_ilbc.c index ea81c2a..536d680 100644 --- a/codecs/codec_ilbc.c +++ b/codecs/codec_ilbc.c @@ -27,7 +27,6 @@ /*** MODULEINFO ilbc - no core ***/ diff --git a/codecs/ex_amr.h b/codecs/ex_amr.h deleted file mode 100644 index 0045e53..0000000 --- a/codecs/ex_amr.h +++ /dev/null @@ -1,49 +0,0 @@ -#include "asterisk/format_cache.h" /* for ast_format_amr(wb) */ -#include "asterisk/frame.h" /* for ast_frame, etc */ - -static uint8_t ex_amr[] = { - 0xf0, 0x6d, 0x47, 0x8c, 0xc3, 0x0d, 0x03, 0xec, - 0xe2, 0x18, 0x3e, 0x28, 0x20, 0x80 -}; - -static struct ast_frame *amr_sample(void) -{ - static struct ast_frame f = { - .frametype = AST_FRAME_VOICE, - .datalen = sizeof(ex_amr), - .samples = 160, - .mallocd = 0, - .offset = 0, - .src = __PRETTY_FUNCTION__, - .data.ptr = ex_amr, - }; - - f.subclass.format = ast_format_amr; - - return &f; -} - -static uint8_t ex_amrwb[] = { - 0xf1, 0x5e, 0x51, 0x98, 0xc5, 0x64, 0xc7, 0xc5, - 0x0c, 0x6c, 0x82, 0x19, 0x16, 0x03, 0xf0, 0x0a, - 0x0b, 0x57, 0x53, 0x51, 0x7f, 0x97, 0x97, 0x79, - 0x31, 0xdd, 0x73, 0x1b, 0x92, 0x54, 0xf5, 0x79, - 0x9a, -}; - -static struct ast_frame *amrwb_sample(void) -{ - static struct ast_frame f = { - .frametype = AST_FRAME_VOICE, - .datalen = sizeof(ex_amrwb), - .samples = 320, - .mallocd = 0, - .offset = 0, - .src = __PRETTY_FUNCTION__, - .data.ptr = ex_amrwb, - }; - - f.subclass.format = ast_format_amrwb; - - return &f; -} diff --git a/configure.ac b/configure.ac index ba8e6dc..7acfcbc 100644 --- a/configure.ac +++ b/configure.ac @@ -40,7 +40,7 @@ AC_SUBST([astlibdir], ['${libdir}'])dnl AC_SUBST([astmoddir], ['${libdir}/asterisk/modules'])dnl AC_SUBST([astmandir], ['${mandir}'])dnl AC_SUBST([astvarlibdir], ['${localstatedir}/lib/asterisk'])dnl -AC_SUBST([astdatadir], ['${datadir}/asterisk'])dnl +AC_SUBST([astdatadir], ['${astvarlibdir}'])dnl AC_SUBST([astdbdir], ['${astvarlibdir}'])dnl AC_SUBST([astkeydir], ['${astvarlibdir}'])dnl AC_SUBST([astspooldir], ['${localstatedir}/spool/asterisk'])dnl @@ -467,9 +467,6 @@ THIRD_PARTY_CONFIGURE() # to make things easier for the users. AST_EXT_LIB_SETUP([ALSA], [Advanced Linux Sound Architecture], [asound]) -AST_EXT_LIB_SETUP([AMR_NB], [AMR Audio Codec (Narrowband) Decoder/Encoder], [opencore-amrnb]) -AST_EXT_LIB_SETUP([AMR_WB_DECODER], [AMR-WB Audio Codec (Wideband) Decoder], [opencore-amrwb]) -AST_EXT_LIB_SETUP([AMR_WB_ENCODER], [AMR-WB Audio Codec (Wideband) Encoder], [vo-amrwbenc]) AST_EXT_LIB_SETUP([BFD], [Debug symbol decoding], [bfd]) # BKTR is used for backtrace support on platforms that do not @@ -484,7 +481,7 @@ AST_EXT_LIB_SETUP([CRYPT], [password and data encryption], [crypt]) AST_EXT_LIB_SETUP([CRYPTO], [OpenSSL Cryptography], [crypto]) AST_EXT_LIB_SETUP_OPTIONAL([OPENSSL_SRTP], [OpenSSL SRTP Extension Support], [CRYPTO], [crypto]) AST_EXT_LIB_SETUP([DAHDI], [DAHDI], [dahdi]) -AST_EXT_LIB_SETUP([FFMPEG], [FFmpeg (avcodec and swscale)], [ffmpeg]) +AST_EXT_LIB_SETUP([FFMPEG], [Ffmpeg and avcodec], [avcodec]) AST_EXT_LIB_SETUP([GSM], [External GSM], [gsm], [, use 'internal' GSM otherwise]) AST_EXT_LIB_SETUP([ILBC], [System iLBC], [ilbc], [, use 'internal' iLBC otherwise]) AST_EXT_LIB_SETUP([GTK2], [gtk2], [gtk2]) @@ -1538,10 +1535,6 @@ fi AST_EXT_LIB_CHECK([ALSA], [asound], [snd_pcm_open], [alsa/asoundlib.h]) -AST_EXT_LIB_CHECK([AMR_NB], [opencore-amrnb], [Encoder_Interface_init], [opencore-amrnb/interf_enc.h]) -AST_EXT_LIB_CHECK([AMR_WB_DECODER], [opencore-amrwb], [D_IF_init], [opencore-amrwb/dec_if.h]) -AST_EXT_LIB_CHECK([AMR_WB_ENCODER], [vo-amrwbenc], [E_IF_init], [vo-amrwbenc/enc_if.h]) - AST_EXT_LIB_CHECK([BFD], [bfd], [bfd_openr], [bfd.h]) # Fedora/RedHat/CentOS require extra libraries AST_EXT_LIB_CHECK([BFD], [bfd], [bfd_openr], [bfd.h], [-ldl -liberty]) @@ -2746,18 +2739,7 @@ AST_C_DEFINE_CHECK([SO_NOSIGPIPE], [SO_NOSIGPIPE], [sys/socket.h]) AST_EXT_TOOL_CHECK([SDL], [sdl-config]) AST_EXT_LIB_CHECK([SDL_IMAGE], [SDL_image], [IMG_Load], [SDL_image.h], [${SDL_LIB}], [${SDL_INCLUDE}]) - -PBX_FFMPEG=0 -AC_CHECK_TOOL(PKGCONFIG, pkg-config, No) -if test ! "x${PKGCONFIG}" = xNo; then - FFMPEG_INCLUDE=$(${PKGCONFIG} libavcodec libswscale --cflags 2>/dev/null) - FFMPEG_LIB=$(${PKGCONFIG} libavcodec libswscale --libs) - PBX_FFMPEG=1 - AC_DEFINE([HAVE_FFMPEG], 1, [Define if your system has the FFmpeg libraries.]) -fi -AC_SUBST(PBX_FFMPEG) -AC_SUBST(FFMPEG_INCLUDE) -AC_SUBST(FFMPEG_LIB) +AST_EXT_LIB_CHECK([FFMPEG], [avcodec], [sws_getContext], [ffmpeg/avcodec.h], [${PTHREAD_LIBS} -lz -lm], [${PTHREAD_CFLAGS}]) # possible places for video4linux version 1 AC_CHECK_HEADER([linux/videodev.h], diff --git a/contrib/asterisk.service b/contrib/asterisk.service deleted file mode 100644 index 529dfec..0000000 --- a/contrib/asterisk.service +++ /dev/null @@ -1,49 +0,0 @@ -[Unit] -Description=Asterisk PBX -Documentation=man:asterisk(8) -Wants=network-online.target -After=network-online.target - -[Service] -Type=notify -ExecStart=__ASTERISK_SBIN_DIR__/asterisk -g -f -p -U asterisk -ExecReload=__ASTERISK_SBIN_DIR__/asterisk -rx 'core reload' -Restart=on-failure -RestartSec=1 -WorkingDirectory=__ASTERISK_VARLIB_DIR__ - -# Extra settings: -# If you want to set them, you can add them to a file in the directory -# /lib/systemd/system/asterisk.service.d/ with the extension .conf. -# Example content: -#[Service] -# -# and following those two lines add directives or override existing -# directives. Some extra directives that may be useful: - -# You can run a script to clean up after asterisk. An example script is -# included in contrib/scripts/asterisk_cleanup. -#ExecStopPost=/path/to/script - -#Nice=0 -#UMask=0002 -#LimitCORE=infinity -#LimitNOFILE= - -# safe_asterisk runs Asterisk in a virtual console. This allows easy -# access to the asterisk command-line without logging it. on the other -# hand, it allows anyone with physical access to the console full access -# to Asterisk. To enable this console, unrem the following lines and add -# '-c' to the ExecStart line above: -#TTYPath=/dev/tty9 -#StandardInput=tty -#StandardOutput=tty -#StandardError=tty - -# For more information on what these parameters mean see: -# -# http://0pointer.de/public/systemd-man/systemd.service.html -# http://0pointer.de/public/systemd-man/systemd.exec.html - -[Install] -WantedBy=multi-user.target diff --git a/contrib/scripts/asterisk_cleanup b/contrib/scripts/asterisk_cleanup deleted file mode 100644 index 04b6663..0000000 --- a/contrib/scripts/asterisk_cleanup +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -# asterisk_cleanup: A script intended to optionally be run when Asterisk -# has exited. This example script is used to move core files. - -VARLIBDIR=${VARLIBDIR:/var/lib/asterisk} -RUNDIR=${VARRUNDIR:/var/run/asterisk} -DUMPDROP=${DUMPDROP:-/var/spool/asterisk/cores} -ASTPIDFILE=${ASTVARRUNDIR}/asterisk.pid -PID=`cat ${ASTPIDFILE}` -DATE=`date "+%Y-%m-%dT%H:%M:%S%z"` -if test -f ${RUNDIR}/core.${PID} ; then - mkdir -p "${DUMPDROP}" - mv ${RUNDIR}/core.${PID} ${DUMPDROP}/core.`hostname`-$DATE & -elif test -f ${RUNDIR}/core ; then - mkdir -p "${DUMPDROP}" - mv ${RUNDIR}/core ${DUMPDROP}/core.`hostname`-$DATE & -fi diff --git a/contrib/scripts/astgenkey b/contrib/scripts/astgenkey index f5ec243..c762491 100755 --- a/contrib/scripts/astgenkey +++ b/contrib/scripts/astgenkey @@ -47,11 +47,7 @@ done rm -f ${KEY}.key ${KEY}.pub echo "Generating SSL key '$KEY': " -oldumask="`umask`" -umask 0077 openssl genrsa -out ${KEY}.key ${DES3} 1024 -[ "$(id -u)" = 0 ] && chown asterisk: ${KEY}.key -umask $oldumask openssl rsa -in ${KEY}.key -pubout -out ${KEY}.pub if [ -f "${KEY}.key" ] && [ -f "${KEY}.pub" ]; then diff --git a/contrib/scripts/live_ast b/contrib/scripts/live_ast index fcb1e41..0b5151f 100755 --- a/contrib/scripts/live_ast +++ b/contrib/scripts/live_ast @@ -175,43 +175,6 @@ gen_live_conf() { | sed -e '/^#* \(Begin\|End\) Samples/d' >"$LIVE_CONF" } -# (re?)generate a unit file that could be installed on the system to use -# this copy of Asterisk. -gen_ast_live_service() { - local service_file="$BASE_DIR/asterisk-live.service" - local included_dir='lib' - local included_dir_remmed='etc' - if [ -f /etc/systemd/system/asterisk.service ]; then - included_dir='etc' - included_dir_remmed='lib' - fi - local varlibdir=`awk '/astvarlibdir/ {print $3}' "$AST_CONF" | head -n1` - cat <"$service_file" -# This file is based on your existing asterisk systemd service unit, and -# overrides some fields. If you have an overriding unit in /etc, you -# need to include it, rather than the one in /lib: -.include /$included_dir/systemd/system/asterisk.service -#.include /$included_dir_remmed/systemd/system/asterisk.service - -# This file is not installed. If you want to use it, you need to copy it -# to /etc/systemd/system and run 'systemctl daemon-reload'. You'll then -# need to be able to start this manually (note that it will not be -# enabled and thus the standard bash completion will not complete it). -# If you have multiple live asterisk instances you want to run on the -# same system, be sure to give each one a unique name. - -[Unit] -Description = Asterisk PBX (Live Asterisk) - -# Note: if you changed the parameters passed in the command-line (ExecStart) -# be sure to copy them over here as well. -[Service] -ExecStart = $BASE_DIR/asterisk g -f -p -U asterisk -ExecReload = $BASE_DIR/asterisk -rx 'core reload' -WorkingDirectory = $varlibdir -EOF -} - # (re?)generate the ./live/asterisk wrapper script gen_live_asterisk() { cat <"$BASE_DIR/asterisk" @@ -281,7 +244,6 @@ EOF chmod +x "$BASE_DIR/asterisk" # Generate a sample config file for live_ast itself: gen_live_conf - gen_ast_live_service ;; conf-file) # Just regenerate live.conf from the sample if it does not already exist: diff --git a/debian/50-asterisk b/debian/50-asterisk deleted file mode 100755 index 9e7e241..0000000 --- a/debian/50-asterisk +++ /dev/null @@ -1,17 +0,0 @@ -#! /bin/sh - -# This file, if installed under /usr/share/dahdi/span_config.d/ , will -# attempt to add a newly-generated span to a running copy of Asterisk. -# Asterisk has to be running (if not: it will pick the span on its -# startup), and has to have the channels already configured. -# -# Environment is set in -# http://git.asterisk.org/gitweb/?p=dahdi/tools.git;a=blob;f=hotplug/dahdi_span_config - -if [ "$ACTION" != 'add' ]; then - # Nothing to do here - exit 0 -fi - -# Add to asterisk -asterisk -rx "dahdi create channels $BASECHAN $ENDCHAN" diff --git a/debian/NEWS b/debian/NEWS deleted file mode 100644 index 2fcda8b..0000000 --- a/debian/NEWS +++ /dev/null @@ -1,74 +0,0 @@ -asterisk (1:11.6.0~dfsg-3) unstable; urgency=medium - - The cdr_radius.so and cel_radius.so modules are now linked against - libfreeradius-client2 instead of libradiusclient-ng2 so the default RADIUS - configuration file has changed to /etc/radiusclient/radiusclient.conf. - - If you use a custom RADIUS configuration file, please update it so that it - is compatible with libfreeradius-client2 by adding: - - radius_deadtime 0 - - If you do not take this step you are likely to encounter a SEGFAULT when - asterisk starts up. - - -- Jeremy Lainé Fri, 13 Dec 2013 10:10:50 +0100 - -asterisk (1:11.6.0~dfsg-2) unstable; urgency=medium - - A number of Asterisk modules have been moved to their own packages: - * asterisk-dahdi: chan_dahdi and other modules that depend on DAHDI. - * asterisk-vpb: chan_vpb. - - If you have DAHDI devices or VoiceTronix devices that use chan_vpb, you - need one of those two respective packagees installed. - - -- Tzafrir Cohen Wed, 11 Dec 2013 18:11:16 +0200 - -asterisk (1:1.6.2.0~dfsg~rc1-1) unstable; urgency=low - - The fix for AST-2009-006 breaks IAX2 line protocol by adding an extra - step in the IAX2 handshaking. To allow working with unmodified IAX2 - implementations, add the following two lines under [general] in iax.conf: - - calltokenoptional = 0.0.0.0/0.0.0.0 - maxcallnumbers = 16382 - - -- Tzafrir Cohen Sun, 13 Sep 2009 00:25:09 +0300 - -asterisk (1:1.4.13~dfsg-1) unstable; urgency=medium - - Since this version, ODBC and IMAP storage for Voicemail are provided. - As this could not be done as a runtime option, app_voicemail_odbc.so and - app_voicemail_imap.so are provided. However, these conflict app_voicemail.so - and each other. - If you use a modified modules.conf and you have autoload enabled, you *must* - add explicit noload entries for two of the three voicemail modules. - - -- Faidon Liambotis Mon, 03 Dec 2007 18:36:55 +0200 - -asterisk (1:1.4.2~dfsg-5) unstable; urgency=low - - There are significant configuration differences between - asterisk 1.2.x & 1.4.x, please refer to the file - /usr/share/doc/asterisk/UPGRADE.txt.gz for details. - - -- Mark Purcell Sat, 14 Apr 2007 16:44:18 +0100 - -asterisk (1:1.2.10.dfsg-1) unstable; urgency=low - - The iLBC codec library code has been removed from the Debian asterisk - package as it does not conform with the DFSG. - - -- Mark Purcell Mon, 17 Jul 2006 21:15:50 +0100 - -asterisk (1:1.0.7.dfsg.1-1) unstable; urgency=low - - The Debian version of the upstream asterisk source has had the fpm Music on Hold - removed as this music has only been licenced for use within asterisk which is - incompatible with the Debian Free Software Guildlines - . Please drop your alternative - Music on Hold into the directory /usr/share/asterisk/mohmp3/ - - -- Mark Purcell Sun, 20 Mar 2005 10:30:44 +0000 - diff --git a/debian/README.Debian b/debian/README.Debian deleted file mode 100644 index 306f119..0000000 --- a/debian/README.Debian +++ /dev/null @@ -1,325 +0,0 @@ -Welcome to the world of telephone switch owners. Asterisk is a quite powerful -and probably one of the feature-richest open-source PBXes out there. To get you -a brief impression where to start tweaking, we've included this doc. (Thanks to -Tzafrir Cohen for a proposal of this) - -File Locations -============== -See /etc/asterisk/asterisk.conf for pathnames. All the configuration is done -from the *.conf files there. - -The astdatadir defaults to /usr/share/asterisk . This means that sounds -reside at /usr/share/asterisk/sounds , music-on-hold files default to -/usr/share/asterisk/moh ("directory=moh" in musiconhold.conf is relative to -the astdatadir) and likewise for images. - - -User, Groups, Permissions -========================= -By default the package will create user and group 'asterisk' and will run as -them. It will run with real-time priority (-p) by default. It will also add -itself to the group audio to enable the daemon to access sound cards and to -the group dialout to access Zaptel devices. Running as root is disabled in -/etc/init.d/asterisk for security reasons. - -To change those values you can edit /etc/default/asterisk. - -Alternatively, edit /etc/asterisk/asterisk.conf . - -init.d Script Commands -====================== -In addition to reload, that runs the asterisk CLI command 'reload' there -are also extensions-reload ('extensions reload') and logger-reload -('logger-reload') to load only parts of the configuration file. - -Asterisk supports a number of non-default parameters at startup. For debugging -it is often useful to run 'asterisk -U asterisk -vvvgc' from the console. Add -more -v for even higher verbosity. You can attach a remote console to a running -asterisk daemon with 'asterisk -vcr'. When testing, make sure to use the "-U -asterisk", or asterisk may write files with root ownership. In that case you -might not be able to restart the daemon without altering permissions to the -files first. - -Alternatively use '/etc/init.d/asterisk debug'. - -Asterisk is run with a umask of 007 by default, to allow writing -group-owned voicemail files. To change this value, set the value if 'UMASK' -in /etc/default/asterisk . - -Getting started with config and more features -============================================= -Of course the default config is far from a plug'n'play for every environment. -You need to setup a proper dialplan in extensions.conf, remove the demo entries -and maybe remove FreeWorldDialup too in case you don't participate there. For -more info on how to setup a proper dialplan, fax, enum and configuration of -asterisk, please checkout - http://www.voip-info.org/wiki-Asterisk+quickstart - http://www.voip-info.org/wiki-Asterisk+config+files -or the larger HowTos at: - http://www.automated.it/guidetoasterisk.htm -or - http://www.asteriskdocs.org/ (Asterisk Handbook) - - -Open Files Limit -================ -Asterisk uses one file-handle (and sometimes more) per call. Hence if you -have many simultaneous calls, you often bump into the per-process limit -of 1024 file handles, and get the error: "Too man open files". - -To enlarge that limit, set: MAXFILES in /etc/default/asterisk . -As all settings from there, apply it with: - - /etc/init.d/asterisk restart - - -International Sound Files -========================= -This section is for those who use an alternative set of sound files -rather than the default English ones recorded by Allison Smith. If you -use those, and never needed to set LANGUAGE/language and such - all -should work just fine. - -When Asterisk is asked to play 'some/file' it will search in the -following places on a Debian system (in wish the datadir is set to -/usr/share/asterisk) - - /usr/share/sounds/${LANG_FULL}/some/file.TYPE - /usr/share/sounds/${LANG}/some/file.TYPE - /usr/share/sounds/some/file.TYPE - /usr/share/sounds/en/some/file.TYPE - -TYPE is "the best available type" - the one that will take least -encoding/decoding effort. This is why you normally don't specify the -type of file to play. - -LANG_FULL is a complete name of a language. For instance "fr_FR", -"de_CH" or "en_US". - -LANG is just the "major language" part of FULL_LANG -- only up to the -first "_", if any. So in the above examples we would get "fr", "de" and -"en". - -If the language is not set, only the last two are searched. - -Thus various sound file packages place their files under -/usr/share/sounds/asterisk/xx_YY_g_Foobar, -for sound files of set Foobar of language 'xx' and country 'YY', -being voices of gender g ('m' for male and 'f' for female). -They also provide the alternatives 'asterisk-prompt-xx' and -'asterisk-prompt-xx-yy' for the symlinks -/usr/share/asterisk/sounds/xx and /usr/share/asterisk/sounds/xx_YY . - -If you have multiple such packages and want to change that selection, use: - - update-alternatives --config asterisk-prompt-xx - -Or: - - update-alternatives --config asterisk-prompt-xx-yy - -(TODO: document using an empty alternative directory for 'en' to have no -fallback sounds) - - -Voicemail -========= -Asterisk has two separate implementations of the voicemail system: the -original app_voicemail, and the newer minivm. Minivm is more modular (you -can define your own voicemail IVRs). Though it only supports the simple -files-backed voicemail storage. - -Voicemail has three separate backends: the simple files-based storage, -a database storage ("ODBC") and a mail-server-backed one (IMAP). The -latter two have some advantages of their own, but are more complicated -to set up. Originally those three were three build-time variants. One of -them had to be selected at build time. - -As of Wheezy (1.8), Debian provides those variants as three separate -and conflicting sub-packages: astrisk-voicemail, -astrisk-voicemail-imapstorage and asterisk-voicemail-odbcstorage. Each -of them includes app_voicemail.so, though built with different options. - -Note that some previous versions (specifically the Squeeze 1.6.2 versions) -included all three modules in the main package with different names. -This required explicit 'noload' lines in /etc/asterisk/modules.conf . -Those are no longer needed. Though you should make sure you have no -leftover line 'noload => app_voicemail.so'. - -Also note that the debug information for the IMAP and ODBC voicemail -modules has an incorrect name. This may mean that traces using them may -have invalid information. - - -Recommended and Suggested -========================= -Asterisk includes various optional modules. The package asterisk-modules -includes most of them (you can disable their load using noload in -/etc/asterisk/modules.conf) yet some are still in their own -sub-packages. - -Recommended ------------ -* sox: -Recommended as it is used by MoxMonitor - the default command for mixing -the two recorded streams to a single audio file, and by -app_voicemail/app_minivm to change gains of a mail message. - -* asterisk-voicemail: -Seprated out to sub-packages as there are several implementations of -app_voicemail (plain files storage, ODBC-interfaced database storage, -IMAP-interfaced mail storage). Only one of those three could be -installed. app_voicemail is normally expected to exist on an -installation of Asterisk and hence it is recommended to include one of -them. The simple file-based stoorage requires no extra setup, and hence -is the defaulr. - -* asterisk-moh-opsound-gsm: -Some relatively long and not too annoying music files in a format -readable to Asterisk should reside in /usr/share/asterisk/moh . Asterisk -will then play them when putting a call on hold for whatever reason -(extra tuning: musiconhold.conf). This package is one such example -sounds set. It is recommended in order for Asterisk to properly function -as an elevator. - -Suggested ---------- -* asterisk-doc: -Extra documentation. Including the sample config files. - -* asterisk-dev: -Can be used to build external modules. - -* asterisk-ooh323: -chan_ooh323c.so. A module for support of the H.323 protocol. An -alternative to chan_h323.so. Seems to be in better shape and has a much -smaller dependency set. - -* asterisk-dahdi: -chan_dahdi.so and anything else that depends on DAHDI (MeetMe, -res_timing_dahdi, codec_dahdi, and such). You should install this if you -have DAHDI support (kernel-level) on your system. - - -Others ------- -* asterisk-h323: -chan_h323.so. Maybe consider this instead of asterisk-ooh323, which -upstream seems to prefer. - -* asterisk-mysql: -Direct (non-ODBC) support for MySQL. - -* asterisk-mp3: -Support for playing mp3 files - -* asterisk-mobile: -chan_mobile: support for interfacing with bluetooth headsets/phones. Has -its limitations. - - -Missing Modules -=============== -The following modules are included in the source tree of Asterisk but -were not built: - -* apps/app_fax.c: Disabled by default. Obsolete. res_fax does this now. -* apps/app_ivrdemo.c: Disabled by default. Demo code. -* apps/app_osplookup.c: osptk needed. -* apps/app_rpt.c: Disabled by default. Not popular. Potential quality issues. -* apps/app_saycounted.c: Disabled by default. -* apps/app_skel.c: Disabled by default. Demo code. -* channels/chan_misdn.c: mISDN (1.x) only included in Experimental. See - package misdn-user. -* channels/chan_nbs: NBS not included. Never packaged. Looks quite Asterisk - specific and not really useful. -* channels/chan_usbradio: Disabled by default. Not popular. Potential - quality issues. -* codecs/codec_ilbc.c: Disabled by default. Patent issues. -* res/res_pktccops.c: Disabled by default. -* res/res_timing_kqueue.c: Wrong kernel. - -You can compare that to the list of modules disabled by the Asterisk build -system at build time, that is copied to -/usr/share/doc/asterisk/menuselect.makeopts . - - -Extra Channels -============== -This package includes and enables by default a number of rather not so -popular protocols. Having them enabled by default means that any -security volnurability in them (such as CVE-2017-17090 / AST-2017-013 in -chan_skinny) may open your system to attacks for no good reason. - -Thus the following configuration files have been removed from the default -set of configuration files installed to /etc/asterisk: -* dundi.conf (DUNDi call routing, UDP port 4520) -* mgcp.conf (chan_mgcp: MGCP voip protocol, UDP port 2727) -* skinny.conf (chan_skinny: SCCP voip protocol, TCP port 2000) -* unistim.conf (chan_unistim: UNISTIM voip protocol, UDP port 5000) - -If you do need any of those protocols, copy the sample file from -/usr/share/asterisk/conf/samples/FILE.conf.sample to -/etc/asterisk/FILE.conf and restart asterisk (or the specific module). - - -Missing Documentation -===================== -AST.pdf and AST.txt cannot be included due to incompatible license. -You can get their content from http://wiki.asterisk.org . The standard -reference is included, as always in the "sample" configuration files and -in the help from the Asterisk command-line prompt. - - -DAHDI PtMP NT -============= -Short version: it doesn't work. - -This package includes an experimental patch to test the support for PtMP -NT in chan_dahdi. This is needed to e.g. connect ISDN phones. Originally -the code merely printed out "How cool would it be if someone implemented -this mode!" and bailed out. This patch merely overrides it. - -At the moment it seems to provide at least basic support of ISDN phones -(that is: of dialing out from a single ISDN phone). Likewise, on a -loopback connection you can call from a TE port to the NT port but not -vice versa. - -I figure that this would still be useful enough for some people, though. -But in any case, please see http://bugs.digium.com/view.php?id=15048 . - - -A Separate Instance -=================== -Upstream maintainers are not always so keen on helping users of binary -packages. Sometimes a source build can be handy. However a simplistic -'make install' from a source distribution may not play along nicely -with your existing packages. As a workaround for that, Asterisk includes -a script called 'live_ast' to "install" Asterisk under the build root -itself. - - # For the sake of this example, I assume you work under /home/getafisk . - # get a version of asterisk: tarball, svn, whatever - svn co http://svn.asterisk.org/svn/asterisk/trunk asterisk-svn - cd asterisk-svn - - # grab the script. It's already in 1.6.2 and trunk, but let's get the - # latest: - wget http://svn.asterisk.org/svn/asterisk/trunk/contrib/scripts/live_ast - chmod +x live_ast - ./live_ast conf-file - # edit live/live.conf . Unrem 'LIVE_AST_FOR_SYSTEM=yes' - ./live_ast configure # ./configure - ./live_ast install # make; make install DESTDIR=$PWD/live - ./live_ast samples - - # As root: - echo "DAEMON=/home/getafisk/live/asterisk" >> /etc/default/asterisk - -The last line makes your private copy the actual one to use. The magic -is in /home/getafisk/live/etc/asterisk/asterisk.conf . If you need to -update something in the source, just re-run the 'install' command. -live/asterisk is a wrapper to that private copy of Asterisk. - - -Enjoy your PBX! diff --git a/debian/README.source b/debian/README.source deleted file mode 100644 index b6c5719..0000000 --- a/debian/README.source +++ /dev/null @@ -1,44 +0,0 @@ -This package uses git-buildpackage (with pristine-tar, without a patch -queue). - -Documentation of gbp, git build package, is -at http://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.html - -You find that doc also in /usr/share/doc/git-buildpackage/manual-html/gbp.html -after installing the package git-buildpackage - -== Tests == -Tests should be run with autopkgtest. If you have a local setup. As it -needs to run an indeppendent instance of Asterisk, which may need to use -its own ports, a schroot instance will not do. - -After a build use something along the lines of: - - autopkgtest asterisk_13.13.1~dfsg-1_amd64.changes -- virt-server [whatever] - -If you want to run the tests manually: this should work. It requires -installing the packages (including asterisk-tests) you built on the -system, and from the same system, running - - ./debian/tests/asttestmods - -Note that it needs to be run as root. - -== pjproject repacking == -Upstream only supports building against their local copy of pjproject (later -installed as libasteriskpj), which is downloaded, patched and built during -the build process. Builds in Debian may not download anything during the -build, in addition parts of the pjproject source archive may not be DFSG free. - -The Debian package includes a dfsg-repacked upstream tarball in debian/, -which is generated with the command - -mk-origtargz --package pjproject --version 2.8 \ - --copyright-file copyright.pjproject \ - --compression bzip2 \ - --repack-suffix '~dfsg' \ - pjproject-2.8.tar.bz2 - -It uses a local copy of the debian/copyright file of src:pjproject as input -for deleted files. In the buildprocess the .tar.bz2 is copied into place -and the checksum regenerated. diff --git a/debian/TODO.Debian b/debian/TODO.Debian deleted file mode 100644 index 6261184..0000000 --- a/debian/TODO.Debian +++ /dev/null @@ -1,3 +0,0 @@ -* Some man pages to write. -* Get rid of the lump of code in patch mpglib. Rewrite using code from mpg123? -* Get libilbc packages instead of the built-in libilbc. diff --git a/debian/ast_config/manager.conf b/debian/ast_config/manager.conf deleted file mode 100644 index 075121f..0000000 --- a/debian/ast_config/manager.conf +++ /dev/null @@ -1,16 +0,0 @@ -; -; Asterisk Call Management support -; - -; By default asterisk will listen on localhost only. -[general] -enabled = yes -port = 5038 -bindaddr = 127.0.0.1 - -; No access is allowed by default. -; To set a password, create a file in /etc/asterisk/manager.d -; use creative permission games to allow other serivces to create their own -; files -#include "manager.d/*.conf" - diff --git a/debian/ast_config/manager.d/README.conf b/debian/ast_config/manager.d/README.conf deleted file mode 100644 index a8173aa..0000000 --- a/debian/ast_config/manager.d/README.conf +++ /dev/null @@ -1,3 +0,0 @@ -; Empty placeholder by the Debian packaging. -; You can add manager users by dropping files with a .conf extension in -; this directory. diff --git a/debian/ast_config/modules.conf b/debian/ast_config/modules.conf deleted file mode 100644 index be2a034..0000000 --- a/debian/ast_config/modules.conf +++ /dev/null @@ -1,73 +0,0 @@ -; -; Asterisk configuration file -; -; Module Loader configuration file -; - -[modules] -autoload=yes -; -; Any modules that need to be loaded before the Asterisk core has been -; initialized (just after the logger has been initialized) can be loaded -; using 'preload'. This will frequently be needed if you wish to map all -; module configuration files into Realtime storage, since the Realtime -; driver will need to be loaded before the modules using those configuration -; files are initialized. -; -; An example of loading ODBC support would be: -;preload => res_odbc.so -;preload => res_config_odbc.so -; -; If you want, load the GTK console right away. -; Don't load the KDE console since -; it's not as sophisticated right now. -; -noload => pbx_gtkconsole.so -;load => pbx_gtkconsole.so -noload => pbx_kdeconsole.so -; -; Intercom application is obsoleted by -; chan_oss. Don't load it. -; -noload => app_intercom.so -; -; The 'modem' channel driver and its subdrivers are -; obsolete, don't load them. -; -noload => chan_modem.so -noload => chan_modem_aopen.so -noload => chan_modem_bestdata.so -noload => chan_modem_i4l.so -; -; Comment this out (after installing CAPI middleware and hardware -; drivers) if you have CAPI-able hardware and wish to use it in -; Asterisk. -; -noload => chan_capi.so -; -load => res_musiconhold.so -; -; Do not load load local channel drivers (using the system speaker) by default, -; they are not used in most installations and might block the sound hardware -; -noload => chan_alsa.so -noload => chan_console.so -noload => chan_oss.so -; -; Disable CDR logging to SQLite by default since it writes unconditionally to -; cdr.db without a way to rotate it. -; -noload => cdr_sqlite.so -; -; These conflict with app_directory.so and each other. -noload => app_directory_odbc.so -; -; Enable these if you want to configure Asterisk in a database -; -noload => res_config_odbc.so -noload => res_config_pgsql.so -; -; Module names listed in "global" section will have symbols globally -; exported to modules loaded after them. -; -[global] diff --git a/debian/asterisk-config-custom b/debian/asterisk-config-custom deleted file mode 100644 index 8aeedfb..0000000 --- a/debian/asterisk-config-custom +++ /dev/null @@ -1,364 +0,0 @@ -#!/bin/sh -# -# asterisk-config-custom -# script to help creating a 'asterisk-config-custom' .deb package -# -# -# Created by: Geert Stappers -# And distributed under the terms of the GPL -# -# -acc_usage () -{ -cat << HERE - -asterisk-config-custom {command} - -Where 'command' is 'init', 'next', 'sync' or 'help' - - init: Creates directory 'my-asterisk-config' with content - - next: Provides instruction for next step - - sync: Mostly \`rsync --archive /etc/asterisk etc_asterisk\` - - help: Prints _another_ help text - -HERE -} - -acc_help () -{ -cat << HERE - -Program 'asterisk-config-custom' is for helping you making -your 'asterisk-config-custom' .deb package. - -Typical work flow is running - asterisk-config-custom init -only once. - -Now you have a directory named - my-asterisk-config -feel free to rename it -Important is that it has a debian/ directory -and an etc_asterisk/ directory - -Change working directory with - cd my-asterisk-config # or to what you renamed it. -Edit files in etc_asterisk. You may use - asterisk-config-custom sync -to get you a starting point. -Create the actual package with - dpkg-buildpackge -uc -us - -And install with - sudo dpkg -i ../asterisk-config-custom_*_all.deb - -This package will be considered as an upgrade to the default -\`asterisk-config\` package and hence that package will will be removed -upon isntalling the custom package. However, it will not be purged and -hence all configuration files in \`/etc/asterisk\` from it will remain -installed. In order to remove them, you'll need to purge the package -\`asterisk-config\'. - -Alternatively, you can install the custom package before installing -Asterisk. - -HERE -} - -acc_init () -{ -# Creates a diretory and puts files in it, -# including the Debian packaging files. - -mkdir --parents my-asterisk-config/debian/source - -cat << HERE > my-asterisk-config/README - -In this directory you can / should run - - dpkg-buildpackage -uc -us - -to get your 'asterisk-config-custom' package build. - -If you don't have this package installed, install the package dpkg-dev . - -HERE - -cat << LastLine > my-asterisk-config/Makefile -# -# Makefile -# -all: etc_asterisk/asterisk.conf \ - usr/share/doc/asterisk-config/examples/configs/modules.conf.sample - @echo "FYI: (minimal set of) configuration files are available" - -etc_asterisk/asterisk.conf: - @mkdir --parents etc_asterisk - echo "; only a place holder" > etc_asterisk/asterisk.conf - -usr/share/doc/asterisk-config/examples/configs/modules.conf.sample: - @mkdir --parents usr/share/doc/asterisk-config/examples/configs - echo "; place holder" \\ - > usr/share/doc/asterisk-config/examples/configs/modules.conf.sample - - -install: - install --directory \$(DESTDIR)/usr - install --directory \$(DESTDIR)/etc/asterisk - rsync --archive --delete usr/* \$(DESTDIR)/usr - rsync --archive --delete etc_asterisk/* \$(DESTDIR)/etc/asterisk - -# l l -LastLine - -cat << LastLine > my-asterisk-config/acc.config -# This file will be read during \`asterisk-config-custom sync\` -# -ACC_SYNC_CONFIG_EXAMPLES=Yes -# another value as 'Yes' wouldn't sync the configuration examples -# -# -# l l -LastLine - -##-------------------------------------------- - -# Those who are familiar with Debian packaging -# can consider the rest of this function as a dedicated `dh_make`. - -cat << LastLine > my-asterisk-config/debian/control -Source: asterisk-config-custom -Section: comm -Priority: optional -Maintainer: Me Myself <${LOGNAME}@$( hostname --fqdn )> -Build-Depends: debhelper (>= 9) -Standards-Version: 3.9.5 -Homepage: -#Vcs-Git: git://anonscm.debian.org/collab-maint/asterisk-config-custom.git -#Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/asterisk-config-custom.git;a=summary - -Package: asterisk-config-custom -Architecture: all -Depends: \${misc:Depends} -Recommends: asterisk -Conflicts: asterisk-config -Replaces: asterisk-config -Description: Custom configuration files for Asterisk - Package that contains custom configuration files for Asterisk. - . - It is to keep _your_ config files while upgrading Asterisk. - . - The trick is that Asterisk depends - on asterisk-config OR asterisk-config-custom -LastLine - -cat << LastLine > my-asterisk-config/debian/changelog -asterisk-config-custom (0.6) unstable; urgency=medium - - * Created with \`asterisk-config-custom init\` - - -- Me Myself <${LOGNAME}@$( hostname --fqdn )> $( date --rfc-2822 ) - -asterisk-config-custom (0.4) unstable; urgency=low - - * Initial release (Closes: #760032). - - -- Geert Stappers Fri, 29 Aug 2014 16:25:44 +0200 -LastLine - -cat << LastLine > my-asterisk-config/debian/copyright -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: asterisk-config-custom -Source: - -Files: * -Copyright: - -License: - - - . - -LastLine - -cat << LastLine > my-asterisk-config/debian/rules -#!/usr/bin/make -f -# See debhelper(7) -# -# output every command that modifies files on the build system. -#DH_VERBOSE = 1 - -# main packaging script based on dh7 syntax -%: - dh \$@ - -# l l -LastLine -chmod a+x my-asterisk-config/debian/rules - -cat << LastLine > my-asterisk-config/debian/preinst -#! /bin/sh -# preinst script -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * \`install' -# * \`install' -# * \`upgrade' -# * \`abort-upgrade' -# -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - -case "\$1" in - install|upgrade) - # chan_modem was removed on 1.4+ - ;; - - abort-upgrade) - ;; - - *) - echo "preinst called with unknown argument \\\`\$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 -LastLine - -cat << LastLine > my-asterisk-config/debian/postinst -#! /bin/sh - -set -e - -# summary of how this script can be called: -# * \`configure' -# * \`abort-upgrade' -# * \`abort-remove' \`in-favour' -# -# * \`abort-deconfigure' \`in-favour' -# \`removing' -# - -case "\$1" in - configure) - set +e # ignore errors temporarily - - # find conffiles under /etc/asterisk belonging to asterisk-config-custom - # and chown them to user asterisk. - dpkg-query -W -f='\${Conffiles}\n' asterisk-config-custom 2>/dev/null | \\ - sed -nr -e 's; (/etc/asterisk/.*) [0-9a-f]*;\1;p' | \\ - while read conffile; do - chown asterisk: \${conffile} 2>/dev/null - done - - # handle them in the end with a glob since it's way faster - dpkg-statoverride --quiet --list '/etc/asterisk/*' | while read STAT; do - chown \`echo \$STAT | cut -d' ' -f 1,2,4 | sed 's/ /:/'\` \\ - 2>/dev/null - done - - set -e - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \\\`\$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 - -LastLine - -cat << LastLine > my-asterisk-config/debian/lintian-overrides -asterisk-config-custom: non-standard-file-perm -LastLine - -echo 9 > my-asterisk-config/debian/compat - -echo '3.0 (native)' > my-asterisk-config/debian/source/format - -} - -acc_sync () -{ - mkdir --parents etc_asterisk - # assuming there are files in /etc/asterisk/ - rsync --archive --delete /etc/asterisk/* etc_asterisk/ - if [ -r ./acc.config ] ; then - . ./acc.config - else - echo 'E: file "./acc.config" not readable' - echo "I: Are you in the directory that \`${0} init\` created?" - exit 1 - fi - if [ x${ACC_SYNC_CONFIG_EXAMPLES} = xYes ] ; then - ACC_EX=usr/share/doc/asterisk-config/examples - # using asterisk-config directory - mkdir --parents ${ACC_EX} - rsync --archive --delete /${ACC_EX}/* ${ACC_EX} - fi -} - -acc_next () -{ - if ! which dpkg-buildpackage > /dev/null ; then - echo 'E: Program `dpkg-buildpackage` is not installed.' - echo 'I: It is in the Debian package `dpkg-dev`.' - echo 'I: Installing it with `apt-get install build-essential`,' - echo 'I: will also install the program `make` that is also needed.' - exit 1 - fi - if grep --quiet 'Package: asterisk-config-custom' debian/control ; then - echo 'dpkg-buildpackage -uc -us # Running this now' - dpkg-buildpackage -uc -us - else - echo 'E: debian/control file for package asterisk-config-custom not found' - echo "I: Are you in the directory that \`${0} init\` created?" - exit 1 - fi -} - - -# main() - -case $1 in -init) - acc_init - ;; -next) - acc_next - ;; -sync) - acc_sync - ;; -help) - acc_help - ;; -*) - acc_usage - ;; -esac - -# l l diff --git a/debian/asterisk-config-custom.1 b/debian/asterisk-config-custom.1 deleted file mode 100644 index 3bd9572..0000000 --- a/debian/asterisk-config-custom.1 +++ /dev/null @@ -1,74 +0,0 @@ -.TH asterisk-config-custom 1 "2014-12-14" "Asterisk" "Debian Manual" -.SH NAME -.B asterisk\-config\-custom -\(em for helping you making your 'asterisk\-config\-custom' .deb package -.SH SYNOPSIS -.PP -.B asterisk\-config\-custom -.I { command } - -.SH DESCRIPTION -.B asterisk\-config\-custom -prints a help text when no -.I command -is given. And another help text when command -.I help -is given. - -.SH WORKFLOW - -Recommented usage workflow is described in the actual script. -Get the instructions with -.B asterisk\-config\-custom help -. - -.SH FILES -.B my\-asterisk\-config/ -.RS -Created during -.I asterisk\-config\-custom init -.RE - -.B my\-asterisk\-config/etc_asterisk/ -.RS -Location where you put asterisk configuration files -you want to get in -.I /etc/asterisk/ - -You may use -.I asterisk\-config\-custom sync -to get it updated with current configuration. -.RE - -.B my\-asterisk\-config/debian/ -.RS -Debian packaging files. -You may leave it default. -You may change it. - -Example given of what to change: version number in -.I debian/changelog -.RE - -.SH BUGS -Maybe should script -.I asterisk\-config\-custom -have been named into something longer like -.I asterisk\-config\-custom\-dh\-make -. -Where suffix -.I dh\-make -comes from debhelper make. -The software tool that converts source archives into Debian package source - -.SH SEE ALSO -debchange(1) for information on changing the version mumber. - -.SH "AUTHOR" -This manual page was written by Geert Stappers -Permission is granted to copy, distribute and/or modify this document under -the terms of the GNU General Public License, Version 2 any -later version published by the Free Software Foundation. - -On Debian systems, the complete text of the GNU General Public -License can be found in /usr/share/common\-licenses/GPL\-2. diff --git a/debian/asterisk-config.dirs b/debian/asterisk-config.dirs deleted file mode 100644 index f1f10fb..0000000 --- a/debian/asterisk-config.dirs +++ /dev/null @@ -1 +0,0 @@ -etc/asterisk/manager.d diff --git a/debian/asterisk-config.examples b/debian/asterisk-config.examples deleted file mode 100644 index e49192d..0000000 --- a/debian/asterisk-config.examples +++ /dev/null @@ -1,5 +0,0 @@ -configs -agi/agi-test.agi -agi/eagi-test.c -agi/eagi-sphinx-test.c -agi/fastagi-test diff --git a/debian/asterisk-config.install b/debian/asterisk-config.install deleted file mode 100644 index e0a5f84..0000000 --- a/debian/asterisk-config.install +++ /dev/null @@ -1,2 +0,0 @@ -etc/asterisk -../ast_config/* etc/asterisk/ diff --git a/debian/asterisk-config.lintian-overrides b/debian/asterisk-config.lintian-overrides deleted file mode 100644 index b88af68..0000000 --- a/debian/asterisk-config.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -asterisk-config: non-standard-file-perm diff --git a/debian/asterisk-config.postinst b/debian/asterisk-config.postinst deleted file mode 100644 index 55f83ec..0000000 --- a/debian/asterisk-config.postinst +++ /dev/null @@ -1,51 +0,0 @@ -#! /bin/sh - -set -e - -# summary of how this script can be called: -# * `configure' -# * `abort-upgrade' -# * `abort-remove' `in-favour' -# -# * `abort-deconfigure' `in-favour' -# `removing' -# - -case "$1" in - configure) - set +e # ignore errors temporarily - - # find conffiles under /etc/asterisk belonging to asterisk-config - # and chown them to user asterisk. - dpkg-query -W -f='${Conffiles}\n' asterisk-config 2>/dev/null | \ - sed -nr -e 's; (/etc/asterisk/.*) [0-9a-f]*;\1;p' | \ - while read conffile; do - chown asterisk: ${conffile} 2>/dev/null - done - - # handle them in the end with a glob since it's way faster - dpkg-statoverride --quiet --list '/etc/asterisk/*' | while read STAT; do - chown `echo $STAT | cut -d' ' -f 1,2,4 | sed 's/ /:/'` \ - 2>/dev/null - done - - set -e - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 - - diff --git a/debian/asterisk-config.preinst b/debian/asterisk-config.preinst deleted file mode 100644 index b444b53..0000000 --- a/debian/asterisk-config.preinst +++ /dev/null @@ -1,59 +0,0 @@ -#! /bin/sh -# preinst script -# -# see: dh_installdeb(1) - -set -e - -# summary of how this script can be called: -# * `install' -# * `install' -# * `upgrade' -# * `abort-upgrade' -# -# for details, see http://www.debian.org/doc/debian-policy/ or -# the debian-policy package - - -# Remove a no-longer used conffile -rm_conffile() { - PKGNAME="$1" - CONFFILE="$2" - - if [ -e "$CONFFILE" ]; then - md5sum="`md5sum \"$CONFFILE\" | sed -e \"s/ .*//\"`" - old_md5sum="`dpkg-query -W -f='${Conffiles}' $PKGNAME | sed -n -e \"\\\\' $CONFFILE'{s/ obsolete$//;s/.* //p}\"`" - if [ "$md5sum" != "$old_md5sum" ]; then - echo "Obsolete conffile $CONFFILE has been modified by you." - echo "Saving as $CONFFILE.dpkg-bak ..." - mv -f "$CONFFILE" "$CONFFILE".dpkg-bak - else - echo "Removing obsolete conffile $CONFFILE ..." - rm -f "$CONFFILE" - fi - fi -} - -case "$1" in - install|upgrade) - # chan_modem was removed on 1.4+ - if dpkg --compare-versions "$2" lt "1:1.4.0-1~"; then - rm_conffile asterisk-config "/etc/asterisk/modem.conf" - fi - ;; - - abort-upgrade) - ;; - - *) - echo "preinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 diff --git a/debian/asterisk-dahdi.install b/debian/asterisk-dahdi.install deleted file mode 100644 index 2ac1228..0000000 --- a/debian/asterisk-dahdi.install +++ /dev/null @@ -1,5 +0,0 @@ -usr/lib/asterisk/modules/app_flash.so -usr/lib/asterisk/modules/app_dahdiras.so -usr/lib/asterisk/modules/chan_dahdi.so -usr/lib/asterisk/modules/codec_dahdi.so -usr/lib/asterisk/modules/res_timing_dahdi.so diff --git a/debian/asterisk-dev.install b/debian/asterisk-dev.install deleted file mode 100644 index 76980be..0000000 --- a/debian/asterisk-dev.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/include/asterisk -../../include/asterisk.h usr/include/asterisk diff --git a/debian/asterisk-dev.links b/debian/asterisk-dev.links deleted file mode 100644 index 4305f66..0000000 --- a/debian/asterisk-dev.links +++ /dev/null @@ -1 +0,0 @@ -usr/include/asterisk/asterisk.h usr/include/asterisk.h diff --git a/debian/asterisk-doc.docs b/debian/asterisk-doc.docs deleted file mode 100644 index 411ef28..0000000 --- a/debian/asterisk-doc.docs +++ /dev/null @@ -1,11 +0,0 @@ -BUGS -README* -CREDITS -CHANGES -UPGRADE* -Zaptel-to-DAHDI.txt -doc/*.txt -doc/*.pdf -configs -contrib/ast-db-manage/ -contrib/realtime/ diff --git a/debian/asterisk-mobile.install b/debian/asterisk-mobile.install deleted file mode 100644 index df44d42..0000000 --- a/debian/asterisk-mobile.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/chan_mobile.so diff --git a/debian/asterisk-modules.install b/debian/asterisk-modules.install deleted file mode 100644 index ea79c76..0000000 --- a/debian/asterisk-modules.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk diff --git a/debian/asterisk-modules.lintian-overrides b/debian/asterisk-modules.lintian-overrides deleted file mode 100644 index bfc587d..0000000 --- a/debian/asterisk-modules.lintian-overrides +++ /dev/null @@ -1,3 +0,0 @@ -# Plugins -asterisk-modules binary: library-not-linked-against-libc usr/lib/asterisk/modules/* -asterisk-modules binary: shared-lib-without-dependency-information usr/lib/asterisk/modules/* diff --git a/debian/asterisk-mp3.install b/debian/asterisk-mp3.install deleted file mode 100644 index 14ee64b..0000000 --- a/debian/asterisk-mp3.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/format_mp3.so diff --git a/debian/asterisk-mysql.install b/debian/asterisk-mysql.install deleted file mode 100644 index ad36b4c..0000000 --- a/debian/asterisk-mysql.install +++ /dev/null @@ -1,3 +0,0 @@ -usr/lib/asterisk/modules/app_mysql.so -usr/lib/asterisk/modules/cdr_mysql.so -usr/lib/asterisk/modules/res_config_mysql.so diff --git a/debian/asterisk-ooh323.install b/debian/asterisk-ooh323.install deleted file mode 100644 index 8859048..0000000 --- a/debian/asterisk-ooh323.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/chan_ooh323.so diff --git a/debian/asterisk-tests.install b/debian/asterisk-tests.install deleted file mode 100644 index ffe4e15..0000000 --- a/debian/asterisk-tests.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/lib/asterisk/modules/test_*.so - diff --git a/debian/asterisk-tests.lintian-overrides b/debian/asterisk-tests.lintian-overrides deleted file mode 100644 index c6ce7bb..0000000 --- a/debian/asterisk-tests.lintian-overrides +++ /dev/null @@ -1,2 +0,0 @@ -# Plugins -asterisk-tests binary: shared-lib-without-dependency-information usr/lib/asterisk/modules/* diff --git a/debian/asterisk-voicemail-imapstorage.install b/debian/asterisk-voicemail-imapstorage.install deleted file mode 100644 index 75d7e62..0000000 --- a/debian/asterisk-voicemail-imapstorage.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/app_voicemail_imapstorage.so diff --git a/debian/asterisk-voicemail-odbcstorage.install b/debian/asterisk-voicemail-odbcstorage.install deleted file mode 100644 index 0286d9e..0000000 --- a/debian/asterisk-voicemail-odbcstorage.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/app_voicemail_odbcstorage.so diff --git a/debian/asterisk-voicemail.install b/debian/asterisk-voicemail.install deleted file mode 100644 index 3157b24..0000000 --- a/debian/asterisk-voicemail.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/app_voicemail.so diff --git a/debian/asterisk-vpb.install b/debian/asterisk-vpb.install deleted file mode 100644 index 71122fa..0000000 --- a/debian/asterisk-vpb.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/asterisk/modules/chan_vpb.so diff --git a/debian/asterisk.default b/debian/asterisk.default deleted file mode 100644 index e77d538..0000000 --- a/debian/asterisk.default +++ /dev/null @@ -1,72 +0,0 @@ -# This file allows you to alter the configuration of the Asterisk -# init.d script. Normally you should leave the file as-is. -# -# RUNASTERISK: If set to anything other that 'yes', the asterisk init.d script -# will not run. The default is 'yes'. -#RUNASTERISK=no -# -# -# AST_REALTIME: if set to anything other than "no", asterisk will run in -# real-time priority (pass '-p' to asterisk). un-rem the -# following line to disable asterisk from running in real-time -# priority. The default is 'yes'. -#AST_REALTIME=no -# -# PARAMS: extra parameters to pass to asterisk: generate cores in -# case of crash, and be more verbose. -F guarantees that Asterisk -# will still run daemonized. -# -# Instead of adding switches here, consider editing -# /etc/asterisk/asterisk.conf -#PARAMS="-F -g -vvv" -# -# -# RUNASTSAFE: run safe_asterisk rather than asterisk (will auto-restart upon -# crash). This is generally less tested and has some known issues -# with properly starting and stopping Asterisk. -#RUNASTSAFE=yes -# -# MAXFILES: Set this to the number of open file handles the Asterisk -# process can have. Useful if you get "Too many open files" error. -#MAXFILES=8192 -# -# AST_DUMPCORE: if set to anything other than "no", asterisk will be run with -# the option -g (to tell it to dump core on crash) and its -# working directory will be set to /var/spool/asterisk, as that -# directory is writable and hence core files can be written there. -# See /etc/init.d/asterisk for some other relevant variables. -# -# It is recommended that you install asterisk-dbg to be able -# to produce meaningful backtraces from the core file. -# -# By default core files will be written to /tmp (can be -# changed by setting AST_DUMPCORE_DIR). Alternatively, see -# CORE_PATTERN below. -#AST_DUMPCORE=yes -# -# AST_DUMPCORE_DIR: By default asterisk runs in the directory '/' like any -# daemon. Setting this allows you to tell it to tell the -# Asterisk daemon to run in a different directory if -# AST_DUMPCORE is enabled. The default is -# /var/spool/asterisk. That is a good choice because it -# is writable (thus enabling the actual writing of the -# core file) but relatively immune to symlink attacks -# (because not world-writable like /tmp/). -# Note, however, that if CORE_PATTERN is an absolute -# path, it will override AST_DUMPCORE_DIR. -# -# CORE_PATTERN: If you use AST_DUMPCORE above, this is optionally set to a -# pattern of the core file. The default is not to touch the -# core_pattern settings, which is generally a good idea as -# it affects every core file generated on your system. -# -# However if you just enable generation of core files and run -# asterisk as a daemon it will fail to write core files. -# -# Alternatively you can set this independently elsewhere. -# See http://lxr.linux.no/source/Documentation/sysctl/kernel.txt -# Here is what Asterisk's ast_grab_core -# script would expect: -#CORE_PATTERN='core.%p' -# But you might prefer something like: -#CORE_PATTERN='core.%e.%t' diff --git a/debian/asterisk.dirs b/debian/asterisk.dirs deleted file mode 100644 index fd29578..0000000 --- a/debian/asterisk.dirs +++ /dev/null @@ -1,22 +0,0 @@ -etc/asterisk - -usr/share/asterisk -var/log/asterisk -var/spool/asterisk -var/lib/asterisk - -usr/share/asterisk/static-http -usr/share/asterisk/agi-bin - -var/lib/asterisk/moh -var/lib/asterisk/sounds/custom -var/lib/asterisk/priv-callerintros -var/log/asterisk/cdr-csv -var/log/asterisk/cdr-custom -var/spool/asterisk/dictate -var/spool/asterisk/meetme -var/spool/asterisk/monitor -var/spool/asterisk/system -var/spool/asterisk/tmp -var/spool/asterisk/voicemail -var/spool/asterisk/outgoing diff --git a/debian/asterisk.docs b/debian/asterisk.docs deleted file mode 100644 index 018e573..0000000 --- a/debian/asterisk.docs +++ /dev/null @@ -1,6 +0,0 @@ -BUGS -README* -CREDITS -CHANGES -UPGRADE* -menuselect.makeopts diff --git a/debian/asterisk.examples b/debian/asterisk.examples deleted file mode 100644 index 875e623..0000000 --- a/debian/asterisk.examples +++ /dev/null @@ -1,4 +0,0 @@ -sample.call -contrib/scripts/vmail.cgi -debian/asterisk.startup.conf -contrib/scripts/asterisk_cleanup diff --git a/debian/asterisk.init b/debian/asterisk.init deleted file mode 100644 index a929190..0000000 --- a/debian/asterisk.init +++ /dev/null @@ -1,224 +0,0 @@ -#!/bin/sh -# -# asterisk start the asterisk PBX -# (c) Mark Purcell -# (c) Tzafrir Cohen -# (c) Faidon Liambotis -# -# This package is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -### BEGIN INIT INFO -# Provides: asterisk -# Required-Start: $remote_fs -# Required-Stop: $remote_fs -# Should-Start: $syslog $network $named mysql postgresql dahdi -# Should-Stop: $syslog $network $named mysql postgresql -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Asterisk PBX -# Description: Controls the Asterisk PBX -### END INIT INFO - -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -NAME=asterisk -USER=$NAME -GROUP=$USER -DAEMON=/usr/sbin/$NAME -CANARY=/usr/sbin/astcanary -DESC="Asterisk PBX" -PIDFILE="/var/run/asterisk/asterisk.pid" -ASTSAFE_PIDFILE="/var/run/asterisk/asterisk_safe.pid" -UMASK=007 # by default -#MAXFILES=1024 # (the system default) - -. /lib/lsb/init-functions - -# by default: use real-time priority -PARAMS="" -CHDIR_PARM="" -AST_REALTIME="yes" -RUNASTERISK="yes" -AST_DUMPCORE="no" -AST_DUMPCORE_DIR="/var/spool/asterisk" # only used if AST_DUMPCORE != no -# core_pattern. See: http://lxr.linux.no/source/Documentation/sysctl/kernel.txt -#CORE_PATTERN= -if [ -r /etc/default/$NAME ]; then . /etc/default/$NAME; fi - -if [ "$RUNASTERISK" != "yes" ];then - echo "Asterisk not yet configured. Edit /etc/default/asterisk first." - exit 0 -fi - -if [ "$AST_REALTIME" != "no" ] -then - PARAMS="$PARAMS -p" -fi - -if [ "$AST_DUMPCORE" != "no" ] -then - PARAMS="$PARAMS -g" - if [ "$CORE_PATTERN" != '' ] - then - echo "$CORE_PATTERN" >/proc/sys/kernel/core_pattern - fi - if [ -d "$AST_DUMPCORE_DIR" ] - then - CHDIR_PARM="--chdir $AST_DUMPCORE_DIR" - fi -fi - -if [ "x$USER" = "x" ] -then - echo "Error: empty USER name" - exit 1 -fi -if [ `id -u "$USER"` = 0 ] -then - echo "Starting as root not supported." - exit 1 -fi -PARAMS="$PARAMS -U $USER" - -if [ "x$AST_DEBUG_PARAMS" = x ] -then - AST_DEBUG_PARAMS=-cvvvvvddddd -fi -if [ "$RUNASTSAFE" = "yes" ];then - # The value of WRAPPER_DAEMON in can be set in /etc/default/asterisk - WRAPPER_DAEMON=${WRAPPER_DAEMON:-/usr/sbin/safe_asterisk} - REALDAEMON="$WRAPPER_DAEMON" -else - REALDAEMON="$DAEMON" -fi - -test -x $DAEMON || exit 0 - -for dir in /var/run/asterisk /var/log/asterisk /var/log/asterisk/cdr-csv /var/log/asterisk/cdr-custom; do - [ -d $dir ] || install -d -o $USER -g $GROUP $dir - [ -x /sbin/restorecon ] && /sbin/restorecon $dir -done - -set -e - -if [ "$UMASK" != '' ] -then - umask $UMASK -fi - -# allow changing the per-process open files limit: -if [ "$MAXFILES" != '' ] -then - ulimit -n $MAXFILES -fi - -status() { - status_of_proc -p "$PIDFILE" "$NAME" "$DESC" && return 0 || return $? -} - -safe_status() { - status_of_proc -p "$ASTSAFE_PIDFILE" "$NAME" "$DESC" && return 0 || return $? -} - -asterisk_rx() { - if ! status >/dev/null; then return 0; fi - - # if $HOME is set, asterisk -rx writes a .asterisk_history there - ( - unset HOME - $DAEMON -rx "$1" - ) -} - -case "$1" in - debug) - # we add too many special parameters that I don't want to skip - # accidentally. I'm afraid that skipping -U once may cause - # confusing results. I also want to maintain the user's choice - # of -p - echo "Debugging $DESC: " - $DAEMON $PARAMS $AST_DEBUG_PARAMS - exit 0 - ;; - start) - if [ "$RUNASTSAFE" = "yes" ];then - if safe_status >/dev/null; then - echo "$DESC is already running. Use restart." - exit 0 - fi - echo -n "Starting $DESC: " - export ASTSAFE_FOREGROUND=1 - start-stop-daemon --start --group $GROUP \ - --background --make-pidfile \ - $CHDIR_PARM --pidfile "$ASTSAFE_PIDFILE" \ - --exec $REALDAEMON -- $PARAMS - else - if status >/dev/null; then - echo "$DESC is already running. Use restart." - exit 0 - fi - echo -n "Starting $DESC: " - start-stop-daemon --start --group $GROUP --pidfile "$PIDFILE" \ - $CHDIR_PARM \ - --exec $REALDAEMON -- $PARAMS > /dev/null - fi - echo "$NAME." - ;; - stop) - echo -n "Stopping $DESC: $NAME" - # Try gracefully. - # This may hang in some cases. Specifically, when the asterisk - # processes is stopped. No bother to worry about cleanup: - # it will either fail or die when asterisk dies. - ( asterisk_rx 'core stop now' > /dev/null 2>&1 & ) & - if [ "$RUNASTSAFE" = "yes" ];then - # If you're switching back and forth between RUNASTSAFE - # you may get a warning about a stale pidfile. Ignore - # it. - start-stop-daemon --stop --quiet --oknodo \ - --pidfile $ASTSAFE_PIDFILE - rm -f $ASTSAFE_PIDFILE - fi - # Sometimes during a quick restart cycle, the 'core stop now' - # from above won't reach the daemon -- perhaps it wasn't - # listening yet. At this point we want TERM to kick in. - # In any case, we must be certain that it is stopped before we - # exit the "stop" case; otherwise a "restart" might complete - # with no asterisk running at all (because of the status checks - # in "start"). - start-stop-daemon --stop --quiet --oknodo --retry=8/TERM/30/KILL/5 \ - --exec $DAEMON --pidfile=$PIDFILE - echo "." - ;; - reload) - echo "Reloading $DESC configuration files." - asterisk_rx 'module reload' - ;; - logger-reload) - asterisk_rx 'logger reload' - ;; - extensions-reload|dialplan-reload) - echo "Reloading $DESC configuration files." - asterisk_rx 'dialplan reload' - ;; - restart-convenient) - asterisk_rx 'core restart when convenient' - ;; - restart|force-reload) - $0 stop - $0 start - ;; - status) - status - exit $? - ;; - *) - N=/etc/init.d/$NAME - echo "Usage: $N {start|stop|restart|reload|status|debug|logger-reload|extensions-reload|restart-convenient|force-reload}" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/debian/asterisk.install b/debian/asterisk.install deleted file mode 100644 index 3526c17..0000000 --- a/debian/asterisk.install +++ /dev/null @@ -1,10 +0,0 @@ -usr/sbin -usr/bin/asterisk-config-custom -usr/lib/libasterisk* -usr/share/asterisk/firmware -usr/share/asterisk/keys -usr/share/asterisk/conf -usr/share/asterisk/documentation -usr/share/asterisk/rest-api -usr/share/dahdi/span_config.d/50-asterisk -lib/systemd/system/asterisk.service diff --git a/debian/asterisk.links b/debian/asterisk.links deleted file mode 100644 index d0ae099..0000000 --- a/debian/asterisk.links +++ /dev/null @@ -1,4 +0,0 @@ -usr/share/man/man8/asterisk.8 usr/share/man/man8/rasterisk.8 -usr/local/share/asterisk/sounds usr/share/asterisk/sounds/custom -var/lib/asterisk/sounds/custom usr/share/asterisk/sounds/recordings -var/lib/asterisk/priv-callerintros usr/share/asterisk/sounds/priv-callerintros diff --git a/debian/asterisk.lintian-overrides b/debian/asterisk.lintian-overrides deleted file mode 100644 index 56c3aeb..0000000 --- a/debian/asterisk.lintian-overrides +++ /dev/null @@ -1,6 +0,0 @@ -asterisk: package-contains-empty-directory -# astcanary is not supposed to be invoked manually -asterisk: binary-without-manpage usr/sbin/astcanary -# private copy of pjproject -asterisk: package-name-doesnt-match-sonames libasteriskpj2 -asterisk: non-dev-pkg-with-shlib-symlink usr/lib/libasteriskpj.so.2 usr/lib/libasteriskpj.so diff --git a/debian/asterisk.logrotate b/debian/asterisk.logrotate deleted file mode 100644 index 1ee3612..0000000 --- a/debian/asterisk.logrotate +++ /dev/null @@ -1,9 +0,0 @@ -/var/log/asterisk/debug /var/log/asterisk/messages /var/log/asterisk/full /var/log/asterisk/*_log { - weekly - missingok - rotate 4 - sharedscripts - postrotate - /usr/sbin/invoke-rc.d asterisk logger-reload > /dev/null 2> /dev/null - endscript -} diff --git a/debian/asterisk.manpages b/debian/asterisk.manpages deleted file mode 100644 index 4ee9a69..0000000 --- a/debian/asterisk.manpages +++ /dev/null @@ -1,4 +0,0 @@ -utils/*.1 -doc/*.8 -contrib/scripts/*.8 -debian/asterisk-config-custom.1 diff --git a/debian/asterisk.postinst b/debian/asterisk.postinst deleted file mode 100644 index a2a6dc0..0000000 --- a/debian/asterisk.postinst +++ /dev/null @@ -1,111 +0,0 @@ -#! /bin/sh - -set -e - -# summary of how this script can be called: -# * `configure' -# * `abort-upgrade' -# * `abort-remove' `in-favour' -# -# * `abort-deconfigure' `in-favour' -# `removing' -# - -case "$1" in - configure) - # add asterisk user - if ! getent passwd asterisk > /dev/null ; then - echo 'Adding system user for Asterisk' 1>&2 - adduser --system --group --quiet \ - --home /var/lib/asterisk \ - --no-create-home --disabled-login \ - --gecos "Asterisk PBX daemon" \ - asterisk - fi - - # add asterisk to required groups - for group in dialout audio; do - if groups asterisk | grep -w -q -v $group; then - adduser asterisk $group - fi - done - - # chown asterisk on all $dirs and their subdirectories - # do not harm the files, they should be empty on new installations - # and we don't want to mess-up anything on old installations - find /var/log/asterisk \ - /var/lib/asterisk \ - -type d | while read dir; do - if ! dpkg-statoverride --list "$dir" > /dev/null ; then - chown asterisk: "$dir" - fi - done - - # this is not needed for new installations but is not such a bad idea - # removing this will _break_ upgrades from versions < 1:1.4.10.1~dfsg-1 - # - # we are doing the same for subdirectories, since we are not shipping - # any and it's supposed to be user-modifiable - if ! dpkg-statoverride --list "/etc/asterisk" > /dev/null ; then - chown asterisk: /etc/asterisk - fi - - # spool holds some sensitive information (e.g. monitor, voicemail etc.) - find /var/spool/asterisk -type d | while read dir; do - if ! dpkg-statoverride --list "$dir" > /dev/null ; then - chown asterisk: "$dir" - chmod 750 "$dir" - fi - done - - # Create /usr/local directory; policy 9.1.2 - if [ ! -e /usr/local/share/asterisk/sounds ]; then - if mkdir -p /usr/local/share/asterisk/sounds 2>/dev/null ; then - chown root:staff /usr/local/share/asterisk/sounds - chmod 2775 /usr/local/share/asterisk/sounds - fi - fi - - ### this is done here in case asterisk-config was installed/upgraded first - - set +e # ignore errors temporarily - - # find the name of the package providing config; either asterisk-config - # or a package providing asterisk-config-custom - ASTERISK_CONFIG=`dpkg-query -W -f='${Package}\t${Provides}\n' | \ - sed -nr 's/(.*)\tasterisk-config-custom|(asterisk-config)(\t.*)?/\1\2/p'` - - # find conffiles under /etc/asterisk belonging to asterisk-config - # and chown them to user asterisk. - dpkg-query -W -f='${Conffiles}\n' $ASTERISK_CONFIG 2>/dev/null | \ - sed -nr -e 's; (/etc/asterisk/.*) [0-9a-f]*;\1;p' | \ - while read conffile; do - chown asterisk: "$conffile" 2>/dev/null - done - - # handle them in the end with a glob since it's way faster - dpkg-statoverride --quiet --list '/etc/asterisk/*' | while read STAT; do - chown `echo $STAT | cut -d' ' -f 1,2,4 | sed 's/ /:/'` \ - 2>/dev/null - done - - set -e - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -# dh_installdeb will replace this with shell code automatically -# generated by other debhelper scripts. - -#DEBHELPER# - -exit 0 - - diff --git a/debian/asterisk.postrm b/debian/asterisk.postrm deleted file mode 100644 index b6359ad..0000000 --- a/debian/asterisk.postrm +++ /dev/null @@ -1,11 +0,0 @@ -#! /bin/sh - -set -e - -if [ "$1" = purge ]; then - userdel -r asterisk 2>/dev/null || true - rm -fR /var/log/asterisk - -fi - -#DEBHELPER# diff --git a/debian/asterisk.prerm b/debian/asterisk.prerm deleted file mode 100644 index 0ab58c4..0000000 --- a/debian/asterisk.prerm +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh - -set -e - -rmdir /usr/local/share/asterisk/sounds 2>/dev/null || true -rmdir /usr/local/share/asterisk 2>/dev/null || true - -#DEBHELPER# diff --git a/debian/asterisk.startup.conf b/debian/asterisk.startup.conf deleted file mode 100644 index 00fecd8..0000000 --- a/debian/asterisk.startup.conf +++ /dev/null @@ -1,44 +0,0 @@ -# asterisk -# -# Upstart control file for the Asterisk PBX -# -# To install, rename this file to 'asterisk' and copy it to /etc/event.d/ -# On Debian: copy to /etc/init/ -# -# To start asterisk manually: -# sudo start asterisk -# -# To stop asterisk manually: -# sudo stop asterisk -# -# Asterisk is started with an "interactive console", though redirected -# to/from /dev/null . The concept of a main console is bad. OTOH, the main -# process should not detach from the console if we work with upstart and -# alike. -# -# The username 'asterisk' is currently hardwired here, and likewise the -# varrundir. -# - -description "Asterisk PBX" -#version "1.6.3" - -start on runlevel [2345] -stop on runlevel [!2345] - -pre-start script - # Since Ubuntu clears /var/run on reboot, create this before we try to start - if [ ! -d /var/run/asterisk ]; then - mkdir -p asterisk /var/run/asterisk - chown asterisk: /var/run/asterisk - fi -end script - -#console output -respawn -exec /usr/sbin/asterisk -U asterisk -g -f - -post-stop script - # Might as well clean up after ourselves, too. - rm -rf /var/run/asterisk -end script diff --git a/debian/astgenkey.8 b/debian/astgenkey.8 deleted file mode 100644 index f7aa409..0000000 --- a/debian/astgenkey.8 +++ /dev/null @@ -1,129 +0,0 @@ -.\" $Header: /aolnet/dev/src/CVS/sgml/docbook-to-man/cmd/docbook-to-man.sh,v 1.1.1.1 1998/11/13 21:31:59 db3l Exp $ -.\" -.\" transcript compatibility for postscript use. -.\" -.\" synopsis: .P! -.\" -.de P! -.fl -\!!1 setgray -.fl -\\&.\" -.fl -\!!0 setgray -.fl \" force out current output buffer -\!!save /psv exch def currentpoint translate 0 0 moveto -\!!/showpage{}def -.fl \" prolog -.sy sed \-e 's/^/!/' \\$1\" bring in postscript file -\!!psv restore -. -.de pF -.ie \\*(f1 .ds f1 \\n(.f -.el .ie \\*(f2 .ds f2 \\n(.f -.el .ie \\*(f3 .ds f3 \\n(.f -.el .ie \\*(f4 .ds f4 \\n(.f -.el .tm ? font overflow -.ft \\$1 -.. -.de fP -.ie !\\*(f4 \{\ -. ft \\*(f4 -. ds f4\" -' br \} -.el .ie !\\*(f3 \{\ -. ft \\*(f3 -. ds f3\" -' br \} -.el .ie !\\*(f2 \{\ -. ft \\*(f2 -. ds f2\" -' br \} -.el .ie !\\*(f1 \{\ -. ft \\*(f1 -. ds f1\" -' br \} -.el .tm ? font underflow -.. -.ds f1\" -.ds f2\" -.ds f3\" -.ds f4\" -'\" t -.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n -.TH ASTGENKEY 8 "May 14th, 2005" "Asterisk" "Linux Programmer's Manual" -.SH NAME -.B astgenkey --- generates keys for for Asterisk IAX2 RSA authentication -.SH SYNOPSIS -.PP -.B astgenkey -[ -q ] [ -n ] [ \fIkeyname\fP ] - -.SH DESCRIPTION -.B genzaptelconf -This script generates an RSA private and public key pair in PEM format -for use by Asterisk. The private key should be kept a secret, as it can -be used to fake your system's identity. Thus by default (without the -option -.I -n -) the script will create a passphrase-encrypted copy of your secret key: -without entering the passphrase you won't be able to use it. - -However if you want to use such a key with Asterisk, you'll have to start -it interactively, because the scripts that start asterisk can't use that -encrypted key. - -The key is identified by a name. If you don't write the name on the -command-line you'll be prompted for one. The outputs of the script are: - -.I name\fB.pub -.RS -The public key: not secret. Send this to the other side. -.RE - -.I name\fB.key -.RS -The private key: secret. -.RE - -Those files should be copied to -.I /var/lib/asterisk/keys - -(The private key: on your system. The public key: on other systems) - -To see the currently-installed keys from the asterisk CLI, use the command - -.RS -show keys -.RE - -.SH OPTIONS -.B -q -.RS -Run quietly. -.RE - -.B -n -.RS -Don't encrypt the private key. -.RE - -.SH FILES -.I /var/lib/asterisk/keys -.RS -.RE - -.SH "SEE ALSO" -asterisk(8), genrsa(1), rsa(1), - -http://www.voip-info.org/wiki-Asterisk+iax+rsa+auth - -.SH "AUTHOR" -This manual page was written by Tzafrir Cohen -Permission is granted to copy, distribute and/or modify this document under -the terms of the GNU General Public License, Version 2 any -later version published by the Free Software Foundation. - -On Debian systems, the complete text of the GNU General Public -License can be found in /usr/share/common-licenses/GPL. diff --git a/debian/astman.1 b/debian/astman.1 deleted file mode 100644 index 34e91b4..0000000 --- a/debian/astman.1 +++ /dev/null @@ -1,102 +0,0 @@ -.\" $Header: /aolnet/dev/src/CVS/sgml/docbook-to-man/cmd/docbook-to-man.sh,v 1.1.1.1 1998/11/13 21:31:59 db3l Exp $ -.\" -.\" transcript compatibility for postscript use. -.\" -.\" synopsis: .P! -.\" -.de P! -.fl -\!!1 setgray -.fl -\\&.\" -.fl -\!!0 setgray -.fl \" force out current output buffer -\!!save /psv exch def currentpoint translate 0 0 moveto -\!!/showpage{}def -.fl \" prolog -.sy sed \-e 's/^/!/' \\$1\" bring in postscript file -\!!psv restore -. -.de pF -.ie \\*(f1 .ds f1 \\n(.f -.el .ie \\*(f2 .ds f2 \\n(.f -.el .ie \\*(f3 .ds f3 \\n(.f -.el .ie \\*(f4 .ds f4 \\n(.f -.el .tm ? font overflow -.ft \\$1 -.. -.de fP -.ie !\\*(f4 \{\ -. ft \\*(f4 -. ds f4\" -' br \} -.el .ie !\\*(f3 \{\ -. ft \\*(f3 -. ds f3\" -' br \} -.el .ie !\\*(f2 \{\ -. ft \\*(f2 -. ds f2\" -' br \} -.el .ie !\\*(f1 \{\ -. ft \\*(f1 -. ds f1\" -' br \} -.el .tm ? font underflow -.. -.ds f1\" -.ds f2\" -.ds f3\" -.ds f4\" -'\" t -.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n -.TH ASTMAN 1 "Jun 12th, 2005" "astman" "Linux Programmer's Manual" -.SH NAME -.B astman --- a client to asterisk's manager interface -.SH SYNOPSIS -.PP -.B astman -.I hostname - -.SH DESCRIPTION -.B astman -This program is a full-screen (terminal) client for Asterisk's manager -interface. - -.SH OPTIONS -.B hostname - -The host name or IP address to connect to (TCP port 5038). If astman -fails to connect it will exit immidiately. - -.SH USAGE -If \fBastman\fR has successfully cunnected to the manager port it will -prompt the user for a username and a secret (password) for the manager -interface on the remote Asterisk manager interface. It will then be able -to report existing channels (calls). You will then be able to redirect -calls to or terminate them. - -.SH "SEE ALSO" -asterisk(8) - -http://www.voip-info.org/wiki-Asterisk+astman - -.SH BUGS -The hostname does not default to localhost. - -Impossible to use a port other than 5038. - -The username and password cannot be defined from the command-line. - -I mean, what's the point in a man page if the syntax is so simple? - -.SH "AUTHOR" -This manual page was written by Tzafrir Cohen -Permission is granted to copy, distribute and/or modify this document under -the terms of the GNU General Public License, Version 2 any -later version published by the Free Software Foundation. - -On Debian systems, the complete text of the GNU General Public -License can be found in /usr/share/common-licenses/GPL. diff --git a/debian/autosupport.8 b/debian/autosupport.8 deleted file mode 100644 index e356fcd..0000000 --- a/debian/autosupport.8 +++ /dev/null @@ -1,41 +0,0 @@ -.TH AUTOSUPPORT 8 "Jul 5th, 2005" "Asterisk" "Linux Programmer's Manual" -.SH NAME -.B autosupport -\(em interactive script to provide Digium[tm]'s support with information -.SH SYNOPSIS -.PP -.B autosupport - -.SH DESCRIPTION -.B autoasupport -is a script that is normally run by a user contacting Digium's support -to automate gathering support information. - -It will probe the system for some configuration and run-time information, -and will also prompt the user for some optional access information (IP -address, login and password). - -The information is written to /root/digiuminfo which the user is expected -to attach to a support ticket to Digium. - -The script must be run as root as it reads Asterisk's configuration and -the disk information using hdparm(8). - -.SH FILES -.B /root/digiuminfo -.RS -The output of the script goes there -.RE - -.SH SEE ALSO -asterisk(8) - -.SH "AUTHOR" -autosupport was written by John Bigelow . -This manual page was written by Tzafrir Cohen -Permission is granted to copy, distribute and/or modify this document under -the terms of the GNU General Public License, Version 2 any -later version published by the Free Software Foundation. - -On Debian systems, the complete text of the GNU General Public -License can be found in /usr/share/common-licenses/GPL. diff --git a/debian/backports/lenny b/debian/backports/lenny deleted file mode 100755 index 5e5e0e0..0000000 --- a/debian/backports/lenny +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -# Backport current Asterisk to (Lenny + pkg-voip packages): - -sed -i -e 's#^ libcap-dev# libcap2-dev#' debian/control -sed -i -e '/libresample1-dev/d' debian/control -sed -i -e '/libsrtp0-dev/d' debian/control - -# Remove any trace for Multi-Arch: -sed -i -e 's/ \?\[linux-any\]//g' -e 's/linux-any/any/' debian/control - -exit 0 diff --git a/debian/backports/squeeze b/debian/backports/squeeze deleted file mode 100755 index dbca83c..0000000 --- a/debian/backports/squeeze +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# Backport current Asterisk to (Squeeze + pkg-voip packages): - -# Remove any trace for Multi-Arch: -sed -i -e 's/ \?\[linux-any\]//g' -e 's/linux-any/any/' debian/control - -# libgmime 2.6 -> 2.4 -sed -i -e 's/libgmime-2.6-dev/libgmime-2.4-dev/g' debian/control - -exit 0 diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index 39715e7..0000000 --- a/debian/changelog +++ /dev/null @@ -1,3417 +0,0 @@ -asterisk (1:16.2.1~dfsg-1+deb10u1) buster; urgency=medium - - * AST-2019-002 / CVE-2019-12827 - Buffer overflow in res_pjsip_messaging (Closes: #931980) - * AST-2019-003 / CVE-2019-13161 - Remote Crash Vulnerability in chan_sip (Closes: #931981) - * d/gbp.conf: Update for Buster branch - - -- Bernhard Schmidt Tue, 20 Aug 2019 22:31:36 +0200 - -asterisk (1:16.2.1~dfsg-1) unstable; urgency=medium - - * New upstream version 16.2.1~dfsg - - CVE-2019-7251 / AST-2019-001 (Closes: #923690) - Remote crash vulnerability with SDP protocol violation - * Bump dependency on libjansson-dev to >= 2.11 (required by upstream) - - -- Bernhard Schmidt Thu, 07 Mar 2019 23:13:24 +0100 - -asterisk (1:16.2.0~dfsg-1) unstable; urgency=medium - - * New upstream version 16.2.0~dfsg - - -- Bernhard Schmidt Wed, 20 Feb 2019 23:49:31 +0100 - -asterisk (1:16.1.1~dfsg-1) unstable; urgency=medium - - Upload new major version to unstable - - [ Bernhard Schmidt ] - * New upstream version 16.1.1 (Closes: #886984, #917481) - - build with embedded pjproject 2.8 (dfsg-repacked) - - Add lintian overrides for bundled library - - Reenable app_macro, many dialplans need it - * Update d/watch for Asterisk 16.x - * Add signing key for Chris Savinovich - * New upstream version 16.1.0~dfsg - * README.Debian: Fix a typo found by lintian - * Drop libsqlite0-dev, deprecated - * Do not load any local channel drivers by default (Closes: #821392) - * asterisk.service: Attempt to run with realtime priority by default - (Closes: #801629) - * Improve/fix some raceconditions in sysv-initscript. - Thanks to Walter Doekes (Closes: #778746) - - [ Rob Thomas ] - * Build-Depend on libunbound-dev for async DNS - - -- Bernhard Schmidt Fri, 11 Jan 2019 18:51:43 +0100 - -asterisk (1:13.23.1~dfsg-2) unstable; urgency=medium - - * Fix autopkgtest by parsing XML results (Closes: #909689) - - -- Bernhard Schmidt Thu, 03 Jan 2019 16:20:10 +0100 - -asterisk (1:13.23.1~dfsg-1) unstable; urgency=medium - - * New upstream version 13.23.1~dfsg - - CVE-2018-17281 / AST-2018-009 (Closes: #909554) - Remote crash vulnerability in HTTP websocket upgrade - * Add lintian overrides for modules - - -- Bernhard Schmidt Tue, 25 Sep 2018 09:59:08 +0200 - -asterisk (1:13.22.0~dfsg-2) unstable; urgency=medium - - * Fix/enable autopkgtest - - Do not log disabled tests to stderr - - Look at the correct line in the summary for failed tests - - -- Bernhard Schmidt Wed, 05 Sep 2018 11:30:36 +0200 - -asterisk (1:13.22.0~dfsg-1) unstable; urgency=medium - - * New upstream version 13.22.0~dfsg - - CVE-2018-12227 / AST-2018-008 (Closes: #902954) - PJSIP endpoint presence disclosure when using ACL - - pjsip: Increase maximum number of usable ciphers (Closes: #897412) - * Drop d/p/no_uname, not necessary anymore - * Drop d/p/radcli-detection.patch, applied upstream - * Fix d/p/hack-multiple-app-voicemail for upstream libtdl drop - * Unfuzz d/p/amr.patch and d/p/ffmpeg-detection.patch - * Fix FTBFS due to wrong filename for dh_installdocs (Closes: #903412) - - -- Bernhard Schmidt Sun, 22 Jul 2018 23:31:23 +0200 - -asterisk (1:13.20.0~dfsg-1) unstable; urgency=medium - - * New upstream version 13.20.0 (Closes: #891227, #891228) - * Reorganize upstream GPG keys - - Split individual signing keys in separate files - - Add new key for Ben Ford : 0x073B0C1FC9B2E352 - - Add new key for Joshua Colp : - 0xCDBEE4CC699E200EB4D46BB79E76E3A42341CE04 - * Fix missing/broken Closes: in previous changelog - * Install realtime database schema into asterisk-doc - * Point Vcs-* to salsa - - -- Bernhard Schmidt Tue, 03 Apr 2018 10:59:20 +0200 - -asterisk (1:13.18.5~dfsg-1) unstable; urgency=medium - - * New upstream release: - - CVE-2017-17850 / AST-2017-014 (Closes: #885072) - - AST-2017-012: Remote Crash Vulnerability in RTCP Stack (Closes: #884345) - * Re-add support for snmp (Closes: #851738) - * Don't load dundi, mgcp, skinny and unistim by default - * Avoid parallel build in 'make install' - * tests: realpath is now in coreutils - * asttestmods: enable res_pjsip_pubsub tests - * asttestmods: run asterisk as user asterisk - * asttestmods: disable module test_cel for now - - -- Tzafrir Cohen Thu, 28 Dec 2017 00:20:16 +0200 - -asterisk (1:13.18.3~dfsg-1) unstable; urgency=medium - - * New upstream version 13.18.3~dfsg - - CVE-2017-17090 / AST-2017-013 - DOS Vulnerability in Asterisk chan_skinny (Closes: #883342) - * Drop duplicate filter line from d/gbp.conf - - -- Bernhard Schmidt Thu, 07 Dec 2017 15:20:29 +0100 - -asterisk (1:13.18.1~dfsg-1) unstable; urgency=medium - - * New upstream version 13.18.1~dfsg - - CVE-2017-16671 / AST-2017-010 - Buffer overflow in CDR's set user (Closes: #881257) - - CVE-2017-16672 / AST-2017-011 - Memory/File Descriptor/RTP leak in pjsip session resource - (Closes: #881256) - - Drop gmime-3.x and srtp 2.1 support patches applied upstream - - Drop pjsip_unresolved_symbol.patch applied upstream - * reproducibility: Sort order of input files for core-en_US.xml generation - * Drop dh --with autotools_dev, default in compat 10 - * Add Multi-Arch: foreign to -dev and -doc - * Remove deprecated priority extra - - -- Bernhard Schmidt Thu, 09 Nov 2017 23:35:12 +0100 - -asterisk (1:13.17.2~dfsg-2) unstable; urgency=medium - - * Build against libsrtp2 - - Add versioned b-d to pjproject 2.7 built with libsrtp2 - - d/p/libsrtp-2.1.x.patch: Upstream patch to support libsrtp 2.1.x - * Transition to gmime 3.0 (Closes: #867346) - - d/p/gmime-3.0.patch: Upstream patch to support gmime 3.0 - * Bump Standards-Version to 4.1.1, drop obsolete build-deps - * Fix reproducible builds by overwriting kernel version and - machine architecture - - -- Bernhard Schmidt Fri, 06 Oct 2017 23:27:22 +0200 - -asterisk (1:13.17.2~dfsg-1) unstable; urgency=high - - * New upstream version 13.17.2~dfsg - - CVE-2017-14603 / AST-2017-008 - This is a follow-up for AST-2017-005: RTP/RTCP information leak - improving robustness of the security fix and fixing a regression - with re-INVITEs (Closes: #876328) - - -- Bernhard Schmidt Sat, 23 Sep 2017 20:41:06 +0200 - -asterisk (1:13.17.1~dfsg-1) unstable; urgency=high - - * New upstream version 13.17.1, fixing three CVEs - - CVE-2017-14099 / AST-2017-005 - Media takeover in RTP stack ("RTP bleed") (Closes: #873907) - - CVE-2017-14100 / AST-2017-006 - Shell access command injection in app_minivm (Closes: #873908) - - CVE-2017-14098 / AST-2017-007 - Remote Crash Vulerability in res_pjsip (Closes: #873909) - - -- Bernhard Schmidt Sat, 02 Sep 2017 22:34:09 +0200 - -asterisk (1:13.17.0~dfsg-2) unstable; urgency=medium - - * Build with -Wl,--as-needed - * Add patch to (hopefully) build reproducibly - * Temporarily add libavdevice-dev to b-d to work around - pjproject issue - - -- Bernhard Schmidt Thu, 17 Aug 2017 21:10:03 +0200 - -asterisk (1:13.17.0~dfsg-1) unstable; urgency=medium - - * New upstream version 13.17.0 - - Dropped OpenSSL 1.0 patches: merged upstream. - - Dropped 859911-pjsip-set-rtp-source-address patches: merged upstream. - - Dropped pjsip_unresolved_symbol.patch: merged upstream. - - Dropped AST-2017-004.patch: merged upstream. - - Closes: #856332 (specifically: just the example in pjsip.conf). - * Added asterisk-tests package: internal tests. Not otherwise useful. - - New ABI hash: 1fb7f5c06d7a2052e38d021b3d8ca151. - * Added autopkgtest test based on them. - - -- Tzafrir Cohen Thu, 03 Aug 2017 23:20:22 -0400 - -asterisk (1:13.14.1~dfsg-2) unstable; urgency=high - - [ Tzafrir Cohen ] - * CVE-2017-9358 / AST-2017-004: Memory exhaustion on short SCCP packets - (Closes: #863906) - * Documentation updates in debian/: - - d/p/test_framework.patch: no longer an upstream issue - - d/asterisk-config-custom: - - fix typo: buildbuildpackage (Closes: #860902) - - add comment that dpkg-buildpackage comes from dpkg-dev - - -- Bernhard Schmidt Fri, 02 Jun 2017 14:40:15 +0200 - -asterisk (1:13.14.1~dfsg-1) unstable; urgency=medium - - * New upstream version 13.14.1 - - Fixes AST-2017-001 (Buffer overflow in CDR's set user) (Closes: #859910) - * Import upstream fix to set the RTP source address to the address bound by - the PJSIP transport (Closes: #859911) - - -- Bernhard Schmidt Mon, 10 Apr 2017 12:53:03 +0200 - -asterisk (1:13.14.0~dfsg-1) unstable; urgency=medium - - [ Bernhard Schmidt ] - * New upstream version 13.14.0~dfsg - - Fixes RTP error on systems with disabled IPv6 (Closes: #853792) - - Fixes asymetric RTP codec selection (Closes: #855014) - * drop pjsip_improve_logging.patch, applied upstream - * drop configure-osarch, applied upstream - - -- Bernhard Schmidt Tue, 14 Feb 2017 21:54:29 +0100 - -asterisk (1:13.13.1~dfsg-4) unstable; urgency=medium - - * Depend on asterisk-core-sounds-en instead of -gsm - - -- Bernhard Schmidt Tue, 24 Jan 2017 14:14:03 +0100 - -asterisk (1:13.13.1~dfsg-3) unstable; urgency=medium - - [ Bernhard Schmidt ] - * Patch from upstream: pjsip_improve_logging.patch to improve logging - levels in pjproject/chan_pjsip (Closes: #849804). - Thanks to Joerg Dorchain for testing. - * Disable SNMP support for now - libsnmp-dev pulls in libssl1.0-dev, which is not coinstallable with - libssl-dev needed by Asterisk and all other dependencies - - -- Bernhard Schmidt Tue, 17 Jan 2017 22:26:14 +0100 - -asterisk (1:13.13.1~dfsg-2) unstable; urgency=medium - - [ Tzafrir Cohen ] - * test_framework.patch: fix ABI - * Add a DAHDI hook script for Asterisk (Closes: #848584) - - [ Bernhard Schmidt ] - * disable the open-source Opus and VP8 codec - - these are built out-of-tree in asterisk-opus now, add Suggests - - -- Bernhard Schmidt Sun, 25 Dec 2016 19:54:12 +0100 - -asterisk (1:13.13.1~dfsg-1) unstable; urgency=medium - - [ Bernhard Schmidt ] - * New upstream version 13.13.1~dfsg - - Fix AST-2016-008 (Closes: #847666, but the Debian package was most - likely not vulnerable due to a patched Opus implementation) - - Fix AST-2016-009 / CVE-2016-9938 (Closes: #847668) - * Drop fix_libedit_unicode.patch, applied upstream - * Drop HURD patches, applied upstream - * Drop changes to res/res_format_attr_opus.c from opus.patch - * Add pjsip_unresolved_symbol.patch to fix unresolved symbol in chan_pjsip - - -- Bernhard Schmidt Sun, 18 Dec 2016 14:48:07 +0100 - -asterisk (1:13.12.2~dfsg-2) unstable; urgency=medium - - [ Bernhard Schmidt ] - * Import upstream fix for libedit unicode garbage (Closes: #845144) - - -- Bernhard Schmidt Thu, 01 Dec 2016 20:13:27 +0100 - -asterisk (1:13.12.2~dfsg-1) unstable; urgency=medium - - [ Tzafrir Cohen ] - * libsystemd is needed for sd_notify support - * upstreaming radcli-detection.patch - - [ Bernhard Schmidt ] - * Additional upstream signing key for Rusty Newton - * New upstream version 13.12.2~dfsg - - -- Bernhard Schmidt Sun, 13 Nov 2016 20:58:36 +0100 - -asterisk (1:13.12.1~dfsg-1) unstable; urgency=medium - - * New upstream release. - * Update opus patch, add libopusfile-dev build-dep - * Use startup notification in systemd unit - * no_native_arch.patch: avoid -march=native (Closes: #842917) - * Preliminary OpenSSL 1.1.0 support (Closes: #828240) - - d/p/OpenSSL-1.1.0-support.patch from Tzafrir Cohen - - d/p/OpenSSL-1.1.0-support-2.patch suggested by Stepan Golosunov - * Install files for REST API (Closes: #836924) - * Bump to debhelper 10, enabling parallel build (Closes: #778751) - * Migrate to Automatic Debug Packages (-dbgsym) - * Add Bernhard Schmidt to uploaders - - -- Bernhard Schmidt Wed, 09 Nov 2016 09:22:35 +0100 - -asterisk (1:13.11.2~dfsg-1) unstable; urgency=medium - - * Update d/u/signing-keys.asc for 13.11.2 - - Add Matthew Fredrickson (0x8438CBA18D0CAA72) - - Drop Joshua Colp (0xDAB29B236B940F89) - * New upstream version 13.11.2~dfsg - - Update d/p/systemd.patch for new release - - Refresh/unfuzz patches - - fixes CVE-2016-7550 (Closes: #838833) - - fixes CVE-2016-7551 (Closes: #838832) - * Build-depend on libradcli-dev again, libfreeradius-client-dev is dropped - from sid (Closes: #836953) - * fix obsolete build-dep libmysqlclient-dev -> default-libmysqlclient-dev - * add lsb-base dependency to asterisk - - -- Bernhard Schmidt Thu, 27 Oct 2016 13:06:22 +0200 - -asterisk (1:13.10.0~dfsg-1) unstable; urgency=medium - - [ upstream ] - * New release(s). - - [ Jonas Smedegaard ] - * Update upstream signing-key: - + Add Richard Mudgett (0x6CB44E557BD982D8). - + Drop Rusty Newton (0x123FD04E861FFB7D). - + Drop Matthew Fredrickson (0x8438CBA18D0CAA72). - * Update AMR patch. - * Unfuzz patches. - * Update copyright info. - - -- Jonas Smedegaard Mon, 29 Aug 2016 17:07:40 +0200 - -asterisk (1:13.9.1~dfsg-2) unstable; urgency=medium - - [ Tzafrir Cohen ] - * provide a usable sounds/priv-callerintros - - [ Jonas Smedegaard ] - * Fix override dh_install only for architecture-dependent targets. - Closes: Bug#821018. Thanks to Santiago Vila. - * Build-depend on libfreeradius-client-dev, with libradcli-dev only as - fallback (see bug#825121). - - -- Jonas Smedegaard Fri, 15 Jul 2016 04:40:40 +0200 - -asterisk (1:13.9.1~dfsg-1) unstable; urgency=medium - - [ upstream ] - * New release(s). - - [ Jonas Smedegaard ] - * Update copyright info: - + Fix cover BSD-4-Clause, BSD-3-Clause, GSM, and ISC licensed files. - + Fix extend coverage for main upstream author. - + Fix extend Files section for ooh323. - + Fix add more copyright holders to initial catch-all Files section, - and merge with more specific same-licensed Files sections. - + Fix update and merge unrestricted licensed files. - + Fix distinguish plain GPL licensed files from those referencing - Asterisk exceptions. - + Fix drop Files sections for files with no copyright or licensing - statements. - + Fix interpret "GPL is fine" grant as plain GPL-2 (without Asterisk - exceptions). - + Fix copyright holder and mention of additional WOL license. - + Mention alternative LGPL license. - + Use license grant and tidy comments for GPL licensed files. - + Fix add files in the public domain. - + Fix file path (track patch not patch content). - + Fix strip trailing / from excluded files. - Thanks to Vasuded Kamath. - * Add copyright-check scripts to source package. - * Declare compliance with Debian Policy 3.9.8. - - -- Jonas Smedegaard Wed, 15 Jun 2016 09:08:54 +0200 - -asterisk (1:13.8.2~dfsg-1) unstable; urgency=medium - - [ Tzafrir Cohen ] - * New upstream release (Fixes AST-2016-005). - * systemd: only restart on failure - - [ Jonas Smedegaard ] - * Link against radcli favored over freeradius-client/radiusclient-ng: - + Add patch to autodetect radcli. - + Build-depend on libradcli-dev, with libfreeradius-client-dev or - libradiusclient-ng-dev only as fallbacks. - Closes: Bug#822339. Thanks to Daniel Pocock. - * Enable PJProject and FFMpeg: Both projects has re-entered testing. - - -- Jonas Smedegaard Wed, 18 May 2016 14:44:34 +0200 - -asterisk (1:13.8.0~dfsg-1) experimental; urgency=medium - - [ upstream ] - * New release. - - [ Tzafrir Cohen ] - * hurd_osarch.patch: set osarch to support HURD - * hurd_path_max.patch (Closes: #784551) - - [ Jonas Smedegaard ] - * Build-depend on libpjproject-dev. - * Unfuzz patches. - - -- Jonas Smedegaard Sat, 02 Apr 2016 13:49:38 +0200 - -asterisk (1:13.7.2~dfsg-1) unstable; urgency=medium - - [ upstream ] - * New minor releases. - + Fixes AST-2015-001. - CVE-2015-1558. Closes: Bug#780601. - + Fixes AST-2015-002. - Related to CVE-2014-8150. - - [ Jonas Smedegaard ] - * Update patches: - + Unfuzz patches enable_addons smsq_enable. - + Refresh and tighten all patches. - + Add/update DEP3 patch headers, with long descriptions embedded in - Description field. - * Modernize Vcs-* field URLs: - + Use https protocol. - + Use cgit viewer. - * Declare compliance with Debian Policy 3.9.7. - * Wrap and sort control file. - * Add myself as uploader. - * Tidy copyright info: Strip trailing whitespace. - * Drop/simplify obsolete versioning or fallbacks in build-dependencies - or breaks/replaces. - * Avoid X11-related on not-in-testing linkage (until in testing and - X11-related binaries are in separate binary package). - + Only enable PJProject, SDL or FFMpeg when targeted experimental. - + Disable in non-experimental releases. - + Ignore ABI drift on experimental builds. - + Temporarily stop build-depend on libpjproject-dev. - Closes: Bug#804460, #792303. - * Fix build-depend only on libsrtp-dev (not also libsrtp0-dev). - * Build-depend on liburiparser-dev, for (presumably) a more uniform - URI parsing. - Closes: Bug#786926. - * Update watch file: - + Bump to file format 4. - + Always repackage, using xz. - + Mangle debian version: strip ~dfsg suffix. - * Update upstream PGP keyring: Add Joshua Colp (0xDAB29B236B940F89). - * Git-ignore quilt .pc dir. - * Have git-buildpackage filter upstream .gitignore files, enable - signed tags, and enable use of pristine-tar. - * Drop custom get-orig-source target: Use "gbp import-orig --uscan" - instead. - * Update copyright info: - + Fix include reasons for repackaging in Source field (not separate - Comment field) as mandated by file format 1.0. - + Consider formats/msgsm.h as non-copyright-protected, with comment - on reasoning. - + Consider formats/msgsm.h as non-copyright-protected, with comment - on reasoning. - + Fix use License shortnames BSD-3-clause~IETF BSD-4-clause~Clapper - (not BSD-3-clause). - + Fix include full verbatim BSD-3-clause~IETF license. - + Wrap at 72 chars. - + Use "None" (not "-") as copyright holder for files in the public - domain. - + Strip non-license text. - + Assume unversioned GPL is same as generally for the project. - + Drop comment on audio data encoded as C header file lacking - source: Upstream is free to choose that format as preferred form - (similar to pnm for graphics). - + Assume GTK+ dialogue code without explicit licensing has same - license as project generally. - + Use License-Grant and License-Reference fields. - Thanks to Ben Finney. - * Improve media support: - + Add patch to add Opus codec module supporting transcoding. - + Add patch to add VP8 format module supporting read/write to file. - + Add patch to add AMR and AMR-WB modules supporting transcoding. - + Add patches to support video in console. - + Build-depend on libopus-dev libopencore-amrnb-dev - libopencore-amrwb-dev libavcodec-dev libswscale-dev - libsdl-image1.2-dev. - Closes: bug#786972, #531728. - * Bump ABI hash. - * Add lintian override regarding license in License-Reference field. - See bug#786450. - * Tidy README.Debian: Fix typo. - * Emit config.log if configure fails. - - -- Jonas Smedegaard Tue, 29 Mar 2016 16:31:49 +0200 - -asterisk (1:13.1.0~dfsg-1.1) unstable; urgency=medium - - * Non-maintainer upload. - - [ Matthias Klose ] - * Build with -fgnu89-inline. Closes: #777782. - * CVE-2015-1558: File descriptor leak when incompatible codecs are offered. - Closes: #780601. - - [ James Cowgill ] - * Fix OSARCH detection on all linux architectures. Closes: #780287. - - -- Matthias Klose Fri, 10 Jul 2015 12:56:51 +0200 - -asterisk (1:13.1.0~dfsg-1) unstable; urgency=high - - [ Tzafrir Cohen ] - * New upstream release, fixes various security holes (Closes: #771463): - - AST-2014-012 (CVE-2014-8412): Mixed IP address families in ACLs - may permit unwanted traffic - - AST-2014-013 (CVE-2014-8413): PJSIP ACLs not loaded at startup - - AST-2014-014 (CVE-2014-8414): High call load may result in hung - channels in ConfBridge - - AST-2014-015 (CVE-2014-8415): Remote Crash Vulnerability in PJSIP - channel driver - - AST-2014-016 (CVE-2014-8416): Remote Crash Vulnerability in PJSIP - channel driver - - AST-2014-017 (CVE-2014-8417): Mark CONFBRIDGE as a sensitive - function for external APIs - - AST-2014-018 (CVE-2014-8418): Mark DB as a sensitive function for - external APIs - - AST-2014-019.patch (CVE-2014-9374): Remote Crash Vulnerability in - WebSocket Server (Closes: #773230). - * The key file better be ascii-armoured, indeed - * init script: kill with PID (Closes: #742783) - * Describe patch astdatadir - - [ Stappers Geert ] - * new file: debian/README.source (Closes: #772469). - * asterisk-config-custom (Closes: #760032) - - -- Tzafrir Cohen Wed, 31 Dec 2014 14:58:53 +0200 - -asterisk (1:13.0.0~dfsg-3) unstable; urgency=medium - - * sanity check to avoid changing the ABI hash - * A disabled patch for the test framework - * Remove corosync support: doesn't work - - -- Tzafrir Cohen Sat, 01 Nov 2014 19:21:54 +0200 - -asterisk (1:13.0.0~dfsg-2) unstable; urgency=medium - - * Patch bigendian: fix building chan_phone on big endian platforms. - * Makefile_kfreebsd: Have Makefile's 'config' target install the same - files as kFreeBSD as it does on Linux. - -- Tzafrir Cohen Mon, 27 Oct 2014 23:13:36 +0200 - -asterisk (1:13.0.0~dfsg-1) unstable; urgency=medium - - * New upstream release (Closes: #716931, #504741) - - Patches merged upstream: - - allow-tilde-destdir - - dahdi_create_channels - - enable_addons - - escape_manpage_hyphen.patch - - ignore_failed_channels.patch - - neon_version_check.patch - - pjproject - - pri_destroy_span_prilist.patch - - res_fax_bounds.patch - - series - - sigpri_handle_enodev_1.patch - * A systemd service. - * Compat level 9. - * Extra build dependencies for Asterisk 13. - * Re-enable chan_mgcp: work around a bug in menuselect? (Closes: #745718). - * Some fixes to the copyright file. - - -- Tzafrir Cohen Sun, 26 Oct 2014 22:52:12 +0200 - -asterisk (1:11.13.1~dfsg-1) unstable; urgency=high - - * New upstream release: fixes AST-2014-011 (CVE-2014-3566, POODLE). - - -- Tzafrir Cohen Sun, 26 Oct 2014 05:47:00 +0200 - -asterisk (1:11.13.0~dfsg-1) unstable; urgency=medium - - * New upstream release. - - Drop aelparse_manpage.patch and smsq_manpage.patch, fixed upstream. - * Fix an out of bounds error in res_fax.c. - * Allow res_calendar_ews to work with neon 0.30.x (Closes: #761677). - * Build with all hardening options enabled. - - -- Jeremy Lainé Fri, 26 Sep 2014 12:30:57 +0200 - -asterisk (1:11.12.1~dfsg-1) unstable; urgency=high - - * New upstream security release, fixes: - - AST-2014-010 a.k.a. CVE-2014-6610 (Closes: #762164). - - -- Jeremy Lainé Mon, 22 Sep 2014 09:53:31 +0200 - -asterisk (1:11.12.0~dfsg-1) unstable; urgency=medium - - * New upstream release. - - Drop pbx_lua_regression patch, fixed upstream. - * Make asterisk Provide asterisk-$$AST_BUILDOPT_SUM (Closes: #694805). - - -- Jeremy Lainé Wed, 20 Aug 2014 15:23:03 +0200 - -asterisk (1:11.11.0~dfsg-2) unstable; urgency=medium - - * Fix loading lua modules from pbx_lua (Closes: #756425). - * Ship the aelparse utility (Closes: #747866). - - -- Jeremy Lainé Thu, 07 Aug 2014 13:00:58 +0200 - -asterisk (1:11.11.0~dfsg-1) unstable; urgency=medium - - * New upstream release. - - Drop safe_asterisk-config and safe_asterisk-nobg patches, fixed upstream - in bug ASTERISK-23492. - - Update pjproject patch. - * Remove svn-upgrade from watch file. - - -- Jeremy Lainé Fri, 11 Jul 2014 00:59:13 +0200 - -asterisk (1:11.10.2~dfsg-1) unstable; urgency=high - - * New upstream security release, fixes: - - AST-2014-006: Asterisk Manager User Unauthorized Shell Access - - AST-2014-007: Exhaustion of Allowed Concurrent HTTP Connections - - -- Jeremy Lainé Fri, 13 Jun 2014 22:02:37 +0200 - -asterisk (1:11.10.0~dfsg-1) unstable; urgency=medium - - * New upstream release. - - -- Jeremy Lainé Mon, 02 Jun 2014 16:06:27 +0200 - -asterisk (1:11.9.0~dfsg-2) unstable; urgency=medium - - * Rollback changes to init script (Closes: #749024). - - -- Jeremy Lainé Tue, 27 May 2014 09:17:06 +0200 - -asterisk (1:11.9.0~dfsg-1) unstable; urgency=medium - - [ Jeremy Lainé ] - * New upstream release. - - Drop ASTERISK-23310 patch, fixed upstream. - - Drop dahdi_pri_event_removed patch, fixed upstream. - - Drop freeradius-client patch, fixed upstream. - - Update pjproject patch. - * Provide a manpage for smsq. - * Use "set -e" in asterisk.(postrm|prerm) (fixes lintian warning). - * Add upstream GPG signature check to watch file. - * Add Daniel Pocock to uploaders. - - [ Daniel Pocock ] - * Make init script more adaptable for multiple instances. - - [ Tzafrir Cohen ] - * pri_destroy_span_prilist.patch, sigpri_handle_enodev_1.patch: fix - regressions due to dahdi_pri_event_removed. - - -- Jeremy Lainé Wed, 21 May 2014 12:03:09 +0200 - -asterisk (1:11.8.1~dfsg-1) unstable; urgency=high - - * New upstream security release (Closes: #741313). - - -- Jeremy Lainé Tue, 11 Mar 2014 07:44:54 +0100 - -asterisk (1:11.8.0~dfsg-2) unstable; urgency=medium - - * Really fix versioned Breaks/Replaces for asterisk-dahdi (Closes: #732419). - - -- Jeremy Lainé Thu, 06 Mar 2014 07:38:11 +0100 - -asterisk (1:11.8.0~dfsg-1) unstable; urgency=low - - [ Jeremy Lainé ] - * New upstream release. - - rasterisk no longer prints a warning when live_dangerously is set. - * Patch ASTERISK-23310: fixes crash when a leg of a remote RTP bridge fails. - - [ Frederic Van Espen ] - * smsq_enable.patch: enable smsq compilation (Closes: #738588) - - -- Jeremy Lainé Tue, 04 Mar 2014 16:27:58 +0100 - -asterisk (1:11.7.0~dfsg-1) unstable; urgency=high - - * New upstream security release (Closes: #732355). - - Drop astdb_mans patch, fixed upstream. - * Fix versioned Breaks/Replaces for asterisk-dahdi (Closes: #732419). - - -- Jeremy Lainé Wed, 18 Dec 2013 09:47:58 +0100 - -asterisk (1:11.6.0~dfsg-3) unstable; urgency=medium - - * Fix default RADIUS configuration path when using libfreeradius-client. - - -- Jeremy Lainé Fri, 13 Dec 2013 10:10:50 +0100 - -asterisk (1:11.6.0~dfsg-2) unstable; urgency=medium - - [ Jeremy Lainé ] - * Update Standards-Version to 3.9.5 (no changes). - * Add Suggests on asterisk-vpb. - * Build against libfreeradius-client (Closes: #721622). - * Make sure CPPFLAGS get carried down to the build system. - * Fix versioned Breaks/Replaces for asterisk-vpb (Closes: #731971). - - [ Tzafrir Cohen ] - * Restore SE Linux settings on directories created in init script - (Russell Coker, Closes: #731397). - * ignore_failed_channels.patch: allow dahdi to start after Asterisk. - * Move app_flash to asterisk-dahdi. - - -- Jeremy Lainé Thu, 12 Dec 2013 19:04:39 +0100 - -asterisk (1:11.6.0~dfsg-1) unstable; urgency=low - - * New upstream release. - - Drop bzero patch, fixed upstream. - - Update pjproject patch. - * Move VoiceTronix support to asterisk-vpb (Closes: #492329). - * Enable BETTER_BACKTRACES for debug builds. - - -- Jeremy Lainé Mon, 02 Dec 2013 19:26:03 +0100 - -asterisk (1:11.5.1~dfsg1-1) unstable; urgency=low - - * Remove res/pjproject from the source tarball (Closes: #725210). - - -- Jeremy Lainé Thu, 03 Oct 2013 09:25:06 +0200 - -asterisk (1:11.5.1~dfsg-2) unstable; urgency=low - - [ Jeremy Lainé ] - * Fix FTBFS for binary-arch builds. - * Fix Vcs-Browser and Vcs-Git URLs. - * Update Standards-Version to 3.9.4 (no changes). - - [ Tzafrir Cohen ] - * Patch reenable: reenable chan_vpb. - * Depend on srtp even on sparc and hurd: the build fails if srtp is not - installed. - * Add Jeremy Lainé to uploaders. - - -- Jeremy Lainé Wed, 02 Oct 2013 13:46:40 +0200 - -asterisk (1:11.5.1~dfsg-1) unstable; urgency=low - - [ Faidon Liambotis ] - * New major upstream release. - - Drop patch kfreebsd, fixed upstream. - - Drop patch httpd_port. - - Drop patch menuselect_cflags, merged upstream. - - Drop patch bluetooth_bind, merged upstream. - - Replace libopenais-dev with corosync-dev, res_corosync replaces res_ais. - - Fixes CVE-2013-5641, CVE-2013-5642 (Closes: #721220). - - Patch fix_xmpp_19532 also included (Closes: #545272). - - Patch powerpcspe also included (Closes: #701505). - - Fixes incorrect sip causes issue (Closes: #710557). - - Patch powerpcspe also included (Closes: #701505). - - Patces merged upstream: AST-2012-012, ASt-2012-013, - AST-2012-014, AST-2012-015, AST-2013-002, AST-2013-003 - * Do not ship the removed-but-reincluded docs, they're outdated by now. - Upstream wants their Wiki to be the primary Asterisk documentation place. - * Ship UPGRADE-{10,1.8,1.4,1.2}.txt in asterisk-doc. - * Do not ship app_meetme.so and app_dahdibarge.so, deprecated by upstream. - - Also remove them from asterisk-dahdi's full description. - * Remove ASTSAFE_CONSOLE and ASTSAFE_TTY from asterisk.default, they aren't - being unused for a while now. - - [ Tzafrir Cohen ] - * Patch undeprecate: undeprecate meetme. - * increased compat level for debian/clean. - * Disable hardening for now. - * Convert rules to dh. - - Patch astdatadir: set datadir in /usr/share/asterisk instead of - using an environment variable. - * Patch pjproject: make pjproject optional. - - Patch bzero: Simplify applying the above, and fix an interface - stupidity inflicted by pjproject. - - get-orig-source: remove res/pjproject from the source tarball. - * debian/rules: switch to dh. - * Patches dahdi_create_channels, dahdi_pri_event_removed: backport dynamic - DAHDI support. - * Patch hyphen: hypen-minus fixes in asterisk.8 - * Patch astdb_man: Man pages for astdb2bdb and astdb2sqlite3. - - [ David Sarmiento ] - * Re-enabled pjproject - * Modified rules file to be able to build pjproject - * Updated build-deps - - -- Tzafrir Cohen Mon, 30 Sep 2013 21:28:22 +0300 - -asterisk (1:1.8.13.0~dfsg-1) unstable; urgency=high - - * New upstream release. - - AST-2012-007 (CVE-2012-2947): Fix IAX receiving HOLD without - suggested MOH class crash (Closes: #675204). - - AST-2012-008 (CVE-2012-2948): remote crash issue in chan_skinny - (Closes: #67521). - - Patch gmime2.6 removed: merged upstream. - - Patch sparc32_disable removed: hacks removed from Upstream Makefile. - * Also pass LDFLAGS to menuselect (Closes: #664086 for real). - * Fully strip-out the ilbc code (Closes: #665938, #665937). - - Patch ilbc_disable to fix the build. - * Patch httpd_port: Fix port number of Asterisk httpd. - * While we're at it: Closes: #606959, which is a non-issue. - - -- Tzafrir Cohen Wed, 16 May 2012 18:43:18 +0300 - -asterisk (1:1.8.11.1~dfsg-1) unstable; urgency=high - - * New upstream release, Closes: #670180: - - AST-2012-004 - further Manager permission fixes (CVE-2012-2414). - - AST-2012-005 - Heap overflow in chan_skinny (CVE-2012-2415). - - AST-2012-006 - Remote crash on SIP "UPDATE" method (CVE-2012-2416). - * Fix daemon status check in init.d script (Closes: #669378). - * Patch menuselect_cflags: allow passing our flags to menuselect's build. - - Use it t opass our CFLAGS to menuselect (Closes: #664086). - - -- Tzafrir Cohen Wed, 25 Apr 2012 12:19:06 +0300 - -asterisk (1:1.8.10.1~dfsg-1) unstable; urgency=low - - [ Victor Seva ] - * Update backports/squeeze script gmime2.6 -> gmime2.4 - - [ Tzafrir Cohen ] - * New upstrean bug-fix release. - - Fixes "[CVE-2012-1183 - CVE-2012-1184] Asterisk: AST-2012-002 and - AST-2012-003 flaws" (Closes: #664411). - * Patch gmime2.6 (Closes: #663998, #664004), also fixed Build-Depends. - * Remove the text of RFC 3951 from the tarball. (Closes: #665937) - - -- Mark Purcell Sat, 31 Mar 2012 08:44:57 +1100 - -asterisk (1:1.8.10.0~dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstrean release. - * Build-depend on sqlite3 as well (Closes: #531759). - - [ Paul Belanger ] - * debian/patch/chan_iax2-detach-thread-on-non-stop-exit: - - Dropped; merged upstream - - [ Mark Purcell ] - * New Release: - - Fixes "SHA-1 code is doesn't allow modification" (Closes: #643703) - - Fixes "Placing calls on hold fails with some IP phones" (Closes: #632518) - - Fixes "Pass the correct value to ast_timer_set_rate() for IAX2 - trunking." (Closes: #661974) - - Fixes "Call quality on IAX significantly worse than SIP" (Closes: #481702) - - Fixes "New upstream release: 1.8.2.2" (Closes: #610811) - - Fixes "asterisk german number pronunciation" (Closes: #402991) - - Fixes "Why using version 1.6.2.9 - it's not LTS" (Closes: #612147) - - Fixes "SRTP/ZRTP support for Asterisk" (Closes: #577686) - - Fixes "fails to register SIP channels on ARM" (Closes: #660240) - * export CFLAGS LDFLAGS - - Fixes "Hardening flags missing for menuselect" (Closes: #664086) - - Fixes "enable hardening options" (Closes: #542741) - - -- Mark Purcell Sun, 18 Mar 2012 16:47:35 +1100 - -asterisk (1:1.8.8.2~dfsg-1) unstable; urgency=high - - * New upstream release, fixes AST-2012-001 (Closes: #656596). - * Use CFLAGS and LDFLAGS from dpkg-buildflags (Closes: #653944). - - -- Tzafrir Cohen Fri, 20 Jan 2012 14:16:47 +0200 - -asterisk (1:1.8.8.0~dfsg-1) unstable; urgency=high - - [ Faidon Liambotis ] - * Fix Breaks/Conflicts to contain the epoch. - * Urgency high since this resulted in file conflicts when upgrading from - stable. - * Patch reenable-pri-optional: Backport a patch from upstream to fix - several PRI features being compiled-out and hence disabled. - * Bump libpri-dev dependency to 1.4.12; it is not strictly needed but extra - functionality is enabled at build-time. - - [ Tzafrir Cohen ] - * New upstream release. Closes: #651552. - - Patch reenable-pri-optional dropped: included upstream. - * Officially remove asterisk-h323: - - Break older versions, as it did not have a versioned Depends before. - - Remove the package. - * Update watch file to only check for 1.8.x tarballs. - * Quote pathes in postinst script: Closes: #656208 (Pocos). - - -- Tzafrir Cohen Wed, 18 Jan 2012 15:26:34 +0200 - -asterisk (1:1.8.7.1~dfsg-2) unstable; urgency=low - - * libncurses is a build dep afterall (Closes: #649431). - - -- Tzafrir Cohen Fri, 25 Nov 2011 16:44:31 +0200 - -asterisk (1:1.8.7.1~dfsg-1) unstable; urgency=high - - [ Tzafrir Cohen ] - * New upstream release (Closes: #647252): - - Patch refix_bashism removed: applied upstream. - - Patch openssl10 removed: applied upstream. - - Patch gmime-2.4 removed: applied upstream. - - Patch gcc46 removed - was a backport from upstream. - * Disable chan_h323: broken with current h323plus, and not loved by - upstream. - * Patch chan_iax2-detach-thread-on-non-stop-exit: Hopefully plugs a - memory leak. - * Patch reinclude_docs: a copy of the included documentation that was - removed. - * Patch sparc32_disable: Remove pointless optimization for sparc64 - - [ Paul Belanger ] - * Bump libpri-dev to 1.4.11. - * Ensure sub-packages with asterisk modules are the same version as the - binary. - - -- Tzafrir Cohen Fri, 11 Nov 2011 17:48:03 +0200 - -asterisk (1:1.8.4.4~dfsg-2) unstable; urgency=low - - * Don't mark en-gsm sound files as enabled, so they won't be downloaded. - - -- Tzafrir Cohen Mon, 04 Jul 2011 23:19:50 +0300 - -asterisk (1:1.8.4.4~dfsg-1) unstable; urgency=high - - * AST-2011-011 (CVE-2011-2536): Don't leak SIP username information - (closes: #632029) - * Clearly the NC-ND license for AST.{pdf,txt} is here to stay. Strip it. - - And while we're at at, strip out sound files and some generated files. - - -- Tzafrir Cohen Fri, 01 Jul 2011 11:51:45 +0300 - -asterisk (1:1.8.4.3-1) unstable; urgency=high - - * New upstream point release, fixes 3 remotely-explitables (of sort) bugs: - - AST-2011-008, CVE-2011-2529 (Closes: #631446) - - AST-2011-009 (Closes: #631445) - - AST-2011-010, CVE-2011-2535 (Closes: #631448) - - -- Tzafrir Cohen Fri, 24 Jun 2011 00:51:49 +0300 - -asterisk (1:1.8.4.2-1) unstable; urgency=low - - * New upstream point release: - - Fixes CVE-2011-2216 - AST-2011-007 (Closes: #629130). - * Patch gcc46: Fix the induced regression. - * Blacklist SRTP support on Sparc and hurd-i386 until SRTP available there. - - -- Tzafrir Cohen Fri, 03 Jun 2011 23:20:29 +0300 - -asterisk (1:1.8.4-1) unstable; urgency=low - - * New upstream release. - - Patch no_ssl2 removed: merged upstream. - * Remove unneeded dependency on voicemail modules - only leave Recommends - (Closes: #624190). - * Patch refix_bashism: bashism crept bact into the configure script - (Jilles Tjoelker). - * Fixes for kFreeBSD (Closes: #624569): - - Declare build-deps linux-any: libtonezone-dev, libvpb-dev, - libbluetooth-dev, libopenh323-dev, libcap[2]-dev, libstrp0-dev. - - Thus sub-packages asterisk-dahdi, asterisk-h323 and asterisk-mobile - are linux-any. - - And logic added to rules file not to copy their files on non-linux. - - Patch kfreebsd: Fix building with kFreeBSD. - - Patch no_uname: Fix building with kFreeBSD: an uglier patch. - * Patch gcc46: Some gcc-4.6 fixes from upstream. Get rid of some - build warnings. - - -- Tzafrir Cohen Mon, 16 May 2011 00:58:19 +0300 - -asterisk (1:1.8.3.3-1) unstable; urgency=high - - [ Tzafrir Cohen ] - * Switching to branch 1.8 - (Closes: #610487, #614580, #618790, #618791, #623775). - * Patch parser-mangles-include dropped: merged upstream. - * Patch dahdi-fxsks-hookstate dropped: merged upstream. - * Patch dahdi_ptmp_nt dropped: silly hack no longer needed. - * Patch dahdi_pri_debug_spannums dropped: merged upstream. - * Patch moh_datadir dropped: merged upstream. - * Patch settings_show_dirs dropped: merged upstream. - * Patch man_hyphen dropped: merged upstream. - * Patch typos dropped: merged upstream. - * Patch rtcp_cli_fix dropped: merged upstream. - * Sound files: version 1.4.20 - * Separate sub-package asterisk-modules to avoid multiarch issues. - * Extra sub-package asterisk-dahdi for the dahdi modules (Closes: #590558). - * As of 1.8.1, AST.pdf and AST.txt are generated from the wiki. - - And thus no need for rubber at build time (Closes: #531551). - * Separate sub-packages for voicemail backends: - - asterisk-voicemail{,-{imap,odbc}storage} - - And rename the modules accordingly. - * asterisk-mysql, asterisk-mobile, asterisk-mp3, asterisk-ooh323: - - asterisk-addons was merged into Asterisk. - - Patch enable_addons: do build those modules. - - Also app_saycountpl, which will go into the mian package. - - Patch mpglib: mpglib from asterisk-addons, originally. - * Patch gmime-2.4: fixes building with gmime 2.4 (Closes: #549054). - - Requires re-generating configure script. - * Patch openssl10: Fix detection of openssl 1.0. - * Patch no_ssl2: Don't require client-side SSL2 support. - * include menuselect.makeopts in the docs directory - let us know what - modules were not built. - * Bump Standards version to 3.9.2.0 (no change needed). - * Upstream prefers chan_ooh323 to chan_h323. Suggest asterisk-ooh323. - * Drop asterisk-sounds-main: we already have that functionality the - asterisk-core-sounds packages. - * Recommend a moh (music-on-hold) package to have music played on hold. - - [ Faidon Liambotis ] - * Switch to the "3.0 (quilt)" package source format. - - [ Paul Belanger ] - * Depend on libneon27-dev and libical-dev for calendar support. - * Depend on libsrtp0-dev for SRTP support. - * When compiling with DEB_BUILD_OPTIONS="debug" enable native Asterisk - debugging tools. Specifically DONT_OPTIMIZE, DEBUG_THREADS and - --enable-dev-mode. - * Regardless of which asterisk-voicemail-* is installed (each package - conflicts on each other), the name of the module is now - app_voicemail.so. - * Fix a bug with app_voicemail-*.exports.in not being copied properly. - - -- Tzafrir Cohen Mon, 25 Apr 2011 21:46:51 +0300 - -asterisk (1:1.6.2.9-2) unstable; urgency=high - - [ Tzafrir Cohen ] - * Bump Standards version to 3.9.0 (no change needed). - * rtcp_cli_fix: Backport a silly CLI parsing issue. (Closes: #589736) - * Patch typos: fix a few typos in the source. - * Patch man_hyphen: fix hyphen/minus issues in man pages. - * Remove useless binaries aelparse, conf2ael and muted. - - [ Faidon Liambotis ] - * Change the way that we read include files, to accommodate for changes - in GCC 4.4. Taken from upstream's SVN, thanks to Peter Allgeyer for the - patch and Stefan Bauer for preparing an upload. (Closes: #594190) - * Set urgency high for a squeeze-targetted RC bug-fixing upload. - - -- Faidon Liambotis Tue, 07 Sep 2010 21:52:54 +0300 - -asterisk (1:1.6.2.9-1) unstable; urgency=low - - * New upstream release (Closes: #585156). - - Patch dahdi_fxs_false_ringing removed: merged upstream. - - Patch fxs_ports_1626 removed: merged upstream. - * Fix dependencies so we start after named and such (Closes: #433779). - * Do use libresample (app_jack, codec_resample). - - -- Tzafrir Cohen Tue, 29 Jun 2010 23:53:28 +0300 - -asterisk (1:1.6.2.7-1) unstable; urgency=low - - * New upstream release - * Add Build-Depends: libsqlite0-dev | libsqlite-dev - * Included upstream: followme_prompts sqlite3_func_rename - - -- Mark Purcell Wed, 05 May 2010 23:36:52 +1000 - -asterisk (1:1.6.2.6-2) unstable; urgency=low - - * Also depend on openr2. - * Patch fxs_ports_1626: fixes regression when building with openr2 support. - - -- Tzafrir Cohen Wed, 21 Apr 2010 20:12:34 +0300 - -asterisk (1:1.6.2.6-1) unstable; urgency=low - - * New upstream release. - - Fixes AST-2010-003 - CVE-2010-1224 (Closes: #576560). - * Patch h323-fix-makefile dropped: merged upstream. - * Patch safe_asterisk-config: Mostly merged upstream. - * Patch moh_datadir: Make the datadir the default base for moh files - if a relative path is used. - * Patch dahdi-fxsks-hookstate: a newer version. - * sounds/en/ is now an alternative. English sounds installed to - en_US_f_Allison . - * Removed empty es/ and fr/ directories under sounds/ - * Patch settings_show_dirs: display the user values of more configurable - items. - * Patch dahdi_fxs_false_ringing: Fix having Astribank FXS-s keep ringing if - answered too soon. - * Patch followme_prompts: set proper vars when reading followme.conf - * Patch sqlite3_func_rename: Avoid issues with the name sqlite3_log . - * Patch h323-extra-target: Allow manuallly generate channels/h323/Makefile.ast - * And use it to generate the file before building, as otherwise some libs - are missing from the link command, resulting in chan_h323.so load fail. - - -- Tzafrir Cohen Sat, 10 Apr 2010 21:18:39 +0300 - -asterisk (1:1.6.2.2-1) unstable; urgency=medium - - [ Faidon Liambotis ] - * Relax Debian revision parsing regexp in debian/rules to help with parsing - derivatives (e.g. Ubuntu) and backports.org revisions. - * Urgency medium because of a security fix upload. - * Bump Standards-Version to 3.8.4, no changes needed. - * Add ${misc:Depends} on all packages; no functional change, just makes - lintian happier. - * Use $remote_fs instead of $local_fs in init script's Required-{Start,Stop} - since we use /usr. Thanks lintian! - - [ Tzafrir Cohen ] - * New upstream release. Fixes CVE-2010-0441 (AST-2010-001). - * Patch sound_files: configure asterisk not to download the new MoH files. - * Move sound files tarball to a safe place, as the patch we used to - protect them is aparantly not in effect at clean time. - - -- Faidon Liambotis Sun, 07 Feb 2010 15:13:47 +0200 - -asterisk (1:1.6.2.0-1) unstable; urgency=low - - * New upstream release. - * Use DEP3 to tag all of our patches and their merge status. - - -- Faidon Liambotis Mon, 21 Dec 2009 06:19:38 +0200 - -asterisk (1:1.6.2.0~rc7-1) unstable; urgency=high - - * New upstream release candidate. - - Fixes RTP comfort noise issues: CVE-2009-4055 (Closes: #559103). - - -- Tzafrir Cohen Wed, 02 Dec 2009 20:47:02 +0200 - -asterisk (1:1.6.2.0~rc6-1) unstable; urgency=low - - * New upstream release candidate. - - Drop paches/AST-2009-007, included upstream. - - Drop patches/configure-armel, merged upstream. - - Fixes security-related information leak (SIP responses expose valid - usernames), fixes AST-2009-008. (Closes: #554487) - * Switch to the "3.0 (quilt)" package source format. - * Create the /usr/share/asterisk/agi-bin directory. (Closes: #463983) - * Stop shipping the refcounter tool since the required debugging - compile-time switch is not enabled in our builds. - - -- Faidon Liambotis Mon, 16 Nov 2009 06:10:10 +0200 - -asterisk (1:1.6.2.0~rc3-2) unstable; urgency=high - - [ Faidon Liambotis ] - * Really ship MoH sounds, as mentioned in the rc1 upload. - * Move dahdi to Should-Start instead of Required-Start in the init script. - (Closes: #552604) - * Security fix: "ACL check not present for verifying SIP INVITEs", - AST-2009-007. (Closes: #552756) - * Urgency high because of security fix upload. - - [ Tzafrir Cohen ] - * Add a sample startup init script. Not installed. - * Add mysql and postgresql to Should-Start/Stop: Asterisk may use them - in real-time mode. - - -- Faidon Liambotis Thu, 29 Oct 2009 21:38:55 +0200 - -asterisk (1:1.6.2.0~rc3-1) unstable; urgency=low - - * New upstream RC. - - Session timer is not activated if Supported header field in INVITE has - both "timer" and other option(s) (Closes: #552336) - - Adapt patches/hack-multiple-app-voicemail. - * Switch from libreadline5-dev to libreadline-dev build dependency. - * Switch from libc-client2007b-dev to libc-client2007e-dev build dependency. - * No need for repacking anymore; upstream removed the last piece of non-free - material (IAXy's firmware) from the tarball upon our request. - Thanks Digium! - * Remove patches/debian-banner, no need to warn users to use our BTS - anymore as we don't diverge that much nowadays. - * Multiple fixes to init script: call 'core stop now' instead of 'stop now', - kill the canary on stop, don't print the banner on start. - * Temporarily remove OSP support, Asterisk needs a new version (3.5) that - isn't yet in Debian. - * Add sox to Recommends, used by res_monitor. - * Remove ekiga, ohphone, twinkle, kphone from Suggests. - * Cleanup the documentation provided in the asterisk-doc package. - (Closes: #499215) - * Cleanup cruft present in diff.gz after a double build. - * Stop shipping old static-http code in examples. Among other things, it - includes a vulnerable version of the prototype Javascript library. - * Remove obsolete debian/backports/{etch,edgy,feisty}. - - -- Faidon Liambotis Mon, 26 Oct 2009 02:03:45 +0200 - -asterisk (1:1.6.2.0~dfsg~rc1-1) unstable; urgency=low - - [ Faidon Liambotis ] - * New upstream release. - - Fixes CVE-2009-2726 aka AST-2009-005 (Closes: #541441). - - Ship CC BY-SA 3.0 licensed music-on-hold sounds, replacing the old - non-free FreePlay Music that were never distributed by Debian. - - Removed patches/makefile_appdocs_dtd (merged upstream) and - patches/disable_moh (obsoleted, see above). - * Fix FTBFS on armel. (Closes: #532971) - * Bump Standards-Version to 3.8.3, no changes needed. - * Provides: asterisk-1.6.2, instead of 1.6.1; there are no ABI gurantees - between 1.6.x releases. - * Remove references of Section: comm in individual binary packages as it is - inherited from the source package. - - [ Tzafrir Cohen ] - * Patch hardware_dtmf_mute_fix removed: Applied upstream. - * No need for a separate app_directory_odbc (will use app_voicemail_odbc). - * Fix name of voicemail 'openssl' dep. (Thomas Renard) (Closes: #539150) - * Patch AST-2009-006: breaks IAX2 compatibility, note it in NEWS.Debian. - (Closes: #539473) - - -- Faidon Liambotis Sun, 13 Sep 2009 02:22:17 +0300 - -asterisk (1:1.6.2.0~dfsg~beta3-1) unstable; urgency=low - - [ Faidon Liambotis ] - * New upstream release. - - Drop patches astvarrundir, pubkey_jnctn; merged upstream (finally!). - - Adapt patch safe_asterisk-nobg. - * Switch to downloads.asterisk.org instead of downloads.digium.com. - * Add depends on libxml2-dev for the new XML documentation. - * Remove Conflicts/Replaces with asterisk-classic, asterisk-bristuff, - asterisk-chan-capi (<< 1.1.1-1~), since those are pre-lenny. - * Revert upstream's r190830 that ported app_osplookup to OSP Toolkit 3.5; - the API is not backwards compatible and Debian still has 3.4.2. - * Accommodate for the rename of libcap2-dev to libcap-dev (Closes: #532971). - * Add dependency to libspandsp to build the fax applications. - * Update Standards-Version to 3.8.2, no changes needed. - * Remove init script's "zaptel-fix" action; there's no zaptel anymore and - was also lintian-buggy in its current form. - * Don't include /var/run/asterisk in the package, it is created at boot-time - by the init script (thanks lintian). - * Remove asterisk-progdocs: it is of very limited use but a) is enormous in - size and b) takes too long to build. - * Re-enable and port to 1.6 the h323 segfault patch, apparently it's still - needed. - * Fix asterisk's Makefiles so that the openh323/libpt dependencies are added - to chan_h323.so instead of the main asterisk binary. - * Fix astgenkey to respect system's umask. Thanks Jonas Smedegaard. - (Closes: #531730) - * Create /var/log/asterisk/* directories if non-existent, for /var/log on - tmpfs scenarios. Thanks martin f krafft! (Closes: #524015) - * Use the lsb-base standard way of gathering and reporting status in the - init script. Thanks Dustin Kirkland and Ubuntu! (Closes: #506453) - * Fix debian/rules so that configure isn't called twice during a build. - * Install Zaptel-to-DAHDI.txt, explains the migration procedure from Zaptel - to DAHDI and is therefore useful when upgrading from lenny. - - [ Tzafrir Cohen ] - * New upstream release. - - Fixes that bashism in safe_asterisk (Closes: #530047) (not dashism). - - Dropped patch astcanary_startup: merged upstream. - * Patch makefile_appdocs_dtd: fix location of DTD installation. - * Register the HTML docs with doc-base as well. - - -- Faidon Liambotis Tue, 28 Jul 2009 03:42:54 +0300 - -asterisk (1:1.6.1.0~dfsg-1) unstable; urgency=low - - * New upstream release (Closes: #522528). - - [ Tzafrir Cohen ] - * Depend explicitly on dahdi. - * Patch apptest_sleep dropped: merged upstream. - * Patch libtonezone_libm dropped: merged upstream. - * Patch h323-make-fix dropped: merged upstream. - * Use upstream's asterisk.conf rather than our bogus one. - * Also add the version-specific release summary. - * Patch dahdi_ptmp_nt: (not really) chan_dahdi PtMP NT support - (Kristijan Vrban). - * Patch dahdi_pri_debug_spannums: add span number in PRI trace. - * Patch astcanary_startup: Avoid a false death of the canary - (Closes: #528497). - * Patch hardware_dtmf_mute_fix: Fix muting of DAHDI channels with hardware - DTMF detection. - - -- Mark Purcell Wed, 20 May 2009 08:00:23 +1000 - -asterisk (1:1.6.1.0~dfsg~rc3-1) experimental; urgency=low - - [ Tzafrir Cohen ] - * Experimental 1.6.x branch. - * Remove bristuff for now. - * Also drop zap-fix-deadlock and zap-fix-cause34 that are in bristuff code. - * And likewise the example agi/xagi-test.c . - * Drop patch silence-buildsum-warning - a legitimate change for 1.6.x . - * Refresh patch debian-banner. - * Slightly rework patch hack-multiple-app-voicemail - * Drop patch h323 fixes as they fails and I don't fully understand them. - * drop patch func_devstate: was backport from 1.6. - * drop patch feature-bridge: was backport from 1.6. - * Drop vpb-handle-nocards that is not needed anymore. - * Patch disable_moh: Disable MOH file through the XML spec. - * Don't do ant makeopts manipulation in the rules, as makeopts gets - regenerated when running 'make install', rendering build-*-stamp - useless. - * Patch libtonezone_libm: libtonezone requires -lm . - * Separate API documentation to the progdoc package. - * Move configuration files to the doc package, as they are reference. - * Include the new asterisk.pdf . - * Depend on libgmime: allows uploads in the built-in httpd. - * Depend on libjack. Though app_jack also depends on libresample. - * Depend on liblua: For pbx_lua (dialplan in lua). - * Depend on libss7 and newer libpri (1.4.7) for latest chan_dahdi abilities. - * Depend on libtonezone from dahdi (ver. 2.0). - * Includes fix for AST-2009-001 (Closes: #513413). - * Remove hashtest and hashtest2: debugging utilities. - * Patch zap-fix-timing-source removed: Problem fixed. - * Build-Depends on libopenais-dev (for res_ais.so) - * Build-Depends on libosptk3-dev (for app_osplookup.so) - * Patch dahdi-fxsks-hookstate: Fix FXO dialout issue. - * Patch h323-make-fix: No, we should not need to run 'make' twice. - - [ Victor Seva ] - * Drop patch misdn_FOP. Applied upstream (r112521 branches/1.6.0/). - - [ Mark Purcell ] - * Update debian/watch - * asterisk-dbg -> Section: debug - - -- Mark Purcell Sun, 29 Mar 2009 22:21:47 +1100 - -asterisk (1:1.4.21.2~dfsg-3) UNRELEASED; urgency=low - - * Bumped Standards-Version to 3.8.0. - - -- Patrick Matthäi Wed, 8 Oct 2008 21:39:31 +0200 - -asterisk (1:1.4.21.2~dfsg-2) unstable; urgency=low - - [ Victor Seva ] - * support DEB_BUILD_OPTION noopt used to produce non-optimized builds. - (Closes: #492941). - * Depend on libcap2-dev instead of libcap-dev because libcap1 is no longer - maintained upstream. Thanks to Torsten Werner . - (Closes: #492620). - * Backport script fixes: - - Depend on debhelper >=5 on backport etch script. - - replace libcap2-dev by libcap-dev. - - remove lib-client2007b-dev. (Closes: #494405) - - [ Tzafrir Cohen ] - * Patch chan_zap so that asterisk starts even without a Zaptel timing - source. (Closes: #491310) - - [ Lionel Elie Mamane ] - * /etc/default/asterisk: Bring comments on AST_DUMPCORE_DIR in sync with - reality of implementation in /etc/init.d/asterisk. Change suggested - CORE_PATTERN to more secure ones. - * /etc/init.d/asterisk: Use the value of AST_DUMPCORE_DIR if it is a - directory, not if the value if DUMPCORE_DIR is a directory. - - [ Faidon Liambotis ] - * Backport a patch from Xorcom's tree fixing a deadlock situation caused - by the bristuff patch. (Closes: #493055) - * Backport a patch from Xorcom's tree fixing an occasional "Cause 34" error - on BRIs. - * Don't write /root/.asterisk_history when stopping asterisk with the init - script. (Closes: #500294) - * Eliminate warnings when calling some actions of the init script by - replacing obsolete asterisk commands with their newer counterpart. - - -- Faidon Liambotis Sat, 04 Oct 2008 01:21:40 +0300 - -asterisk (1:1.4.21.2~dfsg-1) unstable; urgency=high - - [ Victor Seva ] - * asterisk.postinst should always check group memberships (Closes: - #486097) patch by Tim Retout - * changed libc-client2007-dev to libc-client2007b-dev on Build-Depends - (fixes FTBFS). - - [ Tzafrir Cohen ] - * Depend on debhelper >= 6.0.7 due to dh_lintian (Closes: #492202). - * New upstream bugfix release. Fixes CVE-2008-3263 and CVE-2008-3264. - - [ Faidon Liambotis ] - * Do a quilt refresh on all patches. - * Remove the dh_makeshlibs call as it is unneeded and generates a lintian - warning. - - -- Faidon Liambotis Thu, 24 Jul 2008 19:51:20 +0300 - -asterisk (1:1.4.21.1~dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstream bugfix release. - * Fix get-orig-source target to remove temporary files left in that tarball. - * The asterisk.h symlink moved to asterisk-dev where it should be. - - [ Mark Purcell ] - * asterisk-dev Replaces: asterisk (<< 1:1.4.21.1~dfsg-1) - * lintian cleanup: debian-copyright-line-too-long - * Call dh_lintian lintian-cleanup: package-contains-empty-directory - - -- Mark Purcell Wed, 16 Jul 2008 21:14:10 +1000 - -asterisk (1:1.4.21~dfsg-1) unstable; urgency=low - - * New upstream release. - * bison no longer needed to build Asterisk (Since 1.4.0). - * Patch armel_support applied upstream. - * Patches bristuff/zapata-gsm and bristuff/zapata-bri+euroisdn adjusted to - chan_zap changes (conf became a pointer in mkintf). - - -- Tzafrir Cohen Thu, 12 Jun 2008 21:30:40 +0300 - -asterisk (1:1.4.20~dfsg-1) unstable; urgency=low - - [ Victor Seva ] - * Patch sample files pointing now to the correct doc files. (Closes: #475681) - * Added support for armel, thanks to Riku Voipio. (Closes: #477389) - * Added asterisk-config.dirs in order to create etc/asterisk/manager.d dir, - and added a README.conf on it on rule install-indep. - - [ Tzafrir Cohen ] - * Provide /usr/include/asterisk.h as well (through a symlink). - * Remove {,} bashism from debian/rules (Closes: #478361). - - [ Faidon Liambotis ] - * New upstream version. - - Fix IAX performance issues introduced by security fix in 1.4.19.1 - - Dropped patches samples, vpb-driver-4.2.18, vpb_no_cards, incorporated - by upstream. - * Update to bristuff-0.4.0-RC1: - - Revert API changes to res_agi (xagi). - - Revert API changes to ast_sendtext() (ast-send-message). - - Merge several chan_zap changes (zapata-bri+euroisdn, zapata-gsm). - - Remove unused zapata-device-state, feature-parking_con, find-feature, - chan-capi, ast_channel_masquerade_locked, find-feature patches, - obsoleted by upstream. - - Remove uniqueid-01-use-pid-on-uniqueid-generation patch, dropped by - upstream. - - Rename app-zapras-fix-audiomode to isdn-fixes and include another fix - that we dropped earlier by mistake (r5162). - - Merge ast-send-message with ast-send-message-users, following upstream - split. - - Other minor and cosmetic fixes. - - Comment-out the only use of ast-send-message (in GSM) to avoid an ABI - change. We are not shipping GSM, hence this is not a feature regression. - * Conflict with asterisk-chan-capi << 1.1.1-1 which we broke with an ABI - change :( (Closes: #472379). - * Drop doc-base entries for sip.conf and zapata.conf, there was no point in - just listing those two configuration files. - * Remove -1 revision dependency on libpri and libopenh323-dev. - * Override some lintian warnings for asterisk (empty IAX firmware and - static-http directories) and asterisk-sounds-main (empty MOH and es/fr - sounds directories). - - -- Faidon Liambotis Sat, 07 Jun 2008 19:18:56 +0300 - -asterisk (1:1.4.19.1~dfsg-1) unstable; urgency=low - - [ Faidon Liambotis ] - * New upstream release. - - Dropped configure-libc-client, incorporated upstream. - - Adapted bristuff patches uniqueid-10-channel-ops-uniqueid, - uniqueid-30-app-chanspy, zapata-bri+euroisdn. - - Fixes CVE-2008-1897 / AST-2008-006 (Closes: #477472). - * Build with -O2 instead of the default -O6 (bug introduced in - 1.4.18~dfsg-1). - * Depend on libspeexdsp-dev because of the use of preprocessor features, - which were split from libspeex >= 1.2. - - FTBFS: codec_speex.c:99: error: expected specifier-qualifier-list - before 'SpeexPreprocessState' (Closes: #474789) - - Asterisk fails to install due to broken libspeex dependency - (Closes: #477086) - - [ Lionel Elie Mamane ] - * debian/rules: fix get-orig-source to actually work - * Fix genastkey so that keys are not world-readable by default. - - [ Tzafrir Cohen ] - * Watching downloads.digium.com directly again. - * Patch apptest_sleep: A woraround for TestServer fail on SEND DTMF 8. - - -- Mark Purcell Wed, 23 Apr 2008 22:50:35 +1000 - -asterisk (1:1.4.18.1~dfsg-1) unstable; urgency=high - - * New upstream release. - - Fixes a vulnerability in the RTP codec payload type handling - (AST-2008-002, CVE-2008-1289). - - Fixes a critical vulnerability that could be exploited to bypass SIP - authentication (AST-2008-003, CVE-2008-1332). - - Fixes a potential DoS vulnerability in the Manager interface - (AST-2008-004, CVE-2008-1333). - * Urgency high because of critical security fixes. - - -- Faidon Liambotis Wed, 19 Mar 2008 00:49:17 +0200 - -asterisk (1:1.4.18~dfsg-1) unstable; urgency=low - - [ Faidon Liambotis ] - * Update debian/copyright (packaging copyright, formatting etc.) - * Remove workaround for gcc ICE on hppa (#445336), since apparently that has - been fixed. - * Do not provide asterisk-classic/asterisk-bristuff, we don't want to - satisfy those dependencies anymore. - * Provide asterisk-1.4 virtual package, so that all reverse-dependencies - that use 1.4's ABI can depend on that. - * Switch asterisk-h323 to the new asterisk-1.4 dependency. - * Remove libc-client-dev dependency since it is satisfied in etch by a - version (2002) incompatible to the one that works. (Closes: #465524) - * Backport upstream's patch for chan_vpb to avoid crashes when no - VoiceTronix cards are present. (Closes: #466729) - * Backport feature Bridge from 1.6, thanks to Jon Webster. (Closes: #458475) - - [ Tzafrir Cohen ] - * New upstream release. - * Break bristuff BRI/EuroISDN patch: - - zapata_num_spans - already accepted by upstream. Independent of libpri - bristuff patch. - - zapata-bri+euroisdn - now does not depend on most bristuff interface - changes. But lacks: - - zapata_euroisdn_holded - Support for putting an ISDN phone on hold. - Depends on some other bristuff patches, and adds another interface change. - * patch use-libpri-bristuffed right next to zapata-bri+euroisdn, as - zapata-bri+euroisdn depends on it to build. - * patch tos-libcap remeved: merged by upstream. - * Adjusted patch bristuff/ast-device-state-CID to Asterisk 1.4.18. - - -- Faidon Liambotis Thu, 06 Mar 2008 04:32:33 +0200 - -asterisk (1:1.4.17~dfsg-2) unstable; urgency=low - - * Allow building vs. libc-client2007 (Closes: #458877). - - -- Tzafrir Cohen Thu, 03 Jan 2008 15:14:23 +0200 - -asterisk (1:1.4.17~dfsg-1) unstable; urgency=low - - * New upstream release. Fixes ASA-2008-001. - - -- Faidon Liambotis Thu, 03 Jan 2008 00:27:16 +0200 - -asterisk (1:1.4.16.2~dfsg-2) unstable; urgency=low - - * asterisk.init: fix start so that it works again. (Closes: #458022) - - -- Tzafrir Cohen Fri, 28 Dec 2007 02:46:38 +0200 - -asterisk (1:1.4.16.2~dfsg-1) unstable; urgency=low - - * New upstream release. (Closes: #457063) (Fixes CVE-2007-6430) - - Remove keep-1.4-abi, merged upstream. - - Adapt hack-multiple-app-voicemail, use-libpri-bristuffed, tos-libcap. - - Adapt bristuff patches app-dial-etc, chan-iax2-hangup-cause, - app-dial-priority-202, zapata-bri+euroisdn. - * Silence upstream's build sum warning but generate one on all modules so - that we can enable it at a later point. - * Make the init script's detection of a running daemon to be more precise. - * Bump Standards-Version to 3.7.3, no changes needed. - * Remove modem.conf on upgrades from 1.2 (i.e. etch). (Closes: #454332) - * Ressurect long-forgotten logrotate script. - - -- Faidon Liambotis Fri, 21 Dec 2007 22:38:03 +0200 - -asterisk (1:1.4.15~dfsg-1) unstable; urgency=low - - * New upstream release (Closes: #452054) - - Fix a potential corrupt of voicemail.conf on simultaneous PIN updates - (Closes: #353227) - - [ Tzafrir Cohen ] - * Add some sample/reference config files as documentation. - * Provide asterisk-bristuff for upgrading from Etch. - * Move libc-client to not be last, so debian/backports/xorcom.etch would - still work. - - [ Faidon Liambotis ] - * Really enable the libcap/ToS functionality; the previous patch didn't - enable the functionality, even though the code and the libcap.so - dependency were there. (Closes: #454342) - * Fix a minor issue with init script's stop target when running with - safe_asterisk. - * Add chan_vpb, adding support for VoiceTronix OpenSwitch and OpenLine - cards. (Closes: #396499) - * Fix debian/watch by using a pkg-voip wrapper to avoid upstream's silly - redirections. (Closes: #449706) - * Use DEBVERSION as asterisk's version string. - * Disable the MD5 build sum that breaks all out-of-tree plugins (duh!). - * Create /usr/local/share/asterisk/sounds to put all site-specific - non-modifiable sounds. - * Add a note about bugs.debian.org to the banner. - * Add noload for res_config_* since loading them results in errors and - doesn't provide any functionality. - * News entries were added but we never shipped the file; ship NEWS.Debian. - * Add an entry to NEWS.Debian warning users about app_voicemail_*.so - (Closes: #452596) - * Provide options in /etc/default/asterisk for configuring safe_asterisk. - (Closes: #381786) - - [ Tzafrir Cohen ] - * Provide a custom sounds directory under /var/lib - user-modifieble at - runtime and hence not under /usr. (Closes: #337209) - - -- Faidon Liambotis Thu, 06 Dec 2007 17:20:21 +0200 - -asterisk (1:1.4.13~dfsg-1) unstable; urgency=low - - * New upstream release. - - Implemented Dynamic DUNDi peering support (Closes: #439331) - - Removed merged patches: bashism-safeasterisk, ast_key_dir, - h323-add-missing-ptrace-guard, CVE-2007-4521. - - Adapted patches: make-clean-fixes, h323-no-deps-on-asterisk. - - Adapted bristuff 0.4.0-test4 to apply to 1.4.12 (bristuff.notice, - xagi, app-dial-c-callback, app-dial-priority-202) - * When DFSG-ing the tarball, create a fake codecs/ilbc/Makefile so that - make doesn't fail on clean. - * Pass NOISY_BUILD to make so that the GCC arguments can be examined in - build logs. - * Remove versioned dependency on dpkg-dev since that particular version is - present since etch (sarge is not supported as a backport target anymore). - * Backport a patch from trunk so that Asterisk can set the IP ToS bits when - it is run as a simple user (as we do). - * Re-enable IMAP support and enable ODBC support; this time they are - provided as app_voicemail_imap.so and _odbc.so so that they don't break - existing setups. - * Build with -O1 on hppa to workaround gcc-4.2 ICE (#445336). - * Zaptel package added support for Voicetronix OpenPCI cards, mention it on - asterisk's description. - - -- Faidon Liambotis Wed, 10 Oct 2007 22:18:16 +0300 - -asterisk (1:1.4.11~dfsg-4) unstable; urgency=low - - * Remove imap support to get back original files voicemail functionality. - * Fix comment in patches/bristuff/zapata-bri+euroisdn (by nickzxcv). - - -- Tzafrir Cohen Sun, 30 Sep 2007 15:12:09 +0200 - -asterisk (1:1.4.11~dfsg-3) unstable; urgency=low - - * Depend on libsnmp-dev instead of libsnmp10-dev. Fixes FTBFS - (Closes: #444322) - - -- Faidon Liambotis Fri, 28 Sep 2007 05:58:29 +0300 - -asterisk (1:1.4.11~dfsg-2) unstable; urgency=low - - [ Faidon Liambotis ] - * Depend on libpri-dev >= 1.4.1-1 for the bristuffed header. - (Closes: #439197) - * Added a 1.4 backport of the DEVSTATE() dialplan function which allows - retrieving any device state in the dialplan, as well as creating custom - device states that are controllable from the dialplan. - * Replace Build-Depends libc-client-dev (which wasn't used) with - libc-client2006j2-dev and enable Voicemail IMAP storage - (configure-libc-client). - * Build depend on libcurl4-openssl-dev instead of libcurl4-dev which is a - virtual package. This also means using the more complete OpenSSL libcurl - backend instead of the GnuTLS one. - * Add a versioned >= 1.4 dependency of asterisk in asterisk-h323. - * Don't use MAKEFLAGS as a variable in debian/rules since it has a special - meaning for make. Reported by Simon Richter. - * Add Homepage field, as supported by dpkg 1.14.6. - * Fix init.d stop when using safe_asterisk. (Closes: #376514) - * Drop asterisk-web-vmail package and place the script in - /usr/share/doc/asterisk. - * Move static-http and sample.call to asterisk's examples. - - [ Kilian Krause ] - * Update backports scripts for libcurl4*-dev - * Fix IMAP crash with upstream source snipplet. (Closes: #440187) - - [ Tzafrir Cohen ] - * Support increasing open files limit from init.d script. - - -- Faidon Liambotis Wed, 26 Sep 2007 13:32:01 +0300 - -asterisk (1:1.4.11~dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * Remove libgtk2.0-dev from Build-Depends since the GTK+ console was not - getting built anyway. - - [ Kilian Krause ] - * Add dpkg-dev (>= 1.13.19) to Build-Depends for binary:Version and - source:Version. - - [ Faidon Liambotis ] - * New upstream release. (Closes: #439062) - - AST-2007-020 Resource Exhaustion vulnerability in SIP channel driver - * Switch to quilt as a patch management system instead of dpatch. - * Add bristuff 0.4.0-test4 - - Split into smaller, individual patches (bristuff/). - - Mention HFC-S/HFC-4S support in the Description. - - Use libpri-bristuffed.so.1 and its respective header - (use-libpri-bristuffed). - - Ship xagi-test.c as an example. - - Add a news item to NEWS.Debian stating bristuff's inclusion. - * Major overhaul of the postinst scripts, completely replacing asterisk_fix. - - Create Asterisk's directories on asterisk.dirs to track them using dpkg. - - Add asterisk.postinst which calls adduser, chown, chmod. Improve error - handling. - - Don't do unnecessary stuff on asterisk-config postinst. - (Closes: #431506) - - chmod /etc/asterisk on build-time to allow the user to modify the - permissions; this required a lintian override. - - Honor dpkg-statoverride on all the chowned/chmoded directories and - configuration files under /etc/asterisk. - - Handle asterisk-config -> asterisk installation order properly - (Closes: #408708) - - Don't add asterisk user to audio and dialout groups if existed before. - This allows the administrator to remove the membership. - - Don't depend on adduser from asterisk-config. - * Remove Suggests to gnomemeeting (it's a dummy package nowdays), - asterisk-rate-engine and add one for twinkle. - * Remove Conflicts for an old version of asterisk-oh323 which was only - present until sarge. - * Remove versioned dependencies on ancient (pre-sarge) versions of sed and - adduser. - * Patch channels/h323/ast_h323.cxx to add some missing PTRACING #ifdef - (h323-add-missing-ptrace-guard). - * h323-workaround-openh323-segfault patch: workaround a libopenh323 bug - (#438815) which causes Asterisk to segfault on startup. (Closes: #435146) - * Remove -XCVS from dh_installexamples arguments. Upstream doesn't use CVS - anymore. - * Add a README.Debian for asterisk-h323 that explains the differences - between the different H.323 channel drivers, taken from the asterisk-oh323 - package. - * Clarify asterisk-h323's description and mention the other channel drivers. - * Suggest asterisk-h323 from asterisk. - - -- Faidon Liambotis Wed, 22 Aug 2007 20:55:12 +0300 - -asterisk (1:1.4.10~dfsg-1) unstable; urgency=low - - * New upstream release - - Fwd: [asterisk-announce] ASA-2007-019: Remote crash vulnerability in - Skinny channel driver (Closes: #436808) - - [ Mark Purcell ] - * debhelper(1) states Build-Depends: debhelper (>= 5) - - aids backports - * Update debian/backports for etch, edgy, dapper and feisty - - http://status.buildserver.net/packages/status.php?package=asterisk&subdist=pkg-voip - - [ Faidon Liambotis ] - * Refer to /usr/share/common-licenses/GPL-2 instead of GPL. The code is - -for now- GPLv2-only and in light of GPLv3, pointing to GPL is misleading. - * Add ast_key_dir patch to move keys from /var/lib/asterisk/keys to - /usr/share/asterisk/keys where they should be. - * Actually ship keys, including Junction Networks' by fixing pubkey_jnctn - patch. - * Handle space/newline-delimited directories on /etc/asterisk when doing - chmod on postinst. - * Correct descriptions of packages in debian/control, adapting them to the - present and correcting some spelling mistakes. (Closes: #428671) - * Add a noload directive for cdr_sqlite.so in the default modules.conf since - it writes unconditionally to the database file without being rotated, - resulting in unexpected waste of disk space. (Closes: #301883) - * Delete duplicated creation of /var/run/asterisk in the init script. - - -- Mark Purcell Thu, 09 Aug 2007 22:47:00 +0100 - -asterisk (1:1.4.9~dfsg-1) unstable; urgency=high - - [ Tzafrir Cohen ] - * New upstream release. - - ASA-2007-018 - DoS Resource Exhaustion vulnerability in IAX2 - - [ Faidon Liambotis ] - * Add myself to Uploaders. - * Fix "debian/rules clean" to cleanup correctly the tree by calling "make - distclean" instead of "make clean". Also, fix some stuff in the upstream - Makefiles (debian/patches/make-clean-fixes). Fixes a lintian warning. - * Add XS-Vcs-Svn and XS-Vcs-Browser to debian/control. - * Move examples from all packages (debian/examples) to asterisk-config only. - * Add eagi-test.c, eagi-sphinx-test.c, fastagi-test and static-http to - examples. - * Remove Conflicts/Replaces/Depends to pre-sarge versions, they're useless - even for backports. - - [ Mark Purcell ] - * Include asterisk.init changes from Martin - - Asterisk does not create /var/run/asterisk directory if not existent - (Closes: #413541) - * Backout asterisk-h323 Suggests:/ Recommends: asterisk-oh323. The former - works, the latter does not with asterisk-1.4.x - * Upstream fixes from 1.4.x branch: - - Multiple security flaws in Asterisk (Closes: #421467) - - Debug switch wrong in /etc/default/asterisk (Closes: #413544) - - Upgrading destroys astdb (Closes: #354132) - - Upgrading destroys astdb (Closes: #354132) - - asterisk bindaddr in sip and iax config is to fixed ip not - Interfaces (Closes: #316443) - - Incorrect callerid syntax in sip.conf causes incorrect error - (Closes: #323275) - - dropouts (Closes: #335079) - - Does not include cdr_sqlite userfield support by default (Closes: - #344097) - - Asterisk crashes on sparc when playing 'demo-moreinfo' - (Closes: #344484) - - fresh install - crash after dialing IAX test (Closes: #350001) - - asterisk_fix script fails to set variables for adduser, user - creation fails (Closes: #383075) - - Debug switch wrong in /etc/default/asterisk (Closes: #413544) - - When using L option on Dial, instead of warning asterisk disconnects - the call (Closes: #419894) - - Patch for fastagi handling (Closes: #368948) - - bristuff patch breaks cause codes in Hangup() (Closes: #320350) - * add debian/patches/basim-safeasterisk.dpatch - - contrib/scripts/safe_asterisk should explicitly link to a cli - (Closes: #413543) - * Adding a restart when convenient in Asterisk (Closes: #413816) - * asterisk-h323: libpt.so.1.10.2 => not found (Closes: #434076) - - -- Mark Purcell Thu, 26 Jul 2007 16:52:29 +0100 - -asterisk (1:1.4.8~dfsg-2) unstable; urgency=low - - * Add patch from Faidon debian/patches/dbug433884.dpatch: - - Should not depend on libopenH323, libpt, libSDL, libssl, libldap, - ... (Closes: #433884) - - Fails to restart after upgrade due to dep on libpt.so.1.10.2 - (Closes: #434066) - - -- Mark Purcell Sat, 21 Jul 2007 11:41:01 +0100 - -asterisk (1:1.4.8~dfsg-1) unstable; urgency=high - - * New upstream release - - ASA-2007-017: Remote crash vulnerability in - STUN implementation (Closes: #433681) - * Urgency high for remote crash vulnerability - * Updated standard version to 3.7.2 . - - -- Mark Purcell Wed, 18 Jul 2007 20:51:46 +0100 - -asterisk (1:1.4.6~dfsg-1) unstable; urgency=low - - [ Mark Purcell ] - * CVE-2007-2488 was addressed 1:1.4.5~dfsg-1 - * CVE-2007-1595 was addressed 1:1.4.0~dfsg-1 - - [ Tzafrir Cohen ] - * New upstream release. - * Added asterisk-dbg for debugging symbols. - * Updated priorities of some packages. - * Updated list of supported hardware in description. - - -- Mark Purcell Wed, 04 Jul 2007 18:31:00 +0100 - -asterisk (1:1.4.5~dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstream release. - - [ Mark Purcell ] - * Debconf7 Release :-) - * Build-Depends: libpq-dev - - obsolete build dependency postgresql-dev (Closes: #389376) - - -- Mark Purcell Mon, 18 Jun 2007 10:18:13 +0100 - -asterisk (1:1.4.4~dfsg-3) unstable; urgency=low - - * Build-Depends: libcurl4-dev | libcurl-dev - - uninstallable due to dependancy on libcurl3 (Closes: #426393) - - -- Mark Purcell Sat, 02 Jun 2007 10:52:05 +0100 - -asterisk (1:1.4.4~dfsg-2) unstable; urgency=low - - * Missing debian/changelog entries - * Upstream calls make twice to build h323, copy in debian/rules - - Asterisks chan_h323 doesn't work because of an undefined symbol - (Closes: #421552) - * Cleanup debian/patches - * chmod +x asterisk-fix - - Setting up asterisk (1.4.3~dfsg-1) -> id: asterisk: No such user - (Closes: #422237) - - -- Mark Purcell Thu, 17 May 2007 07:35:30 +0100 - -asterisk (1:1.4.4~dfsg-1) unstable; urgency=low - - * New Upstream Release - - Fix a crash in chan_zap - - Fix some cases where IAX2 calls would get dropped - - Merge a re-write of channel group counting support that fixes a lot of - issues - - Fix some DTMF issues related to the use of chan_agent - - Fix a crash that occurs when using dialplan functions to set global - variables - - -- Mark Purcell Wed, 25 Apr 2007 18:11:44 +1000 - -asterisk (1:1.4.3~dfsg-1) unstable; urgency=high - - * Urgency high as this fixes a number of Asterisk Security Advisories (ASA) - - * New upstream release - - [asteriskteam@digium.com: [asterisk-announce] ASA-2007-011: Multiple - problems in SIP channel parser handling response codes] (Closes: - #420864) - - [asteriskteam@digium.com: [asterisk-announce] ASA-2007-012: Remote - Crash Vulnerability in Manager Interface] (Closes: #420866) - - [asteriskteam@digium.com: [asterisk-announce] ASA-2007-010: Two - stack buffer overflows in SIP channel's T.38 SDP parsing code] - (Closes: #420868) - - CVE-2007-1594: Asterisk segfaults upon receipt of a certain SIP - packet (SIP Response code 0) (Closes: #419820) - - * Update debian/NEWS to broadcast the demise of bristuff - * Asterisk-classic, asterisk-bristuff are depreciated - - asterisk has circular Depends on asterisk-bristuff|asterisk-classic - (Closes: #384674) - * Ship UPGRADE.txt and refer to it in debian/NEWS - - UPGRADE.txt cannot be found in any package (Closes: #419164) - - -- Mark Purcell Wed, 25 Apr 2007 16:47:31 +1000 - -asterisk (1:1.4.2~dfsg-5) unstable; urgency=low - - * Bump Build-Depends: libsnmp10-dev | libsnmp-dev - * Only ship default/asterisk in asterisk package - - Asterisk-config and asterisk 1:1.4.2~dfsg-4 both contain - /etc/default/asterisk (Closes: #418656) - * Lintian fixes debian-rules-sets-DH_COMPAT - - -- Mark Purcell Sat, 14 Apr 2007 16:44:18 +0100 - -asterisk (1:1.4.2~dfsg-4) experimental; urgency=low - - [ Tzafrir Cohen ] - * The dummy fetch was not executable when generated from tar+diff. - - [ Mark Purcell ] - * Create debian/rules binary-arch & binary-indep targets - * Move debian/rules magic to package.install files - - -- Mark Purcell Thu, 29 Mar 2007 00:31:41 +0100 - -asterisk (1:1.4.2~dfsg-3) experimental; urgency=low - - * Fix syntax of for dummy fetch (Closes: #416143). - * LSB init section in init.d script. - * Merge other init.d changes from trunk. - - -- Tzafrir Cohen Sun, 25 Mar 2007 16:19:37 +0200 - -asterisk (1:1.4.2~dfsg-2) experimental; urgency=low - - [ Tzafrir Cohen ] - * Fix default varrundir using make vars (Closes: #415799). - * Don't run autoconf if you don't need (Closes: #415865). - * Require zaptel >= 1.4.1, for ZT_EVENT_REMOVED . - - [ Mark Purcell ] - * Include chan_h323.so in debian/asterisk-h323.install - * Please package Asterisk-1.4.0 (Closes: #405723) - * Add Build-Depends: libgtk2.0-dev, libc-client-dev - * configure --with-pwlib=/usr/share/pwlib/include/ \ - --with-h323=/usr/share/openh323/ - * debian/asterisk.default - fix -D/-d typo in PARAMS (Closes LP#68169) - * debian/asterisk.init: - - create /var/run/ directory if necessary and set proper permissions - * Move dh_installinit to architecture dependant - * Move ASTVARRUNDIR to /var/run/asterisk/ - - PID & control files go in wrong place (Closes: #415799) - - -- Mark Purcell Sat, 24 Mar 2007 18:32:45 +0000 - -asterisk (1:1.4.2~dfsg-1) experimental; urgency=low - - * New upstream release. - - SIP INVITE DoS, supposedly fixed in 1.4.2 and 1.2.17, which is - released today 19/03/2007 (Closes: #415466) - * asterisk Depends: ${shlibs:Depends} - - -- Mark Purcell Tue, 20 Mar 2007 19:07:18 +0000 - -asterisk (1:1.4.1~dfsg-1) experimental; urgency=low - - [ Tzafrir Cohen ] - * New upstream release. - - Please package Asterisk-1.4.0 (Closes: #405723) - * A package that builds. - * Removed asterisk-sounds.install: does not belong here. - * Removed makefile_noiaxy.dpatch: applied by upstream. - * Config examples in a separate examples subdirectory. - * Generate explicitly some missing subdirectories. - * Man pages are included in upstream now. - * set ASTDATADIR=/usr/share/asterisk . - * A bunch of other fils moved for 1.4 . - * Use system gsm (only requires an explicit --with-gsm) - * Allow chrooted building with no wget. - * h323_no_exit.dpatch: Don't requires two rounds of building. - - [ Mark Purcell ] - * configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) - --prefix=/usr --mandir=\$${prefix}/share/man -- - infodir=\$${prefix}/share/info - - -- Mark Purcell Mon, 19 Mar 2007 06:24:43 +0000 - -asterisk (1:1.4.0~dfsg-1) UNRELEASED; urgency=low - - * New upstream release (1.4) - * Sandbox to start playing with 1.4, it uses autotools :-), - it also uses ASTDATADIR :-) :-) - * need to understand this menuselect and how to encorporate into debian. - * need to discuss with upstream iLBC conflict with GPL - * Ugly hack in version number. - * get-orig-source now works, though. - * No more asterisk-classic and asterisk-bristuff - * FreePlay Music files location changed - * Disabling h323 build for now, until I figure what's wrong. - * Extra Build-Deps: libiksemel-dev, libradiusclient-ng2-dev, freetds-dev, - libvorbis-dev, libsnmp9-dev - * Simply use configure. No workarounds. - * Edit menuselect.makeopts to avoid downloading MOH files. - * makefile_noiaxy.dpatch: don't try to copy the non-existing iaxy.bin , - * zapbri.dpatch: support zapbri devices - * chanzap_chanremoved.dpatch: handle ZT_EVENT_REMOVED event from zaptel - - -- Mark Purcell Mon, 25 Sep 2006 08:46:16 +0100 - -asterisk (1:1.2.16~dfsg-1) unstable; urgency=high - - [ Tzafrir Cohen ] - * New upstream release. Also fixes remote SIP security hole. - * Updated bristuff patch. - * Fix umask of Asterisk for the voicemail. - - -- Tzafrir Cohen Sun, 4 Mar 2007 00:35:53 +0200 - -asterisk (1:1.2.15~dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstream release. - * ukcid.dpatch: adapted to chan_conf. - * bristuff.dpatch: adapted to chan_conf. - * daemon_color.dpatch: make rastrisk colourful even without safe_asterisk. - * No need to edit a config file to start Asterisk. - * Use asterisk.conf based on README.asterisk.conf: - - Set default user to asterisk. - - Make the control socket writabe by the group asterisk. - * don't remove stereorize and streamplayer. - * A man page for stereorize. - * Create /etc/asterisk/manager.d (Closes: #410715). - * Check that Asterisk is alive before sending a command (Closes: #389448). - * Use MAKEBUILDOPTS instead of MAKEFLAGS, which is a reserved gmake name. - * Removing build depepndency on obsolete and unused libzap-dev. - * New transcoding interfaces from zaptel.h of zaptel 1.2.13 or 1.4 seem - to be required for Asterisk 1.2.15 . - - -- Mark Purcell Sat, 3 Mar 2007 17:14:25 +0000 - -asterisk (1:1.2.14~dfsg-5) UNRELEASED; urgency=low - - [ Tzafrir Cohen ] - * Bristuff 0.3.0-PRE-1x - - -- Tzafrir Cohen Mon, 22 Jan 2007 23:30:34 +0200 - -asterisk (1:1.2.14~dfsg-4) unstable; urgency=high - - * Add missing "fi" to asterisk_fix. (Closes: #406961) - - -- Kilian Krause Mon, 15 Jan 2007 12:05:18 +0100 - -asterisk (1:1.2.14~dfsg-3) unstable; urgency=low - - * Write a more robust version of the FHS-update for - /usr/share/asterisk/sounds/priv-callerintros. - * Update 30_ast-data-dir to complete fix for #406714. Thanks to Lionel! - - -- Kilian Krause Sun, 14 Jan 2007 13:38:57 +0100 - -asterisk (1:1.2.14~dfsg-2) unstable; urgency=low - - * Install private callerinfos in /var/lib/ where they belong acording to - FHS. (Closes: #406714) - - -- Kilian Krause Sat, 13 Jan 2007 12:01:33 +0100 - -asterisk (1:1.2.14~dfsg-1) unstable; urgency=low - - * New upstream release. - * Build against libspeex-dev (>= 1.1.12-3) with updated shlibs - (Closes: #403544) - * Update bristuff patch to apply cleanly with 1.2.14 until new upstream - version is out. - * Remove hardcoded gcc (Closes: #316802) - * Fix upstream clean target. (Closes: #393659) - - -- Kilian Krause Wed, 3 Jan 2007 21:03:19 +0100 - -asterisk (1:1.2.13~dfsg-2) unstable; urgency=low - - [ Tzafrir Cohen ] - * less_docs.dpatch: remove unnecessary doxygen docs. asterisk-doc's size - is now 1.6M (7.7M installed). - - [ Mark Purcell ] - * asterisk-classic, asterisk-bristuff: - /usr/lib/asterisk/modules/format_ogg_vorbis.so gone missing when - rebuilt (Closes: #397147) - - -- Mark Purcell Mon, 6 Nov 2006 06:33:19 +0000 - -asterisk (1:1.2.13~dfsg-1) unstable; urgency=high - - [ Kilian Krause ] - * Fixup dfsg versions with increased upstream build count. - - [ Santiago Ruano Rincón ] - * Added cdr_sqlite3_custom dpatch - - [ Mark Purcell ] - * New upstream release - - Remote compromise (Closes: #394025) - - CVE-2006-5444/5:security issues in asterisk (Closes: #395080) - - Urgency high as this fixes remote compromise security issue - - Information disclosure of voice mail messages through vmail.cgi - (Closes: #338116) - - package asterisk-dev should contain asterisk.h main header (Closes: - #342138) - - format_ogg_vorbis.so was present in i386, no longer in packages - (Closes: #375141) - * Update debian/patches/bristuff.dpatch - * bristuff-0.3.0-PRE-1v - - Please package bristuff 0.3.0PREu (Closes: #394122) - - please include app_pickup.c from bristuff (Closes: #348194) - * Build Depends: dpkg ( >= 1.13.19) - - Asterisk must build-depend upon dpkg ( >= 1.13.19) (Closes: #386113) - * Build-Depends: libpq-dev - - obsolete build dependency postgresql-dev (Closes: #389376) - - -- Mark Purcell Wed, 25 Oct 2006 06:46:52 +0100 - -asterisk (1:1.2.12.1.dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstream release - * bristuff.dpatch: version adapted. - * apprecord_sprintf.dpatch removed: already applied. - - [ Mark Purcell ] - * binary blob in asterisk-classic package (Closes: #386361) - * Cleanup bristuff.dpatch - - -- Mark Purcell Sun, 24 Sep 2006 14:45:58 +0100 - -asterisk (1:1.2.11.dfsg-1) unstable; urgency=high - - [ Tzafrir Cohen] - * apprecord_sprintf.dpatch: fix format string issue in app_record.so . - - [ Mark Purcell ] - * New Upstream Release - * Urgency high as fixes CVE-2006-4346 - * CVE-2006-4346: Asterisk MGCP AUEP Response Handling Buffer - Overflow (Closes: Bug#385060) - * Please package Asterisk 1.2.11 and Zaptel 1.2.8 (Closes: #384283) - * Better error handling on init.d reload, if asterisk isn't running - * Lintian cleanup: not-binnmuable-any-depends-all - * Lintian cleanup: not-binnmuable-all-depends-any - * Use restart in asterisk_fix - - -- Mark Purcell Sat, 2 Sep 2006 13:01:02 +0100 - -asterisk (1:1.2.10.dfsg-3) unstable; urgency=low - - [ Kilian Krause ] - * Add iaxy.bin to asterisk debs to have working IAX support. - * asterisk_fix is included on the main asterisk package - (Closes: Bug#287025, Bug#360233, Bug#381861) - * Various fixes to asterisk_fix - - [ Mark Purcell ] - * Remove Build-Depends: libgtk1.2-dev (only for asterisk-gtk) - * export PROC := $(shell dpkg-architecture -qDEB_BUILD_GNU_CPU) - * asterisk-{classic-bristuff} Depends: asterisk - * asterisk_fix needs to fix /var/run/asterisk - * Move doc/asterisk -> asterisk-doc package - - [ Tzafrir Cohen] - * New upstream release (Closes: #385060). - * bristuff 0.3.0-PRE-1s (adapted to asterisk 1.2.11). - - -- Mark Purcell Thu, 17 Aug 2006 20:31:02 +0100 - -asterisk (1:1.2.10.dfsg-2) unstable; urgency=high - - * IAX2 channel driver security patch [CVE-2006-2898] - - CVE-2006-2898: Denial of service in Asterisk (Closes: #380054) - - -- Mark Purcell Thu, 27 Jul 2006 08:09:47 +0100 - -asterisk (1:1.2.10.dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstream release. - * bristuff.dpatch updated for the new version. - * dfsg tarball also removes ilbc. - * Cleanups to asterisk_fix - - [ Mark Purcell ] - * Build-Depends: libpri-dev (>= 1.2.3-1) - * Fixes: - - Please package version 1.2.9.1 (Closes: #372527) - - -- Mark Purcell Mon, 17 Jul 2006 21:15:50 +0100 - -asterisk (1:1.2.9.1.dfsg-1) unstable; urgency=high - - * New upstream release. [CVE-2006-2898] - - [ Mark Purcell ] - * Update debian/watch for numeric upstream versions - - [ Kilian Krause ] - * Remove unused correct_pid.dpatch (has apparently been fixed with 1.2 - upstream) - * debian/patches/100_nonroot.dpatch, debian/patches/20_Makefile.dpatch, - debian/patches/25_subdirs_Makefiles.dpatch: Remove unused patches - - [ Tzafrir Cohen ] - * reunite init.d and logrotate scripts in the package asterisk - * Re-add correct_pid_display.dpatch - * bristuff 0.3.0-PRE1s (gsm functionality missing: needs libgstam) - * sys_readline.dpatch: Realine support in the CLI. TODO: tab completion - * sys_editline.dpatch: alternativly, simply use the system version of - editline (not used). - * func_odbc_12.dpatch: backport of func_odbc (Closes: #364633) - * brazilian_syntax.dpatch (using "pt_BR") - * vm_he.dpatch: Hebrew in app_voicemail - * The data_dir patch also moves agi-bin/ and firmware/ - * option_detach: using -F instead of -D (the same as upstream) - * asterisk.init: added "zaptel-fix" to unload and reload zaptel modules - - -- Kilian Krause Fri, 16 Jun 2006 18:04:50 +0000 - -asterisk (1:1.2.7.1.dfsg-3) unstable; urgency=high - - * Urgency high as this is a security fix [CVE-2006-2898] - * Added 99_CVE-2006-2898.dpatch from Joey Schulze - - Fixes: Bug in the IAX2 channel allows remote attackers to craft - a denial of service. - - -- Mark Purcell Tue, 13 Jun 2006 05:11:44 +0100 - -asterisk (1:1.2.7.1.dfsg-2) unstable; urgency=high - - [ Kilian Krause ] - * Urgency bumped since 1.2.7 is a security update [CVE-2006-1827] - (Closes: #364195) - - [ Mark Purcell ] - * Previous Upload also fixes: - - cannot install - directories not created (Closes: #360233) - - package uninstallable (Closes: #359970) - * Update postinst to fix: fails to upgrade when /etc/asterisk/voicemail.conf - is deleted (Closes: #360220) - * Link debian/asterisk-bristuff.asterisk.{logrotate,init} & - provide debian/asterisk-classic.asterisk.logfile - - Fixes: init.d and logrotate.d conflicts (Closes: #360181) - - -- Mark Purcell Sun, 23 Apr 2006 13:26:29 +0100 - -asterisk (1:1.2.7.1.dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * New upstream release. - * nomarch.dpatch: removed the patching to internal libgsm, as we don't use - it (and it broke in this version) - * bristuff.dpatch: based on the patch from bristuff-0.3.0-PRE1n - * bristuff.dpatch: A small fix in chan_sip.c - * bristuff.dpatch: Disabling "libgsm" until it is renamed - * 30_ast-data-dir.dpatch: the symlink sounds/voicemail is now gone - * rules: do fail if bristuff patching hasfailed - * zap_restart.dpatch: allow restarting zaptel channel with "zap restart" - * backport_playdtmf.dpatch: a harmless backport (no impact if not used) - * completed the merge of logrotate and init.d scripts - - [ Lionel Elie Mamane ] - * When not running asterisk, do it successfully, not by failure. - (closes: #360234) - * Create /var/log/asterisk/cdr-csv, not cdr-cvs. - - [ Mark Purcell ] - * Update debian/control for asterisk-h323 package description - * Create /var/spool/asterisk & /var/lib/asterisk in debian/*.postinst - * New upstream release. Fixes: - - Version 1.2.5 is out (Closes: #355299) - - since 1.2.0 no chan_modem (Closes: #343232) - - Undefined symbol in chan_zap.so (Closes: #339559) - - Unapplying patches fail (Closes: #345676) - - utils.c:619 tvfix: warning negative timestamp... (Closes: #347929) - - creates /.asterisk_history on reboot (Closes: #307218) - * h323 modules can be unstable so dont load my default - * Cleanup debian/patches to remove obsolete/ old patches - - -- Mark Purcell Fri, 21 Apr 2006 17:33:31 +0100 - -asterisk (1:1.2.6.dfsg-1) unstable; urgency=low - - * New upstream release. (Closes: #355299) - * correct_pid_display.dpatch: adjusted to 1.2.6 - * 30_ast-data-dir.dpatch: adjusted to 1.2.6 - * debian/control: Add adduser to depends of asterisk-config to shut up - lintian. - * rules: no need to copy config to the bristuff install - * rules: but use cp -a for ast_config, as there may be subdirs. - - -- Tzafrir Cohen Mon, 10 Apr 2006 19:00:12 +0300 - -asterisk (1:1.2.4.dfsg-7) unstable; urgency=low - - * Recompile to fix missing asterisk-config from last binNMU round - (Closes: #356712, #358413, #355524, #358145) - * postinstall: Add /var/spool/asterisk/meetme if nonexistant. - (Closes: #355046) - * asterisk.init: Install both asterisk-classic and asterisk-bristuff with - /etc/init.d/asterisk (Closes: #354729) - * logroate: create /var/log/asterisk/cdr-custom/ as well as cdr-csv - (Closes: #355048) - * logrotate: share location of logrotate file as /etc/logrotate.d/asterisk - for both classic and bristuff version (Closes: #356712) - * delete chan_capi modules from bristuff - * Move postinstall and postrm to asterisk-classsic, asterisk-bristuff and - asterisk-config. (Closes: #355524) - - -- Kilian Krause Thu, 30 Mar 2006 11:55:03 +0200 - -asterisk (1:1.2.4.dfsg-6) unstable; urgency=low - - * Add chan_h323 back with new Atlas_devel3 OpenH323. - - -- Kilian Krause Sat, 18 Feb 2006 17:55:24 +0000 - -asterisk (1:1.2.4.dfsg-5) unstable; urgency=low - - * Fix install of asterisk-bristuff with dh_install. - - -- Kilian Krause Tue, 14 Feb 2006 20:23:56 +0100 - -asterisk (1:1.2.4.dfsg-4) unstable; urgency=low - - * Create missing /var/spool/asterisk/voicemail in postinst (Closes: #352586) - - -- Kilian Krause Sun, 12 Feb 2006 22:51:50 +0100 - -asterisk (1:1.2.4.dfsg-3) unstable; urgency=low - - * Fix asterisk-bristuff install target to catch correct versions. - - -- Kilian Krause Sun, 12 Feb 2006 12:34:31 +0000 - -asterisk (1:1.2.4.dfsg-2) unstable; urgency=low - - * update to bristuff 0.3.0-PRE-1k - - -- Kilian Krause Thu, 9 Feb 2006 18:12:08 +0000 - -asterisk (1:1.2.4.dfsg-1) unstable; urgency=low - - [ Tzafrir Cohen ] - * Fix PID display (Closes: #338646) - * changes to the init.d script (Tzafrir) - * debian/ast_config/ place here configurutaion files that will override - the defaults from the source, though not get into the sample documentation - dir - * debian/ast_config/manager.conf: asterisk does listen onthe manager by - default, but only on localhost. Other packages need not edit manager.conf - to get a manager acount - * bristuff 0.3.0-PRE-1f - * option_detach.dpatch: Adds option -D: always daemonize (even with -v,-d) - (conflicts with bristuff, though) - * ukcid.dpatch: UK Caller ID patch for the X100P. (Closes: #302380) - - [ Kilian Krause ] - * New upstream release. (Closes: #350905) - * Bumping depends on libpri and zaptel to according 1.2 versions. - * Build-Depends on libpri1.2 since new ABI caused new package name. - * Removed alternatives from Build-Depends since sbuild will only take first - anyway to ensure constant rebuilds. - * Add a noload for chan_capi by default, so that we d not stop loading when - no CAPI is installed. (Closes: #328835) - * Include smsq by adding Build-Depends on libpopt-dev (Closes: #348090) - - -- Kilian Krause Sun, 5 Feb 2006 11:44:28 +0100 - -asterisk (1:1.2.1.dfsg-3) unstable; urgency=low - - * Remove -msoft-float from compile flags to fix compilation on arm. - (Closes: #343154) - * Provide nonexistant dirs before running chown on them. (Closes: #341810) - * Depend on Perl module in libapache-dbi-perl or libdbi-perl or web-vmail - (Closes: #337448) - * Fix permissions on voicemail.conf. (Closes: #304615) - * Build-Depend on gsfonts to have Helvetica font for doxygen - (Closes: #343079) - - -- Kilian Krause Mon, 2 Jan 2006 00:15:59 +0000 - -asterisk (1:1.2.1.dfsg-2) unstable; urgency=low - - [ Tzafrir Cohen ] - * bristuff 0.3.0-PRE-1d . Still disabled by default - * libpri_bristuffed.dpatch: link chan_zap with libpri-bristuffed.so.1 - * Use asterisk(8) as a man page for rasterisk - * Removing binary steroize: can be done with soxmix of package sox. - * Removing binary streamplay: can be done with netcat - - [ Kilian Krause ] - * Fix asterisk-dev to include asterisk.h - - -- Tzafrir Cohen Sat, 31 Dec 2005 21:17:44 +0200 - -asterisk (1:1.2.1.dfsg-1) unstable; urgency=low - - * New upstream release - - Please package asterisk 1.2.1 (Closes: #342463) - * Temporary disable bristuff for upstream release - * sip-1.914.dpatch merged upstream - - -- Mark Purcell Wed, 7 Dec 2005 21:59:20 +0000 - -asterisk (1:1.2.0.dfsg-6) unstable; urgency=low - - * Add Build-Depends: libcurl3-dev | libcurl-dev - - Should build-depend on libcurl3-dev (Closes: #341363) - * Add Build-Depends: doxygen - - Missing build-dependency on doxygen (Closes: #341362) - * Build-Depends: adduser (>= 3.63) - * disable chan_zap building (in channels makefile) against old - libmfcr2 (Closes: #342139) - * seperate api docs and configuration samples (Closes: #341395) - * Add sip-1.913.dpatch; SIP error 400 on outgoing calls (Closes: #340574) - - -- Mark Purcell Mon, 5 Dec 2005 23:49:40 +0000 - -asterisk (1:1.2.0.dfsg-5) unstable; urgency=low - - [ Tzafrir Cohen ] - * Added bristuff 0.3.0-PRE1 - - [ Mark Purcell ] - * asterisk-sounds-main Replaces: asterisk-sounds-extra - - asterisk-sounds-{main,extra}: file conflict (Closes: #339791) - - -- Mark Purcell Thu, 1 Dec 2005 17:37:13 +0000 - -asterisk (1:1.2.0.dfsg-4) unstable; urgency=low - - * Fix 50_debian-libgsm.dpatch to apply correctly - - asterisk - FTBFS: Tries to build a i386 assembler file (Closes: - #340102) - - -- Mark Purcell Mon, 21 Nov 2005 19:56:03 +0000 - -asterisk (1:1.2.0.dfsg-3) unstable; urgency=low - - * Remove -march to fix FTBFS. (Closes: #338753) - - -- Kilian Krause Sat, 19 Nov 2005 19:36:31 +0000 - -asterisk (1:1.2.0.dfsg-2) unstable; urgency=low - - * libreadline4-dev is superseeded by libreadline5-dev. Fixed build-depends. - - -- Kilian Krause Sat, 19 Nov 2005 12:12:51 +0000 - -asterisk (1:1.2.0.dfsg-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Thu, 17 Nov 2005 18:17:02 +0000 - -asterisk (1:1.2.0-rc2.dfsg-1) experimental; urgency=low - - * New upstream release - - -- Mark Purcell Sun, 13 Nov 2005 17:58:08 +0000 - -asterisk (1:1.2.0-rc1.dfsg-1) experimental; urgency=low - - * New upstream release - * Suggests: asterisk-rate-engine - * debian/rules touch .cleancount (upstream bug?) - - -- Mark Purcell Wed, 9 Nov 2005 22:05:30 +0000 - -asterisk (1:1.2.0-beta2.dfsg-3) experimental; urgency=low - - * Fix debian/patches/30_ast-data-dir with /var/run/asterisk. Thanks - Alessandro Polverini - - -- Mark Purcell Tue, 8 Nov 2005 22:00:29 +0000 - -asterisk (1:1.2.0-beta2.dfsg-2) experimental; urgency=low - - * Copyright audit into debian/copyright (Closes: #331318) - * Please package 1.2 beta 2 (Closes: #336749) - - -- Mark Purcell Mon, 7 Nov 2005 22:58:27 +0000 - -asterisk (1:1.2.0-beta2.dfsg-1) experimental; urgency=low - - * New upstream release - * Update Build-Depends: libpri1 >= 1.2.0-beta2 - * Remove Build-Depends: doxygen. Takes too long for experimental ;-) - - -- Mark Purcell Tue, 1 Nov 2005 22:27:43 +0000 - -asterisk (1:1.2.0-beta1.dfsg-1) experimental; urgency=low - - [ Tzafrir Cohen ] - * recreated system_libgsm patch, http://bugs.digium.com/view.php?id=5434 - * Added public key from Junction Networks (pubkey_jnctn.dpatch). - Any other keys for IAX providers we can add? - * updating to a beta of Asterisk 1.2 - * added defaults_debian.dpatch to set pathes - * BuildDepends on graphviz - * disabled most patches: still need to review them - * What about h323? - * deleted from patches/00list a number of patches that should not go in - - [ Mark Purcell ] - * Fix: old-fsf-address-in-copyright-file - * Please package version 1.2 betas (Closes: #325268) - - -- Mark Purcell Thu, 20 Oct 2005 19:42:14 +0100 - -asterisk (1:1.0.9.dfsg-6) UNRELEASED; urgency=low - - * Fix memleak bug (http://bugs.digium.com/view.php?id=4318) - * Fix depends to adduser 3.64 (Closes: #326198) - - -- Kilian Krause Wed, 7 Sep 2005 21:22:40 +0200 - -asterisk (1:1.0.9.dfsg-5) unstable; urgency=low - - [ Kilian Krause ] - * debian/control: fix GCI to read CGI. (Closes: #311291) - - [ Mark Purcell ] - * /var/lib/dpkg/info/asterisk.postinst: line 22: adduser: command not - found (Closes: #322115) - * debian/patches/chan-modem.dpatch from Simon Peter - - chan_modem.c should set default read & write format (Closes: - #303903) - * apply patch from Jérôme Warnier - - Asterisk autosupport script not recognized as such (Closes: #316799) - * Updated debian/postrm: - - 'apt-get --purge remove asterisk' removes configuration files from - another package (Closes: #318455) - - -- Mark Purcell Tue, 9 Aug 2005 22:07:13 +0100 - -asterisk (1:1.0.9.dfsg-4) unstable; urgency=low - - * Cleanup bristuff to build under gcc4, thanks for the suggestions - - Closes: #318337: FTBFS. channel.c:64: error: static declaration of - 'uniquelock' follows non-static declaration - - -- Mark Purcell Fri, 22 Jul 2005 10:28:15 +1000 - -asterisk (1:1.0.9.dfsg-3) unstable; urgency=low - - * Cleanup 70_debian-libpe-fe.dpatch to check in Makefile - * Enable bristuff-0.2.0-RC8j.dpatch - * Remove debian/patches/08_debian-zaptel.dpatch as it is no longer - needed with new zaptel-source package - * Cleanup debian/patches/ - * Conflicts: asterisk-oh323 (<= 0.6.6pre3-3) - - Closes: #318189: asterisk-oh323: chan_oh323.so cannot find symbol - and Asterisk crashes - - Closes: #318216: chan_oh323.so symbols - * Cleanup postinit error: adduser asterisk audio; adduser asterisk - dialout - * Incorporate suggestions from Tzafrir Cohen - - postinst script has an error - - modified astdir patch, so it won't conflict with bristuff patch - - typo in the debian/asterisk.default: s/exra/extra/ - - build-depends both on zaptel-source (>= 1.0.6) and simply - on zaptel-source, The latter is probably unnecessary - - man pages for the other executables in the package - - -- Mark Purcell Thu, 14 Jul 2005 07:22:59 +0100 - -asterisk (1:1.0.9.dfsg-2) unstable; urgency=low - - * Closes: #301490: Please add patch for Italian syntax - * Closes: #305734: On PowerPC, hanging up on voicemail causes non-stop - log messages - - -- Mark Purcell Fri, 1 Jul 2005 23:24:53 +0100 - -asterisk (1:1.0.9.dfsg-1) unstable; urgency=low - - * New upstream release - - Closes: #315578: New version of asterisk and bristuff released - * Remove BRI patch while we work on it, to allow 1.0.9 to unstable - - -- Mark Purcell Fri, 1 Jul 2005 22:38:24 +0100 - -asterisk (1:1.0.8.dfsg-1) UNRELEASED; urgency=low - - * (NOT RELEASED YET) New upstream release - - -- Mark Purcell Fri, 24 Jun 2005 23:25:02 +0100 - -asterisk (1:1.0.7.dfsg.1-4) unstable; urgency=low - - * debian/control: fixed build-depends on sed's version greater than Woody. - (Closes: #308885) - - -- Kilian Krause Sat, 21 May 2005 14:15:03 +0200 - -asterisk (1:1.0.7.dfsg.1-3) unstable; urgency=low - - * Jose Carlos - + Fix a typo in NEWS.Readme - + debian/postint: Add asterisk user to dialout group too. This is needed - for asterisk to have enoug permissions to access zaptel devices. - + debian/control: allow a local asterisk-config-local package to satisfy - dependencies. Conflict with asterisk-config - - -- Jose Carlos Garcia Sogo Sun, 8 May 2005 22:06:44 +0200 - -asterisk (1:1.0.7.dfsg.1-2) unstable; urgency=low - - * Mark Purcell - + Update debian/watch to use svn-upgrade - * Kilian Krause - + debian/asterisk.init: fixed restart problem with breaking up after stop. - + debian/asterisk.init: fixed reference to WRAPPER_DEAMON which is only - DEAMON for us. (Closes:#300707) - - -- Kilian Krause Mon, 21 Mar 2005 10:59:01 +0100 - -asterisk (1:1.0.7.dfsg.1-1) unstable; urgency=low - - * New upstream release (Ensure non-dfsg MOH is not included in orig.tar) - - -- Mark Purcell Sun, 20 Mar 2005 10:30:44 +0000 - -asterisk (1:1.0.7-1) unstable; urgency=low - - * New upstream release. (Closes: #300403) - + Fixed music on hold. (Closes: #300370) - * Re-enabled speex codec. (Closes: #300373) - * As asterisk-h323 is empty, we are no longer depending on openh323, so - we don't have build conflicts between asterisk and zaptel. (Closes: #287260) - * debian/rules: Fixed duplicate execution of configure and unrepresentable - changes to source. (Closes: #299184) - * debian/patches/80_skinny.dpatch: removed. Incorporated in the 1.0.7 - release. - * debian/patches/97_bristuff.dpatch: fixed problems to build on AMD64 with - gcc-4.0 (Closes: #297561) - - -- Kilian Krause Sat, 19 Mar 2005 22:26:45 +0100 - -asterisk (1:1.0.6-2) unstable; urgency=low - - * fixed location of sounds dir in addmailbox (Closes: #298769) - - -- Kilian Krause Wed, 9 Mar 2005 22:09:05 +0100 - -asterisk (1:1.0.6-1) unstable; urgency=low - - * New upstream release. (asterisk 1.0.6, bristuff RC7k, Closes: #298128) - * debian/control: explicitly depend on zlib1g-dev. (Closes: #296967) - * Make sure we have the newer asterisk-config to not conflict - /etc/default/asterisk. (Closes: #297719) - * as there is no longer a conflict with libnewt-dev, it was added to the - build deps for astman - * debian/control: add astman and cdr_sqlite (Closes: #259342) - * asterisk.default, asterisk.init: removed hack to load zaphfc correctly. - We'll leave this to zaptel and it's modprobe.d features. - - -- Kilian Krause Sat, 5 Mar 2005 20:03:42 +0100 - -asterisk (1:1.0.5-4) unstable; urgency=low - - * debian/patches/00list,debian/control: Enable bristuff RC7f by default. - * debian/asterisk.init, debian/asterisk.default: Cleanup zaphfc preloading - as inspired by Tzafrir Cohen. - * debian/control: Remove speex as B-D, it's broken when imported from - debian. Added autotools-dev for editline. - * deiban/rules: fix asterisk.8.gz error in lintian. Bring new autotools for - editline's configure. - * reintroduce chan_zap (Closes: #296656) - - -- Kilian Krause Thu, 24 Feb 2005 01:24:45 +0100 - -asterisk (1:1.0.5-3) unstable; urgency=low - - * debian/patches/08_debian-zaptel.dpatch, debian/control: fixed zaptel.h - include to take zaptel-source's version. - * debian/patches/97_bristuff.dpatch: - include bristuff from junghanns.net (not enabled by default now, would - close: #286797). We need libpri and zaptel with bristuff patch first. - * 18_debian-libedit.dpatch: removed due to command history problem. - (Closes:#281690) - * debian/asterisk.init: Added grace timeout of 2 secs before hard shutting - down running daemons to don't scatter incorrect warnings. Don't run the - asterisk daemon unless RUNASTERISK=yes. (Will not bind ports from chroots) - * debian/asterisk-config.default: Disabled autostart - especially when - installing in chroots this was quite annoying. - * debian/rules: Remove the asterisk.8.gz recompression. (Closes: #295220) - * debian/README.Debian: Added first version. Thanks to Tzafrir Cohen for the - template! (Closes: #270072) - * debian/asterisk.deafult: moved the /etc/default to the asterisk package, - as /etc/init.d/asterisk in there needs it. - * debian/80_skinny.dpatch: Added - http://bugs.digium.com/bug_view_page.php?bug_id=0003496. Thanks to Johan - Thelmén . (Closes:#295658) - * debian/control: remove chan_h323 from being built for now. For now it's - being replaced by asterisk-oh323 until chan_h323 does build and work ok - with latest OpenH323 again. - - -- Kilian Krause Mon, 21 Feb 2005 23:13:57 +0100 - -asterisk (1:1.0.5-2) unstable; urgency=low - - * Debian VoIP Team upload. - * asterisk.init, asterisk-config.default: probably fixed start-as-user-with- - multiple-groups-problem. - * patches/40_initgroups.dpatch: added patch from Florian Weimer - . Thanks! (Closes: #293124) - * debian/postinst: Make asterisk user's home /var/lib/asterisk upon user - request. - * debian/control: Bump libpri build-depends to 1.0.4-1. (Closes: #293990) - - -- Kilian Krause Tue, 8 Feb 2005 11:40:43 +0100 - -asterisk (1:1.0.5-1) unstable; urgency=low - - * Debian VoIP Team upload. - * New upstream release. - - * Kilian Krause: - - debian/asterisk.init: fixed multiple GID problem when starting asterisk (as - reported by Raoul Bönisch and Simon Peter). Unfortunatelly this does - remove the chance to run as real-time prio. - - debian/asterisk.init: fixed stale stop by using start-stop-server after - soft shutdown (Closes: #263879) - - debian/asterisk.init: Fixed running as root problem for #279052. At least - through the /etc/init.d/asterisk you won't be able to run asterisk as - root (not even with another username). (Closes: #279052) - - debian/asterisk.init: Added switch to run asterisk via safe_asterisk - optionally for automatic restart (Closes: #266805) - - debian/patches/01_security_hotfix_287851.dpatch: Removed, as is - incorporated in 1.0.4 upstream release. - - * Jose Carlos - - debian/rules: add a check at build time for fpm sounds. If they exist, - abort, as we must remember to remove those from sources in each new - upstream release. - - debian/patches: 20_Makefile.dpatch: updated - - -- Jose Carlos Garcia Sogo Fri, 28 Jan 2005 23:31:14 +0100 - -asterisk (1:1.0.3-2) unstable; urgency=low - - * Apply missing 25_subdirs_Makefile patch. - - -- Jose Carlos Garcia Sogo Sat, 15 Jan 2005 18:23:40 +0100 - -asterisk (1:1.0.3-1) unstable; urgency=high - - * Debian VoIP Team upload. - * New upstream version. (Closes: #284889) - - * Kilian Krause: - - ACK NMU. (Thanks Steve!): - + debian/patches/01_security_hotfix_287851.dpatch: Patched to - fix logging strings vulnerability. (Closes: #287851) - - * Jose Carlos Garcia Sogo - - Using again dpatch. - - debian/patches: populated with different patches. - - 08_debian-zaptel: Using zaptel.h file from version 1:1.0.0-2 of - zaptel-source package. - - removed sounds licensed from FreePlayMusic from source, - as the license for them is not DFSG compliant (Closes: #288429) - - applied patch to make asterisk compile on amd64 with - gcc-4.0 (Closes: #288831) - - debian/asterisk.init: - + Changed how daemon is restarted in init file. (Closes: #287025) - + Using -r in checks in init file. (Closes: #287456) - - debian/asterisk-config.default - + Run by default as group asterisk. - - Fix some lintian warnings and errors: - + Description: should start with lowercase letter. - + Bumped Standars-Version to 3.6.1. No changes needed. - + Removed duplicate dependencies. - + Recompress asterisk.8 manpage with max level (--best option) - - -- Jose Carlos Garcia Sogo Sat, 15 Jan 2005 13:11:49 +0100 - -asterisk (1:1.0.2-3.1) unstable; urgency=high - - * Non-maintainer upload. - * High-urgency upload for sarge-targetted RC bugfix - * Fix multiple format string vulnerabilities, reported by Jan - Niehusmann. Closes: #287851. - - -- Steve Langasek Sat, 8 Jan 2005 02:54:45 -0800 - -asterisk (1:1.0.2-3) unstable; urgency=low - - * Closes: #281524: running asterisk with realtime priority - * Include changes from Tzafrir Cohen - - -- Mark Purcell Thu, 2 Dec 2004 02:10:12 +1100 - -asterisk (1:1.0.2-2) unstable; urgency=low - - * fixup init.d/asterisk to logger reload. Thanks Daniel Pocock - * Closes: #260575: chan_zap.so: undefined symbol - * Build-Depends: libpri1 >= 0.6 - * Closes: #279905: dependency issue breaks voicemail setup - * Build-Depends: asterisk-sounds-main (>= 1.0.2) - * Closes: #269942: package Debian asterisk-sounds - * Rename asterisk-sounds to asterisk-sounds-main to avoid upstream - conflict - * Closes: #277404: Please split out GTK console - * Split off asterisk-gtk-console package to contain all X11 - dependancies - - -- Mark Purcell Sat, 6 Nov 2004 13:20:33 +1100 - -asterisk (1:1.0.2-1) unstable; urgency=low - - * New upstream release - * Closes: #279540: Please package newer version of asterisk - * Closes: #275808: logrotate errors and emails - - -- Mark Purcell Thu, 4 Nov 2004 18:19:09 +1100 - -asterisk (1:1.0.1-2) unstable; urgency=low - - * Closes: #275808: logrotate errors and emails - * Add init.d/asterisk logger-reload|extensions-reload options & use - logger reload in asterisk.logrotate. Thanks Daniel Pocock - - -- Mark Purcell Wed, 13 Oct 2004 22:31:22 +1000 - -asterisk (1:1.0.1-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Wed, 6 Oct 2004 14:39:12 +1000 - -asterisk (1:1.0.0-4) unstable; urgency=high - - * Urgency high for sarge release - * Closes: #273570: asterisk-sounds: sounds/letters directory is missing - - -- Mark Purcell Wed, 29 Sep 2004 07:48:16 +1000 - -asterisk (1:1.0.0-3) unstable; urgency=low - - * Closes: #273780: under ALSA, infinite-loops immediately on - installation - * Comment out autoload of chan_oss from modules.conf - * Closes: #272999: asterisk_1:0.9.1+1.0RC2-2_hppa: FTBFS: - [anaFilter.o] Error 1 - * Version 1.0.0 now builds on hppa - * Closes: #273576: chan_zap.so module is missing - * check for ../include/linux/zaptel.h in channels/Makefile - * Closes: #273572: Music on hold has wrong default directory - * refer to correct /usr/share/asterisk/mohmp3 directory - - -- Mark Purcell Tue, 28 Sep 2004 23:06:03 +1000 - -asterisk (1:1.0.0-2) unstable; urgency=medium - - * Rebuild with zaptel.h_1.0.0 and libpri-dev_1.0.0 - - -- Mark Purcell Sun, 26 Sep 2004 08:32:11 +1000 - -asterisk (1:1.0.0-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Fri, 24 Sep 2004 20:23:31 +1000 - -asterisk (1:0.9.1+1.0RC2-2) unstable; urgency=low - - * Use asterisk.8.gz man page - * Remove back PROC optomizations from Makefile, enable build on hppa - - -- Mark Purcell Thu, 23 Sep 2004 18:20:45 +1000 - -asterisk (1:0.9.1+1.0RC2-1) unstable; urgency=low - - * New upstream release - * Back out dpatch (Makes new upstream release straight forward) - - -- Mark Purcell Thu, 23 Sep 2004 08:35:08 +1000 - -asterisk (1:0.9.1+1.0RC1-9) unstable; urgency=low - - * Breakup monolithic patch into components. - - -- Mark Purcell Wed, 22 Sep 2004 18:47:31 +1000 - -asterisk (1:0.9.1+1.0RC1-8) unstable; urgency=medium - - * debian/patches/11_makefile-sanitize.dpatch: fixed patch to make gsm - work again. (Closes: #266167) - - -- Kilian Krause Tue, 17 Aug 2004 15:34:21 +0200 - -asterisk (1:0.9.1+1.0RC1-7) unstable; urgency=low - - * debian/rules, debian/patches/10_rollup-1.0-1.dpatch, - debian/patches/11_makefile-sanitize.dpatch: Incorporate fixes proposed by - Thiemo Seufer . - Should fix the FTBFS on hppa. - - -- Kilian Krause Sun, 15 Aug 2004 20:16:26 +0200 - -asterisk (1:0.9.1+1.0RC1-6) unstable; urgency=low - - * debian/control: suggest gnomemeeting. (At least tell people, which clients - they need) Also add dpatch as Build-Dep. (Closes: #265036) - * Closes: #262011: SIP cancels fail due to Request-URI mismatch - * debian/patches/20_chan_sip.dpatch: Apply chan_sip patch from Jan Niehusmann - - -- Kilian Krause Sat, 14 Aug 2004 14:05:36 +0000 - -asterisk (1:0.9.1+1.0RC1-5) unstable; urgency=low - - * debian/control: make sure we're rebuilding with rtti enabled openh323 - * debian/rules: make svn-buildpacakge not choke on failing clean target - - -- Kilian Krause Mon, 9 Aug 2004 14:37:38 +0200 - -asterisk (1:0.9.1+1.0RC1-4) unstable; urgency=low - - * Cleanup wierd .diff.gz file - - -- Mark Purcell Wed, 28 Jul 2004 19:00:32 +1000 - -asterisk (1:0.9.1+1.0RC1-3) unstable; urgency=low - - * Rebuild with existing libtonezone1 - - -- Mark Purcell Wed, 28 Jul 2004 18:10:52 +1000 - -asterisk (1:0.9.1+1.0RC1-2) unstable; urgency=low - - * Cleanup codecs/ilbc/Makefile to remove -march sillyness (which is - already defined above anyway - * Debian already has libedit.a Don't build, fails on mips anyway due to old config.guess - - -- Mark Purcell Wed, 21 Jul 2004 19:21:51 +1000 - -asterisk (1:0.9.1+1.0RC1-1) unstable; urgency=low - - * New upstream release (Closes: Bug#260370) - * Closes: #247401: doesn't upgrade cleanly - initscript - problems ? - - -- Mark Purcell Tue, 20 Jul 2004 19:20:37 +1000 - -asterisk (1:0.9.1-3) unstable; urgency=low - - * allow init.d/asterisk distribution via GPL - * Remove -I/usr/include/ptlib/unix from h323 Makefile, Thanks Ray - Dassen (Closes: Bug#259564) - * Closes: #259572: Unmet dependencies - * Maintainer: Debian VoIP Team - Uploaders: Mark Purcell , - Kilian Krause , - Jose Carlos Garcia Sogo , - Goedson Teixeira Paixao , - Santiago Garcia Mantinan - * Next step. Get this all back into svn! - - -- Mark Purcell Sun, 18 Jul 2004 10:40:22 +1000 - -asterisk (1:0.9.1-2) unstable; urgency=low - - * Rebuild with libopenh323-dev (1.12.2-4) from sarge for H.323 support - - -- Mark Purcell Wed, 14 Jul 2004 18:35:42 +1000 - -asterisk (1:0.9.1-1) unstable; urgency=low - - * New upstream release. Previous version WAS tagged as 1.0 in CVS :-( - * Closes: #249046: no ring indication - * Closes: #254654: init.d/asterisk restart kills asterisk - * Build-Depends: libgtk1.2-dev, libspeex-dev (Closes: Bug#253639) - * Turn off broken H.323 support (Closes: Bug#255662) - * Closes: #250302: Package description is slightly outdated and - incorrect - * Closes: #255685: Syntax error in configuration file, - /etc/asterisk/sip.conf - * Closes: #228722: please add postgres support for asterisk - - -- Mark Purcell Sat, 3 Jul 2004 22:47:41 +1000 - -asterisk (1.0-2) unstable; urgency=low - - * Rebuild for new libopenh323-dev - - -- Mark Purcell Sat, 3 Jul 2004 21:56:58 +1000 - -asterisk (1.0-2) unstable; urgency=low - - * Merged 1.0-1 and 0.9.0-2 - - -- Jose Carlos Garcia Sogo Tue, 8 Jun 2004 00:10:16 +0200 - -asterisk (1.0-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Mon, 31 May 2004 21:51:18 +1000 - -asterisk (0.9.0-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Sun, 18 Apr 2004 22:51:59 +1000 - -asterisk (0.7.2-4) unstable; urgency=low - - * Update channels/h323/Makefile Closes: #235010: - asterisk_0.7.2-3(unstable/sparc): arch-dependent CFLAGS - - -- Mark Purcell Fri, 27 Feb 2004 12:14:26 +1100 - -asterisk (0.7.2-3) unstable; urgency=low - - * Add Build-Depends: libopenh323-dev (Closes: Bug#233649) - - -- Mark Purcell Tue, 24 Feb 2004 11:55:57 +1100 - -asterisk (0.7.2-2) unstable; urgency=low - - * Build-Depends: libpri-dev (Closes:Bug#199548) - * Include Suggests: rate-engine - - -- Mark Purcell Thu, 5 Feb 2004 17:26:02 +1100 - -asterisk (0.7.2-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Thu, 5 Feb 2004 16:25:28 +1100 - -asterisk (0.7.1-3) unstable; urgency=low - - * Build with libopenh323 support (Closes: Bug#195233) - * Include Suggests: ohphone - - -- Mark Purcell Tue, 3 Feb 2004 08:47:47 +1100 - -asterisk (0.7.1-2) unstable; urgency=low - - * Remove ppc fixup in codecs/lpc10/Makefile again. Prevents build on - ia64, mk68 et al - - -- Mark Purcell Fri, 16 Jan 2004 11:46:57 +1100 - -asterisk (0.7.1-1) unstable; urgency=low - - * New upstream release - * i686 optomised build - - -- Mark Purcell Thu, 15 Jan 2004 23:06:01 +1100 - -asterisk (0.7.0-1) unstable; urgency=low - - * LCA2004 release. Thanks Internode for the wireless access - * New upstream release - * Clean up bad symlinks in vm (Closes: Bug#220714) - * Apply restart gracefully patch from Nick Estes (Closes: Bug#217004) - * Fixup permission/ ownership problems in /etc/asterisk (Closes: - Bug#216995) - * Fixup master call log issues (Closes: Bug#217003) - * Remove Build-Depends: libmysql-dev - see doc/README.mysql (Closes: - Bug#222255) - * Build with include/linux/zaptel.h from zaptel-0.8.0.tar.gz - * Include Build-Depends: postgresql-dev - * Include Build-Depends: unixodbc-dev - - -- Mark Purcell Wed, 14 Jan 2004 10:10:02 +1100 - -asterisk (0.5.0-3) unstable; urgency=low - - * Remove Suggests: gnophone (Orphaned and removed) - * Clean up bad symlinks in vm (Closes: Bug#220714) - * Apply restart gracefully patch from Nick Estes (Closes: Bug#217004) - * Fixup permission/ ownership problems in /etc/asterisk (Closes: - Bug#216995) - * Fixup master call log issues (Closes: Bug#217003) - - -- Mark Purcell Tue, 13 Jan 2004 21:01:16 +1100 - -asterisk (0.5.0-2) unstable; urgency=low - - * Build-Depends: debhelper (>= 4.0.4) (Closes: Bug#216725) - - -- Mark Purcell Fri, 31 Oct 2003 06:59:11 +1100 - -asterisk (0.5.0-1) unstable; urgency=low - - * New upstream release (Closes: Bug#196761) - * Build with include/linux/zaptel.h from zaptel-0.7.0.tar.gz - - -- Mark Purcell Tue, 16 Sep 2003 23:40:05 +1000 - -asterisk (0.4.0-6) unstable; urgency=low - - * Include dh_install in debian/rules (Closes: Bug#207879) - - -- Mark Purcell Wed, 10 Sep 2003 23:07:37 +1000 - -asterisk (0.4.0-5) unstable; urgency=low - - * Rebuild for libnewt-utf8-0 (NOT AVAILABLE) - * Build-Depend: libnewt-dev - - -- Mark Purcell Sat, 5 Jul 2003 15:17:57 +1000 - -asterisk (0.4.0-4) unstable; urgency=low - - * include Build-Depends: libgtk1.2-dev (Closes: Bug#194489) - - -- Mark Purcell Sat, 5 Jul 2003 15:12:02 +1000 - -asterisk (0.4.0-3) unstable; urgency=low - - * Rebuild for libtonezone-0.60, libzaptel-0.60 - * Change codecs/codec_gsm.c:#include (Closes: Bug#190082) - * Start after isdnactivecards debian/rules dh_installinit (Closes: - Bug#191062) - * Change to Build-Depends: libnetw-utf8-dev - * Update Tormenta URL in debian/control - - -- Mark Purcell Sat, 10 May 2003 16:58:03 +1000 - -asterisk (0.4.0-2) unstable; urgency=low - - * Remove ppc 'fixup' in codecs/lpc10/Makefile (Closes: Bug#189743) - * Updated description (Closes: Bug#168779) - - -- Mark Purcell Sun, 20 Apr 2003 08:37:49 +1000 - -asterisk (0.4.0-1) unstable; urgency=low - - * New upstream release - * cdr/Makefile CFLAGS+=-fPIC -DPIC (Closes: Bug#188915) - * Include include/linux/zaptel.h from zaptel-0.6.0.tar.gz - - -- Mark Purcell Sat, 19 Apr 2003 21:11:45 +1000 - -asterisk (0.3.0-2) unstable; urgency=low - - * Build-Depends: libmysqlclient-dev, libgtk2.0-dev (Closes: Bug#188188) - - -- Mark Purcell Thu, 10 Apr 2003 20:08:38 +1000 - -asterisk (0.3.0-1) unstable; urgency=low - - * New upstream release - * channels/chan_zap_new.c is depreciated - * Debian patches to upstream Makefile are a lot cleaner!! - * Update /etc/init.d/asterisk stop to use 'stop now' command - * Hack AST_DATA_DIR to provide asterisk-sounds under /usr/share/asterisk - * `chown asterisk.asterisk /var/lib/asterisk` on install - * Remove dh_undocumented - * chan_oss failing again :-( - * Force Depends: libspeex1 (dpkg-shlibs bug?) - - -- Mark Purcell Tue, 8 Apr 2003 21:27:52 +1000 - -asterisk (0.2.0-cvs20030103-3) unstable; urgency=low - - * Include Build-Depends: libasounds2-dev - * Update channels/Makefile to include Debian zaptel.h dir (Closes: Bug#178868) - * Thanks to mdz for the new libzap-dev and other patches - - -- Mark Purcell Sat, 8 Mar 2003 15:45:40 +1100 - -asterisk (0.2.0-cvs20030103-2) unstable; urgency=low - - * Revert -march in codecs/lpc10/Makefile - - -- Mark Purcell Sat, 25 Jan 2003 08:38:51 +1100 - -asterisk (0.2.0-cvs20030103-1) unstable; urgency=low - - * New upstream release - * Use invoke-rc.d in logrotate script (Closes: Bug#174633) - - -- Mark Purcell Fri, 24 Jan 2003 21:57:43 +1100 - -asterisk (0.2.0-4) unstable; urgency=low - - * Add Build-Depends: bison (Closes: Bug#169312) - - -- Mark Purcell Sun, 17 Nov 2002 09:03:01 +1100 - -asterisk (0.2.0-3) unstable; urgency=low - - * Fixed bison problems. ThanksMartijn - * Move gethostname in app_voicemail.c (Closes: Bug#168936) - * Move 0.2.0 to unstable. If you have OSS problems use asterisk/testing. - - -- Mark Purcell Fri, 15 Nov 2002 20:36:03 +1100 - -asterisk (0.2.0-2) experimental; urgency=low - - * Incorporate changes from mdz (Remove graphviz, build astman) - * Force Build-Deps: bison-1.35 :( - - -- Mark Purcell Sat, 26 Oct 2002 12:59:12 +1000 - -asterisk (0.2.0-1) experimental; urgency=low - - * New upstream release (Closes: Bug#163852) - * Uploaded to experimental as I am having problems with the chan_oss driver - which is a critial component. - - -- Mark Purcell Wed, 9 Oct 2002 08:02:38 +1000 - -asterisk (0.1.12-5) unstable; urgency=low - - * Remove chown against /var/lib/asterisk (Closes: Bug#154774) - * Fixup vm symlink (Closes: Bug#158800) - * Fixup location of iaxtel.pub keys - - -- Mark Purcell Sun, 8 Sep 2002 20:56:24 +1000 - -asterisk (0.1.12-4) unstable; urgency=low - - * Seperate into indep packages; asterisk, asterisk-[sounds,dev,doc] - * Sounds & images from /var/lib/asterisk to FHS compliant /usr/share/asterisk - * Remove DEBUG options from normal build - * Include Build-Depends: doxygen - - -- Mark Purcell Wed, 24 Jul 2002 15:07:51 +1000 - -asterisk (0.1.12-3) unstable; urgency=low - - * Update Description - * Use dpkg-architecture to set processor optimisations (Closes: #153175) - - -- Mark Purcell Wed, 17 Jul 2002 21:23:33 +1000 - -asterisk (0.1.12-2) unstable; urgency=low - - * Fixup build check for /etc/asterisk - - -- Mark Purcell Tue, 9 Jul 2002 07:32:17 +1000 - -asterisk (0.1.12-1) unstable; urgency=low - - * New upstream release - * Fixup typo in /etc/init.d/asterisk - * Include [cdr_mysql.so] => (MySQL CDR Backend) - * Use excellent init.d script idea from Sim IJskes - * Fixup broken postinst & postinst scripts - - -- Mark Purcell Mon, 8 Jul 2002 23:07:27 +1000 - -asterisk (0.1.11-5) unstable; urgency=low - - * Include zaptel support (Closes: Bug#151274) - - -- Mark Purcell Fri, 5 Jul 2002 23:59:17 +1000 - -asterisk (0.1.11-4) unstable; urgency=low - - * Add init.d from Matt Zimmerman (Closes: Bug#150573) - * More updates from Matt Zimmerman: (Closes: Bug#151201) - - place socket and fifo in /var/run/asterisk instead of /var/run - - fix mkfifo call (bug uncovered by running as non-root), patch - sent upstream also - - create postinst with necessary adduser and chown calls - * Install logrotate from Matt Zimmerman (Closes: Bug#151198) - * Disable geteuid check to allow running as non-root - * Add asterisk to audio group by default - - -- Mark Purcell Sat, 29 Jun 2002 01:34:56 +1000 - -asterisk (0.1.11-3) unstable; urgency=high - - * Update cdr/Makefile to include CFLAGS+=-fPIC -DPIC (Closes: Bug#144052) - - -- Mark Purcell Sat, 27 Apr 2002 21:19:32 +1000 - -asterisk (0.1.11-2) unstable; urgency=low - - * Move from non-us to main/comm - * Update copyright file to reflect upstream CVS LICENCE change to permit - linking with OpenSSL/ OpenH323 (Closes: Bug#141164) - - -- Mark Purcell Fri, 19 Apr 2002 20:11:58 +1000 - -asterisk (0.1.11-1) unstable; urgency=low - - * New upstream release - * Update debian/control - * Include README.cdr & README.iax - - -- Mark Purcell Mon, 18 Mar 2002 15:46:39 +1100 - -asterisk (0.1.10-3) unstable; urgency=low - - * Include CFLAGS+=-fPIC -DPIC in res/Makefile for hppa build - - -- Mark Purcell Fri, 1 Mar 2002 20:58:02 +1100 - -asterisk (0.1.10-2) unstable; urgency=low - - * Change Build-Depends: libssl-dev (Closes: Bug#134821) - - -- Mark Purcell Wed, 20 Feb 2002 22:28:35 +1100 - -asterisk (0.1.10-1) unstable; urgency=low - - * New upstream release - - -- Mark Purcell Wed, 20 Feb 2002 22:28:00 +1100 - -asterisk (0.1.9-5) unstable; urgency=low - - * Better make that Architecture: any if I want this to autobuild :-) - - -- Mark Purcell Wed, 2 Jan 2002 13:00:09 +1100 - -asterisk (0.1.9-4) unstable; urgency=low - - * Exclude MMX optimsed asm codecs/gsm/src/k6opt.s to enable non-x86 & - non-k6 builds (Closes: Bug#127225) - - -- Mark Purcell Wed, 2 Jan 2002 12:59:38 +1100 - -asterisk (0.1.9-3) unstable; urgency=low - - * New maintainer (Closes: Bug#123497) - * Set Arch to i386 as this contains x86 assember code - - -- Mark Purcell Sat, 29 Dec 2001 10:25:21 +1100 - -asterisk (0.1.9-2) unstable; urgency=high - - * apps/Makefile, codecs/gsm/Makefile: Missed an -mpentium in CFLAGS. - Closes: #126552. - - -- Matej Vela Thu, 27 Dec 2001 04:00:50 +0100 - -asterisk (0.1.9-1) unstable; urgency=medium - - * QA upload. - * New upstream version. - * Package is orphaned; maintainer set to Debian QA Group. - * debian/postrm: Ensure correct exit status. Closes: #105523. - * debian/control: s/API's/APIs/ Closes: #124423. - * debian/conffiles: Already handled by debhelper; removed. - * Conforms to Standards version 3.5.6: - * debian/copyright: Include module licensing exception and GSM and - ADPCM copyrights. - * debian/rules: - * Use dh_undocumented rather than a verbatim copy of undocumented.7. - * Pass ChangeLog to dh_installchangelogs. - * Support DEB_BUILD_OPTIONS. - - -- Matej Vela Tue, 25 Dec 2001 19:16:48 +0100 - -asterisk (0.1.6-1.2) unstable; urgency=low - - * NMU - * Fix makefiles, add -fPIC to builds. Closes: #104779 - - -- LaMont Jones Sun, 15 Jul 2001 15:15:46 -0600 - -asterisk (0.1.6-1.1) unstable; urgency=low - - * NMU with permission of Raphael Bossek. - * Corrected an error in channels/adtranvofr.h that prevented - big endian from compiling. (closes: #87273, #89868, #93913) - * Added build dependencies. - * Added the location of the upstream source to debian/copyright. - - -- Adrian Bunk Tue, 15 May 2001 00:22:31 +0200 - -asterisk (0.1.6-1) unstable; urgency=low - - * New upstream version. - - -- Raphael Bossek Mon, 19 Feb 2001 15:48:43 +0100 - diff --git a/debian/clean b/debian/clean deleted file mode 100644 index c3f0233..0000000 --- a/debian/clean +++ /dev/null @@ -1,6 +0,0 @@ -aclocal.m4 -doc/core-en_US.xml -utils/poll.c -menuselect/mxml/mxml.pc -menuselect.makeopts -menuselect/configure.lineno diff --git a/debian/compat b/debian/compat deleted file mode 100644 index f599e28..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -10 diff --git a/debian/control b/debian/control deleted file mode 100644 index 17d511e..0000000 --- a/debian/control +++ /dev/null @@ -1,361 +0,0 @@ -Source: asterisk -Priority: optional -Section: comm -Maintainer: Debian VoIP Team -Uploaders: - Bernhard Schmidt , - Daniel Pocock , - Jeremy Lainé , - Jonas Smedegaard , - Mark Purcell , - Tzafrir Cohen -Build-Depends: - autoconf, - automake, - binutils-dev, - dahdi-source, - debhelper (>= 10), - default-libmysqlclient-dev, - freetds-dev, - libasound2-dev, - libavcodec-dev, - libavdevice-dev, - libbluetooth-dev [linux-any], - libc-client2007e-dev, - libcap-dev [linux-any], - libcurl4-openssl-dev | libcurl-dev, - libedit-dev, - libradcli-dev | libfreeradius-client-dev | libradiusclient-ng-dev, - libgmime-3.0-dev, - libgsm1-dev, - libical-dev, - libiksemel-dev, - libjack-dev, - libjansson-dev (>= 2.11), - libldap-dev, - liblua5.1-0-dev, - libncurses-dev, - libneon27-gnutls-dev | libneon27-dev, - libnewt-dev, - libogg-dev, - libopencore-amrnb-dev, - libopencore-amrwb-dev, - libopenr2-dev [linux-any], - libopus-dev, - libopusfile-dev, - libpopt-dev, - libpq-dev, - libpri-dev, - libreadline-dev, - libresample1-dev, - libsdl-image1.2-dev, - libsnmp-dev, - libspandsp-dev, - libspeex-dev, - libspeexdsp-dev, - libsqlite3-dev, - libsrtp2-dev, - libss7-dev, - libssl-dev, - libsystemd-dev [linux-any], - libswscale-dev, - libtonezone-dev [linux-any], - libunbound-dev, - liburiparser-dev, - libvorbis-dev, - libvpb-dev [linux-any], - libxml2-dev, - libxslt1-dev, - portaudio19-dev, - unixodbc-dev, - uuid-dev, - zlib1g-dev -Standards-Version: 4.1.1 -Homepage: http://www.asterisk.org/ -Vcs-Git: https://salsa.debian.org/pkg-voip-team/asterisk.git -Vcs-Browser: https://salsa.debian.org/pkg-voip-team/asterisk - -Package: asterisk -Architecture: any -Depends: - adduser, - asterisk-config (= ${source:Version}) | asterisk-config-custom, - asterisk-core-sounds-en, - asterisk-modules (= ${binary:Version}), - lsb-base (>= 3.0-6), - ${misc:Depends}, - ${shlibs:Depends} -Provides: - asterisk-${asterisk:ABI} -Recommends: - asterisk-moh-opsound-gsm, - asterisk-voicemail | asterisk-voicemail-storage, - sox -Suggests: - asterisk-dahdi, - asterisk-dev, - asterisk-doc, - asterisk-ooh323, - asterisk-opus, - asterisk-vpb -Description: Open Source Private Branch Exchange (PBX) - Asterisk is an Open Source PBX and telephony toolkit. It is, in a - sense, middleware between Internet and telephony channels on the bottom, - and Internet and telephony applications at the top. - . - Asterisk can be used with Voice over IP (SIP, H.323, IAX and more) standards, - or the Public Switched Telephone Network (PSTN) through supported hardware. - . - Supported hardware: - . - * All Wildcard (tm) ISDN PRI cards from Digium (http://www.digium.com) - * HFC-S/HFC-4S-based ISDN BRI cards (Junghanns.NET, beroNet, Digium etc.) - * All TDM (FXO/FXS) cards from Digium - * Various clones of Digium cards such as those by OpenVox - * Xorcom Astribank USB telephony adapter (http://www.xorcom.com) - * Voicetronix OpenPCI, OpenLine and OpenSwitch cards - * CAPI-compatible ISDN cards (using the add-on package chan-capi) - * Full Duplex Sound Card (ALSA or OSS) supported by Linux - * Tormenta T1/E1 card (http://www.zapatatelephony.org) - * QuickNet Internet PhoneJack and LineJack (http://www.quicknet.net) - . - This is the main package that includes the Asterisk daemon and most channel - drivers and applications. - -Package: asterisk-modules -Architecture: any -Depends: - ${misc:Depends}, - ${shlibs:Depends} -Section: libs -Description: loadable modules for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package includes most of the loadable modules of the Asterisk package. - There is normally no need to explicitly install it. - -Package: asterisk-dahdi -Architecture: linux-any -Depends: - asterisk (= ${binary:Version}), - dahdi, - ${misc:Depends}, - ${shlibs:Depends} -Breaks: - asterisk-modules (<< 1:11.6.0~dfsg-2) -Replaces: - asterisk-modules (<< 1:11.6.0~dfsg-2) -Description: DAHDI devices support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package includes the DAHDI channel driver (chan_dahdi.so) and a number of - other Asterisk modules that require DAHDI support. They will not be useful - without kernel-level DAHDI support. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-vpb -Architecture: linux-any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Breaks: - asterisk-modules (<< 1:11.6.0~dfsg-1) -Replaces: - asterisk-modules (<< 1:11.6.0~dfsg-1) -Description: VoiceTronix devices support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package includes the VoiceTronix channel driver (chan_vpb.so). - It will not be useful without kernel-level VoiceTronix support. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-voicemail -Architecture: any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Provides: - asterisk-voicemail-storage -Conflicts: - asterisk-voicemail-storage -Description: simple voicemail support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package includes the standard files-based voicemail storage. This - is normally the one you use and is the one that will Just Work. The only - reason not to install it is if you want to use a different Asterisk - voicemail storage (ODBC or IMAP). - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-voicemail-imapstorage -Architecture: any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Provides: - asterisk-voicemail-storage -Conflicts: - asterisk-voicemail-storage -Description: IMAP voicemail storage support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package includes an IMAP-based voicemail storage: storing the - voicemail in a remote IMAP mail boxes. While more complex to set up, - it may be useful in some settings. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-voicemail-odbcstorage -Architecture: any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Provides: - asterisk-voicemail-storage -Conflicts: - asterisk-voicemail-storage -Description: ODBC voicemail storage support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package includes an database-based voicemail storage: storing the - voicemail in a database accessed through the ODBC interface. While more - complex to set up, it may be useful in some settings. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-ooh323 -Architecture: any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Description: H.323 protocol support for the Asterisk PBX - ooH323c - Asterisk is an Open Source PBX and telephony toolkit. - . - This channel driver (chan_ooh323c) provides support for the H.323 protocol - for Asterisk. This is an independent implementation that does not depend - on OpenH323, but may be less functional than the original chan_h323. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-mp3 -Architecture: any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Description: MP3 playback support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package provides support for playing MP3-encoded files in - Asterisk. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-mysql -Architecture: any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Description: MySQL database protocol support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package provides support for using a MySQL database to store - configuration, call detail records, and also provides generic access to - it from the dialplan. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-mobile -Architecture: linux-any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Description: Bluetooth phone support for the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package provides support for connecting Bluetooth devices to the - Asterisk PBX. It allows you to: - * Send and receive PSTN calls and SMS messages over a Bluetooth phone. - * Use a Bluetooth handset as a local phone connected to your PBX. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-tests -Architecture: linux-any -Depends: - asterisk (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Description: internal test modules of the Asterisk PBX - Asterisk is an Open Source PBX and telephony toolkit. - . - This package provides modules that run various functionality tests. - You would normally not install this package unless you test a build - of Asterisk. - . - For more information about the Asterisk PBX, have a look at the Asterisk - package. - -Package: asterisk-doc -Architecture: all -Multi-Arch: foreign -Depends: - ${misc:Depends} -Recommends: - asterisk -Section: doc -Description: Source code documentation for Asterisk - Asterisk is an Open Source PBX and telephony toolkit. - . - This package contains the documentation for configuring an Asterisk system. - -Package: asterisk-dev -Architecture: all -Multi-Arch: foreign -Depends: - ${misc:Depends} -Recommends: - asterisk -Section: devel -Description: Development files for Asterisk - Asterisk is an Open Source PBX and telephony toolkit. - . - This package contains the include files used if you wish to compile a - package which requires Asterisk's source file headers. - -Package: asterisk-config -Depends: - ${misc:Depends} -Recommends: - asterisk -Conflicts: - asterisk-config-custom -Replaces: - asterisk-config-custom -Architecture: all -Description: Configuration files for Asterisk - Asterisk is an Open Source PBX and telephony toolkit. - . - This package contains the default configuration files of Asterisk. - . - With program asterisk-config-custom in the asterisk package, - you can create an asterisk-config replacement package. diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index d6b5469..0000000 --- a/debian/copyright +++ /dev/null @@ -1,750 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: Asterisk -Source: http://downloads.asterisk.org/pub/asterisk - Excluded files: - * codecs/ilbc: due to patent issues - * doc/ (admin guide and reference): - Documentation that is generated from wiki.asterisk.org. No source - included here. License is CC-BY-SA, though. - * makeopts, moduleinfo: while we're at it. Makes modifications easier. - * soudss tarballs: while we're at it. Take lots of space and included in - other packages anyway. -Files-Excluded: - codecs/ilbc - doc/Asterisk-Admin-Guide - doc/Asterisk-Admin-Guide.pdf - doc/Asterisk-*-Reference.pdf - */.makeopts - */.*.makeopts - */.moduleinfo - */.*.moduleinfo - sounds/*.tar.gz - -Files: * -Copyright: 1999-2006, Brett Bryant - 1999-2006, Mark Spencer - 1999-2006, Oleksiy Krivoshey - 1999-2006, Russell Bryant - 1999-2006, Thorsten Lockert - 1999-2010, Anthony Minessale II - 1999-2010, Kevin P. Fleming - 1999-2016, Digium, Inc. - 2001,2005, Steve Underwood - 2002, Pauline Middelink - 2002,2004, Christos Ricudis - 2003, Jefferson Noxon - 2003, Paul Bagyenda - 2003,2005-2007, Tilghman Lesher - 2003-2006, Aheeva Technology - 2003-2012, Matthew D. Hardeman - 2004, Constantine Filin - 2004, The Internet Society - 2004-2005, Holger Schurig - 2004-2005, Horizon Wimba, Inc. - 2004-2005, inAccess Networks - 2004-2005, Steve Rodgers - 2004-2006, Andy Powell - 2004-2006, Ben Kramer - 2004-2006, Christian Richter - 2005, Attractel OOD - 2005, Jeff Ollie - 2005, Joseph Benden - 2005, Joshua Colp - 2005, Mikael Magnusson - 2005,2009, Olle E. Johansson - 2005, Oxymium sarl - 2005-2006, Claude Patry - 2005-2006, Kevin P. Fleming - 2005-2007, Cedric Hans - 2005-2007, Sven Slezak - 2005-2008,2012, Russell Bryant - 2006, Martin Portmann - 2006, Proformatique - 2006, Sergey Basmanov - 2006, Voop as - 2007, Redfish Solutions - 2007-2008, Luigi Rizzo - 2007-2008, Marta Carbone - 2007-2008, Sergio Fadda - 2007-2008, Trinity College Computing Center - 2008, Gary Cook - 2008, Roberto Casas - 2008, Sean Bright - 2008, Steve Murphy - 2008-2009, Eliel C. Sardanons (LU1ALY) - 2009, Attila Domjan - 2009, malleable, LLC. - 2009, Mark Michelson - 2010, Precise Networks, Inc. - 2011-2012, Terry Wilson - 2012, David M. Lee, II - 2012, Matt Jordan - 2013-2016, Fairview 5 Engineering, LLC. - 2014, Jonathan R. Rose - 2014, Kinsey Moore - 2014-2015, Richard Mudgett - 2015, Alexander Traud - 2015-2016, 2016, CFWare, LLC -License-Grant: - This program is free software, distributed under the terms of the GNU - General Public License Version 2. See the LICENSE file at the top of - the source tree. -License: GPL-2-Asterisk -Comment: This specifies the license used for most of Asterisk's files. - Informally: GPL-2 with exceptions for linking with OpenSSL, OpenH323 - and UW-Imap. - -Files: */configure -Copyright: 1992-1996,1998-2012, Free Software Foundation, Inc. -License: FSFUL - -Files: */missing -Copyright: 1996-1997, 1999-2000, 2002-2005, Free Software Foundation, Inc. -License-Grant: - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. -License: GPL-2+ with Autoconf exception - As a special exception to the GNU General Public License, if you - distribute this file as part of a program that contains a configuration - script generated by Autoconf, you may include it under the same - distribution terms that you use for the rest of that program. - -Files: */install-sh -Copyright: 1991, the Massachusetts Institute of Technology -License: MIT - -Files: */Makefile - Makefile.moddir_rules - Makefile.rules - apps/app_fax.c - channels/iax2/include/iax2.h - channels/iax2/include/parser.h - channels/misdn/chan_misdn_config.h - channels/misdn/ie.c - channels/misdn/isdn_lib.c - channels/misdn/isdn_lib.h - channels/misdn/isdn_msg_parser.c - codecs/log2comp.h - include/asterisk.h - include/asterisk/compat.h - include/asterisk/paths.h - include/asterisk/udptl.h - res/ari.make - rest-api-templates/ari.make.mustache -Copyright: 1999-2014, Digium, Inc. - 2004-2005, Christian Richter - 2005, Steve Underwood - 2007-2008, Dmitry Andrianov -License-Grant: - This program is free software, distributed under the terms of the GNU - General Public License -License: GPL-2 -Comment: - Version of license not mentioned. Assumed to be version 2. - -Files: apps/enter.h - apps/leave.h - channels/chan_phone.h - codecs/ex_adpcm.h - codecs/ex_alaw.h - codecs/ex_g722.h - codecs/ex_g726.h - codecs/ex_gsm.h - codecs/ex_ilbc.h - codecs/ex_lpc10.h - codecs/ex_speex.h - codecs/ex_ulaw.h - contrib/scripts/astversion - contrib/scripts/vmail.cgi -Copyright: 1999,2002, Linux Support Services, LLC. - 1999, Mark Spencer - 2008,2015, Digium, Inc. -License-Grant: - Distributed under the terms of the GNU General Public License -License: GPL-2 -Comment: - Version of license not mentioned. Assumed to be version 2. - -Files: channels/misdn/Makefile - codecs/lpc10/Makefile - doc/Makefile - main/stdtime/Makefile - third-party/Makefile - third-party/pjproject/Makefile - utils/db1-ast/Makefile -Copyright: None -License: None -Comment: - Makefiles listed explicitly to counteract */Makefile elsewhere. - -Files: include/solaris-compat/sys/queue.h - main/editline/* - utils/db1-ast/* -Copyright: 1989-1994, The Regents of the University of California. -License: BSD-4-Clause-UC - -Files: addons/chan_ooh323.* - addons/ooh323cDriver.* - addons/ooh323c/* -Copyright: 2004-2005, Objective Systems, Inc. - 2005, Page Iberica, S.A. -License-Grant: - This software is furnished under an open source license and may be used - and copied only in accordance with the terms of this license. The text - of the license may generally be found in the root directory of this - installation in the COPYING file. -License: GPL-2 - -Files: codecs/gsm/* - codecs/gsm/Makefile -Copyright: 1992-1996, Carsten Bormann - 1992-1996, Jutta Degener - 1999, Stanley J. Brooks -License: GSM -Comment: - Makefile listed explicitly to counteract */Makefile elsewhere. - -Files: codecs/speex/* -Copyright: 2002-2003,2007-2008, Jean-Marc Valin - 2008, Thorvald Natvig -License: BSD-3-Clause~Xiph - -Files: codecs/speex/resample.c - codecs/speex/speex_resampler.h - main/editline/np/strlcat.c - main/editline/np/strlcpy.c -Copyright: 1998 Todd C. Miller - 2007-2008, Jean-Marc Valin - 2008, Thorvald Natvig -License: BSD-3-Clause - -Files: main/editline/editline.3 - main/editline/editrc.5 - main/editline/np/fgetln.c - main/editline/read.h - main/editline/readline.c - main/editline/readline.h -Copyright: 1997-2001, The NetBSD Foundation, Inc. -License: BSD-4-Clause~NetBSD - -Files: contrib/scripts/live_ast - contrib/scripts/sip_nat_settings - menuselect/contrib/menuselect-dummy -Copyright: 2005, 2007-2008, Tzafrir Cohen -License: GPL-2+ - -Files: main/stdtime/private.h - main/stdtime/tzfile.h -Copyright: None -License: public-domain - This file is in the public domain, so clarified as of 1996-06-05 by - Arthur David Olson. - -Files: formats/msgsm.h -Copyright: None -License: None -Comment: - File lacks copyright and licensing, but contains the comment - "Conversion routines derived from code by guido@sienanet.it" which - might be interpreted as a copyright holder not granting a license. - More likely, however, the header file is considered non-copyrightable - header with merely a remark about origin of inspiration: - . - * File was introduced in Asterisk 0.1.1 (according to git sources), - together with file format_wav_gsm.c containing same comment but - also explicit copyright and licensing: - . - . - * Asterisk 0.1.1 was released in 1999 (according to git sources), - at about which time Guido Giorgetti released - audio-related Delphi 3 code as "Freeware": - - - . - . - See also . - -Files: - utils/frame.c - utils/frame.h - utils/stereorize.c -Copyright: - Mark Roberts - Michael Labuschke -License-Grant: - > Have you intended for that package to be released under a Free - > Software license (basically: one that allows distribution and - > modification)? If so, could you please provide a version of that - > source package licensed under some standard free software license - > (GPL? LGPL? MIT?) - . - Thank you for your trouble. I intended the software to be free. GPL is - fine. Please add the appropriate text to the file for me, in my name. -License: GPL-2 -Comment: - stereorize.c, frame.c and frame.h: originally from markdsp: - http://web.archive.org/web/20060525134915/http://www.manumark.de/markdsp.html - . - Code lacks explicit licensing, but author notified by private mail the - license grant included here. - -Files: agi/eagi-sphinx-test.c agi/eagi-test.c -Copyright: None -License: public-domain - This code is released into public domain without any warranty of any - kind. - -Files: apps/app_exec.c - apps/app_followme.c - apps/app_morsecode.c - apps/app_sayunixtime.c - apps/app_stack.c - apps/app_verbose.c - funcs/func_cut.c - funcs/func_realtime.c - res/res_limit.c -Copyright: - 2003-2006, Tilghman Lesher - 2005-2006, BJ Weschke - 2006, Digium, Inc. - 2006, Philipp Dunkel -License: Unrestricted~author - This code is released by the author with no restrictions on usage. - -Files: main/config.c -Copyright: 1999, - 2010, Digium, Inc. - 2001, Simon Tatham. -License: Expat and GPL-2-Asterisk - -Files: contrib/scripts/clang-scan-build -Copyright: 2015, Diederik de Groot -License-Grant: - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. -License: GPL-2+ - -Files: funcs/func_curl.c -Copyright: 2004-2006, Tilghman Lesher -License: Unrestricted~app_curl - app_curl.c is distributed with no restrictions on usage or - redistribution. - -Files: main/dns.c -Copyright: 1983, 1989, 1993, The Regents of the University of California - 1993, Digital Equipment Corporation - 1999-2006, Thorsten Lockert -License-Grant: - This program is free software, distributed under the terms of the GNU - General Public License Version 2. See the LICENSE file at the top of - the source tree. -License: BSD-4-Clause-UC and ISC and GPL-2-Asterisk - -Files: main/editline/np/vis.c -Copyright: 1989,1993, The Regents of the University of California. - 1999, The NetBSD Foundation, Inc. -License: BSD-4-Clause-UC - -Files: main/ast_expr2.c - main/ast_expr2.h - res/ael/ael.tab.h -Copyright: 1984, 1989-1990, 2000-2011, Free Software Foundation, Inc. -License-Grant: - This program is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your - option) any later version. -License: GPL-3+ with bison exception - As a special exception, you may create a larger work that contains part - or all of the Bison parser skeleton and distribute that work under - terms of your choice, so long as that work isn't itself a parser - generator using the skeleton or a modified version thereof as a parser - skeleton. Alternatively, if you modify or redistribute the parser - skeleton itself, you may (at your option) remove this special - exception, which will cause the skeleton and the resulting Bison output - files to be licensed under the GNU General Public License without this - special exception. - -Files: main/sha1.c include/asterisk/sha1.h -Copyright: 2011 IETF Trust and the persons identified as authors of the code. -License: BSD-3-Clause~IETF - -Files: debian/patches/mpglib -Copyright: 1995,1996,1997 by Michael Hipp -License-Grant: - you may use this source under GPL terms! -License: GPL-2 -Comment: - Version of license not mentioned. Assumed to be version 2. - -Files: funcs/func_pitchshift.c -Copyright: 1999-2009, Stephan M. Bernsee - 2010, Digium, Inc. -License-Grant: - This program is free software, distributed under the terms of the GNU - General Public License Version 2. See the LICENSE file at the top of - the source tree. -License: WOL and GPL-2-Asterisk - -Files: main/plc.c -Copyright: 2004, Steve Underwood -License-Grant: - This program is free software, distributed under the terms of the GNU - General Public License Version 2. See the LICENSE file at the top of - the source tree. - . - This version may be optionally licenced under the GNU LGPL licence. -License: LGPL-2.1 or GPL-2-Asterisk -Comment: - Version of LGPL license not mentioned. Assumed to be version 2.1. - -Files: main/md5.c -Copyright: None -License: public-domain - This code was written by Colin Plumb in 1993, no copyright is claimed. - This code is in the public domain; do with it what you wish. - -Files: main/strcompat.c - menuselect/strcompat.c -Copyright: 1997 Todd C. Miller - 1999-2006, Digium, Inc. - 2004 Darren Tucker -License: ISC - -Files: include/asterisk/poll-compat.h - main/poll.c -Copyright: 1995-2002, Brian M. Clapper -License: BSD-4-Clause~Clapper - -Files: include/jitterbuf.h -Copyright: 2004-2005, Horizon Wimba, Inc - on this file is disclaimed to Digium for inclusion in Asterisk -License-Grant: - This program is free software, distributed under the terms of - the GNU Lesser (Library) General Public License -License: LGPL-2.1 -Comment: - Version of license not mentioned. Assumed to be version 2.1. - -Files: static-http/prototype.js -Copyright: 2005-2008, Sam Stephenson -License-Grant: - Prototype is freely distributable under the terms of an MIT-style - license. - . - For details, see the Prototype web site: http://www.prototypejs.org/ -License: Expat~disclaimer -Comment: - The web page http://prototypejs.org/license.html contains (as of - 2016-07-31) the referenced license. - -Files: menuselect/menuselect_gtk.c -Copyright: 2007, Russell Bryant -License: GPL-2-Asterisk -Comment: - File lacks copyright and licensing, but contains UI dialogue string - "Russell Bryant Copyright (C) 2007" which may seem - like a copyright holder not granting a license. We instead assume that - the file has same licensing as the project generally. - . - See https://issues.asterisk.org/jira/browse/ASTERISK-24173 - -Files: debian/patches/opus.patch -Copyright: 2014, Lorenzo Miniero -License-Grant: - Distributed under the terms of the GNU General Public License -License: GPL-2 -Comment: - Version of license not mentioned. Assumed to be version 2. - -License: GPL-2-Asterisk - Asterisk is distributed under the GNU General Public License version 2 - and is also available under alternative licenses negotiated directly - with Digium, Inc. If you obtained Asterisk under the GPL, then the GPL - applies to all loadable Asterisk modules used on your system as well, - except as defined below. The GPL (version 2) is included in this - source tree in the file COPYING. - . - This package also includes various components that are not part of - Asterisk itself; these components are in the 'contrib' directory - and its subdirectories. These components are also distributed under the - GPL version 2 as well. - . - Digium, Inc. (formerly Linux Support Services) holds copyright - and/or sufficient licenses to all components of the Asterisk - package, and therefore can grant, at its sole discretion, the ability - for companies, individuals, or organizations to create proprietary or - Open Source (even if not GPL) modules which may be dynamically linked at - runtime with the portions of Asterisk which fall under our - copyright/license umbrella, or are distributed under more flexible - licenses than GPL. - . - If you wish to use our code in other GPL programs, don't worry -- - there is no requirement that you provide the same exception in your - GPL'd products (although if you've written a module for Asterisk we - would strongly encourage you to make the same exception that we do). - . - Specific permission is also granted to link Asterisk with OpenSSL, OpenH323 - and/or the UW IMAP Toolkit and distribute the resulting binary files. - . - In addition, Asterisk implements two management/control protocols: the - Asterisk Manager Interface (AMI) and the Asterisk Gateway Interface - (AGI). It is our belief that applications using these protocols to - manage or control an Asterisk instance do not have to be licensed - under the GPL or a compatible license, as we believe these protocols - do not create a 'derivative work' as referred to in the GPL. However, - should any court or other judiciary body find that these protocols do - fall under the terms of the GPL, then we hereby grant you a license to - use these protocols in combination with Asterisk in external - applications licensed under any license you wish. - . - The 'Asterisk' name and logos are trademarks owned by Digium, Inc., - and use of them is subject to our trademark licensing policies. If you - wish to use these trademarks for purposes other than simple - redistribution of Asterisk source code obtained from Digium, you - should contact our licensing department to determine the necessary - steps you must take. For more information on this policy, please read: - . - http://www.digium.com/en/company/profile/trademarkpolicy.php -License-Reference: /usr/share/common-licenses/GPL-2 - -License: GPL-2 -License-Reference: /usr/share/common-licenses/GPL-2 - -License: LGPL-2.1 -License-Reference: /usr/share/common-licenses/LGPL-2.1 - -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - . - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - -License: Expat~disclaimer - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -License: MIT - Permission to use, copy, modify, distribute, and sell this software and - its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and that - both that copyright notice and this permission notice appear in - supporting documentation, and that the name of M.I.T. not be used in - advertising or publicity pertaining to distribution of the software - without specific, written prior permission. M.I.T. makes no - representations about the suitability of this software for any purpose. - It is provided "as is" without express or implied warranty. - -License: BSD-3-Clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - . - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -License: BSD-3-Clause~Xiph - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of the Xiph.org Foundation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -License: BSD-3-Clause~IETF - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - . - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of Internet Society, IETF or IETF Trust, nor the - names of specific contributors, may be used to endorse or promote - products derived from this software without specific prior written - permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -License: BSD-4-Clause-UC - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - . - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. All advertising materials mentioning features or use of this - software must display the following acknowledgement: This product - includes software developed by the University of California, - Berkeley and its contributors. - 4. Neither the name of the University nor the names of itscontributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -License: BSD-4-Clause~NetBSD - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - . - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. All advertising materials mentioning features or use of this - software must display the following acknowledgement: This product - includes software developed by the NetBSD Foundation, Inc. and its - contributors. - 4. Neither the name of The NetBSD Foundation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND - CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - -License: BSD-4-Clause~Clapper - Redistribution and use in source and binary forms are permitted - provided that: - . - (1) source distributions retain this entire copyright notice and - comment; - . - (2) modifications made to the software are prominently mentioned, and a - copy of the original software (or a pointer to its location) are - included; and - . - (3) distributions including binaries display the following - acknowledgement: "This product includes software developed by Brian - M. Clapper " in the documentation or other - materials provided with the distribution. - . - The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -License: GSM - Any use of this software is permitted provided that this notice is not - removed and that neither the authors nor the Technische Universitaet - Berlin are deemed to have made any representations as to the - suitability of this software for any purpose nor are held responsible - for any defects of this software. THERE IS ABSOLUTELY NO WARRANTY FOR - THIS SOFTWARE. - . - As a matter of courtesy, the authors request to be informed about uses - this software has found, about bugs in this software, and about any - improvements that may be of general interest. - -License: ISC - Permission to use, copy, modify, and distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - -License: WOL - The Wide Open License (WOL) - . - Permission to use, copy, modify, distribute and sell this software and - its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice and this license appear in all - source copies. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR - IMPLIED WARRANTY OF ANY KIND. See http://www.dspguru.com/wol.htm for - more information. - -License: FSFUL - This configure script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it. diff --git a/debian/copyright-check b/debian/copyright-check deleted file mode 100755 index e0eef4f..0000000 --- a/debian/copyright-check +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# fail if check fails -export DEB_MAINTAINER_MODE=1 - -# bootstrap if this is first ever copyright-check -test -f debian/copyright_hints | touch debian/copyright_hints - -# these may both fail - we want its fallout for further analysis -debian/rules.copyright-check pre-build || true -debian/rules.copyright-check clean || true diff --git a/debian/copyright.pjproject b/debian/copyright.pjproject deleted file mode 100644 index a56e019..0000000 --- a/debian/copyright.pjproject +++ /dev/null @@ -1,334 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: PJPROJECT -Source: https://github.com/asterisk/pjproject -Comment: Currently packaging the Asterisk fork of PJProject, as it supports - shared libraries. - . - Upstream source repackaged to address DFSG concerns and other issues: - * Copyright-protected code without DFSG-free license - (g7221 ilbc milenage s60_g729_bitstream.h BaseClasses ApiLock.*) - * Copyright-protected graphics ICC profiles without DFSG-free license - (*.png) - * Binary Java files potentially with non-free parts - (*.jar) - * Convenience code copies - (gsm resample speex srtp) -Files-Excluded: - third_party/g7221 - third_party/gsm - third_party/ilbc - third_party/milenage - third_party/resample - third_party/speex - third_party/srtp - third_party/yuv - third_party/webrtc - third_party/BaseClasses - pjmedia/src/pjmedia-audiodev/s60_g729_bitstream.h - pjsip-apps/src/pjsua/bb10/assets/images/teluu-logo.png - pjsip-apps/src/pjsua/android/gradle/wrapper/gradle-wrapper.jar - pjsip-apps/src/pjsua/ios/ipjsua/Default@2x.png - pjsip-apps/src/pjsua/ios/ipjsua/Default-568h@2x.png - pjsip-apps/src/pjsua/ios/ipjsua/Default.png - pjsip-apps/src/pjsua/winrt/cli/uwp/Assets/teluu-logo.png - pjsip-apps/src/pjsua/winrt/cli/wp8/Assets/teluu-logo.png - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipBackEnd/ApiLock.cpp - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipBackEnd/ApiLock.h - pjsip-apps/src/swig/java/android/gradle/wrapper/gradle-wrapper.jar - -Files: * -Copyright: - 1993-2006, Douglas C. Schmidt - 2003-2008, Benny Prijono - 2007-2009, Keystream AB - 2007-2009, Konftel AB - 2008-2016, Teluu Inc. - 2010-2012, Regis Montoya (r3gis) - 2011 Dan Arrhenius -License-Grant: - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. -License: GPL-2+ -Comment: - Some files has additional alternative licensing ignored as irrelevant - for our redistribution. - -Files: pjsip-apps/src/pjsua/winrt/gui/uwp/Voip/Helpers/AppServiceHelper.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/Voip/Helpers/VoipCallHelper.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/Voip/MainPage.xaml.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipBackEnd/pch.cpp - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipBackEnd/pch.h - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipHost/VoipHost.cpp - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipTasks/AppService.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipTasks/BackgroundOperations/BackgroundOperations.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipTasks/CallRtcTask.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipTasks/Helpers/Current.cs - pjsip-apps/src/pjsua/winrt/gui/uwp/VoipTasks/Helpers/VccCallHelper.cs -Copyright: Microsoft -License-Grant: - This code is licensed under the MIT License (MIT). -License: Expat -Comment: - Assuming the Expat flavor of the MIT family of licenses. - -Files: pjlib/src/pj/compat/longjmp_i386.S - pjlib-util/src/pjlib-util/getopt.c -Copyright: Mike Borella - 1987-1998, Free Software Foundation, Inc. -License-Grant: - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. -License: LGPL-2+ -Comment: - pjlib-util/include/pjlib-util/getopt.h has the same license boilerplate, - only it has a comment "this file has now become GPL" on top (comment - removed by Upstream). - -Files: third_party/threademulation/include/ThreadEmulation.h - third_party/threademulation/src/ThreadEmulation.cpp -Copyright: Microsoft Corporation -License: Ms-PL -Comment: - Code lack licensing (contains only a standard disclaimer). File - "third_party/threademulation/Microsoft Permissive License.txt" is - assumed to apply. - -Files: pjsip-apps/src/pjsua/bb10/bar-descriptor.xml -Copyright: 2011-2013, Research In Motion Limited -License-Grant: - Licensed under the Apache License, Version 2.0 (the "License"); you may - not use this file except in compliance with the License. You may obtain - a copy of the License at -License: Apache-2 - -Files: pjlib/src/pj/sock_linux_kernel.c -Copyright: 1983, 1993, The Regents of the University of California. - 2003-2008, Benny Prijono - 2008-2011, Teluu Inc. -License-Grant: - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. -License: BSD-4-clause and GPL-2+ - -Files: aconfigure -Copyright: 1992-1996, 1998-2012, Free Software Foundation, Inc. -License: FSFUL - -Files: pjlib/src/pj/compat/setjmp_i386.S -Copyright: 1995-1997, 2000-2001, Free Software Foundation, Inc. -License-Grant: - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. -License: LGPL-2.1+ - -Files: third_party/mp3/BladeMP3EncDLL.h -Copyright: 1999-2002 A.L. Faber -License-Grant: - This library is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. -License: LGPL-2.1+ - -Files: install-sh -Copyright: 1991, the Massachusetts Institute of Technology -License: NTP - -Files: pjmedia/src/pjmedia/alaw_ulaw.c -Copyright: Sun Microsystems, Inc. -License: Rdisc~code - -Files: pjlib-util/src/pjlib-util/crc32.c -Copyright: None -License: public-domain - This file is partly taken from Crypto++ library - () and - . - . - Since the original version of the code is put in public domain, this - file is put on public domain as well. - -Files: pjlib-util/src/pjlib-util/md5.c -Copyright: None -License: public-domain - This code is in the public domain; do with it what you wish. - -Files: pjlib-util/src/pjlib-util/sha1.c -Copyright: None -License: public-domain - Still 100% public domain - -Files: debian/* -Copyright: 2013, Tzafrir Cohen -License: GPL-2+ - -Files: debian/copyright-check -Copyright: 2016-2017, Jonas Smedegaard -License: GPL-3+ - -License: Apache-2 -License-Reference: /usr/share/common-licenses/Apache-2.0 - -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - . - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -License: FSFUL - This configure script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it. - -License: GPL-2+ -License-Reference: /usr/share/common-licenses/GPL-2 - -License: GPL-3+ -License-Reference: /usr/share/common-licenses/GPL-3 - -License: LGPL-2+ -License-Reference: /usr/share/common-licenses/LGPL-2 - -License: LGPL-2.1+ -License-Reference: /usr/share/common-licenses/LGPL-2.1 - -License: Ms-PL - Microsoft Permissive License (Ms-PL) - . - This license governs use of the accompanying software. If you use the - software, you accept this license. If you do not accept the license, do - not use the software. - . - 1. Definitions - The terms 'reproduce,' 'reproduction,' 'derivative works,' and - 'distribution' have the same meaning here as under U.S. copyright - law. - A 'contribution' is the original software, or any additions or - changes to the software. - A 'contributor' is any person that distributes its contribution - under this license. - 'Licensed patents' are a contributor's patent claims that read - directly on its contribution. - . - 2. Grant of Rights - (A) Copyright Grant- Subject to the terms of this license, including - the license conditions and limitations in section 3, each - contributor grants you a non-exclusive, worldwide, royalty-free - copyright license to reproduce its contribution, prepare - derivative works of its contribution, and distribute its - contribution or any derivative works that you create. - (B) Patent Grant- Subject to the terms of this license, including - the license conditions and limitations in section 3, each - contributor grants you a non-exclusive, worldwide, royalty-free - license under its licensed patents to make, have made, use, - sell, offer for sale, import, and/or otherwise dispose of its - contribution in the software or derivative works of the - contribution in the software. - . - 3. Conditions and Limitations - (A) No Trademark License- This license does not grant you rights to - use any contributors' name, logo, or trademarks. - (B) If you bring a patent claim against any contributor over patents - that you claim are infringed by the software, your patent - license from such contributor to the software ends - automatically. - (C) If you distribute any portion of the software, you must retain - all copyright, patent, trademark, and attribution notices that - are present in the software. - (D) If you distribute any portion of the software in source code - form, you may do so only under this license by including a - complete copy of this license with your distribution. If you - distribute any portion of the software in compiled or object - code form, you may only do so under a license that complies with - this license. - (E) The software is licensed "as-is." You bear the risk of using it. - The contributors give no express warranties, guarantees or - conditions. You may have additional consumer rights under your - local laws which this license cannot change. To the extent - permitted under your local laws, the contributors exclude the - implied warranties of merchantability, fitness for a particular - purpose and non-infringement. - -License: NTP - Permission to use, copy, modify, distribute, and sell this software and - its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appear in all copies and that - both that copyright notice and this permission notice appear in - supporting documentation, and that the name of M.I.T. not be used in - advertising or publicity pertaining to distribution of the software - without specific, written prior permission. M.I.T. makes no - representations about the suitability of this software for any purpose. - It is provided "as is" without express or implied warranty. - -License: BSD-4-clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the - distribution. - 3. All advertising materials mentioning features or use of this - software must display the following acknowledgement: This product - includes software developed by the University of California, - Berkeley and its contributors. - 4. Neither the name of the University nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -License: Rdisc~code - This source code is a product of Sun Microsystems, Inc. and is provided - for unrestricted use. Users may copy or modify this source code - without charge. - . - SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND - INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A - PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE - PRACTICE. - . - Sun source code is provided with no support and without any obligation - on the part of Sun Microsystems, Inc. to assist in its use, correction, - modification or enhancement. - . - SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS - SOFTWARE OR ANY PART THEREOF. - . - In no event will Sun Microsystems, Inc. be liable for any lost revenue - or profits or other special, indirect and consequential damages, even - if Sun has been advised of the possibility of such damages. diff --git a/debian/copyright_hints b/debian/copyright_hints deleted file mode 100644 index e1646be..0000000 --- a/debian/copyright_hints +++ /dev/null @@ -1,2380 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: FIXME -Upstream-Contact: FIXME -Source: FIXME -Disclaimer: Autogenerated by CDBS - -Files: Makefile - Makefile.moddir_rules - Makefile.rules - README - addons/Makefile - addons/chan_mobile.c - addons/res_config_mysql.c - apps/Makefile - apps/app_adsiprog.c - apps/app_agent_pool.c - apps/app_authenticate.c - apps/app_bridgewait.c - apps/app_cdr.c - apps/app_celgenuserevent.c - apps/app_chanisavail.c - apps/app_confbridge.c - apps/app_controlplayback.c - apps/app_dahdiras.c - apps/app_dial.c - apps/app_directory.c - apps/app_disa.c - apps/app_echo.c - apps/app_externalivr.c - apps/app_flash.c - apps/app_getcpeid.c - apps/app_ices.c - apps/app_image.c - apps/app_ivrdemo.c - apps/app_macro.c - apps/app_meetme.c - apps/app_milliwatt.c - apps/app_minivm.c - apps/app_mp3.c - apps/app_nbscat.c - apps/app_osplookup.c - apps/app_playback.c - apps/app_playtones.c - apps/app_privacy.c - apps/app_queue.c - apps/app_read.c - apps/app_record.c - apps/app_senddtmf.c - apps/app_sendtext.c - apps/app_setcallerid.c - apps/app_softhangup.c - apps/app_speech_utils.c - apps/app_stasis.c - apps/app_system.c - apps/app_talkdetect.c - apps/app_test.c - apps/app_transfer.c - apps/app_url.c - apps/app_userevent.c - apps/app_voicemail.c - apps/app_waitforring.c - apps/app_waitforsilence.c - apps/app_zapateller.c - apps/confbridge/conf_chan_announce.c - apps/confbridge/conf_chan_record.c - apps/confbridge/conf_config_parser.c - apps/confbridge/confbridge_manager.c - apps/confbridge/include/confbridge.h - bridges/Makefile - bridges/bridge_builtin_features.c - bridges/bridge_builtin_interval_features.c - bridges/bridge_holding.c - bridges/bridge_native_rtp.c - bridges/bridge_simple.c - bridges/bridge_softmix.c - build_tools/get_documentation.py - build_tools/post_process_documentation.py - cdr/Makefile - cdr/cdr_csv.c - cdr/cdr_custom.c - cdr/cdr_odbc.c - cdr/cdr_radius.c - cdr/cdr_sqlite3_custom.c - cdr/cdr_tds.c - cel/Makefile - cel/cel_custom.c - cel/cel_manager.c - cel/cel_radius.c - cel/cel_sqlite3_custom.c - cel/cel_tds.c - channels/Makefile - channels/chan_alsa.c - channels/chan_bridge_media.c - channels/chan_console.c - channels/chan_dahdi.c - channels/chan_dahdi.h - channels/chan_iax2.c - channels/chan_mgcp.c - channels/chan_motif.c - channels/chan_multicast_rtp.c - channels/chan_nbs.c - channels/chan_oss.c - channels/chan_phone.c - channels/chan_pjsip.c - channels/chan_sip.c - channels/chan_skinny.c - channels/dahdi/bridge_native_dahdi.c - channels/dahdi/bridge_native_dahdi.h - channels/iax2/codec_pref.c - channels/iax2/firmware.c - channels/iax2/format_compatibility.c - channels/iax2/include/codec_pref.h - channels/iax2/include/firmware.h - channels/iax2/include/format_compatibility.h - channels/iax2/parser.c - channels/iax2/provision.c - channels/pjsip/dialplan_functions.c - channels/pjsip/include/chan_pjsip.h - channels/pjsip/include/dialplan_functions.h - channels/sig_analog.c - channels/sig_analog.h - channels/sig_pri.c - channels/sig_pri.h - channels/sig_ss7.c - channels/sig_ss7.h - channels/sip/config_parser.c - channels/sip/dialplan_functions.c - channels/sip/include/config_parser.h - channels/sip/include/dialog.h - channels/sip/include/dialplan_functions.h - channels/sip/include/globals.h - channels/sip/include/reqresp_parser.h - channels/sip/include/route.h - channels/sip/include/security_events.h - channels/sip/include/sip.h - channels/sip/include/sip_utils.h - channels/sip/reqresp_parser.c - channels/sip/route.c - channels/sip/security_events.c - channels/sip/utils.c - codecs/Makefile - codecs/codec_a_mu.c - codecs/codec_adpcm.c - codecs/codec_alaw.c - codecs/codec_dahdi.c - codecs/codec_g722.c - codecs/codec_g726.c - codecs/codec_gsm.c - codecs/codec_lpc10.c - codecs/codec_resample.c - codecs/codec_speex.c - codecs/codec_ulaw.c - codecs/ex_adpcm.h - codecs/ex_alaw.h - codecs/ex_g722.h - codecs/ex_g726.h - codecs/ex_gsm.h - codecs/ex_ilbc.h - codecs/ex_lpc10.h - codecs/ex_speex.h - codecs/ex_ulaw.h - configs/samples/muted.conf.sample - contrib/Makefile - contrib/ast-db-manage/config/versions/581a4264e537_adding_extensions.py - contrib/scripts/astversion - contrib/scripts/autosupport - contrib/scripts/dbsep.cgi - contrib/scripts/lookup.agi - contrib/scripts/refcounter.py - contrib/scripts/voicemailpwcheck.py - contrib/utils/zones2indications.c - doc/IAX2-security.txt - formats/Makefile - formats/format_g723.c - formats/format_g729.c - formats/format_gsm.c - formats/format_h263.c - formats/format_h264.c - formats/format_ilbc.c - formats/format_jpeg.c - formats/format_pcm.c - formats/format_vox.c - formats/format_wav.c - formats/format_wav_gsm.c - funcs/Makefile - funcs/func_aes.c - funcs/func_audiohookinherit.c - funcs/func_blacklist.c - funcs/func_callcompletion.c - funcs/func_callerid.c - funcs/func_channel.c - funcs/func_config.c - funcs/func_devstate.c - funcs/func_dialplan.c - funcs/func_env.c - funcs/func_extstate.c - funcs/func_frame_trace.c - funcs/func_groupcount.c - funcs/func_hangupcause.c - funcs/func_holdintercept.c - funcs/func_jitterbuffer.c - funcs/func_module.c - funcs/func_pitchshift.c - funcs/func_pjsip_aor.c - funcs/func_pjsip_contact.c - funcs/func_pjsip_endpoint.c - funcs/func_presencestate.c - funcs/func_shell.c - funcs/func_speex.c - funcs/func_srv.c - funcs/func_sysinfo.c - funcs/func_talkdetect.c - funcs/func_timeout.c - funcs/func_uri.c - funcs/func_version.c - funcs/func_volume.c - include/asterisk.h - include/asterisk/acl.h - include/asterisk/adsi.h - include/asterisk/ael_structs.h - include/asterisk/agi.h - include/asterisk/alaw.h - include/asterisk/aoc.h - include/asterisk/app.h - include/asterisk/ari.h - include/asterisk/ast_expr.h - include/asterisk/ast_version.h - include/asterisk/astdb.h - include/asterisk/astmm.h - include/asterisk/astobj.h - include/asterisk/astosp.h - include/asterisk/audiohook.h - include/asterisk/autochan.h - include/asterisk/backtrace.h - include/asterisk/bridge.h - include/asterisk/bridge_after.h - include/asterisk/bridge_basic.h - include/asterisk/bridge_channel.h - include/asterisk/bridge_channel_internal.h - include/asterisk/bridge_features.h - include/asterisk/bridge_internal.h - include/asterisk/bridge_roles.h - include/asterisk/bridge_technology.h - include/asterisk/bucket.h - include/asterisk/buildinfo.h - include/asterisk/calendar.h - include/asterisk/callerid.h - include/asterisk/causes.h - include/asterisk/ccss.h - include/asterisk/cdr.h - include/asterisk/cel.h - include/asterisk/celt.h - include/asterisk/channel.h - include/asterisk/channel_internal.h - include/asterisk/channelstate.h - include/asterisk/chanvars.h - include/asterisk/cli.h - include/asterisk/codec.h - include/asterisk/compat.h - include/asterisk/compiler.h - include/asterisk/config.h - include/asterisk/config_options.h - include/asterisk/core_local.h - include/asterisk/core_unreal.h - include/asterisk/crypto.h - include/asterisk/datastore.h - include/asterisk/devicestate.h - include/asterisk/dial.h - include/asterisk/dlinkedlists.h - include/asterisk/dnsmgr.h - include/asterisk/doxygen/architecture.h - include/asterisk/doxygen/asterisk-git-howto.h - include/asterisk/doxygen/commits.h - include/asterisk/doxygen/licensing.h - include/asterisk/doxygen/releases.h - include/asterisk/doxygen/reviewboard.h - include/asterisk/doxyref.h - include/asterisk/dsp.h - include/asterisk/dundi.h - include/asterisk/endian.h - include/asterisk/endpoints.h - include/asterisk/enum.h - include/asterisk/event.h - include/asterisk/event_defs.h - include/asterisk/extconf.h - include/asterisk/features.h - include/asterisk/features_config.h - include/asterisk/file.h - include/asterisk/format.h - include/asterisk/format_cache.h - include/asterisk/format_cap.h - include/asterisk/format_compatibility.h - include/asterisk/frame.h - include/asterisk/framehook.h - include/asterisk/fskmodem.h - include/asterisk/fskmodem_float.h - include/asterisk/fskmodem_int.h - include/asterisk/global_datastores.h - include/asterisk/hashtab.h - include/asterisk/heap.h - include/asterisk/http.h - include/asterisk/http_websocket.h - include/asterisk/image.h - include/asterisk/inline_api.h - include/asterisk/io.h - include/asterisk/json.h - include/asterisk/linkedlists.h - include/asterisk/localtime.h - include/asterisk/lock.h - include/asterisk/logger.h - include/asterisk/manager.h - include/asterisk/max_forwards.h - include/asterisk/md5.h - include/asterisk/media_index.h - include/asterisk/message.h - include/asterisk/mixmonitor.h - include/asterisk/mod_format.h - include/asterisk/module.h - include/asterisk/monitor.h - include/asterisk/musiconhold.h - include/asterisk/netsock.h - include/asterisk/netsock2.h - include/asterisk/network.h - include/asterisk/optional_api.h - include/asterisk/options.h - include/asterisk/opus.h - include/asterisk/parking.h - include/asterisk/paths.h - include/asterisk/pbx.h - include/asterisk/pickup.h - include/asterisk/presencestate.h - include/asterisk/privacy.h - include/asterisk/res_fax.h - include/asterisk/res_hep.h - include/asterisk/res_mwi_external.h - include/asterisk/res_odbc_transaction.h - include/asterisk/res_pjsip.h - include/asterisk/res_pjsip_body_generator_types.h - include/asterisk/res_pjsip_outbound_publish.h - include/asterisk/res_pjsip_presence_xml.h - include/asterisk/res_pjsip_pubsub.h - include/asterisk/res_pjsip_session.h - include/asterisk/rtp_engine.h - include/asterisk/say.h - include/asterisk/sched.h - include/asterisk/security_events.h - include/asterisk/security_events_defs.h - include/asterisk/select.h - include/asterisk/sem.h - include/asterisk/silk.h - include/asterisk/sip_api.h - include/asterisk/slin.h - include/asterisk/smdi.h - include/asterisk/smoother.h - include/asterisk/sorcery.h - include/asterisk/sounds_index.h - include/asterisk/speech.h - include/asterisk/srv.h - include/asterisk/stasis.h - include/asterisk/stasis_app.h - include/asterisk/stasis_app_device_state.h - include/asterisk/stasis_app_impl.h - include/asterisk/stasis_app_mailbox.h - include/asterisk/stasis_app_playback.h - include/asterisk/stasis_app_recording.h - include/asterisk/stasis_app_snoop.h - include/asterisk/stasis_bridges.h - include/asterisk/stasis_cache_pattern.h - include/asterisk/stasis_channels.h - include/asterisk/stasis_endpoints.h - include/asterisk/stasis_internal.h - include/asterisk/stasis_message_router.h - include/asterisk/stasis_system.h - include/asterisk/stasis_test.h - include/asterisk/statsd.h - include/asterisk/stringfields.h - include/asterisk/strings.h - include/asterisk/stun.h - include/asterisk/taskprocessor.h - include/asterisk/tcptls.h - include/asterisk/tdd.h - include/asterisk/term.h - include/asterisk/test.h - include/asterisk/threadpool.h - include/asterisk/threadstorage.h - include/asterisk/time.h - include/asterisk/timing.h - include/asterisk/transcap.h - include/asterisk/translate.h - include/asterisk/udptl.h - include/asterisk/ulaw.h - include/asterisk/unaligned.h - include/asterisk/uri.h - include/asterisk/utils.h - include/asterisk/uuid.h - include/asterisk/vector.h - include/asterisk/xmpp.h - main/Makefile - main/acl.c - main/adsi.c - main/alaw.c - main/aoc.c - main/app.c - main/ast_expr2.fl - main/ast_expr2f.c - main/asterisk.c - main/astfd.c - main/astmm.c - main/audiohook.c - main/autochan.c - main/autoservice.c - main/backtrace.c - main/bridge.c - main/bridge_after.c - main/bridge_basic.c - main/bridge_channel.c - main/bridge_roles.c - main/bucket.c - main/buildinfo.c - main/callerid.c - main/ccss.c - main/cdr.c - main/cel.c - main/channel.c - main/channel_internal_api.c - main/chanvars.c - main/cli.c - main/codec.c - main/codec_builtin.c - main/config_options.c - main/core_local.c - main/core_unreal.c - main/crypt.c - main/cygload.c - main/datastore.c - main/db.c - main/devicestate.c - main/dial.c - main/dsp.c - main/endpoints.c - main/enum.c - main/event.c - main/features_config.c - main/file.c - main/format.c - main/format_cache.c - main/format_cap.c - main/format_compatibility.c - main/frame.c - main/framehook.c - main/fskmodem.c - main/fskmodem_float.c - main/fskmodem_int.c - main/global_datastores.c - main/hashtab.c - main/heap.c - main/http.c - main/image.c - main/io.c - main/json.c - main/libasteriskssl.c - main/loader.c - main/lock.c - main/logger.c - main/manager.c - main/manager_bridges.c - main/manager_channels.c - main/manager_endpoints.c - main/manager_mwi.c - main/manager_system.c - main/max_forwards.c - main/media_index.c - main/message.c - main/mixmonitor.c - main/named_acl.c - main/netsock.c - main/netsock2.c - main/optional_api.c - main/parking.c - main/pbx.c - main/presencestate.c - main/privacy.c - main/rtp_engine.c - main/say.c - main/sched.c - main/security_events.c - main/sem.c - main/sip_api.c - main/smoother.c - main/sorcery.c - main/sounds_index.c - main/srv.c - main/stasis.c - main/stasis_bridges.c - main/stasis_cache.c - main/stasis_cache_pattern.c - main/stasis_channels.c - main/stasis_endpoints.c - main/stasis_message.c - main/stasis_message_router.c - main/stasis_system.c - main/strings.c - main/stun.c - main/taskprocessor.c - main/tcptls.c - main/tdd.c - main/term.c - main/test.c - main/threadpool.c - main/threadstorage.c - main/timing.c - main/translate.c - main/udptl.c - main/ulaw.c - main/uri.c - main/utils.c - main/uuid.c - menuselect/Makefile - menuselect/README - menuselect/linkedlists.h - menuselect/menuselect.c - pbx/Makefile - pbx/dundi-parser.c - pbx/pbx_ael.c - pbx/pbx_config.c - pbx/pbx_dundi.c - pbx/pbx_loopback.c - pbx/pbx_lua.c - pbx/pbx_realtime.c - pbx/pbx_spool.c - res/Makefile - res/ael/ael.flex - res/ael/ael.y - res/ael/ael_lex.c - res/ael/pval.c - res/ari.make - res/ari/ari_model_validators.c - res/ari/ari_model_validators.h - res/ari/ari_websockets.c - res/ari/cli.c - res/ari/config.c - res/ari/internal.h - res/ari/resource_applications.c - res/ari/resource_applications.h - res/ari/resource_asterisk.c - res/ari/resource_asterisk.h - res/ari/resource_bridges.c - res/ari/resource_bridges.h - res/ari/resource_channels.c - res/ari/resource_channels.h - res/ari/resource_device_states.c - res/ari/resource_device_states.h - res/ari/resource_endpoints.c - res/ari/resource_endpoints.h - res/ari/resource_events.c - res/ari/resource_events.h - res/ari/resource_mailboxes.c - res/ari/resource_mailboxes.h - res/ari/resource_playbacks.c - res/ari/resource_playbacks.h - res/ari/resource_recordings.c - res/ari/resource_recordings.h - res/ari/resource_sounds.c - res/ari/resource_sounds.h - res/parking/parking_applications.c - res/parking/parking_bridge.c - res/parking/parking_bridge_features.c - res/parking/parking_controller.c - res/parking/parking_devicestate.c - res/parking/parking_manager.c - res/parking/parking_tests.c - res/parking/parking_ui.c - res/parking/res_parking.h - res/res_adsi.c - res/res_ael_share.c - res/res_agi.c - res/res_ari.c - res/res_ari_applications.c - res/res_ari_asterisk.c - res/res_ari_bridges.c - res/res_ari_channels.c - res/res_ari_device_states.c - res/res_ari_endpoints.c - res/res_ari_events.c - res/res_ari_mailboxes.c - res/res_ari_model.c - res/res_ari_playbacks.c - res/res_ari_recordings.c - res/res_ari_sounds.c - res/res_calendar.c - res/res_calendar_caldav.c - res/res_calendar_ews.c - res/res_calendar_exchange.c - res/res_calendar_icalendar.c - res/res_chan_stats.c - res/res_clialiases.c - res/res_clioriginate.c - res/res_config_curl.c - res/res_config_pgsql.c - res/res_convert.c - res/res_crypto.c - res/res_curl.c - res/res_endpoint_stats.c - res/res_fax.c - res/res_fax_spandsp.c - res/res_format_attr_celt.c - res/res_format_attr_h263.c - res/res_format_attr_h264.c - res/res_format_attr_opus.c - res/res_format_attr_silk.c - res/res_hep.c - res/res_hep_pjsip.c - res/res_hep_rtcp.c - res/res_http_post.c - res/res_http_websocket.c - res/res_manager_devicestate.c - res/res_manager_presencestate.c - res/res_monitor.c - res/res_musiconhold.c - res/res_mwi_external.c - res/res_mwi_external_ami.c - res/res_odbc_transaction.c - res/res_parking.c - res/res_pjproject.c - res/res_pjsip.c - res/res_pjsip/config_auth.c - res/res_pjsip/config_domain_aliases.c - res/res_pjsip/config_global.c - res/res_pjsip/config_system.c - res/res_pjsip/config_transport.c - res/res_pjsip/location.c - res/res_pjsip/pjsip_distributor.c - res/res_pjsip/pjsip_global_headers.c - res/res_pjsip/pjsip_options.c - res/res_pjsip/pjsip_outbound_auth.c - res/res_pjsip/presence_xml.c - res/res_pjsip/security_events.c - res/res_pjsip_acl.c - res/res_pjsip_authenticator_digest.c - res/res_pjsip_caller_id.c - res/res_pjsip_dialog_info_body_generator.c - res/res_pjsip_diversion.c - res/res_pjsip_dlg_options.c - res/res_pjsip_dtmf_info.c - res/res_pjsip_endpoint_identifier_anonymous.c - res/res_pjsip_endpoint_identifier_ip.c - res/res_pjsip_endpoint_identifier_user.c - res/res_pjsip_exten_state.c - res/res_pjsip_history.c - res/res_pjsip_logger.c - res/res_pjsip_messaging.c - res/res_pjsip_multihomed.c - res/res_pjsip_mwi.c - res/res_pjsip_mwi_body_generator.c - res/res_pjsip_nat.c - res/res_pjsip_notify.c - res/res_pjsip_outbound_authenticator_digest.c - res/res_pjsip_outbound_publish.c - res/res_pjsip_outbound_registration.c - res/res_pjsip_path.c - res/res_pjsip_pidf_body_generator.c - res/res_pjsip_pidf_digium_body_supplement.c - res/res_pjsip_pidf_eyebeam_body_supplement.c - res/res_pjsip_publish_asterisk.c - res/res_pjsip_pubsub.c - res/res_pjsip_refer.c - res/res_pjsip_registrar.c - res/res_pjsip_registrar_expire.c - res/res_pjsip_rfc3326.c - res/res_pjsip_sdp_rtp.c - res/res_pjsip_send_to_voicemail.c - res/res_pjsip_session.c - res/res_pjsip_sips_contact.c - res/res_pjsip_t38.c - res/res_pjsip_transport_management.c - res/res_pjsip_transport_websocket.c - res/res_pjsip_xpidf_body_generator.c - res/res_realtime.c - res/res_rtp_asterisk.c - res/res_rtp_multicast.c - res/res_security_log.c - res/res_smdi.c - res/res_sorcery_astdb.c - res/res_sorcery_config.c - res/res_sorcery_memory.c - res/res_sorcery_memory_cache.c - res/res_sorcery_realtime.c - res/res_speech.c - res/res_stasis.c - res/res_stasis_answer.c - res/res_stasis_device_state.c - res/res_stasis_mailbox.c - res/res_stasis_playback.c - res/res_stasis_recording.c - res/res_stasis_snoop.c - res/res_stasis_test.c - res/res_statsd.c - res/res_stun_monitor.c - res/res_timing_dahdi.c - res/res_timing_kqueue.c - res/res_timing_pthread.c - res/res_timing_timerfd.c - res/res_xmpp.c - res/stasis/app.c - res/stasis/app.h - res/stasis/command.c - res/stasis/command.h - res/stasis/control.c - res/stasis/control.h - res/stasis/messaging.c - res/stasis/messaging.h - res/stasis/stasis_bridge.c - res/stasis/stasis_bridge.h - res/stasis_recording/stored.c - rest-api-templates/ari.make.mustache - rest-api-templates/ari_model_validators.c.mustache - rest-api-templates/ari_model_validators.h.mustache - rest-api-templates/asterisk_processor.py - rest-api-templates/body_parsing.mustache - rest-api-templates/make_ari_stubs.py - rest-api-templates/param_cleanup.mustache - rest-api-templates/param_parsing.mustache - rest-api-templates/res_ari_resource.c.mustache - rest-api-templates/rest_handler.mustache - rest-api-templates/swagger_model.py - rest-api-templates/transform.py - sounds/Makefile - static-http/ajamdemo.html - static-http/astman.css - static-http/astman.js - static-http/mantest.html - tests/Makefile - tests/test_acl.c - tests/test_amihooks.c - tests/test_aoc.c - tests/test_app.c - tests/test_ari.c - tests/test_ari_model.c - tests/test_ast_format_str_reduce.c - tests/test_astobj2.c - tests/test_bucket.c - tests/test_cdr.c - tests/test_cel.c - tests/test_channel_feature_hooks.c - tests/test_config.c - tests/test_core_codec.c - tests/test_core_format.c - tests/test_db.c - tests/test_devicestate.c - tests/test_endpoints.c - tests/test_event.c - tests/test_expr.c - tests/test_format_cache.c - tests/test_format_cap.c - tests/test_func_file.c - tests/test_gosub.c - tests/test_heap.c - tests/test_json.c - tests/test_locale.c - tests/test_logger.c - tests/test_message.c - tests/test_netsock2.c - tests/test_optional_api.c - tests/test_pbx.c - tests/test_poll.c - tests/test_res_stasis.c - tests/test_sched.c - tests/test_scoped_lock.c - tests/test_security_events.c - tests/test_sorcery.c - tests/test_sorcery_astdb.c - tests/test_sorcery_memory_cache_thrash.c - tests/test_sorcery_realtime.c - tests/test_stasis.c - tests/test_stasis_channels.c - tests/test_stasis_endpoints.c - tests/test_strings.c - tests/test_substitution.c - tests/test_taskprocessor.c - tests/test_threadpool.c - tests/test_time.c - tests/test_uri.c - tests/test_utils.c - tests/test_uuid.c - tests/test_websocket_client.c - tests/test_xml_escape.c - utils/astcanary.c - utils/astdb2bdb.c - utils/astdb2sqlite3.c - utils/astman.c - utils/check_expr.c - utils/conf2ael.c - utils/extconf.c - utils/muted.c - utils/streamplayer.c -Copyright: 1999, - 2005, Digium, Inc. - 1999, - 2006, Digium, Inc. - 1999, - 2007, Digium, Inc. - 1999, - 2008, Digium, Inc. - 1999, - 2009, Digium, Inc. - 1999, - 2010, Digium, Inc. - 1999, - 2012, Digium, Inc. - 1999, - 2013, Digium, Inc. - 1999, - 2014, Digium, Inc. - 1999, - 2015, Digium, Inc. - 1999-2004, Digium, Inc. - 1999-2005, Digium, Inc. - 1999-2006, Digium, Inc. - 1999-2008, Digium, Inc. - 1999-2009, Digium, Inc. - 1999-2010, Digium, Inc. - 1999-2012, Digium, Inc. - 1999-2014, Digium, Inc. - 2001, - 2005, Digium, Inc. - 2001-2009, Digium, Inc. - 2003-2005, Digium, Inc. - 2004, - 2006, Digium, Inc. - 2004, Digium, Inc. - 2005, - 2010, Digium, Inc. - 2005, Digium, Inc. - 2005-2006, Digium, Inc. - 2005-2007, Digium, Inc. - 2005-2008, Digium, Inc. - 2005-2016, Digium, Inc. - 2006, - 2008, Digium, Inc. - 2006, Digium, Inc. - 2006-2010, Digium, Inc. - 2006-2012, Digium, Inc. - 2007, - 2009, 2013 Digium, Inc. - 2007, - 2009, Digium, Inc. - 2007, Digium, Inc. - 2007-2008, Digium, Inc. - 2007-2013, Digium, Inc. - 2008, Digium, Inc. - 2008-2009, Digium, Inc. - 2008-2013, Digium, Inc. - 2009, - Digium, Inc. - 2009, Digium, Inc. - 2009-2010, Digium, Inc. - 2009-2012, Digium, Inc. - 2009-2013, Digium, Inc. - 2010, Digium, Inc. - 2011, Digium, Inc. - 2011-2012, Digium, Inc. - 2012, Digium, Inc. - 2012-2013, Digium, Inc. - 2013, Digium, Inc. - 2014, Digium, Inc. - 2015, Digium, Inc. - 2016, Digium, Inc. -License: UNKNOWN - FIXME - -Files: BSDmakefile - BUGS - CHANGES - README-SERIOUSLY.bestpractices.txt - README-addons.txt - UPGRADE-1.2.txt - UPGRADE-1.4.txt - UPGRADE-1.6.txt - UPGRADE-1.8.txt - UPGRADE-10.txt - UPGRADE-11.txt - UPGRADE-12.txt - UPGRADE.txt - Zaptel-to-DAHDI.txt - addons/.gitignore - addons/cdr_mysql.c - addons/format_mp3.c - agi/.gitignore - agi/DialAnMp3.agi - agi/agi-test.agi - agi/agi.xml - agi/eagi-sphinx-test.c - agi/eagi-test.c - agi/fastagi-test - agi/numeralize - apps/app_fax.c - apps/app_sms.c - apps/app_voicemail.exports.in - asterisk-13.8.2-summary.html - asterisk-13.8.2-summary.txt - autoconf/acx_pthread.m4 - autoconf/ast_c_compile_check.m4 - autoconf/ast_c_declare_check.m4 - autoconf/ast_c_define_check.m4 - autoconf/ast_check_gnu_make.m4 - autoconf/ast_check_mandatory.m4 - autoconf/ast_check_openh323.m4 - autoconf/ast_check_osptk.m4 - autoconf/ast_check_pwlib.m4 - autoconf/ast_check_raii.m4 - autoconf/ast_check_strsep_array_bounds.m4 - autoconf/ast_ext_lib.m4 - autoconf/ast_ext_tool_check.m4 - autoconf/ast_func_fork.m4 - autoconf/ast_gcc_attribute.m4 - autoconf/ast_pkgconfig.m4 - autoconf/ast_prog_egrep.m4 - autoconf/ast_prog_ld.m4 - autoconf/ast_prog_ld_gnu.m4 - autoconf/ast_prog_sed.m4 - autoconf/libcurl.m4 - bootstrap.sh - build_tools/.gitignore - build_tools/cflags-devmode.xml - build_tools/cflags.xml - build_tools/embed_modules.xml - build_tools/find_missing_support_level - build_tools/get_documentation - build_tools/get_makeopts - build_tools/get_moduleinfo - build_tools/install_subst - build_tools/make_build_h - build_tools/make_buildopts_h - build_tools/make_check_alembic - build_tools/make_defaults_h - build_tools/make_linker_eo_script - build_tools/make_linker_version_script - build_tools/make_sample_voicemail - build_tools/make_version - build_tools/make_version_c - build_tools/menuselect-deps.in - build_tools/mkpkgconfig - build_tools/prep_tarball - build_tools/sha1sum-sh - channels/console_gui.c - channels/misdn/Makefile - channels/misdn/isdn_lib_intern.h - channels/misdn/portinfo.c - codecs/gsm/libgsm.vcproj - codecs/lpc10/Makefile - codecs/lpc10/README - codecs/lpc10/analys.c - codecs/lpc10/bsynz.c - codecs/lpc10/chanwr.c - codecs/lpc10/dcbias.c - codecs/lpc10/decode.c - codecs/lpc10/deemp.c - codecs/lpc10/difmag.c - codecs/lpc10/dyptrk.c - codecs/lpc10/encode.c - codecs/lpc10/energy.c - codecs/lpc10/f2c.h - codecs/lpc10/f2clib.c - codecs/lpc10/ham84.c - codecs/lpc10/hp100.c - codecs/lpc10/invert.c - codecs/lpc10/irc2pc.c - codecs/lpc10/ivfilt.c - codecs/lpc10/liblpc10.vcproj - codecs/lpc10/lpc10.h - codecs/lpc10/lpcdec.c - codecs/lpc10/lpcenc.c - codecs/lpc10/lpcini.c - codecs/lpc10/lpfilt.c - codecs/lpc10/median.c - codecs/lpc10/mload.c - codecs/lpc10/onset.c - codecs/lpc10/pitsyn.c - codecs/lpc10/placea.c - codecs/lpc10/placev.c - codecs/lpc10/preemp.c - codecs/lpc10/prepro.c - codecs/lpc10/random.c - codecs/lpc10/rcchk.c - codecs/lpc10/synths.c - codecs/lpc10/tbdm.c - codecs/lpc10/voicin.c - codecs/lpc10/vparms.c - configs/basic-pbx/README - configs/basic-pbx/asterisk.conf - configs/basic-pbx/cdr.conf - configs/basic-pbx/cdr_custom.conf - configs/basic-pbx/confbridge.conf - configs/basic-pbx/extensions.conf - configs/basic-pbx/indications.conf - configs/basic-pbx/logger.conf - configs/basic-pbx/modules.conf - configs/basic-pbx/musiconhold.conf - configs/basic-pbx/pjsip.conf - configs/basic-pbx/queues.conf - configs/basic-pbx/voicemail.conf - configs/samples/acl.conf.sample - configs/samples/adsi.conf.sample - configs/samples/agents.conf.sample - configs/samples/alarmreceiver.conf.sample - configs/samples/alsa.conf.sample - configs/samples/amd.conf.sample - configs/samples/app_mysql.conf.sample - configs/samples/app_skel.conf.sample - configs/samples/ari.conf.sample - configs/samples/asterisk.adsi - configs/samples/asterisk.conf.sample - configs/samples/calendar.conf.sample - configs/samples/ccss.conf.sample - configs/samples/cdr.conf.sample - configs/samples/cdr_adaptive_odbc.conf.sample - configs/samples/cdr_custom.conf.sample - configs/samples/cdr_manager.conf.sample - configs/samples/cdr_mysql.conf.sample - configs/samples/cdr_odbc.conf.sample - configs/samples/cdr_pgsql.conf.sample - configs/samples/cdr_sqlite3_custom.conf.sample - configs/samples/cdr_syslog.conf.sample - configs/samples/cdr_tds.conf.sample - configs/samples/cel.conf.sample - configs/samples/cel_custom.conf.sample - configs/samples/cel_odbc.conf.sample - configs/samples/cel_pgsql.conf.sample - configs/samples/cel_sqlite3_custom.conf.sample - configs/samples/cel_tds.conf.sample - configs/samples/chan_dahdi.conf.sample - configs/samples/chan_mobile.conf.sample - configs/samples/cli.conf.sample - configs/samples/cli_aliases.conf.sample - configs/samples/cli_permissions.conf.sample - configs/samples/codecs.conf.sample - configs/samples/confbridge.conf.sample - configs/samples/config_test.conf.sample - configs/samples/console.conf.sample - configs/samples/dbsep.conf.sample - configs/samples/dnsmgr.conf.sample - configs/samples/dsp.conf.sample - configs/samples/dundi.conf.sample - configs/samples/enum.conf.sample - configs/samples/extconfig.conf.sample - configs/samples/extensions.ael.sample - configs/samples/extensions.conf.sample - configs/samples/extensions.lua.sample - configs/samples/extensions_minivm.conf.sample - configs/samples/features.conf.sample - configs/samples/festival.conf.sample - configs/samples/followme.conf.sample - configs/samples/func_odbc.conf.sample - configs/samples/hep.conf.sample - configs/samples/http.conf.sample - configs/samples/iax.conf.sample - configs/samples/iaxprov.conf.sample - configs/samples/indications.conf.sample - configs/samples/logger.conf.sample - configs/samples/manager.conf.sample - configs/samples/meetme.conf.sample - configs/samples/mgcp.conf.sample - configs/samples/minivm.conf.sample - configs/samples/misdn.conf.sample - configs/samples/modules.conf.sample - configs/samples/motif.conf.sample - configs/samples/musiconhold.conf.sample - configs/samples/ooh323.conf.sample - configs/samples/osp.conf.sample - configs/samples/oss.conf.sample - configs/samples/phone.conf.sample - configs/samples/phoneprov.conf.sample - configs/samples/pjproject.conf.sample - configs/samples/pjsip.conf.sample - configs/samples/pjsip_notify.conf.sample - configs/samples/pjsip_wizard.conf.sample - configs/samples/queuerules.conf.sample - configs/samples/queues.conf.sample - configs/samples/res_config_mysql.conf.sample - configs/samples/res_config_sqlite.conf.sample - configs/samples/res_config_sqlite3.conf.sample - configs/samples/res_corosync.conf.sample - configs/samples/res_curl.conf.sample - configs/samples/res_fax.conf.sample - configs/samples/res_ldap.conf.sample - configs/samples/res_odbc.conf.sample - configs/samples/res_parking.conf.sample - configs/samples/res_pgsql.conf.sample - configs/samples/res_pktccops.conf.sample - configs/samples/res_snmp.conf.sample - configs/samples/res_stun_monitor.conf.sample - configs/samples/rtp.conf.sample - configs/samples/say.conf.sample - configs/samples/sip.conf.sample - configs/samples/sip_notify.conf.sample - configs/samples/skinny.conf.sample - configs/samples/sla.conf.sample - configs/samples/smdi.conf.sample - configs/samples/sorcery.conf.sample - configs/samples/ss7.timers.sample - configs/samples/stasis.conf.sample - configs/samples/statsd.conf.sample - configs/samples/telcordia-1.adsi - configs/samples/test_sorcery.conf.sample - configs/samples/udptl.conf.sample - configs/samples/unistim.conf.sample - configs/samples/users.conf.sample - configs/samples/voicemail.conf.sample - configs/samples/vpb.conf.sample - configs/samples/xmpp.conf.sample - configure.ac - contrib/README.festival - contrib/ast-db-manage/README.md - contrib/ast-db-manage/cdr.ini.sample - contrib/ast-db-manage/cdr/env.py - contrib/ast-db-manage/cdr/script.py.mako - contrib/ast-db-manage/config.ini.sample - contrib/ast-db-manage/config/env.py - contrib/ast-db-manage/config/script.py.mako - contrib/ast-db-manage/config/versions/136885b81223_add_regcontext_to_pj.py - contrib/ast-db-manage/config/versions/154177371065_add_default_from_user.py - contrib/ast-db-manage/config/versions/189a235b3fd7_add_keep_alive_interval.py - contrib/ast-db-manage/config/versions/1d50859ed02e_create_accountcode.py - contrib/ast-db-manage/config/versions/21e526ad3040_add_pjsip_debug_option.py - contrib/ast-db-manage/config/versions/26d7f3bf0fa5_add_bind_rtp_to_media_address_to_pjsip.py - contrib/ast-db-manage/config/versions/26f10cadc157_add_pjsip_timeout_options.py - contrib/ast-db-manage/config/versions/28b8e71e541f_add_g726_non_standard.py - contrib/ast-db-manage/config/versions/28ce1e718f05_add_fatal_response_interval.py - contrib/ast-db-manage/config/versions/2d078ec071b7_increaes_contact_column_size.py - contrib/ast-db-manage/config/versions/2fc7930b41b3_add_pjsip_endpoint_options_for_12_1.py - contrib/ast-db-manage/config/versions/31cd4f4891ec_add_auto_dtmf_mode.py - contrib/ast-db-manage/config/versions/371a3bf4143e_add_user_eq_phone_option_to_pjsip.py - contrib/ast-db-manage/config/versions/3855ee4e5f85_add_missing_pjsip_options.py - contrib/ast-db-manage/config/versions/3bcc0b5bc2c9_add_allow_reload_to_ps_transports.py - contrib/ast-db-manage/config/versions/423f34ad36e2_fix_pjsip_qualify_ti.py - contrib/ast-db-manage/config/versions/43956d550a44_add_tables_for_pjsip.py - contrib/ast-db-manage/config/versions/45e3f47c6c44_add_pjsip_endpoint_identifier_order.py - contrib/ast-db-manage/config/versions/461d7d691209_add_pjsip_qualify_timeout.py - contrib/ast-db-manage/config/versions/498357a710ae_add_rtp_keepalive.py - contrib/ast-db-manage/config/versions/4c573e7135bd_fix_tos_field_types.py - contrib/ast-db-manage/config/versions/51f8cb66540e_add_further_dtls_options.py - contrib/ast-db-manage/config/versions/5950038a6ead_fix_pjsip_verifiy_typo.py - contrib/ast-db-manage/config/versions/a541e0b5e89_add_pjsip_max_initial_qualify_time.py - contrib/ast-db-manage/config/versions/c6d929b23a8_create_pjsip_subscription_persistence_.py - contrib/ast-db-manage/config/versions/d39508cb8d8_create_queue_rules.py - contrib/ast-db-manage/config/versions/dbc44d5a908_add_missing_columns_to_sys_and_reg.py - contrib/ast-db-manage/config/versions/e96a0b8071c_increase_pjsip_column_size.py - contrib/ast-db-manage/config/versions/eb88a14f2a_add_media_encryption_optimistic_to_pjsip.py - contrib/ast-db-manage/voicemail.ini.sample - contrib/ast-db-manage/voicemail/env.py - contrib/ast-db-manage/voicemail/script.py.mako - contrib/asterisk-doxygen-header - contrib/asterisk-ices.xml - contrib/dictionary.digium - contrib/docker/Dockerfile.asterisk - contrib/docker/Dockerfile.packager - contrib/docker/README.md - contrib/docker/make-package.sh - contrib/editors/ael.vim - contrib/editors/asterisk.vim - contrib/editors/asteriskvm.vim - contrib/festival-1.4.1-diff - contrib/festival-1.4.2.diff - contrib/festival-1.4.3.diff - contrib/festival-1.95.diff - contrib/i18n.testsuite.conf - contrib/init.d/etc_default_asterisk - contrib/init.d/org.asterisk.asterisk.plist - contrib/init.d/org.asterisk.muted.plist - contrib/init.d/rc.archlinux.asterisk - contrib/init.d/rc.debian.asterisk - contrib/init.d/rc.gentoo.asterisk - contrib/init.d/rc.mandriva.asterisk - contrib/init.d/rc.mandriva.zaptel - contrib/init.d/rc.redhat.asterisk - contrib/init.d/rc.slackware.asterisk - contrib/init.d/rc.suse.asterisk - contrib/realtime/mssql/mssql_cdr.sql - contrib/realtime/mssql/mssql_config.sql - contrib/realtime/mssql/mssql_voicemail.sql - contrib/realtime/mysql/mysql_cdr.sql - contrib/realtime/mysql/mysql_config.sql - contrib/realtime/mysql/mysql_voicemail.sql - contrib/realtime/oracle/oracle_cdr.sql - contrib/realtime/oracle/oracle_config.sql - contrib/realtime/oracle/oracle_voicemail.sql - contrib/realtime/postgresql/postgresql_cdr.sql - contrib/realtime/postgresql/postgresql_config.sql - contrib/realtime/postgresql/postgresql_voicemail.sql - contrib/scripts/README.messages-expire - contrib/scripts/agents.php - contrib/scripts/ast_grab_core - contrib/scripts/ast_tls_cert - contrib/scripts/astcli - contrib/scripts/asterisk.logrotate - contrib/scripts/astgenkey - contrib/scripts/astgenkey.8 - contrib/scripts/autosupport.8 - contrib/scripts/dahdi_span_config_hook - contrib/scripts/file.convert.sh - contrib/scripts/get_ilbc_source.sh - contrib/scripts/get_mp3_source.sh - contrib/scripts/get_swagger_ui.sh - contrib/scripts/install_prereq - contrib/scripts/loadtest.tcl - contrib/scripts/messages-expire.pl - contrib/scripts/retrieve_extensions_from_mysql.pl - contrib/scripts/retrieve_sip_conf_from_mysql.pl - contrib/scripts/safe_asterisk - contrib/scripts/safe_asterisk.8 - contrib/scripts/safe_asterisk_restart - contrib/scripts/sip_to_pjsip/astconfigparser.py - contrib/scripts/sip_to_pjsip/astdicts.py - contrib/scripts/sip_to_pjsip/sip_to_pjsip.py - contrib/scripts/valgrind_compare - contrib/thirdparty/spexxilbcfix_xlite.reg - contrib/thirdparty/spexxilbcfix_xpro.reg - contrib/unistimLang/en.po - contrib/unistimLang/fr.po - contrib/unistimLang/ru.po - contrib/unistimLang/ru.po.utf8 - contrib/upstart/asterisk.upstart-0.3.9 - contrib/upstart/asterisk.user.conf - contrib/utils/README.rawplayer - contrib/utils/eagi_proxy.c - contrib/valgrind-RedHat-8.0.supp - contrib/valgrind.supp - debian/NEWS - debian/README.Debian - debian/README.source - debian/TODO.Debian - debian/ast_config/manager.conf - debian/ast_config/manager.d/README.conf - debian/ast_config/modules.conf - debian/asterisk-config-custom.1 - debian/asterisk-config.dirs - debian/asterisk-config.examples - debian/asterisk-config.install - debian/asterisk-config.lintian-overrides - debian/asterisk-config.postinst - debian/asterisk-config.preinst - debian/asterisk-dahdi.install - debian/asterisk-dev.install - debian/asterisk-dev.links - debian/asterisk-doc.docs - debian/asterisk-mobile.install - debian/asterisk-modules.install - debian/asterisk-mp3.install - debian/asterisk-mysql.install - debian/asterisk-ooh323.install - debian/asterisk-voicemail-imapstorage.install - debian/asterisk-voicemail-odbcstorage.install - debian/asterisk-voicemail.install - debian/asterisk-vpb.install - debian/asterisk.default - debian/asterisk.dirs - debian/asterisk.docs - debian/asterisk.examples - debian/asterisk.install - debian/asterisk.links - debian/asterisk.lintian-overrides - debian/asterisk.logrotate - debian/asterisk.manpages - debian/asterisk.postinst - debian/asterisk.postrm - debian/asterisk.prerm - debian/asterisk.startup.conf - debian/astgenkey.8 - debian/astman.1 - debian/autosupport.8 - debian/backports/lenny - debian/backports/squeeze - debian/clean - debian/compat - debian/control - debian/copyright-check - debian/debhelper/asterisk.pm - debian/debhelper/dh_asterisk - debian/dummyprogs/fetch - debian/gbp.conf - debian/patches/aelparse_enable.patch - debian/patches/astdatadir - debian/patches/astgenkey-security - debian/patches/configure-osarch - debian/patches/dahdi_event_removed_dchan - debian/patches/enable_addons - debian/patches/ffmpeg-detection.patch - debian/patches/ffmpeg-includes.patch - debian/patches/h323-extra-target - debian/patches/h323-no-deps-on-asterisk - debian/patches/h323-workaround-openh323-segfault - debian/patches/hack-multiple-app-voicemail - debian/patches/hurd_osarch.patch - debian/patches/hurd_path_max.patch - debian/patches/ilbc_disable - debian/patches/make-clean-fixes - debian/patches/menuselect_weakref - debian/patches/no_uname - debian/patches/radcli-detection.patch - debian/patches/reenable - debian/patches/series - debian/patches/smsq_enable.patch - debian/patches/sound_files - debian/patches/systemd.patch - debian/patches/test_framework.patch - debian/patches/undeprecate - debian/rules - debian/rules.copyright-check - debian/safe_asterisk.8 - debian/source/format - debian/source/lintian-overrides - debian/upstream/signing-key.asc - debian/watch - default.exports - doc/.gitignore - doc/CODING-GUIDELINES - doc/IAX2-security.pdf - doc/Makefile - doc/README.txt - doc/aelparse.8 - doc/api-1.6.0-changes.odt - doc/api-1.6.2-changes.txt - doc/appdocsxml.dtd - doc/appdocsxml.xslt - doc/astdb2bdb.8 - doc/astdb2sqlite3.8 - doc/asterisk-ng-doxygen.in - doc/asterisk.8 - doc/asterisk.sgml - doc/lang/hebrew.ods - doc/lang/urdu.ods - doc/lang/vietnamese.ods - doc/smsq.8 - formats/msgsm.h - funcs/func_periodic_hook.exports.in - images/animlogo.gif - images/asterisk-intro.jpg - images/font.png - images/kpad2.jpg - images/play.gif - include/asterisk/.gitignore - include/asterisk/_private.h - include/asterisk/autoconfig.h.in - include/asterisk/dns.h - include/asterisk/pval.h - include/asterisk/version.h - include/solaris-compat/compat.h - include/solaris-compat/sys/cdefs.h - main/.gitignore - main/ast_expr2.y - main/asterisk.dynamics - main/asterisk.exports.in - main/ecdisa.h - main/editline/.gitignore - main/editline/CHANGES - main/editline/INSTALL - main/editline/Makefile.in - main/editline/PLATFORMS - main/editline/README - main/editline/config.h.in - main/editline/configure.in - main/libasteriskssl.exports.in - main/stdtime/Makefile - main/stdtime/test.c - makeopts.in - menuselect/.gitignore - menuselect/autoconfig.h.in - menuselect/bootstrap.sh - menuselect/configure.ac - menuselect/contrib/Makefile-dummy - menuselect/example_menuselect-tree - menuselect/make_version - menuselect/makeopts.in - menuselect/test/build_tools/menuselect-deps - menuselect/test/menuselect-tree - mkinstalldirs - pbx/ael/ael-test/ael-ntest10/extensions.ael - pbx/ael/ael-test/ael-ntest12/extensions.ael - pbx/ael/ael-test/ael-ntest22/extensions.ael - pbx/ael/ael-test/ael-ntest22/qq.ael - pbx/ael/ael-test/ael-ntest22/t1/a.ael - pbx/ael/ael-test/ael-ntest22/t1/b.ael - pbx/ael/ael-test/ael-ntest22/t1/c.ael - pbx/ael/ael-test/ael-ntest22/t2/d.ael - pbx/ael/ael-test/ael-ntest22/t2/e.ael - pbx/ael/ael-test/ael-ntest22/t2/f.ael - pbx/ael/ael-test/ael-ntest22/t3/g.ael - pbx/ael/ael-test/ael-ntest22/t3/h.ael - pbx/ael/ael-test/ael-ntest22/t3/i.ael - pbx/ael/ael-test/ael-ntest22/t3/j.ael - pbx/ael/ael-test/ael-ntest23/extensions.ael - pbx/ael/ael-test/ael-ntest23/qq.ael - pbx/ael/ael-test/ael-ntest23/t1/a.ael - pbx/ael/ael-test/ael-ntest23/t1/b.ael - pbx/ael/ael-test/ael-ntest23/t1/c.ael - pbx/ael/ael-test/ael-ntest23/t2/d.ael - pbx/ael/ael-test/ael-ntest23/t2/e.ael - pbx/ael/ael-test/ael-ntest23/t2/f.ael - pbx/ael/ael-test/ael-ntest23/t3/g.ael - pbx/ael/ael-test/ael-ntest23/t3/h.ael - pbx/ael/ael-test/ael-ntest23/t3/i.ael - pbx/ael/ael-test/ael-ntest23/t3/j.ael - pbx/ael/ael-test/ael-ntest24/extensions.ael - pbx/ael/ael-test/ael-ntest9/extensions.ael - pbx/ael/ael-test/ael-test1/extensions.ael - pbx/ael/ael-test/ael-test11/extensions.ael - pbx/ael/ael-test/ael-test14/extensions.ael - pbx/ael/ael-test/ael-test15/extensions.ael - pbx/ael/ael-test/ael-test16/extensions.ael - pbx/ael/ael-test/ael-test18/extensions.ael - pbx/ael/ael-test/ael-test19/extensions.ael - pbx/ael/ael-test/ael-test2/apptest.ael2 - pbx/ael/ael-test/ael-test2/extensions.ael - pbx/ael/ael-test/ael-test20/extensions.ael - pbx/ael/ael-test/ael-test3/extensions.ael - pbx/ael/ael-test/ael-test3/include1.ael2 - pbx/ael/ael-test/ael-test3/include2.ael2 - pbx/ael/ael-test/ael-test3/include3.ael2 - pbx/ael/ael-test/ael-test3/include4.ael2 - pbx/ael/ael-test/ael-test3/include5.ael2 - pbx/ael/ael-test/ael-test3/telemarket_torture.ael2 - pbx/ael/ael-test/ael-test4/apptest.ael2 - pbx/ael/ael-test/ael-test4/extensions.ael - pbx/ael/ael-test/ael-test5/extensions.ael - pbx/ael/ael-test/ael-test6/extensions.ael - pbx/ael/ael-test/ael-test7/extensions.ael - pbx/ael/ael-test/ael-test8/extensions.ael - pbx/ael/ael-test/ael-vtest13/extensions.ael - pbx/ael/ael-test/ael-vtest13/include1.ael2 - pbx/ael/ael-test/ael-vtest13/include2.ael2 - pbx/ael/ael-test/ael-vtest13/include3.ael2 - pbx/ael/ael-test/ael-vtest13/include4.ael2 - pbx/ael/ael-test/ael-vtest13/include5.ael2 - pbx/ael/ael-test/ael-vtest13/telemarket_torture.ael2 - pbx/ael/ael-test/ael-vtest17/extensions.ael - pbx/ael/ael-test/ael-vtest21/extensions.ael - pbx/ael/ael-test/ael-vtest25/extensions.ael - pbx/ael/ael-test/ref.ael-ntest10 - pbx/ael/ael-test/ref.ael-ntest12 - pbx/ael/ael-test/ref.ael-ntest22 - pbx/ael/ael-test/ref.ael-ntest23 - pbx/ael/ael-test/ref.ael-ntest24 - pbx/ael/ael-test/ref.ael-ntest9 - pbx/ael/ael-test/ref.ael-test1 - pbx/ael/ael-test/ref.ael-test11 - pbx/ael/ael-test/ref.ael-test14 - pbx/ael/ael-test/ref.ael-test15 - pbx/ael/ael-test/ref.ael-test16 - pbx/ael/ael-test/ref.ael-test18 - pbx/ael/ael-test/ref.ael-test19 - pbx/ael/ael-test/ref.ael-test2 - pbx/ael/ael-test/ref.ael-test20 - pbx/ael/ael-test/ref.ael-test3 - pbx/ael/ael-test/ref.ael-test4 - pbx/ael/ael-test/ref.ael-test5 - pbx/ael/ael-test/ref.ael-test6 - pbx/ael/ael-test/ref.ael-test7 - pbx/ael/ael-test/ref.ael-test8 - pbx/ael/ael-test/ref.ael-vtest13 - pbx/ael/ael-test/ref.ael-vtest17 - pbx/ael/ael-test/ref.ael-vtest21 - pbx/ael/ael-test/ref.ael-vtest25 - pbx/ael/ael-test/runtests - pbx/ael/ael-test/setref - phoneprov/000000000000-directory.xml - phoneprov/000000000000-phone.cfg - phoneprov/000000000000.cfg - phoneprov/polycom.xml - phoneprov/polycom_line.xml - phoneprov/snom-mac.xml - res/ael/.gitignore - res/res_ael_share.exports.in - res/res_agi.exports.in - res/res_ari.exports.in - res/res_ari_model.exports.in - res/res_calendar.exports.in - res/res_crypto.exports.in - res/res_fax.exports.in - res/res_hep.exports.in - res/res_http_websocket.exports.in - res/res_monitor.exports.in - res/res_mwi_external.exports.in - res/res_odbc.exports.in - res/res_odbc_transaction.exports.in - res/res_phoneprov.exports.in - res/res_pjproject.exports.in - res/res_pjsip.exports.in - res/res_pjsip/include/res_pjsip_private.h - res/res_pjsip/pjsip_configuration.c - res/res_pjsip_exten_state.exports.in - res/res_pjsip_outbound_publish.exports.in - res/res_pjsip_pubsub.exports.in - res/res_pjsip_session.exports.in - res/res_pktccops.exports.in - res/res_smdi.exports.in - res/res_speech.exports.in - res/res_srtp.exports.in - res/res_stasis.exports.in - res/res_stasis_answer.exports.in - res/res_stasis_device_state.exports.in - res/res_stasis_mailbox.exports.in - res/res_stasis_playback.exports.in - res/res_stasis_recording.exports.in - res/res_stasis_snoop.exports.in - res/res_stasis_test.exports.in - res/res_statsd.exports.in - res/res_xmpp.exports.in - rest-api-templates/README.txt - rest-api-templates/api.wiki.mustache - rest-api-templates/ari_resource.c.mustache - rest-api-templates/ari_resource.h.mustache - rest-api-templates/do-not-edit.mustache - rest-api-templates/models.wiki.mustache - rest-api-templates/odict.py - rest-api/README.txt - sample.call - sounds/sounds.xml - tests/test_ami_security_events.sh - third-party/Makefile - third-party/Makefile.rules - third-party/pjproject/.gitignore - third-party/pjproject/Makefile - third-party/pjproject/Makefile.rules - third-party/pjproject/apply_patches - third-party/pjproject/configure.m4 - third-party/pjproject/patches/0001-2.4.5-fix-for-tls-async-ops.patch - third-party/pjproject/patches/0001-Bump-tcp-tls-and-transaction-log-levels-from-1-to-3.patch - third-party/pjproject/patches/0001-ioqueue-Enable-epoll-in-aconfigure.ac.patch - third-party/pjproject/patches/0001-sip_transport-Search-for-transport-even-if-listener-.patch - third-party/pjproject/patches/config_site.h - third-party/pjproject/patches/user.mak - third-party/versions.mak - utils/.gitignore - utils/ael_main.c - utils/astman.1 - utils/clicompat.c - utils/db1-ast/Makefile - utils/db1-ast/hash/README - utils/db1-ast/include/compat.h - utils/db1-ast/libdb.map - utils/db1-ast/mpool/README - utils/expr2.testinput - utils/frame.c - utils/frame.h - utils/stereorize.c - utils/utils.xml -Copyright: *No copyright* -License: UNKNOWN - FIXME - -Files: include/solaris-compat/sys/queue.h - main/editline/TEST/test.c - main/editline/chared.c - main/editline/chared.h - main/editline/common.c - main/editline/el.c - main/editline/el.h - main/editline/emacs.c - main/editline/hist.c - main/editline/hist.h - main/editline/histedit.h - main/editline/history.c - main/editline/key.c - main/editline/key.h - main/editline/makelist.in - main/editline/map.c - main/editline/map.h - main/editline/np/unvis.c - main/editline/np/vis.h - main/editline/parse.c - main/editline/parse.h - main/editline/prompt.c - main/editline/prompt.h - main/editline/read.c - main/editline/refresh.c - main/editline/refresh.h - main/editline/search.c - main/editline/search.h - main/editline/sig.c - main/editline/sig.h - main/editline/sys.h - main/editline/term.c - main/editline/term.h - main/editline/tokenizer.c - main/editline/tokenizer.h - main/editline/tty.c - main/editline/tty.h - main/editline/vi.c - utils/db1-ast/btree/bt_close.c - utils/db1-ast/btree/bt_conv.c - utils/db1-ast/btree/bt_debug.c - utils/db1-ast/btree/bt_delete.c - utils/db1-ast/btree/bt_get.c - utils/db1-ast/btree/bt_open.c - utils/db1-ast/btree/bt_overflow.c - utils/db1-ast/btree/bt_page.c - utils/db1-ast/btree/bt_put.c - utils/db1-ast/btree/bt_search.c - utils/db1-ast/btree/bt_seq.c - utils/db1-ast/btree/bt_split.c - utils/db1-ast/btree/bt_utils.c - utils/db1-ast/btree/btree.h - utils/db1-ast/btree/extern.h - utils/db1-ast/db/db.c - utils/db1-ast/hash/extern.h - utils/db1-ast/hash/hash.c - utils/db1-ast/hash/hash.h - utils/db1-ast/hash/hash_bigkey.c - utils/db1-ast/hash/hash_buf.c - utils/db1-ast/hash/hash_func.c - utils/db1-ast/hash/hash_log2.c - utils/db1-ast/hash/hash_page.c - utils/db1-ast/hash/hsearch.c - utils/db1-ast/hash/ndbm.c - utils/db1-ast/hash/page.h - utils/db1-ast/hash/search.h - utils/db1-ast/include/circ-queue.h - utils/db1-ast/include/db.h - utils/db1-ast/include/mpool.h - utils/db1-ast/include/ndbm.h - utils/db1-ast/mpool/mpool.c - utils/db1-ast/recno/extern.h - utils/db1-ast/recno/rec_close.c - utils/db1-ast/recno/rec_delete.c - utils/db1-ast/recno/rec_get.c - utils/db1-ast/recno/rec_open.c - utils/db1-ast/recno/rec_put.c - utils/db1-ast/recno/rec_search.c - utils/db1-ast/recno/rec_seq.c - utils/db1-ast/recno/rec_utils.c - utils/db1-ast/recno/recno.h -Copyright: 1989, 1993 The Regents of the University of California. - 1990, 1993 The Regents of the University of California. - 1990, 1993-1994, The Regents of the University of California. - 1991, 1993 The Regents of the University of California. - 1991, 1993-1994, The Regents of the University of California. - 1992-1993, The Regents of the University of California. -License: BSD-4-clause - FIXME - -Files: addons/chan_ooh323.c - addons/chan_ooh323.h - addons/ooh323c/README - addons/ooh323c/src/context.c - addons/ooh323c/src/decode.c - addons/ooh323c/src/dlist.c - addons/ooh323c/src/dlist.h - addons/ooh323c/src/encode.c - addons/ooh323c/src/errmgmt.c - addons/ooh323c/src/eventHandler.c - addons/ooh323c/src/eventHandler.h - addons/ooh323c/src/h323/H235-SECURITY-MESSAGES.h - addons/ooh323c/src/h323/H235-SECURITY-MESSAGESDec.c - addons/ooh323c/src/h323/H235-SECURITY-MESSAGESEnc.c - addons/ooh323c/src/h323/H323-MESSAGES.c - addons/ooh323c/src/h323/H323-MESSAGES.h - addons/ooh323c/src/h323/H323-MESSAGESDec.c - addons/ooh323c/src/h323/H323-MESSAGESEnc.c - addons/ooh323c/src/h323/MULTIMEDIA-SYSTEM-CONTROL.c - addons/ooh323c/src/h323/MULTIMEDIA-SYSTEM-CONTROL.h - addons/ooh323c/src/h323/MULTIMEDIA-SYSTEM-CONTROLDec.c - addons/ooh323c/src/h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c - addons/ooh323c/src/memheap.c - addons/ooh323c/src/memheap.h - addons/ooh323c/src/ooCalls.c - addons/ooh323c/src/ooCalls.h - addons/ooh323c/src/ooCapability.c - addons/ooh323c/src/ooCapability.h - addons/ooh323c/src/ooCmdChannel.c - addons/ooh323c/src/ooCmdChannel.h - addons/ooh323c/src/ooCommon.h - addons/ooh323c/src/ooDateTime.c - addons/ooh323c/src/ooDateTime.h - addons/ooh323c/src/ooLogChan.c - addons/ooh323c/src/ooLogChan.h - addons/ooh323c/src/ooSocket.c - addons/ooh323c/src/ooSocket.h - addons/ooh323c/src/ooStackCmds.c - addons/ooh323c/src/ooStackCmds.h - addons/ooh323c/src/ooTimer.c - addons/ooh323c/src/ooTimer.h - addons/ooh323c/src/ooUtils.c - addons/ooh323c/src/ooUtils.h - addons/ooh323c/src/ooasn1.h - addons/ooh323c/src/oochannels.c - addons/ooh323c/src/oochannels.h - addons/ooh323c/src/ooh245.c - addons/ooh323c/src/ooh245.h - addons/ooh323c/src/ooh323.c - addons/ooh323c/src/ooh323.h - addons/ooh323c/src/ooh323ep.c - addons/ooh323c/src/ooh323ep.h - addons/ooh323c/src/oohdr.h - addons/ooh323c/src/ooper.h - addons/ooh323c/src/ooports.c - addons/ooh323c/src/ooports.h - addons/ooh323c/src/ooq931.c - addons/ooh323c/src/ooq931.h - addons/ooh323c/src/ootrace.c - addons/ooh323c/src/ootrace.h - addons/ooh323c/src/ootypes.h - addons/ooh323c/src/perutil.c - addons/ooh323c/src/printHandler.c - addons/ooh323c/src/printHandler.h - addons/ooh323c/src/rtctype.c - addons/ooh323c/src/rtctype.h - addons/ooh323cDriver.c - addons/ooh323cDriver.h -Copyright: 1997-2004, Objective Systems, Inc - 1997-2005, Objective Systems, Inc - 2004-2005, Objective Systems, Inc -License: UNKNOWN - FIXME - -Files: codecs/gsm/Makefile - codecs/gsm/README - codecs/gsm/inc/config.h - codecs/gsm/inc/gsm.h - codecs/gsm/inc/private.h - codecs/gsm/inc/proto.h - codecs/gsm/inc/unproto.h - codecs/gsm/src/add.c - codecs/gsm/src/code.c - codecs/gsm/src/debug.c - codecs/gsm/src/decode.c - codecs/gsm/src/gsm_create.c - codecs/gsm/src/gsm_decode.c - codecs/gsm/src/gsm_destroy.c - codecs/gsm/src/gsm_encode.c - codecs/gsm/src/gsm_explode.c - codecs/gsm/src/gsm_implode.c - codecs/gsm/src/gsm_option.c - codecs/gsm/src/gsm_print.c - codecs/gsm/src/long_term.c - codecs/gsm/src/lpc.c - codecs/gsm/src/preprocess.c - codecs/gsm/src/rpe.c - codecs/gsm/src/short_term.c - codecs/gsm/src/table.c -Copyright: 1992, Jutta Degener and Carsten Bormann, Technische - 1992-1996, Jutta Degener and Carsten Bormann, Technische -License: UNKNOWN - FIXME - -Files: funcs/func_sorcery.c - include/asterisk/phoneprov.h - include/asterisk/res_pjproject.h - include/asterisk/res_pjsip_cli.h - include/asterisk/spinlock.h - main/pbx_builtins.c - main/pbx_private.h - res/res_pjsip/pjsip_cli.c - res/res_pjsip_config_wizard.c - res/res_pjsip_header_funcs.c - res/res_pjsip_phoneprov_provider.c - tests/test_vector.c -Copyright: 2013, Fairview 5 Engineering, LLC - 2014, - Fairview 5 Engineering, LLC - 2014, Fairview 5 Engineering, LLC - 2015, Fairview 5 Engineering, LLC - 2016, Fairview 5 Engineering, LLC -License: UNKNOWN - FIXME - -Files: apps/confbridge/conf_state.c - apps/confbridge/conf_state_empty.c - apps/confbridge/conf_state_inactive.c - apps/confbridge/conf_state_multi.c - apps/confbridge/conf_state_multi_marked.c - apps/confbridge/conf_state_single.c - apps/confbridge/conf_state_single_marked.c - apps/confbridge/include/conf_state.h - res/res_config_sqlite3.c - tests/test_linkedlists.c -Copyright: 2011, Terry Wilson - 2012, Terry Wilson -License: UNKNOWN - FIXME - -Files: apps/app_jack.c - contrib/ast-db-manage/config/versions/4da0c5f79a9c_create_tables.py - contrib/ast-db-manage/voicemail/versions/a2e9769475e_create_tables.py - funcs/func_periodic_hook.c - include/asterisk/beep.h - menuselect/menuselect.h - menuselect/menuselect_curses.c - menuselect/menuselect_stub.c -Copyright: 2005-2006, Russell Bryant - 2007-2008, Russell Bryant - 2013, Russell Bryant - 2014, Russell Bryant -License: UNKNOWN - FIXME - -Files: include/asterisk/astobj2.h - main/astobj2.c - main/astobj2_container.c - main/astobj2_container_private.h - main/astobj2_hash.c - main/astobj2_private.h - main/astobj2_rbtree.c -Copyright: 2006, Marta Carbone, Luigi Rizzo - Univ. di Pisa, Italy -License: UNKNOWN - FIXME - -Files: main/editline/editline.3 - main/editline/editrc.5 - main/editline/np/fgetln.c - main/editline/read.h - main/editline/readline.c - main/editline/readline.h -Copyright: 1997, The NetBSD Foundation, Inc - 1997-1999, The NetBSD Foundation, Inc - 1997-2000, The NetBSD Foundation, Inc - 1998, The NetBSD Foundation, Inc - 2001, The NetBSD Foundation, Inc -License: BSD-4-clause - FIXME - -Files: main/pbx_app.c - main/pbx_functions.c - main/pbx_hangup_handler.c - main/pbx_switch.c - main/pbx_timing.c - main/pbx_variables.c -Copyright: 2015, CFWare, LLC - 2016, CFWare, LLC -License: UNKNOWN - FIXME - -Files: channels/chan_misdn.c - channels/misdn/chan_misdn_config.h - channels/misdn/isdn_lib.c - channels/misdn/isdn_lib.h - channels/misdn/isdn_msg_parser.c - channels/misdn_config.c -Copyright: 2004, - 2006, Christian Richter - 2004, Christian Richter - 2005, Christian Richter -License: UNKNOWN - FIXME - -Files: agi/Makefile - cel/cel_odbc.c - channels/iax2/include/iax2.h - channels/iax2/include/parser.h - channels/iax2/include/provision.h - utils/Makefile -Copyright: 1999-2006, Digium - 2003, Digium - 2008, Digium -License: UNKNOWN - FIXME - -Files: include/asterisk/data.h - include/asterisk/xml.h - include/asterisk/xmldoc.h - main/data.c - main/xml.c - main/xmldoc.c -Copyright: 2008, Eliel C. Sardanons (LU1ALY) - 2009, Eliel C. Sardanons (LU1ALY) -License: UNKNOWN - FIXME - -Files: contrib/ast-db-manage/cdr/versions/210693f3123d_create_cdr_table.py - contrib/ast-db-manage/config/versions/1758e8bbf6b_increase_useragent_column_size.py - contrib/ast-db-manage/config/versions/23530d604b96_add_rpid_immediate.py - contrib/ast-db-manage/config/versions/28887f25a46f_create_queue_tables.py - contrib/ast-db-manage/config/versions/5139253c0423_make_q_member_uniqueid_autoinc.py - contrib/ast-db-manage/voicemail/versions/39428242f7f5_increase_recording_column_size.py -Copyright: 2014, Richard Mudgett - 2015, Richard Mudgett -License: UNKNOWN - FIXME - -Files: codecs/speex/arch.h - codecs/speex/fixed_generic.h - codecs/speex/speex_resampler.h - codecs/speex/stack_alloc.h -Copyright: 2002, Jean-Marc Valin - 2003, Jean-Marc Valin - 2007, Jean-Marc Valin -License: BSD-3-clause - FIXME - -Files: apps/app_dictate.c - apps/app_dumpchan.c - include/asterisk/slinfactory.h - main/slinfactory.c -Copyright: 2004-2005, Anthony Minessale II - 2005, Anthony Minessale II -License: UNKNOWN - FIXME - -Files: include/asterisk/abstract_jb.h - main/abstract_jb.c - main/fixedjitterbuf.c - main/fixedjitterbuf.h -Copyright: 2005, Attractel OOD -License: UNKNOWN - FIXME - -Files: apps/app_mixmonitor.c - funcs/func_cdr.c - funcs/func_logic.c -Copyright: 1999, - 2006, Digium, Inc. - 1999-2006, Digium, Inc. - 2005, Anthony Minessale II - 2005-2006, Digium, Inc. -License: UNKNOWN - FIXME - -Files: formats/format_g719.c - formats/format_siren14.c - formats/format_siren7.c -Copyright: 1999, - 2008, Anthony Minessale and Digium, Inc. - 1999, - 2010, Anthony Minessale and Digium, Inc. -License: UNKNOWN - FIXME - -Files: funcs/func_base64.c - funcs/func_rand.c - funcs/func_sha1.c -Copyright: 2005, Claude Patry - 2005-2006, Digium, Inc. - 2006, Claude Patry - 2006, Digium, Inc. -License: UNKNOWN - FIXME - -Files: main/features.c - main/pickup.c - res/res_corosync.c -Copyright: 1999, - 2012, Digium, Inc. - 1999, - 2013, Digium, Inc. - 2007, Digium, Inc. - 2012, Russell Bryant -License: UNKNOWN - FIXME - -Files: include/asterisk/sdp_srtp.h - main/sdp_srtp.c - res/res_srtp.c -Copyright: 2005, Mikael Magnusson - 2006-2007, Mikael Magnusson -License: UNKNOWN - FIXME - -Files: res/res_snmp.c - res/snmp/agent.c - res/snmp/agent.h -Copyright: 2006, Voop as -License: UNKNOWN - FIXME - -Files: cdr/cdr_syslog.c - include/asterisk/syslog.h - main/syslog.c -Copyright: 2009, malleable, LLC -License: UNKNOWN - FIXME - -Files: include/asterisk/sha1.h - main/sha1.c -Copyright: 2011, IETF Trust and the persons identified as -License: BSD-2-clause - FIXME - -Files: codecs/speex/resample.c - codecs/speex/resample_sse.h -Copyright: 2007-2008, Jean-Marc Valin - 2008, Thorvald Natvig -License: BSD-3-clause - FIXME - -Files: main/editline/np/strlcat.c - main/editline/np/strlcpy.c -Copyright: 1998, Todd C. Miller -License: BSD-3-clause - FIXME - -Files: ChangeLog - LICENSE -Copyright: *No copyright* -License: GPL - FIXME - -Files: COPYING - addons/ooh323c/COPYING -Copyright: 1989, 1991 Free Software Foundation, Inc -License: GPL-ever - FIXME - -Files: main/strcompat.c - menuselect/strcompat.c -Copyright: 1999, - 2006, Digium, Inc. -License: ISC - FIXME - -Files: main/stdtime/private.h - main/stdtime/tzfile.h -Copyright: *No copyright* -License: Public domain - FIXME - -Files: apps/app_skel.c - tests/test_skel.c -Copyright: , -License: UNKNOWN - FIXME - -Files: res/res_config_odbc.c - res/res_odbc.c -Copyright: 1999, - 2010, Digium, Inc. - 1999, - 2012, Digium, Inc. - 2004-2005, Anthony Minessale II -License: UNKNOWN - FIXME - -Files: include/asterisk/pktccops.h - res/res_pktccops.c -Copyright: 2009, Attila Domjan -License: UNKNOWN - FIXME - -Files: include/asterisk/poll-compat.h - main/poll.c -Copyright: 1995-2002, Brian M. Clapper -License: UNKNOWN - FIXME - -Files: tests/test_astobj2_thrash.c - tests/test_hashtab_thrash.c -Copyright: 2012, David M. Lee, II -License: UNKNOWN - FIXME - -Files: codecs/log2comp.h - pbx/dundi-parser.h -Copyright: 2004-2005, Digium Inc -License: UNKNOWN - FIXME - -Files: main/libasteriskpj.c - res/res_phoneprov.c -Copyright: 1999, - 2008, Digium, Inc. - 2009-2012, Digium, Inc. - 2014, Fairview 5 Engineering, LLC - 2015, Fairview 5 Engineering, LLC -License: UNKNOWN - FIXME - -Files: include/asterisk/indications.h - main/indications.c -Copyright: 2002, Pauline Middelink - 2009, Digium, Inc. -License: UNKNOWN - FIXME - -Files: include/jitterbuf.h - main/jitterbuf.c -Copyright: 2004-2005, Horizon Wimba, Inc -License: UNKNOWN - FIXME - -Files: channels/console_video.h - channels/vgrabbers.c -Copyright: 2007, Luigi Rizzo -License: UNKNOWN - FIXME - -Files: apps/enter.h - apps/leave.h -Copyright: 1999, Mark Spencer and Linux Support Services -License: UNKNOWN - FIXME - -Files: addons/ooh323c/src/ooGkClient.c - addons/ooh323c/src/ooGkClient.h -Copyright: 2005, Objective Systems, Inc - 2005, Page Iberica, S.A -License: UNKNOWN - FIXME - -Files: apps/app_readexten.c - apps/app_saycounted.c -Copyright: 2007-2008, Trinity College Computing Center - 2008, Trinity College Computing Center -License: UNKNOWN - FIXME - -Files: main/editline/np/vis.c -Copyright: 1989, 1993 The Regents of the University of California. - 1999, The NetBSD Foundation, Inc -License: BSD-4-clause - FIXME - -Files: main/md5.c -Copyright: below -License: Public domain - FIXME - -Files: funcs/func_enum.c -Copyright: 1999, - 2006, * Mark Spencer -License: UNKNOWN - FIXME - -Files: cdr/cdr_pgsql.c -Copyright: 2003, - 2012, * Matthew D. Hardeman -License: UNKNOWN - FIXME - -Files: utils/smsq.c -Copyright: 2004-2005, * SMS queuing application for use with asterisk app_sms -License: UNKNOWN - FIXME - -Files: cdr/cdr_manager.c -Copyright: 2004-2005, * See http:www.asterisk.org for more information about -License: UNKNOWN - FIXME - -Files: cel/cel_pgsql.c -Copyright: 2008, * Steve Murphy - adapted to CEL, from: -License: UNKNOWN - FIXME - -Files: debian/asterisk-config-custom -Copyright: -License: UNKNOWN - FIXME - -Files: debian/patches/mpglib -Copyright: = ((newhead>>3)&0x1); -License: UNKNOWN - FIXME - -Files: doc/lang/language-criteria.txt -Copyright: AND/OR OTHER APPLICABLE LAW. ANY USE OF THE - LAW -License: UNKNOWN - FIXME - -Files: apps/app_amd.c -Copyright: 2003, - 2006, Aheeva Technology -License: UNKNOWN - FIXME - -Files: res/res_format_attr_vp8.c -Copyright: 2015, Alexander Traud -License: UNKNOWN - FIXME - -Files: funcs/func_math.c -Copyright: 2004, - 2006, Andy Powell -License: UNKNOWN - FIXME - -Files: formats/format_sln.c -Copyright: 1999, - 2005, Anthony Minessale -License: UNKNOWN - FIXME - -Files: apps/app_while.c -Copyright: 2004-2005, Anthony Minessale -License: UNKNOWN - FIXME - -Files: apps/app_chanspy.c -Copyright: 2005, - 2008, Digium, Inc. - 2005, Anthony Minessale II (anthmct@yahoo.com) -License: UNKNOWN - FIXME - -Files: apps/app_forkcdr.c -Copyright: 1999, - 2005, Anthony Minessale anthmct@yahoo.com -License: UNKNOWN - FIXME - -Files: apps/app_followme.c -Copyright: 2005-2006, BJ Weschke -License: UNKNOWN - FIXME - -Files: funcs/func_realtime.c -Copyright: 2005-2006, BJ Weschke. -License: UNKNOWN - FIXME - -Files: channels/chan_vpb.cc -Copyright: 2003, Paul Bagyenda - 2004-2005, Ben Kramer -License: UNKNOWN - FIXME - -Files: channels/chan_unistim.c -Copyright: 2005, - 2007, Cedric Hans -License: UNKNOWN - FIXME - -Files: channels/misdn/ie.c -Copyright: 2005, Christian Richter - on it -License: UNKNOWN - FIXME - -Files: apps/app_festival.c -Copyright: 2002, Christos Ricudis -License: UNKNOWN - FIXME - -Files: addons/app_mysql.c -Copyright: 2004, Constantine Filin and Christos Ricudis -License: UNKNOWN - FIXME - -Files: apps/app_db.c -Copyright: 1999, - 2005, Digium, Inc. - 2003, Jefferson Noxon -License: UNKNOWN - FIXME - -Files: funcs/func_md5.c -Copyright: 2005, Olle E. Johansson, Edvina.net - 2005, Russell Bryant - 2005-2006, Digium, Inc. -License: UNKNOWN - FIXME - -Files: res/res_config_ldap.c -Copyright: 2005, Oxymium sarl - 2007, Digium, Inc. -License: UNKNOWN - FIXME - -Files: apps/app_originate.c -Copyright: 2008, Digium, Inc. - 2008, Roberto Casas -License: UNKNOWN - FIXME - -Files: codecs/codec_ilbc.c -Copyright: 1999, - 2005, Digium, Inc. - The Internet Society (2004) -License: UNKNOWN - FIXME - -Files: apps/app_page.c -Copyright: 2004, - 2006, Digium, Inc.. -License: UNKNOWN - FIXME - -Files: apps/app_directed_pickup.c -Copyright: 2005, Joshua Colp - 2008, Gary Cook -License: UNKNOWN - FIXME - -Files: cdr/cdr_sqlite.c -Copyright: 2004-2005, Holger Schurig -License: UNKNOWN - FIXME - -Files: formats/format_ogg_vorbis.c -Copyright: 2005, Jeff Ollie -License: UNKNOWN - FIXME - -Files: funcs/func_db.c -Copyright: the following people - 2003, Jefferson Noxon - 2005, Mark Spencer - 2005-2006, Russell Bryant -License: UNKNOWN - FIXME - -Files: contrib/ast-db-manage/config/versions/10aedae86a32_add_outgoing_enum_va.py -Copyright: 2014, Jonathan Rose -License: UNKNOWN - FIXME - -Files: agi/jukebox.agi -Copyright: 2005-2006, Justin Tunney -License: UNKNOWN - FIXME - -Files: codecs/gsm/COPYRIGHT -Copyright: 1992-1994, Jutta Degener and Carsten Bormann -License: UNKNOWN - FIXME - -Files: CREDITS -Copyright: 1992-1994, Jutta Degener and Carsten Bormann - on the GSM source: -License: UNKNOWN - FIXME - -Files: main/dnsmgr.c -Copyright: 2005-2006, Kevin P. Fleming -License: UNKNOWN - FIXME - -Files: tests/test_callerid.c -Copyright: 2014, Kinsey Moore -License: UNKNOWN - FIXME - -Files: contrib/scripts/vmail.cgi -Copyright: 2002, Linux Support Services, Inc -License: UNKNOWN - FIXME - -Files: tests/test_stringfields.c -Copyright: 2009, Mark Michelson -License: UNKNOWN - FIXME - -Files: channels/chan_phone.h -Copyright: 1999, Mark Spencer -License: UNKNOWN - FIXME - -Files: channels/console_board.c -Copyright: 2007-2008, Marta Carbone, Luigi Rizzo -License: UNKNOWN - FIXME - -Files: channels/console_video.c -Copyright: 2007-2008, Marta Carbone, Sergio Fadda, Luigi Rizzo -License: UNKNOWN - FIXME - -Files: res/res_mutestream.c -Copyright: 2009, Olle E. Johansson -License: UNKNOWN - FIXME - -Files: res/res_config_sqlite.c -Copyright: 2006, Proformatique -License: UNKNOWN - FIXME - -Files: apps/app_waituntil.c -Copyright: 2007, Redfish Solutions -License: UNKNOWN - FIXME - -Files: menuselect/menuselect_newt.c -Copyright: 2008, Sean Bright -License: UNKNOWN - FIXME - -Files: apps/app_channelredirect.c -Copyright: 2006, Sergey Basmanov -License: UNKNOWN - FIXME - -Files: channels/vcodecs.c -Copyright: 2007-2008, Sergio Fadda, Luigi Rizzo -License: UNKNOWN - FIXME - -Files: tests/test_dlinklists.c -Copyright: 2008, Steve Murphy -License: UNKNOWN - FIXME - -Files: apps/app_alarmreceiver.c -Copyright: 2004-2005, Steve Rodgers -License: UNKNOWN - FIXME - -Files: main/plc.c -Copyright: 2004, Steve Underwood -License: UNKNOWN - FIXME - -Files: funcs/func_iconv.c -Copyright: 2005-2007, Sven Slezak -License: UNKNOWN - FIXME - -Files: formats/format_g726.c -Copyright: 2004-2005, inAccess Networks -License: UNKNOWN - FIXME - -Files: res/res_pjsip_one_touch_record_info.c -Copyright: 2013, malleable, llc -License: UNKNOWN - FIXME - -Files: menuselect/menuselect_gtk.c -Copyright: 2007n"); -License: UNKNOWN - FIXME diff --git a/debian/debhelper/asterisk.pm b/debian/debhelper/asterisk.pm deleted file mode 100644 index 935b326..0000000 --- a/debian/debhelper/asterisk.pm +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/perl -use warnings; -use strict; -use Debian::Debhelper::Dh_Lib; - -insert_after("dh_installman", "dh_asterisk"); - -1; diff --git a/debian/debhelper/dh_asterisk b/debian/debhelper/dh_asterisk deleted file mode 100755 index 0f76c36..0000000 --- a/debian/debhelper/dh_asterisk +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/perl -w - -=head1 NAME - -dh_asterisk - Add dependency on the ABI version of Asterisk - -When writing a package that builds an Asterisk module and is not built -with Astersk itself (and hence depends on the exact binary version), -add ${Asterisk:ABI} to the package's Depends: field in debian control -and run dh_asterisk. - -If you use dh, you can run dh_asterisk using: - - dh --with asterisk - -Otherwise run it in debian/rules after installing the modules. - -=cut - -use strict; -use Debian::Debhelper::Dh_Lib; - -=head1 SYNOPSIS - -B [S>] [S[I]>] [S I>] - -=head1 DESCRIPTION - -dh_asterisk is a debhelper program that is responsible for correctly -setting the dependency on asterisk-I for a package. - -=head1 OPTIONS - -No special options of its own. Use standard debhelper options. - -=head1 NOTES - -Note that this command is not idempotent. L should be called -between invocations of this command. Otherwise, it may cause multiple -instances of the same text to be added to maintainer scripts. - -=cut - -init(); - -my $BUILD_OPTS_FILE = '/usr/include/asterisk/buildopts.h' - -sub get_abi_name() { - # FIXME: replace the "die" with a nicer handling once this is tested - open(OPTS, $BUILD_OPTS_FILE) || - die ("failed to open opts file $BUILD_OPTS_FILE. asterisk-dev not installed?"); - while() { - if (/AST_BUILDOPT_SUM/) { - my ($ig, $nored, $checksum) = split - $checksum =~ s/"//g; - return $checksum; - } - } - return ""; -} - -foreach my $package (@{$dh{DOPACKAGES}}) { - #next if is_udeb($package); - my $ast_dir = tmpdir()."/usr/lib/asterisk/modules"; - return unless glob("$ast_dir/*"); - my $ast_ver = get_abi_name(); - addsubstvar($package, "asterisk:ABI", $abi); -} - -=head1 SEE ALSO - -L - -This program is part of the Debian Asterisk package. - -L - -=head1 AUTHOR - -Tzafrir Cohen - -=cut diff --git a/debian/dummyprogs/fetch b/debian/dummyprogs/fetch deleted file mode 100755 index 265514e..0000000 --- a/debian/dummyprogs/fetch +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -# a dummy script that can serve as 'fetch' to pass for autoconf tests -# but always returns false to make sure it is never used. -# -# Note: the configure script will look for wget first. If you actually -# want to download sound tarballs or whatever at build time, make sure -# you have wget installed, and this script should cause you no problems. - -exit 1 diff --git a/debian/gbp.conf b/debian/gbp.conf deleted file mode 100644 index ba6c907..0000000 --- a/debian/gbp.conf +++ /dev/null @@ -1,7 +0,0 @@ -# Configuration file for git-buildpackage and friends - -[DEFAULT] -pristine-tar = True -sign-tags = True -filter = .gitignore -debian-branch = buster diff --git a/debian/patches/AST-2019-002.patch b/debian/patches/AST-2019-002.patch deleted file mode 100644 index 635d837..0000000 --- a/debian/patches/AST-2019-002.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 785bf3a755e47d92caef110e6040295764d08127 Mon Sep 17 00:00:00 2001 -From: George Joseph -Date: Wed, 12 Jun 2019 12:03:04 -0600 -Subject: [PATCH] res_pjsip_messaging: Check for body in in-dialog message - -We now check that a body exists and it has a length > 0 before -attempting to process it. - -ASTERISK-28447 -Reported-by: Gil Richard - -Change-Id: Ic469544b22ab848734636588d4c93426cc6f4b1f ---- - res/res_pjsip_messaging.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -diff --git a/res/res_pjsip_messaging.c b/res/res_pjsip_messaging.c -index 0e10a8f047..930cf84a53 100644 ---- a/res/res_pjsip_messaging.c -+++ b/res/res_pjsip_messaging.c -@@ -90,10 +90,13 @@ static enum pjsip_status_code check_content_type_in_dialog(const pjsip_rx_data * - static const pj_str_t text = { "text", 4}; - static const pj_str_t application = { "application", 11}; - -+ if (!(rdata->msg_info.msg->body && rdata->msg_info.msg->body->len > 0)) { -+ return res; -+ } -+ - /* We'll accept any text/ or application/ content type */ -- if (rdata->msg_info.msg->body && rdata->msg_info.msg->body->len -- && (pj_stricmp(&rdata->msg_info.msg->body->content_type.type, &text) == 0 -- || pj_stricmp(&rdata->msg_info.msg->body->content_type.type, &application) == 0)) { -+ if (pj_stricmp(&rdata->msg_info.msg->body->content_type.type, &text) == 0 -+ || pj_stricmp(&rdata->msg_info.msg->body->content_type.type, &application) == 0) { - res = PJSIP_SC_OK; - } else if (rdata->msg_info.ctype - && (pj_stricmp(&rdata->msg_info.ctype->media.type, &text) == 0 --- -2.21.0 - diff --git a/debian/patches/AST-2019-003.patch b/debian/patches/AST-2019-003.patch deleted file mode 100644 index 90b9d5d..0000000 --- a/debian/patches/AST-2019-003.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 1e4df0215af4f192ed06a7fc7589c799f1ec6091 Mon Sep 17 00:00:00 2001 -From: Francesco Castellano -Date: Fri, 28 Jun 2019 18:15:31 +0200 -Subject: [PATCH] chan_sip: Handle invalid SDP answer to T.38 re-invite - -The chan_sip module performs a T.38 re-invite using a single media -stream of udptl, and expects the SDP answer to be the same. - -If an SDP answer is received instead that contains an additional -media stream with no joint codec a crash will occur as the code -assumes that at least one joint codec will exist in this -scenario. - -This change removes this assumption. - -ASTERISK-28465 - -Change-Id: I8b02845b53344c6babe867a3f0a5231045c7ac87 ---- - -diff --git a/channels/chan_sip.c b/channels/chan_sip.c -index 898b646..a609ff8 100644 ---- a/channels/chan_sip.c -+++ b/channels/chan_sip.c -@@ -10965,7 +10965,13 @@ - ast_rtp_lookup_mime_multiple2(s3, NULL, newnoncodeccapability, 0, 0)); - } - -- if (portno != -1 || vportno != -1 || tportno != -1) { -+ /* When UDPTL is negotiated it is expected that there are no compatible codecs as audio or -+ * video is not being transported, thus we continue in this function further up if that is -+ * the case. If we receive an SDP answer containing both a UDPTL stream and another media -+ * stream however we need to check again to ensure that there is at least one joint codec -+ * instead of assuming there is one. -+ */ -+ if ((portno != -1 || vportno != -1 || tportno != -1) && ast_format_cap_count(newjointcapability)) { - /* We are now ready to change the sip session and RTP structures with the offered codecs, since - they are acceptable */ - unsigned int framing; diff --git a/debian/patches/aelparse_enable.patch b/debian/patches/aelparse_enable.patch deleted file mode 100644 index 137b31e..0000000 --- a/debian/patches/aelparse_enable.patch +++ /dev/null @@ -1,16 +0,0 @@ -Description: Enable the aelparse application. -Author: Jeremy Lainé -Forwarded: no -Bug-Debian: https://bugs.debian.org/747866 -Last-Update: 2018-11-17 - ---- a/utils/utils.xml -+++ b/utils/utils.xml -@@ -1,6 +1,6 @@ - - -- no -+ yes - deprecated - - diff --git a/debian/patches/amr.patch b/debian/patches/amr.patch deleted file mode 100644 index 02efcee..0000000 --- a/debian/patches/amr.patch +++ /dev/null @@ -1,1221 +0,0 @@ -Description: Add AMR and AMR-WB codec modules supporting transcoding - To add a codec for SIP/SDP (m=, rtmap, and ftmp), you create a format - module in Asterisk: `codec_amr.patch` (for m= and rtmap) and - `res/res_format_attr_amr.c` (for fmtp). However, this requires both - call legs to support AMR (pass-through only). If one leg does not - support AMR, the call has no audio. Or, if you use the pre-recorded - voice and music files of Asterisk, these files cannot be heard, because - they are not in AMR but in slin. Therefore, this repository adds not - just a format module for the audio-codecs AMR and AMR-WB but a - transcoding module as well: `codecs/codec_amr.c`. - . - This is an implementation of IETF - [RFC 4867](http://tools.ietf.org/html/rfc4867). Sometimes, AMR is - called AMR Narrowband (AMR-NB). AMR Wideband (ITU-T Recommendation - G.722.2) is sometimes abbreviated W-AMR - ([GSA](http://www.gsacom.com/hdvoice/)). GSMA Mobile - [HD Voice](https://www.youtube.com/playlist?&list=PLj1MyDu3jckpSciPQ1Max0W6HDSaY8-n4) - is AMR-WB. Research papers comparing AMR and AMR-WB with other audio - codecs: - [InterSpeech 2010](http://research.nokia.com/files/public/%5B12%5D_Interspeech%202010_Voice%20Quality%20Evaluation%20of%20Recent%20Open%20Source%20Codecs.pdf), - [ICASSP 2010](http://research.nokia.com/files/public/%5B11%5D_ICASSP2010_Voice%20Quality%20Evaluation%20of%20Various%20Codecs.pdf), - [InterSpeech 2011](http://research.nokia.com/files/public/%5B16%5D_InterSpeech2011_Voice_Quality_Characterization_of_IETF_Opus_Codec.pdf). - Further - [examples…](http://www.voiceage.com/Audio-Samples-Listening-Room.html) -Origin: https://github.com/traud/asterisk-amr -Author: Alexander Traud -License: Unlicense - This is free and unencumbered software released into the public domain. - . - Anyone is free to copy, modify, publish, use, compile, sell, or - distribute this software, either in source code form or as a compiled - binary, for any purpose, commercial or non-commercial, and by any - means. - . - In jurisdictions that recognize copyright laws, the author or authors - of this software dedicate any and all copyright interest in the - software to the public domain. We make this dedication for the benefit - of the public at large and to the detriment of our heirs and - successors. We intend this dedication to be an overt act of - relinquishment in perpetuity of all present and future rights to this - software under copyright law. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - . - For more information, please refer to -Last-Update: 2016-08-29 - ---- a/build_tools/menuselect-deps.in -+++ b/build_tools/menuselect-deps.in -@@ -1,4 +1,7 @@ - ALSA=@PBX_ALSA@ -+AMR_NB=@PBX_AMR_NB@ -+AMR_WB_DECODER=@PBX_AMR_WB_DECODER@ -+AMR_WB_ENCODER=@PBX_AMR_WB_ENCODER@ - BLUETOOTH=@PBX_BLUETOOTH@ - BEANSTALK=@PBX_BEANSTALK@ - COROSYNC=@PBX_COROSYNC@ ---- /dev/null -+++ b/codecs/codec_amr.c -@@ -0,0 +1,405 @@ -+/*** MODULEINFO -+ amr_nb -+ amr_wb_decoder -+ amr_wb_encoder -+***/ -+ -+#include "asterisk.h" -+ -+/* version 1.0 */ -+/* based on codecs/codec_opus.c */ -+ -+#include "asterisk/codec.h" /* for AST_MEDIA_TYPE_AUDIO */ -+#include "asterisk/format.h" /* for ast_format_get_attribute_data */ -+#include "asterisk/frame.h" /* for ast_frame, etc */ -+#include "asterisk/linkedlists.h" /* for AST_LIST_NEXT, etc */ -+#include "asterisk/logger.h" /* for ast_log, ast_debug, etc */ -+#include "asterisk/module.h" -+#include "asterisk/translate.h" /* for ast_trans_pvt, etc */ -+ -+#include -+#include -+#include -+#include -+ -+#include "asterisk/amr.h" -+ -+#define BUFFER_SAMPLES 16000 /* 1000 milliseconds */ -+ -+/* Sample frame data */ -+#include "asterisk/slin.h" -+#include "ex_amr.h" -+ -+struct amr_coder_pvt { -+ void *state; /* May be encoder or decoder */ -+ unsigned int frames; -+ int16_t buf[BUFFER_SAMPLES]; -+}; -+ -+static int lintoamr_new(struct ast_trans_pvt *pvt) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ const unsigned int sample_rate = pvt->t->src_codec.sample_rate; -+ -+ struct amr_attr *attr = pvt->explicit_dst ? ast_format_get_attribute_data(pvt->explicit_dst) : NULL; -+ const int dtx = attr ? attr->vad : 0; -+ -+ if (8000 == sample_rate) { -+ apvt->state = Encoder_Interface_init(dtx); -+ } else if (16000 == sample_rate) { -+ apvt->state = E_IF_init(); -+ } -+ -+ if (NULL == apvt->state) { -+ ast_log(LOG_ERROR, "Error creating the AMR encoder for %d\n", sample_rate); -+ return -1; -+ } -+ -+ apvt->frames = 0; -+ ast_debug(3, "Created encoder (%d -> AMR) %p (Format %p)\n", sample_rate, apvt, pvt->explicit_dst); -+ -+ return 0; -+} -+ -+static int amrtolin_new(struct ast_trans_pvt *pvt) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ const unsigned int sample_rate = pvt->t->dst_codec.sample_rate; -+ -+ if (8000 == sample_rate) { -+ apvt->state = Decoder_Interface_init(); -+ } else if (16000 == sample_rate) { -+ apvt->state = D_IF_init(); -+ } -+ -+ if (NULL == apvt->state) { -+ ast_log(LOG_ERROR, "Error creating the AMR decoder for %d\n", sample_rate); -+ return -1; -+ } -+ -+ apvt->frames = 0; -+ ast_debug(3, "Created decoder (AMR -> %d) %p\n", sample_rate, apvt); -+ -+ return 0; -+} -+ -+static int lintoamr_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ -+ /* XXX We should look at how old the rest of our stream is, and if it -+ is too old, then we should overwrite it entirely, otherwise we can -+ get artifacts of earlier talk that do not belong */ -+ memcpy(apvt->buf + pvt->samples, f->data.ptr, f->datalen); -+ pvt->samples += f->samples; -+ -+ return 0; -+} -+ -+static struct ast_frame *lintoamr_frameout(struct ast_trans_pvt *pvt) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ const unsigned int sample_rate = pvt->t->src_codec.sample_rate; -+ const unsigned int frame_size = sample_rate / 50; -+ struct ast_frame *result = NULL; -+ struct ast_frame *last = NULL; -+ int samples = 0; /* output samples */ -+ -+ struct amr_attr *attr = ast_format_get_attribute_data(pvt->f.subclass.format); -+ const int dtx = attr ? attr->vad : 0; -+ const int mode = attr ? attr->mode_current : 0; -+ const int aligned = attr ? attr->octet_align : 0; -+ -+ while (pvt->samples >= frame_size) { -+ struct ast_frame *current; -+ const int forceSpeech = 0; /* ignored by underlying API anyway */ -+ const short *speech = apvt->buf + samples; -+ unsigned char *out = pvt->outbuf.uc + 1; -+ int status = -1; /* result value; either error or output bytes */ -+ -+ if (8000 == sample_rate) { -+ status = Encoder_Interface_Encode(apvt->state, mode, speech, out, forceSpeech); -+ } else if (16000 == sample_rate) { -+ status = E_IF_encode(apvt->state, mode, speech, out, dtx); -+ } -+ -+ samples += frame_size; -+ pvt->samples -= frame_size; -+ -+ if (status < 0) { -+ ast_log(LOG_ERROR, "Error encoding the AMR frame\n"); -+ current = NULL; -+ } else if (aligned) { -+ pvt->outbuf.uc[0] = (15 << 4); /* Change-Mode Request (CMR): no */ -+ /* add one byte, because we added the CMR byte */ -+ current = ast_trans_frameout(pvt, status + 1, frame_size); -+ } else { -+ const int another = ((out[0] >> 7) & 0x01); -+ const int type = ((out[0] >> 3) & 0x0f); -+ const int quality = ((out[0] >> 2) & 0x01); -+ unsigned int i; -+ -+ /* to shift in place, clear bits beyond end and at start */ -+ out[0] = 0; -+ out[status] = 0; -+ /* shift in place, 6 bits */ -+ for (i = 0; i < status; i++) { -+ out[i] = ((out[i] << 6) | (out[i + 1] >> 2)); -+ } -+ /* restore first two bytes: [ CMR |F| FT |Q] */ -+ out[0] |= ((type << 7) | (quality << 6)); -+ pvt->outbuf.uc[0] = ((15 << 4) | (another << 3) | (type >> 1)); /* CMR: no */ -+ -+ if (8000 == sample_rate) { -+ /* https://tools.ietf.org/html/rfc4867#section-3.6 */ -+ const int octets[16] = { 14, 15, 16, 18, 20, 22, 27, 32, 7 }; -+ -+ status = octets[type]; -+ } else if (16000 == sample_rate) { -+ /* 3GPP TS 26.201, Table A.1b, plus CMR (4 bits) and F (1 bit) / 8 */ -+ const int octets[16] = { 18, 24, 33, 37, 41, 47, 51, 59, 61, 7 }; -+ -+ status = octets[type]; -+ } -+ -+ current = ast_trans_frameout(pvt, status, frame_size); -+ } -+ -+ if (!current) { -+ continue; -+ } else if (last) { -+ AST_LIST_NEXT(last, frame_list) = current; -+ } else { -+ result = current; -+ } -+ last = current; -+ } -+ -+ /* Move the data at the end of the buffer to the front */ -+ if (samples) { -+ memmove(apvt->buf, apvt->buf + samples, pvt->samples * 2); -+ } -+ -+ return result; -+} -+ -+static int amrtolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ const unsigned int sample_rate = pvt->t->dst_codec.sample_rate; -+ const unsigned int frame_size = sample_rate / 50; -+ -+ struct amr_attr *attr = ast_format_get_attribute_data(f->subclass.format); -+ const int aligned = attr ? attr->octet_align : 0; -+ const unsigned char mode_next = *(unsigned char *) f->data.ptr >> 4; -+ const int bfi = 0; /* ignored by underlying API anyway */ -+ unsigned char temp[f->datalen]; -+ unsigned char *in; -+ -+ if (attr && mode_next < 15) { -+ attr->mode_current = mode_next; -+ } -+ -+ /* -+ * Decoders expect the "MIME storage format" (RFC 4867 chapter 5) which is -+ * octet aligned. On the other hand, the "RTP payload format" (chapter 4) -+ * is prefixed with a change-mode request (CMR; 1 byte in octet-aligned -+ * mode). Therefore, we do +1 to jump over the first byte. -+ */ -+ -+ if (aligned) { -+ in = f->data.ptr + 1; -+ } else { -+ in = f->data.ptr; -+ const int another = ((in[0] >> 3) & 0x01); -+ const int type = ((in[0] << 1 | in[1] >> 7) & 0x0f); -+ const int quality = ((in[1] >> 6) & 0x01); -+ unsigned int i; -+ -+ /* shift in place, 2 bits */ -+ for (i = 1; i < (f->datalen - 1); i++) { -+ temp[i] = ((in[i] << 2) | (in[i + 1] >> 6)); -+ } -+ temp[f->datalen - 1] = in[f->datalen - 1] << 2; -+ /* restore first byte: [F| FT |Q] */ -+ temp[0] = ((another << 7) | (type << 3) | (quality << 2)); -+ in = temp; -+ } -+ -+ if ((apvt->frames == 0) && (in[0] & 0x80)) { -+ apvt->frames = 1; -+ ast_log(LOG_WARNING, "multiple frames per packet were not tested\n"); -+ } -+ -+ if (8000 == sample_rate) { -+ Decoder_Interface_Decode(apvt->state, in, pvt->outbuf.i16 + pvt->datalen, bfi); -+ } else if (16000 == sample_rate) { -+ D_IF_decode(apvt->state, in, pvt->outbuf.i16 + pvt->datalen, bfi); -+ } -+ -+ pvt->samples += frame_size; -+ pvt->datalen += frame_size * 2; -+ -+ return 0; -+} -+ -+static void lintoamr_destroy(struct ast_trans_pvt *pvt) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ const unsigned int sample_rate = pvt->t->src_codec.sample_rate; -+ -+ if (!apvt || !apvt->state) { -+ return; -+ } -+ -+ if (8000 == sample_rate) { -+ Encoder_Interface_exit(apvt->state); -+ } else if (16000 == sample_rate) { -+ E_IF_exit(apvt->state); -+ } -+ apvt->state = NULL; -+ -+ ast_debug(3, "Destroyed encoder (%d -> AMR) %p\n", sample_rate, apvt); -+} -+ -+static void amrtolin_destroy(struct ast_trans_pvt *pvt) -+{ -+ struct amr_coder_pvt *apvt = pvt->pvt; -+ const unsigned int sample_rate = pvt->t->dst_codec.sample_rate; -+ -+ if (!apvt || !apvt->state) { -+ return; -+ } -+ -+ if (8000 == sample_rate) { -+ Decoder_Interface_exit(apvt->state); -+ } else if (16000 == sample_rate) { -+ D_IF_exit(apvt->state); -+ } -+ apvt->state = NULL; -+ -+ ast_debug(3, "Destroyed decoder (AMR -> %d) %p\n", sample_rate, apvt); -+} -+ -+static struct ast_translator amrtolin = { -+ .name = "amrtolin", -+ .src_codec = { -+ .name = "amr", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 8000, -+ }, -+ .dst_codec = { -+ .name = "slin", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 8000, -+ }, -+ .format = "slin", -+ .newpvt = amrtolin_new, -+ .framein = amrtolin_framein, -+ .destroy = amrtolin_destroy, -+ .sample = amr_sample, -+ .desc_size = sizeof(struct amr_coder_pvt), -+ .buffer_samples = BUFFER_SAMPLES / 2, -+ /* actually: 50 * channels[6] * redundancy[5] * (mode7[31] + CRC[1] + FT[1] + CMR[1]) */ -+ .buf_size = BUFFER_SAMPLES, -+}; -+ -+static struct ast_translator lintoamr = { -+ .name = "lintoamr", -+ .src_codec = { -+ .name = "slin", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 8000, -+ }, -+ .dst_codec = { -+ .name = "amr", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 8000, -+ }, -+ .format = "amr", -+ .newpvt = lintoamr_new, -+ .framein = lintoamr_framein, -+ .frameout = lintoamr_frameout, -+ .destroy = lintoamr_destroy, -+ .sample = slin8_sample, -+ .desc_size = sizeof(struct amr_coder_pvt), -+ .buffer_samples = BUFFER_SAMPLES / 2, -+ .buf_size = BUFFER_SAMPLES, -+}; -+ -+static struct ast_translator amrtolin16 = { -+ .name = "amrtolin16", -+ .src_codec = { -+ .name = "amrwb", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 16000, -+ }, -+ .dst_codec = { -+ .name = "slin", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 16000, -+ }, -+ .format = "slin16", -+ .newpvt = amrtolin_new, -+ .framein = amrtolin_framein, -+ .destroy = amrtolin_destroy, -+ .sample = amrwb_sample, -+ .desc_size = sizeof(struct amr_coder_pvt), -+ .buffer_samples = BUFFER_SAMPLES, -+ /* actually: 50 * channels[6] * redundancy[5] * (mode8[60] + CRC[1] + FT[1] + CMR[1]) */ -+ .buf_size = BUFFER_SAMPLES * 2, -+}; -+ -+static struct ast_translator lin16toamr = { -+ .name = "lin16toamr", -+ .src_codec = { -+ .name = "slin", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 16000, -+ }, -+ .dst_codec = { -+ .name = "amrwb", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 16000, -+ }, -+ .format = "amrwb", -+ .newpvt = lintoamr_new, -+ .framein = lintoamr_framein, -+ .frameout = lintoamr_frameout, -+ .destroy = lintoamr_destroy, -+ .sample = slin16_sample, -+ .desc_size = sizeof(struct amr_coder_pvt), -+ .buffer_samples = BUFFER_SAMPLES, -+ .buf_size = BUFFER_SAMPLES * 2, -+}; -+ -+static int unload_module(void) -+{ -+ int res; -+ -+ res = ast_unregister_translator(&amrtolin); -+ res |= ast_unregister_translator(&lintoamr); -+ res |= ast_unregister_translator(&amrtolin16); -+ res |= ast_unregister_translator(&lin16toamr); -+ -+ return res; -+} -+ -+static int load_module(void) -+{ -+ int res; -+ -+ res = ast_register_translator(&amrtolin); -+ res |= ast_register_translator(&lintoamr); -+ res |= ast_register_translator(&amrtolin16); -+ res |= ast_register_translator(&lin16toamr); -+ -+ if (res) { -+ unload_module(); -+ return AST_MODULE_LOAD_FAILURE; -+ } -+ -+ return AST_MODULE_LOAD_SUCCESS; -+} -+ -+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "AMR Coder/Decoder"); ---- /dev/null -+++ b/codecs/ex_amr.h -@@ -0,0 +1,49 @@ -+#include "asterisk/format_cache.h" /* for ast_format_amr(wb) */ -+#include "asterisk/frame.h" /* for ast_frame, etc */ -+ -+static uint8_t ex_amr[] = { -+ 0xf0, 0x6d, 0x47, 0x8c, 0xc3, 0x0d, 0x03, 0xec, -+ 0xe2, 0x18, 0x3e, 0x28, 0x20, 0x80 -+}; -+ -+static struct ast_frame *amr_sample(void) -+{ -+ static struct ast_frame f = { -+ .frametype = AST_FRAME_VOICE, -+ .datalen = sizeof(ex_amr), -+ .samples = 160, -+ .mallocd = 0, -+ .offset = 0, -+ .src = __PRETTY_FUNCTION__, -+ .data.ptr = ex_amr, -+ }; -+ -+ f.subclass.format = ast_format_amr; -+ -+ return &f; -+} -+ -+static uint8_t ex_amrwb[] = { -+ 0xf1, 0x5e, 0x51, 0x98, 0xc5, 0x64, 0xc7, 0xc5, -+ 0x0c, 0x6c, 0x82, 0x19, 0x16, 0x03, 0xf0, 0x0a, -+ 0x0b, 0x57, 0x53, 0x51, 0x7f, 0x97, 0x97, 0x79, -+ 0x31, 0xdd, 0x73, 0x1b, 0x92, 0x54, 0xf5, 0x79, -+ 0x9a, -+}; -+ -+static struct ast_frame *amrwb_sample(void) -+{ -+ static struct ast_frame f = { -+ .frametype = AST_FRAME_VOICE, -+ .datalen = sizeof(ex_amrwb), -+ .samples = 320, -+ .mallocd = 0, -+ .offset = 0, -+ .src = __PRETTY_FUNCTION__, -+ .data.ptr = ex_amrwb, -+ }; -+ -+ f.subclass.format = ast_format_amrwb; -+ -+ return &f; -+} ---- a/configure.ac -+++ b/configure.ac -@@ -456,6 +456,9 @@ - # to make things easier for the users. - - AST_EXT_LIB_SETUP([ALSA], [Advanced Linux Sound Architecture], [asound]) -+AST_EXT_LIB_SETUP([AMR_NB], [AMR Audio Codec (Narrowband) Decoder/Encoder], [opencore-amrnb]) -+AST_EXT_LIB_SETUP([AMR_WB_DECODER], [AMR-WB Audio Codec (Wideband) Decoder], [opencore-amrwb]) -+AST_EXT_LIB_SETUP([AMR_WB_ENCODER], [AMR-WB Audio Codec (Wideband) Encoder], [vo-amrwbenc]) - AST_EXT_LIB_SETUP([BFD], [Debug symbol decoding], [bfd]) - - # BKTR is used for backtrace support on platforms that do not -@@ -1500,6 +1503,10 @@ - - AST_EXT_LIB_CHECK([ALSA], [asound], [snd_pcm_open], [alsa/asoundlib.h]) - -+AST_EXT_LIB_CHECK([AMR_NB], [opencore-amrnb], [Encoder_Interface_init], [opencore-amrnb/interf_enc.h]) -+AST_EXT_LIB_CHECK([AMR_WB_DECODER], [opencore-amrwb], [D_IF_init], [opencore-amrwb/dec_if.h]) -+AST_EXT_LIB_CHECK([AMR_WB_ENCODER], [vo-amrwbenc], [E_IF_init], [vo-amrwbenc/enc_if.h]) -+ - AST_EXT_LIB_CHECK([BFD], [bfd], [bfd_openr], [bfd.h]) - # Fedora/RedHat/CentOS require extra libraries - AST_EXT_LIB_CHECK([BFD], [bfd], [bfd_openr], [bfd.h], [-ldl -liberty]) ---- /dev/null -+++ b/include/asterisk/amr.h -@@ -0,0 +1,19 @@ -+#ifndef _AST_FORMAT_AMR_H_ -+#define _AST_FORMAT_AMR_H_ -+ -+struct amr_attr { -+ unsigned int octet_align; -+ unsigned int mode_set:9; -+ unsigned int mode_change_period; -+ unsigned int mode_change_capability; -+ unsigned int mode_change_neighbor; -+ unsigned int crc; -+ unsigned int robust_sorting; -+ unsigned int interleaving; -+ int max_red; -+ /* internal variables for transcoding module */ -+ unsigned char mode_current; /* see amr_clone for default */ -+ int vad; /* see amr_clone for default */ -+}; -+ -+#endif /* _AST_FORMAT_AMR_H */ ---- a/include/asterisk/format_cache.h -+++ b/include/asterisk/format_cache.h -@@ -247,6 +247,16 @@ - extern struct ast_format *ast_format_silk24; - - /*! -+ * \brief Built-in cached AMR format. -+ */ -+extern struct ast_format *ast_format_amr; -+ -+/*! -+ * \brief Built-in cached AMR-WB format. -+ */ -+extern struct ast_format *ast_format_amrwb; -+ -+/*! - * \brief Initialize format cache support within the core. - * - * \retval 0 success ---- a/main/codec_builtin.c -+++ b/main/codec_builtin.c -@@ -904,6 +904,54 @@ - .samples_count = silk_samples - }; - -+static int amr_samples(struct ast_frame *frame) -+{ -+ return 160; -+} -+ -+static int amr_length(unsigned int samples) -+{ -+ ast_log(LOG_NOTICE, "untested; please report failure or success: %u\n", samples); return samples / 8; -+} -+ -+static struct ast_codec amr = { -+ .name = "amr", -+ .description = "AMR", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 8000, -+ .minimum_ms = 20, -+ .maximum_ms = 20, -+ .default_ms = 20, -+ .minimum_bytes = 0, /* no smooth */ -+ .samples_count = amr_samples, -+ .get_length = amr_length, -+ .smooth = 0, -+}; -+ -+static int amrwb_samples(struct ast_frame *frame) -+{ -+ return 320; -+} -+ -+static int amrwb_length(unsigned int samples) -+{ -+ ast_log(LOG_NOTICE, "untested; please report failure or success: %u\n", samples); return samples / 16; -+} -+ -+static struct ast_codec amrwb = { -+ .name = "amrwb", -+ .description = "AMR-WB", -+ .type = AST_MEDIA_TYPE_AUDIO, -+ .sample_rate = 16000, -+ .minimum_ms = 20, -+ .maximum_ms = 20, -+ .default_ms = 20, -+ .minimum_bytes = 0, /* no smooth */ -+ .samples_count = amrwb_samples, -+ .get_length = amrwb_length, -+ .smooth = 0, -+}; -+ - #define CODEC_REGISTER_AND_CACHE(codec) \ - ({ \ - int __res_ ## __LINE__ = 0; \ -@@ -936,6 +984,8 @@ - { - int res = 0; - -+ res |= CODEC_REGISTER_AND_CACHE(amr); -+ res |= CODEC_REGISTER_AND_CACHE(amrwb); - res |= CODEC_REGISTER_AND_CACHE(codec2); - res |= CODEC_REGISTER_AND_CACHE(g723); - res |= CODEC_REGISTER_AND_CACHE(ulaw); ---- a/main/format_cache.c -+++ b/main/format_cache.c -@@ -226,6 +226,16 @@ - struct ast_format *ast_format_codec2; - - /*! -+ * \brief Built-in cached AMR format. -+ */ -+struct ast_format *ast_format_amr; -+ -+/*! -+ * \brief Built-in cached AMR-WB format. -+ */ -+struct ast_format *ast_format_amrwb; -+ -+/*! - * \brief Built-in cached t140 format. - */ - struct ast_format *ast_format_t140; -@@ -313,6 +323,8 @@ - ao2_cleanup(formats); - formats = NULL; - -+ ao2_replace(ast_format_amr, NULL); -+ ao2_replace(ast_format_amrwb, NULL); - ao2_replace(ast_format_g723, NULL); - ao2_replace(ast_format_ulaw, NULL); - ao2_replace(ast_format_alaw, NULL); -@@ -434,6 +446,10 @@ - ao2_replace(ast_format_g719, format); - } else if (!strcmp(name, "opus")) { - ao2_replace(ast_format_opus, format); -+ } else if (!strcmp(name, "amr")) { -+ ao2_replace(ast_format_amr, format); -+ } else if (!strcmp(name, "amrwb")) { -+ ao2_replace(ast_format_amrwb, format); - } else if (!strcmp(name, "jpeg")) { - ao2_replace(ast_format_jpeg, format); - } else if (!strcmp(name, "png")) { ---- a/main/rtp_engine.c -+++ b/main/rtp_engine.c -@@ -3597,6 +3597,9 @@ - set_next_mime_type(ast_format_vp8, 0, "video", "VP8", 90000); - set_next_mime_type(ast_format_vp9, 0, "video", "VP9", 90000); - -+ set_next_mime_type(ast_format_amr, 0, "audio", "AMR", 8000); -+ set_next_mime_type(ast_format_amrwb, 0, "audio", "AMR-WB", 16000); -+ - /* Define the static rtp payload mappings */ - add_static_payload(0, ast_format_ulaw, 0); - #ifdef USE_DEPRECATED_G726 -@@ -3657,6 +3660,9 @@ - add_static_payload(127, ast_format_slin96, 0); - /* payload types above 127 are not valid */ - -+ add_static_payload(108, ast_format_amr, 0); -+ add_static_payload(109, ast_format_amrwb, 0); -+ - return 0; - } - ---- a/makeopts.in -+++ b/makeopts.in -@@ -131,6 +131,13 @@ - ALSA_INCLUDE=@ALSA_INCLUDE@ - ALSA_LIB=@ALSA_LIB@ - -+AMR_NB_INCLUDE=@AMR_NB_INCLUDE@ -+AMR_NB_LIB=@AMR_NB_LIB@ -+AMR_WB_DECODER_INCLUDE=@AMR_WB_DECODER_INCLUDE@ -+AMR_WB_DECODER_LIB=@AMR_WB_DECODER_LIB@ -+AMR_WB_ENCODER_INCLUDE=@AMR_WB_ENCODER_INCLUDE@ -+AMR_WB_ENCODER_LIB=@AMR_WB_ENCODER_LIB@ -+ - BFD_INCLUDE=@BFD_INCLUDE@ - BFD_LIB=@BFD_LIB@ - ---- /dev/null -+++ b/res/res_format_attr_amr.c -@@ -0,0 +1,488 @@ -+#include "asterisk.h" -+ -+/* version 3.0, compatiblity overview as of October 2015 */ -+/* based on res/res_format_attr_silk.c */ -+ -+#include /* for tolower */ -+#include /* for log10, floor */ -+ -+#include "asterisk/module.h" -+#include "asterisk/format.h" -+#include "asterisk/astobj2.h" /* for ao2_bump */ -+#include "asterisk/format_cache.h" /* for ast_format_amr(wb) */ -+#include "asterisk/logger.h" /* for ast_debug, ast_log, etc */ -+#include "asterisk/strings.h" /* for ast_str_append */ -+#include "asterisk/utils.h" /* for MAX, ast_calloc, ast_free, etc */ -+ -+#include "asterisk/amr.h" -+ -+/* Asterisk internal defaults; can differ from RFC defaults */ -+static struct amr_attr default_amr_attr = { -+ .octet_align = 0, /* bandwidth efficient */ -+ .mode_set = 0, /* all modes */ -+ .mode_change_period = 0, /* not specified */ -+ .mode_change_capability = 0, /* not supported */ -+ .mode_change_neighbor = 0, /* change to any */ -+ .crc = 0, /* off */ -+ .robust_sorting = 0, /* off */ -+ .interleaving = 0, /* off */ -+ .max_red = -1, /* no redundancy limit */ -+}; -+ -+static void amr_destroy(struct ast_format *format) -+{ -+ struct amr_attr *attr = ast_format_get_attribute_data(format); -+ -+ ast_free(attr); -+} -+ -+static int amr_clone(const struct ast_format *src, struct ast_format *dst) -+{ -+ struct amr_attr *original = ast_format_get_attribute_data(src); -+ struct amr_attr *attr = ast_malloc(sizeof(*attr)); -+ -+ if (!attr) { -+ return -1; -+ } -+ -+ if (original) { -+ *attr = *original; -+ } else { -+ *attr = default_amr_attr; -+ /* internal variables for transcoding module */ -+ if (16000 == ast_format_get_sample_rate(src)) { -+ attr->mode_current = 8; -+ attr->vad = 0; -+ } else { -+ attr->mode_current = 7; -+ attr->vad = 1; -+ } -+ } -+ -+ ast_format_set_attribute_data(dst, attr); -+ -+ return 0; -+} -+ -+static struct ast_format *amr_parse_sdp_fmtp(const struct ast_format *format, const char *attrib) -+{ -+ struct ast_format *cloned; -+ struct amr_attr *attr; -+ unsigned int val; -+ char *attributes; -+ char *tmp; -+ const unsigned int size = 9; /* same as bit-field definition of mode_set */ -+ int v[size]; -+ /* init each slot as 'not specified' */ -+ for (val = 0; val < size; val = val + 1) { -+ v[val] = -1; -+ } -+ -+ cloned = ast_format_clone(format); -+ if (!cloned) { -+ return NULL; -+ } -+ attr = ast_format_get_attribute_data(cloned); -+ -+ /* lower-case everything, so we are case-insensitive */ -+ /* no implementation is known which is affected by this */ -+ attributes = ast_strdupa(attrib); -+ for (tmp = attributes; *tmp; ++tmp) { -+ *tmp = tolower(*tmp); -+ } /* based on channels/chan_sip.c:process_a_sdp_image() */ -+ -+ attr->octet_align = 0; -+ tmp = strstr(attributes, "octet-align="); -+ if (tmp) { -+ if (sscanf(tmp, "octet-align=%30u", &val) == 1) { -+ attr->octet_align = val; -+ } -+ } -+ -+ attr->mode_set = 0; -+ tmp = strstr(attributes, "mode-set="); -+ if (tmp) { -+ if (sscanf(tmp, "mode-set=%30u,%30u,%30u,%30u,%30u,%30u,%30u,%30u,%30u", -+ &v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &v[6], &v[7], &v[8]) > 0) { -+ for (val = 0; val < size; val = val + 1) { -+ if (0 <= v[val] && v[val] < size) { -+ attr->mode_set = (attr->mode_set | (1 << v[val])); -+ attr->mode_current = v[val]; -+ } -+ } -+ } -+ } -+ -+ attr->mode_change_capability = 0; -+ tmp = strstr(attributes, "mode-change-capability="); -+ if (tmp) { -+ if (sscanf(tmp, "mode-change-capability=%30u", &val) == 1) { -+ attr->mode_change_capability = val; -+ } -+ } -+ -+ attr->mode_change_period = 0; -+ tmp = strstr(attributes, "mode-change-period="); -+ if (tmp) { -+ if (sscanf(tmp, "mode-change-period=%30u", &val) == 1) { -+ attr->mode_change_period = val; -+ } -+ } -+ -+ attr->mode_change_neighbor = 0; -+ tmp = strstr(attributes, "mode-change-neighbor="); -+ if (tmp) { -+ if (sscanf(tmp, "mode-change-neighbor=%30u", &val) == 1) { -+ attr->mode_change_neighbor = val; -+ } -+ } -+ -+ attr->crc = 0; -+ tmp = strstr(attributes, "crc="); -+ if (tmp) { -+ if (sscanf(tmp, "crc=%30u", &val) == 1) { -+ attr->crc = val; -+ if (attr->crc) { -+ attr->octet_align = 1; -+ } -+ } -+ } -+ -+ attr->robust_sorting = 0; -+ tmp = strstr(attributes, "robust-sorting="); -+ if (tmp) { -+ if (sscanf(tmp, "robust-sorting=%30u", &val) == 1) { -+ attr->robust_sorting = val; -+ if (attr->robust_sorting) { -+ attr->octet_align = 1; -+ } -+ } -+ } -+ -+ attr->interleaving = 0; -+ tmp = strstr(attributes, "interleaving"); -+ if (tmp) { -+ attr->interleaving = 1; -+ attr->octet_align = 1; -+ } -+ -+ attr->max_red = -1; -+ tmp = strstr(attributes, "max-red="); -+ if (tmp) { -+ if (sscanf(tmp, "max-red=%30u", &val) == 1) { -+ attr->max_red = val; -+ } -+ } -+ -+ return cloned; -+} -+ -+static void amr_generate_sdp_fmtp(const struct ast_format *format, unsigned int payload, struct ast_str **str) -+{ -+ int appended = 0; -+ int listed = 0; -+ struct amr_attr *attr = ast_format_get_attribute_data(format); -+ -+ if (!attr) { -+ attr = &default_amr_attr; -+ } -+ -+ if (0 != attr->octet_align) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "octet-align=%d", attr->octet_align); -+ appended = appended + 1; -+ } -+ if (0 != attr->mode_set) -+ { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "mode-set="); -+ if (attr->mode_set & 0x01) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "0"); -+ } else { -+ ast_str_append(str, 0, ",0"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x02) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "1"); -+ } else { -+ ast_str_append(str, 0, ",1"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x04) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "2"); -+ } else { -+ ast_str_append(str, 0, ",2"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x08) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "3"); -+ } else { -+ ast_str_append(str, 0, ",3"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x10) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "4"); -+ } else { -+ ast_str_append(str, 0, ",4"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x20) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "5"); -+ } else { -+ ast_str_append(str, 0, ",5"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x40) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "6"); -+ } else { -+ ast_str_append(str, 0, ",6"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x80) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "7"); -+ } else { -+ ast_str_append(str, 0, ",7"); -+ } -+ listed = listed + 1; -+ } -+ if (attr->mode_set & 0x100) { -+ if (0 == listed) { -+ ast_str_append(str, 0, "8"); -+ } else { -+ ast_str_append(str, 0, ",8"); -+ } -+ listed = listed + 1; -+ } -+ appended = appended + 1; -+ } -+ if (0 != attr->mode_change_capability) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "mode-change-capability=%d", attr->mode_change_capability); -+ appended = appended + 1; -+ } -+ if (0 != attr->mode_change_period) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "mode-change-period=%d", attr->mode_change_period); -+ appended = appended + 1; -+ } -+ if (0 != attr->mode_change_neighbor) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "mode-change-neighbor=%d", attr->mode_change_neighbor); -+ appended = appended + 1; -+ } -+ if (0 != attr->crc) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "crc=%d", attr->crc); -+ appended = appended + 1; -+ } -+ if (0 != attr->robust_sorting) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "robust-sorting=%d", attr->robust_sorting); -+ appended = appended + 1; -+ } -+ if (0 != attr->interleaving) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "interleaving"); -+ appended = appended + 1; -+ } -+ if (0 <= attr->max_red) { -+ if (0 == appended) { -+ ast_str_append(str, 0, "a=fmtp:%d ", payload); -+ } else { -+ ast_str_append(str, 0, ";"); -+ } -+ ast_str_append(str, 0, "max-red=%d", attr->max_red); -+ appended = appended + 1; -+ } -+ if (0 != appended) { -+ ast_str_append(str, 0, "\r\n"); -+ } -+ /* -+ * AMR-WB, GSM gateway compatible setting: -+ * ast_str_append(str, 0, "a=fmtp:%d mode-set=0,1,2; mode-change-period=2; mode-change-neighbor=1\r\n", payload); -+ * less than 25kb/s in SIP RTP which equals iLBC:30 in data traffic, and AMR-WB is a wide-band codec! -+ */ -+} -+ -+/* -+ * Octet Alignment -+ * -+ * AMR and AMR-WB support 'octet-align=1' which does not stuff the -+ * header bits over octet borders and which is readable in -+ * Wireshark. This parameter is negotiated via SDP. Belledonne and -+ * CounterPath do not offer AMR, only AMR-WB. Android offers only AMR. -+ * -+ * Nokia Symbian/S60: configurable via user-interface; default: off -+ * Nokia Series 40: configurable via OMA Client Provisioning (OMA CP); default: off -+ * Nokia Asha Software Platform: configurable via OMA CP; default: on -+ * CounterPath Bria (iOS): no setting known; off -+ * CounterPath Bria (Android): see iOS -+ * CounterPath Bria (BlackBerry 10): AMR/AMR-WB not available, as of version 1.3.1 -+ * Bug: since version 3.4, fmtp is missing = negotiating octet-aligned mode fails -+ * BeeHD (iOS): no setting known; on -+ * Bug: Nokia Symbian/S60 calls BeeHD, no audio in BeeHD; AMR-WB works -+ * Belledonne Linphone 1.0.2 (Windows Phone 8): no setting known; on -+ * Bug: ignores octet-align=0 in fmtp = distorted audio -+ * CSipSimple 1.02r2330 (Android): no setting known; off -+ * Bug: CSipSimple calls a Nokia Symbian/S60, no audio in Nokia; AMR works -+ * Bug: AMR-WB ignores octet-align=1 in fmtp = distorted audio; AMR works -+ * fixed upstream with -+ * Google Android 5: no setting known; off -+ * Join (iOS): no setting known; on -+ * Bug: AMR-WB ignores octet-align=0 in fmtp = distorted audio; AMR works -+ * PortGo (iOS): no setting known; off (is able to change alignment through negotiation) -+ */ -+static struct ast_format *amr_getjoint(const struct ast_format *format1, const struct ast_format *format2) -+{ -+ struct amr_attr *attr1 = ast_format_get_attribute_data(format1); -+ struct amr_attr *attr2 = ast_format_get_attribute_data(format2); -+ struct amr_attr *attr_res; -+ struct ast_format *jointformat = NULL; -+ -+ if (!attr1) { -+ attr1 = &default_amr_attr; -+ } -+ -+ if (!attr2) { -+ attr2 = &default_amr_attr; -+ } -+ -+ if (format1 == ast_format_amrwb || format1 == ast_format_amr) { -+ jointformat = (struct ast_format *) format2; -+ } -+ if (format2 == ast_format_amrwb || format2 == ast_format_amr) { -+ jointformat = (struct ast_format *) format1; -+ } -+ if (format1 == format2) { -+ if (!jointformat) { -+ ast_debug(3, "Both formats were not cached but the same.\n"); -+ jointformat = (struct ast_format *) format1; -+ } else { -+ ast_debug(3, "Both formats were cached.\n"); -+ jointformat = NULL; -+ } -+ } -+ if (!jointformat) { -+ ast_debug(3, "Which pointer shall be returned? Let us create a new one!\n"); -+ jointformat = ast_format_clone(format1); -+ } else { -+ ao2_bump(jointformat); -+ } -+ if (!jointformat) { -+ return NULL; -+ } -+ attr_res = ast_format_get_attribute_data(jointformat); -+ -+ if (0 == attr1->mode_set && 0 == attr2->mode_set) { -+ attr_res->mode_set = 0; /* both allowed all = 0 */ -+ } else if (0 != attr1->mode_set && 0 == attr2->mode_set) { -+ attr_res->mode_set = attr1->mode_set; /* attr2 allowed all */ -+ } else if (0 == attr1->mode_set && 0 != attr2->mode_set) { -+ attr_res->mode_set = attr2->mode_set; /* attr1 allowed all */ -+ } else { /* both parties restrict, let us check if they match */ -+ attr_res->mode_set = (attr1->mode_set & attr2->mode_set); -+ if (0 == attr_res->mode_set) { -+ /* not expected because everyone supports 0,1,2 */ -+ ast_log(LOG_WARNING, "mode-set did not match\n"); -+ return NULL; -+ } -+ } -+ attr_res->mode_change_period = MAX(attr1->mode_change_period, attr2->mode_change_period); -+ attr_res->mode_change_capability = MAX(attr1->mode_change_capability, attr2->mode_change_capability); -+ attr_res->mode_change_neighbor = MAX(attr1->mode_change_neighbor, attr2->mode_change_neighbor); -+ attr_res->crc = MAX(attr1->crc, attr2->crc); -+ attr_res->robust_sorting = MAX(attr1->robust_sorting, attr2->robust_sorting); -+ attr_res->interleaving = MAX(attr1->interleaving, attr2->interleaving); -+ attr_res->max_red = MAX(attr1->max_red, attr2->max_red); -+ -+ /* internal variables for transcoding module */ -+ /* starting point; later, changes with a change-mode request (CMR) */ -+ if (0 < attr_res->mode_set) { -+ attr_res->mode_current = floor(log10(attr_res->mode_set) / log10(2)); -+ } -+ attr_res->vad = MAX(attr1->vad, attr2->vad); -+ -+ return jointformat; -+} -+ -+static struct ast_format_interface amr_interface = { -+ .format_destroy = amr_destroy, -+ .format_clone = amr_clone, -+ .format_cmp = NULL, -+ .format_get_joint = amr_getjoint, -+ .format_attribute_set = NULL, -+ .format_parse_sdp_fmtp = amr_parse_sdp_fmtp, -+ .format_generate_sdp_fmtp = amr_generate_sdp_fmtp, -+}; -+ -+static int load_module(void) -+{ -+ if (ast_format_interface_register("amr", &amr_interface)) { -+ return AST_MODULE_LOAD_DECLINE; -+ } -+ -+ if (ast_format_interface_register("amrwb", &amr_interface)) { -+ return AST_MODULE_LOAD_DECLINE; -+ } -+ -+ return AST_MODULE_LOAD_SUCCESS; -+} -+ -+static int unload_module(void) -+{ -+ return 0; -+} -+ -+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, -+ "AMR Format Attribute Module", -+ .load = load_module, -+ .unload = unload_module, -+ .load_pri = AST_MODPRI_CHANNEL_DEPEND, -+); diff --git a/debian/patches/apply-patch-from-eta.patch b/debian/patches/apply-patch-from-eta.patch deleted file mode 100644 index 6c7003e..0000000 --- a/debian/patches/apply-patch-from-eta.patch +++ /dev/null @@ -1,315 +0,0 @@ -From: Stephen Paul Weber -Date: Wed, 22 Jul 2020 14:34:00 -0500 -X-Dgit-Generated: 1:16.2.1~dfsg-1+deb10u1 585dac068290d9281c0a49f324c566a22323adea -Subject: Apply patch from eta - -https://theta.eu.org/lx/asterisk.patch - ---- - ---- asterisk-16.2.1~dfsg.orig/channels/chan_motif.c -+++ asterisk-16.2.1~dfsg/channels/chan_motif.c -@@ -258,6 +258,8 @@ - /*! \brief Namespace for XMPP stanzas */ - #define XMPP_STANZAS_NS "urn:ietf:params:xml:ns:xmpp-stanzas" - -+#define DTLS_NS "urn:xmpp:jingle:apps:dtls:0" -+ - /*! \brief The various transport methods supported, from highest priority to lowest priority when doing fallback */ - enum jingle_transport { - JINGLE_TRANSPORT_ICE_UDP = 3, /*!< XEP-0176 */ -@@ -686,7 +688,7 @@ static void jingle_enable_video(struct j - return; - } - -- ast_rtp_instance_set_prop(session->vrtp, AST_RTP_PROPERTY_RTCP, 1); -+ ast_rtp_instance_set_prop(session->vrtp, AST_RTP_PROPERTY_RTCP, AST_RTP_INSTANCE_RTCP_MUX); - ast_rtp_instance_set_channel_id(session->vrtp, ast_channel_uniqueid(session->owner)); - ast_channel_set_fd(session->owner, 2, ast_rtp_instance_fd(session->vrtp, 0)); - ast_channel_set_fd(session->owner, 3, ast_rtp_instance_fd(session->vrtp, 1)); -@@ -697,6 +699,8 @@ static void jingle_enable_video(struct j - } - } - -+static struct ast_rtp_dtls_cfg dtls_cfg; -+ - /*! \brief Internal helper function used to allocate Jingle session on an endpoint */ - static struct jingle_session *jingle_alloc(struct jingle_endpoint *endpoint, const char *from, const char *sid) - { -@@ -755,9 +759,35 @@ static struct jingle_session *jingle_all - ao2_ref(session, -1); - return NULL; - } -+ - ast_rtp_instance_set_prop(session->rtp, AST_RTP_PROPERTY_RTCP, 1); - ast_rtp_instance_set_prop(session->rtp, AST_RTP_PROPERTY_DTMF, 1); - -+ struct ast_rtp_engine_dtls *dtls; -+ -+ if ((dtls = ast_rtp_instance_get_dtls(session->rtp))) { -+ dtls_cfg.enabled = 1; -+ dtls_cfg.default_setup = AST_RTP_DTLS_SETUP_ACTPASS; -+ dtls_cfg.hash = AST_RTP_DTLS_HASH_SHA256; -+ dtls_cfg.verify = AST_RTP_DTLS_VERIFY_FINGERPRINT; -+ dtls_cfg.suite = AST_AES_CM_128_HMAC_SHA1_80; -+ dtls_cfg.ephemeral_cert = 1; -+ dtls_cfg.certfile = ast_strdup(""); -+ dtls_cfg.pvtfile = ast_strdup(""); -+ dtls_cfg.cipher = ast_strdup(""); -+ dtls_cfg.cafile = ast_strdup(""); -+ dtls_cfg.capath = ast_strdup(""); -+ -+ if (dtls->set_configuration(session->rtp, &dtls_cfg)) { -+ ast_log(LOG_ERROR, "Attempted to set an invalid DTLS-SRTP configuration on RTP instance '%p'\n", -+ session->rtp); -+ } -+ } -+ else { -+ ast_log(LOG_ERROR, "No DTLS-SRTP support present on engine for RTP instance '%p', was it compiled with support for it?\n", -+ session->rtp); -+ } -+ - session->maxicecandidates = endpoint->maxicecandidates; - session->maxpayloads = endpoint->maxpayloads; - -@@ -914,6 +944,49 @@ end: - iks_delete(response); - } - -+static void jingle_add_fingerprint(struct ast_rtp_instance *rtp, iks *transport) { -+ struct ast_rtp_engine_dtls *dtls; -+ if ((dtls = ast_rtp_instance_get_dtls(rtp)) || dtls->active(rtp)) { -+ // Add the DTLS fingerprint in there as well -+ iks *fingerprint_node = NULL; -+ const char *fingerprint; -+ if (!(fingerprint_node = iks_new("fingerprint"))) { -+ ast_log(LOG_ERROR, "Failed to allocate stanzas for DTLS"); -+ return; -+ } -+ iks_insert_attrib(fingerprint_node, "xmlns", DTLS_NS); -+ switch (dtls->get_setup(rtp)) { -+ case AST_RTP_DTLS_SETUP_ACTIVE: -+ iks_insert_attrib(fingerprint_node, "setup", "active"); -+ break; -+ case AST_RTP_DTLS_SETUP_PASSIVE: -+ iks_insert_attrib(fingerprint_node, "setup", "passive"); -+ break; -+ case AST_RTP_DTLS_SETUP_ACTPASS: -+ iks_insert_attrib(fingerprint_node, "setup", "actpass"); -+ break; -+ case AST_RTP_DTLS_SETUP_HOLDCONN: -+ iks_insert_attrib(fingerprint_node, "setup", "holdconn"); -+ break; -+ default: -+ break; -+ } -+ switch (dtls->get_fingerprint_hash(rtp)) { -+ case AST_RTP_DTLS_HASH_SHA1: -+ iks_insert_attrib(fingerprint_node, "hash", "sha-1"); -+ break; -+ case AST_RTP_DTLS_HASH_SHA256: -+ iks_insert_attrib(fingerprint_node, "hash", "sha-256"); -+ break; -+ default: -+ break; -+ } -+ fingerprint = dtls->get_fingerprint(rtp); -+ iks_insert_cdata(fingerprint_node, fingerprint, strlen(fingerprint)); -+ iks_insert_node(transport, fingerprint_node); -+ } -+} -+ - /*! \brief Internal helper function which adds ICE-UDP candidates to a transport node */ - static int jingle_add_ice_udp_candidates_to_transport(struct ast_rtp_instance *rtp, iks *transport, iks **candidates, unsigned int maximum) - { -@@ -929,6 +1002,7 @@ static int jingle_add_ice_udp_candidates - } - - iks_insert_attrib(transport, "xmlns", JINGLE_ICE_UDP_NS); -+ jingle_add_fingerprint(rtp, transport); - iks_insert_attrib(transport, "pwd", ice->get_password(rtp)); - iks_insert_attrib(transport, "ufrag", ice->get_ufrag(rtp)); - -@@ -967,7 +1041,9 @@ static int jingle_add_ice_udp_candidates - } - - iks_insert_node(transport, local_candidate); -- candidates[i++] = local_candidate; -+ if (candidates != NULL) { -+ candidates[i++] = local_candidate; -+ } - } - - ao2_iterator_destroy(&it); -@@ -1208,7 +1284,7 @@ static void jingle_queue_hangup_with_cau - } - - /*! \brief Internal function which sends a transport-info message */ --static void jingle_send_transport_info(struct jingle_session *session, const char *from) -+static void jingle_send_transport_info(struct jingle_session *session, const char *from, int actually_initiate) - { - iks *iq, *jingle = NULL, *audio = NULL, *audio_transport = NULL, *video = NULL, *video_transport = NULL; - iks *audio_candidates[session->maxicecandidates], *video_candidates[session->maxicecandidates]; -@@ -1237,7 +1313,7 @@ static void jingle_send_transport_info(s - iks_insert_attrib(jingle, "xmlns", GOOGLE_SESSION_NS); - iks_insert_attrib(jingle, "initiator", session->outgoing ? session->connection->jid->full : from); - } else { -- iks_insert_attrib(jingle, "action", "transport-info"); -+ iks_insert_attrib(jingle, "action", actually_initiate == 1 ? "session-initiate" : "transport-info"); - iks_insert_attrib(jingle, "sid", session->sid); - iks_insert_attrib(jingle, "xmlns", JINGLE_NS); - } -@@ -1384,6 +1460,10 @@ static int jingle_add_payloads_to_descri - payloads[i++] = payload; - } - } -+ iks *rtcp_mux = iks_new("rtcp-mux"); -+ if (rtcp_mux) { -+ iks_insert_node(description, rtcp_mux); -+ } - - return res; - } -@@ -1416,6 +1496,8 @@ static int jingle_add_content(struct jin - if (!(res = jingle_add_payloads_to_description(session, rtp, description, payloads, type))) { - if (session->transport == JINGLE_TRANSPORT_ICE_UDP) { - iks_insert_attrib(transport, "xmlns", JINGLE_ICE_UDP_NS); -+ jingle_add_ice_udp_candidates_to_transport(rtp, transport, NULL, session->maxicecandidates); -+ jingle_add_fingerprint(rtp, transport); - iks_insert_node(content, transport); - } else if (session->transport == JINGLE_TRANSPORT_GOOGLE_V2) { - iks_insert_attrib(transport, "xmlns", GOOGLE_TRANSPORT_NS); -@@ -1543,7 +1625,7 @@ static int jingle_outgoing_hook(void *da - } - ao2_unlock(session); - -- jingle_send_transport_info(session, iks_find_attrib(pak->x, "from")); -+ jingle_send_transport_info(session, iks_find_attrib(pak->x, "from"), 0); - - goto end; - } -@@ -2084,8 +2166,19 @@ static int jingle_interpret_description( - return -1; - } - -+ struct ast_rtp_engine_ice *ice = ast_rtp_instance_get_ice(session->rtp); - /* Iterate the codecs updating the relevant RTP instance as we go */ - for (codec = iks_child(description); codec; codec = iks_next(codec)) { -+ if (strcasecmp(iks_name(codec), "rtcp-mux") == 0) { -+ if (ice) { -+ ast_log(LOG_NOTICE, "Enabling RTCP MUX for session '%s'\n", session->sid); -+ ice->change_components(session->rtp, 1); -+ } -+ else { -+ ast_log(LOG_ERROR, "Could not enable RTCP MUX for session '%s' as ICE not available\n", session->sid); -+ } -+ continue; -+ } - char *id = iks_find_attrib(codec, "id"), *name = iks_find_attrib(codec, "name"); - char *clockrate = iks_find_attrib(codec, "clockrate"); - int rtp_id, rtp_clockrate; -@@ -2131,10 +2224,53 @@ static int jingle_interpret_ice_udp_tran - if (!ast_strlen_zero(ufrag) && !ast_strlen_zero(pwd)) { - ice->set_authentication(rtp, ufrag, pwd); - } -+ iks *fingerprint_node; -+ if ((fingerprint_node = iks_find_with_attrib(transport, "transport", "xmlns", DTLS_NS))) { -+ char *dtls_hash, *dtls_fingerprint, *dtls_setup; -+ dtls_hash = iks_find_attrib(fingerprint_node, "hash"); -+ dtls_fingerprint = iks_cdata(fingerprint_node); -+ dtls_setup = iks_find_attrib(fingerprint_node, "setup"); -+ if (!ast_strlen_zero(dtls_hash) && !ast_strlen_zero(dtls_fingerprint) && !ast_strlen_zero(dtls_setup)) { -+ struct ast_rtp_engine_dtls *dtls; -+ if ((dtls = ast_rtp_instance_get_dtls(rtp))) { -+ ast_log(LOG_NOTICE, "Received DTLS information on session '%s' (hash %s): %s\n", session->sid, dtls_hash, dtls_fingerprint); -+ if (!strcasecmp(dtls_hash, "sha-1")) { -+ dtls->set_fingerprint(rtp, AST_RTP_DTLS_HASH_SHA1, dtls_fingerprint); -+ } else if (!strcasecmp(dtls_hash, "sha-256")) { -+ dtls->set_fingerprint(rtp, AST_RTP_DTLS_HASH_SHA256, dtls_fingerprint); -+ } else { -+ ast_log(LOG_WARNING, "Unsupported fingerprint hash type '%s' received for session '%s'\n", -+ dtls_hash, session->sid); -+ } -+ if (!strcasecmp(dtls_setup, "active")) { -+ dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_ACTIVE); -+ } else if (!strcasecmp(dtls_setup, "passive")) { -+ dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_PASSIVE); -+ } else if (!strcasecmp(dtls_setup, "actpass")) { -+ dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_ACTPASS); -+ } else if (!strcasecmp(dtls_setup, "holdconn")) { -+ dtls->set_setup(rtp, AST_RTP_DTLS_SETUP_HOLDCONN); -+ } else { -+ ast_log(LOG_WARNING, "Unsupported setup attribute dtls_setup '%s' received for session '%s'\n", -+ dtls_setup, session->sid); -+ } -+ } -+ else { -+ ast_log(LOG_WARNING, "Received DTLS information on session '%s', but it wasn't enabled\n", session->sid); -+ } -+ } -+ else { -+ ast_log(LOG_WARNING, "Invalid DTLS information on session '%s'\n", session->sid); -+ } -+ } - - for (candidate = iks_child(transport); candidate; candidate = iks_next(candidate)) { -+ char *name = iks_name(candidate); -+ if (strcasecmp(name, "candidate") != 0) { -+ continue; -+ } - char *component = iks_find_attrib(candidate, "component"), *foundation = iks_find_attrib(candidate, "foundation"); -- char *generation = iks_find_attrib(candidate, "generation"), *id = iks_find_attrib(candidate, "id"); -+ char *generation = iks_find_attrib(candidate, "generation"); - char *ip = iks_find_attrib(candidate, "ip"), *port = iks_find_attrib(candidate, "port"); - char *priority = iks_find_attrib(candidate, "priority"), *protocol = iks_find_attrib(candidate, "protocol"); - char *type = iks_find_attrib(candidate, "type"); -@@ -2143,7 +2279,7 @@ static int jingle_interpret_ice_udp_tran - struct ast_sockaddr remote_address = { { 0, } }; - - /* If this candidate is incomplete skip it */ -- if (ast_strlen_zero(component) || ast_strlen_zero(foundation) || ast_strlen_zero(generation) || ast_strlen_zero(id) || -+ if (ast_strlen_zero(component) || ast_strlen_zero(foundation) || ast_strlen_zero(generation) || - ast_strlen_zero(ip) || ast_strlen_zero(port) || ast_strlen_zero(priority) || - ast_strlen_zero(protocol) || ast_strlen_zero(type)) { - jingle_queue_hangup_with_cause(session, AST_CAUSE_PROTOCOL_ERROR); -@@ -2450,7 +2586,7 @@ static void jingle_action_session_initia - - /* Only send a transport-info message if we successfully interpreted the available content */ - if (!jingle_interpret_content(session, pak)) { -- jingle_send_transport_info(session, iks_find_attrib(pak->x, "from")); -+ jingle_send_transport_info(session, iks_find_attrib(pak->x, "from"), 0); - } - break; - } ---- asterisk-16.2.1~dfsg.orig/res/res_xmpp.c -+++ asterisk-16.2.1~dfsg/res/res_xmpp.c -@@ -2427,11 +2427,11 @@ done: - static int xmpp_client_service_discovery_get_hook(void *data, ikspak *pak) - { - struct ast_xmpp_client *client = data; -- iks *iq, *disco = NULL, *ident = NULL, *google = NULL, *jingle = NULL, *ice = NULL, *rtp = NULL, *audio = NULL, *video = NULL, *query = NULL; -+ iks *iq, *disco = NULL, *ident = NULL, *google = NULL, *jingle = NULL, *ice = NULL, *rtp = NULL, *audio = NULL, *video = NULL, *query = NULL, *dtls = NULL; - - if (!(iq = iks_new("iq")) || !(query = iks_new("query")) || !(ident = iks_new("identity")) || !(disco = iks_new("feature")) || - !(google = iks_new("feature")) || !(jingle = iks_new("feature")) || !(ice = iks_new("feature")) || !(rtp = iks_new("feature")) || -- !(audio = iks_new("feature")) || !(video = iks_new("feature"))) { -+ !(audio = iks_new("feature")) || !(video = iks_new("feature")) || !(dtls = iks_new("feature"))) { - ast_log(LOG_ERROR, "Could not allocate memory for responding to service discovery request from '%s' on client '%s'\n", - pak->from->full, client->name); - goto end; -@@ -2455,6 +2455,7 @@ static int xmpp_client_service_discovery - iks_insert_attrib(jingle, "var", "urn:xmpp:jingle:1"); - iks_insert_attrib(ice, "var", "urn:xmpp:jingle:transports:ice-udp:1"); - iks_insert_attrib(rtp, "var", "urn:xmpp:jingle:apps:rtp:1"); -+ iks_insert_attrib(dtls, "var", "urn:xmpp:jingle:apps:dtls:0"); - iks_insert_attrib(audio, "var", "urn:xmpp:jingle:apps:rtp:audio"); - iks_insert_attrib(video, "var", "urn:xmpp:jingle:apps:rtp:video"); - iks_insert_node(iq, query); -@@ -2464,6 +2465,7 @@ static int xmpp_client_service_discovery - iks_insert_node(query, jingle); - iks_insert_node(query, ice); - iks_insert_node(query, rtp); -+ iks_insert_node(query, dtls); - iks_insert_node(query, audio); - iks_insert_node(query, video); - ast_xmpp_client_send(client, iq); diff --git a/debian/patches/astdatadir b/debian/patches/astdatadir deleted file mode 100644 index e1f5779..0000000 --- a/debian/patches/astdatadir +++ /dev/null @@ -1,21 +0,0 @@ -Description: place asterisk read-only data files under /usr/share - On Debian read-only resources belong under /usr. The space taken from - the writable /var should be minimized. - . - Upstream prefers defaults to have those files under /var/lib, though - supports a separate datadir. -Author: Tzafrir Cohen -Forwarded: no -Last-Update: 2016-03-19 - ---- a/configure.ac -+++ b/configure.ac -@@ -51,7 +51,7 @@ - AC_SUBST([astmoddir], ['${libdir}/asterisk/modules'])dnl - AC_SUBST([astmandir], ['${mandir}'])dnl - AC_SUBST([astvarlibdir], ['${localstatedir}/lib/asterisk'])dnl --AC_SUBST([astdatadir], ['${astvarlibdir}'])dnl -+AC_SUBST([astdatadir], ['${datadir}/asterisk'])dnl - AC_SUBST([astdbdir], ['${astvarlibdir}'])dnl - AC_SUBST([astkeydir], ['${astvarlibdir}'])dnl - AC_SUBST([astspooldir], ['${localstatedir}/spool/asterisk'])dnl diff --git a/debian/patches/astgenkey-security b/debian/patches/astgenkey-security deleted file mode 100644 index 4122ed9..0000000 --- a/debian/patches/astgenkey-security +++ /dev/null @@ -1,21 +0,0 @@ -Description: astgenkey should generate a private key that is not world-readable - Upstream has not accepted this patch and chose instead to document this - as a known minor issue. -Author: Lionel Elie Mamane -Bug: http://issues.asterisk.org/view.php?id=12373 -Last-Update: 2016-03-19 - ---- a/contrib/scripts/astgenkey -+++ b/contrib/scripts/astgenkey -@@ -47,7 +47,11 @@ - rm -f ${KEY}.key ${KEY}.pub - - echo "Generating SSL key '$KEY': " -+oldumask="`umask`" -+umask 0077 - openssl genrsa -out ${KEY}.key ${DES3} 1024 -+[ "$(id -u)" = 0 ] && chown asterisk: ${KEY}.key -+umask $oldumask - openssl rsa -in ${KEY}.key -pubout -out ${KEY}.pub - - if [ -f "${KEY}.key" ] && [ -f "${KEY}.pub" ]; then diff --git a/debian/patches/autoreconf-pjproject b/debian/patches/autoreconf-pjproject deleted file mode 100644 index 834fa92..0000000 --- a/debian/patches/autoreconf-pjproject +++ /dev/null @@ -1,22 +0,0 @@ -Description: Update autoconf files for pjproject - config.guess and config.sub for pjproject are six years old, this - makes the build FTBFS on newer architectures like ppc64el. - . - Unfortunately the sources are only unpacked during the toplevel - ./configure run, so we cannot solve this with dh_autoreconf -Author: Bernhard Schmidt -Last-Update: 2018-12-21 ---- a/third-party/pjproject/Makefile -+++ b/third-party/pjproject/Makefile -@@ -100,6 +100,11 @@ - @mv pjproject-$(PJPROJECT_VERSION) source - $(ECHO_PREFIX) Applying patches "$(realpath patches)" "$(realpath .)/source" - $(CMD_PREFIX) ../apply_patches $(QUIET_CONFIGURE) "$(realpath patches)" "$(realpath .)/source" -+ # Debian patch: Update autoconf files to support newer architectures -+ cd source && autoconf aconfigure.ac >aconfigure -+ cp /usr/share/misc/config.guess source/config.guess -+ cp /usr/share/misc/config.sub source/config.sub -+ # End Debian patch - -@touch source/.unpacked - - source/version.mak: source/.unpacked diff --git a/debian/patches/build-reproducibly b/debian/patches/build-reproducibly deleted file mode 100644 index 23e1f01..0000000 --- a/debian/patches/build-reproducibly +++ /dev/null @@ -1,28 +0,0 @@ ---- a/build_tools/make_build_h -+++ b/build_tools/make_build_h -@@ -5,6 +5,14 @@ - OS=`uname -s` - USER=`id | awk -F")" '{print $1}'| awk -F"(" '{print $2}' | sed 's/\\\\/\\\\\\\\/g'` - DATE=`date -u "+%Y-%m-%d %H:%M:%S"` -+if [ -n "${SOURCE_DATE_EPOCH}" ]; then -+ # building reproducibly, faking some data -+ HOSTNAME='buildd.debian.org' -+ KERNEL='unknown' -+ MACHINE='unknown' -+ USER='nobody' -+ DATE=`date -u "+%Y-%m-%d %H:%M:%S" -d @${SOURCE_DATE_EPOCH}` -+fi - cat << END - /* - * build.h ---- a/Makefile -+++ b/Makefile -@@ -465,7 +465,7 @@ - @echo "" >> $@ - @for x in $(MOD_SUBDIRS); do \ - printf "$$x " ; \ -- for i in `find $$x -name '*.c'`; do \ -+ for i in `find $$x -name '*.c' | LC_ALL=C sort`; do \ - $(AWK) -f build_tools/get_documentation $$i >> $@ ; \ - done ; \ - done diff --git a/debian/patches/enable_addons b/debian/patches/enable_addons deleted file mode 100644 index 09c4a17..0000000 --- a/debian/patches/enable_addons +++ /dev/null @@ -1,72 +0,0 @@ -Description: enable modules formly from asterisk-addons - The modules under addons/ are originally from the separate - asterisk-addons package. As of asterisk 1.8 they are included in the - main Asterisk distribution but not enabled by default. this patch - enables them, as it seems valid in Debian. - . - format_mp3.c is not enabled, yet, though: the complete source is not - included. See contrib/scripts/get_mp3_source.sh in the source tree. -Author: Tzafrir Cohen -Applied-Upsteam: no -Last-Update: 2016-03-19 - ---- a/addons/app_mysql.c -+++ b/addons/app_mysql.c -@@ -34,7 +34,6 @@ - - /*** MODULEINFO - mysqlclient -- no - deprecated - func_odbc - ***/ ---- a/addons/chan_mobile.c -+++ b/addons/chan_mobile.c -@@ -36,7 +36,6 @@ - - /*** MODULEINFO - bluetooth -- no - extended - ***/ - ---- a/addons/chan_ooh323.c -+++ b/addons/chan_ooh323.c -@@ -18,7 +18,6 @@ - - - /*** MODULEINFO -- no - extended - ***/ - ---- a/addons/res_config_mysql.c -+++ b/addons/res_config_mysql.c -@@ -24,7 +24,6 @@ - - /*** MODULEINFO - mysqlclient -- no - extended - ***/ - ---- a/addons/cdr_mysql.c -+++ b/addons/cdr_mysql.c -@@ -35,7 +35,6 @@ - - /*** MODULEINFO - mysqlclient -- no - deprecated - cdr_adaptive_odbc - ***/ ---- a/addons/format_mp3.c -+++ b/addons/format_mp3.c -@@ -28,7 +28,6 @@ - */ - - /*** MODULEINFO -- no - extended - ***/ - diff --git a/debian/patches/ffmpeg-detection.patch b/debian/patches/ffmpeg-detection.patch deleted file mode 100644 index a391707..0000000 --- a/debian/patches/ffmpeg-detection.patch +++ /dev/null @@ -1,42 +0,0 @@ -Description: Modernize autotools FFmpeg linking - FFmpeg is a _family_ of libraries sharing an optional base subdir. That - is not properly reflected in the autoconf detection logic, and makes it - impossible to handle alternate location - e.g. when using Libav. - . - This patch queries pkg-config, used with recent FFmpeg, for files - "libavcodec" and "libswscale", the family members currently used. -Author: Jonas Smedegaard -Bug-Debian: http://bugs.debian.org/531728 -Last-Update: 2016-04-02 - ---- a/configure.ac -+++ b/configure.ac -@@ -465,7 +465,7 @@ - AST_EXT_LIB_SETUP([CRYPTO], [OpenSSL Cryptography], [crypto]) - AST_EXT_LIB_SETUP_OPTIONAL([OPENSSL_SRTP], [OpenSSL SRTP Extension Support], [CRYPTO], [crypto]) - AST_EXT_LIB_SETUP([DAHDI], [DAHDI], [dahdi]) --AST_EXT_LIB_SETUP([FFMPEG], [Ffmpeg and avcodec], [avcodec]) -+AST_EXT_LIB_SETUP([FFMPEG], [FFmpeg (avcodec and swscale)], [ffmpeg]) - AST_EXT_LIB_SETUP([GSM], [External GSM], [gsm], [, use 'internal' GSM otherwise]) - AST_EXT_LIB_SETUP([ILBC], [System iLBC], [ilbc], [, use 'internal' iLBC otherwise]) - AST_EXT_LIB_SETUP([GTK2], [gtk2], [gtk2]) -@@ -2669,7 +2669,18 @@ - - AST_EXT_TOOL_CHECK([SDL], [sdl-config]) - AST_EXT_LIB_CHECK([SDL_IMAGE], [SDL_image], [IMG_Load], [SDL_image.h], [${SDL_LIB}], [${SDL_INCLUDE}]) --AST_EXT_LIB_CHECK([FFMPEG], [avcodec], [sws_getContext], [ffmpeg/avcodec.h], [${PTHREAD_LIBS} -lz -lm], [${PTHREAD_CFLAGS}]) -+ -+PBX_FFMPEG=0 -+AC_CHECK_TOOL(PKGCONFIG, pkg-config, No) -+if test ! "x${PKGCONFIG}" = xNo; then -+ FFMPEG_INCLUDE=$(${PKGCONFIG} libavcodec libswscale --cflags 2>/dev/null) -+ FFMPEG_LIB=$(${PKGCONFIG} libavcodec libswscale --libs) -+ PBX_FFMPEG=1 -+ AC_DEFINE([HAVE_FFMPEG], 1, [Define if your system has the FFmpeg libraries.]) -+fi -+AC_SUBST(PBX_FFMPEG) -+AC_SUBST(FFMPEG_INCLUDE) -+AC_SUBST(FFMPEG_LIB) - - # possible places for video4linux version 1 - AC_CHECK_HEADER([linux/videodev.h], diff --git a/debian/patches/ffmpeg-includes.patch b/debian/patches/ffmpeg-includes.patch deleted file mode 100644 index 020ed82..0000000 --- a/debian/patches/ffmpeg-includes.patch +++ /dev/null @@ -1,21 +0,0 @@ -Description: Include subdirs (not main dir) for FFmpeg paths - Fix include FFmpeg headers from below /usr/include/ffmpeg/ - (this change requires -I/usr/include/ffmpeg). -Author: Jonas Smedegaard -Bug-Debian: http://bugs.debian.org/531728 -Last-Update: 2016-03-21 - ---- a/channels/console_video.h -+++ b/channels/console_video.h -@@ -28,9 +28,9 @@ - "console {device}" - #else - --#include -+#include - #ifndef OLD_FFMPEG --#include /* requires a recent ffmpeg */ -+#include /* requires a recent ffmpeg */ - #endif - - #define CONSOLE_VIDEO_CMDS \ diff --git a/debian/patches/h323-extra-target b/debian/patches/h323-extra-target deleted file mode 100644 index 9d56fb6..0000000 --- a/debian/patches/h323-extra-target +++ /dev/null @@ -1,20 +0,0 @@ -Description: allow manually generating channels/h323/Makefile.ast - This patch is a work-around to that bug. It allows running - 'make h323-mak' from debian/rules to generate - channels/h323/Makefile.ast before running the main 'make' command. -Author: Tzafrir Cohen -Bug: https://issues.asterisk.org/view.php?id=17162 -Last-Update: 2016-03-19 - ---- a/Makefile -+++ b/Makefile -@@ -965,6 +965,9 @@ - asterisk.txt: - $(MAKE) -C doc/tex asterisk.txt - -+h323-mak: -+ $(MAKE) -C channels h323/Makefile.ast -+ - .PHONY: menuselect - .PHONY: main - .PHONY: sounds diff --git a/debian/patches/h323-no-deps-on-asterisk b/debian/patches/h323-no-deps-on-asterisk deleted file mode 100644 index 50fcb50..0000000 --- a/debian/patches/h323-no-deps-on-asterisk +++ /dev/null @@ -1,42 +0,0 @@ -Description: Avoid linking the asterisk binary with the H.323 libraries - Don't link the Asterisk binary with the H.323 libraries since they are - only used by separate shared object, chan_h323.so. - . - WARNING: this will make Asterisk segfault (see #435146) when loading - chan_h323.so because libopenh323 is buggy (#438815). - . - We are working around this, see patch - h323-workaround-openh323-segfault. -Author: Faidon Liambotis -Bug-Debian: https://bugs.debian.org/433884 -Forwarded: no -Last-Update: 2016-03-19 - ---- a/main/Makefile -+++ b/main/Makefile -@@ -153,13 +153,6 @@ - AST_EMBED_LIBS:=$(foreach dep,$(EMBED_LIBS),$(value $(dep))) - OBJS:=$(sort $(OBJS)) - --ifneq ($(wildcard ../channels/h323/Makefile.ast),) -- include ../channels/h323/Makefile.ast --else -- H323LDFLAGS= -- H323LDLIBS= --endif -- - ifneq ($(findstring $(OSARCH), mingw32 cygwin ),) - MAIN_TGT:=asterisk.dll - asterisk: cygload -@@ -177,11 +170,7 @@ - $(MAIN_TGT): $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) - @$(CC) -c -o buildinfo.o $(_ASTCFLAGS) buildinfo.c $(ASTCFLAGS) - $(ECHO_PREFIX) echo " [LD] $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) -> $@" --ifneq ($(findstring chan_h323,$(MENUSELECT_CHANNELS)),) - $(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(_ASTLDFLAGS) $(ASTLDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(GMIMELDFLAGS) --else -- $(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(_ASTLDFLAGS) $(ASTLDFLAGS) $(H323LDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(H323LDLIBS) $(GMIMELDFLAGS) --endif - - ifeq ($(GNU_LD),1) - $(MAIN_TGT): asterisk.exports diff --git a/debian/patches/h323-workaround-openh323-segfault b/debian/patches/h323-workaround-openh323-segfault deleted file mode 100644 index c09ab12..0000000 --- a/debian/patches/h323-workaround-openh323-segfault +++ /dev/null @@ -1,32 +0,0 @@ -Description: Hack dynamic loader to workaround libopenh323 bug - libopenh323 is buggy and crashes on dlclose() when the library was - opened with RTLD_LAZY (#438815). Hack around this by opening it with - RTLD_NOW by matching the module names (chan_h323.so and the external - chan_oh323.so) - . - This is a very crude hack needed because we are removing libopenh323 - dependencies from the asterisk binary. (h323-no-deps-on-asterisk) - Namely, it will have unexpected results if e.g. the user renames the - module for any reason. - . - Should be removed when #438815 closes. -Author: Faidon Liambotis -Bug-Debian: https://bugs.debian.org/435146 -Forwarded: no -Last-Update: 2016-03-19 - ---- a/main/loader.c -+++ b/main/loader.c -@@ -382,6 +382,12 @@ - if (missing_so) - strcat(resource_being_loaded->resource, ".so"); - -+ /* libopenh323 is buggy and segfaults on dlclose() when opened with -+ * RTLD_LAZY. Workaround this until it gets fixed */ -+ if (!strcasecmp(resource_being_loaded->resource, "chan_h323.so") || -+ !strcasecmp(resource_being_loaded->resource, "chan_oh323.so")) -+ lib = dlopen(fn, RTLD_NOW | RTLD_LOCAL); -+ - if (!(lib = dlopen(fn, RTLD_LAZY | RTLD_LOCAL))) { - ast_log(LOG_WARNING, "Error loading module '%s': %s\n", resource_in, dlerror()); - ast_free(resource_being_loaded); diff --git a/debian/patches/hack-multiple-app-voicemail b/debian/patches/hack-multiple-app-voicemail deleted file mode 100644 index c3ff97e..0000000 --- a/debian/patches/hack-multiple-app-voicemail +++ /dev/null @@ -1,64 +0,0 @@ -Description: build multiple versions of app_voicemail.so - This is a very ugly hack on upstream's Makefiles to allow building - multiple variants of app_voicemail. Three variants are created: - * app_voicemail.so: plain old filesystem storage that doesn't break - existing setups - * app_voicemail_imapstorage.so: IMAP storage - * app_voicemail_odbcstorage.so: ODBC storage - All these conflict with each other and Asterisk will refuse to load - them concurrently. They are thus included in three separate and - complicting packages. - . - Patch suggested to upstream but rejected for being "hackish". Though - upstream RPM packages include packages that are only somewhat cleaner. -Author: Faidon Liambotis -Bug: http://issues.asterisk.org/view.php?id=13822 -Last-Update: 2016-03-19 - ---- a/apps/Makefile -+++ b/apps/Makefile -@@ -15,6 +15,8 @@ - MENUSELECT_CATEGORY=APPS - MENUSELECT_DESCRIPTION=Applications - -+MODS_C_ADDITIONAL=app_voicemail_imapstorage app_voicemail_odbcstorage -+ - MENUSELECT_OPTS_app_directory:=$(MENUSELECT_OPTS_app_voicemail) - ifneq ($(findstring ODBC_STORAGE,$(MENUSELECT_OPTS_app_voicemail)),) - MENUSELECT_DEPENDS_app_voicemail+=$(MENUSELECT_DEPENDS_ODBC_STORAGE) -@@ -25,6 +27,24 @@ - - all: _all - -+add_depends_cmd = sed -i -e '/^\/\*\*\* MODULEINFO/a\\t$(1)<\/depend>' -+app_voicemail_imapstorage.c: app_voicemail.c -+ cp $< $@ -+ $(call add_depends_cmd,imap_tk) $@ -+ $(call add_depends_cmd,openssl) $@ -+ cp app_voicemail.exports.in app_voicemail_imapstorage.exports.in -+app_voicemail_odbcstorage.c: app_voicemail.c -+ cp $< $@ -+ $(call add_depends_cmd,unixodbc) $@ -+ cp app_voicemail.exports.in app_voicemail_odbcstorage.exports.in -+ -+dist-clean:: -+ rm -f app_voicemail_*.c -+ rm -f app_voicemail_*.exports.in -+ -+app_voicemail_imapstorage.o: _ASTCFLAGS+=-DIMAP_STORAGE -+app_voicemail_odbcstorage.o: _ASTCFLAGS+=-DODBC_STORAGE -+ - include $(ASTTOPDIR)/Makefile.moddir_rules - - $(call MOD_ADD_C,app_confbridge,$(wildcard confbridge/*.c)) ---- a/Makefile.moddir_rules -+++ b/Makefile.moddir_rules -@@ -29,7 +29,7 @@ - # Use MODULE_EXCLUDE to specify additional modules to exclude. - - ifneq ($(MODULE_PREFIX),) -- ALL_C_MODS:= -+ ALL_C_MODS:=$(MODS_C_ADDITIONAL) - ALL_CC_MODS:= - ALL_C_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.c,%,$(wildcard $(p)_*.c))) - ALL_CC_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.cc,%,$(wildcard $(p)_*.cc))) diff --git a/debian/patches/ilbc_disable b/debian/patches/ilbc_disable deleted file mode 100644 index 356caf4..0000000 --- a/debian/patches/ilbc_disable +++ /dev/null @@ -1,34 +0,0 @@ -Description: disable building codec_ilbc - As we have to strip the ilbc code from asterisk, we need to disable - building codec_ilbc and cleaning the ilbc/ directory. - . - Patch needs to be cleaned-up to be uploaded upstream. - . - FIXME: module now seems to potentially use libilbc. If it can be - packaged into Debian, no reason to remove it. -Author: Tzafrir Cohen -Bug-Debian: https://bugs.debian.org/665938 -Bug-Debian: https://bugs.debian.org/665937 -Forwarded-Upstream: no -Last-Update: 2016-03-19 - ---- a/codecs/codec_ilbc.c -+++ b/codecs/codec_ilbc.c -@@ -27,6 +27,7 @@ - - /*** MODULEINFO - ilbc -+ no - core - ***/ - ---- a/codecs/Makefile -+++ b/codecs/Makefile -@@ -27,7 +27,6 @@ - - SUB_DIRS := \ - $(SUB_GSM) \ -- $(SUB_ILBC) \ - $(SUB_LPC10) \ - - all: _all diff --git a/debian/patches/make-clean-fixes b/debian/patches/make-clean-fixes deleted file mode 100644 index 4bbcc2f..0000000 --- a/debian/patches/make-clean-fixes +++ /dev/null @@ -1,34 +0,0 @@ -Description: Don't remove sounds on dist-clean - Upstream build system may optionally download some extra sound files. - Thus those sound files are deleted on dist-clean. The tarballs include - some soundfiles tarballs by default. Thus the normal procedure of - running 'make dist-clean' before building the package would delete - them. - . - Not used ATM as we ship a tarball with the sound files stripped out. - May be re-used in the future. -Author: Faidon Liambotis -Forwarded: not-needed -Last-Update: 2016-03-19 - ---- a/Makefile -+++ b/Makefile -@@ -442,7 +442,6 @@ - - distclean: $(SUBDIRS_DIST_CLEAN) _clean - @$(MAKE) -C menuselect dist-clean -- @$(MAKE) -C sounds dist-clean - rm -f menuselect.makeopts makeopts menuselect-tree menuselect.makedeps - rm -f makeopts.embed_rules - rm -f config.log config.status config.cache -@@ -452,6 +451,10 @@ - rm -rf doc/api - rm -f build_tools/menuselect-deps - -+# tarballs distributed by Digium include sounds -+all-clean: distclean -+ @$(MAKE) -C sounds dist-clean -+ - datafiles: _all doc/core-en_US.xml - CFLAGS="$(_ASTCFLAGS) $(ASTCFLAGS)" build_tools/mkpkgconfig "$(DESTDIR)$(libdir)/pkgconfig"; - # Should static HTTP be installed during make samples or even with its own target ala diff --git a/debian/patches/mpglib b/debian/patches/mpglib deleted file mode 100644 index b881377..0000000 --- a/debian/patches/mpglib +++ /dev/null @@ -1,4066 +0,0 @@ -Description: mpglib code originally in asterisk-addons - The package asterisk-addons originally included mpglib. After the merge - with asterisk, that code is no longer included and needs to be fetched - (contrib/scripts/get_mpg_source.sh). This patch includes that fetched - source (rev. 202). - . - TODO: get rid of this code and use libmpg123 or whatever. -Origin: http://svn.digium.com/svn/thirdparty/mp3/trunk -Last-Update: 2018-11-17 - ---- /dev/null -+++ b/addons/mp3/common.c -@@ -0,0 +1,267 @@ -+#include "asterisk.h" -+#include "asterisk/logger.h" -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "mpg123.h" -+#include "mpglib.h" -+ -+struct parameter param = { 1 , 1 , 0 , 0 }; -+ -+int tabsel_123[2][3][16] = { -+ { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, -+ {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, -+ {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, -+ -+ { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, -+ {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, -+ {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } -+}; -+ -+long freqs[9] = { 44100, 48000, 32000, -+ 22050, 24000, 16000 , -+ 11025 , 12000 , 8000 }; -+ -+ -+#if 0 -+static void get_II_stuff(struct frame *fr) -+{ -+ static int translate[3][2][16] = -+ { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } , -+ { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } , -+ { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } , -+ { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } , -+ { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } , -+ { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } }; -+ -+ int table,sblim; -+ static struct al_table *tables[5] = -+ { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 }; -+ static int sblims[5] = { 27 , 30 , 8, 12 , 30 }; -+ -+ if(fr->lsf) -+ table = 4; -+ else -+ table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index]; -+ sblim = sblims[table]; -+ -+ fr->alloc = tables[table]; -+ fr->II_sblimit = sblim; -+} -+#endif -+ -+#define HDRCMPMASK 0xfffffd00 -+ -+#if 0 -+int head_check(unsigned long head) -+{ -+ if( (head & 0xffe00000) != 0xffe00000) -+ return FALSE; -+ if(!((head>>17)&3)) -+ return FALSE; -+ if( ((head>>12)&0xf) == 0xf) -+ return FALSE; -+ if( ((head>>10)&0x3) == 0x3 ) -+ return FALSE; -+ return TRUE; -+} -+#endif -+ -+ -+/* -+ * the code a header and write the information -+ * into the frame structure -+ */ -+int decode_header(struct frame *fr,unsigned long newhead) -+{ -+ if( newhead & (1<<20) ) { -+ fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1; -+ fr->mpeg25 = 0; -+ } -+ else { -+ fr->lsf = 1; -+ fr->mpeg25 = 1; -+ } -+ -+ fr->lay = 4-((newhead>>17)&3); -+ if( ((newhead>>10)&0x3) == 0x3) { -+ ast_log(LOG_WARNING,"Stream error\n"); -+ return (0); -+ } -+ if(fr->mpeg25) { -+ fr->sampling_frequency = 6 + ((newhead>>10)&0x3); -+ } -+ else -+ fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); -+ fr->error_protection = ((newhead>>16)&0x1)^0x1; -+ -+ if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */ -+ fr->bitrate_index = ((newhead>>12)&0xf); -+ -+ fr->bitrate_index = ((newhead>>12)&0xf); -+ fr->padding = ((newhead>>9)&0x1); -+ fr->extension = ((newhead>>8)&0x1); -+ fr->mode = ((newhead>>6)&0x3); -+ fr->mode_ext = ((newhead>>4)&0x3); -+ fr->copyright = ((newhead>>3)&0x1); -+ fr->original = ((newhead>>2)&0x1); -+ fr->emphasis = newhead & 0x3; -+ -+ fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; -+ -+ if(!fr->bitrate_index) -+ { -+ ast_log(LOG_WARNING,"Free format not supported.\n"); -+ return (0); -+ } -+ -+ switch(fr->lay) -+ { -+ case 1: -+#if 0 -+ fr->do_layer = do_layer1; -+ fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? -+ (fr->mode_ext<<2)+4 : 32; -+ fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; -+ fr->framesize /= freqs[fr->sampling_frequency]; -+ fr->framesize = ((fr->framesize+fr->padding)<<2)-4; -+#else -+ ast_log(LOG_WARNING,"Layer 1 not supported!\n"); -+#endif -+ break; -+ case 2: -+#if 0 -+ fr->do_layer = do_layer2; -+ get_II_stuff(fr); -+ fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? -+ (fr->mode_ext<<2)+4 : fr->II_sblimit; -+ fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; -+ fr->framesize /= freqs[fr->sampling_frequency]; -+ fr->framesize += fr->padding - 4; -+#else -+ ast_log(LOG_WARNING,"Layer 2 not supported!\n"); -+#endif -+ break; -+ case 3: -+#if 0 -+ fr->do_layer = do_layer3; -+ if(fr->lsf) -+ ssize = (fr->stereo == 1) ? 9 : 17; -+ else -+ ssize = (fr->stereo == 1) ? 17 : 32; -+#endif -+ -+#if 0 -+ if(fr->error_protection) -+ ssize += 2; -+#endif -+ fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; -+ fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf); -+ fr->framesize = fr->framesize + fr->padding - 4; -+ break; -+ default: -+ ast_log(LOG_WARNING,"Sorry, unknown layer type.\n"); -+ return (0); -+ } -+ return 1; -+} -+ -+#if 0 -+void print_header(struct frame *fr) -+{ -+ static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; -+ static char *layers[4] = { "Unknown" , "I", "II", "III" }; -+ -+ ast_log(LOG_WARNING,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", -+ fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), -+ layers[fr->lay],freqs[fr->sampling_frequency], -+ modes[fr->mode],fr->mode_ext,fr->framesize+4); -+ ast_log(LOG_WARNING,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n", -+ fr->stereo,fr->copyright?"Yes":"No", -+ fr->original?"Yes":"No",fr->error_protection?"Yes":"No", -+ fr->emphasis); -+ ast_log(LOG_WARNING,"Bitrate: %d Kbits/s, Extension value: %d\n", -+ tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension); -+} -+ -+void print_header_compact(struct frame *fr) -+{ -+ static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" }; -+ static char *layers[4] = { "Unknown" , "I", "II", "III" }; -+ -+ ast_log(LOG_WARNING,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n", -+ fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), -+ layers[fr->lay], -+ tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index], -+ freqs[fr->sampling_frequency], modes[fr->mode]); -+} -+ -+#endif -+ -+unsigned int getbits(struct mpstr *mp, int number_of_bits) -+{ -+ unsigned long rval; -+ -+ if(!number_of_bits) -+ return 0; -+ -+ { -+ rval = (mp->worksample).wordpointer[0]; -+ rval <<= 8; -+ rval |= (mp->worksample).wordpointer[1]; -+ rval <<= 8; -+ rval |= (mp->worksample).wordpointer[2]; -+ rval <<= (mp->worksample).bitindex; -+ rval &= 0xffffff; -+ -+ (mp->worksample).bitindex += number_of_bits; -+ -+ rval >>= (24-number_of_bits); -+ -+ (mp->worksample).wordpointer += ((mp->worksample).bitindex>>3); -+ (mp->worksample).bitindex &= 7; -+ } -+ return rval; -+} -+ -+unsigned int getbits_fast(struct mpstr *mp, int number_of_bits) -+{ -+ unsigned long rval; -+ -+ { -+ rval = (mp->worksample).wordpointer[0]; -+ rval <<= 8; -+ rval |= (mp->worksample).wordpointer[1]; -+ rval <<= (mp->worksample).bitindex; -+ rval &= 0xffff; -+ (mp->worksample).bitindex += number_of_bits; -+ -+ rval >>= (16-number_of_bits); -+ -+ (mp->worksample).wordpointer += ((mp->worksample).bitindex>>3); -+ (mp->worksample).bitindex &= 7; -+ } -+ return rval; -+} -+ -+unsigned int get1bit(struct mpstr *mp) -+{ -+ unsigned char rval; -+ -+ rval = *((mp->worksample).wordpointer) << (mp->worksample).bitindex; -+ -+ (mp->worksample).bitindex++; -+ (mp->worksample).wordpointer += ((mp->worksample).bitindex>>3); -+ (mp->worksample).bitindex &= 7; -+ -+ return rval>>7; -+} -+ -+ -+ ---- /dev/null -+++ b/addons/mp3/dct64_i386.c -@@ -0,0 +1,335 @@ -+ -+/* -+ * Discrete Cosine Tansform (DCT) for subband synthesis -+ * optimized for machines with no auto-increment. -+ * The performance is highly compiler dependend. Maybe -+ * the dct64.c version for 'normal' processor may be faster -+ * even for Intel processors. -+ */ -+ -+#include "mpg123.h" -+ -+/* -+ * the call via dct64 is a trick to force GCC to use -+ * (new) registers for the b1,b2 pointer to the bufs[xx] field -+ */ -+void dct64(real *a,real *b,real *c); -+ -+static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples) -+{ -+ { -+ register real *costab = pnts[0]; -+ -+ b1[0x00] = samples[0x00] + samples[0x1F]; -+ b1[0x01] = samples[0x01] + samples[0x1E]; -+ b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; -+ b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; -+ -+ b1[0x02] = samples[0x02] + samples[0x1D]; -+ b1[0x03] = samples[0x03] + samples[0x1C]; -+ b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; -+ b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; -+ -+ b1[0x04] = samples[0x04] + samples[0x1B]; -+ b1[0x05] = samples[0x05] + samples[0x1A]; -+ b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; -+ b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; -+ -+ b1[0x06] = samples[0x06] + samples[0x19]; -+ b1[0x07] = samples[0x07] + samples[0x18]; -+ b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; -+ b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; -+ -+ b1[0x08] = samples[0x08] + samples[0x17]; -+ b1[0x09] = samples[0x09] + samples[0x16]; -+ b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; -+ b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; -+ -+ b1[0x0A] = samples[0x0A] + samples[0x15]; -+ b1[0x0B] = samples[0x0B] + samples[0x14]; -+ b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; -+ b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; -+ -+ b1[0x0C] = samples[0x0C] + samples[0x13]; -+ b1[0x0D] = samples[0x0D] + samples[0x12]; -+ b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; -+ b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; -+ -+ b1[0x0E] = samples[0x0E] + samples[0x11]; -+ b1[0x0F] = samples[0x0F] + samples[0x10]; -+ b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; -+ b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; -+ -+ } -+ -+ -+ { -+ register real *costab = pnts[1]; -+ -+ b2[0x00] = b1[0x00] + b1[0x0F]; -+ b2[0x01] = b1[0x01] + b1[0x0E]; -+ b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; -+ b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; -+ -+ b2[0x02] = b1[0x02] + b1[0x0D]; -+ b2[0x03] = b1[0x03] + b1[0x0C]; -+ b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; -+ b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; -+ -+ b2[0x04] = b1[0x04] + b1[0x0B]; -+ b2[0x05] = b1[0x05] + b1[0x0A]; -+ b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; -+ b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; -+ -+ b2[0x06] = b1[0x06] + b1[0x09]; -+ b2[0x07] = b1[0x07] + b1[0x08]; -+ b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; -+ b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; -+ -+ /* */ -+ -+ b2[0x10] = b1[0x10] + b1[0x1F]; -+ b2[0x11] = b1[0x11] + b1[0x1E]; -+ b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; -+ b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; -+ -+ b2[0x12] = b1[0x12] + b1[0x1D]; -+ b2[0x13] = b1[0x13] + b1[0x1C]; -+ b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; -+ b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; -+ -+ b2[0x14] = b1[0x14] + b1[0x1B]; -+ b2[0x15] = b1[0x15] + b1[0x1A]; -+ b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; -+ b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; -+ -+ b2[0x16] = b1[0x16] + b1[0x19]; -+ b2[0x17] = b1[0x17] + b1[0x18]; -+ b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; -+ b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; -+ } -+ -+ { -+ register real *costab = pnts[2]; -+ -+ b1[0x00] = b2[0x00] + b2[0x07]; -+ b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; -+ b1[0x01] = b2[0x01] + b2[0x06]; -+ b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; -+ b1[0x02] = b2[0x02] + b2[0x05]; -+ b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; -+ b1[0x03] = b2[0x03] + b2[0x04]; -+ b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; -+ -+ b1[0x08] = b2[0x08] + b2[0x0F]; -+ b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; -+ b1[0x09] = b2[0x09] + b2[0x0E]; -+ b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; -+ b1[0x0A] = b2[0x0A] + b2[0x0D]; -+ b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; -+ b1[0x0B] = b2[0x0B] + b2[0x0C]; -+ b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; -+ -+ b1[0x10] = b2[0x10] + b2[0x17]; -+ b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; -+ b1[0x11] = b2[0x11] + b2[0x16]; -+ b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; -+ b1[0x12] = b2[0x12] + b2[0x15]; -+ b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; -+ b1[0x13] = b2[0x13] + b2[0x14]; -+ b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; -+ -+ b1[0x18] = b2[0x18] + b2[0x1F]; -+ b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; -+ b1[0x19] = b2[0x19] + b2[0x1E]; -+ b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; -+ b1[0x1A] = b2[0x1A] + b2[0x1D]; -+ b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; -+ b1[0x1B] = b2[0x1B] + b2[0x1C]; -+ b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; -+ } -+ -+ { -+ register real const cos0 = pnts[3][0]; -+ register real const cos1 = pnts[3][1]; -+ -+ b2[0x00] = b1[0x00] + b1[0x03]; -+ b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; -+ b2[0x01] = b1[0x01] + b1[0x02]; -+ b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; -+ -+ b2[0x04] = b1[0x04] + b1[0x07]; -+ b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; -+ b2[0x05] = b1[0x05] + b1[0x06]; -+ b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; -+ -+ b2[0x08] = b1[0x08] + b1[0x0B]; -+ b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; -+ b2[0x09] = b1[0x09] + b1[0x0A]; -+ b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; -+ -+ b2[0x0C] = b1[0x0C] + b1[0x0F]; -+ b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; -+ b2[0x0D] = b1[0x0D] + b1[0x0E]; -+ b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; -+ -+ b2[0x10] = b1[0x10] + b1[0x13]; -+ b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; -+ b2[0x11] = b1[0x11] + b1[0x12]; -+ b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; -+ -+ b2[0x14] = b1[0x14] + b1[0x17]; -+ b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; -+ b2[0x15] = b1[0x15] + b1[0x16]; -+ b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; -+ -+ b2[0x18] = b1[0x18] + b1[0x1B]; -+ b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; -+ b2[0x19] = b1[0x19] + b1[0x1A]; -+ b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; -+ -+ b2[0x1C] = b1[0x1C] + b1[0x1F]; -+ b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; -+ b2[0x1D] = b1[0x1D] + b1[0x1E]; -+ b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; -+ } -+ -+ { -+ register real const cos0 = pnts[4][0]; -+ -+ b1[0x00] = b2[0x00] + b2[0x01]; -+ b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; -+ b1[0x02] = b2[0x02] + b2[0x03]; -+ b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; -+ b1[0x02] += b1[0x03]; -+ -+ b1[0x04] = b2[0x04] + b2[0x05]; -+ b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; -+ b1[0x06] = b2[0x06] + b2[0x07]; -+ b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; -+ b1[0x06] += b1[0x07]; -+ b1[0x04] += b1[0x06]; -+ b1[0x06] += b1[0x05]; -+ b1[0x05] += b1[0x07]; -+ -+ b1[0x08] = b2[0x08] + b2[0x09]; -+ b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; -+ b1[0x0A] = b2[0x0A] + b2[0x0B]; -+ b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; -+ b1[0x0A] += b1[0x0B]; -+ -+ b1[0x0C] = b2[0x0C] + b2[0x0D]; -+ b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; -+ b1[0x0E] = b2[0x0E] + b2[0x0F]; -+ b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; -+ b1[0x0E] += b1[0x0F]; -+ b1[0x0C] += b1[0x0E]; -+ b1[0x0E] += b1[0x0D]; -+ b1[0x0D] += b1[0x0F]; -+ -+ b1[0x10] = b2[0x10] + b2[0x11]; -+ b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; -+ b1[0x12] = b2[0x12] + b2[0x13]; -+ b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; -+ b1[0x12] += b1[0x13]; -+ -+ b1[0x14] = b2[0x14] + b2[0x15]; -+ b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; -+ b1[0x16] = b2[0x16] + b2[0x17]; -+ b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; -+ b1[0x16] += b1[0x17]; -+ b1[0x14] += b1[0x16]; -+ b1[0x16] += b1[0x15]; -+ b1[0x15] += b1[0x17]; -+ -+ b1[0x18] = b2[0x18] + b2[0x19]; -+ b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; -+ b1[0x1A] = b2[0x1A] + b2[0x1B]; -+ b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; -+ b1[0x1A] += b1[0x1B]; -+ -+ b1[0x1C] = b2[0x1C] + b2[0x1D]; -+ b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; -+ b1[0x1E] = b2[0x1E] + b2[0x1F]; -+ b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; -+ b1[0x1E] += b1[0x1F]; -+ b1[0x1C] += b1[0x1E]; -+ b1[0x1E] += b1[0x1D]; -+ b1[0x1D] += b1[0x1F]; -+ } -+ -+ out0[0x10*16] = b1[0x00]; -+ out0[0x10*12] = b1[0x04]; -+ out0[0x10* 8] = b1[0x02]; -+ out0[0x10* 4] = b1[0x06]; -+ out0[0x10* 0] = b1[0x01]; -+ out1[0x10* 0] = b1[0x01]; -+ out1[0x10* 4] = b1[0x05]; -+ out1[0x10* 8] = b1[0x03]; -+ out1[0x10*12] = b1[0x07]; -+ -+#if 1 -+ out0[0x10*14] = b1[0x08] + b1[0x0C]; -+ out0[0x10*10] = b1[0x0C] + b1[0x0a]; -+ out0[0x10* 6] = b1[0x0A] + b1[0x0E]; -+ out0[0x10* 2] = b1[0x0E] + b1[0x09]; -+ out1[0x10* 2] = b1[0x09] + b1[0x0D]; -+ out1[0x10* 6] = b1[0x0D] + b1[0x0B]; -+ out1[0x10*10] = b1[0x0B] + b1[0x0F]; -+ out1[0x10*14] = b1[0x0F]; -+#else -+ b1[0x08] += b1[0x0C]; -+ out0[0x10*14] = b1[0x08]; -+ b1[0x0C] += b1[0x0a]; -+ out0[0x10*10] = b1[0x0C]; -+ b1[0x0A] += b1[0x0E]; -+ out0[0x10* 6] = b1[0x0A]; -+ b1[0x0E] += b1[0x09]; -+ out0[0x10* 2] = b1[0x0E]; -+ b1[0x09] += b1[0x0D]; -+ out1[0x10* 2] = b1[0x09]; -+ b1[0x0D] += b1[0x0B]; -+ out1[0x10* 6] = b1[0x0D]; -+ b1[0x0B] += b1[0x0F]; -+ out1[0x10*10] = b1[0x0B]; -+ out1[0x10*14] = b1[0x0F]; -+#endif -+ -+ { -+ real tmp; -+ tmp = b1[0x18] + b1[0x1C]; -+ out0[0x10*15] = tmp + b1[0x10]; -+ out0[0x10*13] = tmp + b1[0x14]; -+ tmp = b1[0x1C] + b1[0x1A]; -+ out0[0x10*11] = tmp + b1[0x14]; -+ out0[0x10* 9] = tmp + b1[0x12]; -+ tmp = b1[0x1A] + b1[0x1E]; -+ out0[0x10* 7] = tmp + b1[0x12]; -+ out0[0x10* 5] = tmp + b1[0x16]; -+ tmp = b1[0x1E] + b1[0x19]; -+ out0[0x10* 3] = tmp + b1[0x16]; -+ out0[0x10* 1] = tmp + b1[0x11]; -+ tmp = b1[0x19] + b1[0x1D]; -+ out1[0x10* 1] = tmp + b1[0x11]; -+ out1[0x10* 3] = tmp + b1[0x15]; -+ tmp = b1[0x1D] + b1[0x1B]; -+ out1[0x10* 5] = tmp + b1[0x15]; -+ out1[0x10* 7] = tmp + b1[0x13]; -+ tmp = b1[0x1B] + b1[0x1F]; -+ out1[0x10* 9] = tmp + b1[0x13]; -+ out1[0x10*11] = tmp + b1[0x17]; -+ out1[0x10*13] = b1[0x17] + b1[0x1F]; -+ out1[0x10*15] = b1[0x1F]; -+ } -+} -+ -+/* -+ * the call via dct64 is a trick to force GCC to use -+ * (new) registers for the b1,b2 pointer to the bufs[xx] field -+ */ -+void dct64(real *a,real *b,real *c) -+{ -+ real bufs[0x40]; -+ dct64_1(a,b,bufs,bufs+0x20,c); -+} -+ ---- /dev/null -+++ b/addons/mp3/decode_i386.c -@@ -0,0 +1,153 @@ -+/* -+ * Mpeg Layer-1,2,3 audio decoder -+ * ------------------------------ -+ * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. -+ * See also 'README' -+ * -+ * slighlty optimized for machines without autoincrement/decrement. -+ * The performance is highly compiler dependend. Maybe -+ * the decode.c version for 'normal' processor may be faster -+ * even for Intel processors. -+ */ -+ -+#include -+#include -+#include -+ -+ -+#include "mpglib.h" -+ -+ -+ -+ /* old WRITE_SAMPLE */ -+#define WRITE_SAMPLE(samples,sum,clip) \ -+ if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ -+ else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ -+ else { *(samples) = sum; } -+ -+int synth_1to1_mono(struct mpstr *mp,real *bandPtr,unsigned char *samples,int *pnt) -+{ -+ short samples_tmp[64]; -+ short *tmp1 = samples_tmp; -+ int i,ret; -+ int pnt1 = 0; -+ -+ ret = synth_1to1(mp,bandPtr,0,(unsigned char *) samples_tmp,&pnt1); -+ samples += *pnt; -+ -+ for(i=0;i<32;i++) { -+ *( (short *) samples) = *tmp1; -+ samples += 2; -+ tmp1 += 2; -+ } -+ *pnt += 64; -+ -+ return ret; -+} -+ -+ -+int synth_1to1(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt) -+{ -+ static const int step = 2; -+ int bo; -+ short *samples = (short *) (out + *pnt); -+ -+ real *b0,(*buf)[0x110]; -+ int clip = 0; -+ int bo1; -+ -+ bo = mp->synth_bo; -+ -+ if(!channel) { -+ bo--; -+ bo &= 0xf; -+ buf = mp->synth_buffs[0]; -+ } -+ else { -+ samples++; -+ buf = mp->synth_buffs[1]; -+ } -+ -+ if(bo & 0x1) { -+ b0 = buf[0]; -+ bo1 = bo; -+ dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); -+ } -+ else { -+ b0 = buf[1]; -+ bo1 = bo+1; -+ dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); -+ } -+ -+ mp->synth_bo = bo; -+ -+ { -+ register int j; -+ real *window = decwin + 16 - bo1; -+ -+ for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step) -+ { -+ real sum; -+ sum = window[0x0] * b0[0x0]; -+ sum -= window[0x1] * b0[0x1]; -+ sum += window[0x2] * b0[0x2]; -+ sum -= window[0x3] * b0[0x3]; -+ sum += window[0x4] * b0[0x4]; -+ sum -= window[0x5] * b0[0x5]; -+ sum += window[0x6] * b0[0x6]; -+ sum -= window[0x7] * b0[0x7]; -+ sum += window[0x8] * b0[0x8]; -+ sum -= window[0x9] * b0[0x9]; -+ sum += window[0xA] * b0[0xA]; -+ sum -= window[0xB] * b0[0xB]; -+ sum += window[0xC] * b0[0xC]; -+ sum -= window[0xD] * b0[0xD]; -+ sum += window[0xE] * b0[0xE]; -+ sum -= window[0xF] * b0[0xF]; -+ -+ WRITE_SAMPLE(samples,sum,clip); -+ } -+ -+ { -+ real sum; -+ sum = window[0x0] * b0[0x0]; -+ sum += window[0x2] * b0[0x2]; -+ sum += window[0x4] * b0[0x4]; -+ sum += window[0x6] * b0[0x6]; -+ sum += window[0x8] * b0[0x8]; -+ sum += window[0xA] * b0[0xA]; -+ sum += window[0xC] * b0[0xC]; -+ sum += window[0xE] * b0[0xE]; -+ WRITE_SAMPLE(samples,sum,clip); -+ b0-=0x10,window-=0x20,samples+=step; -+ } -+ window += bo1<<1; -+ -+ for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step) -+ { -+ real sum; -+ sum = -window[-0x1] * b0[0x0]; -+ sum -= window[-0x2] * b0[0x1]; -+ sum -= window[-0x3] * b0[0x2]; -+ sum -= window[-0x4] * b0[0x3]; -+ sum -= window[-0x5] * b0[0x4]; -+ sum -= window[-0x6] * b0[0x5]; -+ sum -= window[-0x7] * b0[0x6]; -+ sum -= window[-0x8] * b0[0x7]; -+ sum -= window[-0x9] * b0[0x8]; -+ sum -= window[-0xA] * b0[0x9]; -+ sum -= window[-0xB] * b0[0xA]; -+ sum -= window[-0xC] * b0[0xB]; -+ sum -= window[-0xD] * b0[0xC]; -+ sum -= window[-0xE] * b0[0xD]; -+ sum -= window[-0xF] * b0[0xE]; -+ sum -= window[-0x0] * b0[0xF]; -+ -+ WRITE_SAMPLE(samples,sum,clip); -+ } -+ } -+ *pnt += 128; -+ -+ return clip; -+} -+ ---- /dev/null -+++ b/addons/mp3/decode_ntom.c -@@ -0,0 +1,219 @@ -+/* -+ * Mpeg Layer-1,2,3 audio decoder -+ * ------------------------------ -+ * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. -+ * See also 'README' -+ * -+ * N->M down/up sampling. Not optimized for speed. -+ */ -+ -+#include "asterisk.h" -+#include "asterisk/logger.h" -+#include -+#include -+#include -+ -+#include "mpg123.h" -+#include "mpglib.h" -+ -+#define WRITE_SAMPLE(samples,sum,clip) \ -+ if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ -+ else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ -+ else { *(samples) = sum; } -+ -+#define NTOM_MUL (32768) -+static unsigned long ntom_val[2] = { NTOM_MUL>>1,NTOM_MUL>>1 }; -+static unsigned long ntom_step = NTOM_MUL; -+ -+ -+int synth_ntom_set_step(long m,long n) -+{ -+ if(param.verbose > 1) -+ ast_log(LOG_WARNING,"Init rate converter: %ld->%ld\n",m,n); -+ -+ if(n >= 96000 || m >= 96000 || m == 0 || n == 0) { -+ ast_log(LOG_WARNING,"NtoM converter: illegal rates\n"); -+ return (1); -+ } -+ -+ n *= NTOM_MUL; -+ ntom_step = n / m; -+ -+ if(ntom_step > 8*NTOM_MUL) { -+ ast_log(LOG_WARNING,"max. 1:8 conversion allowed!\n"); -+ return (1); -+ } -+ -+ ntom_val[0] = ntom_val[1] = NTOM_MUL>>1; -+ -+ return (0); -+ -+} -+ -+ -+int synth_ntom_mono (struct mpstr *mp, real *bandPtr,unsigned char *samples,int *pnt) -+{ -+ short samples_tmp[8*64]; -+ short *tmp1 = samples_tmp; -+ int i,ret; -+ int pnt1 = 0; -+ -+ ret = synth_ntom(mp, bandPtr,0,(unsigned char *) samples_tmp,&pnt1); -+ samples += *pnt; -+ -+ for(i=0;i<(pnt1>>2);i++) { -+ *( (short *)samples) = *tmp1; -+ samples += 2; -+ tmp1 += 2; -+ } -+ *pnt += pnt1 >> 1; -+ -+ return ret; -+} -+ -+ -+ -+int synth_ntom(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt) -+{ -+ static const int step = 2; -+ int bo; -+ short *samples = (short *) (out + *pnt); -+ -+ real *b0,(*buf)[0x110]; -+ int clip = 0; -+ int bo1; -+ int ntom; -+ -+ bo = mp->synth_bo; -+ -+ if(!channel) { -+ bo--; -+ bo &= 0xf; -+ buf = mp->synth_buffs[0]; -+ ntom = ntom_val[1] = ntom_val[0]; -+ } -+ else { -+ samples++; -+ out += 2; /* to compute the right *pnt value */ -+ buf = mp->synth_buffs[1]; -+ ntom = ntom_val[1]; -+ } -+ -+ if(bo & 0x1) { -+ b0 = buf[0]; -+ bo1 = bo; -+ dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); -+ } -+ else { -+ b0 = buf[1]; -+ bo1 = bo+1; -+ dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); -+ } -+ -+ mp->synth_bo = bo; -+ -+ { -+ register int j; -+ real *window = (mp->decwin) + 16 - bo1; -+ -+ for (j=16;j;j--,window+=0x10) -+ { -+ real sum; -+ -+ ntom += ntom_step; -+ if(ntom < NTOM_MUL) { -+ window += 16; -+ b0 += 16; -+ continue; -+ } -+ -+ sum = *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ sum += *window++ * *b0++; -+ sum -= *window++ * *b0++; -+ -+ while(ntom >= NTOM_MUL) { -+ WRITE_SAMPLE(samples,sum,clip); -+ samples += step; -+ ntom -= NTOM_MUL; -+ } -+ } -+ -+ ntom += ntom_step; -+ if(ntom >= NTOM_MUL) -+ { -+ real sum; -+ sum = window[0x0] * b0[0x0]; -+ sum += window[0x2] * b0[0x2]; -+ sum += window[0x4] * b0[0x4]; -+ sum += window[0x6] * b0[0x6]; -+ sum += window[0x8] * b0[0x8]; -+ sum += window[0xA] * b0[0xA]; -+ sum += window[0xC] * b0[0xC]; -+ sum += window[0xE] * b0[0xE]; -+ -+ while(ntom >= NTOM_MUL) { -+ WRITE_SAMPLE(samples,sum,clip); -+ samples += step; -+ ntom -= NTOM_MUL; -+ } -+ } -+ -+ b0-=0x10,window-=0x20; -+ window += bo1<<1; -+ -+ for (j=15;j;j--,b0-=0x20,window-=0x10) -+ { -+ real sum; -+ -+ ntom += ntom_step; -+ if(ntom < NTOM_MUL) { -+ window -= 16; -+ b0 += 16; -+ continue; -+ } -+ -+ sum = -*(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ sum -= *(--window) * *b0++; -+ -+ while(ntom >= NTOM_MUL) { -+ WRITE_SAMPLE(samples,sum,clip); -+ samples += step; -+ ntom -= NTOM_MUL; -+ } -+ } -+ } -+ -+ ntom_val[channel] = ntom; -+ *pnt = ((unsigned char *) samples - out); -+ -+ return clip; -+} -+ -+ ---- /dev/null -+++ b/addons/mp3/huffman.h -@@ -0,0 +1,332 @@ -+/* -+ * huffman tables ... recalcualted to work with my optimzed -+ * decoder scheme (MH) -+ * -+ * probably we could save a few bytes of memory, because the -+ * smaller tables are often the part of a bigger table -+ */ -+ -+struct newhuff -+{ -+ unsigned int linbits; -+ short *table; -+}; -+ -+static short tab0[] = -+{ -+ 0 -+}; -+ -+static short tab1[] = -+{ -+ -5, -3, -1, 17, 1, 16, 0 -+}; -+ -+static short tab2[] = -+{ -+ -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1, -+ 16, 0 -+}; -+ -+static short tab3[] = -+{ -+ -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1, -+ 1, 0 -+}; -+ -+static short tab5[] = -+{ -+ -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19, -+ 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16, -+ 0 -+}; -+ -+static short tab6[] = -+{ -+ -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19, -+ 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16, -+ 0 -+}; -+ -+static short tab7[] = -+{ -+ -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83, -+ -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1, -+ 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7, -+ -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18, -+ -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0 -+}; -+ -+static short tab8[] = -+{ -+ -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83, -+ -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52, -+ 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4, -+ 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1, -+ 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0 -+}; -+ -+static short tab9[] = -+{ -+ -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1, -+ 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67, -+ -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5, -+ -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2, -+ 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0 -+}; -+ -+static short tab10[] = -+{ -+-125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118, -+ 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3, -+ -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1, -+ 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23, -+ -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81, -+ -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7, -+ -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1, -+ 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1, -+ 2, 32, 17, -1, 1, 16, 0 -+}; -+ -+static short tab11[] = -+{ -+-121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117, -+ -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55, -+ -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114, -+ -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96, -+ -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38, -+ 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1, -+ 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50, -+ -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2, -+ 32, 17, -3, -1, 1, 16, 0 -+}; -+ -+static short tab12[] = -+{ -+-115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87, -+ 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115, -+ 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7, -+ 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5, -+ -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37, -+ 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4, -+ 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3, -+ -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1, -+ 2, 32, 0, 17, -1, 1, 16 -+}; -+ -+static short tab13[] = -+{ -+-509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9, -+ -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238, -+ 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1, -+ 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249, -+ 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158, -+ -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1, -+ 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245, -+ 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1, -+ 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15, -+ -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1, -+ 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1, -+ 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1, -+ 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3, -+ -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1, -+ 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5, -+ -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167, -+ 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76, -+ 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137, -+ 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106, -+ -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43, -+ -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178, -+ -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1, -+ 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161, -+ -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88, -+ -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1, -+ 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25, -+ 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100, -+ 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113, -+ -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38, -+ -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6, -+ 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81, -+ -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11, -+ -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3, -+ -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, -+ 0 -+}; -+ -+static short tab15[] = -+{ -+-495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239, -+ -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237, -+ 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3, -+ -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219, -+ -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173, -+ -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246, -+ -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9, -+ -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243, -+ 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1, -+ 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1, -+ 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3, -+ -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5, -+ -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124, -+ 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1, -+ 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183, -+ -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76, -+ -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1, -+ 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15, -+ -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106, -+ -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5, -+ -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74, -+ -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1, -+ 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134, -+ 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29, -+ -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7, -+ -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7, -+ -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86, -+ -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100, -+ 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69, -+ -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9, -+ -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1, -+ 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20, -+ 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48, -+ 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16, -+ 0 -+}; -+ -+static short tab16[] = -+{ -+-509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223, -+ 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3, -+ -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5, -+ -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19, -+ -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1, -+ 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5, -+ -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125, -+ 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13, -+ -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3, -+ -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186, -+ -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1, -+ 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169, -+ -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213, -+ -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154, -+ 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1, -+ 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1, -+ 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45, -+ -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107, -+ -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12, -+ -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1, -+ 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74, -+ 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33, -+ -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3, -+ -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147, -+ -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1, -+ 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3, -+ -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1, -+ 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3, -+ -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1, -+ 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9, -+ -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33, -+ -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -+ -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1, -+ 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, -+ 0 -+}; -+ -+static short tab24[] = -+{ -+-451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1, -+ 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9, -+ -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79, -+ 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31, -+ 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1, -+ 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3, -+ -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3, -+ -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235, -+-143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3, -+ -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9, -+ -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1, -+ 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185, -+ 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199, -+ 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3, -+ -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3, -+ -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196, -+ -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1, -+ 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1, -+ 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10, -+ 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9, -+ 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165, -+ 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135, -+ -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104, -+ -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3, -+ -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3, -+ -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7, -+ -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86, -+ 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15, -+ -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84, -+ -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1, -+ 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5, -+ 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5, -+ -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1, -+ 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16, -+ 0 -+}; -+ -+static short tab_c0[] = -+{ -+ -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5, -+ 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8, -+ 0 -+}; -+ -+static short tab_c1[] = -+{ -+ -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9, -+ 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1, -+ 0 -+}; -+ -+ -+ -+static struct newhuff ht[] = -+{ -+ { /* 0 */ 0 , tab0 } , -+ { /* 2 */ 0 , tab1 } , -+ { /* 3 */ 0 , tab2 } , -+ { /* 3 */ 0 , tab3 } , -+ { /* 0 */ 0 , tab0 } , -+ { /* 4 */ 0 , tab5 } , -+ { /* 4 */ 0 , tab6 } , -+ { /* 6 */ 0 , tab7 } , -+ { /* 6 */ 0 , tab8 } , -+ { /* 6 */ 0 , tab9 } , -+ { /* 8 */ 0 , tab10 } , -+ { /* 8 */ 0 , tab11 } , -+ { /* 8 */ 0 , tab12 } , -+ { /* 16 */ 0 , tab13 } , -+ { /* 0 */ 0 , tab0 } , -+ { /* 16 */ 0 , tab15 } , -+ -+ { /* 16 */ 1 , tab16 } , -+ { /* 16 */ 2 , tab16 } , -+ { /* 16 */ 3 , tab16 } , -+ { /* 16 */ 4 , tab16 } , -+ { /* 16 */ 6 , tab16 } , -+ { /* 16 */ 8 , tab16 } , -+ { /* 16 */ 10, tab16 } , -+ { /* 16 */ 13, tab16 } , -+ { /* 16 */ 4 , tab24 } , -+ { /* 16 */ 5 , tab24 } , -+ { /* 16 */ 6 , tab24 } , -+ { /* 16 */ 7 , tab24 } , -+ { /* 16 */ 8 , tab24 } , -+ { /* 16 */ 9 , tab24 } , -+ { /* 16 */ 11, tab24 } , -+ { /* 16 */ 13, tab24 } -+}; -+ -+static struct newhuff htc[] = -+{ -+ { /* 1 , 1 , */ 0 , tab_c0 } , -+ { /* 1 , 1 , */ 0 , tab_c1 } -+}; -+ -+ ---- /dev/null -+++ b/addons/mp3/interface.c -@@ -0,0 +1,325 @@ -+#define WRAP_LIBC_MALLOC -+#define ASTMM_LIBC ASTMM_REDIRECT -+#include "asterisk.h" -+#include "asterisk/logger.h" -+ -+#include -+#include -+ -+#include "mpg123.h" -+#include "mpglib.h" -+ -+ -+void InitMP3Constants(void) -+{ -+ init_layer3_const(); -+ make_decode_tables_const(); -+ -+} -+ -+ -+BOOL InitMP3(struct mpstr *mp, long outscale) -+{ -+ /* quiet 4096 med 8192 */ -+ -+ memset(mp,0,sizeof(struct mpstr)); -+ -+ mp->framesize = 0; -+ mp->fsizeold = -1; -+ mp->bsize = 0; -+ mp->head = mp->tail = NULL; -+ mp->fr.single = 3; /* force mono */ -+ mp->bsnum = 0; -+ mp->synth_bo = 1; -+ mp->outsamplerate = 8000; -+ -+ make_decode_tables_scale(mp, outscale); -+ -+ init_layer3_sample_limits(mp, SBLIMIT); -+ -+ return !0; -+} -+ -+void ExitMP3(struct mpstr *mp) -+{ -+ struct buf *b,*bn; -+ -+ b = mp->tail; -+ while(b) { -+ free(b->pnt); -+ bn = b->next; -+ free(b); -+ b = bn; -+ } -+} -+ -+static struct buf *addbuf(struct mpstr *mp,char *buf,int size) -+{ -+ struct buf *nbuf; -+ -+ nbuf = malloc( sizeof(struct buf) ); -+ if(!nbuf) { -+ ast_log(LOG_WARNING,"Out of memory!\n"); -+ return NULL; -+ } -+ nbuf->pnt = malloc(size); -+ if(!nbuf->pnt) { -+ free(nbuf); -+ return NULL; -+ } -+ nbuf->size = size; -+ memcpy(nbuf->pnt,buf,size); -+ nbuf->next = NULL; -+ nbuf->prev = mp->head; -+ nbuf->pos = 0; -+ -+ if(!mp->tail) { -+ mp->tail = nbuf; -+ } -+ else { -+ mp->head->next = nbuf; -+ } -+ -+ mp->head = nbuf; -+ mp->bsize += size; -+ -+ return nbuf; -+} -+ -+static void remove_buf(struct mpstr *mp) -+{ -+ struct buf *buf = mp->tail; -+ -+ mp->tail = buf->next; -+ if(mp->tail) -+ mp->tail->prev = NULL; -+ else { -+ mp->tail = mp->head = NULL; -+ } -+ -+ free(buf->pnt); -+ free(buf); -+ -+} -+ -+static int read_buf_byte(int *error, struct mpstr *mp) -+{ -+ unsigned int b;int pos; -+ -+ pos = mp->tail->pos; -+ while(pos >= mp->tail->size) { -+ remove_buf(mp); -+ pos = mp->tail->pos; -+ if(!mp->tail) { -+ /* We may pick up this error a few times*/ -+ /* But things have gone pear shaped */ -+ ast_log(LOG_WARNING,"Fatal Buffer error!\n"); -+ *error = 1; -+ return (0); -+ } -+ } -+ -+ b = mp->tail->pnt[pos]; -+ mp->bsize--; -+ mp->tail->pos++; -+ -+ -+ return b; -+} -+ -+static int read_head(struct mpstr *mp) -+{ -+ unsigned long head; -+ int error=0; -+ -+ -+ head = read_buf_byte(&error, mp); -+ head <<= 8; -+ head |= read_buf_byte(&error, mp); -+ head <<= 8; -+ head |= read_buf_byte(&error, mp); -+ head <<= 8; -+ head |= read_buf_byte(&error, mp); -+ -+ mp->header = head; -+ -+ if(error){ -+ return (1); -+ }else -+ return (0); -+ -+} -+ -+static int head_check(unsigned long head) -+{ -+ if( (head & 0xffe00000) != 0xffe00000) -+ return FALSE; -+ if(!((head>>17)&3)) -+ return FALSE; -+ if( ((head>>12)&0xf) == 0xf || ((head>>12)&0xf) == 0) -+ return FALSE; -+ if( ((head>>10)&0x3) == 0x3 ) -+ return FALSE; -+ if ((head & 0xffff0000) == 0xfffe0000) -+ return FALSE; -+ -+ return TRUE; -+} -+ -+static int head_shift(struct mpstr *mp) -+{ -+ unsigned long head; -+ int error = 0; -+ -+ head = mp->header; -+ -+ head <<= 8; -+ head |= read_buf_byte(&error, mp); -+ -+ mp->header = head; -+ -+ if (error){ -+ return (1); -+ }else -+ return (0); -+ -+} -+ -+ -+int decodeMP3(struct mpstr *mp,char *in,int isize,char *out, -+ int osize,int *done) -+{ -+ int len; -+ long n,m; -+ int down_sample_sblimit; -+ -+ if(osize < 4608) { -+ ast_log(LOG_WARNING,"To less out space\n"); -+ return MP3_ERR; -+ } -+ -+ if(in) { -+ if(addbuf(mp,in,isize) == NULL) { -+ return MP3_ERR; -+ } -+ } -+ -+ /* First decode header */ -+ if(mp->framesize == 0) { -+ if(mp->bsize < 4) { -+ return MP3_NEED_MORE; -+ } -+ if (read_head(mp)) -+ return MP3_ERR; -+ -+ if(!head_check(mp->header) ) { -+ int i; -+ -+ ast_log(LOG_WARNING,"Junk at the beginning of frame %08lx\n",mp->header); -+ -+ /* step in byte steps through next 64K */ -+ for(i=0;i<65536;i++) { -+ if(!mp->bsize) -+ return MP3_NEED_MORE; -+ -+ if(head_shift(mp)) -+ return MP3_ERR; -+ -+ if(head_check(mp->header)) -+ break; -+ } -+ if(i == 65536) { -+ ast_log(LOG_WARNING,"Giving up searching valid MPEG header\n"); -+ return MP3_ERR; -+ } -+ } -+ -+ decode_header(&mp->fr,mp->header); -+ mp->framesize = mp->fr.framesize; -+ -+ if (!mp->initmp3){ -+ mp->initmp3 = 1; -+ -+ n = freqs[mp->fr.sampling_frequency]; -+ if (mp->outsamplerate) { -+ m = mp->outsamplerate; -+ } -+ else { -+ m =n; -+ } -+ -+ if (synth_ntom_set_step(n,m)) -+ return MP3_ERR; -+ -+ -+ if(n>m) { -+ down_sample_sblimit = SBLIMIT * m; -+ down_sample_sblimit /= n; -+ } -+ else { -+ down_sample_sblimit = SBLIMIT; -+ } -+ -+ init_layer3_sample_limits(mp, down_sample_sblimit); -+ -+ } -+ } -+ -+ -+ if(mp->fr.framesize > mp->bsize) -+ return MP3_NEED_MORE; -+ -+ (mp->worksample).wordpointer = mp->bsspace[mp->bsnum] + 512; -+ mp->bsnum = (mp->bsnum + 1) & 0x1; -+ (mp->worksample).bitindex = 0; -+ -+ len = 0; -+ while(len < mp->framesize) { -+ int nlen; -+ int blen = mp->tail->size - mp->tail->pos; -+ if( (mp->framesize - len) <= blen) { -+ nlen = mp->framesize-len; -+ } -+ else { -+ nlen = blen; -+ } -+ memcpy((mp->worksample).wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen); -+ len += nlen; -+ mp->tail->pos += nlen; -+ mp->bsize -= nlen; -+ if(mp->tail->pos == mp->tail->size) { -+ remove_buf(mp); -+ } -+ } -+ -+ *done = 0; -+ if(mp->fr.error_protection) -+ getbits(mp, 16); -+ -+ if (do_layer3(mp,(unsigned char *) out,done)) -+ return MP3_ERR; -+ -+ mp->fsizeold = mp->framesize; -+ mp->framesize = 0; -+ -+ return MP3_OK; -+} -+ -+int set_pointer(struct mpstr *mp, long backstep) -+{ -+ unsigned char *bsbufold; -+ if(mp->fsizeold < 0 && backstep > 0) { -+ ast_log(LOG_WARNING,"Can't step back %ld!\n",backstep); -+ return MP3_ERR; -+ } -+ bsbufold = mp->bsspace[mp->bsnum] + 512; -+ (mp->worksample).wordpointer -= backstep; -+ if (backstep) -+ memcpy((mp->worksample).wordpointer,bsbufold+mp->fsizeold-backstep,backstep); -+ (mp->worksample).bitindex = 0; -+ return MP3_OK; -+} -+ -+ -+ -+ ---- /dev/null -+++ b/addons/mp3/layer3.c -@@ -0,0 +1,2029 @@ -+/* -+ * Mpeg Layer-3 audio decoder -+ * -------------------------- -+ * copyright (c) 1995,1996,1997 by Michael Hipp. -+ * All rights reserved. See also 'README' -+ */ -+ -+#include "asterisk.h" -+#include "asterisk/logger.h" -+#include -+#include "mpg123.h" -+#include "mpglib.h" -+#include "huffman.h" -+ -+#define MPEG1 -+ -+/* These should all be constants setup once using init_layer3_const */ -+static real ispow[8207]; -+static real aa_ca[8],aa_cs[8]; -+static real COS1[12][6]; -+static real win[4][36]; -+static real win1[4][36]; -+static real gainpow2[256+118+4]; -+static real COS9[9]; -+static real COS6_1,COS6_2; -+static real tfcos36[9]; -+static real tfcos12[3]; -+ -+struct bandInfoStruct { -+ short longIdx[23]; -+ short longDiff[22]; -+ short shortIdx[14]; -+ short shortDiff[13]; -+}; -+ -+ -+struct bandInfoStruct bandInfo[9] = { -+ -+/* MPEG 1.0 */ -+ { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, -+ {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, -+ {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, -+ {4,4,4,4,6,8,10,12,14,18,22,30,56} } , -+ -+ { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, -+ {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, -+ {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, -+ {4,4,4,4,6,6,10,12,14,16,20,26,66} } , -+ -+ { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , -+ {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , -+ {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , -+ {4,4,4,4,6,8,12,16,20,26,34,42,12} } , -+ -+/* MPEG 2.0 */ -+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, -+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , -+ {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , -+ {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , -+ -+ { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, -+ {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } , -+ {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , -+ {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , -+ -+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, -+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, -+ {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, -+ {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , -+/* MPEG 2.5 */ -+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , -+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, -+ {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, -+ {4,4,4,6,8,10,12,14,18,24,30,40,18} }, -+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , -+ {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, -+ {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, -+ {4,4,4,6,8,10,12,14,18,24,30,40,18} }, -+ { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, -+ {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2}, -+ {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576}, -+ {8,8,8,12,16,20,24,28,36,2,2,2,26} } , -+}; -+ -+static int mapbuf0[9][152]; -+static int mapbuf1[9][156]; -+static int mapbuf2[9][44]; -+static int *map[9][3]; -+static int *mapend[9][3]; -+ -+static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ -+static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ -+ -+static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16]; -+static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16]; -+ -+/* -+ * init constant tables for layer-3 -+ */ -+void init_layer3_const(void) -+{ -+ int i,j,k,l; -+ -+ for(i=-256;i<118+4;i++) -+ gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) ); -+ -+ for(i=0;i<8207;i++) -+ ispow[i] = pow((double)i,(double)4.0/3.0); -+ -+ for (i=0;i<8;i++) -+ { -+ static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037}; -+ double sq=sqrt(1.0+Ci[i]*Ci[i]); -+ aa_cs[i] = 1.0/sq; -+ aa_ca[i] = Ci[i]/sq; -+ } -+ -+ for(i=0;i<18;i++) -+ { -+ win[0][i] = win[1][i] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 ); -+ win[0][i+18] = win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); -+ } -+ for(i=0;i<6;i++) -+ { -+ win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 ); -+ win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 ); -+ win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 ); -+ win[1][i+30] = win[3][i] = 0.0; -+ win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 ); -+ } -+ -+ for(i=0;i<9;i++) -+ COS9[i] = cos( M_PI / 18.0 * (double) i); -+ -+ for(i=0;i<9;i++) -+ tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 ); -+ for(i=0;i<3;i++) -+ tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 ); -+ -+ COS6_1 = cos( M_PI / 6.0 * (double) 1); -+ COS6_2 = cos( M_PI / 6.0 * (double) 2); -+ -+ for(i=0;i<12;i++) -+ { -+ win[2][i] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 ); -+ for(j=0;j<6;j++) -+ COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) ); -+ } -+ -+ for(j=0;j<4;j++) { -+ static int len[4] = { 36,36,12,36 }; -+ for(i=0;i 0) { -+ if( i & 1 ) -+ p1 = pow(base,(i+1.0)*0.5); -+ else -+ p2 = pow(base,i*0.5); -+ } -+ pow1_1[j][i] = p1; -+ pow2_1[j][i] = p2; -+ pow1_2[j][i] = M_SQRT2 * p1; -+ pow2_2[j][i] = M_SQRT2 * p2; -+ } -+ } -+ -+ for(j=0;j<9;j++) -+ { -+ struct bandInfoStruct *bi = &bandInfo[j]; -+ int *mp; -+ int cb,lwin; -+ short *bdf; -+ -+ mp = map[j][0] = mapbuf0[j]; -+ bdf = bi->longDiff; -+ for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) { -+ *mp++ = (*bdf) >> 1; -+ *mp++ = i; -+ *mp++ = 3; -+ *mp++ = cb; -+ } -+ bdf = bi->shortDiff+3; -+ for(cb=3;cb<13;cb++) { -+ int l = (*bdf++) >> 1; -+ for(lwin=0;lwin<3;lwin++) { -+ *mp++ = l; -+ *mp++ = i + lwin; -+ *mp++ = lwin; -+ *mp++ = cb; -+ } -+ i += 6*l; -+ } -+ mapend[j][0] = mp; -+ -+ mp = map[j][1] = mapbuf1[j]; -+ bdf = bi->shortDiff+0; -+ for(i=0,cb=0;cb<13;cb++) { -+ int l = (*bdf++) >> 1; -+ for(lwin=0;lwin<3;lwin++) { -+ *mp++ = l; -+ *mp++ = i + lwin; -+ *mp++ = lwin; -+ *mp++ = cb; -+ } -+ i += 6*l; -+ } -+ mapend[j][1] = mp; -+ -+ mp = map[j][2] = mapbuf2[j]; -+ bdf = bi->longDiff; -+ for(cb = 0; cb < 22 ; cb++) { -+ *mp++ = (*bdf++) >> 1; -+ *mp++ = cb; -+ } -+ mapend[j][2] = mp; -+ -+ } -+ -+ for(i=0;i<5;i++) { -+ for(j=0;j<6;j++) { -+ for(k=0;k<6;k++) { -+ int n = k + j * 6 + i * 36; -+ i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12); -+ } -+ } -+ } -+ for(i=0;i<4;i++) { -+ for(j=0;j<4;j++) { -+ for(k=0;k<4;k++) { -+ int n = k + j * 4 + i * 16; -+ i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12); -+ } -+ } -+ } -+ for(i=0;i<4;i++) { -+ for(j=0;j<3;j++) { -+ int n = j + i * 3; -+ i_slen2[n+244] = i|(j<<3) | (5<<12); -+ n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15); -+ } -+ } -+ -+ for(i=0;i<5;i++) { -+ for(j=0;j<5;j++) { -+ for(k=0;k<4;k++) { -+ for(l=0;l<4;l++) { -+ int n = l + k * 4 + j * 16 + i * 80; -+ n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12); -+ } -+ } -+ } -+ } -+ for(i=0;i<5;i++) { -+ for(j=0;j<5;j++) { -+ for(k=0;k<4;k++) { -+ int n = k + j * 4 + i * 20; -+ n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12); -+ } -+ } -+ } -+} -+ -+/* MP3 file specific rates */ -+void init_layer3_sample_limits(struct mpstr *mp, int down_sample_sblimit) -+{ -+ int i,j; -+ for(j=0;j<9;j++) { -+ for(i=0;i<23;i++) { -+ (mp->longLimit)[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1; -+ if((mp->longLimit)[j][i] > (down_sample_sblimit) ) -+ (mp->longLimit)[j][i] = down_sample_sblimit; -+ } -+ for(i=0;i<14;i++) { -+ (mp->shortLimit)[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1; -+ if((mp->shortLimit)[j][i] > (down_sample_sblimit) ) -+ (mp->shortLimit)[j][i] = down_sample_sblimit; -+ } -+ } -+} -+ -+ -+ -+/* -+ * read additional side information -+ */ -+#ifdef MPEG1 -+static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si,int stereo, -+ int ms_stereo,long sfreq,int single) -+{ -+ int ch, gr; -+ int powdiff = (single == 3) ? 4 : 0; -+ -+ si->main_data_begin = getbits(mp, 9); -+ if (stereo == 1) -+ si->private_bits = getbits_fast(mp, 5); -+ else -+ si->private_bits = getbits_fast(mp, 3); -+ -+ for (ch=0; chch[ch].gr[0].scfsi = -1; -+ si->ch[ch].gr[1].scfsi = getbits_fast(mp, 4); -+ } -+ -+ for (gr=0; gr<2; gr++) -+ { -+ for (ch=0; chch[ch].gr[gr]); -+ -+ gr_info->part2_3_length = getbits(mp, 12); -+ gr_info->big_values = getbits_fast(mp, 9); -+ if(gr_info->big_values > 288) { -+ ast_log(LOG_WARNING,"big_values too large!\n"); -+ gr_info->big_values = 288; -+ } -+ gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; -+ if(ms_stereo) -+ gr_info->pow2gain += 2; -+ gr_info->scalefac_compress = getbits_fast(mp, 4); -+/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ -+ if(get1bit(mp)) -+ { -+ int i; -+ gr_info->block_type = getbits_fast(mp, 2); -+ gr_info->mixed_block_flag = get1bit(mp); -+ gr_info->table_select[0] = getbits_fast(mp, 5); -+ gr_info->table_select[1] = getbits_fast(mp, 5); -+ /* -+ * table_select[2] not needed, because there is no region2, -+ * but to satisfy some verifications tools we set it either. -+ */ -+ gr_info->table_select[2] = 0; -+ for(i=0;i<3;i++) -+ gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); -+ -+ if(gr_info->block_type == 0) { -+ ast_log(LOG_WARNING,"Blocktype == 0 and window-switching == 1 not allowed.\n"); -+ return (1); -+ } -+ /* region_count/start parameters are implicit in this case. */ -+ gr_info->region1start = 36>>1; -+ gr_info->region2start = 576>>1; -+ } -+ else -+ { -+ int i,r0c,r1c; -+ for (i=0; i<3; i++) -+ gr_info->table_select[i] = getbits_fast(mp, 5); -+ r0c = getbits_fast(mp, 4); -+ r1c = getbits_fast(mp, 3); -+ gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; -+ gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; -+ gr_info->block_type = 0; -+ gr_info->mixed_block_flag = 0; -+ } -+ gr_info->preflag = get1bit(mp); -+ gr_info->scalefac_scale = get1bit(mp); -+ gr_info->count1table_select = get1bit(mp); -+ } -+ } -+ return (0); -+ -+} -+#endif -+ -+/* -+ * Side Info for MPEG 2.0 / LSF -+ */ -+static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int stereo, -+ int ms_stereo,long sfreq,int single) -+{ -+ int ch; -+ int powdiff = (single == 3) ? 4 : 0; -+ -+ si->main_data_begin = getbits(mp, 8); -+ if (stereo == 1) -+ si->private_bits = get1bit(mp); -+ else -+ si->private_bits = getbits_fast(mp, 2); -+ -+ for (ch=0; chch[ch].gr[0]); -+ -+ gr_info->part2_3_length = getbits(mp, 12); -+ gr_info->big_values = getbits_fast(mp, 9); -+ if(gr_info->big_values > 288) { -+ ast_log(LOG_WARNING,"big_values too large!\n"); -+ gr_info->big_values = 288; -+ } -+ gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; -+ if(ms_stereo) -+ gr_info->pow2gain += 2; -+ gr_info->scalefac_compress = getbits(mp, 9); -+/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ -+ if(get1bit(mp)) -+ { -+ int i; -+ gr_info->block_type = getbits_fast(mp, 2); -+ gr_info->mixed_block_flag = get1bit(mp); -+ gr_info->table_select[0] = getbits_fast(mp, 5); -+ gr_info->table_select[1] = getbits_fast(mp, 5); -+ /* -+ * table_select[2] not needed, because there is no region2, -+ * but to satisfy some verifications tools we set it either. -+ */ -+ gr_info->table_select[2] = 0; -+ for(i=0;i<3;i++) -+ gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); -+ -+ if(gr_info->block_type == 0) { -+ ast_log(LOG_WARNING,"Blocktype == 0 and window-switching == 1 not allowed.\n"); -+ return (1); -+ } -+ /* region_count/start parameters are implicit in this case. */ -+/* check this again! */ -+ if(gr_info->block_type == 2) -+ gr_info->region1start = 36>>1; -+ else if(sfreq == 8) -+/* check this for 2.5 and sfreq=8 */ -+ gr_info->region1start = 108>>1; -+ else -+ gr_info->region1start = 54>>1; -+ gr_info->region2start = 576>>1; -+ } -+ else -+ { -+ int i,r0c,r1c; -+ for (i=0; i<3; i++) -+ gr_info->table_select[i] = getbits_fast(mp, 5); -+ r0c = getbits_fast(mp, 4); -+ r1c = getbits_fast(mp, 3); -+ gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; -+ gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; -+ gr_info->block_type = 0; -+ gr_info->mixed_block_flag = 0; -+ } -+ gr_info->scalefac_scale = get1bit(mp); -+ gr_info->count1table_select = get1bit(mp); -+ } -+ return (0); -+} -+ -+/* -+ * read scalefactors -+ */ -+#ifdef MPEG1 -+static int III_get_scale_factors_1(struct mpstr *mp, int *scf,struct gr_info_s *gr_info) -+{ -+ static unsigned char slen[2][16] = { -+ {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}, -+ {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3} -+ }; -+ int numbits; -+ int num0 = slen[0][gr_info->scalefac_compress]; -+ int num1 = slen[1][gr_info->scalefac_compress]; -+ -+ if (gr_info->block_type == 2) -+ { -+ int i=18; -+ numbits = (num0 + num1) * 18; -+ -+ if (gr_info->mixed_block_flag) { -+ for (i=8;i;i--) -+ *scf++ = getbits_fast(mp, num0); -+ i = 9; -+ numbits -= num0; /* num0 * 17 + num1 * 18 */ -+ } -+ -+ for (;i;i--) -+ *scf++ = getbits_fast(mp, num0); -+ for (i = 18; i; i--) -+ *scf++ = getbits_fast(mp, num1); -+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */ -+ } -+ else -+ { -+ int i; -+ int scfsi = gr_info->scfsi; -+ -+ if(scfsi < 0) { /* scfsi < 0 => granule == 0 */ -+ for(i=11;i;i--) -+ *scf++ = getbits_fast(mp, num0); -+ for(i=10;i;i--) -+ *scf++ = getbits_fast(mp, num1); -+ numbits = (num0 + num1) * 10 + num0; -+ } -+ else { -+ numbits = 0; -+ if(!(scfsi & 0x8)) { -+ for (i=6;i;i--) -+ *scf++ = getbits_fast(mp, num0); -+ numbits += num0 * 6; -+ } -+ else { -+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ -+ *scf++ = 0; *scf++ = 0; *scf++ = 0; -+ } -+ -+ if(!(scfsi & 0x4)) { -+ for (i=5;i;i--) -+ *scf++ = getbits_fast(mp, num0); -+ numbits += num0 * 5; -+ } -+ else { -+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ -+ *scf++ = 0; *scf++ = 0; -+ } -+ -+ if(!(scfsi & 0x2)) { -+ for(i=5;i;i--) -+ *scf++ = getbits_fast(mp, num1); -+ numbits += num1 * 5; -+ } -+ else { -+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ -+ *scf++ = 0; *scf++ = 0; -+ } -+ -+ if(!(scfsi & 0x1)) { -+ for (i=5;i;i--) -+ *scf++ = getbits_fast(mp, num1); -+ numbits += num1 * 5; -+ } -+ else { -+ *scf++ = 0; *scf++ = 0; *scf++ = 0; /* set to ZERO necessary? */ -+ *scf++ = 0; *scf++ = 0; -+ } -+ } -+ -+ *scf++ = 0; /* no l[21] in original sources */ -+ } -+ return numbits; -+} -+#endif -+ -+static int III_get_scale_factors_2(struct mpstr *mp, int *scf,struct gr_info_s *gr_info,int i_stereo) -+{ -+ unsigned char *pnt; -+ int i,j; -+ unsigned int slen; -+ int n = 0; -+ int numbits = 0; -+ -+ static unsigned char stab[3][6][4] = { -+ { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} , -+ { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } , -+ { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} , -+ {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } , -+ { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} , -+ { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } }; -+ -+ if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */ -+ slen = i_slen2[gr_info->scalefac_compress>>1]; -+ else -+ slen = n_slen2[gr_info->scalefac_compress]; -+ -+ gr_info->preflag = (slen>>15) & 0x1; -+ -+ n = 0; -+ if( gr_info->block_type == 2 ) { -+ n++; -+ if(gr_info->mixed_block_flag) -+ n++; -+ } -+ -+ pnt = stab[n][(slen>>12)&0x7]; -+ -+ for(i=0;i<4;i++) { -+ int num = slen & 0x7; -+ slen >>= 3; -+ if(num) { -+ for(j=0;j<(int)(pnt[i]);j++) -+ *scf++ = getbits_fast(mp, num); -+ numbits += pnt[i] * num; -+ } -+ else { -+ for(j=0;j<(int)(pnt[i]);j++) -+ *scf++ = 0; -+ } -+ } -+ -+ n = (n << 1) + 1; -+ for(i=0;iscalefac_scale; -+ real *xrpnt = (real *) xr; -+ int l[3],l3; -+ int part2remain = gr_info->part2_3_length - part2bits; -+ int *me; -+ -+ { -+ int bv = gr_info->big_values; -+ int region1 = gr_info->region1start; -+ int region2 = gr_info->region2start; -+ -+ l3 = ((576>>1)-bv)>>1; -+/* -+ * we may lose the 'odd' bit here !! -+ * check this later again -+ */ -+ if(bv <= region1) { -+ l[0] = bv; l[1] = 0; l[2] = 0; -+ } -+ else { -+ l[0] = region1; -+ if(bv <= region2) { -+ l[1] = bv - l[0]; l[2] = 0; -+ } -+ else { -+ l[1] = region2 - l[0]; l[2] = bv - region2; -+ } -+ } -+ } -+ -+ if(gr_info->block_type == 2) { -+ /* -+ * decoding with short or mixed mode BandIndex table -+ */ -+ int i,max[4]; -+ int step=0,lwin=0,cb=0; -+ register real v = 0.0; -+ register int *m,mc; -+ -+ if(gr_info->mixed_block_flag) { -+ max[3] = -1; -+ max[0] = max[1] = max[2] = 2; -+ m = map[sfreq][0]; -+ me = mapend[sfreq][0]; -+ } -+ else { -+ max[0] = max[1] = max[2] = max[3] = -1; -+ /* max[3] not really needed in this case */ -+ m = map[sfreq][1]; -+ me = mapend[sfreq][1]; -+ } -+ -+ mc = 0; -+ for(i=0;i<2;i++) { -+ int lp = l[i]; -+ struct newhuff *h = ht+gr_info->table_select[i]; -+ for(;lp;lp--,mc--) { -+ register int x,y; -+ if( (!mc) ) { -+ mc = *m++; -+ xrpnt = ((real *) xr) + (*m++); -+ lwin = *m++; -+ cb = *m++; -+ if(lwin == 3) { -+ v = gr_info->pow2gain[(*scf++) << shift]; -+ step = 1; -+ } -+ else { -+ v = gr_info->full_gain[lwin][(*scf++) << shift]; -+ step = 3; -+ } -+ } -+ { -+ register short *val = h->table; -+ while((y=*val++)<0) { -+ if (get1bit(mp)) -+ val -= y; -+ part2remain--; -+ } -+ x = y >> 4; -+ y &= 0xf; -+ } -+ if(x == 15) { -+ max[lwin] = cb; -+ part2remain -= h->linbits+1; -+ x += getbits(mp, h->linbits); -+ if(get1bit(mp)) -+ *xrpnt = -ispow[x] * v; -+ else -+ *xrpnt = ispow[x] * v; -+ } -+ else if(x) { -+ max[lwin] = cb; -+ if(get1bit(mp)) -+ *xrpnt = -ispow[x] * v; -+ else -+ *xrpnt = ispow[x] * v; -+ part2remain--; -+ } -+ else -+ *xrpnt = 0.0; -+ xrpnt += step; -+ if(y == 15) { -+ max[lwin] = cb; -+ part2remain -= h->linbits+1; -+ y += getbits(mp, h->linbits); -+ if(get1bit(mp)) -+ *xrpnt = -ispow[y] * v; -+ else -+ *xrpnt = ispow[y] * v; -+ } -+ else if(y) { -+ max[lwin] = cb; -+ if(get1bit(mp)) -+ *xrpnt = -ispow[y] * v; -+ else -+ *xrpnt = ispow[y] * v; -+ part2remain--; -+ } -+ else -+ *xrpnt = 0.0; -+ xrpnt += step; -+ } -+ } -+ for(;l3 && (part2remain > 0);l3--) { -+ struct newhuff *h = htc+gr_info->count1table_select; -+ register short *val = h->table,a; -+ -+ while((a=*val++)<0) { -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ a = 0; -+ break; -+ } -+ if (get1bit(mp)) -+ val -= a; -+ } -+ -+ for(i=0;i<4;i++) { -+ if(!(i & 1)) { -+ if(!mc) { -+ mc = *m++; -+ xrpnt = ((real *) xr) + (*m++); -+ lwin = *m++; -+ cb = *m++; -+ if(lwin == 3) { -+ v = gr_info->pow2gain[(*scf++) << shift]; -+ step = 1; -+ } -+ else { -+ v = gr_info->full_gain[lwin][(*scf++) << shift]; -+ step = 3; -+ } -+ } -+ mc--; -+ } -+ if( (a & (0x8>>i)) ) { -+ max[lwin] = cb; -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ break; -+ } -+ if(get1bit(mp)) -+ *xrpnt = -v; -+ else -+ *xrpnt = v; -+ } -+ else -+ *xrpnt = 0.0; -+ xrpnt += step; -+ } -+ } -+ -+ while( m < me ) { -+ if(!mc) { -+ mc = *m++; -+ xrpnt = ((real *) xr) + *m++; -+ if( (*m++) == 3) -+ step = 1; -+ else -+ step = 3; -+ m++; /* cb */ -+ } -+ mc--; -+ *xrpnt = 0.0; -+ xrpnt += step; -+ *xrpnt = 0.0; -+ xrpnt += step; -+/* we could add a little opt. here: -+ * if we finished a band for window 3 or a long band -+ * further bands could copied in a simple loop without a -+ * special 'map' decoding -+ */ -+ } -+ -+ gr_info->maxband[0] = max[0]+1; -+ gr_info->maxband[1] = max[1]+1; -+ gr_info->maxband[2] = max[2]+1; -+ gr_info->maxbandl = max[3]+1; -+ -+ { -+ int rmax = max[0] > max[1] ? max[0] : max[1]; -+ rmax = (rmax > max[2] ? rmax : max[2]) + 1; -+ gr_info->maxb = rmax ? (mp->shortLimit)[sfreq][rmax] : (mp->longLimit)[sfreq][max[3]+1]; -+ } -+ -+ } -+ else { -+ /* -+ * decoding with 'long' BandIndex table (block_type != 2) -+ */ -+ int *pretab = gr_info->preflag ? pretab1 : pretab2; -+ int i,max = -1; -+ int cb = 0; -+ register int *m = map[sfreq][2]; -+ register real v = 0.0; -+ register int mc = 0; -+#if 0 -+ me = mapend[sfreq][2]; -+#endif -+ -+ /* -+ * long hash table values -+ */ -+ for(i=0;i<3;i++) { -+ int lp = l[i]; -+ struct newhuff *h = ht+gr_info->table_select[i]; -+ -+ for(;lp;lp--,mc--) { -+ int x,y; -+ -+ if(!mc) { -+ mc = *m++; -+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; -+ cb = *m++; -+ } -+ { -+ register short *val = h->table; -+ while((y=*val++)<0) { -+ if (get1bit(mp)) -+ val -= y; -+ part2remain--; -+ } -+ x = y >> 4; -+ y &= 0xf; -+ } -+ if (x == 15) { -+ max = cb; -+ part2remain -= h->linbits+1; -+ x += getbits(mp, h->linbits); -+ if(get1bit(mp)) -+ *xrpnt++ = -ispow[x] * v; -+ else -+ *xrpnt++ = ispow[x] * v; -+ } -+ else if(x) { -+ max = cb; -+ if(get1bit(mp)) -+ *xrpnt++ = -ispow[x] * v; -+ else -+ *xrpnt++ = ispow[x] * v; -+ part2remain--; -+ } -+ else -+ *xrpnt++ = 0.0; -+ -+ if (y == 15) { -+ max = cb; -+ part2remain -= h->linbits+1; -+ y += getbits(mp, h->linbits); -+ if(get1bit(mp)) -+ *xrpnt++ = -ispow[y] * v; -+ else -+ *xrpnt++ = ispow[y] * v; -+ } -+ else if(y) { -+ max = cb; -+ if(get1bit(mp)) -+ *xrpnt++ = -ispow[y] * v; -+ else -+ *xrpnt++ = ispow[y] * v; -+ part2remain--; -+ } -+ else -+ *xrpnt++ = 0.0; -+ } -+ } -+ -+ /* -+ * short (count1table) values -+ */ -+ for(;l3 && (part2remain > 0);l3--) { -+ struct newhuff *h = htc+gr_info->count1table_select; -+ register short *val = h->table,a; -+ -+ while((a=*val++)<0) { -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ a = 0; -+ break; -+ } -+ if (get1bit(mp)) -+ val -= a; -+ } -+ -+ for(i=0;i<4;i++) { -+ if(!(i & 1)) { -+ if(!mc) { -+ mc = *m++; -+ cb = *m++; -+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; -+ } -+ mc--; -+ } -+ if ( (a & (0x8>>i)) ) { -+ max = cb; -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ break; -+ } -+ if(get1bit(mp)) -+ *xrpnt++ = -v; -+ else -+ *xrpnt++ = v; -+ } -+ else -+ *xrpnt++ = 0.0; -+ } -+ } -+ -+ /* -+ * zero part -+ */ -+ for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) { -+ *xrpnt++ = 0.0; -+ *xrpnt++ = 0.0; -+ } -+ -+ gr_info->maxbandl = max+1; -+ gr_info->maxb = (mp->longLimit)[sfreq][gr_info->maxbandl]; -+ } -+ -+ while( part2remain > 16 ) { -+ getbits(mp, 16); /* Dismiss stuffing Bits */ -+ part2remain -= 16; -+ } -+ if(part2remain > 0) -+ getbits(mp, part2remain); -+ else if(part2remain < 0) { -+ ast_log(LOG_WARNING,"mpg123: Can't rewind stream by %d bits!\n",-part2remain); -+ return 1; /* -> error */ -+ } -+ return 0; -+} -+ -+#if 0 -+static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf, -+ struct gr_info_s *gr_info,int sfreq,int part2bits) -+{ -+ int shift = 1 + gr_info->scalefac_scale; -+ real *xrpnt = (real *) xr[1]; -+ real *xr0pnt = (real *) xr[0]; -+ int l[3],l3; -+ int part2remain = gr_info->part2_3_length - part2bits; -+ int *me; -+ -+ { -+ int bv = gr_info->big_values; -+ int region1 = gr_info->region1start; -+ int region2 = gr_info->region2start; -+ -+ l3 = ((576>>1)-bv)>>1; -+/* -+ * we may lose the 'odd' bit here !! -+ * check this later gain -+ */ -+ if(bv <= region1) { -+ l[0] = bv; l[1] = 0; l[2] = 0; -+ } -+ else { -+ l[0] = region1; -+ if(bv <= region2) { -+ l[1] = bv - l[0]; l[2] = 0; -+ } -+ else { -+ l[1] = region2 - l[0]; l[2] = bv - region2; -+ } -+ } -+ } -+ -+ if(gr_info->block_type == 2) { -+ int i,max[4]; -+ int step=0,lwin=0,cb=0; -+ register real v = 0.0; -+ register int *m,mc = 0; -+ -+ if(gr_info->mixed_block_flag) { -+ max[3] = -1; -+ max[0] = max[1] = max[2] = 2; -+ m = map[sfreq][0]; -+ me = mapend[sfreq][0]; -+ } -+ else { -+ max[0] = max[1] = max[2] = max[3] = -1; -+ /* max[3] not really needed in this case */ -+ m = map[sfreq][1]; -+ me = mapend[sfreq][1]; -+ } -+ -+ for(i=0;i<2;i++) { -+ int lp = l[i]; -+ struct newhuff *h = ht+gr_info->table_select[i]; -+ for(;lp;lp--,mc--) { -+ int x,y; -+ -+ if(!mc) { -+ mc = *m++; -+ xrpnt = ((real *) xr[1]) + *m; -+ xr0pnt = ((real *) xr[0]) + *m++; -+ lwin = *m++; -+ cb = *m++; -+ if(lwin == 3) { -+ v = gr_info->pow2gain[(*scf++) << shift]; -+ step = 1; -+ } -+ else { -+ v = gr_info->full_gain[lwin][(*scf++) << shift]; -+ step = 3; -+ } -+ } -+ { -+ register short *val = h->table; -+ while((y=*val++)<0) { -+ if (get1bit(mp)) -+ val -= y; -+ part2remain--; -+ } -+ x = y >> 4; -+ y &= 0xf; -+ } -+ if(x == 15) { -+ max[lwin] = cb; -+ part2remain -= h->linbits+1; -+ x += getbits(mp, h->linbits); -+ if(get1bit(mp)) { -+ real a = ispow[x] * v; -+ *xrpnt = *xr0pnt + a; -+ *xr0pnt -= a; -+ } -+ else { -+ real a = ispow[x] * v; -+ *xrpnt = *xr0pnt - a; -+ *xr0pnt += a; -+ } -+ } -+ else if(x) { -+ max[lwin] = cb; -+ if(get1bit(mp)) { -+ real a = ispow[x] * v; -+ *xrpnt = *xr0pnt + a; -+ *xr0pnt -= a; -+ } -+ else { -+ real a = ispow[x] * v; -+ *xrpnt = *xr0pnt - a; -+ *xr0pnt += a; -+ } -+ part2remain--; -+ } -+ else -+ *xrpnt = *xr0pnt; -+ xrpnt += step; -+ xr0pnt += step; -+ -+ if(y == 15) { -+ max[lwin] = cb; -+ part2remain -= h->linbits+1; -+ y += getbits(mp, h->linbits); -+ if(get1bit(mp)) { -+ real a = ispow[y] * v; -+ *xrpnt = *xr0pnt + a; -+ *xr0pnt -= a; -+ } -+ else { -+ real a = ispow[y] * v; -+ *xrpnt = *xr0pnt - a; -+ *xr0pnt += a; -+ } -+ } -+ else if(y) { -+ max[lwin] = cb; -+ if(get1bit(mp)) { -+ real a = ispow[y] * v; -+ *xrpnt = *xr0pnt + a; -+ *xr0pnt -= a; -+ } -+ else { -+ real a = ispow[y] * v; -+ *xrpnt = *xr0pnt - a; -+ *xr0pnt += a; -+ } -+ part2remain--; -+ } -+ else -+ *xrpnt = *xr0pnt; -+ xrpnt += step; -+ xr0pnt += step; -+ } -+ } -+ -+ for(;l3 && (part2remain > 0);l3--) { -+ struct newhuff *h = htc+gr_info->count1table_select; -+ register short *val = h->table,a; -+ -+ while((a=*val++)<0) { -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ a = 0; -+ break; -+ } -+ if (get1bit(mp)) -+ val -= a; -+ } -+ -+ for(i=0;i<4;i++) { -+ if(!(i & 1)) { -+ if(!mc) { -+ mc = *m++; -+ xrpnt = ((real *) xr[1]) + *m; -+ xr0pnt = ((real *) xr[0]) + *m++; -+ lwin = *m++; -+ cb = *m++; -+ if(lwin == 3) { -+ v = gr_info->pow2gain[(*scf++) << shift]; -+ step = 1; -+ } -+ else { -+ v = gr_info->full_gain[lwin][(*scf++) << shift]; -+ step = 3; -+ } -+ } -+ mc--; -+ } -+ if( (a & (0x8>>i)) ) { -+ max[lwin] = cb; -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ break; -+ } -+ if(get1bit(mp)) { -+ *xrpnt = *xr0pnt + v; -+ *xr0pnt -= v; -+ } -+ else { -+ *xrpnt = *xr0pnt - v; -+ *xr0pnt += v; -+ } -+ } -+ else -+ *xrpnt = *xr0pnt; -+ xrpnt += step; -+ xr0pnt += step; -+ } -+ } -+ -+ while( m < me ) { -+ if(!mc) { -+ mc = *m++; -+ xrpnt = ((real *) xr[1]) + *m; -+ xr0pnt = ((real *) xr[0]) + *m++; -+ if(*m++ == 3) -+ step = 1; -+ else -+ step = 3; -+ m++; /* cb */ -+ } -+ mc--; -+ *xrpnt = *xr0pnt; -+ xrpnt += step; -+ xr0pnt += step; -+ *xrpnt = *xr0pnt; -+ xrpnt += step; -+ xr0pnt += step; -+/* we could add a little opt. here: -+ * if we finished a band for window 3 or a long band -+ * further bands could copied in a simple loop without a -+ * special 'map' decoding -+ */ -+ } -+ -+ gr_info->maxband[0] = max[0]+1; -+ gr_info->maxband[1] = max[1]+1; -+ gr_info->maxband[2] = max[2]+1; -+ gr_info->maxbandl = max[3]+1; -+ -+ { -+ int rmax = max[0] > max[1] ? max[0] : max[1]; -+ rmax = (rmax > max[2] ? rmax : max[2]) + 1; -+ gr_info->maxb = rmax ? (mp->shortLimit)[sfreq][rmax] : (mp->longLimit)[sfreq][max[3]+1]; -+ } -+ } -+ else { -+ int *pretab = gr_info->preflag ? pretab1 : pretab2; -+ int i,max = -1; -+ int cb = 0; -+ register int mc=0,*m = map[sfreq][2]; -+ register real v = 0.0; -+#if 0 -+ me = mapend[sfreq][2]; -+#endif -+ -+ for(i=0;i<3;i++) { -+ int lp = l[i]; -+ struct newhuff *h = ht+gr_info->table_select[i]; -+ -+ for(;lp;lp--,mc--) { -+ int x,y; -+ if(!mc) { -+ mc = *m++; -+ cb = *m++; -+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; -+ } -+ { -+ register short *val = h->table; -+ while((y=*val++)<0) { -+ if (get1bit(mp)) -+ val -= y; -+ part2remain--; -+ } -+ x = y >> 4; -+ y &= 0xf; -+ } -+ if (x == 15) { -+ max = cb; -+ part2remain -= h->linbits+1; -+ x += getbits(mp, h->linbits); -+ if(get1bit(mp)) { -+ real a = ispow[x] * v; -+ *xrpnt++ = *xr0pnt + a; -+ *xr0pnt++ -= a; -+ } -+ else { -+ real a = ispow[x] * v; -+ *xrpnt++ = *xr0pnt - a; -+ *xr0pnt++ += a; -+ } -+ } -+ else if(x) { -+ max = cb; -+ if(get1bit(mp)) { -+ real a = ispow[x] * v; -+ *xrpnt++ = *xr0pnt + a; -+ *xr0pnt++ -= a; -+ } -+ else { -+ real a = ispow[x] * v; -+ *xrpnt++ = *xr0pnt - a; -+ *xr0pnt++ += a; -+ } -+ part2remain--; -+ } -+ else -+ *xrpnt++ = *xr0pnt++; -+ -+ if (y == 15) { -+ max = cb; -+ part2remain -= h->linbits+1; -+ y += getbits(mp, h->linbits); -+ if(get1bit(mp)) { -+ real a = ispow[y] * v; -+ *xrpnt++ = *xr0pnt + a; -+ *xr0pnt++ -= a; -+ } -+ else { -+ real a = ispow[y] * v; -+ *xrpnt++ = *xr0pnt - a; -+ *xr0pnt++ += a; -+ } -+ } -+ else if(y) { -+ max = cb; -+ if(get1bit(mp)) { -+ real a = ispow[y] * v; -+ *xrpnt++ = *xr0pnt + a; -+ *xr0pnt++ -= a; -+ } -+ else { -+ real a = ispow[y] * v; -+ *xrpnt++ = *xr0pnt - a; -+ *xr0pnt++ += a; -+ } -+ part2remain--; -+ } -+ else -+ *xrpnt++ = *xr0pnt++; -+ } -+ } -+ -+ for(;l3 && (part2remain > 0);l3--) { -+ struct newhuff *h = htc+gr_info->count1table_select; -+ register short *val = h->table,a; -+ -+ while((a=*val++)<0) { -+ part2remain--; -+ if(part2remain < 0) { -+ part2remain++; -+ a = 0; -+ break; -+ } -+ if (get1bit(mp)) -+ val -= a; -+ } -+ -+ for(i=0;i<4;i++) { -+ if(!(i & 1)) { -+ if(!mc) { -+ mc = *m++; -+ cb = *m++; -+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; -+ } -+ mc--; -+ } -+ if ( (a & (0x8>>i)) ) { -+ max = cb; -+ part2remain--; -+ if(part2remain <= 0) { -+ part2remain++; -+ break; -+ } -+ if(get1bit(mp)) { -+ *xrpnt++ = *xr0pnt + v; -+ *xr0pnt++ -= v; -+ } -+ else { -+ *xrpnt++ = *xr0pnt - v; -+ *xr0pnt++ += v; -+ } -+ } -+ else -+ *xrpnt++ = *xr0pnt++; -+ } -+ } -+ for(i=(&xr[1][SBLIMIT][0]-xrpnt)>>1;i;i--) { -+ *xrpnt++ = *xr0pnt++; -+ *xrpnt++ = *xr0pnt++; -+ } -+ -+ gr_info->maxbandl = max+1; -+ gr_info->maxb = longLimit[sfreq][gr_info->maxbandl]; -+ } -+ -+ while ( part2remain > 16 ) { -+ getbits(mp, 16); /* Dismiss stuffing Bits */ -+ part2remain -= 16; -+ } -+ if(part2remain > 0 ) -+ getbits(mp, part2remain); -+ else if(part2remain < 0) { -+ ast_log(LOG_WARNING,"mpg123_ms: Can't rewind stream by %d bits!\n",-part2remain); -+ return 1; /* -> error */ -+ } -+ return 0; -+} -+#endif -+ -+/* -+ * III_stereo: calculate real channel values for Joint-I-Stereo-mode -+ */ -+static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac, -+ struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf) -+{ -+ real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf; -+ struct bandInfoStruct *bi = &bandInfo[sfreq]; -+ real *tab1,*tab2; -+ -+ if(lsf) { -+ int p = gr_info->scalefac_compress & 0x1; -+ if(ms_stereo) { -+ tab1 = pow1_2[p]; tab2 = pow2_2[p]; -+ } -+ else { -+ tab1 = pow1_1[p]; tab2 = pow2_1[p]; -+ } -+ } -+ else { -+ if(ms_stereo) { -+ tab1 = tan1_2; tab2 = tan2_2; -+ } -+ else { -+ tab1 = tan1_1; tab2 = tan2_1; -+ } -+ } -+ -+ if (gr_info->block_type == 2) -+ { -+ int lwin,do_l = 0; -+ if( gr_info->mixed_block_flag ) -+ do_l = 1; -+ -+ for (lwin=0;lwin<3;lwin++) /* process each window */ -+ { -+ /* get first band with zero values */ -+ int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ -+ if(sfb > 3) -+ do_l = 0; -+ -+ for(;sfb<12;sfb++) -+ { -+ is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ -+ if(is_p != 7) { -+ real t1,t2; -+ sb = bi->shortDiff[sfb]; -+ idx = bi->shortIdx[sfb] + lwin; -+ t1 = tab1[is_p]; t2 = tab2[is_p]; -+ for (; sb > 0; sb--,idx+=3) -+ { -+ real v = xr[0][idx]; -+ xr[0][idx] = v * t1; -+ xr[1][idx] = v * t2; -+ } -+ } -+ } -+ -+#if 1 -+/* in the original: copy 10 to 11 , here: copy 11 to 12 -+maybe still wrong??? (copy 12 to 13?) */ -+ is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ -+ sb = bi->shortDiff[12]; -+ idx = bi->shortIdx[12] + lwin; -+#else -+ is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ -+ sb = bi->shortDiff[11]; -+ idx = bi->shortIdx[11] + lwin; -+#endif -+ if(is_p != 7) -+ { -+ real t1,t2; -+ t1 = tab1[is_p]; t2 = tab2[is_p]; -+ for ( ; sb > 0; sb--,idx+=3 ) -+ { -+ real v = xr[0][idx]; -+ xr[0][idx] = v * t1; -+ xr[1][idx] = v * t2; -+ } -+ } -+ } /* end for(lwin; .. ; . ) */ -+ -+ if (do_l) -+ { -+/* also check l-part, if ALL bands in the three windows are 'empty' -+ * and mode = mixed_mode -+ */ -+ int sfb = gr_info->maxbandl; -+ int idx = bi->longIdx[sfb]; -+ -+ for ( ; sfb<8; sfb++ ) -+ { -+ int sb = bi->longDiff[sfb]; -+ int is_p = scalefac[sfb]; /* scale: 0-15 */ -+ if(is_p != 7) { -+ real t1,t2; -+ t1 = tab1[is_p]; t2 = tab2[is_p]; -+ for ( ; sb > 0; sb--,idx++) -+ { -+ real v = xr[0][idx]; -+ xr[0][idx] = v * t1; -+ xr[1][idx] = v * t2; -+ } -+ } -+ else -+ idx += sb; -+ } -+ } -+ } -+ else /* ((gr_info->block_type != 2)) */ -+ { -+ int sfb = gr_info->maxbandl; -+ int is_p,idx = bi->longIdx[sfb]; -+ for ( ; sfb<21; sfb++) -+ { -+ int sb = bi->longDiff[sfb]; -+ is_p = scalefac[sfb]; /* scale: 0-15 */ -+ if(is_p != 7) { -+ real t1,t2; -+ t1 = tab1[is_p]; t2 = tab2[is_p]; -+ for ( ; sb > 0; sb--,idx++) -+ { -+ real v = xr[0][idx]; -+ xr[0][idx] = v * t1; -+ xr[1][idx] = v * t2; -+ } -+ } -+ else -+ idx += sb; -+ } -+ -+ is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */ -+ if(is_p != 7) -+ { -+ int sb; -+ real t1 = tab1[is_p],t2 = tab2[is_p]; -+ -+ for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ ) -+ { -+ real v = xr[0][idx]; -+ xr[0][idx] = v * t1; -+ xr[1][idx] = v * t2; -+ } -+ } -+ } /* ... */ -+} -+ -+static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info) -+{ -+ int sblim; -+ -+ if(gr_info->block_type == 2) -+ { -+ if(!gr_info->mixed_block_flag) -+ return; -+ sblim = 1; -+ } -+ else { -+ sblim = gr_info->maxb-1; -+ } -+ -+ /* 31 alias-reduction operations between each pair of sub-bands */ -+ /* with 8 butterflies between each pair */ -+ -+ { -+ int sb; -+ real *xr1=(real *) xr[1]; -+ -+ for(sb=sblim;sb;sb--,xr1+=10) -+ { -+ int ss; -+ real *cs=aa_cs,*ca=aa_ca; -+ real *xr2 = xr1; -+ -+ for(ss=7;ss>=0;ss--) -+ { /* upper and lower butterfly inputs */ -+ register real bu = *--xr2,bd = *xr1; -+ *xr2 = (bu * (*cs) ) - (bd * (*ca) ); -+ *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) ); -+ } -+ } -+ } -+} -+ -+/* -+ DCT insipired by Jeff Tsay's DCT from the maplay package -+ this is an optimized version with manual unroll. -+ -+ References: -+ [1] S. Winograd: "On Computing the Discrete Fourier Transform", -+ Mathematics of Computation, Volume 32, Number 141, January 1978, -+ Pages 175-199 -+*/ -+ -+static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf) -+{ -+ { -+ register real *in = inbuf; -+ -+ in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; -+ in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11]; -+ in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8]; -+ in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5]; -+ in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; -+ in[2] +=in[1]; in[1] +=in[0]; -+ -+ in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9]; -+ in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1]; -+ -+ -+ { -+ -+#define MACRO0(v) { \ -+ real tmp; \ -+ out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \ -+ out2[8-(v)] = tmp * w[26-(v)]; } \ -+ sum0 -= sum1; \ -+ ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \ -+ ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; -+#define MACRO1(v) { \ -+ real sum0,sum1; \ -+ sum0 = tmp1a + tmp2a; \ -+ sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \ -+ MACRO0(v); } -+#define MACRO2(v) { \ -+ real sum0,sum1; \ -+ sum0 = tmp2a - tmp1a; \ -+ sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \ -+ MACRO0(v); } -+ -+ register const real *c = COS9; -+ register real *out2 = o2; -+ register real *w = wintab; -+ register real *out1 = o1; -+ register real *ts = tsbuf; -+ -+ real ta33,ta66,tb33,tb66; -+ -+ ta33 = in[2*3+0] * c[3]; -+ ta66 = in[2*6+0] * c[6]; -+ tb33 = in[2*3+1] * c[3]; -+ tb66 = in[2*6+1] * c[6]; -+ -+ { -+ real tmp1a,tmp2a,tmp1b,tmp2b; -+ tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7]; -+ tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7]; -+ tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8]; -+ tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8]; -+ -+ MACRO1(0); -+ MACRO2(8); -+ } -+ -+ { -+ real tmp1a,tmp2a,tmp1b,tmp2b; -+ tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3]; -+ tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3]; -+ tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0]; -+ tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1]; -+ -+ MACRO1(1); -+ MACRO2(7); -+ } -+ -+ { -+ real tmp1a,tmp2a,tmp1b,tmp2b; -+ tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1]; -+ tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1]; -+ tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4]; -+ tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4]; -+ -+ MACRO1(2); -+ MACRO2(6); -+ } -+ -+ { -+ real tmp1a,tmp2a,tmp1b,tmp2b; -+ tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5]; -+ tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5]; -+ tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2]; -+ tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2]; -+ -+ MACRO1(3); -+ MACRO2(5); -+ } -+ -+ { -+ real sum0,sum1; -+ sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0]; -+ sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4]; -+ MACRO0(4); -+ } -+ } -+ -+ } -+} -+ -+/* -+ * new DCT12 -+ */ -+static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts) -+{ -+#define DCT12_PART1 \ -+ in5 = in[5*3]; \ -+ in5 += (in4 = in[4*3]); \ -+ in4 += (in3 = in[3*3]); \ -+ in3 += (in2 = in[2*3]); \ -+ in2 += (in1 = in[1*3]); \ -+ in1 += (in0 = in[0*3]); \ -+ \ -+ in5 += in3; in3 += in1; \ -+ \ -+ in2 *= COS6_1; \ -+ in3 *= COS6_1; \ -+ -+#define DCT12_PART2 \ -+ in0 += in4 * COS6_2; \ -+ \ -+ in4 = in0 + in2; \ -+ in0 -= in2; \ -+ \ -+ in1 += in5 * COS6_2; \ -+ \ -+ in5 = (in1 + in3) * tfcos12[0]; \ -+ in1 = (in1 - in3) * tfcos12[2]; \ -+ \ -+ in3 = in4 + in5; \ -+ in4 -= in5; \ -+ \ -+ in2 = in0 + in1; \ -+ in0 -= in1; -+ -+ -+ { -+ real in0,in1,in2,in3,in4,in5; -+ register real *out1 = rawout1; -+ ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2]; -+ ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5]; -+ -+ DCT12_PART1 -+ -+ { -+ real tmp0,tmp1 = (in0 - in4); -+ { -+ real tmp2 = (in1 - in5) * tfcos12[1]; -+ tmp0 = tmp1 + tmp2; -+ tmp1 -= tmp2; -+ } -+ ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1]; -+ ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1]; -+ ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1]; -+ ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1]; -+ } -+ -+ DCT12_PART2 -+ -+ ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0]; -+ ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0]; -+ ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2]; -+ ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2]; -+ -+ ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0]; -+ ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0]; -+ ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2]; -+ ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2]; -+ } -+ -+ in++; -+ -+ { -+ real in0,in1,in2,in3,in4,in5; -+ register real *out2 = rawout2; -+ -+ DCT12_PART1 -+ -+ { -+ real tmp0,tmp1 = (in0 - in4); -+ { -+ real tmp2 = (in1 - in5) * tfcos12[1]; -+ tmp0 = tmp1 + tmp2; -+ tmp1 -= tmp2; -+ } -+ out2[5-1] = tmp0 * wi[11-1]; -+ out2[0+1] = tmp0 * wi[6+1]; -+ ts[(12+1)*SBLIMIT] += tmp1 * wi[1]; -+ ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1]; -+ } -+ -+ DCT12_PART2 -+ -+ out2[5-0] = in2 * wi[11-0]; -+ out2[0+0] = in2 * wi[6+0]; -+ out2[0+2] = in3 * wi[6+2]; -+ out2[5-2] = in3 * wi[11-2]; -+ -+ ts[(12+0)*SBLIMIT] += in0 * wi[0]; -+ ts[(17-0)*SBLIMIT] += in0 * wi[5-0]; -+ ts[(12+2)*SBLIMIT] += in4 * wi[2]; -+ ts[(17-2)*SBLIMIT] += in4 * wi[5-2]; -+ } -+ -+ in++; -+ -+ { -+ real in0,in1,in2,in3,in4,in5; -+ register real *out2 = rawout2; -+ out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0; -+ -+ DCT12_PART1 -+ -+ { -+ real tmp0,tmp1 = (in0 - in4); -+ { -+ real tmp2 = (in1 - in5) * tfcos12[1]; -+ tmp0 = tmp1 + tmp2; -+ tmp1 -= tmp2; -+ } -+ out2[11-1] = tmp0 * wi[11-1]; -+ out2[6 +1] = tmp0 * wi[6+1]; -+ out2[0+1] += tmp1 * wi[1]; -+ out2[5-1] += tmp1 * wi[5-1]; -+ } -+ -+ DCT12_PART2 -+ -+ out2[11-0] = in2 * wi[11-0]; -+ out2[6 +0] = in2 * wi[6+0]; -+ out2[6 +2] = in3 * wi[6+2]; -+ out2[11-2] = in3 * wi[11-2]; -+ -+ out2[0+0] += in0 * wi[0]; -+ out2[5-0] += in0 * wi[5-0]; -+ out2[0+2] += in4 * wi[2]; -+ out2[5-2] += in4 * wi[5-2]; -+ } -+} -+ -+/* -+ * III_hybrid -+ */ -+static void III_hybrid(struct mpstr *mp, real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT], -+ int ch,struct gr_info_s *gr_info) -+{ -+ real *tspnt = (real *) tsOut; -+ real (*block)[2][SBLIMIT*SSLIMIT] = mp->hybrid_block; -+ int *blc = mp->hybrid_blc; -+ real *rawout1,*rawout2; -+ int bt; -+ int sb = 0; -+ -+ { -+ int b = blc[ch]; -+ rawout1=block[b][ch]; -+ b=-b+1; -+ rawout2=block[b][ch]; -+ blc[ch] = b; -+ } -+ -+ -+ if(gr_info->mixed_block_flag) { -+ sb = 2; -+ dct36(fsIn[0],rawout1,rawout2,win[0],tspnt); -+ dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1); -+ rawout1 += 36; rawout2 += 36; tspnt += 2; -+ } -+ -+ bt = gr_info->block_type; -+ if(bt == 2) { -+ for (; sbmaxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) { -+ dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt); -+ dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1); -+ } -+ } -+ else { -+ for (; sbmaxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) { -+ dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt); -+ dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1); -+ } -+ } -+ -+ for(;sbfr); -+ stereo = fr->stereo; -+ single = fr->single; -+ sfreq = fr->sampling_frequency; -+ -+ -+ -+ if(stereo == 1) { /* stream is mono */ -+ stereo1 = 1; -+ single = 0; -+ } -+ else if(single >= 0) /* stream is stereo, but force to mono */ -+ stereo1 = 1; -+ else -+ stereo1 = 2; -+ -+ if(fr->mode == MPG_MD_JOINT_STEREO) { -+ ms_stereo = fr->mode_ext & 0x2; -+ i_stereo = fr->mode_ext & 0x1; -+ } -+ else -+ ms_stereo = i_stereo = 0; -+ -+ if(fr->lsf) { -+ granules = 1; -+ if (III_get_side_info_2(mp, &sideinfo,stereo,ms_stereo,sfreq,single)) -+ return (MP3_ERR); -+ } -+ else { -+ granules = 2; -+#ifdef MPEG1 -+ if ( III_get_side_info_1(mp, &sideinfo,stereo,ms_stereo,sfreq,single)) -+ return (MP3_ERR); -+ -+#else -+ ast_log(LOG_WARNING,"Not supported\n"); -+#endif -+ } -+ -+ if(set_pointer(mp, sideinfo.main_data_begin) == MP3_ERR) -+ return 0; -+ -+ for (gr=0;grlsf) -+ part2bits = III_get_scale_factors_2(mp, scalefacs,gr_info,0); -+ else { -+#ifdef MPEG1 -+ part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info); -+#else -+ ast_log(LOG_WARNING,"Not supported\n"); -+#endif -+ } -+ if(III_dequantize_sample(mp, hybridIn[0], scalefacs,gr_info,sfreq,part2bits)) -+ return (MP3_ERR); -+ } -+ if(stereo == 2) { -+ struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]); -+ long part2bits; -+ if(fr->lsf) -+ part2bits = III_get_scale_factors_2(mp, scalefacs,gr_info,i_stereo); -+ else { -+#ifdef MPEG1 -+ part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info); -+#else -+ ast_log(LOG_WARNING,"Not supported\n"); -+#endif -+ } -+ -+ if(III_dequantize_sample(mp, hybridIn[1],scalefacs,gr_info,sfreq,part2bits)) -+ return (MP3_ERR); -+ -+ if(ms_stereo) { -+ int i; -+ for(i=0;ilsf); -+ -+ if(ms_stereo || i_stereo || (single == 3) ) { -+ if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb) -+ sideinfo.ch[0].gr[gr].maxb = gr_info->maxb; -+ else -+ gr_info->maxb = sideinfo.ch[0].gr[gr].maxb; -+ } -+ -+ switch(single) { -+ case 3: -+ { -+ register int i; -+ register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; -+ for(i=0;imaxb;i++,in0++) -+ *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ -+ } -+ break; -+ case 1: -+ { -+ register int i; -+ register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1]; -+ for(i=0;imaxb;i++) -+ *in0++ = *in1++; -+ } -+ break; -+ } -+ } -+ -+ for(ch=0;ch= 0) { -+ clip += synth_ntom_mono(mp,hybridOut[0][ss],pcm_sample,pcm_point); -+ } -+ else { -+ int p1 = *pcm_point; -+ clip += synth_ntom(mp,hybridOut[0][ss],0,pcm_sample,&p1); -+ clip += synth_ntom(mp,hybridOut[1][ss],1,pcm_sample,pcm_point); -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+ ---- /dev/null -+++ b/addons/mp3/Makefile -@@ -0,0 +1,24 @@ -+MP3OBJS=common.o dct64_i386.o decode_ntom.o layer3.o tabinit.o interface.o -+ -+ifeq ($(OSARCH),FreeBSD) -+OSVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk) -+CFLAGS+=$(if $(OSVERSION)<500016,-D_THREAD_SAFE) -+LIBS+=$(if $(OSVERSION)<502102,-lc_r,-pthread) -+INCLUDE+=-I/usr/local/include -+CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi) -+endif # FreeBSD -+ -+ifeq ($(OSARCH),NetBSD) -+CFLAGS+=-pthread -+INCLUDE+=-I/usr/local/include -+endif -+ -+ifeq ($(OSARCH),OpenBSD) -+CFLAGS+=-pthread -+endif -+ -+all: $(MP3OBJS) -+ -+clean: -+ rm -f *.o *.so *~ -+ rm -f .*.o.d ---- /dev/null -+++ b/addons/mp3/mpg123.h -@@ -0,0 +1,132 @@ -+#include -+#include -+#include -+ -+#ifndef WIN32 -+#include -+#include -+#endif -+ -+#include -+ -+#ifdef _WIN32 -+# undef WIN32 -+# define WIN32 -+ -+# define M_PI 3.14159265358979323846 -+# define M_SQRT2 1.41421356237309504880 -+# define REAL_IS_FLOAT -+# define NEW_DCT9 -+ -+# define random rand -+# define srandom srand -+ -+#endif -+ -+#ifdef REAL_IS_FLOAT -+# define real float -+#elif defined(REAL_IS_LONG_DOUBLE) -+# define real long double -+#else -+# define real double -+#endif -+ -+#ifdef __GNUC__ -+#define INLINE inline -+#else -+#define INLINE -+#endif -+ -+/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */ -+#define AUDIOBUFSIZE 16384 -+ -+#define FALSE 0 -+#define TRUE 1 -+ -+#define SBLIMIT 32 -+#define SSLIMIT 18 -+ -+#define MPG_MD_STEREO 0 -+#define MPG_MD_JOINT_STEREO 1 -+#define MPG_MD_DUAL_CHANNEL 2 -+#define MPG_MD_MONO 3 -+ -+#define MAXFRAMESIZE 1792 -+ -+ -+/* Pre Shift fo 16 to 8 bit converter table */ -+#define AUSHIFT (3) -+ -+struct frame { -+ int stereo; -+ int jsbound; -+ int single; -+ int lsf; -+ int mpeg25; -+ int header_change; -+ int lay; -+ int error_protection; -+ int bitrate_index; -+ int sampling_frequency; -+ int padding; -+ int extension; -+ int mode; -+ int mode_ext; -+ int copyright; -+ int original; -+ int emphasis; -+ int framesize; /* computed framesize */ -+}; -+ -+struct parameter { -+ int quiet; /* shut up! */ -+ int tryresync; /* resync stream after error */ -+ int verbose; /* verbose level */ -+ int checkrange; -+}; -+ -+extern int decode_header(struct frame *fr,unsigned long newhead); -+ -+ -+ -+struct gr_info_s { -+ int scfsi; -+ unsigned part2_3_length; -+ unsigned big_values; -+ unsigned scalefac_compress; -+ unsigned block_type; -+ unsigned mixed_block_flag; -+ unsigned table_select[3]; -+ unsigned subblock_gain[3]; -+ unsigned maxband[3]; -+ unsigned maxbandl; -+ unsigned maxb; -+ unsigned region1start; -+ unsigned region2start; -+ unsigned preflag; -+ unsigned scalefac_scale; -+ unsigned count1table_select; -+ real *full_gain[3]; -+ real *pow2gain; -+}; -+ -+struct III_sideinfo -+{ -+ unsigned main_data_begin; -+ unsigned private_bits; -+ struct { -+ struct gr_info_s gr[2]; -+ } ch[2]; -+}; -+ -+struct pcm_workingsample -+{ -+ int bitindex; -+ unsigned char *wordpointer; -+}; -+ -+ -+extern long freqs[9]; -+extern struct parameter param; -+extern real *pnts[5]; -+ ---- /dev/null -+++ b/addons/mp3/mpglib.h -@@ -0,0 +1,75 @@ -+ -+struct buf { -+ unsigned char *pnt; -+ long size; -+ long pos; -+ struct buf *next; -+ struct buf *prev; -+}; -+ -+struct framebuf { -+ struct buf *buf; -+ long pos; -+ struct frame *next; -+ struct frame *prev; -+}; -+ -+struct mpstr { -+ struct buf *head,*tail; -+ int bsize; -+ int framesize; -+ int fsizeold; -+ struct frame fr; -+ unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */ -+ real hybrid_block[2][2][SBLIMIT*SSLIMIT]; -+ int hybrid_blc[2]; -+ unsigned long header; -+ int bsnum; -+ real synth_buffs[2][2][0x110]; -+ int synth_bo; -+ long outscale; /* volume control default value 32768 */ -+ long outsamplerate; /* raw output rate default same as mp3 sample rate*/ -+ struct pcm_workingsample worksample; /* keep the state of the working sample for threads */ -+ int initmp3; /* flag for first initialisation */ -+ int longLimit[9][23]; /*sample limits re setting volume */ -+ int shortLimit[9][14]; -+ real decwin[512+32]; /* scale table */ -+ -+ }; -+ -+#define BOOL int -+ -+#define MP3_ERR -1 -+#define MP3_OK 0 -+#define MP3_NEED_MORE 1 -+ -+ -+void InitMP3Constants(void); -+BOOL InitMP3(struct mpstr *mp, long outscale); -+int decodeMP3(struct mpstr *mp,char *inmemory,int inmemsize, -+ char *outmemory,int outmemsize,int *done); -+void ExitMP3(struct mpstr *mp); -+ -+extern int synth_ntom_set_step(long,long); -+extern int synth_ntom(struct mpstr *mp, real *bandPtr,int channel,unsigned char *out,int *pnt); -+extern int synth_ntom_mono (struct mpstr *mp, real *bandPtr,unsigned char *samples,int *pnt); -+extern int synth_ntom_8bit (real *,int,unsigned char *,int *); -+extern int synth_ntom_mono2stereo (real *,unsigned char *,int *); -+extern int synth_ntom_8bit_mono (real *,unsigned char *,int *); -+extern int synth_ntom_8bit_mono2stereo (real *,unsigned char *,int *); -+ -+extern void init_layer3_sample_limits(struct mpstr *mp, int down_sample_sblimit); -+extern void init_layer3_const(void); -+extern int do_layer3(struct mpstr *mp,unsigned char *,int *); -+ -+extern void make_decode_tables_scale(struct mpstr *mp, long scaleval); -+extern void make_decode_tables_const(void); -+extern void make_conv16to8_table(int); -+ -+extern void dct64(real *,real *,real *); -+ -+extern unsigned int get1bit(struct mpstr *mp); -+extern unsigned int getbits(struct mpstr *mp, int); -+extern unsigned int getbits_fast(struct mpstr *mp, int); -+extern int set_pointer(struct mpstr *mp, long backstep); -+ ---- /dev/null -+++ b/addons/mp3/MPGLIB_README -@@ -0,0 +1,39 @@ -+MP3 library -+----------- -+Version 0.2 -+ -+This decoder is a 'light' version (thrown out all unnecessay parts) -+from the mpg123 package. I made this for a company. -+ -+Currently only Layer3 is enabled to save some space. Layer1,2 isn't -+tested at all. The interface will not change significantly. -+A backport to the mpg123 package is planed. -+ -+comiled and tested only on Solaris 2.6 -+main.c contains a simple demo application for library. -+ -+COPYING: you may use this source under GPL terms! -+ -+PLEASE NOTE: This software may contain patented alogrithm (at least -+ patented in some countries). It may be not allowed to sell/use products -+ based on this source code in these countries. Check this out first! -+ -+COPYRIGHT of MP3 music: -+ Please note, that the duplicating of copyrighted music without explicit -+ permission violates the rights of the owner. -+ -+SENDING PATCHES: -+ Maybe I change the copyright policy (ie some kind of more free BSD licencse). -+ Please consider this when sending patches/changes. -+ I also want to have the freedom to sell the code to companies that -+ can not use the code under GPL. So, if you send me significant patches, -+ I need your explicit permission to do this. Of course, there will also -+ be the GPLed open source version of the 100% same code. -+ For the case you cannot accept this: the code is GPL, it's your freedom -+ to distribute your changes again under GPL. -+ -+FEEDBACK: -+ I'm interessted to here from you, when you use this package as part -+ of another project. -+ -+ ---- /dev/null -+++ b/addons/mp3/MPGLIB_TODO -@@ -0,0 +1,2 @@ -+ -+apply 'VBR' bugfix ---- /dev/null -+++ b/addons/mp3/README -@@ -0,0 +1 @@ -+ ---- /dev/null -+++ b/addons/mp3/tabinit.c -@@ -0,0 +1,81 @@ -+ -+#include -+ -+#include "mpg123.h" -+#include "mpglib.h" -+ -+static real cos64[16],cos32[8],cos16[4],cos8[2],cos4[1]; -+real *pnts[] = { cos64,cos32,cos16,cos8,cos4 }; -+ -+static long intwinbase[] = { -+ 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, -+ -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, -+ -8, -9, -10, -11, -13, -14, -16, -17, -19, -21, -+ -24, -26, -29, -31, -35, -38, -41, -45, -49, -53, -+ -58, -63, -68, -73, -79, -85, -91, -97, -104, -111, -+ -117, -125, -132, -139, -147, -154, -161, -169, -176, -183, -+ -190, -196, -202, -208, -213, -218, -222, -225, -227, -228, -+ -228, -227, -224, -221, -215, -208, -200, -189, -177, -163, -+ -146, -127, -106, -83, -57, -29, 2, 36, 72, 111, -+ 153, 197, 244, 294, 347, 401, 459, 519, 581, 645, -+ 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356, -+ 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962, -+ 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000, -+ 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970, -+ 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388, -+ -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, -+ -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, -+ -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, -+ -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, -+ -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082, -+ -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455, -+ 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289, -+ 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617, -+ 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684, -+ 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835, -+ 73415, 73908, 74313, 74630, 74856, 74992, 75038 }; -+ -+void make_decode_tables_const(void) -+{ -+ int i,k,kr,divv; -+ real *costab; -+ -+ for(i=0;i<5;i++) -+ { -+ kr=0x10>>i; divv=0x40>>i; -+ costab = pnts[i]; -+ for(k=0;kdecwin; -+ scaleval = -scaleval; -+ for(i=0,j=0;i<256;i++,j++,table+=32) -+ { -+ if(table < (mp->decwin)+512+16) -+ table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval; -+ if(i % 32 == 31) -+ table -= 1023; -+ if(i % 64 == 63) -+ scaleval = - scaleval; -+ } -+ -+ for( /* i=256 */ ;i<512;i++,j--,table+=32) -+ { -+ if(table < (mp->decwin)+512+16) -+ table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval; -+ if(i % 32 == 31) -+ table -= 1023; -+ if(i % 64 == 63) -+ scaleval = - scaleval; -+ } -+} -+ -+ diff --git a/debian/patches/no_native_arch.patch b/debian/patches/no_native_arch.patch deleted file mode 100644 index 923e13b..0000000 --- a/debian/patches/no_native_arch.patch +++ /dev/null @@ -1,18 +0,0 @@ -From: Tzafrir Cohen -Subject: disable building asterisk with -march=native -Bug-Debian: https://bugs.debian.org/842917 -Forwarded: no - -Don't add -march=native to standard CFLAGS. We need a generic binary. - ---- a/build_tools/cflags.xml -+++ b/build_tools/cflags.xml -@@ -134,7 +134,7 @@ - - - core -- yes -+ no - native_arch - - diff --git a/debian/patches/reenable b/debian/patches/reenable deleted file mode 100644 index fc430c7..0000000 --- a/debian/patches/reenable +++ /dev/null @@ -1,25 +0,0 @@ -Description: reenable some drivers -Author: Tzafrir Cohen -Last-Update: 2016-03-19 - ---- a/channels/chan_vpb.cc -+++ b/channels/chan_vpb.cc -@@ -49,7 +49,7 @@ - - /*** MODULEINFO - vpb -- no -+ yes - deprecated - ***/ - ---- a/channels/chan_mgcp.c -+++ b/channels/chan_mgcp.c -@@ -34,7 +34,6 @@ - */ - - /*** MODULEINFO -- res_pktccops - extended - ***/ - diff --git a/debian/patches/series b/debian/patches/series deleted file mode 100644 index 75be263..0000000 --- a/debian/patches/series +++ /dev/null @@ -1,40 +0,0 @@ -# upstream fixes -hack-multiple-app-voicemail -# Not used ATM. See comment in patch: -#make-clean-fixes -# -#h323-no-deps-on-asterisk -#h323-workaround-openh323-segfault - -astgenkey-security - -# bugfixes on top of everything -sound_files -#h323-extra-target -mpglib -enable_addons - -ilbc_disable -astdatadir - -reenable -no_native_arch.patch -smsq_enable.patch -aelparse_enable.patch -systemd.patch -test_framework.patch - -# vp8.patch -amr.patch - -ffmpeg-detection.patch -ffmpeg-includes.patch - -build-reproducibly -autoreconf-pjproject - -# AST-2019-002 / CVE-2019-12827 -AST-2019-002.patch -# AST-2019-003 / CVE-2019-13161 -AST-2019-003.patch -apply-patch-from-eta.patch diff --git a/debian/patches/smsq_enable.patch b/debian/patches/smsq_enable.patch deleted file mode 100644 index e7179a6..0000000 --- a/debian/patches/smsq_enable.patch +++ /dev/null @@ -1,17 +0,0 @@ -Description: Enable the smsq application. -Author: Frederic Van Espen -Forwarded: no -Bug-Debian: https://bugs.debian.org/738588 -Last-Update: 2016-03-19 - ---- a/utils/utils.xml -+++ b/utils/utils.xml -@@ -37,7 +37,7 @@ - deprecated - - -- no -+ yes - popt - extended - diff --git a/debian/patches/sound_files b/debian/patches/sound_files deleted file mode 100644 index 966ecef..0000000 --- a/debian/patches/sound_files +++ /dev/null @@ -1,31 +0,0 @@ -Description: Avoid downloading extra sound files - Asterisk configures several sound files to be installed that are not - included in the distribution tarball. Those files are downloaded by the - 'install' target. - . - The exact files to be downloaded is configurable. Here we change the - default to avoid downloading any. We believe those should be part of a - separate source package (as they rarely change, and have their own - versioning). -Author: Tzafrir Cohen -Forwarded: no -Last-Update: 2016-04-02 - ---- a/sounds/sounds.xml -+++ b/sounds/sounds.xml -@@ -10,7 +10,6 @@ - - - core -- yes - - - core -@@ -246,7 +245,6 @@ - - - -- yes - core - - diff --git a/debian/patches/systemd.patch b/debian/patches/systemd.patch deleted file mode 100644 index 65a6443..0000000 --- a/debian/patches/systemd.patch +++ /dev/null @@ -1,144 +0,0 @@ -Description: A systemd service - Do away with safe_asterisk. But try very hard to let live_ast work with - it. -Author: Tzafrir Cohen -Last-Update: 2016-04-02 - ---- a/contrib/scripts/live_ast -+++ b/contrib/scripts/live_ast -@@ -175,6 +175,43 @@ - | sed -e '/^#* \(Begin\|End\) Samples/d' >"$LIVE_CONF" - } - -+# (re?)generate a unit file that could be installed on the system to use -+# this copy of Asterisk. -+gen_ast_live_service() { -+ local service_file="$BASE_DIR/asterisk-live.service" -+ local included_dir='lib' -+ local included_dir_remmed='etc' -+ if [ -f /etc/systemd/system/asterisk.service ]; then -+ included_dir='etc' -+ included_dir_remmed='lib' -+ fi -+ local varlibdir=`awk '/astvarlibdir/ {print $3}' "$AST_CONF" | head -n1` -+ cat <"$service_file" -+# This file is based on your existing asterisk systemd service unit, and -+# overrides some fields. If you have an overriding unit in /etc, you -+# need to include it, rather than the one in /lib: -+.include /$included_dir/systemd/system/asterisk.service -+#.include /$included_dir_remmed/systemd/system/asterisk.service -+ -+# This file is not installed. If you want to use it, you need to copy it -+# to /etc/systemd/system and run 'systemctl daemon-reload'. You'll then -+# need to be able to start this manually (note that it will not be -+# enabled and thus the standard bash completion will not complete it). -+# If you have multiple live asterisk instances you want to run on the -+# same system, be sure to give each one a unique name. -+ -+[Unit] -+Description = Asterisk PBX (Live Asterisk) -+ -+# Note: if you changed the parameters passed in the command-line (ExecStart) -+# be sure to copy them over here as well. -+[Service] -+ExecStart = $BASE_DIR/asterisk g -f -p -U asterisk -+ExecReload = $BASE_DIR/asterisk -rx 'core reload' -+WorkingDirectory = $varlibdir -+EOF -+} -+ - # (re?)generate the ./live/asterisk wrapper script - gen_live_asterisk() { - cat <"$BASE_DIR/asterisk" -@@ -244,6 +281,7 @@ - chmod +x "$BASE_DIR/asterisk" - # Generate a sample config file for live_ast itself: - gen_live_conf -+ gen_ast_live_service - ;; - conf-file) - # Just regenerate live.conf from the sample if it does not already exist: ---- /dev/null -+++ b/contrib/scripts/asterisk_cleanup -@@ -0,0 +1,18 @@ -+#!/bin/sh -+ -+# asterisk_cleanup: A script intended to optionally be run when Asterisk -+# has exited. This example script is used to move core files. -+ -+VARLIBDIR=${VARLIBDIR:/var/lib/asterisk} -+RUNDIR=${VARRUNDIR:/var/run/asterisk} -+DUMPDROP=${DUMPDROP:-/var/spool/asterisk/cores} -+ASTPIDFILE=${ASTVARRUNDIR}/asterisk.pid -+PID=`cat ${ASTPIDFILE}` -+DATE=`date "+%Y-%m-%dT%H:%M:%S%z"` -+if test -f ${RUNDIR}/core.${PID} ; then -+ mkdir -p "${DUMPDROP}" -+ mv ${RUNDIR}/core.${PID} ${DUMPDROP}/core.`hostname`-$DATE & -+elif test -f ${RUNDIR}/core ; then -+ mkdir -p "${DUMPDROP}" -+ mv ${RUNDIR}/core ${DUMPDROP}/core.`hostname`-$DATE & -+fi ---- /dev/null -+++ b/contrib/asterisk.service -@@ -0,0 +1,49 @@ -+[Unit] -+Description=Asterisk PBX -+Documentation=man:asterisk(8) -+Wants=network-online.target -+After=network-online.target -+ -+[Service] -+Type=notify -+ExecStart=__ASTERISK_SBIN_DIR__/asterisk -g -f -p -U asterisk -+ExecReload=__ASTERISK_SBIN_DIR__/asterisk -rx 'core reload' -+Restart=on-failure -+RestartSec=1 -+WorkingDirectory=__ASTERISK_VARLIB_DIR__ -+ -+# Extra settings: -+# If you want to set them, you can add them to a file in the directory -+# /lib/systemd/system/asterisk.service.d/ with the extension .conf. -+# Example content: -+#[Service] -+# -+# and following those two lines add directives or override existing -+# directives. Some extra directives that may be useful: -+ -+# You can run a script to clean up after asterisk. An example script is -+# included in contrib/scripts/asterisk_cleanup. -+#ExecStopPost=/path/to/script -+ -+#Nice=0 -+#UMask=0002 -+#LimitCORE=infinity -+#LimitNOFILE= -+ -+# safe_asterisk runs Asterisk in a virtual console. This allows easy -+# access to the asterisk command-line without logging it. on the other -+# hand, it allows anyone with physical access to the console full access -+# to Asterisk. To enable this console, unrem the following lines and add -+# '-c' to the ExecStart line above: -+#TTYPath=/dev/tty9 -+#StandardInput=tty -+#StandardOutput=tty -+#StandardError=tty -+ -+# For more information on what these parameters mean see: -+# -+# http://0pointer.de/public/systemd-man/systemd.service.html -+# http://0pointer.de/public/systemd-man/systemd.exec.html -+ -+[Install] -+WantedBy=multi-user.target ---- a/Makefile -+++ b/Makefile -@@ -825,6 +825,8 @@ - rm -f contrib/scripts/asterisk.logrotate.tmp - - config: -+ $(INSTALL) -d $(DESTDIR)/lib/systemd/system -+ ./build_tools/install_subst -d contrib/asterisk.service $(DESTDIR)/lib/systemd/system/asterisk.service - @if [ -f /etc/redhat-release -o -f /etc/fedora-release ]; then \ - ./build_tools/install_subst contrib/init.d/rc.redhat.asterisk "$(DESTDIR)/etc/rc.d/init.d/asterisk"; \ - if [ ! -f "$(DESTDIR)/etc/sysconfig/asterisk" ] ; then \ diff --git a/debian/patches/test_framework.patch b/debian/patches/test_framework.patch deleted file mode 100644 index 345cbb7..0000000 --- a/debian/patches/test_framework.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Tzafrir Cohen -Description: Enable the test framework -Last-Update: 2016-12-23 -Forwarded: no - -Test modules are normally only enabled in development mode. This patch -enables them without the need to enable dev-mode. - -The modules provide simple tests. Try: asterisk -rx 'test execute all' - -Those modules should not be confused with the tests in the -asterisk-testsute package. - ---- a/build_tools/cflags-devmode.xml -+++ b/build_tools/cflags-devmode.xml -@@ -24,7 +24,4 @@ - - extended - -- -- extended -- - ---- a/build_tools/cflags.xml -+++ b/build_tools/cflags.xml -@@ -101,4 +101,8 @@ - no - native_arch - -+ -+ yes -+ extended -+ - diff --git a/debian/patches/vp8.patch b/debian/patches/vp8.patch deleted file mode 100644 index b7271da..0000000 --- a/debian/patches/vp8.patch +++ /dev/null @@ -1,213 +0,0 @@ -Description: Add VP8 format module supporting read/write to file -Origin: https://github.com/seanbright/asterisk-opus -Author: Lorenzo Miniero -Forwarded: yes -Bug-Debian: http://bugs.debian.org/786972 -Last-Update: 2016-03-19 - ---- /dev/null -+++ b/formats/format_vp8.c -@@ -0,0 +1,203 @@ -+/* -+ * Asterisk -- An open source telephony toolkit. -+ * -+ * Copyright (C) 2014, Lorenzo Miniero -+ * -+ * Lorenzo Miniero -+ * -+ * See http://www.asterisk.org for more information about -+ * the Asterisk project. Please do not directly contact -+ * any of the maintainers of this project for assistance; -+ * the project provides a web site, mailing lists and IRC -+ * channels for your use. -+ * -+ * This program is free software, distributed under the terms of -+ * the GNU General Public License Version 2. See the LICENSE file -+ * at the top of the source tree. -+ */ -+ -+/*! \file -+ * -+ * \brief Save to raw, headerless VP8 data. -+ * -+ * \author Lorenzo Miniero -+ * -+ * \note Basically a "clone" of the H.264 passthrough format -+ * -+ * \arg File name extension: VP8 -+ * \ingroup formats -+ * \arg See \ref AstVideo -+ */ -+ -+/*** MODULEINFO -+ core -+***/ -+ -+#include "asterisk.h" -+ -+ASTERISK_FILE_VERSION(__FILE__, "$Revision: $") -+ -+#include "asterisk/mod_format.h" -+#include "asterisk/module.h" -+#include "asterisk/endian.h" -+#include "asterisk/format_cache.h" -+ -+/* VP8 passthrough */ -+#define FRAME_ENDED 0x8000 -+ -+#define BUF_SIZE 4096 -+struct vp8_desc { -+ unsigned int lastts; -+}; -+ -+static int vp8_open(struct ast_filestream *s) -+{ -+ unsigned int ts; -+ -+ if (fread(&ts, 1, sizeof(ts), s->f) < sizeof(ts)) { -+ ast_log(LOG_WARNING, "Empty file!\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static struct ast_frame *vp8_read(struct ast_filestream *s, int *whennext) -+{ -+ int res; -+ int mark = 0; -+ unsigned short len; -+ unsigned int ts; -+ struct vp8_desc *fs = (struct vp8_desc *) s->_private; -+ -+ /* Send a frame from the file to the appropriate channel */ -+ if ((res = fread(&len, 1, sizeof(len), s->f)) < 1) { -+ return NULL; -+ } -+ -+ len = ntohs(len); -+ mark = (len & FRAME_ENDED) ? 1 : 0; -+ len &= 0x7fff; -+ if (len > BUF_SIZE) { -+ ast_log(LOG_WARNING, "Length %d is too long\n", len); -+ len = BUF_SIZE; /* XXX truncate */ -+ } -+ s->fr.mallocd = 0; -+ AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, len); -+ if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) { -+ if (res) { -+ ast_log(LOG_WARNING, "Short read (%d of %d) (%s)!\n", res, len, strerror(errno)); -+ } -+ return NULL; -+ } -+ s->fr.samples = fs->lastts; -+ s->fr.datalen = len; -+ s->fr.subclass.frame_ending = mark; -+ s->fr.delivery.tv_sec = 0; -+ s->fr.delivery.tv_usec = 0; -+ if ((res = fread(&ts, 1, sizeof(ts), s->f)) == sizeof(ts)) { -+ fs->lastts = ntohl(ts); -+ *whennext = fs->lastts * 4/45; -+ } else { -+ *whennext = 0; -+ } -+ return &s->fr; -+} -+ -+static int vp8_write(struct ast_filestream *s, struct ast_frame *f) -+{ -+ int res; -+ unsigned int ts; -+ unsigned short len; -+ int mark; -+ -+ if (f->frametype != AST_FRAME_VIDEO) { -+ ast_log(LOG_WARNING, "Asked to write non-video frame!\n"); -+ return -1; -+ } -+ -+ mark = f->subclass.frame_ending ? FRAME_ENDED : 0; -+ ts = htonl(f->samples); -+ if ((res = fwrite(&ts, 1, sizeof(ts), s->f)) != sizeof(ts)) { -+ ast_log(LOG_WARNING, "Bad write (%d/4): %s\n", res, strerror(errno)); -+ return -1; -+ } -+ -+ len = htons(f->datalen | mark); -+ if ((res = fwrite(&len, 1, sizeof(len), s->f)) != sizeof(len)) { -+ ast_log(LOG_WARNING, "Bad write (%d/2): %s\n", res, strerror(errno)); -+ return -1; -+ } -+ -+ if ((res = fwrite(f->data.ptr, 1, f->datalen, s->f)) != f->datalen) { -+ ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n", res, f->datalen, strerror(errno)); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int vp8_seek(struct ast_filestream *fs, off_t sample_offset, int whence) -+{ -+ /* No way Jose */ -+ return -1; -+} -+ -+static int vp8_trunc(struct ast_filestream *fs) -+{ -+ int fd; -+ off_t cur; -+ -+ if ((fd = fileno(fs->f)) < 0) { -+ ast_log(LOG_WARNING, "Unable to determine file descriptor for VP8 filestream %p: %s\n", fs, strerror(errno)); -+ return -1; -+ } -+ -+ if ((cur = ftello(fs->f)) < 0) { -+ ast_log(LOG_WARNING, "Unable to determine current position in VP8 filestream %p: %s\n", fs, strerror(errno)); -+ return -1; -+ } -+ -+ /* Truncate file to current length */ -+ return ftruncate(fd, cur); -+} -+ -+static off_t vp8_tell(struct ast_filestream *fs) -+{ -+ off_t offset = ftell(fs->f); -+ return offset; /* XXX totally bogus, needs fixing */ -+} -+ -+static struct ast_format_def vp8_f = { -+ .name = "VP8", -+ .exts = "vp8", -+ .open = vp8_open, -+ .write = vp8_write, -+ .seek = vp8_seek, -+ .trunc = vp8_trunc, -+ .tell = vp8_tell, -+ .read = vp8_read, -+ .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, -+ .desc_size = sizeof(struct vp8_desc), -+}; -+ -+static int load_module(void) -+{ -+ vp8_f.format = ast_format_vp8; -+ if (ast_format_def_register(&vp8_f)) { -+ return AST_MODULE_LOAD_FAILURE; -+ } -+ -+ return AST_MODULE_LOAD_SUCCESS; -+} -+ -+static int unload_module(void) -+{ -+ return ast_format_def_unregister(vp8_f.name); -+} -+ -+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw VP8 data", -+ .load = load_module, -+ .unload = unload_module, -+ .load_pri = AST_MODPRI_APP_DEPEND -+ ); diff --git a/debian/pjproject_2.8~dfsg.orig.tar.bz2 b/debian/pjproject_2.8~dfsg.orig.tar.bz2 deleted file mode 100644 index ab39ec5c88e501d4c548d0037ecdb6aa2464eae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3632716 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ðld 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

GF(WAg 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