mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Merged revisions 280742 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r280742 | russell | 2010-08-03 13:48:45 -0500 (Tue, 03 Aug 2010) | 4 lines Remove the MP3 decoder source code and replace it with a small shell script. Review: https://reviewboard.asterisk.org/r/836/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@280743 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -34,12 +34,32 @@ ALL_C_MODS:=app_mysql \ | ||||
|             format_mp3 \ | ||||
|             res_config_mysql | ||||
|  | ||||
| all: _all | ||||
| all: check_mp3 _all | ||||
|  | ||||
| check_mp3: | ||||
| ifeq ($(filter format_mp3,$(MENUSELECT_ADDONS)),) | ||||
| 	@if [ ! -f mp3/Makefile ] ; then \ | ||||
| 		echo ; \ | ||||
| 		echo "**************************************************************" ; \ | ||||
| 		echo "***                                                        ***" ; \ | ||||
| 		echo "***   --->  READ THIS OR YOUR BUILD WILL FAIL  <---        ***" ; \ | ||||
| 		echo "***                                                        ***" ; \ | ||||
| 		echo "*** format_mp3 has been selected to be installed, but the  ***" ; \ | ||||
| 		echo "*** mp3 decoder library has not yet been downloaded into   ***" ; \ | ||||
| 		echo "*** the source tree.  To do so, please run the following   ***" ; \ | ||||
| 		echo "*** command:                                               ***" ; \ | ||||
| 		echo "***                                                        ***" ; \ | ||||
| 		echo "***          $$ contrib/scripts/get_mp3_source.sh           ***" ; \ | ||||
| 		echo "***                                                        ***" ; \ | ||||
| 		echo "**************************************************************" ; \ | ||||
| 		echo ; \ | ||||
| 	fi | ||||
| endif | ||||
|  | ||||
| include $(ASTTOPDIR)/Makefile.moddir_rules | ||||
|  | ||||
| clean:: | ||||
| 	$(MAKE) -C mp3 clean | ||||
| 	if [ -f mp3/Makefile ] ; then $(MAKE) -C mp3 clean ; fi | ||||
| 	rm -f $(addprefix ooh323c/src/,$(H323OBJS)) | ||||
|  | ||||
| $(if $(filter format_mp3,$(EMBEDDED_MODS)),modules.link,format_mp3.so): mp3/common.o mp3/dct64_i386.o mp3/decode_ntom.o mp3/layer3.o mp3/tabinit.o mp3/interface.o | ||||
| @@ -49,3 +69,5 @@ chan_ooh323.o: _ASTCFLAGS+=$(H323CFLAGS) | ||||
| $(if $(filter chan_ooh323,$(EMBEDDED_MODS)),modules.link,chan_ooh323.so): _ASTCFLAGS+=$(H323CFLAGS) | ||||
| $(if $(filter chan_ooh323,$(EMBEDDED_MODS)),modules.link,chan_ooh323.so): $(addprefix ooh323c/src/,$(H323OBJS)) chan_ooh323.o ooh323cDriver.o | ||||
| $(addprefix ooh323c/src/,$(H323OBJS)) chan_ooh323.o ooh323cDriver.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_ooh323) | ||||
|  | ||||
| .PHONY: check_mp3 | ||||
|   | ||||
| @@ -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. | ||||
|  | ||||
|  | ||||
| @@ -1,2 +0,0 @@ | ||||
|  | ||||
| apply 'VBR' bugfix | ||||
| @@ -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 | ||||
| @@ -1,24 +0,0 @@ | ||||
| This is a module for asterisk to play mp3 natively. | ||||
| They *SHOULD* be already at 8khz and *SHOULD* be mono. | ||||
| otherwise they will be consuming CPU alot more than need be. | ||||
|  | ||||
| Convert them to 8k mono like this: | ||||
| lame -q -p --mp3input -a --preset 8 in.mp3 8kout.mp3 | ||||
|  | ||||
| just run  | ||||
| # make clean install  | ||||
| to install  | ||||
|  | ||||
| or | ||||
| # make clean autoload | ||||
| to install and autoload at the same time | ||||
|  | ||||
|  | ||||
| Comments or improvements | ||||
| Anthony Minessale <anthmct@yahoo.com> | ||||
|  | ||||
| Donations Welcomed at paypal:jillkm3@yahoo.com | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -1,267 +0,0 @@ | ||||
| #include "asterisk.h" | ||||
| #include "asterisk/logger.h" | ||||
|  | ||||
| #include <ctype.h> | ||||
| #include <stdlib.h> | ||||
| #include <signal.h> | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <fcntl.h> | ||||
|  | ||||
| #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; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -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); | ||||
| } | ||||
|  | ||||
| @@ -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 <stdlib.h> | ||||
| #include <math.h> | ||||
| #include <string.h> | ||||
|  | ||||
|  | ||||
| #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; | ||||
| } | ||||
|  | ||||
| @@ -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 <stdlib.h> | ||||
| #include <math.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #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; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -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 } | ||||
| }; | ||||
|  | ||||
|  | ||||
| @@ -1,323 +0,0 @@ | ||||
| #include "asterisk.h" | ||||
| #include "asterisk/logger.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| #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; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										2029
									
								
								addons/mp3/layer3.c
									
									
									
									
									
								
							
							
						
						
									
										2029
									
								
								addons/mp3/layer3.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,132 +0,0 @@ | ||||
| #include        <stdio.h> | ||||
| #include        <string.h> | ||||
| #include        <signal.h> | ||||
|  | ||||
| #ifndef WIN32 | ||||
| #include        <sys/signal.h> | ||||
| #include        <unistd.h> | ||||
| #endif | ||||
|  | ||||
| #include        <math.h> | ||||
|  | ||||
| #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]; | ||||
|  | ||||
| @@ -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); | ||||
|  | ||||
| @@ -1,81 +0,0 @@ | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #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;k<kr;k++) | ||||
| 			costab[k] = 1.0 / (2.0 * cos(M_PI * ((double) k * 2.0 + 1.0) / (double) divv)); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| void make_decode_tables_scale(struct mpstr *mp, long scaleval) | ||||
| { | ||||
|   int i,j; | ||||
|   real *table; | ||||
|    | ||||
|   table = mp->decwin; | ||||
|   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; | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										14
									
								
								contrib/scripts/get_mp3_source.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								contrib/scripts/get_mp3_source.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #!/bin/sh -e | ||||
|  | ||||
| if [ -f addons/mp3/mpg123.h ]; then | ||||
|     echo "***" | ||||
|     echo "The MP3 source code appears to already be present and does not" | ||||
|     echo "need to be downloaded." | ||||
|     echo "***" | ||||
|  | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| svn export http://svn.digium.com/svn/thirdparty/mp3/trunk addons/mp3 | ||||
|  | ||||
| exit 0 | ||||
		Reference in New Issue
	
	Block a user