aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/libmpg123
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmpg123')
-rwxr-xr-xsrc/libmpg123/Makefile.am24
-rw-r--r--src/libmpg123/Makefile.in476
-rw-r--r--src/libmpg123/README35
-rwxr-xr-xsrc/libmpg123/common.c746
-rwxr-xr-xsrc/libmpg123/dxhead.c165
-rwxr-xr-xsrc/libmpg123/dxhead.h60
-rwxr-xr-xsrc/libmpg123/getbits.c126
-rwxr-xr-xsrc/libmpg123/getbits.h46
-rwxr-xr-xsrc/libmpg123/huffman.h329
-rwxr-xr-xsrc/libmpg123/l2tables.h997
-rwxr-xr-xsrc/libmpg123/layer1.c187
-rwxr-xr-xsrc/libmpg123/layer2.c336
-rwxr-xr-xsrc/libmpg123/layer3.c2100
-rwxr-xr-xsrc/libmpg123/mpg123.c172
-rwxr-xr-xsrc/libmpg123/mpg123.h144
15 files changed, 5943 insertions, 0 deletions
diff --git a/src/libmpg123/Makefile.am b/src/libmpg123/Makefile.am
new file mode 100755
index 0000000..697fa03
--- /dev/null
+++ b/src/libmpg123/Makefile.am
@@ -0,0 +1,24 @@
+CFLAGS = @CFLAGS@ @GTK_CFLAGS@
+
+noinst_LIBRARIES = libmpg123.a
+
+INCLUDES = -DLOCALE=\"$(localedir)\"
+
+
+libmpg123_a_SOURCES = \
+ common.c \
+ dxhead.h \
+ dxhead.c \
+ getbits.c \
+ getbits.h \
+ huffman.h \
+ l2tables.h \
+ layer1.c \
+ layer2.c \
+ layer3.c \
+ mpg123.c \
+ mpg123.h
+
+
+EXTRA_DIST = \
+ README
diff --git a/src/libmpg123/Makefile.in b/src/libmpg123/Makefile.in
new file mode 100644
index 0000000..203fdc7
--- /dev/null
+++ b/src/libmpg123/Makefile.in
@@ -0,0 +1,476 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = src/libmpg123
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libmpg123_a_AR = $(AR) $(ARFLAGS)
+libmpg123_a_LIBADD =
+am_libmpg123_a_OBJECTS = common.$(OBJEXT) dxhead.$(OBJEXT) \
+ getbits.$(OBJEXT) layer1.$(OBJEXT) layer2.$(OBJEXT) \
+ layer3.$(OBJEXT) mpg123.$(OBJEXT)
+libmpg123_a_OBJECTS = $(am_libmpg123_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libmpg123_a_SOURCES)
+DIST_SOURCES = $(libmpg123_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@ @GTK_CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+OBJEXT = @OBJEXT@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WAVPACK_CFLAGS = @WAVPACK_CFLAGS@
+WAVPACK_LIBS = @WAVPACK_LIBS@
+XGETTEXT = @XGETTEXT@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LIBRARIES = libmpg123.a
+INCLUDES = -DLOCALE=\"$(localedir)\"
+libmpg123_a_SOURCES = \
+ common.c \
+ dxhead.h \
+ dxhead.c \
+ getbits.c \
+ getbits.h \
+ huffman.h \
+ l2tables.h \
+ layer1.c \
+ layer2.c \
+ layer3.c \
+ mpg123.c \
+ mpg123.h
+
+EXTRA_DIST = \
+ README
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libmpg123/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/libmpg123/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libmpg123.a: $(libmpg123_a_OBJECTS) $(libmpg123_a_DEPENDENCIES)
+ -rm -f libmpg123.a
+ $(libmpg123_a_AR) libmpg123.a $(libmpg123_a_OBJECTS) $(libmpg123_a_LIBADD)
+ $(RANLIB) libmpg123.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dxhead.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getbits.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpg123.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/libmpg123/README b/src/libmpg123/README
new file mode 100644
index 0000000..1a66a66
--- /dev/null
+++ b/src/libmpg123/README
@@ -0,0 +1,35 @@
+/*
+ * Code taken from :
+ */
+
+/*
+ * Mpeg Layer-3 audio decoder
+ * --------------------------
+ * copyright (c) 1995-1999 by Michael Hipp.
+ * All rights reserved.
+ *
+ */
+
+/*
+ * and :
+ */
+
+/* XMMS - Cross-platform multimedia player
+ * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies
+ * Copyright (C) 1999,2000 Håvard Kvålen
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
diff --git a/src/libmpg123/common.c b/src/libmpg123/common.c
new file mode 100755
index 0000000..80c299d
--- /dev/null
+++ b/src/libmpg123/common.c
@@ -0,0 +1,746 @@
+/***
+#include <ctype.h>
+#include <stdlib.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "config.h"
+***/
+
+/* #ifdef HAVE_MMAP */
+/***
+# if 0
+#include <sys/mman.h>
+#ifndef MAP_FAILED
+#define MAP_FAILED ( (void *) -1 )
+#endif
+#endif
+***/
+
+#include "mpg123.h"
+/***
+#include "id3.h"
+#include "id3_header.h"
+***/
+
+/* max = 1728 */
+#define MAXFRAMESIZE 1792
+
+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 mpg123_freqs[9] =
+{44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000};
+
+struct bitstream_info bsi;
+
+extern gint mpg123_bitrate, mpg123_frequency, mpg123_length;
+extern gchar *mpg123_title, *mpg123_filename;
+extern gboolean mpg123_stereo;
+
+static int fsizeold = 0, ssize;
+static unsigned char bsspace[2][MAXFRAMESIZE + 512]; /* MAXFRAMESIZE */
+static unsigned char *bsbuf = bsspace[1], *bsbufold;
+///static int bsnum = 0;
+
+unsigned char *mpg123_pcm_sample;
+int mpg123_pcm_point = 0;
+
+static FILE *filept;
+///static int filept_opened;
+
+///static int get_fileinfo(void);
+
+/***
+static int fullread(FILE * fd, unsigned char *buf, int count)
+{
+ int ret, cnt = 0;
+
+ while (cnt < count)
+ {
+ if (fd)
+ ret = fread(buf + cnt, 1, count - cnt, fd);
+ else
+ ret = mpg123_http_read(buf + cnt, count - cnt);
+ if (ret < 0)
+ return ret;
+ if (ret == 0)
+ break;
+ cnt += ret;
+ }
+ return cnt;
+}
+
+#define HDRCMPMASK 0xfffffd00
+***/
+
+/* #ifdef HAVE_MMAP */
+# if 0
+/***
+static unsigned char *mapbuf;
+static unsigned char *mappnt;
+static unsigned char *mapend;
+
+static int stream_init(void)
+{
+ long len;
+
+ len = get_fileinfo();
+ if (len < 0)
+ return -1;
+
+ mappnt = mapbuf =
+ mmap(NULL, len, PROT_READ, MAP_SHARED, filept, 0);
+ if (!mapbuf || mapbuf == MAP_FAILED)
+ return -1;
+
+ mapend = mapbuf + len;
+
+ return 0;
+}
+
+static void stream_rewind(void)
+{
+ mappnt = mapbuf;
+}
+
+void mpg123_stream_close(void)
+{
+ if (filept)
+ {
+ munmap(mapbuf, mapend - mapbuf);
+ close(filept);
+ }
+ else
+ mpg123_http_close();
+
+}
+
+static int stream_head_read(unsigned long *newhead)
+{
+ unsigned long nh;
+
+ if (filept)
+ {
+
+ if (mappnt + 4 > mapend)
+ return FALSE;
+
+ nh = (*mappnt++) << 24;
+ nh |= (*mappnt++) << 16;
+ nh |= (*mappnt++) << 8;
+ nh |= (*mappnt++);
+
+ *newhead = nh;
+
+ }
+ else
+ {
+ unsigned char hbuf[4];
+
+ if (fullread(filept, hbuf, 4) != 4)
+ return FALSE;
+
+ *newhead = ((unsigned long) hbuf[0] << 24) |
+ ((unsigned long) hbuf[1] << 16) |
+ ((unsigned long) hbuf[2] << 8) |
+ (unsigned long) hbuf[3];
+ }
+ return TRUE;
+
+}
+
+static int stream_head_shift(unsigned long *head)
+{
+
+ if (filept)
+ {
+ if (mappnt + 1 > mapend)
+ return FALSE;
+ *head <<= 8;
+ *head |= *mappnt++;
+ *head &= 0xffffffff;
+ }
+ else
+ {
+ unsigned char hbuf;
+
+ if (fullread(filept, &hbuf, 1) != 1)
+ return 0;
+ *head <<= 8;
+ *head |= hbuf;
+ *head &= 0xffffffff;
+ }
+ return TRUE;
+}
+
+static int stream_mpg123_read_frame_body(unsigned char *buf,
+ int size)
+{
+ if (filept)
+ {
+#if 1
+ if (mappnt + size > mapend)
+ return FALSE;
+#else
+ long l;
+
+ if (size > (mapend - mappnt))
+ {
+ l = mapend - mappnt;
+ memcpy(buf, mappnt, l);
+ memset(buf + l, 0, size - l);
+ }
+ else
+#endif
+ memcpy(buf, mappnt, size);
+
+ mappnt += size;
+ }
+ else
+ {
+ long l;
+
+ if ((l = fullread(filept, buf, size)) != size)
+ {
+ if (l <= 0)
+ return 0;
+ memset(buf + l, 0, size - l);
+ }
+ }
+
+ return TRUE;
+}
+
+static int stream_back_bytes(int bytes)
+{
+ if ((mappnt - bytes) < mapbuf || (mappnt - bytes + 4) > mapend)
+ return -1;
+ mappnt -= bytes;
+ return 0;
+}
+
+static long stream_tell(void)
+{
+ return mappnt - mapbuf;
+}
+
+void mpg123_stream_jump_to_frame(struct frame *fr, int frame)
+{
+ if (mapbuf + frame * (fr->framesize + 4) < mapend)
+ {
+ mpg123__init();
+ stream_rewind();
+ mpg123_read_frame(fr);
+ mappnt = mapbuf + frame * (fr->framesize + 4);
+
+ mpg123_read_frame(fr);
+ }
+}
+
+void mpg123_stream_jump_to_byte(struct frame *fr, int byte)
+{
+ if (mapbuf + byte < mapend)
+ {
+ mappnt = mapbuf + byte;
+ mpg123_read_frame(fr);
+ }
+}
+
+int mpg123_stream_check_for_xing_header(struct frame *fr, XHEADDATA * xhead)
+{
+ unsigned char *head_data;
+ int ret = 0;
+
+ stream_back_bytes(fr->framesize + 4);
+
+ if (mappnt + (fr->framesize + 4) < mapend)
+ {
+ ret = mpg123_get_xing_header(xhead, mappnt);
+ mappnt += fr->framesize + 4;
+ }
+ return ret;
+}
+***/
+#else
+/***
+static int stream_init(void)
+{
+ if (get_fileinfo() < 0)
+ return -1;
+ return 0;
+}
+
+void mpg123_stream_close(void)
+{
+*//* if (flags & READER_FD_OPENED) *//*
+ if (filept)
+ fclose(filept);
+ else
+ mpg123_http_close();
+}
+***/
+
+/****************************************
+ * HACK,HACK,HACK: step back <num> frames
+ * can only work if the 'stream' isn't a real stream but a file
+ */
+/***
+static int stream_back_bytes(int bytes)
+{
+ if (fseek(filept, -bytes, SEEK_CUR) < 0)
+ return -1;
+ return 0;
+}
+
+static int stream_head_read(unsigned long *newhead)
+{
+ unsigned char hbuf[4];
+
+ if (fullread(filept, hbuf, 4) != 4)
+ return FALSE;
+
+ *newhead = ((unsigned long) hbuf[0] << 24) |
+ ((unsigned long) hbuf[1] << 16) |
+ ((unsigned long) hbuf[2] << 8) |
+ (unsigned long) hbuf[3];
+
+ return TRUE;
+}
+
+static int stream_head_shift(unsigned long *head)
+{
+ unsigned char hbuf;
+
+ if (fullread(filept, &hbuf, 1) != 1)
+ return 0;
+ *head <<= 8;
+ *head |= hbuf;
+ *head &= 0xffffffff;
+ return 1;
+}
+
+static int stream_mpg123_read_frame_body(unsigned char *buf,
+ int size)
+{
+ long l;
+
+ if ((l = fullread(filept, buf, size)) != size)
+ {
+ if (l <= 0)
+ return 0;
+ memset(buf + l, 0, size - l);
+ }
+ return 1;
+}
+
+static long stream_tell(void)
+{
+ return ftell(filept);
+}
+
+static void stream_rewind(void)
+{
+ fseek(filept, 0, SEEK_SET);
+}
+
+int mpg123_stream_jump_to_frame(struct frame *fr, int frame)
+{
+ if (!filept)
+ return -1;
+ mpg123_read_frame_init();
+ fseek(filept, frame * (fr->framesize + 4), SEEK_SET);
+ mpg123_read_frame(fr);
+ return 0;
+}
+
+int mpg123_stream_jump_to_byte(struct frame *fr, int byte)
+{
+ if (!filept)
+ return -1;
+ fseek(filept, byte, SEEK_SET);
+ mpg123_read_frame(fr);
+ return 0;
+}
+***/
+
+int mpg123_stream_check_for_xing_header(struct frame *fr, XHEADDATA * xhead)
+{
+ unsigned char *head_data;
+ int ret;
+
+ fseek(filept, -(fr->framesize + 4), SEEK_CUR);
+ head_data = g_malloc(fr->framesize + 4);
+ fread(head_data, 1, fr->framesize + 4, filept);
+ ret = mpg123_get_xing_header(xhead, head_data);
+ g_free(head_data);
+ return ret;
+}
+
+#endif
+
+/***
+static int get_fileinfo(void)
+{
+ guchar buf[3];
+
+ if (filept == NULL)
+ return -1;
+ if (fseek(filept, 0, SEEK_END) < 0)
+ return -1;
+
+ mpg123_info->filesize = ftell(filept);
+ if (fseek(filept, -128, SEEK_END) < 0)
+ return -1;
+ if (fullread(filept, buf, 3) != 3)
+ return -1;
+ if (!strncmp(buf, "TAG", 3))
+ mpg123_info->filesize -=128;
+ if (fseek(filept, 0, SEEK_SET) < 0)
+ return -1;
+
+ if (mpg123_info->filesize <= 0)
+ return -1;
+
+ return mpg123_info->filesize;
+}
+***/
+
+/***
+void mpg123_read_frame_init(void)
+{
+ memset(bsspace[0],0,MAXFRAMESIZE + 512);
+ memset(bsspace[1],0,MAXFRAMESIZE + 512);
+ mpg123_info->output_audio = FALSE;
+}
+***/
+
+/*
+ * Function read_id3v2_tag (head)
+ *
+ * Read ID3v2 tag from stream. Return TRUE upon success, or FALSE if
+ * an error occurred.
+ *
+ */
+/***
+static gboolean read_id3v2_tag(unsigned long head)
+{
+ struct
+ {
+ char id3[3];
+ struct id3_taghdr_t tag;
+ } id3header;
+ char *id3buf;
+ int hdrsize;
+ id3_t *id3d;
+ struct id3tag_t tag;
+ *//*
+ * Read ID3tag header.
+ *//*
+ *(unsigned long *) &id3header = g_htonl(head);
+ if (fullread(filept, ((char *) &id3header) + sizeof (head),
+ sizeof (id3header) - sizeof (head))
+ != sizeof (id3header) - sizeof (head))
+ return FALSE;
+
+ hdrsize = ID3_GET_SIZE28(g_ntohl(id3header.tag.th_size));
+
+ *//*
+ * A invalid header could fool us into requesting insane
+ * amounts of memory. Make sure the header size is
+ * reasonable.
+ *//*
+ if ((mpg123_info->filesize && hdrsize > mpg123_info->filesize) ||
+ (!mpg123_info->filesize && hdrsize > 1000000))
+ return FALSE;
+
+ if (mpg123_cfg.disable_id3v2)
+ {
+ guint8 *tmp = g_malloc(hdrsize);
+ gboolean ret;
+ ret = (fullread(filept, tmp, hdrsize) == hdrsize);
+ g_free(tmp);
+ return ret;
+ }
+
+ id3buf = g_malloc(hdrsize + sizeof (id3header));
+ memcpy(id3buf, &id3header, sizeof (id3header));
+
+ *//*
+ * Read ID3tag body.
+ *//*
+ if (fullread(filept, id3buf + sizeof (id3header), hdrsize) != hdrsize)
+ {
+ g_free(id3buf);
+ return FALSE;
+ }
+
+ *//*
+ * Get info from tag.
+ *//*
+ if ((id3d = id3_open_mem(id3buf, 0)) != NULL)
+ {
+ mpg123_get_id3v2(id3d, &tag);
+ if (!mpg123_info->first_frame)
+ {
+ char *songname = mpg123_title;
+ mpg123_title =
+ mpg123_format_song_title(&tag, mpg123_filename);
+ mpg123_ip.set_info(mpg123_title, mpg123_length,
+ mpg123_bitrate * 1000,
+ mpg123_frequency, mpg123_stereo);
+ if (songname)
+ g_free(songname);
+ }
+ else
+ {
+ mpg123_title = mpg123_format_song_title(&tag,
+ mpg123_filename);
+ }
+ id3_close(id3d);
+ }
+ g_free(id3buf);
+
+ return TRUE;
+}
+***/
+
+int mpg123_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 >> 12) & 0xf))
+ return FALSE;
+ if (((head >> 10) & 0x3) == 0x3)
+ return FALSE;
+ if (((head >> 19) & 1) == 1 && ((head >> 17) & 3) == 3 && ((head >> 16) & 1) == 1)
+ return FALSE;
+ if ((head & 0xffff0000) == 0xfffe0000)
+ return FALSE;
+
+ return TRUE;
+}
+
+/*****************************************************************
+ * read next frame
+ */
+/***
+int mpg123_read_frame(struct frame *fr)
+{
+ unsigned long newhead;
+
+ fsizeold = fr->framesize; *//* for Layer3 *//*
+
+ if (!stream_head_read(&newhead))
+ return FALSE;
+
+ if (!mpg123_head_check(newhead) || !mpg123_decode_header(fr, newhead))
+ {
+ int try = 0;
+
+ do
+ {
+ try++;
+ if ((newhead & 0xffffff00) == ('I' << 24) + ('D' << 16) + ('3' << 8))
+ {
+ read_id3v2_tag(newhead);
+ if (!stream_head_read(&newhead))
+ return FALSE;
+ }
+ else if (!stream_head_shift(&newhead))
+ return 0;
+
+ }
+ while ((!mpg123_head_check(newhead) ||
+ !mpg123_decode_header(fr,newhead)) &&
+ try < (256 * 1024));
+ if(try >= (256 * 1024))
+ return FALSE;
+
+ mpg123_info->filesize -= try;
+ }
+ *//* flip/init buffer for Layer 3 *//*
+ bsbufold = bsbuf;
+ bsbuf = bsspace[bsnum] + 512;
+ bsnum = (bsnum + 1) & 1;
+
+ if (!stream_mpg123_read_frame_body(bsbuf, fr->framesize))
+ return 0;
+
+ bsi.bitindex = 0;
+ bsi.wordpointer = (unsigned char *) bsbuf;
+
+
+ return 1;
+
+}
+***/
+
+/*
+ * the code a header and write the information
+ * into the frame structure
+ */
+int mpg123_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 (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;
+
+ ssize = 0;
+
+ if (!fr->bitrate_index)
+ return (0);
+
+ switch (fr->lay)
+ {
+ case 1:
+ fr->do_layer = mpg123_do_layer1;
+ mpg123_init_layer2(); /* inits also shared tables with layer1 */
+ fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
+ fr->framesize /= mpg123_freqs[fr->sampling_frequency];
+ fr->framesize = ((fr->framesize + fr->padding) << 2) - 4;
+ break;
+ case 2:
+ fr->do_layer = mpg123_do_layer2;
+ mpg123_init_layer2(); /* inits also shared tables with layer1 */
+ fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
+ fr->framesize /= mpg123_freqs[fr->sampling_frequency];
+ fr->framesize += fr->padding - 4;
+ break;
+ case 3:
+ fr->do_layer = mpg123_do_layer3;
+ if (fr->lsf)
+ ssize = (fr->stereo == 1) ? 9 : 17;
+ else
+ ssize = (fr->stereo == 1) ? 17 : 32;
+ if (fr->error_protection)
+ ssize += 2;
+ fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
+ fr->framesize /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+ fr->framesize = fr->framesize + fr->padding - 4;
+ break;
+ default:
+ return (0);
+ }
+ if(fr->framesize > MAXFRAMESIZE)
+ return 0;
+ return 1;
+}
+
+/***
+void mpg123_open_stream(char *bs_filenam, int fd)
+{
+ filept_opened = 1;
+ if (!strncasecmp(bs_filenam, "http://", 7))
+ {
+ filept = NULL;
+ mpg123_http_open(bs_filenam);
+ mpg123_info->filesize = 0;
+ }
+ else
+ {
+ if ((filept = fopen(bs_filenam, "rb")) != NULL)
+ {
+ if (stream_init() == -1)
+ {
+ mpg123_info->eof = 1;
+ }
+ }
+ else
+ mpg123_info->eof = 1;
+ }
+
+}
+***/
+
+void mpg123_set_pointer(long backstep)
+{
+ bsi.wordpointer = bsbuf + ssize - backstep;
+ if (backstep)
+ memcpy(bsi.wordpointer, bsbufold + fsizeold - backstep, backstep);
+ bsi.bitindex = 0;
+}
+
+double mpg123_compute_bpf(struct frame *fr)
+{
+ double bpf;
+
+ switch (fr->lay)
+ {
+ case 1:
+ bpf = tabsel_123[fr->lsf][0][fr->bitrate_index];
+ bpf *= 12000.0 * 4.0;
+ bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+ break;
+ case 2:
+ case 3:
+ bpf = tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index];
+ bpf *= 144000;
+ bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+ break;
+ default:
+ bpf = 1.0;
+ }
+
+ return bpf;
+}
+
+/***
+int mpg123_calc_numframes(struct frame *fr)
+{
+ return (int) (mpg123_info->filesize / mpg123_compute_bpf(fr));
+}
+
+double mpg123_relative_pos(void)
+{
+ if (!filept || !mpg123_info->filesize)
+ return 0;
+ return ((double) stream_tell()) / mpg123_info->filesize;
+}
+***/
diff --git a/src/libmpg123/dxhead.c b/src/libmpg123/dxhead.c
new file mode 100755
index 0000000..21b5ceb
--- /dev/null
+++ b/src/libmpg123/dxhead.c
@@ -0,0 +1,165 @@
+/* ---- DXhead.c --------------------------------------------
+ *
+ *
+ * decoder MPEG Layer III handle Xing header
+ *
+ * mod 12/7/98 add vbr scale
+ *
+ * Copyright 1998 Xing Technology Corp.
+ * -----------------------------------------------------------
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "dxhead.h"
+
+/* 4 Xing
+ * 4 flags
+ * 4 frames
+ * 4 bytes
+ * 100 toc
+ */
+
+/*-------------------------------------------------------------*/
+static int ExtractI4(unsigned char *buf)
+{
+ int x;
+
+ /* big endian extract */
+ x = buf[0];
+ x <<= 8;
+ x |= buf[1];
+ x <<= 8;
+ x |= buf[2];
+ x <<= 8;
+ x |= buf[3];
+ return x;
+}
+
+/*-------------------------------------------------------------*/
+int mpg123_get_xing_header(XHEADDATA * X, unsigned char *buf)
+{
+ int i, head_flags;
+ int h_id, h_mode, h_sr_index;
+ static int sr_table[4] =
+ {44100, 48000, 32000, 99999};
+
+ /* get Xing header data */
+ X->flags = 0; /* clear to null incase fail */
+
+ /* get selected MPEG header data */
+ h_id = (buf[1] >> 3) & 1;
+ h_sr_index = (buf[2] >> 2) & 3;
+ h_mode = (buf[3] >> 6) & 3;
+
+
+
+ /* determine offset of header */
+ if (h_id)
+ { /* mpeg1 */
+ if (h_mode != 3)
+ buf += (32 + 4);
+ else
+ buf += (17 + 4);
+ }
+ else
+ { /* mpeg2 */
+ if (h_mode != 3)
+ buf += (17 + 4);
+ else
+ buf += (9 + 4);
+ }
+
+ if (buf[0] != 'X')
+ return 0; /* fail */
+ if (buf[1] != 'i')
+ return 0; /* header not found */
+ if (buf[2] != 'n')
+ return 0;
+ if (buf[3] != 'g')
+ return 0;
+ buf += 4;
+
+ X->h_id = h_id;
+ X->samprate = sr_table[h_sr_index];
+ if (h_id == 0)
+ X->samprate >>= 1;
+ head_flags = X->flags = ExtractI4(buf);
+ buf += 4; /* get flags */
+
+ if (head_flags & FRAMES_FLAG)
+ {
+ X->frames = ExtractI4(buf);
+ buf += 4;
+ }
+ if (head_flags & BYTES_FLAG)
+ {
+ X->bytes = ExtractI4(buf);
+ buf += 4;
+ }
+
+ if (head_flags & TOC_FLAG)
+ {
+ if (X->toc != NULL)
+ {
+ for (i = 0; i < 100; i++)
+ X->toc[i] = buf[i];
+ }
+ buf += 100;
+ }
+
+ X->vbr_scale = -1;
+ if (head_flags & VBR_SCALE_FLAG)
+ {
+ X->vbr_scale = ExtractI4(buf);
+ buf += 4;
+ }
+
+
+/*if( X->toc != NULL ) {
+ *for(i=0;i<100;i++) {
+ * if( (i%10) == 0 ) printf("\n");
+ * printf(" %3d", (int)(X->toc[i]));
+ *}
+ *}
+ */
+
+ return 1; /* success */
+}
+
+/*-------------------------------------------------------------*/
+int mpg123_seek_point(unsigned char TOC[100], int file_bytes, float percent)
+{
+
+ /* interpolate in TOC to get file seek point in bytes */
+ int a, seekpoint;
+ float fa, fb, fx;
+
+ if (percent < 0.0f)
+ percent = 0.0f;
+
+ if (percent > 100.0f)
+ percent = 100.0f;
+
+ a = (int) percent;
+
+ if (a > 99)
+ a = 99;
+ fa = TOC[a];
+
+ if (a < 99)
+ {
+ fb = TOC[a + 1];
+ }
+ else
+ {
+ fb = 256.0f;
+ }
+
+ fx = fa + (fb - fa) * (percent - a);
+ seekpoint = (int) ((1.0f / 256.0f) * fx * file_bytes);
+ return seekpoint;
+}
+
+/*-------------------------------------------------------------*/
diff --git a/src/libmpg123/dxhead.h b/src/libmpg123/dxhead.h
new file mode 100755
index 0000000..bcbc66a
--- /dev/null
+++ b/src/libmpg123/dxhead.h
@@ -0,0 +1,60 @@
+/*---- DXhead.h --------------------------------------------
+
+decoder MPEG Layer III
+handle Xing header
+
+Copyright 1998 Xing Technology Corp.
+-----------------------------------------------------------*/
+/* A Xing header may be present in the ancillary
+ * data field of the first frame of an mp3 bitstream
+ * The Xing header (optionally) contains
+ * frames total number of audio frames in the bitstream
+ * bytes total number of bytes in the bitstream
+ * toc table of contents
+
+ * toc (table of contents) gives seek points
+ * for random access
+ * the ith entry determines the seek point for
+ * i-percent duration
+ * seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes
+ * e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes
+ */
+
+#define FRAMES_FLAG 0x0001
+#define BYTES_FLAG 0x0002
+#define TOC_FLAG 0x0004
+#define VBR_SCALE_FLAG 0x0008
+
+#define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG)
+
+/* structure to receive extracted header
+ * toc may be NULL
+ */
+typedef struct
+{
+ int h_id; /* from MPEG header, 0=MPEG2, 1=MPEG1 */
+ int samprate; /* determined from MPEG header */
+ int flags; /* from Xing header data */
+ int frames; /* total bit stream frames from Xing header data */
+ int bytes; /* total bit stream bytes from Xing header data */
+ int vbr_scale; /* encoded vbr scale from Xing header data */
+ unsigned char *toc; /* pointer to unsigned char toc_buffer[100] */
+ /* may be NULL if toc not desired */
+}
+XHEADDATA;
+
+int mpg123_get_xing_header(XHEADDATA * X, unsigned char *buf);
+
+/* return 0=fail, 1=success
+ * X structure to receive header data (output)
+ * buf bitstream input
+ */
+
+int mpg123_seek_point(unsigned char TOC[100], int file_bytes, float percent);
+
+/* return seekpoint in bytes (may be at eof if percent=100.0)
+ * TOC = table of contents from Xing header
+ * file_bytes = number of bytes in mp3 file
+ * percent = play time percentage of total playtime. May be
+ * fractional (e.g. 87.245)
+ */
diff --git a/src/libmpg123/getbits.c b/src/libmpg123/getbits.c
new file mode 100755
index 0000000..a071b5e
--- /dev/null
+++ b/src/libmpg123/getbits.c
@@ -0,0 +1,126 @@
+#include "mpg123.h"
+
+#if 0
+static void check_buffer_range(int size)
+{
+ int pos = (bsi.wordpointer-bsbuf) + (size >> 3);
+
+ if( pos >= fsizeold) {
+ fprintf(stderr, "Pointer out of range (%d,%d)!\n", pos, fsizeold);
+ }
+}
+#endif
+
+void mpg123_backbits(int number_of_bits)
+{
+ bsi.bitindex -= number_of_bits;
+ bsi.wordpointer += (bsi.bitindex>>3);
+ bsi.bitindex &= 0x7;
+}
+
+int mpg123_getbitoffset(void)
+{
+ return (-bsi.bitindex)&0x7;
+}
+
+int mpg123_getbyte(void)
+{
+#ifdef DEBUG_GETBITS
+ if(bsi.bitindex)
+ fprintf(stderr,"getbyte called unsynched!\n");
+#endif
+ return *bsi.wordpointer++;
+}
+
+unsigned int mpg123_getbits(int number_of_bits)
+{
+ unsigned long rval;
+
+#ifdef DEBUG_GETBITS
+ fprintf(stderr, "g%d", number_of_bits);
+#endif
+
+ if(!number_of_bits)
+ return 0;
+
+#if 0
+ check_buffer_range(number_of_bits + bsi.bitindex);
+#endif
+
+ {
+ rval = bsi.wordpointer[0];
+ rval <<= 8;
+ rval |= bsi.wordpointer[1];
+ rval <<= 8;
+ rval |= bsi.wordpointer[2];
+
+ rval <<= bsi.bitindex;
+ rval &= 0xffffff;
+
+ bsi.bitindex += number_of_bits;
+
+ rval >>= (24-number_of_bits);
+
+ bsi.wordpointer += (bsi.bitindex >> 3);
+ bsi.bitindex &= 7;
+ }
+
+#ifdef DEBUG_GETBITS
+ fprintf(stderr,":%x ",rval);
+#endif
+
+ return rval;
+}
+
+unsigned int mpg123_getbits_fast(int number_of_bits)
+{
+ unsigned int rval;
+#ifdef DEBUG_GETBITS
+ fprintf(stderr,"g%d",number_of_bits);
+#endif
+
+#if 0
+ check_buffer_range(number_of_bits+bsi.bitindex);
+#endif
+
+ rval = (unsigned char) (bsi.wordpointer[0] << bsi.bitindex);
+ rval |= ((unsigned int) bsi.wordpointer[1] << bsi.bitindex) >> 8;
+ rval <<= number_of_bits;
+ rval >>= 8;
+
+ bsi.bitindex += number_of_bits;
+
+ bsi.wordpointer += (bsi.bitindex >> 3);
+ bsi.bitindex &= 7;
+
+#ifdef DEBUG_GETBITS
+ fprintf(stderr,":%x ",rval);
+#endif
+ return rval;
+}
+
+unsigned int mpg123_get1bit(void)
+{
+ unsigned char rval;
+
+#ifdef DEBUG_GETBITS
+ fprintf(stderr,"g%d",1);
+#endif
+
+#if 0
+ check_buffer_range(1+bsi.bitindex);
+#endif
+
+ rval = *bsi.wordpointer << bsi.bitindex;
+
+ bsi.bitindex++;
+ bsi.wordpointer += (bsi.bitindex >> 3);
+ bsi.bitindex &= 7;
+
+#ifdef DEBUG_GETBITS
+ fprintf(stderr,":%d ",rval >> 7);
+#endif
+
+ return rval>>7;
+}
+
diff --git a/src/libmpg123/getbits.h b/src/libmpg123/getbits.h
new file mode 100755
index 0000000..1e5cf65
--- /dev/null
+++ b/src/libmpg123/getbits.h
@@ -0,0 +1,46 @@
+
+/*
+ * This does the same as getbits.c but with defines to
+ * force inlining
+ */
+
+#define mpg123_backbits(nob) \
+do { \
+ bsi.bitindex -= nob; \
+ bsi.wordpointer += (bsi.bitindex >> 3); \
+ bsi.bitindex &= 0x7; \
+} while (0)
+
+#define mpg123_getbitoffset() ((-bsi.bitindex) & 0x7)
+#define mpg123_getbyte() (*bsi.wordpointer++)
+
+#define mpg123_getbits(nob) \
+ (rval = bsi.wordpointer[0], \
+ rval <<= 8, \
+ rval |= bsi.wordpointer[1], \
+ rval <<= 8, \
+ rval |= bsi.wordpointer[2], \
+ rval <<= bsi.bitindex, \
+ rval &= 0xffffff, \
+ bsi.bitindex += (nob), \
+ rval >>= (24-(nob)), \
+ bsi.wordpointer += (bsi.bitindex>>3), \
+ bsi.bitindex &= 7, \
+ rval)
+
+#define mpg123_getbits_fast(nob) \
+ (rval = (unsigned char) (bsi.wordpointer[0] << bsi.bitindex), \
+ rval |= ((unsigned long) bsi.wordpointer[1] << bsi.bitindex) >> 8, \
+ rval <<= (nob), \
+ rval >>= 8, \
+ bsi.bitindex += (nob), \
+ bsi.wordpointer += (bsi.bitindex >> 3), \
+ bsi.bitindex &= 7, \
+ rval)
+
+#define mpg123_get1bit() \
+ (rval_uc = *bsi.wordpointer << bsi.bitindex, \
+ bsi.bitindex++, \
+ bsi.wordpointer += (bsi.bitindex>>3), \
+ bsi.bitindex &= 7, \
+ rval_uc >> 7)
diff --git a/src/libmpg123/huffman.h b/src/libmpg123/huffman.h
new file mode 100755
index 0000000..83a230b
--- /dev/null
+++ b/src/libmpg123/huffman.h
@@ -0,0 +1,329 @@
+
+/*
+ * 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/src/libmpg123/l2tables.h b/src/libmpg123/l2tables.h
new file mode 100755
index 0000000..51eb22f
--- /dev/null
+++ b/src/libmpg123/l2tables.h
@@ -0,0 +1,997 @@
+/*
+ * Layer 2 Alloc tables ..
+ * most other tables are calculated on program start (which is (of course)
+ * not ISO-conform) ..
+ * Layer-3 huffman table is in huffman.h
+ */
+
+struct al_table alloc_0[] =
+{
+ {4, 0},
+ {5, 3},
+ {3, -3},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {3, -3},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {3, -3},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767}};
+
+struct al_table alloc_1[] =
+{
+ {4, 0},
+ {5, 3},
+ {3, -3},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {3, -3},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {3, -3},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {16, -32767}};
+
+struct al_table alloc_2[] =
+{
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63}};
+
+struct al_table alloc_3[] =
+{
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {15, -16383},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63}};
+
+struct al_table alloc_4[] =
+{
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {4, 0},
+ {5, 3},
+ {7, 5},
+ {3, -3},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {8, -127},
+ {9, -255},
+ {10, -511},
+ {11, -1023},
+ {12, -2047},
+ {13, -4095},
+ {14, -8191},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {3, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {4, -7},
+ {5, -15},
+ {6, -31},
+ {7, -63},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9},
+ {2, 0},
+ {5, 3},
+ {7, 5},
+ {10, 9}};
diff --git a/src/libmpg123/layer1.c b/src/libmpg123/layer1.c
new file mode 100755
index 0000000..057f08b
--- /dev/null
+++ b/src/libmpg123/layer1.c
@@ -0,0 +1,187 @@
+
+/*
+ * Mpeg Layer-1 audio decoder
+ * --------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ * near unoptimzed ...
+ *
+ * may have a few bugs after last optimization ...
+ *
+ */
+
+#include "mpg123.h"
+#include "getbits.h"
+
+/* Used by the getbits macros */
+static unsigned long rval;
+
+void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT], struct frame *fr)
+{
+ unsigned int *ba = balloc;
+ unsigned int *sca = (unsigned int *) scale_index;
+
+ if (fr->stereo)
+ {
+ int i;
+ int jsbound = fr->jsbound;
+
+ for (i = 0; i < jsbound; i++)
+ {
+ *ba++ = mpg123_getbits(4);
+ *ba++ = mpg123_getbits(4);
+ }
+ for (i = jsbound; i < SBLIMIT; i++)
+ *ba++ = mpg123_getbits(4);
+
+ ba = balloc;
+
+ for (i = 0; i < jsbound; i++)
+ {
+ if ((*ba++))
+ *sca++ = mpg123_getbits(6);
+ if ((*ba++))
+ *sca++ = mpg123_getbits(6);
+ }
+ for (i = jsbound; i < SBLIMIT; i++)
+ if ((*ba++))
+ {
+ *sca++ = mpg123_getbits(6);
+ *sca++ = mpg123_getbits(6);
+ }
+ }
+ else
+ {
+ int i;
+
+ for (i = 0; i < SBLIMIT; i++)
+ *ba++ = mpg123_getbits(4);
+ ba = balloc;
+ for (i = 0; i < SBLIMIT; i++)
+ if ((*ba++))
+ *sca++ = mpg123_getbits(6);
+ }
+}
+
+void I_step_two(real fraction[2][SBLIMIT], unsigned int balloc[2 * SBLIMIT],
+ unsigned int scale_index[2][SBLIMIT], struct frame *fr)
+{
+ int i, n;
+ int smpb[2 * SBLIMIT]; /* values: 0-65535 */
+ int *sample;
+ register unsigned int *ba;
+ register unsigned int *sca = (unsigned int *) scale_index;
+
+ if (fr->stereo)
+ {
+ int jsbound = fr->jsbound;
+ register real *f0 = fraction[0];
+ register real *f1 = fraction[1];
+
+ ba = balloc;
+ for (sample = smpb, i = 0; i < jsbound; i++)
+ {
+ if ((n = *ba++))
+ *sample++ = mpg123_getbits(n + 1);
+ if ((n = *ba++))
+ *sample++ = mpg123_getbits(n + 1);
+ }
+ for (i = jsbound; i < SBLIMIT; i++)
+ if ((n = *ba++))
+ *sample++ = mpg123_getbits(n + 1);
+
+ ba = balloc;
+ for (sample = smpb, i = 0; i < jsbound; i++)
+ {
+ if ((n = *ba++))
+ *f0++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++];
+ else
+ *f0++ = 0.0;
+ if ((n = *ba++))
+ *f1++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++];
+ else
+ *f1++ = 0.0;
+ }
+ for (i = jsbound; i < SBLIMIT; i++)
+ {
+ if ((n = *ba++))
+ {
+ real samp = (((-1) << n) + (*sample++) + 1);
+
+ *f0++ = samp * mpg123_muls[n + 1][*sca++];
+ *f1++ = samp * mpg123_muls[n + 1][*sca++];
+ }
+ else
+ *f0++ = *f1++ = 0.0;
+ }
+ for (i = fr->down_sample_sblimit; i < 32; i++)
+ fraction[0][i] = fraction[1][i] = 0.0;
+ }
+ else
+ {
+ register real *f0 = fraction[0];
+
+ ba = balloc;
+ for (sample = smpb, i = 0; i < SBLIMIT; i++)
+ if ((n = *ba++))
+ *sample++ = mpg123_getbits(n + 1);
+ ba = balloc;
+ for (sample = smpb, i = 0; i < SBLIMIT; i++)
+ {
+ if ((n = *ba++))
+ *f0++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++];
+ else
+ *f0++ = 0.0;
+ }
+ for (i = fr->down_sample_sblimit; i < 32; i++)
+ fraction[0][i] = 0.0;
+ }
+}
+
+int mpg123_do_layer1(struct frame *fr)
+{
+ int i, stereo = fr->stereo;
+ unsigned int balloc[2 * SBLIMIT];
+ unsigned int scale_index[2][SBLIMIT];
+ real fraction[2][SBLIMIT];
+ int single = fr->single;
+
+ fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : 32;
+
+ if (stereo == 1 || single == 3)
+ single = 0;
+
+ I_step_one(balloc, scale_index, fr);
+
+ for (i = 0; i < SCALE_BLOCK; i++)
+ {
+ I_step_two(fraction, balloc, scale_index, fr);
+
+ if (single >= 0)
+ {
+ (fr->synth_mono) ((real *) fraction[single], mpg123_pcm_sample, &mpg123_pcm_point);
+ }
+ else
+ {
+ int p1 = mpg123_pcm_point;
+
+ (fr->synth) ((real *) fraction[0], 0, mpg123_pcm_sample, &p1);
+ (fr->synth) ((real *) fraction[1], 1, mpg123_pcm_sample, &mpg123_pcm_point);
+ }
+
+/***
+ if (mpg123_info->output_audio)
+ {
+
+ mpg123_ip.add_vis_pcm(mpg123_ip.output->written_time(), mpg123_cfg.resolution == 16 ? FMT_S16_NE : FMT_U8,
+ mpg123_cfg.channels == 2 ? fr->stereo : 1, mpg123_pcm_point, mpg123_pcm_sample);
+ while (mpg123_ip.output->buffer_free() < mpg123_pcm_point && mpg123_info->going && mpg123_info->jump_to_time == -1)
+ xmms_usleep(10000);
+ if (mpg123_info->going && mpg123_info->jump_to_time == -1)
+ mpg123_ip.output->write_audio(mpg123_pcm_sample, mpg123_pcm_point);
+ }
+***/
+ mpg123_pcm_point = 0;
+ }
+
+ return 1;
+}
diff --git a/src/libmpg123/layer2.c b/src/libmpg123/layer2.c
new file mode 100755
index 0000000..07ce258
--- /dev/null
+++ b/src/libmpg123/layer2.c
@@ -0,0 +1,336 @@
+
+/*
+ * Mpeg Layer-2 audio decoder
+ * --------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ *
+ */
+
+#include "mpg123.h"
+#include "l2tables.h"
+#include "getbits.h"
+
+static int grp_3tab[32 * 3] =
+{0,}; /* used: 27 */
+static int grp_5tab[128 * 3] =
+{0,}; /* used: 125 */
+static int grp_9tab[1024 * 3] =
+{0,}; /* used: 729 */
+
+real mpg123_muls[27][64]; /* also used by layer 1 */
+
+/* Used by the getbits macros */
+static unsigned long rval;
+
+void mpg123_init_layer2(void)
+{
+ static double mulmul[27] = {
+ 0.0, -2.0 / 3.0, 2.0 / 3.0, 2.0 / 7.0, 2.0 / 15.0,
+ 2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0,
+ 2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0,
+ 2.0 / 8191.0, 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0,
+ -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, -8.0 / 9.0,
+ -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0 };
+ static int base[3][9] = {
+ {1, 0, 2,},
+ {17, 18, 0, 19, 20,},
+ {21, 1, 22, 23, 0, 24, 25, 2, 26}};
+ int i, j, k, l, len;
+ real *table;
+ static int tablen[3] = {3, 5, 9};
+ static int *itable, *tables[3] =
+ {grp_3tab, grp_5tab, grp_9tab};
+
+ for (i = 0; i < 3; i++)
+ {
+ itable = tables[i];
+ len = tablen[i];
+ for (j = 0; j < len; j++)
+ for (k = 0; k < len; k++)
+ for (l = 0; l < len; l++)
+ {
+ *itable++ = base[i][l];
+ *itable++ = base[i][k];
+ *itable++ = base[i][j];
+ }
+ }
+
+ for (k = 0; k < 27; k++)
+ {
+ double m = mulmul[k];
+
+ table = mpg123_muls[k];
+ for (j = 3, i = 0; i < 63; i++, j--)
+ *table++ = m * pow(2.0, (double) j / 3.0);
+ *table++ = 0.0;
+ }
+}
+
+void II_step_one(unsigned int *bit_alloc, int *scale, struct frame *fr)
+{
+ int stereo = fr->stereo - 1;
+ int sblimit = fr->II_sblimit;
+ int jsbound = fr->jsbound;
+ int sblimit2 = fr->II_sblimit << stereo;
+ struct al_table *alloc1 = fr->alloc;
+ int i;
+ static unsigned int scfsi_buf[64];
+ unsigned int *scfsi, *bita;
+ int sc, step;
+
+ bita = bit_alloc;
+ if (stereo)
+ {
+ for (i = jsbound; i > 0; i--, alloc1 += (1 << step))
+ {
+ *bita++ = (char) mpg123_getbits(step = alloc1->bits);
+ *bita++ = (char) mpg123_getbits(step);
+ }
+ for (i = sblimit - jsbound; i > 0; i--, alloc1 += (1 << step))
+ {
+ bita[0] = (char) mpg123_getbits(step = alloc1->bits);
+ bita[1] = bita[0];
+ bita += 2;
+ }
+ bita = bit_alloc;
+ scfsi = scfsi_buf;
+ for (i = sblimit2; i; i--)
+ if (*bita++)
+ *scfsi++ = (char) mpg123_getbits_fast(2);
+ }
+ else
+ /* mono */
+ {
+ for (i = sblimit; i; i--, alloc1 += (1 << step))
+ *bita++ = (char) mpg123_getbits(step = alloc1->bits);
+ bita = bit_alloc;
+ scfsi = scfsi_buf;
+ for (i = sblimit; i; i--)
+ if (*bita++)
+ *scfsi++ = (char) mpg123_getbits_fast(2);
+ }
+
+ bita = bit_alloc;
+ scfsi = scfsi_buf;
+ for (i = sblimit2; i; i--)
+ if (*bita++)
+ switch (*scfsi++)
+ {
+ case 0:
+ *scale++ = mpg123_getbits_fast(6);
+ *scale++ = mpg123_getbits_fast(6);
+ *scale++ = mpg123_getbits_fast(6);
+ break;
+ case 1:
+ *scale++ = sc = mpg123_getbits_fast(6);
+ *scale++ = sc;
+ *scale++ = mpg123_getbits_fast(6);
+ break;
+ case 2:
+ *scale++ = sc = mpg123_getbits_fast(6);
+ *scale++ = sc;
+ *scale++ = sc;
+ break;
+ default: /* case 3 */
+ *scale++ = mpg123_getbits_fast(6);
+ *scale++ = sc = mpg123_getbits_fast(6);
+ *scale++ = sc;
+ break;
+ }
+
+}
+
+void II_step_two(unsigned int *bit_alloc, real fraction[2][4][SBLIMIT], int *scale, struct frame *fr, int x1)
+{
+ int i, j, k, ba;
+ int stereo = fr->stereo;
+ int sblimit = fr->II_sblimit;
+ int jsbound = fr->jsbound;
+ struct al_table *alloc2, *alloc1 = fr->alloc;
+ unsigned int *bita = bit_alloc;
+ int d1, step;
+
+ for (i = 0; i < jsbound; i++, alloc1 += (1 << step))
+ {
+ step = alloc1->bits;
+ for (j = 0; j < stereo; j++)
+ {
+ if ((ba = *bita++))
+ {
+ k = (alloc2 = alloc1 + ba)->bits;
+ if ((d1 = alloc2->d) < 0)
+ {
+ real cm = mpg123_muls[k][scale[x1]];
+
+ fraction[j][0][i] = ((real) ((int) mpg123_getbits(k) + d1)) * cm;
+ fraction[j][1][i] = ((real) ((int) mpg123_getbits(k) + d1)) * cm;
+ fraction[j][2][i] = ((real) ((int) mpg123_getbits(k) + d1)) * cm;
+ }
+ else
+ {
+ static int *table[] =
+ {0, 0, 0, grp_3tab, 0, grp_5tab, 0, 0, 0, grp_9tab};
+ unsigned int idx, *tab, m = scale[x1];
+
+ idx = (unsigned int) mpg123_getbits(k);
+ tab = (unsigned int *) (table[d1] + idx + idx + idx);
+ fraction[j][0][i] = mpg123_muls[*tab++][m];
+ fraction[j][1][i] = mpg123_muls[*tab++][m];
+ fraction[j][2][i] = mpg123_muls[*tab][m];
+ }
+ scale += 3;
+ }
+ else
+ fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
+ }
+ }
+
+ for (i = jsbound; i < sblimit; i++, alloc1 += (1 << step))
+ {
+ step = alloc1->bits;
+ bita++; /* channel 1 and channel 2 bitalloc are the same */
+ if ((ba = *bita++))
+ {
+ k = (alloc2 = alloc1 + ba)->bits;
+ if ((d1 = alloc2->d) < 0)
+ {
+ real cm;
+
+ cm = mpg123_muls[k][scale[x1 + 3]];
+ fraction[1][0][i] = (fraction[0][0][i] = (real) ((int) mpg123_getbits(k) + d1)) * cm;
+ fraction[1][1][i] = (fraction[0][1][i] = (real) ((int) mpg123_getbits(k) + d1)) * cm;
+ fraction[1][2][i] = (fraction[0][2][i] = (real) ((int) mpg123_getbits(k) + d1)) * cm;
+ cm = mpg123_muls[k][scale[x1]];
+ fraction[0][0][i] *= cm;
+ fraction[0][1][i] *= cm;
+ fraction[0][2][i] *= cm;
+ }
+ else
+ {
+ static int *table[] =
+ {0, 0, 0, grp_3tab, 0, grp_5tab, 0, 0, 0, grp_9tab};
+ unsigned int idx, *tab, m1, m2;
+
+ m1 = scale[x1];
+ m2 = scale[x1 + 3];
+ idx = (unsigned int) mpg123_getbits(k);
+ tab = (unsigned int *) (table[d1] + idx + idx + idx);
+ fraction[0][0][i] = mpg123_muls[*tab][m1];
+ fraction[1][0][i] = mpg123_muls[*tab++][m2];
+ fraction[0][1][i] = mpg123_muls[*tab][m1];
+ fraction[1][1][i] = mpg123_muls[*tab++][m2];
+ fraction[0][2][i] = mpg123_muls[*tab][m1];
+ fraction[1][2][i] = mpg123_muls[*tab][m2];
+ }
+ scale += 6;
+ }
+ else
+ {
+ fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] =
+ fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0;
+ }
+/*
+ should we use individual scalefac for channel 2 or
+ is the current way the right one , where we just copy channel 1 to
+ channel 2 ??
+ The current 'strange' thing is, that we throw away the scalefac
+ values for the second channel ...!!
+ -> changed .. now we use the scalefac values of channel one !!
+ */
+ }
+
+ if (sblimit > (fr->down_sample_sblimit))
+ sblimit = fr->down_sample_sblimit;
+
+ for (i = sblimit; i < SBLIMIT; i++)
+ for (j = 0; j < stereo; j++)
+ fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
+
+}
+
+static void II_select_table(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;
+}
+
+
+int mpg123_do_layer2(struct frame *fr)
+{
+ int i, j;
+ int stereo = fr->stereo;
+ real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */
+ unsigned int bit_alloc[64];
+ int scale[192];
+ int single = fr->single;
+
+ II_select_table(fr);
+ fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
+ (fr->mode_ext << 2) + 4 : fr->II_sblimit;
+ if (fr->jsbound > fr->II_sblimit)
+ fr->jsbound = fr->II_sblimit;
+
+ if (stereo == 1 || single == 3)
+ single = 0;
+
+ II_step_one(bit_alloc, scale, fr);
+
+ for (i = 0; i < SCALE_BLOCK; i++)
+ {
+ II_step_two(bit_alloc, fraction, scale, fr, i >> 2);
+ for (j = 0; j < 3; j++)
+ {
+ if (single >= 0)
+ {
+ (fr->synth_mono) (fraction[single][j], mpg123_pcm_sample, &mpg123_pcm_point);
+ }
+ else
+ {
+ int p1 = mpg123_pcm_point;
+
+ (fr->synth) (fraction[0][j], 0, mpg123_pcm_sample, &p1);
+ (fr->synth) (fraction[1][j], 1, mpg123_pcm_sample, &mpg123_pcm_point);
+ }
+
+ /* if(mpg123_pcm_point >= audiobufsize)
+ audio_flush(outmode,ai); */
+ }
+ }
+/***
+ if (mpg123_info->output_audio)
+ {
+
+ mpg123_ip.add_vis_pcm(mpg123_ip.output->written_time(), mpg123_cfg.resolution == 16 ? FMT_S16_NE : FMT_U8,
+ mpg123_cfg.channels == 2 ? fr->stereo : 1, mpg123_pcm_point, mpg123_pcm_sample);
+
+ while (mpg123_ip.output->buffer_free() < mpg123_pcm_point && mpg123_info->going && mpg123_info->jump_to_time == -1)
+ xmms_usleep(10000);
+ if (mpg123_info->going && mpg123_info->jump_to_time == -1)
+ mpg123_ip.output->write_audio(mpg123_pcm_sample, mpg123_pcm_point);
+
+ }
+***/
+ mpg123_pcm_point = 0;
+
+ return 1;
+}
diff --git a/src/libmpg123/layer3.c b/src/libmpg123/layer3.c
new file mode 100755
index 0000000..c7cb8cd
--- /dev/null
+++ b/src/libmpg123/layer3.c
@@ -0,0 +1,2100 @@
+
+/*
+ * Mpeg Layer-3 audio decoder
+ * --------------------------
+ * copyright (c) 1995-1999 by Michael Hipp.
+ * All rights reserved. See also 'README'
+ *
+ * Optimize-TODO: put short bands into the band-field without the stride of 3 reals
+ * Length-optimze: unify long and short band code where it is possible
+ */
+
+#include <stdlib.h>
+#include "mpg123.h"
+#include "huffman.h"
+
+#include "getbits.h"
+
+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];
+real COS9[9];
+static real COS6_1, COS6_2;
+real tfcos36[9];
+static real tfcos12[3];
+#define NEW_DCT9
+#ifdef NEW_DCT9
+static real cos9[3], cos18[3];
+#endif
+
+struct bandInfoStruct
+{
+ int longIdx[23];
+ int longDiff[22];
+ int shortIdx[14];
+ int shortDiff[13];
+};
+
+int longLimit[9][23];
+int shortLimit[9][14];
+
+/* Used by the getbits macros */
+static unsigned long rval;
+static unsigned char rval_uc;
+
+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 } ,
+*/
+/* changed 19th value fropm 330 to 332 */
+ { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576},
+ {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,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 tables for layer-3
+ */
+void mpg123_init_layer3(int down_sample_sblimit)
+{
+ 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);
+
+#ifdef NEW_DCT9
+ cos9[0] = cos(1.0 * M_PI / 9.0);
+ cos9[1] = cos(5.0 * M_PI / 9.0);
+ cos9[2] = cos(7.0 * M_PI / 9.0);
+ cos18[0] = cos(1.0 * M_PI / 18.0);
+ cos18[1] = cos(11.0 * M_PI / 18.0);
+ cos18[2] = cos(13.0 * M_PI / 18.0);
+#endif
+
+ 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 < len[j]; i += 2)
+ win1[j][i] = +win[j][i];
+ for (i = 1; i < len[j]; i += 2)
+ win1[j][i] = -win[j][i];
+ }
+
+ for (i = 0; i < 16; i++)
+ {
+ double t = tan((double) i * M_PI / 12.0);
+
+ tan1_1[i] = t / (1.0 + t);
+ tan2_1[i] = 1.0 / (1.0 + t);
+ tan1_2[i] = M_SQRT2 * t / (1.0 + t);
+ tan2_2[i] = M_SQRT2 / (1.0 + t);
+
+ for (j = 0; j < 2; j++)
+ {
+ double base = pow(2.0, -0.25 * (j + 1.0));
+ double p1 = 1.0, p2 = 1.0;
+
+ if (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;
+ int *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 (j = 0; j < 9; j++)
+ {
+ for (i = 0; i < 23; i++)
+ {
+ longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
+ if (longLimit[j][i] > (down_sample_sblimit))
+ longLimit[j][i] = down_sample_sblimit;
+ }
+ for (i = 0; i < 14; i++)
+ {
+ shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
+ if (shortLimit[j][i] > (down_sample_sblimit))
+ shortLimit[j][i] = down_sample_sblimit;
+ }
+ }
+
+ 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);
+ }
+ }
+ }
+}
+
+/*
+ * read additional side information (for MPEG 1 and MPEG 2)
+ */
+static int III_get_side_info(struct III_sideinfo *si, int stereo,
+ int ms_stereo, long sfreq, int single, int lsf)
+{
+ int ch, gr;
+ int powdiff = (single == 3) ? 4 : 0;
+
+ static const int tabs[2][5] = { {2, 9, 5, 3, 4}, {1, 8, 1, 2, 9} };
+ const int *tab = tabs[lsf];
+
+ si->main_data_begin = mpg123_getbits(tab[1]);
+ if (stereo == 1)
+ si->private_bits = mpg123_getbits_fast(tab[2]);
+ else
+ si->private_bits = mpg123_getbits_fast(tab[3]);
+
+ if (!lsf)
+ {
+ for (ch = 0; ch < stereo; ch++)
+ {
+ si->ch[ch].gr[0].scfsi = -1;
+ si->ch[ch].gr[1].scfsi = mpg123_getbits_fast(4);
+ }
+ }
+
+ for (gr = 0; gr < tab[0]; gr++)
+ {
+ for (ch = 0; ch < stereo; ch++)
+ {
+ register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
+
+ gr_info->part2_3_length = mpg123_getbits(12);
+ gr_info->big_values = mpg123_getbits(9);
+ if (gr_info->big_values > 288)
+ {
+ /* fprintf(stderr, "big_values too large!\n"); */
+ /* gr_info->big_values = 288; */
+ return 0;
+ }
+ gr_info->pow2gain = gainpow2 + 256 - mpg123_getbits_fast(8) + powdiff;
+ if (ms_stereo)
+ gr_info->pow2gain += 2;
+ gr_info->scalefac_compress = mpg123_getbits(tab[4]);
+
+ if (mpg123_get1bit())
+ { /* window switch flag */
+ int i;
+
+ gr_info->block_type = mpg123_getbits_fast(2);
+ gr_info->mixed_block_flag = mpg123_get1bit();
+ gr_info->table_select[0] = mpg123_getbits_fast(5);
+ gr_info->table_select[1] = mpg123_getbits_fast(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 + (mpg123_getbits_fast(3) << 3);
+
+ if (gr_info->block_type == 0)
+ {
+ /* fprintf(stderr, "Blocktype == 0 and window-switching == 1 not allowed.\n"); */
+ /* exit(1); */
+ return 0;
+ }
+
+ /* region_count/start parameters are implicit in this case. */
+ if (!lsf || gr_info->block_type == 2)
+ gr_info->region1start = 36 >> 1;
+ else
+ {
+ /* check this again for 2.5 and sfreq=8 */
+ if (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] = mpg123_getbits_fast(5);
+ r0c = mpg123_getbits_fast(4);
+ r1c = mpg123_getbits_fast(3);
+ gr_info->region1start = bandInfo[sfreq].longIdx[r0c + 1] >> 1;
+ if (r0c + r1c + 2 > 22)
+ gr_info->region2start = 576 >> 1;
+ else
+ gr_info->region2start = bandInfo[sfreq].longIdx[r0c + 1 + r1c + 1] >> 1;
+ gr_info->block_type = 0;
+ gr_info->mixed_block_flag = 0;
+ }
+ if (!lsf)
+ gr_info->preflag = mpg123_get1bit();
+ gr_info->scalefac_scale = mpg123_get1bit();
+ gr_info->count1table_select = mpg123_get1bit();
+ }
+ }
+ return 1;
+}
+
+
+/*
+ * read scalefactors
+ */
+static int III_get_scale_factors_1(int *scf, struct gr_info_s *gr_info)
+{
+ static const 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++ = mpg123_getbits_fast(num0);
+ i = 9;
+ numbits -= num0; /* num0 * 17 + num1 * 18 */
+ }
+
+ for (; i; i--)
+ *scf++ = mpg123_getbits_fast(num0);
+ for (i = 18; i; i--)
+ *scf++ = mpg123_getbits_fast(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++ = mpg123_getbits_fast(num0);
+ for (i = 10; i; i--)
+ *scf++ = mpg123_getbits_fast(num1);
+ numbits = (num0 + num1) * 10 + num0;
+ *scf++ = 0;
+ }
+ else
+ {
+ numbits = 0;
+ if (!(scfsi & 0x8))
+ {
+ for (i = 0; i < 6; i++)
+ *scf++ = mpg123_getbits_fast(num0);
+ numbits += num0 * 6;
+ }
+ else
+ {
+ scf += 6;
+ }
+
+ if (!(scfsi & 0x4))
+ {
+ for (i = 0; i < 5; i++)
+ *scf++ = mpg123_getbits_fast(num0);
+ numbits += num0 * 5;
+ }
+ else
+ {
+ scf += 5;
+ }
+
+ if (!(scfsi & 0x2))
+ {
+ for (i = 0; i < 5; i++)
+ *scf++ = mpg123_getbits_fast(num1);
+ numbits += num1 * 5;
+ }
+ else
+ {
+ scf += 5;
+ }
+
+ if (!(scfsi & 0x1))
+ {
+ for (i = 0; i < 5; i++)
+ *scf++ = mpg123_getbits_fast(num1);
+ numbits += num1 * 5;
+ }
+ else
+ {
+ scf += 5;
+ }
+ *scf++ = 0; /* no l[21] in original sources */
+ }
+ }
+ return numbits;
+}
+
+static int III_get_scale_factors_2(int *scf, struct gr_info_s *gr_info, int i_stereo)
+{
+ unsigned char *pnt;
+ int i, j, n = 0, numbits = 0;
+ unsigned int slen;
+
+ 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 -> mpg123_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++ = mpg123_getbits_fast(num);
+ numbits += pnt[i] * num;
+ }
+ else
+ {
+ for (j = 0; j < (int) (pnt[i]); j++)
+ *scf++ = 0;
+ }
+ }
+
+ n = (n << 1) + 1;
+ for (i = 0; i < n; i++)
+ *scf++ = 0;
+
+ return numbits;
+}
+
+static int pretab1[22] =
+{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0};
+static int pretab2[22] =
+{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+/*
+ * Dequantize samples (includes huffman decoding)
+ */
+/* 24 is enough because tab13 has max. a 19 bit huffvector */
+#define BITSHIFT (int)((sizeof (long) - 1) * 8)
+
+#define REFRESH_MASK() \
+while(num < BITSHIFT) { \
+ mask |= ((unsigned long)mpg123_getbyte()) << (BITSHIFT - num); \
+ num += 8; \
+ part2remain -= 8; \
+}
+
+static int III_dequantize_sample(real xr[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;
+ int l[3], l3;
+ int part2remain = gr_info->part2_3_length - part2bits;
+ int *me;
+
+ int num = mpg123_getbitoffset();
+ long mask;
+ /* we must split this, because for num==0 the shift is undefined if you do it in one step */
+ mask = ((unsigned long) mpg123_getbits(num)) << BITSHIFT;
+ mask <<= 8 - num;
+ part2remain -= num;
+
+ {
+ 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 = 3, 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;
+
+ REFRESH_MASK();
+ while ((y = *val++) < 0)
+ {
+ if (mask < 0)
+ val -= y;
+ num--;
+ mask <<= 1;
+ }
+ x = y >> 4;
+ y &= 0xf;
+ }
+ if (x == 15 && h->linbits)
+ {
+ max[lwin] = cb;
+ REFRESH_MASK();
+ x += ((unsigned long) mask) >> (BITSHIFT + 8 - h->linbits);
+ num -= h->linbits + 1;
+ mask <<= h->linbits;
+ if (mask < 0)
+ *xrpnt = -ispow[x] * v;
+ else
+ *xrpnt = ispow[x] * v;
+ mask <<= 1;
+ }
+ else if (x)
+ {
+ max[lwin] = cb;
+ if (mask < 0)
+ *xrpnt = -ispow[x] * v;
+ else
+ *xrpnt = ispow[x] * v;
+ num--;
+ mask <<= 1;
+ }
+ else
+ *xrpnt = 0.0;
+ xrpnt += step;
+ if (y == 15 && h->linbits)
+ {
+ max[lwin] = cb;
+ REFRESH_MASK();
+ y += ((unsigned long) mask) >> (BITSHIFT + 8 - h->linbits);
+ num -= h->linbits + 1;
+ mask <<= h->linbits;
+ if (mask < 0)
+ *xrpnt = -ispow[y] * v;
+ else
+ *xrpnt = ispow[y] * v;
+ mask <<= 1;
+ }
+ else if (y)
+ {
+ max[lwin] = cb;
+ if (mask < 0)
+ *xrpnt = -ispow[y] * v;
+ else
+ *xrpnt = ispow[y] * v;
+ num--;
+ mask <<= 1;
+ }
+ else
+ *xrpnt = 0.0;
+ xrpnt += step;
+ }
+ }
+
+ for (; l3 && (part2remain + num > 0); l3--)
+ {
+ struct newhuff *h = htc + gr_info->count1table_select;
+ register short *val = h->table, a;
+
+ REFRESH_MASK();
+ while ((a = *val++) < 0)
+ {
+ if (mask < 0)
+ val -= a;
+ num--;
+ mask <<= 1;
+ }
+ if (part2remain + num <= 0)
+ {
+ num -= part2remain + num;
+ break;
+ }
+
+ 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;
+ if (part2remain + num <= 0)
+ {
+ break;
+ }
+ if (mask < 0)
+ *xrpnt = -v;
+ else
+ *xrpnt = v;
+ num--;
+ mask <<= 1;
+ }
+ else
+ *xrpnt = 0.0;
+ xrpnt += step;
+ }
+ }
+
+ if (lwin < 3)
+ { /* short band? */
+ while (1)
+ {
+ /* HACK Prevent overflowing the xr buffer */
+ if (mc * 6 > &xr[SBLIMIT][SSLIMIT] - xrpnt)
+ return 1;
+
+ for (; mc > 0; mc--)
+ {
+ *xrpnt = 0.0;
+ xrpnt += 3; /* short band -> step=3 */
+ *xrpnt = 0.0;
+ xrpnt += 3;
+ }
+ if (m >= me)
+ break;
+ mc = *m++;
+ xrpnt = ((real *) xr) + *m++;
+ if (*m++ == 0)
+ break; /* optimize: field will be set to zero at the end of the function */
+ m++; /* cb */
+ }
+ }
+
+ 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 ? shortLimit[sfreq][rmax] : 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;
+ int *m = map[sfreq][2];
+ register real v = 0.0;
+ int mc = 0;
+
+ /*
+ * 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++;
+ cb = *m++;
+/* if (cb == 21) */
+/* v = 0.0; */
+/* else */
+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+
+ }
+ {
+ register short *val = h->table;
+ REFRESH_MASK();
+ while ((y = *val++) < 0)
+ {
+ if (mask < 0)
+ val -= y;
+ num--;
+ mask <<= 1;
+ }
+ x = y >> 4;
+ y &= 0xf;
+ }
+
+ if (x == 15 && h->linbits)
+ {
+ max = cb;
+ REFRESH_MASK();
+ x += ((unsigned long) mask) >> (BITSHIFT + 8 - h->linbits);
+ num -= h->linbits + 1;
+ mask <<= h->linbits;
+ if (mask < 0)
+ *xrpnt++ = -ispow[x] * v;
+ else
+ *xrpnt++ = ispow[x] * v;
+ mask <<= 1;
+ }
+ else if (x)
+ {
+ max = cb;
+ if (mask < 0)
+ *xrpnt++ = -ispow[x] * v;
+ else
+ *xrpnt++ = ispow[x] * v;
+ num--;
+ mask <<= 1;
+ }
+ else
+ *xrpnt++ = 0.0;
+
+ if (y == 15 && h->linbits)
+ {
+ max = cb;
+ REFRESH_MASK();
+ y += ((unsigned long) mask) >> (BITSHIFT + 8 - h->linbits);
+ num -= h->linbits + 1;
+ mask <<= h->linbits;
+ if (mask < 0)
+ *xrpnt++ = -ispow[y] * v;
+ else
+ *xrpnt++ = ispow[y] * v;
+ mask <<= 1;
+ }
+ else if (y)
+ {
+ max = cb;
+ if (mask < 0)
+ *xrpnt++ = -ispow[y] * v;
+ else
+ *xrpnt++ = ispow[y] * v;
+ num--;
+ mask <<= 1;
+ }
+ else
+ *xrpnt++ = 0.0;
+ }
+ }
+
+ /*
+ * short (count1table) values
+ */
+ for (; l3 && (part2remain + num > 0); l3--)
+ {
+ struct newhuff *h = htc + gr_info->count1table_select;
+ register short *val = h->table, a;
+
+ REFRESH_MASK();
+ while ((a = *val++) < 0)
+ {
+ if (mask < 0)
+ val -= a;
+ num--;
+ mask <<= 1;
+ }
+ if (part2remain + num <= 0)
+ {
+ num -= part2remain + num;
+ break;
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!(i & 1))
+ {
+ if (!mc)
+ {
+ mc = *m++;
+ cb = *m++;
+/* if (cb == 21) */
+/* v = 0.0; */
+/* else */
+ v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+ }
+ mc--;
+ }
+ if ((a & (0x8 >> i)))
+ {
+ max = cb;
+ if (part2remain + num <= 0)
+ {
+ break;
+ }
+ if (mask < 0)
+ *xrpnt++ = -v;
+ else
+ *xrpnt++ = v;
+ num--;
+ mask <<= 1;
+ }
+ else
+ *xrpnt++ = 0.0;
+ }
+ }
+
+ gr_info->maxbandl = max + 1;
+ gr_info->maxb = longLimit[sfreq][gr_info->maxbandl];
+ }
+
+ part2remain += num;
+ mpg123_backbits(num);
+ num = 0;
+
+ while (xrpnt < &xr[SBLIMIT][0])
+ *xrpnt++ = 0.0;
+
+ while (part2remain > 16)
+ {
+ mpg123_getbits(16); /* Dismiss stuffing Bits */
+ part2remain -= 16;
+ }
+ if (part2remain > 0)
+ mpg123_getbits(part2remain);
+ else if (part2remain < 0)
+ {
+/* fprintf(stderr, "mpg123: Can't rewind stream by %d bits!\n", */
+/* -part2remain); */
+ return 1; /* -> error */
+ }
+ return 0;
+}
+
+/*
+ * 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];
+
+ const real *tab1, *tab2;
+
+#if 1
+ int tab;
+ static const real *tabs[3][2][2] = {
+ {{tan1_1, tan2_1}, {tan1_2, tan2_2}},
+ {{pow1_1[0], pow2_1[0]}, {pow1_2[0], pow2_2[0]}},
+ {{pow1_1[1], pow2_1[1]}, {pow1_2[1], pow2_2[1]}}
+ };
+
+ tab = lsf + (gr_info->scalefac_compress & lsf);
+ tab1 = tabs[tab][ms_stereo][0];
+ tab2 = tabs[tab][ms_stereo][1];
+#else
+ 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;
+ }
+ }
+#endif
+
+ 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; .. ; . ) */
+
+/* also check l-part, if ALL bands in the three windows are 'empty'
+ * and mode = mixed_mode
+ */
+ if (do_l)
+ {
+ 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];
+
+/* hmm ... maybe the maxbandl stuff for i-stereo is buggy? */
+ if (sfb <= 21)
+ {
+ 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];
+ if (is_p != 7)
+ { /* copy l-band 20 to l-band 21 */
+ 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];
+
+ if (sblim < 1 || sblim > SBLIMIT)
+ return;
+
+ 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++));
+ }
+ }
+ }
+}
+
+/*
+ This is an optimized DCT from Jeff Tsay's maplay 1.2+ package.
+ Saved one multiplication by doing the 'twiddle factor' stuff
+ together with the window mul. (MH)
+
+ This uses Byeong Gi Lee's Fast Cosine Transform algorithm, but the
+ 9 point IDCT needs to be reduced further. Unfortunately, I don't
+ know how to do that, because 9 is not an even number. - Jeff.
+
+ ****************************************************************
+
+ 9 Point Inverse Discrete Cosine Transform
+
+ This piece of code is Copyright 1997 Mikko Tommila and is freely usable
+ by anybody. The algorithm itself is of course in the public domain.
+
+ Again derived heuristically from the 9-point WFTA.
+
+ The algorithm is optimized (?) for speed, not for small rounding errors or
+ good readability.
+
+ 36 additions, 11 multiplications
+
+ Again this is very likely sub-optimal.
+
+ The code is optimized to use a minimum number of temporary variables,
+ so it should compile quite well even on 8-register Intel x86 processors.
+ This makes the code quite obfuscated and very difficult to understand.
+
+ References:
+ [1] S. Winograd: "On Computing the Discrete Fourier Transform",
+ Mathematics of Computation, Volume 32, Number 141, January 1978,
+ Pages 175-199
+*/
+
+/*------------------------------------------------------------------*/
+/* */
+/* Function: Calculation of the inverse MDCT */
+/* */
+/*------------------------------------------------------------------*/
+
+#ifdef USE_3DNOW
+void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
+#else
+static void dct36(real * inbuf, real * o1, real * o2, real * wintab, real * tsbuf)
+#endif
+{
+#ifdef NEW_DCT9
+ real tmp[18];
+#endif
+
+ {
+ 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];
+
+
+#ifdef NEW_DCT9
+#if 1
+ {
+ real t3;
+ {
+ real t0, t1, t2;
+
+ t0 = COS6_2 * (in[8] + in[16] - in[4]);
+ t1 = COS6_2 * in[12];
+
+ t3 = in[0];
+ t2 = t3 - t1 - t1;
+ tmp[1] = tmp[7] = t2 - t0;
+ tmp[4] = t2 + t0 + t0;
+ t3 += t1;
+
+ t2 = COS6_1 * (in[10] + in[14] - in[2]);
+ tmp[1] -= t2;
+ tmp[7] += t2;
+ }
+ {
+ real t0, t1, t2;
+
+ t0 = cos9[0] * (in[4] + in[8]);
+ t1 = cos9[1] * (in[8] - in[16]);
+ t2 = cos9[2] * (in[4] + in[16]);
+
+ tmp[2] = tmp[6] = t3 - t0 - t2;
+ tmp[0] = tmp[8] = t3 + t0 + t1;
+ tmp[3] = tmp[5] = t3 - t1 + t2;
+ }
+ }
+ {
+ real t1, t2, t3;
+
+ t1 = cos18[0] * (in[2] + in[10]);
+ t2 = cos18[1] * (in[10] - in[14]);
+ t3 = COS6_1 * in[6];
+
+ {
+ real t0 = t1 + t2 + t3;
+ tmp[0] += t0;
+ tmp[8] -= t0;
+ }
+
+ t2 -= t3;
+ t1 -= t3;
+
+ t3 = cos18[2] * (in[2] + in[14]);
+
+ t1 += t3;
+ tmp[3] += t1;
+ tmp[5] -= t1;
+
+ t2 -= t3;
+ tmp[2] += t2;
+ tmp[6] -= t2;
+ }
+
+#else
+ {
+ real t0, t1, t2, t3, t4, t5, t6, t7;
+
+ t1 = COS6_2 * in[12];
+ t2 = COS6_2 * (in[8] + in[16] - in[4]);
+
+ t3 = in[0] + t1;
+ t4 = in[0] - t1 - t1;
+ t5 = t4 - t2;
+ tmp[4] = t4 + t2 + t2;
+
+ t0 = cos9[0] * (in[4] + in[8]);
+ t1 = cos9[1] * (in[8] - in[16]);
+
+ t2 = cos9[2] * (in[4] + in[16]);
+
+ t6 = t3 - t0 - t2;
+ t0 += t3 + t1;
+ t3 += t2 - t1;
+
+ t2 = cos18[0] * (in[2] + in[10]);
+ t4 = cos18[1] * (in[10] - in[14]);
+ t7 = COS6_1 * in[6];
+
+ t1 = t2 + t4 + t7;
+ tmp[0] = t0 + t1;
+ tmp[8] = t0 - t1;
+ t1 = cos18[2] * (in[2] + in[14]);
+ t2 += t1 - t7;
+
+ tmp[3] = t3 + t2;
+ t0 = COS6_1 * (in[10] + in[14] - in[2]);
+ tmp[5] = t3 - t2;
+
+ t4 -= t1 + t7;
+
+ tmp[1] = t5 - t0;
+ tmp[7] = t5 + t0;
+ tmp[2] = t6 + t4;
+ tmp[6] = t6 - t4;
+ }
+#endif
+
+ {
+ real t0, t1, t2, t3, t4, t5, t6, t7;
+
+ t1 = COS6_2 * in[13];
+ t2 = COS6_2 * (in[9] + in[17] - in[5]);
+
+ t3 = in[1] + t1;
+ t4 = in[1] - t1 - t1;
+ t5 = t4 - t2;
+
+ t0 = cos9[0] * (in[5] + in[9]);
+ t1 = cos9[1] * (in[9] - in[17]);
+
+ tmp[13] = (t4 + t2 + t2) * tfcos36[17 - 13];
+ t2 = cos9[2] * (in[5] + in[17]);
+
+ t6 = t3 - t0 - t2;
+ t0 += t3 + t1;
+ t3 += t2 - t1;
+
+ t2 = cos18[0] * (in[3] + in[11]);
+ t4 = cos18[1] * (in[11] - in[15]);
+ t7 = COS6_1 * in[7];
+
+ t1 = t2 + t4 + t7;
+ tmp[17] = (t0 + t1) * tfcos36[17 - 17];
+ tmp[9] = (t0 - t1) * tfcos36[17 - 9];
+ t1 = cos18[2] * (in[3] + in[15]);
+ t2 += t1 - t7;
+
+ tmp[14] = (t3 + t2) * tfcos36[17 - 14];
+ t0 = COS6_1 * (in[11] + in[15] - in[3]);
+ tmp[12] = (t3 - t2) * tfcos36[17 - 12];
+
+ t4 -= t1 + t7;
+
+ tmp[16] = (t5 - t0) * tfcos36[17 - 16];
+ tmp[10] = (t5 + t0) * tfcos36[17 - 10];
+ tmp[15] = (t6 + t4) * tfcos36[17 - 15];
+ tmp[11] = (t6 - t4) * tfcos36[17 - 11];
+ }
+
+#define MACRO(v) \
+do { \
+ real tmpval; \
+ \
+ tmpval = tmp[(v)] + tmp[17-(v)]; \
+ out2[9+(v)] = tmpval * w[27+(v)]; \
+ out2[8-(v)] = tmpval * w[26-(v)]; \
+ tmpval = tmp[(v)] - tmp[17-(v)]; \
+ ts[SBLIMIT*(8-(v))] = out1[8-(v)] + tmpval * w[8-(v)]; \
+ ts[SBLIMIT*(9+(v))] = out1[9+(v)] + tmpval * w[9+(v)]; \
+} while (0)
+
+ {
+ register real *out2 = o2;
+ register real *w = wintab;
+ register real *out1 = o1;
+ register real *ts = tsbuf;
+
+ MACRO(0);
+ MACRO(1);
+ MACRO(2);
+ MACRO(3);
+ MACRO(4);
+ MACRO(5);
+ MACRO(6);
+ MACRO(7);
+ MACRO(8);
+ }
+
+#else
+
+ {
+
+#define MACRO0(v) \
+do { \
+ 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)]; \
+} while (0)
+
+#define MACRO1(v) \
+do { \
+ real sum0,sum1; \
+ sum0 = tmp1a + tmp2a; \
+ sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \
+ MACRO0(v); \
+} while (0)
+
+#define MACRO2(v) \
+do { \
+ real sum0, sum1; \
+ sum0 = tmp2a - tmp1a; \
+ sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \
+ MACRO0(v); \
+} while (0)
+
+ 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] + in[2 * 0 + 0];
+ tb33 = in[2 * 3 + 1] * c[3];
+ tb66 = in[2 * 6 + 1] * c[6] + in[2 * 0 + 1];
+
+ {
+ 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 * 2 + 0] * c[2] + in[2 * 4 + 0] * c[4] + ta66 + in[2 * 8 + 0] * c[8];
+ tmp2b = 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 * 2 + 0] * c[8] - in[2 * 4 + 0] * c[2] + ta66 + in[2 * 8 + 0] * c[4];
+ tmp2b = -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 * 2 + 0] * c[4] + in[2 * 4 + 0] * c[8] + ta66 - in[2 * 8 + 0] * c[2];
+ tmp2b = -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);
+ }
+ }
+#endif
+
+ }
+}
+
+/*
+ * new DCT12
+ */
+static void dct12(real * in, real * rawout1, real * rawout2, register real * wi, register real * ts)
+{
+
+#define DCT12_PART1() \
+do { \
+ 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; \
+} while (0)
+
+#define DCT12_PART2() \
+do { \
+ 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; \
+} while (0)
+
+
+ {
+ 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(real fsIn[SBLIMIT][SSLIMIT],
+ real tsOut[SSLIMIT][SBLIMIT], int ch,
+ struct gr_info_s *gr_info, struct frame *fr)
+{
+ static real block[2][2][SBLIMIT * SSLIMIT] = { {{0,}} };
+ static int blc[2] = { 0, 0 };
+
+ real *tspnt = (real *) tsOut;
+ real *rawout1, *rawout2;
+ int bt;
+ unsigned 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;
+#ifdef USE_3DNOW
+ (fr->dct36)(fsIn[0],rawout1,rawout2,win[0],tspnt);
+ (fr->dct36)(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1);
+#else
+ dct36(fsIn[0], rawout1, rawout2, win[0], tspnt);
+ dct36(fsIn[1], rawout1 + 18, rawout2 + 18, win1[0], tspnt + 1);
+#endif
+ rawout1 += 36;
+ rawout2 += 36;
+ tspnt += 2;
+ }
+
+ bt = gr_info->block_type;
+ if (bt == 2)
+ {
+ for (; sb < gr_info->maxb; 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 (; sb < gr_info->maxb; sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36)
+ {
+#ifdef USE_3DNOW
+ (fr->dct36)(fsIn[sb],rawout1,rawout2,win[bt],tspnt);
+ (fr->dct36)(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1);
+#else
+ dct36(fsIn[sb], rawout1, rawout2, win[bt], tspnt);
+ dct36(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[bt], tspnt + 1);
+#endif
+ }
+ }
+
+ for (; sb < SBLIMIT; sb++, tspnt++)
+ {
+ int i;
+ for (i = 0; i < SSLIMIT; i++)
+ {
+ tspnt[i * SBLIMIT] = *rawout1++;
+ *rawout2++ = 0.0;
+ }
+ }
+}
+
+/*
+ * main layer3 handler
+ */
+int mpg123_do_layer3(struct frame *fr)
+{
+ int gr, ch, ss;
+ int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
+ struct III_sideinfo sideinfo;
+ int stereo = fr->stereo;
+ int single = fr->single;
+ int ms_stereo, i_stereo;
+ int sfreq = fr->sampling_frequency;
+ int stereo1, granules;
+
+ 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) >> 1;
+ i_stereo = fr->mode_ext & 0x1;
+ }
+ else
+ ms_stereo = i_stereo = 0;
+
+ granules = fr->lsf ? 1 : 2;
+ if (!III_get_side_info(&sideinfo, stereo, ms_stereo, sfreq, single, fr->lsf))
+ return 0;
+
+ mpg123_set_pointer(sideinfo.main_data_begin);
+
+ for (gr = 0; gr < granules; gr++)
+ {
+ real hybridIn[2][SBLIMIT][SSLIMIT];
+ real hybridOut[2][SSLIMIT][SBLIMIT];
+
+ {
+ struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
+ long part2bits;
+
+ if (fr->lsf)
+ part2bits = III_get_scale_factors_2(scalefacs[0], gr_info, 0);
+ else
+ part2bits = III_get_scale_factors_1(scalefacs[0], gr_info);
+
+ if (III_dequantize_sample(hybridIn[0], scalefacs[0], gr_info, sfreq, part2bits))
+ return 0;
+ }
+
+ 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(scalefacs[1], gr_info, i_stereo);
+ else
+ part2bits = III_get_scale_factors_1(scalefacs[1], gr_info);
+
+ if (III_dequantize_sample(hybridIn[1], scalefacs[1], gr_info, sfreq, part2bits))
+ return 0;
+
+ if (ms_stereo)
+ {
+ int i;
+ unsigned maxb = sideinfo.ch[0].gr[gr].maxb;
+
+ if (sideinfo.ch[1].gr[gr].maxb > maxb)
+ maxb = sideinfo.ch[1].gr[gr].maxb;
+ for (i = 0; i < SSLIMIT * maxb; i++)
+ {
+ real tmp0 = ((real *) hybridIn[0])[i];
+ real tmp1 = ((real *) hybridIn[1])[i];
+ ((real *) hybridIn[0])[i] = tmp0 + tmp1;
+ ((real *) hybridIn[1])[i] = tmp0 - tmp1;
+ }
+ }
+
+ if (i_stereo)
+ III_i_stereo(hybridIn, scalefacs[1], gr_info, sfreq, ms_stereo, fr->lsf);
+
+ 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 unsigned i;
+ register real *in0 = (real *) hybridIn[0],
+ *in1 = (real *) hybridIn[1];
+ for (i = 0; i < SSLIMIT * gr_info->maxb; i++, in0++)
+ *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
+ }
+ break;
+ case 1:
+ {
+ register unsigned i;
+ register real *in0 = (real *) hybridIn[0],
+ *in1 = (real *) hybridIn[1];
+ for (i = 0; i < SSLIMIT * gr_info->maxb; i++)
+ *in0++ = *in1++;
+ }
+ break;
+ }
+ }
+/***
+ if (mpg123_info->eq_active)
+ {
+ int i, sb;
+
+ if (single < 0)
+ {
+ for (sb = 0, i = 0; sb < SBLIMIT; sb++)
+ {
+ for (ss = 0; ss < SSLIMIT; ss++)
+ {
+ hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i];
+ hybridIn[1][sb][ss] *= mpg123_info->eq_mul[i++];
+ }
+ }
+ }
+ else
+ {
+ for (sb = 0, i = 0; sb < SBLIMIT; sb++)
+ {
+ for (ss = 0; ss < SSLIMIT; ss++)
+ hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i++];
+ }
+ }
+ }
+***/
+
+ for (ch = 0; ch < stereo1; ch++)
+ {
+ struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
+
+ III_antialias(hybridIn[ch], gr_info);
+ if (gr_info->maxb < 1 || gr_info->maxb > SBLIMIT)
+ return 0;
+ III_hybrid(hybridIn[ch], hybridOut[ch], ch, gr_info, fr);
+ }
+
+ for (ss = 0; ss < SSLIMIT; ss++)
+ {
+ if (single >= 0)
+ {
+ (fr->synth_mono) (hybridOut[0][ss], mpg123_pcm_sample, &mpg123_pcm_point);
+ }
+ else
+ {
+ int p1 = mpg123_pcm_point;
+
+ (fr->synth) (hybridOut[0][ss], 0, mpg123_pcm_sample, &p1);
+ (fr->synth) (hybridOut[1][ss], 1, mpg123_pcm_sample, &mpg123_pcm_point);
+ }
+ }
+
+/***
+ if (mpg123_info->output_audio)
+ {
+ mpg123_ip.add_vis_pcm(mpg123_ip.output->written_time(),
+ mpg123_cfg.resolution == 16 ? FMT_S16_NE : FMT_U8,
+ mpg123_cfg.channels == 2 ? fr->stereo : 1,
+ mpg123_pcm_point, mpg123_pcm_sample);
+ while (mpg123_ip.output->buffer_free() < mpg123_pcm_point &&
+ mpg123_info->going && mpg123_info->jump_to_time == -1)
+ xmms_usleep(10000);
+ if (mpg123_info->going && mpg123_info->jump_to_time == -1)
+ mpg123_ip.output->write_audio(mpg123_pcm_sample, mpg123_pcm_point);
+ }
+***/
+ mpg123_pcm_point = 0;
+ }
+ return 1;
+}
diff --git a/src/libmpg123/mpg123.c b/src/libmpg123/mpg123.c
new file mode 100755
index 0000000..1def17e
--- /dev/null
+++ b/src/libmpg123/mpg123.c
@@ -0,0 +1,172 @@
+/* XMMS - Cross-platform multimedia player
+ * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies
+ * Copyright (C) 1999,2000 Håvard Kvålen
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Note : removed code not used in EasyTAG
+ */
+
+#include "mpg123.h"
+
+
+double mpg123_compute_tpf(struct frame *fr)
+{
+ const int bs[4] = {0, 384, 1152, 1152};
+ double tpf;
+
+ tpf = bs[fr->lay];
+ tpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+ return tpf;
+}
+
+
+static guint32 convert_to_header(guint8 * buf)
+{
+
+ return (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
+}
+
+
+#define DET_BUF_SIZE 1024
+
+#if 0 /* Not used at the present time */
+static gboolean mpg123_detect_by_content(gchar *filename)
+{
+ FILE *file;
+ guchar tmp[4];
+ guint32 head;
+ struct frame fr;
+ guchar buf[DET_BUF_SIZE];
+ gint in_buf, i;
+
+ if((file = fopen(filename, "rb")) == NULL)
+ return FALSE;
+ if (fread(tmp, 1, 4, file) != 4)
+ goto done;
+ head = convert_to_header(tmp);
+ while(!mpg123_head_check(head))
+ {
+ /*
+ * The mpeg-stream can start anywhere in the file,
+ * so we check the entire file
+ */
+ /* Optimize this */
+ in_buf = fread(buf, 1, DET_BUF_SIZE, file);
+ if(in_buf == 0)
+ goto done;
+
+ for (i = 0; i < in_buf; i++)
+ {
+ head <<= 8;
+ head |= buf[i];
+ if(mpg123_head_check(head))
+ {
+ fseek(file, i+1-in_buf, SEEK_CUR);
+ break;
+ }
+ }
+ }
+ if (mpg123_decode_header(&fr, head))
+ {
+ /*
+ * We found something which looks like a MPEG-header.
+ * We check the next frame too, to be sure
+ */
+
+ if (fseek(file, fr.framesize, SEEK_CUR) != 0)
+ goto done;
+ if (fread(tmp, 1, 4, file) != 4)
+ goto done;
+ head = convert_to_header(tmp);
+ if (mpg123_head_check(head) && mpg123_decode_header(&fr, head))
+ {
+ fclose(file);
+ return TRUE;
+ }
+ }
+
+ done:
+ fclose(file);
+ return FALSE;
+}
+#endif
+
+//static guint get_song_time(FILE * file)
+guint mpg123_get_song_time(FILE * file)
+{
+ guint32 head;
+ guchar tmp[4], *buf;
+ struct frame frm;
+ XHEADDATA xing_header;
+ double tpf, bpf;
+ guint32 len;
+ long id3v2size = 0;
+
+ if (!file)
+ return -1;
+
+ fseek(file, 0, SEEK_SET);
+ if (fread(tmp, 1, 4, file) != 4)
+ return 0;
+
+ // Skip data of the ID3v2.x tag (patch from Artur Polaczynski)
+ if (tmp[0] == 'I' && tmp[1] == 'D' && tmp[2] == '3' && tmp[3] < 0xFF)
+ {
+ // id3v2 tag skipeer $49 44 33 yy yy xx zz zz zz zz [zz size]
+ fseek(file, 2, SEEK_CUR); // Size is 6-9 position
+ if (fread(tmp, 1, 4, file) != 4)
+ return 0;
+ id3v2size = 10 + ( (long)(tmp[3]) | ((long)(tmp[2]) << 7) | ((long)(tmp[1]) << 14) | ((long)(tmp[0]) << 21) );
+ fseek(file, id3v2size, SEEK_SET);
+ if (fread(tmp, 1, 4, file) != 4) // Read mpeg header
+ return 0;
+ }
+
+ head = convert_to_header(tmp);
+ while (!mpg123_head_check(head))
+ {
+ head <<= 8;
+ if (fread(tmp, 1, 1, file) != 1)
+ return 0;
+ head |= tmp[0];
+ }
+ if (mpg123_decode_header(&frm, head))
+ {
+ buf = g_malloc(frm.framesize + 4);
+ fseek(file, -4, SEEK_CUR);
+ fread(buf, 1, frm.framesize + 4, file);
+ xing_header.toc = NULL;
+ tpf = mpg123_compute_tpf(&frm);
+ if (mpg123_get_xing_header(&xing_header, buf))
+ {
+ g_free(buf);
+ return ((guint) (tpf * xing_header.frames * 1000));
+ }
+ g_free(buf);
+ bpf = mpg123_compute_bpf(&frm);
+ fseek(file, 0, SEEK_END);
+ len = ftell(file) - id3v2size;
+ fseek(file, -128, SEEK_END);
+ fread(tmp, 1, 3, file);
+ if (!strncmp(tmp, "TAG", 3))
+ len -= 128;
+ return ((guint) ((guint)(len / bpf) * tpf * 1000));
+ }
+ return 0;
+}
+
diff --git a/src/libmpg123/mpg123.h b/src/libmpg123/mpg123.h
new file mode 100755
index 0000000..a3a3726
--- /dev/null
+++ b/src/libmpg123/mpg123.h
@@ -0,0 +1,144 @@
+/*
+ * mpg123 defines
+ * used source: musicout.h from mpegaudio package
+ */
+
+#ifndef __MPG123_H__
+#define __MPG123_H__
+
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <gtk/gtk.h>
+
+#include "dxhead.h"
+
+#define real float
+
+/* #define MAX_NAME_SIZE 81 */
+#define SBLIMIT 32
+#define SCALE_BLOCK 12
+#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
+
+
+struct al_table
+{
+ short bits;
+ short d;
+};
+
+struct frame
+{
+ struct al_table *alloc;
+ int (*synth) (real *, int, unsigned char *, int *);
+ int (*synth_mono) (real *, unsigned char *, int *);
+ int stereo;
+ int jsbound;
+ int single;
+ int II_sblimit;
+ int down_sample_sblimit;
+ int lsf;
+ int mpeg25;
+ int down_sample;
+ int header_change;
+ int lay;
+ int (*do_layer) (struct frame * fr);
+ 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 bitstream_info
+{
+ int bitindex;
+ unsigned char *wordpointer;
+};
+
+extern struct bitstream_info bsi;
+
+/* ------ Declarations from "common.c" ------ */
+extern unsigned int mpg123_get1bit(void);
+extern unsigned int mpg123_getbits(int);
+extern unsigned int mpg123_getbits_fast(int);
+
+extern int mpg123_head_check(unsigned long);
+
+extern void mpg123_set_pointer(long);
+
+extern unsigned char *mpg123_pcm_sample;
+extern int mpg123_pcm_point;
+
+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];
+};
+
+int mpg123_stream_check_for_xing_header(struct frame *fr, XHEADDATA * xhead);
+
+extern int mpg123_do_layer3(struct frame *fr);
+extern int mpg123_do_layer2(struct frame *fr);
+extern int mpg123_do_layer1(struct frame *fr);
+
+
+extern void mpg123_init_layer3(int);
+extern void mpg123_init_layer2(void);
+
+int mpg123_decode_header(struct frame *fr, unsigned long newhead);
+double mpg123_compute_bpf(struct frame *fr);
+double mpg123_compute_tpf(struct frame *fr);
+
+
+extern unsigned char *mpg123_conv16to8;
+extern long mpg123_freqs[9];
+extern real mpg123_muls[27][64];
+extern real mpg123_decwin[512 + 32];
+extern real *mpg123_pnts[5];
+
+extern int tabsel_123[2][3][16];
+
+guint mpg123_get_song_time(FILE * file);
+
+#endif