mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-08-13 17:38:59 +00:00
add libsndifle 1.0.17 to in tree libs
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3761 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
50
libs/libsndfile/src/G72x/ChangeLog
Normal file
50
libs/libsndfile/src/G72x/ChangeLog
Normal file
@@ -0,0 +1,50 @@
|
||||
2001-06-05 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
|
||||
* g72x.c
|
||||
Added {} in function update () to prevent 'ambiguous else' warning messages.
|
||||
|
||||
2000-07-14 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
|
||||
* g72x.c
|
||||
Modified g72x_init_state () to fit in with the new structure of the code.
|
||||
Implemented g72x_encode_block () and g72x_decode_block ().
|
||||
|
||||
2000-07-12 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
|
||||
* g72x.h
|
||||
Moved nearly all definitions and function prototypes from this file have been
|
||||
moved to private.h.
|
||||
Added an enum defining the 4 different G72x ADPCM codecs.
|
||||
Added new function prototypes to define a cleaner interface to the encoder
|
||||
and decoder. This new interface also allows samples to be processed in blocks
|
||||
rather than on a sample by sample basis like the original code.
|
||||
|
||||
* private.h
|
||||
Added prototypes moved from g72x.h.
|
||||
Changed struct g72x_state to a typedef struct { .. } G72x_PRIVATE.
|
||||
Added fields to G72x_PRIVATE required for working on blocks of samples.
|
||||
|
||||
2000-06-07 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
|
||||
* g72x.c
|
||||
Fixed all compiler warnings.
|
||||
Removed functions tandem_adjust() which is not required by libsndfile.
|
||||
|
||||
* g721.c
|
||||
Fixed all compiler warnings.
|
||||
Removed functions tandem_adjust_alaw() and tandem_adjust_ulaw () which are not
|
||||
required by libsndfile.
|
||||
Removed second parameter to g721_encoder () which is not required.
|
||||
|
||||
* g72x.h
|
||||
Removed in_coding and out_coding parameters from all functions. These allowed
|
||||
g72x encoding/decoding to/from A-law or u-law and are not required by libsndfile.
|
||||
Removed unneeded defines for A-law, u-law and linear encoding.
|
||||
|
||||
* g723_16.c
|
||||
Removed second parameter (in_coding) for g723_16_encoder().
|
||||
Removed second parameter (out_coding) for g723_16_decoder().
|
||||
|
||||
* private.h
|
||||
New file containing prototypes and tyepdefs private to G72x code.
|
||||
|
28
libs/libsndfile/src/G72x/Makefile.am
Normal file
28
libs/libsndfile/src/G72x/Makefile.am
Normal file
@@ -0,0 +1,28 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
EXTRA_DIST = README README.original ChangeLog
|
||||
|
||||
noinst_HEADERS = g72x.h g72x_priv.h
|
||||
noinst_LTLIBRARIES = libg72x.la
|
||||
|
||||
noinst_PROGRAMS = g72x_test
|
||||
|
||||
CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c
|
||||
|
||||
libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS)
|
||||
|
||||
g72x_test_SOURCES = g72x_test.c
|
||||
g72x_test_LDADD = ./libg72x.la -lm
|
||||
|
||||
check: g72x_test
|
||||
./g72x_test all
|
||||
|
||||
# Disable autoheader.
|
||||
AUTOHEADER=echo
|
||||
|
||||
## Do not edit or modify anything in this comment block.
|
||||
## The arch-tag line is a file identity tag for the GNU Arch
|
||||
## revision control system.
|
||||
##
|
||||
## arch-tag: d417a8e8-da7f-423d-884d-f03c93379348
|
||||
|
486
libs/libsndfile/src/G72x/Makefile.in
Normal file
486
libs/libsndfile/src/G72x/Makefile.in
Normal file
@@ -0,0 +1,486 @@
|
||||
# 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@
|
||||
target_triplet = @target@
|
||||
noinst_PROGRAMS = g72x_test$(EXEEXT)
|
||||
subdir = src/G72x
|
||||
DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in ChangeLog
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/src/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||
libg72x_la_LIBADD =
|
||||
am__objects_1 = g72x.lo g721.lo g723_16.lo g723_24.lo g723_40.lo
|
||||
am__objects_2 =
|
||||
am_libg72x_la_OBJECTS = $(am__objects_1) $(am__objects_2)
|
||||
libg72x_la_OBJECTS = $(am_libg72x_la_OBJECTS)
|
||||
PROGRAMS = $(noinst_PROGRAMS)
|
||||
am_g72x_test_OBJECTS = g72x_test.$(OBJEXT)
|
||||
g72x_test_OBJECTS = $(am_g72x_test_OBJECTS)
|
||||
g72x_test_DEPENDENCIES = ./libg72x.la
|
||||
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src
|
||||
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 = $(libg72x_la_SOURCES) $(g72x_test_SOURCES)
|
||||
DIST_SOURCES = $(libg72x_la_SOURCES) $(g72x_test_SOURCES)
|
||||
HEADERS = $(noinst_HEADERS)
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
ALSA_LIBS = @ALSA_LIBS@
|
||||
AMDEP_FALSE = @AMDEP_FALSE@
|
||||
AMDEP_TRUE = @AMDEP_TRUE@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
|
||||
# Disable autoheader.
|
||||
AUTOHEADER = echo
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILER_IS_GCC = @COMPILER_IS_GCC@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ENABLE_EXPERIMENTAL_CODE = @ENABLE_EXPERIMENTAL_CODE@
|
||||
EXEEXT = @EXEEXT@
|
||||
F77 = @F77@
|
||||
FFLAGS = @FFLAGS@
|
||||
FLAC_LIBS = @FLAC_LIBS@
|
||||
GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
|
||||
GETCONF = @GETCONF@
|
||||
GREP = @GREP@
|
||||
HTML_BGCOLOUR = @HTML_BGCOLOUR@
|
||||
HTML_FGCOLOUR = @HTML_FGCOLOUR@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
OBJEXT = @OBJEXT@
|
||||
OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@
|
||||
OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
|
||||
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@
|
||||
RANLIB = @RANLIB@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SF_COUNT_MAX = @SF_COUNT_MAX@
|
||||
SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
|
||||
SHELL = @SHELL@
|
||||
SHLIB_VERSION_ARG = @SHLIB_VERSION_ARG@
|
||||
SIZEOF_SF_COUNT_T = @SIZEOF_SF_COUNT_T@
|
||||
SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
|
||||
SQLITE3_LIBS = @SQLITE3_LIBS@
|
||||
STRIP = @STRIP@
|
||||
TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
|
||||
VERSION = @VERSION@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_F77 = @ac_ct_F77@
|
||||
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@
|
||||
autogen = @autogen@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
htmldocdir = @htmldocdir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
EXTRA_DIST = README README.original ChangeLog
|
||||
noinst_HEADERS = g72x.h g72x_priv.h
|
||||
noinst_LTLIBRARIES = libg72x.la
|
||||
CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c
|
||||
libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS)
|
||||
g72x_test_SOURCES = g72x_test.c
|
||||
g72x_test_LDADD = ./libg72x.la -lm
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(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) --gnu src/G72x/Makefile'; \
|
||||
cd $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu src/G72x/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: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
|
||||
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
||||
test "$$dir" != "$$p" || dir=.; \
|
||||
echo "rm -f \"$${dir}/so_locations\""; \
|
||||
rm -f "$${dir}/so_locations"; \
|
||||
done
|
||||
libg72x.la: $(libg72x_la_OBJECTS) $(libg72x_la_DEPENDENCIES)
|
||||
$(LINK) $(libg72x_la_LDFLAGS) $(libg72x_la_OBJECTS) $(libg72x_la_LIBADD) $(LIBS)
|
||||
|
||||
clean-noinstPROGRAMS:
|
||||
@list='$(noinst_PROGRAMS)'; for p in $$list; do \
|
||||
f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
|
||||
echo " rm -f $$p $$f"; \
|
||||
rm -f $$p $$f ; \
|
||||
done
|
||||
g72x_test$(EXEEXT): $(g72x_test_OBJECTS) $(g72x_test_DEPENDENCIES)
|
||||
@rm -f g72x_test$(EXEEXT)
|
||||
$(LINK) $(g72x_test_LDFLAGS) $(g72x_test_OBJECTS) $(g72x_test_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g721.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g723_16.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g723_24.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g723_40.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g72x.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g72x_test.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 $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
|
||||
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-noinstLTLIBRARIES \
|
||||
clean-noinstPROGRAMS 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-noinstLTLIBRARIES clean-noinstPROGRAMS \
|
||||
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
|
||||
|
||||
|
||||
check: g72x_test
|
||||
./g72x_test all
|
||||
# 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:
|
0
libs/libsndfile/src/G72x/README
Normal file
0
libs/libsndfile/src/G72x/README
Normal file
94
libs/libsndfile/src/G72x/README.original
Normal file
94
libs/libsndfile/src/G72x/README.original
Normal file
@@ -0,0 +1,94 @@
|
||||
The files in this directory comprise ANSI-C language reference implementations
|
||||
of the CCITT (International Telegraph and Telephone Consultative Committee)
|
||||
G.711, G.721 and G.723 voice compressions. They have been tested on Sun
|
||||
SPARCstations and passed 82 out of 84 test vectors published by CCITT
|
||||
(Dec. 20, 1988) for G.721 and G.723. [The two remaining test vectors,
|
||||
which the G.721 decoder implementation for u-law samples did not pass,
|
||||
may be in error because they are identical to two other vectors for G.723_40.]
|
||||
|
||||
This source code is released by Sun Microsystems, Inc. to the public domain.
|
||||
Please give your acknowledgement in product literature if this code is used
|
||||
in your product implementation.
|
||||
|
||||
Sun Microsystems supports some CCITT audio formats in Solaris 2.0 system
|
||||
software. However, Sun's implementations have been optimized for higher
|
||||
performance on SPARCstations.
|
||||
|
||||
|
||||
The source files for CCITT conversion routines in this directory are:
|
||||
|
||||
g72x.h header file for g721.c, g723_24.c and g723_40.c
|
||||
g711.c CCITT G.711 u-law and A-law compression
|
||||
g72x.c common denominator of G.721 and G.723 ADPCM codes
|
||||
g721.c CCITT G.721 32Kbps ADPCM coder (with g72x.c)
|
||||
g723_24.c CCITT G.723 24Kbps ADPCM coder (with g72x.c)
|
||||
g723_40.c CCITT G.723 40Kbps ADPCM coder (with g72x.c)
|
||||
|
||||
|
||||
Simple conversions between u-law, A-law, and 16-bit linear PCM are invoked
|
||||
as follows:
|
||||
|
||||
unsigned char ucode, acode;
|
||||
short pcm_val;
|
||||
|
||||
ucode = linear2ulaw(pcm_val);
|
||||
ucode = alaw2ulaw(acode);
|
||||
|
||||
acode = linear2alaw(pcm_val);
|
||||
acode = ulaw2alaw(ucode);
|
||||
|
||||
pcm_val = ulaw2linear(ucode);
|
||||
pcm_val = alaw2linear(acode);
|
||||
|
||||
|
||||
The other CCITT compression routines are invoked as follows:
|
||||
|
||||
#include "g72x.h"
|
||||
|
||||
struct g72x_state state;
|
||||
int sample, code;
|
||||
|
||||
g72x_init_state(&state);
|
||||
code = {g721,g723_24,g723_40}_encoder(sample, coding, &state);
|
||||
sample = {g721,g723_24,g723_40}_decoder(code, coding, &state);
|
||||
|
||||
where
|
||||
coding = AUDIO_ENCODING_ULAW for 8-bit u-law samples
|
||||
AUDIO_ENCODING_ALAW for 8-bit A-law samples
|
||||
AUDIO_ENCODING_LINEAR for 16-bit linear PCM samples
|
||||
|
||||
|
||||
|
||||
This directory also includes the following sample programs:
|
||||
|
||||
encode.c CCITT ADPCM encoder
|
||||
decode.c CCITT ADPCM decoder
|
||||
Makefile makefile for the sample programs
|
||||
|
||||
|
||||
The sample programs contain examples of how to call the various compression
|
||||
routines and pack/unpack the bits. The sample programs read byte streams from
|
||||
stdin and write to stdout. The input/output data is raw data (no file header
|
||||
or other identifying information is embedded). The sample programs are
|
||||
invoked as follows:
|
||||
|
||||
encode [-3|4|5] [-a|u|l] <infile >outfile
|
||||
decode [-3|4|5] [-a|u|l] <infile >outfile
|
||||
where:
|
||||
-3 encode to (decode from) G.723 24kbps (3-bit) data
|
||||
-4 encode to (decode from) G.721 32kbps (4-bit) data [the default]
|
||||
-5 encode to (decode from) G.723 40kbps (5-bit) data
|
||||
-a encode from (decode to) A-law data
|
||||
-u encode from (decode to) u-law data [the default]
|
||||
-l encode from (decode to) 16-bit linear data
|
||||
|
||||
Examples:
|
||||
# Read 16-bit linear and output G.721
|
||||
encode -4 -l <pcmfile >g721file
|
||||
|
||||
# Read 40Kbps G.723 and output A-law
|
||||
decode -5 -a <g723file >alawfile
|
||||
|
||||
# Compress and then decompress u-law data using 24Kbps G.723
|
||||
encode -3 <ulawin | deoced -3 >ulawout
|
||||
|
162
libs/libsndfile/src/G72x/g721.c
Normal file
162
libs/libsndfile/src/G72x/g721.c
Normal file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* This source code is a product of Sun Microsystems, Inc. and is provided
|
||||
* for unrestricted use. Users may copy or modify this source code without
|
||||
* charge.
|
||||
*
|
||||
* SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
|
||||
* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun source code is provided with no support and without any obligation on
|
||||
* the part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
|
||||
/*
|
||||
* g721.c
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* g721_encoder(), g721_decoder()
|
||||
*
|
||||
* These routines comprise an implementation of the CCITT G.721 ADPCM
|
||||
* coding algorithm. Essentially, this implementation is identical to
|
||||
* the bit level description except for a few deviations which
|
||||
* take advantage of work station attributes, such as hardware 2's
|
||||
* complement arithmetic and large memory. Specifically, certain time
|
||||
* consuming operations such as multiplications are replaced
|
||||
* with lookup tables and software 2's complement operations are
|
||||
* replaced with hardware 2's complement.
|
||||
*
|
||||
* The deviation from the bit level specification (lookup tables)
|
||||
* preserves the bit level performance specifications.
|
||||
*
|
||||
* As outlined in the G.721 Recommendation, the algorithm is broken
|
||||
* down into modules. Each section of code below is preceded by
|
||||
* the name of the module which it is implementing.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "g72x.h"
|
||||
#include "g72x_priv.h"
|
||||
|
||||
static short qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400};
|
||||
/*
|
||||
* Maps G.721 code word to reconstructed scale factor normalized log
|
||||
* magnitude values.
|
||||
*/
|
||||
static short _dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425,
|
||||
425, 373, 323, 273, 213, 135, 4, -2048};
|
||||
|
||||
/* Maps G.721 code word to log of scale factor multiplier. */
|
||||
static short _witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122,
|
||||
1122, 355, 198, 112, 64, 41, 18, -12};
|
||||
/*
|
||||
* Maps G.721 code words to a set of values whose long and short
|
||||
* term averages are computed and then compared to give an indication
|
||||
* how stationary (steady state) the signal is.
|
||||
*/
|
||||
static short _fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
|
||||
0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0};
|
||||
|
||||
/*
|
||||
* g721_encoder()
|
||||
*
|
||||
* Encodes the input vale of linear PCM, A-law or u-law data sl and returns
|
||||
* the resulting code. -1 is returned for unknown input coding value.
|
||||
*/
|
||||
int
|
||||
g721_encoder(
|
||||
int sl,
|
||||
G72x_STATE *state_ptr)
|
||||
{
|
||||
short sezi, se, sez; /* ACCUM */
|
||||
short d; /* SUBTA */
|
||||
short sr; /* ADDB */
|
||||
short y; /* MIX */
|
||||
short dqsez; /* ADDC */
|
||||
short dq, i;
|
||||
|
||||
/* linearize input sample to 14-bit PCM */
|
||||
sl >>= 2; /* 14-bit dynamic range */
|
||||
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
se = (sezi + predictor_pole(state_ptr)) >> 1; /* estimated signal */
|
||||
|
||||
d = sl - se; /* estimation difference */
|
||||
|
||||
/* quantize the prediction difference */
|
||||
y = step_size(state_ptr); /* quantizer step size */
|
||||
i = quantize(d, y, qtab_721, 7); /* i = ADPCM code */
|
||||
|
||||
dq = reconstruct(i & 8, _dqlntab[i], y); /* quantized est diff */
|
||||
|
||||
sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconst. signal */
|
||||
|
||||
dqsez = sr + sez - se; /* pole prediction diff. */
|
||||
|
||||
update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
return (i);
|
||||
}
|
||||
|
||||
/*
|
||||
* g721_decoder()
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Decodes a 4-bit code of G.721 encoded data of i and
|
||||
* returns the resulting linear PCM, A-law or u-law value.
|
||||
* return -1 for unknown out_coding value.
|
||||
*/
|
||||
int
|
||||
g721_decoder(
|
||||
int i,
|
||||
G72x_STATE *state_ptr)
|
||||
{
|
||||
short sezi, sei, sez, se; /* ACCUM */
|
||||
short y; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dq;
|
||||
short dqsez;
|
||||
|
||||
i &= 0x0f; /* mask to get proper bits */
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
y = step_size(state_ptr); /* dynamic quantizer step size */
|
||||
|
||||
dq = reconstruct(i & 0x08, _dqlntab[i], y); /* quantized diff. */
|
||||
|
||||
sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq; /* reconst. signal */
|
||||
|
||||
dqsez = sr - se + sez; /* pole prediction diff. */
|
||||
|
||||
update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
/* sr was 14-bit dynamic range */
|
||||
return (sr << 2);
|
||||
}
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: 101b6e25-457d-490a-99ae-e2e74a26ea24
|
||||
*/
|
||||
|
169
libs/libsndfile/src/G72x/g723_16.c
Normal file
169
libs/libsndfile/src/G72x/g723_16.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* This source code is a product of Sun Microsystems, Inc. and is provided
|
||||
* for unrestricted use. Users may copy or modify this source code without
|
||||
* charge.
|
||||
*
|
||||
* SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
|
||||
* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun source code is provided with no support and without any obligation on
|
||||
* the part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/* 16kbps version created, used 24kbps code and changing as little as possible.
|
||||
* G.726 specs are available from ITU's gopher or WWW site (http://www.itu.ch)
|
||||
* If any errors are found, please contact me at mrand@tamu.edu
|
||||
* -Marc Randolph
|
||||
*/
|
||||
|
||||
/*
|
||||
* g723_16.c
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* g723_16_encoder(), g723_16_decoder()
|
||||
*
|
||||
* These routines comprise an implementation of the CCITT G.726 16 Kbps
|
||||
* ADPCM coding algorithm. Essentially, this implementation is identical to
|
||||
* the bit level description except for a few deviations which take advantage
|
||||
* of workstation attributes, such as hardware 2's complement arithmetic.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "g72x.h"
|
||||
#include "g72x_priv.h"
|
||||
|
||||
/*
|
||||
* Maps G.723_16 code word to reconstructed scale factor normalized log
|
||||
* magnitude values. Comes from Table 11/G.726
|
||||
*/
|
||||
static short _dqlntab[4] = { 116, 365, 365, 116};
|
||||
|
||||
/* Maps G.723_16 code word to log of scale factor multiplier.
|
||||
*
|
||||
* _witab[4] is actually {-22 , 439, 439, -22}, but FILTD wants it
|
||||
* as WI << 5 (multiplied by 32), so we'll do that here
|
||||
*/
|
||||
static short _witab[4] = {-704, 14048, 14048, -704};
|
||||
|
||||
/*
|
||||
* Maps G.723_16 code words to a set of values whose long and short
|
||||
* term averages are computed and then compared to give an indication
|
||||
* how stationary (steady state) the signal is.
|
||||
*/
|
||||
|
||||
/* Comes from FUNCTF */
|
||||
static short _fitab[4] = {0, 0xE00, 0xE00, 0};
|
||||
|
||||
/* Comes from quantizer decision level tables (Table 7/G.726)
|
||||
*/
|
||||
static short qtab_723_16[1] = {261};
|
||||
|
||||
|
||||
/*
|
||||
* g723_16_encoder()
|
||||
*
|
||||
* Encodes a linear PCM, A-law or u-law input sample and returns its 2-bit code.
|
||||
* Returns -1 if invalid input coding value.
|
||||
*/
|
||||
int
|
||||
g723_16_encoder(
|
||||
int sl,
|
||||
G72x_STATE *state_ptr)
|
||||
{
|
||||
short sei, sezi, se, sez; /* ACCUM */
|
||||
short d; /* SUBTA */
|
||||
short y; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dqsez; /* ADDC */
|
||||
short dq, i;
|
||||
|
||||
/* linearize input sample to 14-bit PCM */
|
||||
sl >>= 2; /* sl of 14-bit dynamic range */
|
||||
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
d = sl - se; /* d = estimation diff. */
|
||||
|
||||
/* quantize prediction difference d */
|
||||
y = step_size(state_ptr); /* quantizer step size */
|
||||
i = quantize(d, y, qtab_723_16, 1); /* i = ADPCM code */
|
||||
|
||||
/* Since quantize() only produces a three level output
|
||||
* (1, 2, or 3), we must create the fourth one on our own
|
||||
*/
|
||||
if (i == 3) /* i code for the zero region */
|
||||
if ((d & 0x8000) == 0) /* If d > 0, i=3 isn't right... */
|
||||
i = 0;
|
||||
|
||||
dq = reconstruct(i & 2, _dqlntab[i], y); /* quantized diff. */
|
||||
|
||||
sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
|
||||
|
||||
dqsez = sr + sez - se; /* pole prediction diff. */
|
||||
|
||||
update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
return (i);
|
||||
}
|
||||
|
||||
/*
|
||||
* g723_16_decoder()
|
||||
*
|
||||
* Decodes a 2-bit CCITT G.723_16 ADPCM code and returns
|
||||
* the resulting 16-bit linear PCM, A-law or u-law sample value.
|
||||
* -1 is returned if the output coding is unknown.
|
||||
*/
|
||||
int
|
||||
g723_16_decoder(
|
||||
int i,
|
||||
G72x_STATE *state_ptr)
|
||||
{
|
||||
short sezi, sei, sez, se; /* ACCUM */
|
||||
short y; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dq;
|
||||
short dqsez;
|
||||
|
||||
i &= 0x03; /* mask to get proper bits */
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
y = step_size(state_ptr); /* adaptive quantizer step size */
|
||||
dq = reconstruct(i & 0x02, _dqlntab[i], y); /* unquantize pred diff */
|
||||
|
||||
sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
|
||||
|
||||
dqsez = sr - se + sez; /* pole prediction diff. */
|
||||
|
||||
update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
/* sr was of 14-bit dynamic range */
|
||||
return (sr << 2);
|
||||
}
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: ae265466-c3fc-4f83-bb32-edae488a5ca5
|
||||
*/
|
||||
|
146
libs/libsndfile/src/G72x/g723_24.c
Normal file
146
libs/libsndfile/src/G72x/g723_24.c
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* This source code is a product of Sun Microsystems, Inc. and is provided
|
||||
* for unrestricted use. Users may copy or modify this source code without
|
||||
* charge.
|
||||
*
|
||||
* SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
|
||||
* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun source code is provided with no support and without any obligation on
|
||||
* the part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
|
||||
/*
|
||||
* g723_24.c
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* g723_24_encoder(), g723_24_decoder()
|
||||
*
|
||||
* These routines comprise an implementation of the CCITT G.723 24 Kbps
|
||||
* ADPCM coding algorithm. Essentially, this implementation is identical to
|
||||
* the bit level description except for a few deviations which take advantage
|
||||
* of workstation attributes, such as hardware 2's complement arithmetic.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "g72x.h"
|
||||
#include "g72x_priv.h"
|
||||
|
||||
/*
|
||||
* Maps G.723_24 code word to reconstructed scale factor normalized log
|
||||
* magnitude values.
|
||||
*/
|
||||
static short _dqlntab[8] = {-2048, 135, 273, 373, 373, 273, 135, -2048};
|
||||
|
||||
/* Maps G.723_24 code word to log of scale factor multiplier. */
|
||||
static short _witab[8] = {-128, 960, 4384, 18624, 18624, 4384, 960, -128};
|
||||
|
||||
/*
|
||||
* Maps G.723_24 code words to a set of values whose long and short
|
||||
* term averages are computed and then compared to give an indication
|
||||
* how stationary (steady state) the signal is.
|
||||
*/
|
||||
static short _fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0};
|
||||
|
||||
static short qtab_723_24[3] = {8, 218, 331};
|
||||
|
||||
/*
|
||||
* g723_24_encoder()
|
||||
*
|
||||
* Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code.
|
||||
* Returns -1 if invalid input coding value.
|
||||
*/
|
||||
int
|
||||
g723_24_encoder(
|
||||
int sl,
|
||||
G72x_STATE *state_ptr)
|
||||
{
|
||||
short sei, sezi, se, sez; /* ACCUM */
|
||||
short d; /* SUBTA */
|
||||
short y; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dqsez; /* ADDC */
|
||||
short dq, i;
|
||||
|
||||
/* linearize input sample to 14-bit PCM */
|
||||
sl >>= 2; /* sl of 14-bit dynamic range */
|
||||
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
d = sl - se; /* d = estimation diff. */
|
||||
|
||||
/* quantize prediction difference d */
|
||||
y = step_size(state_ptr); /* quantizer step size */
|
||||
i = quantize(d, y, qtab_723_24, 3); /* i = ADPCM code */
|
||||
dq = reconstruct(i & 4, _dqlntab[i], y); /* quantized diff. */
|
||||
|
||||
sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
|
||||
|
||||
dqsez = sr + sez - se; /* pole prediction diff. */
|
||||
|
||||
update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
return (i);
|
||||
}
|
||||
|
||||
/*
|
||||
* g723_24_decoder()
|
||||
*
|
||||
* Decodes a 3-bit CCITT G.723_24 ADPCM code and returns
|
||||
* the resulting 16-bit linear PCM, A-law or u-law sample value.
|
||||
* -1 is returned if the output coding is unknown.
|
||||
*/
|
||||
int
|
||||
g723_24_decoder(
|
||||
int i,
|
||||
G72x_STATE *state_ptr)
|
||||
{
|
||||
short sezi, sei, sez, se; /* ACCUM */
|
||||
short y; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dq;
|
||||
short dqsez;
|
||||
|
||||
i &= 0x07; /* mask to get proper bits */
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
y = step_size(state_ptr); /* adaptive quantizer step size */
|
||||
dq = reconstruct(i & 0x04, _dqlntab[i], y); /* unquantize pred diff */
|
||||
|
||||
sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
|
||||
|
||||
dqsez = sr - se + sez; /* pole prediction diff. */
|
||||
|
||||
update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
return (sr << 2); /* sr was of 14-bit dynamic range */
|
||||
}
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: 75389236-650b-4427-98f3-0df6e8fb24bc
|
||||
*/
|
||||
|
160
libs/libsndfile/src/G72x/g723_40.c
Normal file
160
libs/libsndfile/src/G72x/g723_40.c
Normal file
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* This source code is a product of Sun Microsystems, Inc. and is provided
|
||||
* for unrestricted use. Users may copy or modify this source code without
|
||||
* charge.
|
||||
*
|
||||
* SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
|
||||
* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun source code is provided with no support and without any obligation on
|
||||
* the part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
|
||||
/*
|
||||
* g723_40.c
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* g723_40_encoder(), g723_40_decoder()
|
||||
*
|
||||
* These routines comprise an implementation of the CCITT G.723 40Kbps
|
||||
* ADPCM coding algorithm. Essentially, this implementation is identical to
|
||||
* the bit level description except for a few deviations which
|
||||
* take advantage of workstation attributes, such as hardware 2's
|
||||
* complement arithmetic.
|
||||
*
|
||||
* The deviation from the bit level specification (lookup tables),
|
||||
* preserves the bit level performance specifications.
|
||||
*
|
||||
* As outlined in the G.723 Recommendation, the algorithm is broken
|
||||
* down into modules. Each section of code below is preceded by
|
||||
* the name of the module which it is implementing.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "g72x.h"
|
||||
#include "g72x_priv.h"
|
||||
|
||||
/*
|
||||
* Maps G.723_40 code word to ructeconstructed scale factor normalized log
|
||||
* magnitude values.
|
||||
*/
|
||||
static short _dqlntab[32] = {-2048, -66, 28, 104, 169, 224, 274, 318,
|
||||
358, 395, 429, 459, 488, 514, 539, 566,
|
||||
566, 539, 514, 488, 459, 429, 395, 358,
|
||||
318, 274, 224, 169, 104, 28, -66, -2048};
|
||||
|
||||
/* Maps G.723_40 code word to log of scale factor multiplier. */
|
||||
static short _witab[32] = {448, 448, 768, 1248, 1280, 1312, 1856, 3200,
|
||||
4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272,
|
||||
22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512,
|
||||
3200, 1856, 1312, 1280, 1248, 768, 448, 448};
|
||||
|
||||
/*
|
||||
* Maps G.723_40 code words to a set of values whose long and short
|
||||
* term averages are computed and then compared to give an indication
|
||||
* how stationary (steady state) the signal is.
|
||||
*/
|
||||
static short _fitab[32] = {0, 0, 0, 0, 0, 0x200, 0x200, 0x200,
|
||||
0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00,
|
||||
0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200,
|
||||
0x200, 0x200, 0x200, 0, 0, 0, 0, 0};
|
||||
|
||||
static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339,
|
||||
378, 413, 445, 475, 502, 528, 553};
|
||||
|
||||
/*
|
||||
* g723_40_encoder()
|
||||
*
|
||||
* Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens
|
||||
* the resulting 5-bit CCITT G.723 40Kbps code.
|
||||
* Returns -1 if the input coding value is invalid.
|
||||
*/
|
||||
int g723_40_encoder (int sl, G72x_STATE *state_ptr)
|
||||
{
|
||||
short sei, sezi, se, sez; /* ACCUM */
|
||||
short d; /* SUBTA */
|
||||
short y; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dqsez; /* ADDC */
|
||||
short dq, i;
|
||||
|
||||
/* linearize input sample to 14-bit PCM */
|
||||
sl >>= 2; /* sl of 14-bit dynamic range */
|
||||
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
d = sl - se; /* d = estimation difference */
|
||||
|
||||
/* quantize prediction difference */
|
||||
y = step_size(state_ptr); /* adaptive quantizer step size */
|
||||
i = quantize(d, y, qtab_723_40, 15); /* i = ADPCM code */
|
||||
|
||||
dq = reconstruct(i & 0x10, _dqlntab[i], y); /* quantized diff */
|
||||
|
||||
sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq; /* reconstructed signal */
|
||||
|
||||
dqsez = sr + sez - se; /* dqsez = pole prediction diff. */
|
||||
|
||||
update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
return (i);
|
||||
}
|
||||
|
||||
/*
|
||||
* g723_40_decoder()
|
||||
*
|
||||
* Decodes a 5-bit CCITT G.723 40Kbps code and returns
|
||||
* the resulting 16-bit linear PCM, A-law or u-law sample value.
|
||||
* -1 is returned if the output coding is unknown.
|
||||
*/
|
||||
int g723_40_decoder (int i, G72x_STATE *state_ptr)
|
||||
{
|
||||
short sezi, sei, sez, se; /* ACCUM */
|
||||
short y ; /* MIX */
|
||||
short sr; /* ADDB */
|
||||
short dq;
|
||||
short dqsez;
|
||||
|
||||
i &= 0x1f; /* mask to get proper bits */
|
||||
sezi = predictor_zero(state_ptr);
|
||||
sez = sezi >> 1;
|
||||
sei = sezi + predictor_pole(state_ptr);
|
||||
se = sei >> 1; /* se = estimated signal */
|
||||
|
||||
y = step_size(state_ptr); /* adaptive quantizer step size */
|
||||
dq = reconstruct(i & 0x10, _dqlntab[i], y); /* estimation diff. */
|
||||
|
||||
sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
|
||||
|
||||
dqsez = sr - se + sez; /* pole prediction diff. */
|
||||
|
||||
update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
|
||||
|
||||
return (sr << 2); /* sr was of 14-bit dynamic range */
|
||||
}
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: eb8d9a00-32bf-4dd2-b287-01b0336d72bf
|
||||
*/
|
||||
|
652
libs/libsndfile/src/G72x/g72x.c
Normal file
652
libs/libsndfile/src/G72x/g72x.c
Normal file
@@ -0,0 +1,652 @@
|
||||
/*
|
||||
* This source code is a product of Sun Microsystems, Inc. and is provided
|
||||
* for unrestricted use. Users may copy or modify this source code without
|
||||
* charge.
|
||||
*
|
||||
* SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
|
||||
* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun source code is provided with no support and without any obligation on
|
||||
* the part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
|
||||
/*
|
||||
* g72x.c
|
||||
*
|
||||
* Common routines for G.721 and G.723 conversions.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "g72x.h"
|
||||
#include "g72x_priv.h"
|
||||
|
||||
static G72x_STATE * g72x_state_new (void) ;
|
||||
static int unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) ;
|
||||
static int pack_bytes (int bits, const short * samples, unsigned char * block) ;
|
||||
|
||||
static
|
||||
short power2 [15] =
|
||||
{ 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
|
||||
0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
|
||||
} ;
|
||||
|
||||
/*
|
||||
* quan()
|
||||
*
|
||||
* quantizes the input val against the table of size short integers.
|
||||
* It returns i if table[i - 1] <= val < table[i].
|
||||
*
|
||||
* Using linear search for simple coding.
|
||||
*/
|
||||
static
|
||||
int quan (int val, short *table, int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
if (val < *table++)
|
||||
break;
|
||||
return (i);
|
||||
}
|
||||
|
||||
/*
|
||||
* fmult()
|
||||
*
|
||||
* returns the integer product of the 14-bit integer "an" and
|
||||
* "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
|
||||
*/
|
||||
static
|
||||
int fmult (int an, int srn)
|
||||
{
|
||||
short anmag, anexp, anmant;
|
||||
short wanexp, wanmant;
|
||||
short retval;
|
||||
|
||||
anmag = (an > 0) ? an : ((-an) & 0x1FFF);
|
||||
anexp = quan(anmag, power2, 15) - 6;
|
||||
anmant = (anmag == 0) ? 32 :
|
||||
(anexp >= 0) ? anmag >> anexp : anmag << -anexp;
|
||||
wanexp = anexp + ((srn >> 6) & 0xF) - 13;
|
||||
|
||||
/*
|
||||
** The original was :
|
||||
** wanmant = (anmant * (srn & 0x37) + 0x30) >> 4 ;
|
||||
** but could see no valid reason for the + 0x30.
|
||||
** Removed it and it improved the SNR of the codec.
|
||||
*/
|
||||
|
||||
wanmant = (anmant * (srn & 0x37)) >> 4 ;
|
||||
|
||||
retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
|
||||
(wanmant >> -wanexp);
|
||||
|
||||
return (((an ^ srn) < 0) ? -retval : retval);
|
||||
}
|
||||
|
||||
static G72x_STATE * g72x_state_new (void)
|
||||
{ return calloc (1, sizeof (G72x_STATE)) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* private_init_state()
|
||||
*
|
||||
* This routine initializes and/or resets the G72x_PRIVATE structure
|
||||
* pointed to by 'state_ptr'.
|
||||
* All the initial state values are specified in the CCITT G.721 document.
|
||||
*/
|
||||
void private_init_state (G72x_STATE *state_ptr)
|
||||
{
|
||||
int cnta;
|
||||
|
||||
state_ptr->yl = 34816;
|
||||
state_ptr->yu = 544;
|
||||
state_ptr->dms = 0;
|
||||
state_ptr->dml = 0;
|
||||
state_ptr->ap = 0;
|
||||
for (cnta = 0; cnta < 2; cnta++) {
|
||||
state_ptr->a[cnta] = 0;
|
||||
state_ptr->pk[cnta] = 0;
|
||||
state_ptr->sr[cnta] = 32;
|
||||
}
|
||||
for (cnta = 0; cnta < 6; cnta++) {
|
||||
state_ptr->b[cnta] = 0;
|
||||
state_ptr->dq[cnta] = 32;
|
||||
}
|
||||
state_ptr->td = 0;
|
||||
} /* private_init_state */
|
||||
|
||||
struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock)
|
||||
{ G72x_STATE *pstate ;
|
||||
|
||||
if ((pstate = g72x_state_new ()) == NULL)
|
||||
return NULL ;
|
||||
|
||||
private_init_state (pstate) ;
|
||||
|
||||
pstate->encoder = NULL ;
|
||||
|
||||
switch (codec)
|
||||
{ case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
|
||||
pstate->decoder = g723_16_decoder ;
|
||||
*blocksize = G723_16_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 2 ;
|
||||
pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
|
||||
pstate->decoder = g723_24_decoder ;
|
||||
*blocksize = G723_24_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 3 ;
|
||||
pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
|
||||
pstate->decoder = g721_decoder ;
|
||||
*blocksize = G721_32_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 4 ;
|
||||
pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
|
||||
pstate->decoder = g723_40_decoder ;
|
||||
*blocksize = G721_40_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 5 ;
|
||||
pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
free (pstate) ;
|
||||
return NULL ;
|
||||
} ;
|
||||
|
||||
return pstate ;
|
||||
} /* g72x_reader_init */
|
||||
|
||||
struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock)
|
||||
{ G72x_STATE *pstate ;
|
||||
|
||||
if ((pstate = g72x_state_new ()) == NULL)
|
||||
return NULL ;
|
||||
|
||||
private_init_state (pstate) ;
|
||||
pstate->decoder = NULL ;
|
||||
|
||||
switch (codec)
|
||||
{ case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
|
||||
pstate->encoder = g723_16_encoder ;
|
||||
*blocksize = G723_16_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 2 ;
|
||||
pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
|
||||
pstate->encoder = g723_24_encoder ;
|
||||
*blocksize = G723_24_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 3 ;
|
||||
pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
|
||||
pstate->encoder = g721_encoder ;
|
||||
*blocksize = G721_32_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 4 ;
|
||||
pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
|
||||
pstate->encoder = g723_40_encoder ;
|
||||
*blocksize = G721_40_BYTES_PER_BLOCK ;
|
||||
*samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
|
||||
pstate->codec_bits = 5 ;
|
||||
pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
|
||||
pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
free (pstate) ;
|
||||
return NULL ;
|
||||
} ;
|
||||
|
||||
return pstate ;
|
||||
} /* g72x_writer_init */
|
||||
|
||||
int g72x_decode_block (G72x_STATE *pstate, const unsigned char *block, short *samples)
|
||||
{ int k, count ;
|
||||
|
||||
count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ;
|
||||
|
||||
for (k = 0 ; k < count ; k++)
|
||||
samples [k] = pstate->decoder (samples [k], pstate) ;
|
||||
|
||||
return 0 ;
|
||||
} /* g72x_decode_block */
|
||||
|
||||
int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block)
|
||||
{ int k, count ;
|
||||
|
||||
for (k = 0 ; k < pstate->samplesperblock ; k++)
|
||||
samples [k] = pstate->encoder (samples [k], pstate) ;
|
||||
|
||||
count = pack_bytes (pstate->codec_bits, samples, block) ;
|
||||
|
||||
return count ;
|
||||
} /* g72x_encode_block */
|
||||
|
||||
/*
|
||||
* predictor_zero()
|
||||
*
|
||||
* computes the estimated signal from 6-zero predictor.
|
||||
*
|
||||
*/
|
||||
int predictor_zero (G72x_STATE *state_ptr)
|
||||
{
|
||||
int i;
|
||||
int sezi;
|
||||
|
||||
sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
|
||||
for (i = 1; i < 6; i++) /* ACCUM */
|
||||
sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
|
||||
return (sezi);
|
||||
}
|
||||
/*
|
||||
* predictor_pole()
|
||||
*
|
||||
* computes the estimated signal from 2-pole predictor.
|
||||
*
|
||||
*/
|
||||
int predictor_pole(G72x_STATE *state_ptr)
|
||||
{
|
||||
return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
|
||||
fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
|
||||
}
|
||||
/*
|
||||
* step_size()
|
||||
*
|
||||
* computes the quantization step size of the adaptive quantizer.
|
||||
*
|
||||
*/
|
||||
int step_size (G72x_STATE *state_ptr)
|
||||
{
|
||||
int y;
|
||||
int dif;
|
||||
int al;
|
||||
|
||||
if (state_ptr->ap >= 256)
|
||||
return (state_ptr->yu);
|
||||
else {
|
||||
y = state_ptr->yl >> 6;
|
||||
dif = state_ptr->yu - y;
|
||||
al = state_ptr->ap >> 2;
|
||||
if (dif > 0)
|
||||
y += (dif * al) >> 6;
|
||||
else if (dif < 0)
|
||||
y += (dif * al + 0x3F) >> 6;
|
||||
return (y);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* quantize()
|
||||
*
|
||||
* Given a raw sample, 'd', of the difference signal and a
|
||||
* quantization step size scale factor, 'y', this routine returns the
|
||||
* ADPCM codeword to which that sample gets quantized. The step
|
||||
* size scale factor division operation is done in the log base 2 domain
|
||||
* as a subtraction.
|
||||
*/
|
||||
int quantize(
|
||||
int d, /* Raw difference signal sample */
|
||||
int y, /* Step size multiplier */
|
||||
short *table, /* quantization table */
|
||||
int size) /* table size of short integers */
|
||||
{
|
||||
short dqm; /* Magnitude of 'd' */
|
||||
short expon; /* Integer part of base 2 log of 'd' */
|
||||
short mant; /* Fractional part of base 2 log */
|
||||
short dl; /* Log of magnitude of 'd' */
|
||||
short dln; /* Step size scale factor normalized log */
|
||||
int i;
|
||||
|
||||
/*
|
||||
* LOG
|
||||
*
|
||||
* Compute base 2 log of 'd', and store in 'dl'.
|
||||
*/
|
||||
dqm = abs(d);
|
||||
expon = quan(dqm >> 1, power2, 15);
|
||||
mant = ((dqm << 7) >> expon) & 0x7F; /* Fractional portion. */
|
||||
dl = (expon << 7) + mant;
|
||||
|
||||
/*
|
||||
* SUBTB
|
||||
*
|
||||
* "Divide" by step size multiplier.
|
||||
*/
|
||||
dln = dl - (y >> 2);
|
||||
|
||||
/*
|
||||
* QUAN
|
||||
*
|
||||
* Obtain codword i for 'd'.
|
||||
*/
|
||||
i = quan(dln, table, size);
|
||||
if (d < 0) /* take 1's complement of i */
|
||||
return ((size << 1) + 1 - i);
|
||||
else if (i == 0) /* take 1's complement of 0 */
|
||||
return ((size << 1) + 1); /* new in 1988 */
|
||||
else
|
||||
return (i);
|
||||
}
|
||||
/*
|
||||
* reconstruct()
|
||||
*
|
||||
* Returns reconstructed difference signal 'dq' obtained from
|
||||
* codeword 'i' and quantization step size scale factor 'y'.
|
||||
* Multiplication is performed in log base 2 domain as addition.
|
||||
*/
|
||||
int
|
||||
reconstruct(
|
||||
int sign, /* 0 for non-negative value */
|
||||
int dqln, /* G.72x codeword */
|
||||
int y) /* Step size multiplier */
|
||||
{
|
||||
short dql; /* Log of 'dq' magnitude */
|
||||
short dex; /* Integer part of log */
|
||||
short dqt;
|
||||
short dq; /* Reconstructed difference signal sample */
|
||||
|
||||
dql = dqln + (y >> 2); /* ADDA */
|
||||
|
||||
if (dql < 0) {
|
||||
return ((sign) ? -0x8000 : 0);
|
||||
} else { /* ANTILOG */
|
||||
dex = (dql >> 7) & 15;
|
||||
dqt = 128 + (dql & 127);
|
||||
dq = (dqt << 7) >> (14 - dex);
|
||||
return ((sign) ? (dq - 0x8000) : dq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update()
|
||||
*
|
||||
* updates the state variables for each output code
|
||||
*/
|
||||
void
|
||||
update(
|
||||
int code_size, /* distinguish 723_40 with others */
|
||||
int y, /* quantizer step size */
|
||||
int wi, /* scale factor multiplier */
|
||||
int fi, /* for long/short term energies */
|
||||
int dq, /* quantized prediction difference */
|
||||
int sr, /* reconstructed signal */
|
||||
int dqsez, /* difference from 2-pole predictor */
|
||||
G72x_STATE *state_ptr) /* coder state pointer */
|
||||
{
|
||||
int cnt;
|
||||
short mag, expon; /* Adaptive predictor, FLOAT A */
|
||||
short a2p = 0; /* LIMC */
|
||||
short a1ul; /* UPA1 */
|
||||
short pks1; /* UPA2 */
|
||||
short fa1;
|
||||
char tr; /* tone/transition detector */
|
||||
short ylint, thr2, dqthr;
|
||||
short ylfrac, thr1;
|
||||
short pk0;
|
||||
|
||||
pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */
|
||||
|
||||
mag = dq & 0x7FFF; /* prediction difference magnitude */
|
||||
/* TRANS */
|
||||
ylint = state_ptr->yl >> 15; /* exponent part of yl */
|
||||
ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */
|
||||
thr1 = (32 + ylfrac) << ylint; /* threshold */
|
||||
thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */
|
||||
dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */
|
||||
if (state_ptr->td == 0) /* signal supposed voice */
|
||||
tr = 0;
|
||||
else if (mag <= dqthr) /* supposed data, but small mag */
|
||||
tr = 0; /* treated as voice */
|
||||
else /* signal is data (modem) */
|
||||
tr = 1;
|
||||
|
||||
/*
|
||||
* Quantizer scale factor adaptation.
|
||||
*/
|
||||
|
||||
/* FUNCTW & FILTD & DELAY */
|
||||
/* update non-steady state step size multiplier */
|
||||
state_ptr->yu = y + ((wi - y) >> 5);
|
||||
|
||||
/* LIMB */
|
||||
if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */
|
||||
state_ptr->yu = 544;
|
||||
else if (state_ptr->yu > 5120)
|
||||
state_ptr->yu = 5120;
|
||||
|
||||
/* FILTE & DELAY */
|
||||
/* update steady state step size multiplier */
|
||||
state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
|
||||
|
||||
/*
|
||||
* Adaptive predictor coefficients.
|
||||
*/
|
||||
if (tr == 1) { /* reset a's and b's for modem signal */
|
||||
state_ptr->a[0] = 0;
|
||||
state_ptr->a[1] = 0;
|
||||
state_ptr->b[0] = 0;
|
||||
state_ptr->b[1] = 0;
|
||||
state_ptr->b[2] = 0;
|
||||
state_ptr->b[3] = 0;
|
||||
state_ptr->b[4] = 0;
|
||||
state_ptr->b[5] = 0;
|
||||
} else { /* update a's and b's */
|
||||
pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */
|
||||
|
||||
/* update predictor pole a[1] */
|
||||
a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
|
||||
if (dqsez != 0) {
|
||||
fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
|
||||
if (fa1 < -8191) /* a2p = function of fa1 */
|
||||
a2p -= 0x100;
|
||||
else if (fa1 > 8191)
|
||||
a2p += 0xFF;
|
||||
else
|
||||
a2p += fa1 >> 5;
|
||||
|
||||
if (pk0 ^ state_ptr->pk[1])
|
||||
{ /* LIMC */
|
||||
if (a2p <= -12160)
|
||||
a2p = -12288;
|
||||
else if (a2p >= 12416)
|
||||
a2p = 12288;
|
||||
else
|
||||
a2p -= 0x80;
|
||||
}
|
||||
else if (a2p <= -12416)
|
||||
a2p = -12288;
|
||||
else if (a2p >= 12160)
|
||||
a2p = 12288;
|
||||
else
|
||||
a2p += 0x80;
|
||||
}
|
||||
|
||||
/* TRIGB & DELAY */
|
||||
state_ptr->a[1] = a2p;
|
||||
|
||||
/* UPA1 */
|
||||
/* update predictor pole a[0] */
|
||||
state_ptr->a[0] -= state_ptr->a[0] >> 8;
|
||||
if (dqsez != 0)
|
||||
{ if (pks1 == 0)
|
||||
state_ptr->a[0] += 192;
|
||||
else
|
||||
state_ptr->a[0] -= 192;
|
||||
} ;
|
||||
|
||||
/* LIMD */
|
||||
a1ul = 15360 - a2p;
|
||||
if (state_ptr->a[0] < -a1ul)
|
||||
state_ptr->a[0] = -a1ul;
|
||||
else if (state_ptr->a[0] > a1ul)
|
||||
state_ptr->a[0] = a1ul;
|
||||
|
||||
/* UPB : update predictor zeros b[6] */
|
||||
for (cnt = 0; cnt < 6; cnt++) {
|
||||
if (code_size == 5) /* for 40Kbps G.723 */
|
||||
state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
|
||||
else /* for G.721 and 24Kbps G.723 */
|
||||
state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
|
||||
if (dq & 0x7FFF) { /* XOR */
|
||||
if ((dq ^ state_ptr->dq[cnt]) >= 0)
|
||||
state_ptr->b[cnt] += 128;
|
||||
else
|
||||
state_ptr->b[cnt] -= 128;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (cnt = 5; cnt > 0; cnt--)
|
||||
state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
|
||||
/* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
|
||||
if (mag == 0) {
|
||||
state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
|
||||
} else {
|
||||
expon = quan(mag, power2, 15);
|
||||
state_ptr->dq[0] = (dq >= 0) ?
|
||||
(expon << 6) + ((mag << 6) >> expon) :
|
||||
(expon << 6) + ((mag << 6) >> expon) - 0x400;
|
||||
}
|
||||
|
||||
state_ptr->sr[1] = state_ptr->sr[0];
|
||||
/* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
|
||||
if (sr == 0) {
|
||||
state_ptr->sr[0] = 0x20;
|
||||
} else if (sr > 0) {
|
||||
expon = quan(sr, power2, 15);
|
||||
state_ptr->sr[0] = (expon << 6) + ((sr << 6) >> expon);
|
||||
} else if (sr > -32768) {
|
||||
mag = -sr;
|
||||
expon = quan(mag, power2, 15);
|
||||
state_ptr->sr[0] = (expon << 6) + ((mag << 6) >> expon) - 0x400;
|
||||
} else
|
||||
state_ptr->sr[0] = (short) 0xFC20;
|
||||
|
||||
/* DELAY A */
|
||||
state_ptr->pk[1] = state_ptr->pk[0];
|
||||
state_ptr->pk[0] = pk0;
|
||||
|
||||
/* TONE */
|
||||
if (tr == 1) /* this sample has been treated as data */
|
||||
state_ptr->td = 0; /* next one will be treated as voice */
|
||||
else if (a2p < -11776) /* small sample-to-sample correlation */
|
||||
state_ptr->td = 1; /* signal may be data */
|
||||
else /* signal is voice */
|
||||
state_ptr->td = 0;
|
||||
|
||||
/*
|
||||
* Adaptation speed control.
|
||||
*/
|
||||
state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */
|
||||
state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */
|
||||
|
||||
if (tr == 1)
|
||||
state_ptr->ap = 256;
|
||||
else if (y < 1536) /* SUBTC */
|
||||
state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
|
||||
else if (state_ptr->td == 1)
|
||||
state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
|
||||
else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
|
||||
(state_ptr->dml >> 3))
|
||||
state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
|
||||
else
|
||||
state_ptr->ap += (-state_ptr->ap) >> 4;
|
||||
|
||||
return ;
|
||||
} /* update */
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples)
|
||||
{ unsigned int in_buffer = 0 ;
|
||||
unsigned char in_byte ;
|
||||
int k, in_bits = 0, bindex = 0 ;
|
||||
|
||||
for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++)
|
||||
{ if (in_bits < bits)
|
||||
{ in_byte = block [bindex++] ;
|
||||
|
||||
in_buffer |= (in_byte << in_bits);
|
||||
in_bits += 8;
|
||||
}
|
||||
samples [k] = in_buffer & ((1 << bits) - 1);
|
||||
in_buffer >>= bits;
|
||||
in_bits -= bits;
|
||||
} ;
|
||||
|
||||
return k ;
|
||||
} /* unpack_bytes */
|
||||
|
||||
static int
|
||||
pack_bytes (int bits, const short * samples, unsigned char * block)
|
||||
{
|
||||
unsigned int out_buffer = 0 ;
|
||||
int k, bindex = 0, out_bits = 0 ;
|
||||
unsigned char out_byte ;
|
||||
|
||||
for (k = 0 ; k < G72x_BLOCK_SIZE ; k++)
|
||||
{ out_buffer |= (samples [k] << out_bits) ;
|
||||
out_bits += bits ;
|
||||
if (out_bits >= 8)
|
||||
{ out_byte = out_buffer & 0xFF ;
|
||||
out_bits -= 8 ;
|
||||
out_buffer >>= 8 ;
|
||||
block [bindex++] = out_byte ;
|
||||
}
|
||||
} ;
|
||||
|
||||
return bindex ;
|
||||
} /* pack_bytes */
|
||||
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: 6298dc75-fd0f-4062-9b90-f73ed69f22d4
|
||||
*/
|
||||
|
99
libs/libsndfile/src/G72x/g72x.h
Normal file
99
libs/libsndfile/src/G72x/g72x.h
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
** Copyright (C) 1999-2005 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU Lesser General Public License as published by
|
||||
** the Free Software Foundation; either version 2.1 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** 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 Lesser General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU Lesser 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
** This file is not the same as the original file from Sun Microsystems. Nearly
|
||||
** all the original definitions and function prototypes that were in the file
|
||||
** of this name have been moved to g72x_priv.h.
|
||||
*/
|
||||
|
||||
#ifndef G72X_HEADER_FILE
|
||||
#define G72X_HEADER_FILE
|
||||
|
||||
/*
|
||||
** Number of samples per block to process.
|
||||
** Must be a common multiple of possible bits per sample : 2, 3, 4, 5 and 8.
|
||||
*/
|
||||
#define G72x_BLOCK_SIZE (3 * 5 * 8)
|
||||
|
||||
/*
|
||||
** Identifiers for the differing kinds of G72x ADPCM codecs.
|
||||
** The identifiers also define the number of encoded bits per sample.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ G723_16_BITS_PER_SAMPLE = 2,
|
||||
G723_24_BITS_PER_SAMPLE = 3,
|
||||
G723_40_BITS_PER_SAMPLE = 5,
|
||||
|
||||
G721_32_BITS_PER_SAMPLE = 4,
|
||||
G721_40_BITS_PER_SAMPLE = 5,
|
||||
|
||||
G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
|
||||
G723_24_SAMPLES_PER_BLOCK = G723_24_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_24_BITS_PER_SAMPLE),
|
||||
G723_40_SAMPLES_PER_BLOCK = G723_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_40_BITS_PER_SAMPLE),
|
||||
|
||||
G721_32_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
|
||||
G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE),
|
||||
|
||||
G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
|
||||
G723_24_BYTES_PER_BLOCK = (G723_24_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
|
||||
G723_40_BYTES_PER_BLOCK = (G723_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
|
||||
|
||||
G721_32_BYTES_PER_BLOCK = (G721_32_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
|
||||
G721_40_BYTES_PER_BLOCK = (G721_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8
|
||||
} ;
|
||||
|
||||
/* Forward declaration of of g72x_state. */
|
||||
|
||||
struct g72x_state ;
|
||||
|
||||
/* External function definitions. */
|
||||
|
||||
struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock) ;
|
||||
struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock) ;
|
||||
/*
|
||||
** Initialize the ADPCM state table for the given codec.
|
||||
** Return 0 on success, 1 on fail.
|
||||
*/
|
||||
|
||||
int g72x_decode_block (struct g72x_state *pstate, const unsigned char *block, short *samples) ;
|
||||
/*
|
||||
** The caller fills data->block with data->bytes bytes before calling the
|
||||
** function. The value data->bytes must be an integer multiple of
|
||||
** data->blocksize and be <= data->max_bytes.
|
||||
** When it returns, the caller can read out data->samples samples.
|
||||
*/
|
||||
|
||||
int g72x_encode_block (struct g72x_state *pstate, short *samples, unsigned char *block) ;
|
||||
/*
|
||||
** The caller fills state->samples some integer multiple data->samples_per_block
|
||||
** (up to G72x_BLOCK_SIZE) samples before calling the function.
|
||||
** When it returns, the caller can read out bytes encoded bytes.
|
||||
*/
|
||||
|
||||
#endif /* !G72X_HEADER_FILE */
|
||||
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: 6ca84e5f-f932-4ba1-87ee-37056d921621
|
||||
*/
|
||||
|
118
libs/libsndfile/src/G72x/g72x_priv.h
Normal file
118
libs/libsndfile/src/G72x/g72x_priv.h
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* This source code is a product of Sun Microsystems, Inc. and is provided
|
||||
* for unrestricted use. Users may copy or modify this source code without
|
||||
* charge.
|
||||
*
|
||||
* SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
|
||||
* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun source code is provided with no support and without any obligation on
|
||||
* the part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
|
||||
#ifndef G72X_PRIVATE_H
|
||||
#define G72X_PRIVATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
#error "This code is not designed to be compiled with a C++ compiler."
|
||||
#endif
|
||||
|
||||
/*
|
||||
** The following is the definition of the state structure used by the
|
||||
** G.721/G.723 encoder and decoder to preserve their internal state
|
||||
** between successive calls. The meanings of the majority of the state
|
||||
** structure fields are explained in detail in the CCITT Recommendation
|
||||
** G.721. The field names are essentially identical to variable names
|
||||
** in the bit level description of the coding algorithm included in this
|
||||
** Recommendation.
|
||||
*/
|
||||
|
||||
struct g72x_state
|
||||
{ long yl; /* Locked or steady state step size multiplier. */
|
||||
short yu; /* Unlocked or non-steady state step size multiplier. */
|
||||
short dms; /* Short term energy estimate. */
|
||||
short dml; /* Long term energy estimate. */
|
||||
short ap; /* Linear weighting coefficient of 'yl' and 'yu'. */
|
||||
|
||||
short a[2]; /* Coefficients of pole portion of prediction filter. */
|
||||
short b[6]; /* Coefficients of zero portion of prediction filter. */
|
||||
short pk[2]; /*
|
||||
** Signs of previous two samples of a partially
|
||||
** reconstructed signal.
|
||||
**/
|
||||
short dq[6]; /*
|
||||
** Previous 6 samples of the quantized difference
|
||||
** signal represented in an internal floating point
|
||||
** format.
|
||||
**/
|
||||
short sr[2]; /*
|
||||
** Previous 2 samples of the quantized difference
|
||||
** signal represented in an internal floating point
|
||||
** format.
|
||||
*/
|
||||
char td; /* delayed tone detect, new in 1988 version */
|
||||
|
||||
/* The following struct members were added for libsndfile. The original
|
||||
** code worked by calling a set of functions on a sample by sample basis
|
||||
** which is slow on architectures like Intel x86. For libsndfile, this
|
||||
** was changed so that the encoding and decoding routines could work on
|
||||
** a block of samples at a time to reduce the function call overhead.
|
||||
*/
|
||||
int (*encoder) (int, struct g72x_state* state) ;
|
||||
int (*decoder) (int, struct g72x_state* state) ;
|
||||
|
||||
int codec_bits, blocksize, samplesperblock ;
|
||||
} ;
|
||||
|
||||
typedef struct g72x_state G72x_STATE ;
|
||||
|
||||
int predictor_zero (G72x_STATE *state_ptr);
|
||||
|
||||
int predictor_pole (G72x_STATE *state_ptr);
|
||||
|
||||
int step_size (G72x_STATE *state_ptr);
|
||||
|
||||
int quantize (int d, int y, short *table, int size);
|
||||
|
||||
int reconstruct (int sign, int dqln, int y);
|
||||
|
||||
void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr);
|
||||
|
||||
int g721_encoder (int sample, G72x_STATE *state_ptr);
|
||||
int g721_decoder (int code, G72x_STATE *state_ptr);
|
||||
|
||||
int g723_16_encoder (int sample, G72x_STATE *state_ptr);
|
||||
int g723_16_decoder (int code, G72x_STATE *state_ptr);
|
||||
|
||||
int g723_24_encoder (int sample, G72x_STATE *state_ptr);
|
||||
int g723_24_decoder (int code, G72x_STATE *state_ptr);
|
||||
|
||||
int g723_40_encoder (int sample, G72x_STATE *state_ptr);
|
||||
int g723_40_decoder (int code, G72x_STATE *state_ptr);
|
||||
|
||||
void private_init_state (G72x_STATE *state_ptr) ;
|
||||
|
||||
#endif /* G72X_PRIVATE_H */
|
||||
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: d9ad4da7-0fa3-471d-8020-720b5cfb5e5b
|
||||
*/
|
||||
|
222
libs/libsndfile/src/G72x/g72x_test.c
Normal file
222
libs/libsndfile/src/G72x/g72x_test.c
Normal file
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
** Copyright (C) 1999-2004 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
**
|
||||
** 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.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "g72x.h"
|
||||
#include "g72x_priv.h"
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846264338
|
||||
#endif
|
||||
|
||||
#define BUFFER_SIZE (1<<14) /* Should be (1<<14) */
|
||||
#define SAMPLE_RATE 11025
|
||||
|
||||
|
||||
static void g721_test (void) ;
|
||||
static void g723_test (double margin) ;
|
||||
|
||||
static void gen_signal_double (double *data, double scale, int datalen) ;
|
||||
static int error_function (double data, double orig, double margin) ;
|
||||
|
||||
static int oct_save_short (short *a, short *b, int len) ;
|
||||
|
||||
int
|
||||
main (int argc, char *argv [])
|
||||
{ int bDoAll = 0 ;
|
||||
int nTests = 0 ;
|
||||
|
||||
if (argc != 2)
|
||||
{ printf ("Usage : %s <test>\n", argv [0]) ;
|
||||
printf (" Where <test> is one of the following:\n") ;
|
||||
printf (" g721 - test G721 encoder and decoder\n") ;
|
||||
printf (" g723 - test G721 encoder and decoder\n") ;
|
||||
printf (" all - perform all tests\n") ;
|
||||
exit (1) ;
|
||||
} ;
|
||||
|
||||
bDoAll=!strcmp (argv [1], "all");
|
||||
|
||||
if (bDoAll || ! strcmp (argv [1], "g721"))
|
||||
{ g721_test () ;
|
||||
nTests++ ;
|
||||
} ;
|
||||
|
||||
if (bDoAll || ! strcmp (argv [1], "g723"))
|
||||
{ g723_test (0.53) ;
|
||||
nTests++ ;
|
||||
} ;
|
||||
|
||||
if (nTests == 0)
|
||||
{ printf ("Mono : ************************************\n") ;
|
||||
printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
|
||||
printf ("Mono : ************************************\n") ;
|
||||
return 1 ;
|
||||
} ;
|
||||
|
||||
return 0 ;
|
||||
} /* main */
|
||||
|
||||
static void
|
||||
g721_test (void)
|
||||
{
|
||||
return ;
|
||||
} /* g721_test */
|
||||
|
||||
static void
|
||||
g723_test (double margin)
|
||||
{ static double orig_buffer [BUFFER_SIZE] ;
|
||||
static short orig [BUFFER_SIZE] ;
|
||||
static short data [BUFFER_SIZE] ;
|
||||
|
||||
G72x_STATE encoder_state, decoder_state ;
|
||||
|
||||
long k ;
|
||||
int code, position, max_err ;
|
||||
|
||||
private_init_state (&encoder_state) ;
|
||||
encoder_state.encoder = g723_24_encoder ;
|
||||
encoder_state.codec_bits = 3 ;
|
||||
|
||||
private_init_state (&decoder_state) ;
|
||||
decoder_state.decoder = g723_24_decoder ;
|
||||
decoder_state.codec_bits = 3 ;
|
||||
|
||||
memset (data, 0, BUFFER_SIZE * sizeof (short)) ;
|
||||
memset (orig, 0, BUFFER_SIZE * sizeof (short)) ;
|
||||
|
||||
printf (" g723_test : ") ;
|
||||
fflush (stdout) ;
|
||||
|
||||
gen_signal_double (orig_buffer, 32000.0, BUFFER_SIZE) ;
|
||||
for (k = 0 ; k < BUFFER_SIZE ; k++)
|
||||
orig [k] = (short) orig_buffer [k] ;
|
||||
|
||||
/* Write and read data here. */
|
||||
position = 0 ;
|
||||
max_err = 0 ;
|
||||
for (k = 0 ; k < BUFFER_SIZE ; k++)
|
||||
{ code = encoder_state.encoder (orig [k], &encoder_state) ;
|
||||
data [k] = decoder_state.decoder (code, &decoder_state) ;
|
||||
if (abs (orig [k] - data [k]) > max_err)
|
||||
{ position = k ;
|
||||
max_err = abs (orig [k] - data [k]) ;
|
||||
} ;
|
||||
} ;
|
||||
|
||||
printf ("\n\nMax error of %d at postion %d.\n", max_err, position) ;
|
||||
|
||||
for (k = 0 ; k < BUFFER_SIZE ; k++)
|
||||
{ if (error_function (data [k], orig [k], margin))
|
||||
{ printf ("Line %d: Incorrect sample A (#%ld : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ;
|
||||
oct_save_short (orig, data, BUFFER_SIZE) ;
|
||||
exit (1) ;
|
||||
} ;
|
||||
} ;
|
||||
|
||||
|
||||
printf ("ok\n") ;
|
||||
|
||||
return ;
|
||||
} /* g723_test */
|
||||
|
||||
|
||||
#define SIGNAL_MAXVAL 30000.0
|
||||
#define DECAY_COUNT 1000
|
||||
|
||||
static void
|
||||
gen_signal_double (double *gendata, double scale, int gendatalen)
|
||||
{ int k, ramplen ;
|
||||
double amp = 0.0 ;
|
||||
|
||||
ramplen = DECAY_COUNT ;
|
||||
|
||||
for (k = 0 ; k < gendatalen ; k++)
|
||||
{ if (k <= ramplen)
|
||||
amp = scale * k / ((double) ramplen) ;
|
||||
else if (k > gendatalen - ramplen)
|
||||
amp = scale * (gendatalen - k) / ((double) ramplen) ;
|
||||
|
||||
gendata [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
|
||||
+ 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
|
||||
} ;
|
||||
|
||||
return ;
|
||||
} /* gen_signal_double */
|
||||
|
||||
static int
|
||||
error_function (double data, double orig, double margin)
|
||||
{ double error ;
|
||||
|
||||
if (fabs (orig) <= 500.0)
|
||||
error = fabs (fabs (data) - fabs(orig)) / 2000.0 ;
|
||||
else if (fabs (orig) <= 1000.0)
|
||||
error = fabs (data - orig) / 3000.0 ;
|
||||
else
|
||||
error = fabs (data - orig) / fabs (orig) ;
|
||||
|
||||
if (error > margin)
|
||||
{ printf ("\n\n*******************\nError : %f\n", error) ;
|
||||
return 1 ;
|
||||
} ;
|
||||
return 0 ;
|
||||
} /* error_function */
|
||||
|
||||
static int
|
||||
oct_save_short (short *a, short *b, int len)
|
||||
{ FILE *file ;
|
||||
int k ;
|
||||
|
||||
if (! (file = fopen ("error.dat", "w")))
|
||||
return 1 ;
|
||||
|
||||
fprintf (file, "# Not created by Octave\n") ;
|
||||
|
||||
fprintf (file, "# name: a\n") ;
|
||||
fprintf (file, "# type: matrix\n") ;
|
||||
fprintf (file, "# rows: %d\n", len) ;
|
||||
fprintf (file, "# columns: 1\n") ;
|
||||
|
||||
for (k = 0 ; k < len ; k++)
|
||||
fprintf (file, "% d\n", a [k]) ;
|
||||
|
||||
fprintf (file, "# name: b\n") ;
|
||||
fprintf (file, "# type: matrix\n") ;
|
||||
fprintf (file, "# rows: %d\n", len) ;
|
||||
fprintf (file, "# columns: 1\n") ;
|
||||
|
||||
for (k = 0 ; k < len ; k++)
|
||||
fprintf (file, "% d\n", b [k]) ;
|
||||
|
||||
fclose (file) ;
|
||||
return 0 ;
|
||||
} /* oct_save_short */
|
||||
|
||||
/*
|
||||
** Do not edit or modify anything in this comment block.
|
||||
** The arch-tag line is a file identity tag for the GNU Arch
|
||||
** revision control system.
|
||||
**
|
||||
** arch-tag: 0597b442-a5b0-4abf-92a4-92f6c24e85a6
|
||||
*/
|
||||
|
Reference in New Issue
Block a user