diff options
28 files changed, 4 insertions, 5129 deletions
diff --git a/configure.ac b/configure.ac index 98d50652e..46afc4931 100644 --- a/configure.ac +++ b/configure.ac @@ -697,6 +697,7 @@ dnl --------------------------------------------- AC_MSG_CHECKING(for Libstk) dnl do some actual testing here if test x$PKG_CONFIG = xno ; then + AC_MSG_RESULT(no) echo "*** pkg-config not found. See http://pkgconfig.sourceforge.net" echo "*** All of LIBSTK dependent parts will be disabled" else @@ -705,7 +706,9 @@ else LIBSTK_CFLAGS=`$PKG_CONFIG --cflags libstk` LIBSTK_LIBS=`$PKG_CONFIG --libs libstk` have_stk="yes" + AC_MSG_RESULT(yes) else + AC_MSG_RESULT(no) AC_MSG_RESULT([*** All of Libstk dependent parts will be disabled ***]) fi fi @@ -750,6 +753,7 @@ AC_LANG_RESTORE() if test x$have_directx = xyes ; then AC_MSG_RESULT(yes) else + AC_MSG_RESULT(no) AC_MSG_RESULT(*** All DirectX dependent parts will be disabled ***) fi @@ -837,14 +841,6 @@ AC_CHECK_PROG(DEPMOD, depmod, depmod, no, $PATH:/sbin) dnl --------------------------------------------- -dnl Check for divx4 -dnl --------------------------------------------- - -dnl AC_CHECK_DIVX4(, AC_MSG_RESULT(*** All DIVX4 dependent parts will be disabled ***)) -dnl AM_CONDITIONAL(HAVE_DIVX4, test x"$no_divx4" != "xyes") - - -dnl --------------------------------------------- dnl Ogg/Vorbis libs. dnl --------------------------------------------- @@ -890,14 +886,6 @@ AM_CONDITIONAL(HAVE_FLAC, [test x"$no_libFLAC" != "xyes"]) dnl --------------------------------------------- -dnl XviD libs. -dnl --------------------------------------------- -dnl abandonware -dnl AM_PATH_XVID([], AC_MSG_RESULT([*** All XviD dependent parts will be disabled ***])) -dnl AM_CONDITIONAL(HAVE_XVID, [test x"$no_xvid" != "xyes"]) - - -dnl --------------------------------------------- dnl MNG libs. dnl --------------------------------------------- @@ -2146,9 +2134,6 @@ echo " - On2 VP3 - DV" echo " - 8BPS - Duck TrueMotion v1" echo " - ATI VCR1 - Flash Video" echo " - ZLIB - MSZH" -dnl if test x"$no_xvid" = "xno"; then -dnl echo " - xvid" -dnl fi if test x"$have_dxr3" = "xyes"; then echo " - dxr3_video" fi diff --git a/doc/hackersguide/overview.sgml b/doc/hackersguide/overview.sgml index 0b7996b7a..eef0f2732 100644 --- a/doc/hackersguide/overview.sgml +++ b/doc/hackersguide/overview.sgml @@ -131,16 +131,6 @@ </listitem> </varlistentry> <varlistentry> - <term><filename>libdivx4</filename></term> - <listitem> - <para> - Video decoder plugin using libdivx4linux if it is installed. - Currently unmaintained and soon to be discontinued if noone cares to take over. - </para> - <para></para> - </listitem> - </varlistentry> - <varlistentry> <term><filename>libdts</filename> (imported)</term> <listitem> <para> @@ -260,17 +250,6 @@ </listitem> </varlistentry> <varlistentry> - <term><filename>libmpg123</filename> (imported)</term> - <listitem> - <para> - An MPEG audio decoder plugin baseg on mpg123 code. This plugin is disabled - because it is unmaintained. Some people said, it was faster than the libmad - decoder. But if noone starts to fix it, it will disappear soon. - </para> - <para></para> - </listitem> - </varlistentry> - <varlistentry> <term><filename>libreal</filename></term> <listitem> <para> @@ -406,18 +385,6 @@ </listitem> </varlistentry> <varlistentry> - <term><filename>libxvid</filename></term> - <listitem> - <para> - A xine decoder plugin for the xvid library, - which has to be installed separately. This plugin is - unmaintained and unless someone cares to update it, it will - be moved to the attic soon. - </para> - <para></para> - </listitem> - </varlistentry> - <varlistentry> <term><filename>post</filename></term> <listitem> <para> diff --git a/m4/_xine.m4 b/m4/_xine.m4 index fc59ad2b1..2051eaf4a 100644 --- a/m4/_xine.m4 +++ b/m4/_xine.m4 @@ -25,29 +25,6 @@ AC_DEFUN([AC_C_ALWAYS_INLINE], fi]) dnl -dnl Check for divx4. -dnl AC_CHECK_DIVX4([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]) -AC_DEFUN([AC_CHECK_DIVX4], - [ - - AC_CHECK_HEADER(decore.h, - [ no_divx4=no; - AC_CHECK_LIB(divxdecore, decore, - [ no_divx4=no; DIVX4_LIBS="$DIVX4_LIBS -ldivxdecore" ], - no_divx4=yes) - ], no_divx4=yes) - - AC_SUBST(DIVX4_LIBS) - - if test x"$no_divx4" = "xno" ; then - ifelse([$1], , :, [$1]) - else - ifelse([$2], , :, [$2]) - fi - -]) - -dnl dnl Check for minimum version of libtool dnl AC_PREREQ_LIBTOOL([MINIMUM VERSION],[ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]) AC_DEFUN([AC_PREREQ_LIBTOOL], diff --git a/src/Makefile.am b/src/Makefile.am index 8a88ad77b..f35db8cb7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,10 +1,6 @@ include $(top_srcdir)/misc/Makefile.common # Order is important be careful changing SUBDIRS -#SUBDIRS = \ -# libdivx4 \ -# libxvid - SUBDIRS = \ xine-utils \ xine-engine \ diff --git a/src/libdivx4/.cvsignore b/src/libdivx4/.cvsignore deleted file mode 100644 index 7d926a554..000000000 --- a/src/libdivx4/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/src/libdivx4/Makefile.am b/src/libdivx4/Makefile.am deleted file mode 100644 index 8c3337d51..000000000 --- a/src/libdivx4/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -libdir = $(XINE_PLUGINDIR) - -lib_LTLIBRARIES = xineplug_decode_divx4.la - -xineplug_decode_divx4_la_SOURCES = xine_decoder.c -xineplug_decode_divx4_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@ - -noinst_HEADERS = decore-if.h diff --git a/src/libdivx4/decore-if.h b/src/libdivx4/decore-if.h deleted file mode 100644 index 25b34f670..000000000 --- a/src/libdivx4/decore-if.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2001-2003 the xine project - * - * This file is part of xine, a free video player. - * - * xine 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. - * - * xine 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 - * - * $Id: decore-if.h,v 1.5 2003/12/09 00:02:31 f1rmb Exp $ - * - * This file documents the interface for the decore() function - * in libdivxdecore. In case of problems, it is recommended you compare - * the definitions in this file with the header file that came with your - * divx4 library (see below). - * - * The divxdecore library can be found as part of the divx4linux package at - * http://www.divx.com or http://avifile.sourceforge.net The package also - * contains a text file documenting the decore/encore API. - * - * Alternatively, the open source OpenDivx project (http://www.projectmayo.com) - * also provides a divxdecore library with the same interface. There is - * a project called XviD at http://www.videocoding.de that extends the - * opendivx project. - * - * THIS FILE AND THE XINE DECORE PLUGIN ARE INTENDED FOR THE BINARY DIVX4LINUX - * PACKAGE. OPENDIVX DECORE LIBRARIES ARE CURRENTLY NOT SUPPORTED AND MAY OR - * MAY NOT WORK. - * - * Harm van der Heijden <hrm@users.sourceforge.net> - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _DECORE_IF_H_ -#define _DECORE_IF_H_ - -/* decore commands (2nd parameter in decore()) */ -#define DEC_OPT_MEMORY_REQS 0 -#define DEC_OPT_INIT 1 -#define DEC_OPT_RELEASE 2 -#define DEC_OPT_SETPP 3 -#define DEC_OPT_SETOUT 4 -#define DEC_OPT_FRAME 5 -#define DEC_OPT_FRAME_311 6 -#define DEC_OPT_SETPP2 7 -#define DEC_OPT_VERSION 8 -#define DEC_OPT_SETPP_ADV 10 /* advanced (personalized) postprocessing settings */ -#define DEC_OPT_SETDEBUG 11 -#define DEC_OPT_INIT_VOL 12 -#define DEC_OPT_CONVERTYUV 13 -#define DEC_OPT_CONVERTYV12 14 -#define DEC_OPT_GETVOLINFO 15 - -/* decore() return values. */ -#define DEC_OK 0 -#define DEC_MEMORY 1 -#define DEC_BAD_FORMAT 2 -#define DEC_EXIT 3 - -/* colour formats -- yuv */ -#define DEC_YUY2 1 -#define DEC_YUV2 DEC_YUY2 -#define DEC_UYVY 2 -#define DEC_420 3 -#define DEC_YV12 13 /* looks like an afterthought, eh? */ -#define DEC_ARGB 14 - -/* colour formats -- rgb - not yet used by xine, but perhaps in the future. - (decore yuv->rgb conversion may be better than libsdl/Xshm) */ -#define DEC_RGB32 4 -#define DEC_RGB24 5 -#define DEC_RGB555 6 -#define DEC_RGB565 7 - -#define DEC_RGB32_INV 8 -#define DEC_RGB24_INV 9 -#define DEC_RGB555_INV 10 -#define DEC_RGB565_INV 11 - -/* pseudo colour format; makes decore() return pointers to internal - yuv buffers for manual conversion, see DEC_PICTURE */ -#define DEC_USER 12 - -/* memory requirement structure; the officical codec spec calls for - a DEC_OPT_MEMORY_REQ call prior to DEC_OPT_INIT, but it does not - actually seem to be used */ -typedef struct -{ - unsigned long mp4_edged_ref_buffers_size; - unsigned long mp4_edged_for_buffers_size; - unsigned long mp4_edged_back_buffers_size; - unsigned long mp4_display_buffers_size; - unsigned long mp4_state_size; - unsigned long mp4_tables_size; - unsigned long mp4_stream_size; - unsigned long mp4_reference_size; -} DEC_MEM_REQS; - -/* included in DEC_PARAM for init, not really used otherwise. */ -typedef struct -{ - void * mp4_edged_ref_buffers; - void * mp4_edged_for_buffers; - void * mp4_edged_back_buffers; - void * mp4_display_buffers; - void * mp4_state; - void * mp4_tables; - void * mp4_stream; - void * mp4_reference; -} DEC_BUFFERS; - -/* struct for DEC_OPT_INIT */ -typedef struct -{ - int x_dim; /* frame width */ - int y_dim; /* frame height */ - int output_format; /* refers to colour formats defined above */ - int time_incr; /* mystery parameter, use 15 */ - int codec_version; - int build_number; - DEC_BUFFERS buffers; /* memcpy 0's in this struct before init */ -} DEC_PARAM; - -/* struct for DEC_OPT_DECODE */ -typedef struct -{ - void *bmp; /* pointer to rgb, yuv or DEC_PICTURE buffer */ - void *bitstream; /* input bit stream */ - long length; /* length of input */ - int render_flag; /* 1 to actually render the frame */ - unsigned int stride; /* bmp stride; should be width */ -} DEC_FRAME; - -/* decode frame information. not yet used by xine */ -typedef struct -{ - int intra; - int *quant_store; - int quant_stride; -} DEC_FRAME_INFO; - -/* structure for DEC_OPT_SETPP, for setting the postprocessing level */ -typedef struct -{ - int postproc_level; /* between 0-100, actually used 0-60 */ - - int deblock_hor_luma; - int deblock_ver_luma; - int deblock_hor_chr; - int deblock_ver_chr; - int dering_luma; - int dering_chr; - - int pp_semaphore; - -} DEC_SET; - -/* structure for DEC_USER output format, should be used instead of bmp ptr */ -typedef struct -{ - void *y; - void *u; - void *v; - int stride_y; - int stride_uv; -} DEC_PICTURE; - -/* Finally, decore() itself. Refer to the official codec interface text for - a complete description. */ -int decore( unsigned long handle, unsigned long dec_opt, void* param1, void* param2); -/* handle: unique caller handle. xine uses the video_decoder_t ptr. - dec_opt: decore command id - param1: depends on command. Usually ptr to struct with input values. - param2: depends on command. Usually ptr to struct with output values. */ - -/* typedef for pointer to decore function */ -typedef int (*decoreFunc)(unsigned long, unsigned long, void*, void*); - -#endif /* _DECORE_IF_H_ */ -#ifdef __cplusplus -} -#endif - diff --git a/src/libdivx4/xine_decoder.c b/src/libdivx4/xine_decoder.c deleted file mode 100644 index 5867a643b..000000000 --- a/src/libdivx4/xine_decoder.c +++ /dev/null @@ -1,603 +0,0 @@ -/* - * Copyright (C) 2001-2004 the xine project - * - * This file is part of xine, a free video player. - * - * xine 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. - * - * xine 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 - * - * $Id: xine_decoder.c,v 1.51 2004/03/03 20:09:13 mroi Exp $ - * - * xine decoder plugin using divx4 - * - * by Harm van der Heijden <hrm@users.sourceforge.net> - * Based on the ffmpeg xine plugin, with ideas from avifile's - * (http://avifile.sourceforge.net) divx4 plugin. - * - * Requires the divxdecore library. Find it at http://www.divx.com or - * http://avifile.sourceforge.net - * This plugin may or may not work with the open source codec OpenDivx. - * - * This is My First Plugin (tm). Read the source comments for hairy details. - * - */ - -/* 1: catch segmentation fault signal when checking version of libdivxdecore - * 0: don't try to catch - * set to 0 if the signal stuff gives problems. tested in x86 linux w/ glibc2. - */ -#define CATCH_SIGSEGV 1 - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdlib.h> -#include <stdio.h> -#include <inttypes.h> -#include <string.h> -#include <dlfcn.h> - -#define LOG_MODULE "divx4_decoder" -#define LOG_VERBOSE -/* -#define LOG -*/ - -#include "xine_internal.h" -#include "video_out.h" -#include "buffer.h" -#include "metronom.h" -#include "xineutils.h" - -#include "decore-if.h" - -#if CATCH_SIGSEGV -#include <signal.h> - -/* to be able to restore the old handler */ -void (*old_handler)(int); - -void catch_sigsegv(int sig) -{ - printf("divx4: caught SIGSEGV, caused by libdivxdecore.\n" - "divx4: please uninstall this library or disable the libdivxdecore\n" - "divx4: version check by setting the following line in HOME/.xinerc:\n" - "divx4: divx4_forceversion:1\n" - "divx4: see xine-ui/doc/README.divx4 for details.\n" - "divx4: fatal error; exiting.\n"); - _x_abort(); -} -#endif - -typedef struct divx4_decoder_s { - video_decoder_t video_decoder; - - vo_instance_t *video_out; - int video_step; - int decoder_ok; - - xine_bmiheader bih; - unsigned char *buf; - int size; - int bufsize; - double ratio; - - decoreFunc decore; /* ptr to decore function in libdivxdecore */ - - /* version as reported by decore with GET_OPT_VERSION command */ - int version; - /* whether to decode MSMPEG4_V3 format - (aka divx ;-) and divx 3.11-- thank god they dropped the smileys - with divx4) - */ - int use_311_compat; - /* postprocessing level; currently valid values 0-6 (internally 0-100) - set by divx4_postproc in .xinerc */ - int postproc; - /* can we handle 311 format? No easy way to find out (divx4linux can, - OpenDivx cannot, so the user can set it in .xinerc. If 0, can_handle - only returns MPEG4, yielding 311 to ffmpeg */ - int can_handle_311; - int skipframes; -} divx4_decoder_t; - -#define VIDEOBUFSIZE 128*1024 - - -static char* decore_retval(int ret) -{ - static char buf[128]; - switch (ret) { - case DEC_OK: return "DEC_OK"; - case DEC_MEMORY: return "DEC_MEMORY"; - case DEC_BAD_FORMAT: return "DEC_BAD_FORMAT"; - case DEC_EXIT: return "DEC_EXIT"; - } - sprintf(buf, "[Unknown code %d]", ret); - return buf; -} - -/* try to get the version libdivxdecore */ -static void divx4_get_version(divx4_decoder_t *this) -{ - /* if version set in xine config file, do not attempt further checking - * (but do print a warning about this!) */ - if (this->version) { - /* this dangerous stuff warrants an extra warning */ - printf("divx4: assuming libdivxdecore version is %d\n", this->version); - return; - } - -#if CATCH_SIGSEGV - /* try to catch possible segmentation fault triggered by version check. - * old versions of OpenDivx are known to do this. - * we have to exit(1) in case it happens, but at least the user'll know - * what happened */ - old_handler = signal(SIGSEGV, catch_sigsegv); - if (old_handler == SIG_ERR) - printf("divx4: failed to set SIGSEGV handler for libdivxdecore version check. Danger!\n"); - /* ask decore for version, using arbitrary handle 123 */ - this->version = this->decore(123, DEC_OPT_VERSION, 0, 0); - /* restore old signal handler */ - if (old_handler != SIG_ERR) - signal(SIGSEGV, old_handler); -#else - /* no SIGSEGV catching, let's hope survive this... */ - this->version = this->decore(123, DEC_OPT_VERSION, 0, 0); -#endif - - if (this->version < 100) { /* must be an error code */ - printf("divx4: libdivxdecore failed to return version number (returns %s)\n", - decore_retval(this->version)); - this->version = 0; - } - printf("divx4: found divx4 or OpenDivx decore library, version %d\n", - this->version); -} - -/* check to see if the libdivxdecore version is recent enough. - * returns 1 if ok, 0 if not. */ -static int divx4_check_version(divx4_decoder_t *this) -{ - /* now check the version - * oktober '01 and later are ok. (early august releases had a (possible) - * problem with DEC_OPT_RELEASE, which is very important currently) */ - if (this->version < 20011000) { - printf("divx4: libdivxdecore version \"%d\" too old. Need 20011000 or later\n" - "divx4: see README.divx4 for details on where to find libdivxdecore.\n", - this->version); - return 0; - } - - return 1; -} - -static void divx4_set_pp(divx4_decoder_t *this) { - DEC_SET setpp; /* for setting postproc level */ - int ret; - - lprintf ("this->decoder_ok=%d\n", this->decoder_ok); - - if (!this->decoder_ok) - return; - - /* multiply postproc level by 10 for internal consumption */ - printf("divx4: Setting post processing level to %d (see ~/.xine/options)\n" - "divx4: Valid range 0-6, reduce if you get frame drop\n", - this->postproc); - - setpp.postproc_level = this->postproc*10; - setpp.deblock_hor_luma = 0; - setpp.deblock_ver_luma = 0; - setpp.deblock_hor_chr = 0; - setpp.deblock_ver_chr = 0; - setpp.dering_luma = 0; - setpp.dering_chr = 0; - setpp.pp_semaphore = 0; - - ret = this->decore((unsigned long)this, DEC_OPT_SETPP, &setpp, 0); - if (ret != DEC_OK) { - printf("divx4: decore DEC_OPT_SETPP command returned %s.\n", decore_retval(ret)); - /* perhaps not fatal, so we'll continue */ - } -} - - -/* helper function to initialize decore */ -static int divx4_init_decoder(divx4_decoder_t *this, buf_element_t *buf) { - - DEC_PARAM param; /* for init */ - int ret, codec_type; - - lprintf ("init_decoder\n"); - - memcpy ( &this->bih, buf->content, sizeof (xine_bmiheader)); - - codec_type = buf->type & 0xFFFF0000; - - /* do we need divx 3.11 compatibility mode? */ - switch (buf->type & 0xFFFF0000) { - case BUF_VIDEO_MSMPEG4_V1: - case BUF_VIDEO_MSMPEG4_V2: - case BUF_VIDEO_MSMPEG4_V3: - if (this->version >= 20020303) { - param.codec_version=311; - this->use_311_compat = 0; - } else { - this->use_311_compat = 1; - } - break; - case BUF_VIDEO_MPEG4: - case BUF_VIDEO_DIVX5: - if (this->version >= 20020303) - param.codec_version=500; - - this->use_311_compat = 0; - if (this->version >= 20020303) - param.codec_version=500; - break; - default: - printf ("divx4: unknown video format (buftype: 0x%08X)\n", - buf->type & 0xFFFF0000); - } - - this->ratio = (double)this->bih.biWidth/(double)this->bih.biWidth; - - /* setup decoder; inspired by avifile's plugin */ - param.x_dim=this->bih.biWidth; - param.y_dim=this->bih.biHeight; - param.time_incr = 15; /* no idea what this does */ - - param.build_number=0; - - param.output_format=DEC_USER; - param.build_number=0; - memset(¶m.buffers, 0, sizeof(param.buffers)); - - ret = this->decore((unsigned long)this, DEC_OPT_INIT, ¶m, &this->bih); - if (ret != DEC_OK) { - printf("divx4: decore DEC_OPT_INIT command returned %s.\n", decore_retval(ret)); - return 0; - } - - this->decoder_ok = 1; - - divx4_set_pp( this ); - - return 1; -} - -/* helper function to copy data from decore's internal buffer to a vo frame */ -static inline void divx4_copy_frame(divx4_decoder_t *this, vo_frame_t *img, - DEC_PICTURE pict) -{ - /* We need to copy the yuv data from the decoder's internal buffers. - Y size is width*height, U and V width*height/4 */ - int i; - int src_offset,dst_offset; - - /* copy y data; use shortcut if stride_y equals width */ - src_offset = 0; - dst_offset = 0; - if (pict.stride_y == img->pitches[0]) { - xine_fast_memcpy(img->base[0]+dst_offset, pict.y, img->pitches[0]*this->bih.biHeight); - dst_offset += img->pitches[0] * this->bih.biHeight; - } - else { /* copy line by line */ - for (i=0; i<this->bih.biHeight; i++) { - xine_fast_memcpy(img->base[0]+dst_offset, pict.y+src_offset, this->bih.biWidth); - src_offset += pict.stride_y; - dst_offset += img->pitches[0]; - } - } - - /* same for u,v data, but at 1/4 resolution. - FIXME: Weird... I thought YV12 means order y-v-u, yet base[1] - seems to be u and base[2] is v. */ - - /* copy u and v data */ - src_offset = 0; - dst_offset = 0; - if (pict.stride_uv == img->pitches[1] && pict.stride_uv == img->pitches[2]) { - xine_fast_memcpy(img->base[1]+dst_offset, pict.u, (img->pitches[1]*this->bih.biHeight)/4); - xine_fast_memcpy(img->base[2]+dst_offset, pict.v, (img->pitches[2]*this->bih.biHeight)/4); - dst_offset += (this->bih.biWidth*this->bih.biHeight)/4; - } - else { - int dst_offset_v = 0; - for (i=0; i<this->bih.biHeight>>1; i++) { - xine_fast_memcpy(img->base[1]+dst_offset, pict.u+src_offset, this->bih.biWidth/2); - xine_fast_memcpy(img->base[2]+dst_offset_v, pict.v+src_offset, this->bih.biWidth/2); - src_offset += pict.stride_uv; - dst_offset += img->pitches[1]; - dst_offset_v += img->pitches[2]; - } - } -} - -static int divx4_can_handle (video_decoder_t *this_gen, int buf_type) { - divx4_decoder_t *this = (divx4_decoder_t *) this_gen; - buf_type &= 0xFFFF0000; - - lprintf ("can_handle\n"); - - /* divx4 currently does not support MSMPEG4 v1/v2 */ - return ( (buf_type == BUF_VIDEO_MSMPEG4_V3 && this->can_handle_311) || - /* buf_type == BUF_VIDEO_MSMPEG4_V2 || */ - (buf_type == BUF_VIDEO_MPEG4) || - (buf_type == BUF_VIDEO_DIVX5)); -} - -/* copied verbatim from ffmpeg plugin */ -static void divx4_init (video_decoder_t *this_gen, vo_instance_t *video_out) { - - divx4_decoder_t *this = (divx4_decoder_t *) this_gen; - - lprintf ("divx4_init\n"); - - this->video_out = video_out; - this->decoder_ok = 0; - this->buf = NULL; -} - - -static void divx4_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { - - DEC_FRAME frame; /* for getting a frame */ - DEC_PICTURE pict;/* contains ptrs to the decoders internal yuv buffers */ - vo_frame_t *img; /* video out frame */ - int ret; - - divx4_decoder_t *this = (divx4_decoder_t *) this_gen; - - lprintf ("decoding buffer %08x, flags = %08x\n", buf, buf->decoder_flags); - - if (buf->decoder_flags & BUF_FLAG_PREVIEW) - return; - - if (buf->decoder_flags & BUF_FLAG_STDHEADER) { /* need to initialize */ - /* only proceed if version is good and initialization succeeded */ - - lprintf ("get_version...\n"); - - divx4_get_version(this); - this->decoder_ok = ( divx4_check_version(this) && - divx4_init_decoder (this, buf) ); - if (this->decoder_ok) { - this->video_out->open (this->video_out); - - if( this->buf ) - free( this->buf ); - - this->buf = malloc( VIDEOBUFSIZE ); - this->bufsize = VIDEOBUFSIZE; - - this->skipframes = 0; - } - return; - } - - if (! this->decoder_ok) { /* don't try to do anything */ - /* if it is because of the version, print the warning again. - * otherwise it's an unknown internal error. */ - if (divx4_check_version(this) != 0) /* version is good */ - printf("divx4: internal error; decoder not initialized.\n"); - return; - } - - if( this->size + buf->size > this->bufsize ) { - this->bufsize = this->size + 2 * buf->size; - printf("divx4: increasing source buffer to %d to avoid overflow.\n", - this->bufsize); - this->buf = realloc( this->buf, this->bufsize ); - } - - xine_fast_memcpy (&this->buf[this->size], buf->content, buf->size); - this->size += buf->size; - - if (buf->decoder_flags & BUF_FLAG_FRAMERATE) { - this->video_step = buf->decoder_info[0]; - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->video_step); - } - - if (buf->decoder_flags & BUF_FLAG_FRAME_END) { /* need to decode a frame */ - /* allocate image (taken from ffmpeg plugin) */ - img = this->video_out->get_frame (this->video_out, this->bih.biWidth, - this->bih.biHeight, this->ratio, - XINE_IMGFMT_YV12, - VO_BOTH_FIELDS); - - img->pts = buf->pts; - img->duration = this->video_step; - /* setup the decode frame parameters, as demonstrated by avifile. - Old versions used DEC_YV12, but that was basically wrong and just - happened to work with the Xv driver. Now DEC_USER is the only option. - */ - frame.bitstream=this->buf; - frame.bmp=&pict; /* decore will set ptrs to internal y,u&v buffers */ - frame.length=this->size; - frame.render_flag=1; - frame.stride=this->bih.biWidth; - - if(this->use_311_compat) - ret = this->decore((unsigned long)this, DEC_OPT_FRAME_311, &frame, 0); - else - ret = this->decore((unsigned long)this, DEC_OPT_FRAME, &frame, 0); - - if (ret != DEC_OK || this->skipframes) { - if( !this->skipframes ) - printf("divx4: decore DEC_OPT_FRAME command returned %s.\n", - decore_retval(ret)); - img->bad_frame = 1; /* better skip this one */ - } - else { - divx4_copy_frame(this, img, pict); - img->bad_frame = 0; - } - - this->skipframes = img->draw(img); - if( this->skipframes < 0 ) - this->skipframes = 0; - img->free(img); - - this->size = 0; - } -} - -static void divx4_close (video_decoder_t *this_gen) { - - divx4_decoder_t *this = (divx4_decoder_t *) this_gen; - - printf ("divx4: close\n"); - - if (this->decoder_ok) { - /* FIXME: this segfaults here */ - /* Note: we NEED this; after 0.9.4, xine closes and reopens - * decoders when seeking. If DEC_OPT_RELEASE is disabled, it will - * cause a memory leak of plusminus 5M per shot */ - this->decore((unsigned long)this, DEC_OPT_RELEASE, 0, 0); - this->decoder_ok = 0; - this->video_out->close(this->video_out); - } - - if (this->buf) - free(this->buf); - this->buf = NULL; -} - -static void divx4_update_postproc(void *this_gen, xine_cfg_entry_t *entry) { - - divx4_decoder_t *this = (divx4_decoder_t *) this_gen; - - lprintf ("update_postproc this=0x%08x, decoder_ok = %d\n", this, this->decoder_ok); - - if( this->postproc != entry->num_value) { - this->postproc = entry->num_value; - divx4_set_pp( this ); - } -} - - -static char *divx4_get_id(void) { - lprintf ("get_id\n"); - return "divx4 video decoder"; -} - -static void divx4_flush(video_decoder_t *this_gen) { - lprintf ("flush\n"); -} - -static void divx4_reset(video_decoder_t *this_gen) { - /* seems to handle seeking quite nicelly without any code here */ - lprintf ("reset\n"); -} - -static void divx4_dispose(video_decoder_t *this_gen) { - lprintf ("dispose\n"); - free (this_gen); -} - -/* This is pretty generic. I took the liberty to increase the - priority over that of libffmpeg :-) */ -static void *init_video_decoder_plugin (xine_t *xine, void *data) { - - divx4_decoder_t *this ; - char *libdecore_name; - void *libdecore_handle; - decoreFunc libdecore_func = 0; - config_values_t *cfg; - - cfg = xine->config; - - /* Try to dlopen libdivxdecore, then look for decore function - if it fails, print a message and return 0 so that xine ignores - us from then on. */ - libdecore_name = cfg->register_string (cfg, "codec.divx4_libdivxdecore", "libdivxdecore.so", - _("Relative path to libdivxdecore.so to open"), - NULL, 0, NULL, NULL); - - libdecore_handle = dlopen(libdecore_name, RTLD_LAZY); - if (libdecore_handle) - libdecore_func = dlsym(libdecore_handle, "decore"); - if (! libdecore_func) { - /* no library or no decore function. this plugin can do nothing */ - return NULL; - } - - this = (divx4_decoder_t *) xine_xmalloc (sizeof (divx4_decoder_t)); - - this->decoder_ok = 0; - - this->video_decoder.init = divx4_init; - this->video_decoder.decode_data = divx4_decode_data; - this->video_decoder.close = divx4_close; - this->video_decoder.get_identifier = divx4_get_id; - this->video_decoder.flush = divx4_flush; - this->video_decoder.reset = divx4_reset; - this->video_decoder.dispose = divx4_dispose; - this->decore = libdecore_func; - this->postproc = cfg->register_range (cfg, "codec.divx4_postproc", 3, - 0, 6, - _("the postprocessing level, 0 = none and fast, 6 = all and slow"), - NULL, 10, divx4_update_postproc, this); - this->can_handle_311 = cfg->register_bool (cfg, "codec.divx4_msmpeg4v3", 1, - _("use divx4 plugin for msmpeg4v3 streams"), - NULL, 10, NULL, NULL); - this->size = 0; - /* allow override of version checking by user */ - this->version = cfg->register_num(cfg, "codec.divx4_forceversion", 0, - _("Divx version to check for (set to 0 (default) if unsure)"), - NULL, 20, NULL, NULL); - - /* if the version set in the config file, we can check right now. - * otherwise postpone until we retrieve the version from the library - * in the first decoding call (we'll only ever get there if this - * plugin has the highest priority, which by default it has not). */ - if ( this->version != 0 && divx4_check_version(this) == 0 ) { /* failed */ - free(this); - return 0; - } - /* at the moment availabe values are 0-6, but future versions may support - higher levels. Internally, postproc is multiplied by 10 and values - between 0 and 100 are valid */ - if (this->postproc > 10) this->postproc=10; - if (this->postproc < 0) this->postproc=0; - - lprintf ("this=0x%08x, decoder_ok = %d\n", this, this->decoder_ok); - - return (video_decoder_t *) this; -} - -/* - * exported plugin catalog entry - */ - -static uint32_t video_types[] = { - /* BUF_VIDEO_MSMPEG4_V3 && this->can_handle_311 , */ - /* BUF_VIDEO_MSMPEG4_V2, */ - BUF_VIDEO_MPEG4, BUF_VIDEO_DIVX5, - 0 - }; - -static decoder_info_t dec_info_video = { - video_types, /* supported types */ - 4 /* priority */ -}; - -plugin_info_t xine_plugin_info[] = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_VIDEO_DECODER, 10, "divx4", XINE_VERSION_CODE, &dec_info_video, init_video_decoder_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; diff --git a/src/libmpg123/.cvsignore b/src/libmpg123/.cvsignore deleted file mode 100644 index 7d926a554..000000000 --- a/src/libmpg123/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/src/libmpg123/Makefile.am b/src/libmpg123/Makefile.am deleted file mode 100644 index 4c4392ecc..000000000 --- a/src/libmpg123/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -libdir = $(XINE_PLUGINDIR) - -lib_LTLIBRARIES = xineplug_decode_mpg123.la - -xineplug_decode_mpg123_la_SOURCES = \ - common.c \ - dct64_i386.c \ - decode_i386.c \ - interface.c \ - layer1.c \ - layer2.c \ - layer3.c \ - tabinit.c \ - xine_decoder.c - -xineplug_decode_mpg123_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@ - -noinst_HEADERS = huffman.h mpg123.h mpglib.h l2tables.h diff --git a/src/libmpg123/README b/src/libmpg123/README deleted file mode 100644 index 3c5f33749..000000000 --- a/src/libmpg123/README +++ /dev/null @@ -1,39 +0,0 @@ -MP3 library ------------ -Version 0.2 - -This decoder is a 'light' version (thrown out all unnecessay parts) -from the mpg123 package. I made this for a company. - -Currently only Layer3 is enabled to save some space. Layer1,2 isn't -tested at all. The interface will not change significantly. -A backport to the mpg123 package is planed. - -comiled and tested only on Solaris 2.6 -main.c contains a simple demo application for library. - -COPYING: you may use this source under GPL terms! - -PLEASE NOTE: This software may contain patented alogrithm (at least - patented in some countries). It may be not allowed to sell/use products - based on this source code in these countries. Check this out first! - -COPYRIGHT of MP3 music: - Please note, that the duplicating of copyrighted music without explicit - permission violates the rights of the owner. - -SENDING PATCHES: - Maybe I change the copyright policy (ie some kind of more free BSD licencse). - Please consider this when sending patches/changes. - I also want to have the freedom to sell the code to companies that - can not use the code under GPL. So, if you send me significant patches, - I need your explicit permission to do this. Of course, there will also - be the GPLed open source version of the 100% same code. - For the case you cannot accept this: the code is GPL, it's your freedom - to distribute your changes again under GPL. - -FEEDBACK: - I'm interessted to here from you, when you use this package as part - of another project. - - diff --git a/src/libmpg123/TODO b/src/libmpg123/TODO deleted file mode 100644 index 403711010..000000000 --- a/src/libmpg123/TODO +++ /dev/null @@ -1,2 +0,0 @@ - -apply 'VBR' bugfix diff --git a/src/libmpg123/common.c b/src/libmpg123/common.c deleted file mode 100644 index e23508812..000000000 --- a/src/libmpg123/common.c +++ /dev/null @@ -1,183 +0,0 @@ -#include <ctype.h> -#include <stdlib.h> -#include <signal.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include "mpg123.h" - -struct parameter mpg123_param = { 1 , 1 , 0 , 0 }; - -int tabsel_123[2][3][16] = { - { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, - {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, - {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, - - { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, - {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, - {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } -}; - -long freqs[9] = { 44100, 48000, 32000, - 22050, 24000, 16000 , - 11025 , 12000 , 8000 }; - -int mpg123_bitindex; -unsigned char *mpg123_wordpointer; -unsigned char *pcm_sample; -int pcm_point = 0; - - -#define HDRCMPMASK 0xfffffd00 - -/* - * the code a header and write the information - * into the frame structure - */ -int decode_header(struct frame *fr,unsigned long newhead) -{ - if( newhead & (1<<20) ) { - fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1; - fr->mpeg25 = 0; - } - else { - fr->lsf = 1; - fr->mpeg25 = 1; - } - - fr->lay = 4-((newhead>>17)&3); - if( ((newhead>>10)&0x3) == 0x3) { - fprintf(stderr,"Stream error\n"); - abort(); - } - if(fr->mpeg25) { - fr->sampling_frequency = 6 + ((newhead>>10)&0x3); - } - else { - /*int dummy;*/ - fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); - /* - dummy = (newhead>>10)&0x3; - switch (dummy) { - case 0: - fr->sample_rate = 44100; - break; - case 1: - fr->sample_rate = 48000; - break; - case 2: - fr->sample_rate = 32000; - break; - case 3: - fprintf (stderr, "invalid sampling rate\n"); - fr->sample_rate = 44100; - break; - }*/ - fr->sample_rate = freqs[fr->sampling_frequency]; - } - - fr->error_protection = ((newhead>>16)&0x1)^0x1; - - if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */ - fr->bitrate_index = ((newhead>>12)&0xf); - - fr->bitrate_index = ((newhead>>12)&0xf); - fr->padding = ((newhead>>9)&0x1); - fr->extension = ((newhead>>8)&0x1); - fr->mode = ((newhead>>6)&0x3); - fr->mode_ext = ((newhead>>4)&0x3); - fr->copyright = ((newhead>>3)&0x1); - fr->original = ((newhead>>2)&0x1); - fr->emphasis = newhead & 0x3; - - fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; - - if(!fr->bitrate_index) - { - fprintf(stderr,"Free format not supported.\n"); - return (0); - } - - switch(fr->lay) - { - case 1: - fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; - fr->framesize /= freqs[fr->sampling_frequency]; - fr->framesize = ((fr->framesize+fr->padding)<<2)-4; - break; - case 2: - fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; - fr->framesize /= freqs[fr->sampling_frequency]; - fr->framesize += fr->padding - 4; - break; - case 3: - fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; - fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf); - fr->framesize = fr->framesize + fr->padding - 4; - break; - default: - fprintf(stderr,"Sorry, unknown layer type.\n"); - return (0); - } - return 1; -} - -unsigned int getbits(int number_of_bits) -{ - unsigned long rval; - - if(!number_of_bits) - return 0; - - { - rval = mpg123_wordpointer[0]; - rval <<= 8; - rval |= mpg123_wordpointer[1]; - rval <<= 8; - rval |= mpg123_wordpointer[2]; - rval <<= mpg123_bitindex; - rval &= 0xffffff; - - mpg123_bitindex += number_of_bits; - - rval >>= (24-number_of_bits); - - mpg123_wordpointer += (mpg123_bitindex>>3); - mpg123_bitindex &= 7; - } - return rval; -} - -unsigned int getbits_fast(int number_of_bits) -{ - unsigned long rval; - - { - rval = mpg123_wordpointer[0]; - rval <<= 8; - rval |= mpg123_wordpointer[1]; - rval <<= mpg123_bitindex; - rval &= 0xffff; - mpg123_bitindex += number_of_bits; - - rval >>= (16-number_of_bits); - - mpg123_wordpointer += (mpg123_bitindex>>3); - mpg123_bitindex &= 7; - } - return rval; -} - -unsigned int get1bit(void) -{ - unsigned char rval; - rval = *mpg123_wordpointer << mpg123_bitindex; - - mpg123_bitindex++; - mpg123_wordpointer += (mpg123_bitindex>>3); - mpg123_bitindex &= 7; - - return rval>>7; -} diff --git a/src/libmpg123/dct64_i386.c b/src/libmpg123/dct64_i386.c deleted file mode 100644 index b98b47400..000000000 --- a/src/libmpg123/dct64_i386.c +++ /dev/null @@ -1,315 +0,0 @@ - -/* - * Discrete Cosine Tansform (DCT) for subband synthesis - * optimized for machines with no auto-increment. - * The performance is highly compiler dependend. Maybe - * the dct64.c version for 'normal' processor may be faster - * even for Intel processors. - */ - -#include "mpg123.h" - -static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples) -{ - - { - register real *costab = pnts[0]; - - b1[0x00] = samples[0x00] + samples[0x1F]; - b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; - - b1[0x01] = samples[0x01] + samples[0x1E]; - b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; - - b1[0x02] = samples[0x02] + samples[0x1D]; - b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; - - b1[0x03] = samples[0x03] + samples[0x1C]; - b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; - - b1[0x04] = samples[0x04] + samples[0x1B]; - b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; - - b1[0x05] = samples[0x05] + samples[0x1A]; - b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; - - b1[0x06] = samples[0x06] + samples[0x19]; - b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; - - b1[0x07] = samples[0x07] + samples[0x18]; - b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; - - b1[0x08] = samples[0x08] + samples[0x17]; - b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; - - b1[0x09] = samples[0x09] + samples[0x16]; - b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; - - b1[0x0A] = samples[0x0A] + samples[0x15]; - b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; - - b1[0x0B] = samples[0x0B] + samples[0x14]; - b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; - - b1[0x0C] = samples[0x0C] + samples[0x13]; - b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; - - b1[0x0D] = samples[0x0D] + samples[0x12]; - b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; - - b1[0x0E] = samples[0x0E] + samples[0x11]; - b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; - - b1[0x0F] = samples[0x0F] + samples[0x10]; - b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; - } - - - { - register real *costab = pnts[1]; - - b2[0x00] = b1[0x00] + b1[0x0F]; - b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; - b2[0x01] = b1[0x01] + b1[0x0E]; - b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; - b2[0x02] = b1[0x02] + b1[0x0D]; - b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; - b2[0x03] = b1[0x03] + b1[0x0C]; - b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; - b2[0x04] = b1[0x04] + b1[0x0B]; - b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; - b2[0x05] = b1[0x05] + b1[0x0A]; - b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; - b2[0x06] = b1[0x06] + b1[0x09]; - b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; - b2[0x07] = b1[0x07] + b1[0x08]; - b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; - - b2[0x10] = b1[0x10] + b1[0x1F]; - b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; - b2[0x11] = b1[0x11] + b1[0x1E]; - b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; - b2[0x12] = b1[0x12] + b1[0x1D]; - b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; - b2[0x13] = b1[0x13] + b1[0x1C]; - b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; - b2[0x14] = b1[0x14] + b1[0x1B]; - b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; - b2[0x15] = b1[0x15] + b1[0x1A]; - b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; - b2[0x16] = b1[0x16] + b1[0x19]; - b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; - b2[0x17] = b1[0x17] + b1[0x18]; - b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; - } - - { - register real *costab = pnts[2]; - - b1[0x00] = b2[0x00] + b2[0x07]; - b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; - b1[0x01] = b2[0x01] + b2[0x06]; - b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; - b1[0x02] = b2[0x02] + b2[0x05]; - b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; - b1[0x03] = b2[0x03] + b2[0x04]; - b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; - - b1[0x08] = b2[0x08] + b2[0x0F]; - b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; - b1[0x09] = b2[0x09] + b2[0x0E]; - b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; - b1[0x0A] = b2[0x0A] + b2[0x0D]; - b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; - b1[0x0B] = b2[0x0B] + b2[0x0C]; - b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; - - b1[0x10] = b2[0x10] + b2[0x17]; - b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; - b1[0x11] = b2[0x11] + b2[0x16]; - b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; - b1[0x12] = b2[0x12] + b2[0x15]; - b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; - b1[0x13] = b2[0x13] + b2[0x14]; - b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; - - b1[0x18] = b2[0x18] + b2[0x1F]; - b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; - b1[0x19] = b2[0x19] + b2[0x1E]; - b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; - b1[0x1A] = b2[0x1A] + b2[0x1D]; - b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; - b1[0x1B] = b2[0x1B] + b2[0x1C]; - b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; - } - - { - register real const cos0 = pnts[3][0]; - register real const cos1 = pnts[3][1]; - - b2[0x00] = b1[0x00] + b1[0x03]; - b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; - b2[0x01] = b1[0x01] + b1[0x02]; - b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; - - b2[0x04] = b1[0x04] + b1[0x07]; - b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; - b2[0x05] = b1[0x05] + b1[0x06]; - b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; - - b2[0x08] = b1[0x08] + b1[0x0B]; - b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; - b2[0x09] = b1[0x09] + b1[0x0A]; - b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; - - b2[0x0C] = b1[0x0C] + b1[0x0F]; - b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; - b2[0x0D] = b1[0x0D] + b1[0x0E]; - b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; - - b2[0x10] = b1[0x10] + b1[0x13]; - b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; - b2[0x11] = b1[0x11] + b1[0x12]; - b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; - - b2[0x14] = b1[0x14] + b1[0x17]; - b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; - b2[0x15] = b1[0x15] + b1[0x16]; - b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; - - b2[0x18] = b1[0x18] + b1[0x1B]; - b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; - b2[0x19] = b1[0x19] + b1[0x1A]; - b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; - - b2[0x1C] = b1[0x1C] + b1[0x1F]; - b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; - b2[0x1D] = b1[0x1D] + b1[0x1E]; - b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; - } - - { - register real const cos0 = pnts[4][0]; - - b1[0x00] = b2[0x00] + b2[0x01]; - b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; - b1[0x02] = b2[0x02] + b2[0x03]; - b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; - b1[0x02] += b1[0x03]; - - b1[0x04] = b2[0x04] + b2[0x05]; - b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; - b1[0x06] = b2[0x06] + b2[0x07]; - b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; - b1[0x06] += b1[0x07]; - b1[0x04] += b1[0x06]; - b1[0x06] += b1[0x05]; - b1[0x05] += b1[0x07]; - - b1[0x08] = b2[0x08] + b2[0x09]; - b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; - b1[0x0A] = b2[0x0A] + b2[0x0B]; - b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; - b1[0x0A] += b1[0x0B]; - - b1[0x0C] = b2[0x0C] + b2[0x0D]; - b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; - b1[0x0E] = b2[0x0E] + b2[0x0F]; - b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; - b1[0x0E] += b1[0x0F]; - b1[0x0C] += b1[0x0E]; - b1[0x0E] += b1[0x0D]; - b1[0x0D] += b1[0x0F]; - - b1[0x10] = b2[0x10] + b2[0x11]; - b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; - b1[0x12] = b2[0x12] + b2[0x13]; - b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; - b1[0x12] += b1[0x13]; - - b1[0x14] = b2[0x14] + b2[0x15]; - b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; - b1[0x16] = b2[0x16] + b2[0x17]; - b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; - b1[0x16] += b1[0x17]; - b1[0x14] += b1[0x16]; - b1[0x16] += b1[0x15]; - b1[0x15] += b1[0x17]; - - b1[0x18] = b2[0x18] + b2[0x19]; - b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; - b1[0x1A] = b2[0x1A] + b2[0x1B]; - b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; - b1[0x1A] += b1[0x1B]; - - b1[0x1C] = b2[0x1C] + b2[0x1D]; - b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; - b1[0x1E] = b2[0x1E] + b2[0x1F]; - b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; - b1[0x1E] += b1[0x1F]; - b1[0x1C] += b1[0x1E]; - b1[0x1E] += b1[0x1D]; - b1[0x1D] += b1[0x1F]; - } - - out0[0x10*16] = b1[0x00]; - out0[0x10*12] = b1[0x04]; - out0[0x10* 8] = b1[0x02]; - out0[0x10* 4] = b1[0x06]; - out0[0x10* 0] = b1[0x01]; - out1[0x10* 0] = b1[0x01]; - out1[0x10* 4] = b1[0x05]; - out1[0x10* 8] = b1[0x03]; - out1[0x10*12] = b1[0x07]; - - b1[0x08] += b1[0x0C]; - out0[0x10*14] = b1[0x08]; - b1[0x0C] += b1[0x0a]; - out0[0x10*10] = b1[0x0C]; - b1[0x0A] += b1[0x0E]; - out0[0x10* 6] = b1[0x0A]; - b1[0x0E] += b1[0x09]; - out0[0x10* 2] = b1[0x0E]; - b1[0x09] += b1[0x0D]; - out1[0x10* 2] = b1[0x09]; - b1[0x0D] += b1[0x0B]; - out1[0x10* 6] = b1[0x0D]; - b1[0x0B] += b1[0x0F]; - out1[0x10*10] = b1[0x0B]; - out1[0x10*14] = b1[0x0F]; - - b1[0x18] += b1[0x1C]; - out0[0x10*15] = b1[0x10] + b1[0x18]; - out0[0x10*13] = b1[0x18] + b1[0x14]; - b1[0x1C] += b1[0x1a]; - out0[0x10*11] = b1[0x14] + b1[0x1C]; - out0[0x10* 9] = b1[0x1C] + b1[0x12]; - b1[0x1A] += b1[0x1E]; - out0[0x10* 7] = b1[0x12] + b1[0x1A]; - out0[0x10* 5] = b1[0x1A] + b1[0x16]; - b1[0x1E] += b1[0x19]; - out0[0x10* 3] = b1[0x16] + b1[0x1E]; - out0[0x10* 1] = b1[0x1E] + b1[0x11]; - b1[0x19] += b1[0x1D]; - out1[0x10* 1] = b1[0x11] + b1[0x19]; - out1[0x10* 3] = b1[0x19] + b1[0x15]; - b1[0x1D] += b1[0x1B]; - out1[0x10* 5] = b1[0x15] + b1[0x1D]; - out1[0x10* 7] = b1[0x1D] + b1[0x13]; - b1[0x1B] += b1[0x1F]; - out1[0x10* 9] = b1[0x13] + b1[0x1B]; - out1[0x10*11] = b1[0x1B] + b1[0x17]; - out1[0x10*13] = b1[0x17] + b1[0x1F]; - out1[0x10*15] = b1[0x1F]; -} - -/* - * the call via dct64 is a trick to force GCC to use - * (new) registers for the b1,b2 pointer to the bufs[xx] field - */ -void dct64(real *a,real *b,real *c) -{ - real bufs[0x40]; - dct64_1(a,b,bufs,bufs+0x20,c); -} - diff --git a/src/libmpg123/decode_i386.c b/src/libmpg123/decode_i386.c deleted file mode 100644 index dc73c33cc..000000000 --- a/src/libmpg123/decode_i386.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Mpeg Layer-1,2,3 audio decoder - * ------------------------------ - * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. - * See also 'README' - * - * slighlty optimized for machines without autoincrement/decrement. - * The performance is highly compiler dependend. Maybe - * the decode.c version for 'normal' processor may be faster - * even for Intel processors. - */ - -#include <stdlib.h> -#include <math.h> -#include <string.h> - -#include "mpg123.h" -#include "mpglib.h" - - /* old WRITE_SAMPLE */ -#define WRITE_SAMPLE(samples,sum,clip) \ - if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ - else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; /* printf ("too small : %f\n",sum);*/} \ - else { *(samples) = sum; } - -int synth_1to1_mono(mpgaudio_t *mp, real *bandPtr,unsigned char *samples,int *pnt) -{ - short samples_tmp[64]; - short *tmp1 = samples_tmp; - int i,ret; - int pnt1 = 0; - - ret = synth_1to1(mp, bandPtr,0,(unsigned char *) samples_tmp,&pnt1); - samples += *pnt; - - for(i=0;i<32;i++) { - *( (short *) samples) = *tmp1; - samples += 2; - tmp1 += 2; - } - *pnt += 64; - - return ret; -} - - -int synth_1to1(mpgaudio_t *mp, real *bandPtr,int channel,unsigned char *out,int *pnt) -{ - static const int step = 2; - int bo; - short *samples = (short *) (out + *pnt); - - real *b0,(*buf)[0x110]; - int clip = 0; - int bo1; - - bo = mp->synth_bo; - - if(!channel) { - bo--; - bo &= 0xf; - buf = mp->synth_buffs[0]; - } - else { - samples++; - buf = mp->synth_buffs[1]; - } - - if(bo & 0x1) { - b0 = buf[0]; - bo1 = bo; - dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); - } - else { - b0 = buf[1]; - bo1 = bo+1; - dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); - } - - mp->synth_bo = bo; - - { - register int j; - real *window = decwin + 16 - bo1; - - for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step) - { - real sum; - sum = window[0x0] * b0[0x0]; - sum -= window[0x1] * b0[0x1]; - sum += window[0x2] * b0[0x2]; - sum -= window[0x3] * b0[0x3]; - sum += window[0x4] * b0[0x4]; - sum -= window[0x5] * b0[0x5]; - sum += window[0x6] * b0[0x6]; - sum -= window[0x7] * b0[0x7]; - sum += window[0x8] * b0[0x8]; - sum -= window[0x9] * b0[0x9]; - sum += window[0xA] * b0[0xA]; - sum -= window[0xB] * b0[0xB]; - sum += window[0xC] * b0[0xC]; - sum -= window[0xD] * b0[0xD]; - sum += window[0xE] * b0[0xE]; - sum -= window[0xF] * b0[0xF]; - - WRITE_SAMPLE(samples,sum,clip); - } - - { - real sum; - sum = window[0x0] * b0[0x0]; - sum += window[0x2] * b0[0x2]; - sum += window[0x4] * b0[0x4]; - sum += window[0x6] * b0[0x6]; - sum += window[0x8] * b0[0x8]; - sum += window[0xA] * b0[0xA]; - sum += window[0xC] * b0[0xC]; - sum += window[0xE] * b0[0xE]; - WRITE_SAMPLE(samples,sum,clip); - b0-=0x10,window-=0x20,samples+=step; - } - window += bo1<<1; - - for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step) - { - real sum; - sum = -window[-0x1] * b0[0x0]; - sum -= window[-0x2] * b0[0x1]; - sum -= window[-0x3] * b0[0x2]; - sum -= window[-0x4] * b0[0x3]; - sum -= window[-0x5] * b0[0x4]; - sum -= window[-0x6] * b0[0x5]; - sum -= window[-0x7] * b0[0x6]; - sum -= window[-0x8] * b0[0x7]; - sum -= window[-0x9] * b0[0x8]; - sum -= window[-0xA] * b0[0x9]; - sum -= window[-0xB] * b0[0xA]; - sum -= window[-0xC] * b0[0xB]; - sum -= window[-0xD] * b0[0xC]; - sum -= window[-0xE] * b0[0xD]; - sum -= window[-0xF] * b0[0xE]; - sum -= window[-0x0] * b0[0xF]; - - WRITE_SAMPLE(samples,sum,clip); - } - } - *pnt += 128; - - return clip; -} - diff --git a/src/libmpg123/huffman.h b/src/libmpg123/huffman.h deleted file mode 100644 index 7fec0d589..000000000 --- a/src/libmpg123/huffman.h +++ /dev/null @@ -1,332 +0,0 @@ -/* - * huffman tables ... recalcualted to work with my optimzed - * decoder scheme (MH) - * - * probably we could save a few bytes of memory, because the - * smaller tables are often the part of a bigger table - */ - -struct newhuff -{ - unsigned int linbits; - short *table; -}; - -static short tab0[] = -{ - 0 -}; - -static short tab1[] = -{ - -5, -3, -1, 17, 1, 16, 0 -}; - -static short tab2[] = -{ - -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1, - 16, 0 -}; - -static short tab3[] = -{ - -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1, - 1, 0 -}; - -static short tab5[] = -{ - -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19, - 3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16, - 0 -}; - -static short tab6[] = -{ - -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19, - 49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16, - 0 -}; - -static short tab7[] = -{ - -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83, - -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1, - 80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7, - -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18, - -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0 -}; - -static short tab8[] = -{ - -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83, - -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52, - 67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4, - 64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1, - 2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0 -}; - -static short tab9[] = -{ - -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1, - 84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67, - -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5, - -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2, - 18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0 -}; - -static short tab10[] = -{ --125,-121,-111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1, 118, - 87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3, - -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1, - 100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23, - -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81, - -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7, - -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1, - 50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1, - 2, 32, 17, -1, 1, 16, 0 -}; - -static short tab11[] = -{ --121,-113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118, 117, - -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55, - -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114, - -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96, - -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38, - 6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1, - 36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50, - -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2, - 32, 17, -3, -1, 1, 16, 0 -}; - -static short tab12[] = -{ --115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87, - 117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115, - 85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7, - 112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5, - -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37, - 82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4, - 36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3, - -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1, - 2, 32, 0, 17, -1, 1, 16 -}; - -static short tab13[] = -{ --509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13, -9, - -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238, - 207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1, - 236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249, - 234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158, - -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1, - 203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245, - 231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1, - 63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15, - -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1, - 200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1, - 240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1, - 46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3, - -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1, - 198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5, - -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167, - 151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76, - 196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137, - 28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106, - -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43, - -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178, - -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1, - 58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161, - -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88, - -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1, - 131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25, - 145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100, - 40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113, - -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38, - -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6, - 96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81, - -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11, - -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3, - -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, - 0 -}; - -static short tab15[] = -{ --495,-445,-355,-263,-183,-115, -77, -43, -27, -13, -7, -3, -1, 255, 239, - -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237, - 191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3, - -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219, - -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173, - -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246, - -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9, - -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243, - 216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1, - 31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1, - 125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3, - -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5, - -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124, - 199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1, - 198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183, - -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76, - -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1, - 122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15, - -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106, - -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5, - -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74, - -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1, - 42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134, - 73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29, - -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7, - -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7, - -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86, - -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100, - 23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69, - -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9, - -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1, - 5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20, - 4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48, - 34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16, - 0 -}; - -static short tab16[] = -{ --509,-503,-461,-323,-103, -37, -27, -15, -7, -3, -1, 239, 254, -1, 223, - 253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3, - -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5, - -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19, - -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1, - 238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5, - -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125, - 94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13, - -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3, - -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186, - -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1, - 214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169, - -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213, - -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154, - 108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1, - 153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1, - 192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45, - -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107, - -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12, - -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1, - 178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74, - 164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33, - -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3, - -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147, - -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1, - 145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3, - -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1, - 8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3, - -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1, - 99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9, - -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33, - -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, - -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1, - 3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16, - 0 -}; - -static short tab24[] = -{ --451,-117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1, - 207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9, - -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79, - 244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31, - 240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1, - 236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3, - -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3, - -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255,-235, --143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3, - -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9, - -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1, - 78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185, - 170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199, - 77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3, - -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3, - -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196, - -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1, - 167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1, - 137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10, - 26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9, - 144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165, - 27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135, - -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104, - -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3, - -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3, - -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7, - -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86, - 101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15, - -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84, - -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1, - 83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5, - 80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5, - -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1, - 3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16, - 0 -}; - -static short tab_c0[] = -{ - -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5, - 9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8, - 0 -}; - -static short tab_c1[] = -{ - -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9, - 8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1, - 0 -}; - - - -static struct newhuff ht[] = -{ - { /* 0 */ 0 , tab0 } , - { /* 2 */ 0 , tab1 } , - { /* 3 */ 0 , tab2 } , - { /* 3 */ 0 , tab3 } , - { /* 0 */ 0 , tab0 } , - { /* 4 */ 0 , tab5 } , - { /* 4 */ 0 , tab6 } , - { /* 6 */ 0 , tab7 } , - { /* 6 */ 0 , tab8 } , - { /* 6 */ 0 , tab9 } , - { /* 8 */ 0 , tab10 } , - { /* 8 */ 0 , tab11 } , - { /* 8 */ 0 , tab12 } , - { /* 16 */ 0 , tab13 } , - { /* 0 */ 0 , tab0 } , - { /* 16 */ 0 , tab15 } , - - { /* 16 */ 1 , tab16 } , - { /* 16 */ 2 , tab16 } , - { /* 16 */ 3 , tab16 } , - { /* 16 */ 4 , tab16 } , - { /* 16 */ 6 , tab16 } , - { /* 16 */ 8 , tab16 } , - { /* 16 */ 10, tab16 } , - { /* 16 */ 13, tab16 } , - { /* 16 */ 4 , tab24 } , - { /* 16 */ 5 , tab24 } , - { /* 16 */ 6 , tab24 } , - { /* 16 */ 7 , tab24 } , - { /* 16 */ 8 , tab24 } , - { /* 16 */ 9 , tab24 } , - { /* 16 */ 11, tab24 } , - { /* 16 */ 13, tab24 } -}; - -static struct newhuff htc[] = -{ - { /* 1 , 1 , */ 0 , tab_c0 } , - { /* 1 , 1 , */ 0 , tab_c1 } -}; - - diff --git a/src/libmpg123/interface.c b/src/libmpg123/interface.c deleted file mode 100644 index fccc19abe..000000000 --- a/src/libmpg123/interface.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2000 the xine project - * - * This file is part of xine, a unix video player. - * The code is heavily based on libmpeg from mpg123 - * - * xine 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. - * - * xine 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 - * - * $Id: interface.c,v 1.6 2002/03/31 20:38:41 jcdutton Exp $ - */ - -#include <stdlib.h> -#include <stdio.h> - -#include "mpg123.h" -#include "mpglib.h" - -void mpg_audio_reset (mpgaudio_t *mp) { - - mp->framesize = 0; - mp->framesize_old = -1; - mp->bsize = 0; - mp->fr.single = -1; - mp->bsnum = 0; - mp->synth_bo = 1; - mp->is_output_initialized = 0; - mp->sample_rate_device = 0; - mp->header = 0; -} - -mpgaudio_t *mpg_audio_init (ao_instance_t *ao_output) -{ - mpgaudio_t *mp; - - mp = malloc (sizeof(struct mpstr)); - memset(mp, 0, sizeof(struct mpstr)); - - make_decode_tables(32767); - init_layer2(); - init_layer3(SBLIMIT); - - mp->ao_output = ao_output; - - mpg_audio_reset (mp); - - return mp; -} - -void mpg_audio_close (mpgaudio_t *mpg) { - - free (mpg); - -} - -int head_check(struct mpstr *mp) -{ - if( (mp->header & 0xffe00000) != 0xffe00000) - return 0; - if(!((mp->header>>17)&3)) - return 0; - if( ((mp->header>>12)&0xf) == 0xf) - return 0; - if( ((mp->header>>10)&0x3) == 0x3 ) - return 0; - return 1; -} - -void mpg_audio_decode_data (mpgaudio_t *mp, uint8_t *data, uint8_t *data_end, - int64_t pts) -{ - - while (1) { - /* sync */ - if(mp->framesize == 0) { - - /* printf ("mpg123: looking for header\n"); */ - - while (!head_check (mp)) { - - if (data == data_end) - return; - - mp->header = (mp->header << 8) | *data; - data++; - } - - /* decode header */ - - decode_header(&mp->fr,mp->header); - - mp->framesize = mp->fr.framesize; - mp->bsize = 0; - mpg123_wordpointer = mp->bsspace[mp->bsnum] + 512; - mp->bsnum = (mp->bsnum + 1) & 0x1; - mpg123_bitindex = 0; - mp->pts = pts; - pts = 0; - } - - /* copy data to bsspace */ - while (mp->bsize<mp->framesize) { - - if (data == data_end) - return; - - *(mpg123_wordpointer + mp->bsize) = *data; - data++; - mp->bsize++; - } - - if(mp->fr.error_protection) - getbits(16); - - switch(mp->fr.lay) { - case 1: - do_layer1(mp); - break; - case 2: - do_layer2(mp); - break; - case 3: - do_layer3(mp); - break; - } - - mp->framesize_old = mp->framesize; - mp->framesize = 0; - mp->header = 0; - } -} - -int set_pointer(mpgaudio_t *mp, long backstep) -{ - unsigned char *bsbufold; - if(mp->framesize_old < 0 && backstep > 0) { - fprintf(stderr,"Can't step back %ld!\n",backstep); - return 0; - } - bsbufold = mp->bsspace[mp->bsnum] + 512; - mpg123_wordpointer -= backstep; - if (backstep) - memcpy(mpg123_wordpointer,bsbufold+mp->framesize_old-backstep,backstep); - mpg123_bitindex = 0; - return 1; -} diff --git a/src/libmpg123/l2tables.h b/src/libmpg123/l2tables.h deleted file mode 100644 index 06d21353b..000000000 --- a/src/libmpg123/l2tables.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * 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 -{ - short bits; - short d; -}; - -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 deleted file mode 100644 index 50a333a0e..000000000 --- a/src/libmpg123/layer1.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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" - -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++ = getbits(4); - *ba++ = getbits(4); - } - for (i=jsbound;i<SBLIMIT;i++) - *ba++ = getbits(4); - - ba = balloc; - - for (i=0;i<jsbound;i++) { - if ((*ba++)) - *sca++ = getbits(6); - if ((*ba++)) - *sca++ = getbits(6); - } - for (i=jsbound;i<SBLIMIT;i++) - if ((*ba++)) { - *sca++ = getbits(6); - *sca++ = getbits(6); - } - } - else { - int i; - for (i=0;i<SBLIMIT;i++) - *ba++ = getbits(4); - ba = balloc; - for (i=0;i<SBLIMIT;i++) - if ((*ba++)) - *sca++ = 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++ = getbits(n+1); - if ((n = *ba++)) - *sample++ = getbits(n+1); - } - for (i=jsbound;i<SBLIMIT;i++) - if ((n = *ba++)) - *sample++ = getbits(n+1); - - ba = balloc; - for (sample=smpb,i=0;i<jsbound;i++) { - if((n=*ba++)) - *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++]; - else - *f0++ = 0.0; - if((n=*ba++)) - *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * 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 * muls[n+1][*sca++]; - *f1++ = samp * muls[n+1][*sca++]; - } - else - *f0++ = *f1++ = 0.0; - } - } - else { - register real *f0 = fraction[0]; - ba = balloc; - for (sample=smpb,i=0;i<SBLIMIT;i++) - if ((n = *ba++)) - *sample++ = getbits(n+1); - ba = balloc; - for (sample=smpb,i=0;i<SBLIMIT;i++) { - if((n=*ba++)) - *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++]; - else - *f0++ = 0.0; - } - } -} - -void do_layer1(mpgaudio_t *mp) -{ - int clip=0; - struct frame *fr = &mp->fr; - int i,stereo = fr->stereo; - static unsigned int balloc[2*SBLIMIT]; - static unsigned int scale_index[2][SBLIMIT]; - static real fraction[2][SBLIMIT]; - int single = fr->single; - int num_bytes; - - 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); - - num_bytes=0; - for (i=0;i<SCALE_BLOCK;i++) - { - I_step_two(fraction,balloc,scale_index,fr); - - if(single >= 0) { - clip += synth_1to1_mono(mp, (real*)fraction[single],mp->osspace,&num_bytes); - } - else { - int p1 = num_bytes; - clip += synth_1to1(mp, (real*)fraction[0],0,mp->osspace,&p1); - clip += synth_1to1(mp, (real*)fraction[1],1,mp->osspace,&num_bytes); - } - } - - if ((!mp->is_output_initialized) || (mp->sample_rate_device != fr->sample_rate)) { - - if (mp->is_output_initialized) - mp->ao_output->close(mp->ao_output); - - mp->ao_output->open (mp->ao_output, 16, fr->sample_rate, - stereo-1 ? AO_CAP_MODE_STEREO: AO_CAP_MODE_MONO); - mp->is_output_initialized = 1; - mp->sample_rate_device = fr->sample_rate; - - printf ("layer1\n"); - } - - mp->ao_output->write (mp->ao_output, (int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), - mp->pts); - mp->pts = 0; - -} - - diff --git a/src/libmpg123/layer2.c b/src/libmpg123/layer2.c deleted file mode 100644 index b5a3c27b6..000000000 --- a/src/libmpg123/layer2.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Mpeg Layer-2 audio decoder - * -------------------------- - * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README' - * - */ - -#include "mpg123.h" -#include "l2tables.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 muls[27][64]; /* also used by layer 1 */ - -void 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 = 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;i--,alloc1+=(1<<step)) - { - *bita++ = (char) getbits(step=alloc1->bits); - *bita++ = (char) getbits(step); - } - for (i=sblimit-jsbound;i;i--,alloc1+=(1<<step)) - { - bita[0] = (char) 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) getbits_fast(2); - } - else /* mono */ - { - for (i=sblimit;i;i--,alloc1+=(1<<step)) - *bita++ = (char) getbits(step=alloc1->bits); - bita = bit_alloc; - scfsi=scfsi_buf; - for (i=sblimit;i;i--) - if (*bita++) - *scfsi++ = (char) getbits_fast(2); - } - - bita = bit_alloc; - scfsi=scfsi_buf; - for (i=sblimit2;i;i--) - if (*bita++) - switch (*scfsi++) - { - case 0: - *scale++ = getbits_fast(6); - *scale++ = getbits_fast(6); - *scale++ = getbits_fast(6); - break; - case 1 : - *scale++ = sc = getbits_fast(6); - *scale++ = sc; - *scale++ = getbits_fast(6); - break; - case 2: - *scale++ = sc = getbits_fast(6); - *scale++ = sc; - *scale++ = sc; - break; - default: /* case 3 */ - *scale++ = getbits_fast(6); - *scale++ = sc = 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=muls[k][scale[x1]]; - fraction[j][0][i] = ((real) ((int)getbits(k) + d1)) * cm; - fraction[j][1][i] = ((real) ((int)getbits(k) + d1)) * cm; - fraction[j][2][i] = ((real) ((int)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) getbits(k); - tab = (unsigned int *) (table[d1] + idx + idx + idx); - fraction[j][0][i] = muls[*tab++][m]; - fraction[j][1][i] = muls[*tab++][m]; - fraction[j][2][i] = 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=muls[k][scale[x1+3]]; - fraction[1][0][i] = (fraction[0][0][i] = (real) ((int)getbits(k) + d1) ) * cm; - fraction[1][1][i] = (fraction[0][1][i] = (real) ((int)getbits(k) + d1) ) * cm; - fraction[1][2][i] = (fraction[0][2][i] = (real) ((int)getbits(k) + d1) ) * cm; - cm=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) getbits(k); - tab = (unsigned int *) (table[d1] + idx + idx + idx); - fraction[0][0][i] = muls[*tab][m1]; fraction[1][0][i] = muls[*tab++][m2]; - fraction[0][1][i] = muls[*tab][m1]; fraction[1][1][i] = muls[*tab++][m2]; - fraction[0][2][i] = muls[*tab][m1]; fraction[1][2][i] = 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 !! -*/ - } - - 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; -} - -void do_layer2(mpgaudio_t *mp) -{ - int clip=0; - int i,j; - struct frame *fr = &mp->fr; - int stereo = fr->stereo; - static real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */ - unsigned int bit_alloc[64]; - int scale[192]; - int single = fr->single; - int num_bytes; - - II_select_table(fr); - fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? - (fr->mode_ext<<2)+4 : fr->II_sblimit; - - if(stereo == 1 || single == 3) - single = 0; - - II_step_one(bit_alloc, scale, fr); - - num_bytes=0; - 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) { - clip += synth_1to1_mono(mp, fraction[0][j],mp->osspace,&num_bytes); - } - else { - int p1 = num_bytes; - clip += synth_1to1(mp, fraction[0][j],0,mp->osspace,&p1); - clip += synth_1to1(mp, fraction[1][j],1,mp->osspace,&num_bytes); - } - } - } - - if ((!mp->is_output_initialized) || (mp->sample_rate_device != fr->sample_rate)) { - - if (mp->is_output_initialized) - mp->ao_output->close(mp->ao_output); - - mp->ao_output->open (mp->ao_output, 16, fr->sample_rate, - stereo-1 ? AO_CAP_MODE_STEREO: AO_CAP_MODE_MONO); - mp->is_output_initialized = 1; - mp->sample_rate_device = fr->sample_rate; - } - - mp->ao_output->write (mp->ao_output, (int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), - mp->pts); - mp->pts = 0; - -} - - diff --git a/src/libmpg123/layer3.c b/src/libmpg123/layer3.c deleted file mode 100644 index 5ce3507dd..000000000 --- a/src/libmpg123/layer3.c +++ /dev/null @@ -1,1620 +0,0 @@ -/* - * Mpeg Layer-3 audio decoder - * -------------------------- - * copyright (c) 1995,1996,1997 by Michael Hipp. - * All rights reserved. See also 'README' - */ - -#include <stdlib.h> -#include "mpg123.h" -#include "mpglib.h" -#include "huffman.h" - -#define MPEG1 - - -static real ispow[8207]; -static real aa_ca[8],aa_cs[8]; -static real COS1[12][6]; -static real win[4][36]; -static real win1[4][36]; -static real gainpow2[256+118+4]; -static real COS9[9]; -static real COS6_1,COS6_2; -static real tfcos36[9]; -static real tfcos12[3]; - -struct bandInfoStruct { - short longIdx[23]; - short longDiff[22]; - short shortIdx[14]; - short shortDiff[13]; -}; - -int longLimit[9][23]; -int shortLimit[9][14]; - -struct bandInfoStruct bandInfo[9] = { - -/* MPEG 1.0 */ - { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, - {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, - {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, - {4,4,4,4,6,8,10,12,14,18,22,30,56} } , - - { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, - {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, - {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, - {4,4,4,4,6,6,10,12,14,16,20,26,66} } , - - { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , - {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , - {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , - {4,4,4,4,6,8,12,16,20,26,34,42,12} } , - -/* MPEG 2.0 */ - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , - {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , - {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , - - { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, - {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } , - {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , - {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , - - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, - {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, - {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , -/* MPEG 2.5 */ - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, - {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, - {4,4,4,6,8,10,12,14,18,24,30,40,18} }, - { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} , - {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54}, - {0,12,24,36,54,78,108,144,186,240,312,402,522,576}, - {4,4,4,6,8,10,12,14,18,24,30,40,18} }, - { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}, - {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2}, - {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576}, - {8,8,8,12,16,20,24,28,36,2,2,2,26} } , -}; - -static int mapbuf0[9][152]; -static int mapbuf1[9][156]; -static int mapbuf2[9][44]; -static int *map[9][3]; -static int *mapend[9][3]; - -static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ -static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ - -static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16]; -static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16]; - -/* - * init tables for layer-3 - */ -void 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); - - 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; - short *bdf; - - mp = map[j][0] = mapbuf0[j]; - bdf = bi->longDiff; - for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) { - *mp++ = (*bdf) >> 1; - *mp++ = i; - *mp++ = 3; - *mp++ = cb; - } - bdf = bi->shortDiff+3; - for(cb=3;cb<13;cb++) { - int l = (*bdf++) >> 1; - for(lwin=0;lwin<3;lwin++) { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6*l; - } - mapend[j][0] = mp; - - mp = map[j][1] = mapbuf1[j]; - bdf = bi->shortDiff+0; - for(i=0,cb=0;cb<13;cb++) { - int l = (*bdf++) >> 1; - for(lwin=0;lwin<3;lwin++) { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6*l; - } - mapend[j][1] = mp; - - mp = map[j][2] = mapbuf2[j]; - bdf = bi->longDiff; - for(cb = 0; cb < 22 ; cb++) { - *mp++ = (*bdf++) >> 1; - *mp++ = cb; - } - mapend[j][2] = mp; - - } - - for(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 - */ -#ifdef MPEG1 -static int III_get_side_info_1(struct III_sideinfo *si,int stereo, - int ms_stereo,long sfreq,int single) -{ - int ch, gr; - int powdiff = (single == 3) ? 4 : 0; - - si->main_data_begin = getbits(9); - if (stereo == 1) - si->private_bits = getbits_fast(5); - else - si->private_bits = getbits_fast(3); - - for (ch=0; ch<stereo; ch++) { - si->ch[ch].gr[0].scfsi = -1; - si->ch[ch].gr[1].scfsi = getbits_fast(4); - } - - for (gr=0; gr<2; gr++) - { - for (ch=0; ch<stereo; ch++) - { - register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]); - - gr_info->part2_3_length = getbits(12); - gr_info->big_values = getbits_fast(9); - if(gr_info->big_values > 288) { - fprintf(stderr,"big_values too large!\n"); - return 0; - gr_info->big_values = 288; - } - gr_info->pow2gain = gainpow2+256 - getbits_fast(8) + powdiff; - if(ms_stereo) - gr_info->pow2gain += 2; - gr_info->scalefac_compress = getbits_fast(4); -/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ - if(get1bit()) - { - int i; - gr_info->block_type = getbits_fast(2); - gr_info->mixed_block_flag = get1bit(); - gr_info->table_select[0] = getbits_fast(5); - gr_info->table_select[1] = 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 + (getbits_fast(3)<<3); - - if(gr_info->block_type == 0) { - fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n"); - return 0; - } - /* region_count/start parameters are implicit in this case. */ - gr_info->region1start = 36>>1; - gr_info->region2start = 576>>1; - } - else - { - int i,r0c,r1c; - for (i=0; i<3; i++) - gr_info->table_select[i] = getbits_fast(5); - r0c = getbits_fast(4); - r1c = getbits_fast(3); - gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; - gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; - gr_info->block_type = 0; - gr_info->mixed_block_flag = 0; - } - gr_info->preflag = get1bit(); - gr_info->scalefac_scale = get1bit(); - gr_info->count1table_select = get1bit(); - } - } - return 1; -} -#endif - -/* - * Side Info for MPEG 2.0 / LSF - */ -static int III_get_side_info_2(struct III_sideinfo *si,int stereo, - int ms_stereo,long sfreq,int single) -{ - int ch; - int powdiff = (single == 3) ? 4 : 0; - - si->main_data_begin = getbits(8); - if (stereo == 1) - si->private_bits = get1bit(); - else - si->private_bits = getbits_fast(2); - - for (ch=0; ch<stereo; ch++) - { - register struct gr_info_s *gr_info = &(si->ch[ch].gr[0]); - - gr_info->part2_3_length = getbits(12); - gr_info->big_values = getbits_fast(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 - getbits_fast(8) + powdiff; - if(ms_stereo) - gr_info->pow2gain += 2; - gr_info->scalefac_compress = getbits(9); -/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */ - if(get1bit()) - { - int i; - gr_info->block_type = getbits_fast(2); - gr_info->mixed_block_flag = get1bit(); - gr_info->table_select[0] = getbits_fast(5); - gr_info->table_select[1] = 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 + (getbits_fast(3)<<3); - - if(gr_info->block_type == 0) { - fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n"); - return 0; - } - /* region_count/start parameters are implicit in this case. */ -/* check this again! */ - if(gr_info->block_type == 2) - gr_info->region1start = 36>>1; - else if(sfreq == 8) -/* check this for 2.5 and sfreq=8 */ - gr_info->region1start = 108>>1; - else - gr_info->region1start = 54>>1; - gr_info->region2start = 576>>1; - } - else - { - int i,r0c,r1c; - for (i=0; i<3; i++) - gr_info->table_select[i] = getbits_fast(5); - r0c = getbits_fast(4); - r1c = getbits_fast(3); - gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; - gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; - gr_info->block_type = 0; - gr_info->mixed_block_flag = 0; - } - gr_info->scalefac_scale = get1bit(); - gr_info->count1table_select = get1bit(); - } - return 1; -} - -/* - * read scalefactors - */ -#ifdef MPEG1 -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++ = getbits_fast(num0); - i = 9; - numbits -= num0; /* num0 * 17 + num1 * 18 */ - } - - for (;i;i--) - *scf++ = getbits_fast(num0); - for (i = 18; i; i--) - *scf++ = 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++ = getbits_fast(num0); - for(i=10;i;i--) - *scf++ = getbits_fast(num1); - numbits = (num0 + num1) * 10 + num0; - *scf++ = 0; - } - else { - numbits = 0; - if(!(scfsi & 0x8)) { - for (i=0;i<6;i++) - *scf++ = getbits_fast(num0); - numbits += num0 * 6; - } - else { - scf += 6; - } - - if(!(scfsi & 0x4)) { - for (i=0;i<5;i++) - *scf++ = getbits_fast(num0); - numbits += num0 * 5; - } - else { - scf += 5; - } - - if(!(scfsi & 0x2)) { - for(i=0;i<5;i++) - *scf++ = getbits_fast(num1); - numbits += num1 * 5; - } - else { - scf += 5; - } - - if(!(scfsi & 0x1)) { - for (i=0;i<5;i++) - *scf++ = getbits_fast(num1); - numbits += num1 * 5; - } - else { - scf += 5; - } - *scf++ = 0; /* no l[21] in original sources */ - } - } - return numbits; -} -#endif - - -static int III_get_scale_factors_2(int *scf,struct gr_info_s *gr_info,int i_stereo) -{ - unsigned char *pnt; - int i,j; - unsigned int slen; - int n = 0; - int numbits = 0; - - static unsigned char stab[3][6][4] = { - { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} , - { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } , - { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} , - {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } , - { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} , - { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} } }; - - if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */ - slen = i_slen2[gr_info->scalefac_compress>>1]; - else - slen = n_slen2[gr_info->scalefac_compress]; - - gr_info->preflag = (slen>>15) & 0x1; - - n = 0; - if( gr_info->block_type == 2 ) { - n++; - if(gr_info->mixed_block_flag) - n++; - } - - pnt = stab[n][(slen>>12)&0x7]; - - for(i=0;i<4;i++) { - int num = slen & 0x7; - slen >>= 3; - if(num) { - for(j=0;j<(int)(pnt[i]);j++) - *scf++ = getbits_fast(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}; - -/* - * don't forget to apply the same changes to III_dequantize_sample_ms() !!! - */ -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 bv = gr_info->big_values; - int region1 = gr_info->region1start; - int region2 = gr_info->region2start; - - l3 = ((576>>1)-bv)>>1; -/* - * we may lose the 'odd' bit here !! - * check this later again - */ - if(bv <= region1) { - l[0] = bv; l[1] = 0; l[2] = 0; - } - else { - l[0] = region1; - if(bv <= region2) { - l[1] = bv - l[0]; l[2] = 0; - } - else { - l[1] = region2 - l[0]; l[2] = bv - region2; - } - } - } - - if(gr_info->block_type == 2) { - /* - * decoding with short or mixed mode BandIndex table - */ - int i,max[4]; - int step=0,lwin=0,cb=0; - register real v = 0.0; - register int *m,mc; - - if(gr_info->mixed_block_flag) { - max[3] = -1; - max[0] = max[1] = max[2] = 2; - m = map[sfreq][0]; - me = mapend[sfreq][0]; - } - else { - max[0] = max[1] = max[2] = max[3] = -1; - /* max[3] not really needed in this case */ - m = map[sfreq][1]; - me = mapend[sfreq][1]; - } - - mc = 0; - for(i=0;i<2;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - for(;lp;lp--,mc--) { - register int x,y; - if( (!mc) ) { - mc = *m++; - xrpnt = ((real *) xr) + (*m++); - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit()) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if(x == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - x += getbits(h->linbits); - if(get1bit()) - *xrpnt = -ispow[x] * v; - else - *xrpnt = ispow[x] * v; - } - else if(x) { - max[lwin] = cb; - if(get1bit()) - *xrpnt = -ispow[x] * v; - else - *xrpnt = ispow[x] * v; - part2remain--; - } - else - *xrpnt = 0.0; - xrpnt += step; - if(y == 15) { - max[lwin] = cb; - part2remain -= h->linbits+1; - y += getbits(h->linbits); - if(get1bit()) - *xrpnt = -ispow[y] * v; - else - *xrpnt = ispow[y] * v; - } - else if(y) { - max[lwin] = cb; - if(get1bit()) - *xrpnt = -ispow[y] * v; - else - *xrpnt = ispow[y] * v; - part2remain--; - } - else - *xrpnt = 0.0; - xrpnt += step; - } - } - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit()) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr) + (*m++); - lwin = *m++; - cb = *m++; - if(lwin == 3) { - v = gr_info->pow2gain[(*scf++) << shift]; - step = 1; - } - else { - v = gr_info->full_gain[lwin][(*scf++) << shift]; - step = 3; - } - } - mc--; - } - if( (a & (0x8>>i)) ) { - max[lwin] = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit()) - *xrpnt = -v; - else - *xrpnt = v; - } - else - *xrpnt = 0.0; - xrpnt += step; - } - } - - while( m < me ) { - if(!mc) { - mc = *m++; - xrpnt = ((real *) xr) + *m++; - if( (*m++) == 3) - step = 1; - else - step = 3; - m++; /* cb */ - } - mc--; - *xrpnt = 0.0; - xrpnt += step; - *xrpnt = 0.0; - xrpnt += step; -/* we could add a little opt. here: - * if we finished a band for window 3 or a long band - * further bands could copied in a simple loop without a - * special 'map' decoding - */ - } - - gr_info->maxband[0] = max[0]+1; - gr_info->maxband[1] = max[1]+1; - gr_info->maxband[2] = max[2]+1; - gr_info->maxbandl = max[3]+1; - - { - int rmax = max[0] > max[1] ? max[0] : max[1]; - rmax = (rmax > max[2] ? rmax : max[2]) + 1; - gr_info->maxb = rmax ? 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; - register int *m = map[sfreq][2]; - register real v = 0.0; - register int mc = 0; -#if 0 - me = mapend[sfreq][2]; -#endif - - /* - * long hash table values - */ - for(i=0;i<3;i++) { - int lp = l[i]; - struct newhuff *h = ht+gr_info->table_select[i]; - - for(;lp;lp--,mc--) { - int x,y; - - if(!mc) { - mc = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - cb = *m++; - } - { - register short *val = h->table; - while((y=*val++)<0) { - if (get1bit()) - val -= y; - part2remain--; - } - x = y >> 4; - y &= 0xf; - } - if (x == 15) { - max = cb; - part2remain -= h->linbits+1; - x += getbits(h->linbits); - if(get1bit()) - *xrpnt++ = -ispow[x] * v; - else - *xrpnt++ = ispow[x] * v; - } - else if(x) { - max = cb; - if(get1bit()) - *xrpnt++ = -ispow[x] * v; - else - *xrpnt++ = ispow[x] * v; - part2remain--; - } - else - *xrpnt++ = 0.0; - - if (y == 15) { - max = cb; - part2remain -= h->linbits+1; - y += getbits(h->linbits); - if(get1bit()) - *xrpnt++ = -ispow[y] * v; - else - *xrpnt++ = ispow[y] * v; - } - else if(y) { - max = cb; - if(get1bit()) - *xrpnt++ = -ispow[y] * v; - else - *xrpnt++ = ispow[y] * v; - part2remain--; - } - else - *xrpnt++ = 0.0; - } - } - - /* - * short (count1table) values - */ - for(;l3 && (part2remain > 0);l3--) { - struct newhuff *h = htc+gr_info->count1table_select; - register short *val = h->table,a; - - while((a=*val++)<0) { - part2remain--; - if(part2remain < 0) { - part2remain++; - a = 0; - break; - } - if (get1bit()) - val -= a; - } - - for(i=0;i<4;i++) { - if(!(i & 1)) { - if(!mc) { - mc = *m++; - cb = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - } - mc--; - } - if ( (a & (0x8>>i)) ) { - max = cb; - part2remain--; - if(part2remain < 0) { - part2remain++; - break; - } - if(get1bit()) - *xrpnt++ = -v; - else - *xrpnt++ = v; - } - else - *xrpnt++ = 0.0; - } - } - - /* - * zero part - */ - for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) { - *xrpnt++ = 0.0; - *xrpnt++ = 0.0; - } - - gr_info->maxbandl = max+1; - gr_info->maxb = longLimit[sfreq][gr_info->maxbandl]; - } - - while( part2remain > 16 ) { - getbits(16); /* Dismiss stuffing Bits */ - part2remain -= 16; - } - if(part2remain > 0) - 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]; - real *tab1,*tab2; - - if(lsf) { - int p = gr_info->scalefac_compress & 0x1; - if(ms_stereo) { - tab1 = pow1_2[p]; tab2 = pow2_2[p]; - } - else { - tab1 = pow1_1[p]; tab2 = pow2_1[p]; - } - } - else { - if(ms_stereo) { - tab1 = tan1_2; tab2 = tan2_2; - } - else { - tab1 = tan1_1; tab2 = tan2_1; - } - } - - if (gr_info->block_type == 2) - { - int lwin,do_l = 0; - if( gr_info->mixed_block_flag ) - do_l = 1; - - for (lwin=0;lwin<3;lwin++) /* process each window */ - { - /* get first band with zero values */ - int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */ - if(sfb > 3) - do_l = 0; - - for(;sfb<12;sfb++) - { - is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - sb = bi->shortDiff[sfb]; - idx = bi->shortIdx[sfb] + lwin; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for (; sb > 0; sb--,idx+=3) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } - -/* 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; - - if(is_p != 7) - { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx+=3 ) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } /* end for(lwin; .. ; . ) */ - - if (do_l) - { -/* also check l-part, if ALL bands in the three windows are 'empty' - * and mode = mixed_mode - */ - int sfb = gr_info->maxbandl; - int idx = bi->longIdx[sfb]; - - for ( ; sfb<8; sfb++ ) - { - int sb = bi->longDiff[sfb]; - int is_p = scalefac[sfb]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx++) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - else - idx += sb; - } - } - } - else /* ((gr_info->block_type != 2)) */ - { - int sfb = gr_info->maxbandl; - int is_p,idx = bi->longIdx[sfb]; - for ( ; sfb<21; sfb++) - { - int sb = bi->longDiff[sfb]; - is_p = scalefac[sfb]; /* scale: 0-15 */ - if(is_p != 7) { - real t1,t2; - t1 = tab1[is_p]; t2 = tab2[is_p]; - for ( ; sb > 0; sb--,idx++) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - else - idx += sb; - } - - is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */ - if(is_p != 7) - { - int sb; - real t1 = tab1[is_p],t2 = tab2[is_p]; - - for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ ) - { - real v = xr[0][idx]; - xr[0][idx] = v * t1; - xr[1][idx] = v * t2; - } - } - } /* ... */ -} - -static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info) -{ - int sblim; - - if(gr_info->block_type == 2) - { - if(!gr_info->mixed_block_flag) - return; - sblim = 1; - } - else { - sblim = gr_info->maxb-1; - } - - /* 31 alias-reduction operations between each pair of sub-bands */ - /* with 8 butterflies between each pair */ - - { - int sb; - real *xr1=(real *) xr[1]; - - for(sb=sblim;sb;sb--,xr1+=10) - { - int ss; - real *cs=aa_cs,*ca=aa_ca; - real *xr2 = xr1; - - for(ss=7;ss>=0;ss--) - { /* upper and lower butterfly inputs */ - register real bu = *--xr2,bd = *xr1; - *xr2 = (bu * (*cs) ) - (bd * (*ca) ); - *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) ); - } - } - } -} - -/* - DCT insipired by Jeff Tsay's DCT from the maplay package - this is an optimized version with manual unroll. - - References: - [1] S. Winograd: "On Computing the Discrete Fourier Transform", - Mathematics of Computation, Volume 32, Number 141, January 1978, - Pages 175-199 -*/ - -static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf) -{ - { - register real *in = inbuf; - - in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; - in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11]; - in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8]; - in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5]; - in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; - in[2] +=in[1]; in[1] +=in[0]; - - in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9]; - in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1]; - - - { - -#define MACRO0(v) { \ - real tmp; \ - out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \ - out2[8-(v)] = tmp * w[26-(v)]; } \ - sum0 -= sum1; \ - ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \ - ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; -#define MACRO1(v) { \ - real sum0,sum1; \ - sum0 = tmp1a + tmp2a; \ - sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \ - MACRO0(v); } -#define MACRO2(v) { \ - real sum0,sum1; \ - sum0 = tmp2a - tmp1a; \ - sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \ - MACRO0(v); } - - register const real *c = COS9; - register real *out2 = o2; - register real *w = wintab; - register real *out1 = o1; - register real *ts = tsbuf; - - real ta33,ta66,tb33,tb66; - - ta33 = in[2*3+0] * c[3]; - ta66 = in[2*6+0] * c[6]; - tb33 = in[2*3+1] * c[3]; - tb66 = in[2*6+1] * c[6]; - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7]; - tmp1b = in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7]; - tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8]; - tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8]; - - MACRO1(0); - MACRO2(8); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3]; - tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3]; - tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0]; - tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1]; - - MACRO1(1); - MACRO2(7); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1]; - tmp1b = in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1]; - tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4]; - tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4]; - - MACRO1(2); - MACRO2(6); - } - - { - real tmp1a,tmp2a,tmp1b,tmp2b; - tmp1a = in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5]; - tmp1b = in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5]; - tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2]; - tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2]; - - MACRO1(3); - MACRO2(5); - } - - { - real sum0,sum1; - sum0 = in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0]; - sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4]; - MACRO0(4); - } - } - - } -} - -/* - * new DCT12 - */ -static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts) -{ -#define DCT12_PART1 \ - in5 = in[5*3]; \ - in5 += (in4 = in[4*3]); \ - in4 += (in3 = in[3*3]); \ - in3 += (in2 = in[2*3]); \ - in2 += (in1 = in[1*3]); \ - in1 += (in0 = in[0*3]); \ - \ - in5 += in3; in3 += in1; \ - \ - in2 *= COS6_1; \ - in3 *= COS6_1; \ - -#define DCT12_PART2 \ - in0 += in4 * COS6_2; \ - \ - in4 = in0 + in2; \ - in0 -= in2; \ - \ - in1 += in5 * COS6_2; \ - \ - in5 = (in1 + in3) * tfcos12[0]; \ - in1 = (in1 - in3) * tfcos12[2]; \ - \ - in3 = in4 + in5; \ - in4 -= in5; \ - \ - in2 = in0 + in1; \ - in0 -= in1; - - - { - real in0,in1,in2,in3,in4,in5; - register real *out1 = rawout1; - ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2]; - ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5]; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1]; - ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1]; - ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1]; - ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1]; - } - - DCT12_PART2 - - ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0]; - ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0]; - ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2]; - ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2]; - - ts[(6+0)*SBLIMIT] = out1[6+0] + in0 * wi[0]; - ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0]; - ts[(6+2)*SBLIMIT] = out1[6+2] + in4 * wi[2]; - ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2]; - } - - in++; - - { - real in0,in1,in2,in3,in4,in5; - register real *out2 = rawout2; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - out2[5-1] = tmp0 * wi[11-1]; - out2[0+1] = tmp0 * wi[6+1]; - ts[(12+1)*SBLIMIT] += tmp1 * wi[1]; - ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1]; - } - - DCT12_PART2 - - out2[5-0] = in2 * wi[11-0]; - out2[0+0] = in2 * wi[6+0]; - out2[0+2] = in3 * wi[6+2]; - out2[5-2] = in3 * wi[11-2]; - - ts[(12+0)*SBLIMIT] += in0 * wi[0]; - ts[(17-0)*SBLIMIT] += in0 * wi[5-0]; - ts[(12+2)*SBLIMIT] += in4 * wi[2]; - ts[(17-2)*SBLIMIT] += in4 * wi[5-2]; - } - - in++; - - { - real in0,in1,in2,in3,in4,in5; - register real *out2 = rawout2; - out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0; - - DCT12_PART1 - - { - real tmp0,tmp1 = (in0 - in4); - { - real tmp2 = (in1 - in5) * tfcos12[1]; - tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - } - out2[11-1] = tmp0 * wi[11-1]; - out2[6 +1] = tmp0 * wi[6+1]; - out2[0+1] += tmp1 * wi[1]; - out2[5-1] += tmp1 * wi[5-1]; - } - - DCT12_PART2 - - out2[11-0] = in2 * wi[11-0]; - out2[6 +0] = in2 * wi[6+0]; - out2[6 +2] = in3 * wi[6+2]; - out2[11-2] = in3 * wi[11-2]; - - out2[0+0] += in0 * wi[0]; - out2[5-0] += in0 * wi[5-0]; - out2[0+2] += in4 * wi[2]; - out2[5-2] += in4 * wi[5-2]; - } -} - -/* - * III_hybrid - */ -static void III_hybrid(mpgaudio_t *mp, - real fsIn[SBLIMIT][SSLIMIT], - real tsOut[SSLIMIT][SBLIMIT], - int ch,struct gr_info_s *gr_info) -{ - real *tspnt = (real *) tsOut; - real (*block)[2][SBLIMIT*SSLIMIT] = mp->hybrid_block; - int *blc = mp->hybrid_blc; - real *rawout1,*rawout2; - int bt; - int sb = 0; - - { - int b = blc[ch]; - rawout1=block[b][ch]; - b=-b+1; - rawout2=block[b][ch]; - blc[ch] = b; - } - - - if(gr_info->mixed_block_flag) { - sb = 2; - dct36(fsIn[0],rawout1,rawout2,win[0],tspnt); - dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1); - rawout1 += 36; rawout2 += 36; tspnt += 2; - } - - bt = gr_info->block_type; - if(bt == 2) { - for (; 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) { - dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt); - dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1); - } - } - - for(;sb<SBLIMIT;sb++,tspnt++) { - int i; - for(i=0;i<SSLIMIT;i++) { - tspnt[i*SBLIMIT] = *rawout1++; - *rawout2++ = 0.0; - } - } -} - -/* - * main layer3 handler - */ -void do_layer3(mpgaudio_t *mp) -{ - int gr, ch, ss,clip=0; - struct frame *fr = &mp->fr; - static 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; - int num_bytes; - - if(stereo == 1) { /* stream is mono */ - stereo1 = 1; - single = 0; - } - else if(single >= 0) /* stream is stereo, but force to mono */ - stereo1 = 1; - else - stereo1 = 2; - - if(fr->mode == MPG_MD_JOINT_STEREO) { - ms_stereo = fr->mode_ext & 0x2; - i_stereo = fr->mode_ext & 0x1; - } - else - ms_stereo = i_stereo = 0; - - if(fr->lsf) { - granules = 1; - if (!III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single)) - return; - } - else { - granules = 2; -#ifdef MPEG1 - if (!III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single)) - return; -#else - fprintf(stderr,"Not supported\n"); -#endif - } - - if(!set_pointer(mp, sideinfo.main_data_begin)) { - printf ("set pointer failed.\n"); - return; - } - - num_bytes = 0 ; - - 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 { -#ifdef MPEG1 - part2bits = III_get_scale_factors_1(scalefacs[0],gr_info); -#else - fprintf(stderr,"Not supported\n"); -#endif - } - if(III_dequantize_sample(mp->hybridIn[0], scalefacs[0],gr_info,sfreq,part2bits)) { - printf ("III_dequantize_sample failed.\n"); - return; - } - } - 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 { -#ifdef MPEG1 - part2bits = III_get_scale_factors_1(scalefacs[1],gr_info); -#else - fprintf(stderr,"Not supported\n"); -#endif - } - - if(III_dequantize_sample(mp->hybridIn[1],scalefacs[1],gr_info,sfreq,part2bits)) { - printf ("III_dequantize_sample failed.\n"); - return; - } - - if(ms_stereo) { - int i; - for(i=0;i<SBLIMIT*SSLIMIT;i++) { - real tmp0,tmp1; - tmp0 = ((real *) mp->hybridIn[0])[i]; - tmp1 = ((real *) mp->hybridIn[1])[i]; - ((real *) mp->hybridIn[0])[i] = tmp0 + tmp1; - ((real *) mp->hybridIn[1])[i] = tmp0 - tmp1; - } - } - - if(i_stereo) - III_i_stereo(mp->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 int i; - register real *in0 = (real *) mp->hybridIn[0],*in1 = (real *) mp->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 int i; - register real *in0 = (real *) mp->hybridIn[0],*in1 = (real *) mp->hybridIn[1]; - for(i=0;i<SSLIMIT*gr_info->maxb;i++) - *in0++ = *in1++; - } - break; - } - } - - for(ch=0;ch<stereo1;ch++) { - struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]); - III_antialias(mp->hybridIn[ch],gr_info); - III_hybrid(mp, mp->hybridIn[ch], mp->hybridOut[ch], ch,gr_info); - } - - for(ss=0;ss<SSLIMIT;ss++) { - if(single >= 0) { - clip += synth_1to1_mono(mp, mp->hybridOut[0][ss],mp->osspace,&num_bytes); - } - else { - int p1 = num_bytes; - clip += synth_1to1(mp, mp->hybridOut[0][ss],0,mp->osspace,&p1); - clip += synth_1to1(mp, mp->hybridOut[1][ss],1,mp->osspace,&num_bytes); - } - } - } - - if (fr->sample_rate) { - if ((!mp->is_output_initialized) || (mp->sample_rate_device != fr->sample_rate)) { - - if (mp->is_output_initialized) - mp->ao_output->close(mp->ao_output); - - mp->ao_output->open (mp->ao_output, 16, fr->sample_rate, - stereo-1 ? AO_CAP_MODE_STEREO: AO_CAP_MODE_MONO); - mp->is_output_initialized = 1; - mp->sample_rate_device = fr->sample_rate; - } - - mp->ao_output->write (mp->ao_output, (int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), - mp->pts); - } - mp->pts = 0; -} diff --git a/src/libmpg123/mpg123.h b/src/libmpg123/mpg123.h deleted file mode 100644 index 61166e85e..000000000 --- a/src/libmpg123/mpg123.h +++ /dev/null @@ -1,196 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <signal.h> - -#ifndef WIN32 -#include <sys/signal.h> -#include <unistd.h> -#endif - -#include <math.h> - -#include "metronom.h" - -#ifdef _WIN32 -# undef WIN32 -# define WIN32 - -# define M_PI 3.14159265358979323846 -# define M_SQRT2 1.41421356237309504880 -# define REAL_IS_FLOAT -# define NEW_DCT9 - -# define random rand -# define srandom srand - -#endif - -#ifdef REAL_IS_FLOAT -# define real float -#elif defined(REAL_IS_LONG_DOUBLE) -# define real long double -#else -# define real double -#endif - -#ifdef __GNUC__ -#define INLINE inline -#else -#define INLINE -#endif - -/* AUDIOBUFSIZE = n*64 with n=1,2,3 ... */ -#define AUDIOBUFSIZE 16384 - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef FALSE -#define TRUE 1 -#endif - -#define SBLIMIT 128 -#define SSLIMIT 18 - -#define SCALE_BLOCK 12 - - -#define MPG_MD_STEREO 0 -#define MPG_MD_JOINT_STEREO 1 -#define MPG_MD_DUAL_CHANNEL 2 -#define MPG_MD_MONO 3 - -#define MAXFRAMESIZE 1792 - - -/* Pre Shift fo 16 to 8 bit converter table */ -#define AUSHIFT (3) - -struct frame { - int stereo; - int jsbound; - int single; - int lsf; - int mpeg25; - int header_change; - int lay; - int error_protection; - int bitrate_index; - int sampling_frequency; - int sample_rate; - int padding; - int extension; - int mode; - int mode_ext; - int copyright; - int original; - int emphasis; - int framesize; /* computed framesize */ - - /* layer2 stuff */ - int II_sblimit; - void *alloc; -}; - -struct parameter { - int quiet; /* shut up! */ - int tryresync; /* resync stream after error */ - int verbose; /* verbose level */ - int checkrange; -}; - -#include "mpglib.h" - -extern unsigned int get1bit(void); -extern unsigned int getbits(int); -extern unsigned int getbits_fast(int); -extern int set_pointer(mpgaudio_t *mp, long); - -extern unsigned char *mpg123_wordpointer; -extern int mpg123_bitindex; - -extern void make_decode_tables(long scaleval); -extern void do_layer3(mpgaudio_t *mp); -extern void do_layer2(mpgaudio_t *mp); -extern void do_layer1(mpgaudio_t *mp); -extern int decode_header(struct frame *fr,unsigned long newhead); - - - -struct gr_info_s { - int scfsi; - unsigned part2_3_length; - unsigned big_values; - unsigned scalefac_compress; - unsigned block_type; - unsigned mixed_block_flag; - unsigned table_select[3]; - unsigned subblock_gain[3]; - unsigned maxband[3]; - unsigned maxbandl; - unsigned maxb; - unsigned region1start; - unsigned region2start; - unsigned preflag; - unsigned scalefac_scale; - unsigned count1table_select; - real *full_gain[3]; - real *pow2gain; -}; - -struct III_sideinfo -{ - unsigned main_data_begin; - unsigned private_bits; - struct { - struct gr_info_s gr[2]; - } ch[2]; -}; - -extern int synth_1to1 (mpgaudio_t *mp, real *,int,unsigned char *,int *); -extern int synth_1to1_8bit (real *,int,unsigned char *,int *); -extern int synth_1to1_mono (mpgaudio_t *mp, real *,unsigned char *,int *); -extern int synth_1to1_mono2stereo (real *,unsigned char *,int *); -extern int synth_1to1_8bit_mono (real *,unsigned char *,int *); -extern int synth_1to1_8bit_mono2stereo (real *,unsigned char *,int *); - -extern int synth_2to1 (real *,int,unsigned char *,int *); -extern int synth_2to1_8bit (real *,int,unsigned char *,int *); -extern int synth_2to1_mono (real *,unsigned char *,int *); -extern int synth_2to1_mono2stereo (real *,unsigned char *,int *); -extern int synth_2to1_8bit_mono (real *,unsigned char *,int *); -extern int synth_2to1_8bit_mono2stereo (real *,unsigned char *,int *); - -extern int synth_4to1 (real *,int,unsigned char *,int *); -extern int synth_4to1_8bit (real *,int,unsigned char *,int *); -extern int synth_4to1_mono (real *,unsigned char *,int *); -extern int synth_4to1_mono2stereo (real *,unsigned char *,int *); -extern int synth_4to1_8bit_mono (real *,unsigned char *,int *); -extern int synth_4to1_8bit_mono2stereo (real *,unsigned char *,int *); - -extern int synth_ntom (real *,int,unsigned char *,int *); -extern int synth_ntom_8bit (real *,int,unsigned char *,int *); -extern int synth_ntom_mono (real *,unsigned char *,int *); -extern int synth_ntom_mono2stereo (real *,unsigned char *,int *); -extern int synth_ntom_8bit_mono (real *,unsigned char *,int *); -extern int synth_ntom_8bit_mono2stereo (real *,unsigned char *,int *); - -extern void rewindNbits(int bits); -extern int hsstell(void); -extern int get_songlen(struct frame *fr,int no); - -extern void init_layer3(int); -extern void init_layer2(void); -extern void make_decode_tables(long scale); -extern void make_conv16to8_table(int); -extern void dct64(real *,real *,real *); - -extern void synth_ntom_set_step(long,long); - -extern unsigned char *conv16to8; -extern long freqs[9]; -extern real muls[27][64]; -extern real decwin[512+32]; -extern real *pnts[5]; - -extern struct parameter param; diff --git a/src/libmpg123/mpglib.h b/src/libmpg123/mpglib.h deleted file mode 100644 index 54de6a5f3..000000000 --- a/src/libmpg123/mpglib.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2000 the xine project - * - * This file is part of xine, a unix video player. - * xine version of libmpg123 interface - * - * xine 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. - * - * xine 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 - * - * $Id: mpglib.h,v 1.7 2002/03/31 20:38:41 jcdutton Exp $ - */ - -#ifndef HAVE_MPGLIB_H -#define HAVE_MPGLIB_H - -#include <inttypes.h> - -#include "audio_out.h" - -typedef struct mpstr { - unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */ - int bsnum; - int bsize; - int framesize, framesize_old; - - unsigned long header; - struct frame fr; - - real hybrid_block[2][2][SBLIMIT*SSLIMIT]; - int hybrid_blc[2]; - real synth_buffs[2][2][0x110]; - int synth_bo; - - real hybridIn[2][SBLIMIT][SSLIMIT]; - real hybridOut[2][SSLIMIT][SBLIMIT]; - - - int is_output_initialized; - int sample_rate_device; - ao_instance_t *ao_output; - unsigned char osspace[8192]; - - int64_t pts; -} mpgaudio_t; - -#ifndef BOOL -#define BOOL int -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -mpgaudio_t *mpg_audio_init (ao_instance_t *ao_output); - -void mpg_audio_reset (mpgaudio_t *mp); - -void mpg_audio_decode_data (mpgaudio_t *mp, uint8_t *data, uint8_t *data_end, - int64_t pts); - -void mpg_audio_close (mpgaudio_t *mp); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/src/libmpg123/tabinit.c b/src/libmpg123/tabinit.c deleted file mode 100644 index 2efd2cd04..000000000 --- a/src/libmpg123/tabinit.c +++ /dev/null @@ -1,80 +0,0 @@ - -#include <stdlib.h> - -#include "mpg123.h" - -real decwin[512+32]; -static real cos64[16],cos32[8],cos16[4],cos8[2],cos4[1]; -real *pnts[] = { cos64,cos32,cos16,cos8,cos4 }; - -#if 0 -static unsigned char *conv16to8_buf = NULL; -unsigned char *conv16to8; -#endif - -static long intwinbase[] = { - 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, - -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, - -8, -9, -10, -11, -13, -14, -16, -17, -19, -21, - -24, -26, -29, -31, -35, -38, -41, -45, -49, -53, - -58, -63, -68, -73, -79, -85, -91, -97, -104, -111, - -117, -125, -132, -139, -147, -154, -161, -169, -176, -183, - -190, -196, -202, -208, -213, -218, -222, -225, -227, -228, - -228, -227, -224, -221, -215, -208, -200, -189, -177, -163, - -146, -127, -106, -83, -57, -29, 2, 36, 72, 111, - 153, 197, 244, 294, 347, 401, 459, 519, 581, 645, - 711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356, - 1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962, - 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000, - 1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970, - 794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388, - -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, - -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, - -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, - -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, - -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082, - -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455, - 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289, - 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617, - 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684, - 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835, - 73415, 73908, 74313, 74630, 74856, 74992, 75038 }; - -void make_decode_tables(long scaleval) -{ - int i,j,k,kr,divv; - real *table,*costab; - - - for(i=0;i<5;i++) - { - kr=0x10>>i; divv=0x40>>i; - costab = pnts[i]; - for(k=0;k<kr;k++) - costab[k] = 1.0 / (2.0 * cos(M_PI * ((double) k * 2.0 + 1.0) / (double) divv)); - } - - table = decwin; - scaleval = -scaleval; - for(i=0,j=0;i<256;i++,j++,table+=32) - { - if(table < decwin+512+16) - table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval; - if(i % 32 == 31) - table -= 1023; - if(i % 64 == 63) - scaleval = - scaleval; - } - - for( /* i=256 */ ;i<512;i++,j--,table+=32) - { - if(table < decwin+512+16) - table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval; - if(i % 32 == 31) - table -= 1023; - if(i % 64 == 63) - scaleval = - scaleval; - } -} - - diff --git a/src/libmpg123/xine_decoder.c b/src/libmpg123/xine_decoder.c deleted file mode 100644 index 8805c1014..000000000 --- a/src/libmpg123/xine_decoder.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2000-2001 the xine project - * - * This file is part of xine, a unix video player. - * - * xine 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. - * - * xine 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 - * - * $Id: xine_decoder.c,v 1.11 2003/12/05 15:54:59 f1rmb Exp $ - * - * stuff needed to turn libmpg123 into a xine decoder plugin - */ - -/* - * FIXME: libmpg123 uses global variables (that are written to) - */ - - -#include <stdlib.h> - -#include "audio_out.h" -#include "mpg123.h" -#include "mpglib.h" -#include "buffer.h" -#include "xine_internal.h" - -#define FRAME_SIZE 4096 - -typedef struct mpgdec_decoder_s { - audio_decoder_t audio_decoder; - - int64_t pts; - - mpgaudio_t *mpg; - - ao_instance_t *audio_out; - int output_sampling_rate; - int output_open; - -} mpgdec_decoder_t; - -void mpgdec_reset (audio_decoder_t *this_gen) { - - mpgdec_decoder_t *this = (mpgdec_decoder_t *) this_gen; - - mpg_audio_reset (this->mpg); -} - -void mpgdec_init (audio_decoder_t *this_gen, ao_instance_t *audio_out) { - - mpgdec_decoder_t *this = (mpgdec_decoder_t *) this_gen; - - this->audio_out = audio_out; - this->mpg = mpg_audio_init (audio_out); -} - -void mpgdec_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) { - - mpgdec_decoder_t *this = (mpgdec_decoder_t *) this_gen; - - /* - printf ("libmpg123: decode data\n"); - fflush (stdout); - */ - if (buf->decoder_info[0] >0) { - /* - printf ("libmpg123: decode data - doing it\n"); - fflush (stdout); - */ - mpg_audio_decode_data (this->mpg, buf->content, buf->content + buf->size, - buf->PTS); - } -} - -void mpgdec_close (audio_decoder_t *this_gen) { - - mpgdec_decoder_t *this = (mpgdec_decoder_t *) this_gen; - - mpg_audio_close (this->mpg); - - if (this->output_open) - this->audio_out->close (this->audio_out); -} - -static char *mpgdec_get_id(void) { - return "mpgdec"; -} - -static void *init_audio_decoder_plugin (xine_t *xine, void *data) { - - mpgdec_decoder_t *this ; - - this = (mpgdec_decoder_t *) xine_xmalloc (sizeof (mpgdec_decoder_t)); - - this->audio_decoder.init = mpgdec_init; - this->audio_decoder.reset = mpgdec_reset; - this->audio_decoder.decode_data = mpgdec_decode_data; - this->audio_decoder.close = mpgdec_close; - this->audio_decoder.get_identifier = mpgdec_get_id; - - return (audio_decoder_t *) this; -} - -static uint32_t audio_types[] = { BUF_AUDIO_MPEG, 0 }; - -static decoder_info_t dec_info_audio = { - audio_types, /* supported types */ - 1 /* priority */ -}; - -plugin_info_t xine_plugin_info[] = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_AUDIO_DECODER, 9, "mpgdec", XINE_VERSION_CODE, &dec_info_audio, init_audio_decoder_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; diff --git a/src/libxvid/.cvsignore b/src/libxvid/.cvsignore deleted file mode 100644 index 7d926a554..000000000 --- a/src/libxvid/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile -Makefile.in -.libs -.deps -*.lo -*.la diff --git a/src/libxvid/Makefile.am b/src/libxvid/Makefile.am deleted file mode 100644 index 1735cf741..000000000 --- a/src/libxvid/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = @XVID_CFLAGS@ - -libdir = $(XINE_PLUGINDIR) - - -if HAVE_XVID -xvid_modules = xineplug_decode_xvid.la -endif - -lib_LTLIBRARIES = $(xvid_modules) - -xineplug_decode_xvid_la_SOURCES = xine_decoder.c -xineplug_decode_xvid_la_LIBADD = @XVID_LIBS@ -xineplug_decode_xvid_la_LDFLAGS = -avoid-version -module @XINE_PLUGIN_MIN_SYMS@ diff --git a/src/libxvid/xine_decoder.c b/src/libxvid/xine_decoder.c deleted file mode 100644 index f8856edaa..000000000 --- a/src/libxvid/xine_decoder.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2000-2003 the xine project - * - * This file is part of xine, a free video player. - * - * xine 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. - * - * xine 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 - * - * XviD video decoder plugin (libxvidcore wrapper) for xine - * - * by Tomas Kovar <tomask@mac.com> - * with ideas from the ffmpeg xine plugin. - * - * Requires the xvidcore library. Find it at http://www.xvid.org. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdlib.h> -#include <pthread.h> -#include <xvid.h> - -#define LOG_MODULE "xvid_decoder" -#define LOG_VERBOSE -/* -#define LOG -*/ - -#include "bswap.h" -#include "xine_internal.h" -#include "buffer.h" -#include "xine-utils/xineutils.h" - -#define VIDEOBUFSIZE 128 * 1024 - -typedef struct xvid_decoder_s { - video_decoder_t video_decoder; - - vo_instance_t *video_out; - int decoder_running; - int skip_frames; - - unsigned char *buffer; - int buffer_size; - int frame_size; - - int frame_width; - int frame_height; - double ratio; - - /* frame_duration a.k.a. video_step. It is one second metronom */ - /* ticks (90,000) divided by fps (provided by demuxer from system */ - /* stream), i.e. for how many ticks the frame will be displayed */ - int frame_duration; - - void *xvid_handle; -} xvid_decoder_t; - -static void xvid_init_plugin (video_decoder_t *this_gen, vo_instance_t *video_out) { - xvid_decoder_t *this = (xvid_decoder_t *) this_gen; - - this->video_out = video_out; - this->decoder_running = 0; - this->buffer = NULL; - this->xvid_handle = NULL; -} - -static void xvid_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { - int xerr; - xvid_decoder_t *this = (xvid_decoder_t *) this_gen; - - lprintf ("processing packet type = %08x, buf: %08x, buf->decoder_flags=%08x\n", - buf->type, buf, buf->decoder_flags); - - if (buf->decoder_flags & BUF_FLAG_FRAMERATE) { - this->frame_duration = buf->decoder_info[0]; - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, - this->video_step); - } - - if (buf->decoder_flags & BUF_FLAG_STDHEADER) { - xine_bmiheader *bih; - XVID_DEC_PARAM xparam; - - /* initialize data describing video stream */ - bih = (xine_bmiheader *) buf->content; - this->frame_width = bih->biWidth; - this->frame_height = bih->biHeight; - this->ratio = (double)bih->biWidth/(double)bih->biHeight; - - /* initialize decoder */ - if (this->xvid_handle) { - xvid_decore (this->xvid_handle, XVID_DEC_DESTROY, NULL, NULL); - this->xvid_handle = NULL; - } - - xparam.width = this->frame_width; - xparam.height = this->frame_height; - xparam.handle = NULL; - if ((xerr = xvid_decore (NULL, XVID_DEC_CREATE, &xparam, NULL)) == XVID_ERR_OK) { - this->xvid_handle = xparam.handle; - - /* initialize video out */ - this->video_out->open (this->video_out); - - /* initialize buffer */ - if (this->buffer) { - free (this->buffer); - } - - this->buffer = malloc (VIDEOBUFSIZE); - this->buffer_size = VIDEOBUFSIZE; - - this->decoder_running = 1; - this->skip_frames = 0; - printf ("xvid: WARNING: using libxvidcore.so to decode video. some versions of\n" - " this library have been reported to cause segmentation faults.\n" ); - } else { - printf ("xvid: cannot initialize xvid decoder, error = %d.\n", xerr); - return; - } - - } else { - if (this->decoder_running) { - - /* collect all video stream fragments until "end of frame" mark */ - if (this->frame_size + buf->size > this->buffer_size) { - this->buffer_size = this->frame_size + 2 * buf->size; - printf ("xvid: increasing source buffer to %d to avoid overflow.\n", this->buffer_size); - this->buffer = realloc (this->buffer, this->buffer_size); - } - - xine_fast_memcpy (&this->buffer[this->frame_size], buf->content, buf->size); - this->frame_size += buf->size; - - /* after collecting complete frame, decode it and schedule to display it */ - if (buf->decoder_flags & BUF_FLAG_FRAME_END) { - vo_frame_t *image; - XVID_DEC_FRAME xframe; - - image = this->video_out->get_frame (this->video_out, - this->frame_width, this->frame_height, - this->ratio, - XINE_IMGFMT_YV12, VO_BOTH_FIELDS); - image->pts = buf->pts; - image->duration = this->frame_duration; - image->bad_frame = 0; - - /* decode frame */ - xframe.bitstream = this->buffer; - xframe.length = this->frame_size; - /* FIXME: This assumes, that YV12 planes are correctly laid off */ - xframe.image = image->base[0]; - xframe.stride = this->frame_width; - xframe.colorspace = XVID_CSP_YV12; - - if ((xerr = xvid_decore (this->xvid_handle, XVID_DEC_DECODE, &xframe, NULL)) != XVID_ERR_OK - || this->skip_frames) { - if (this->skip_frames) { - printf ("xvid: skipping frame.\n"); - } else { - printf ("xvid: error decompressing frame, error code = %d.\n", xerr); - } - image->bad_frame = 1; - } - - /* add frame to display queue */ - this->skip_frames = image->draw (image); - if (this->skip_frames < 0) { - this->skip_frames = 0; - } - - image->free (image); - this->frame_size = 0; - } - } - } -} - -static void xvid_flush (video_decoder_t *this_gen) { -} - -static void xvid_close_plugin (video_decoder_t *this_gen) { - xvid_decoder_t *this = (xvid_decoder_t *) this_gen; - - if (this->decoder_running) { - xvid_decore (this->xvid_handle, XVID_DEC_DESTROY, NULL, NULL); - this->xvid_handle = NULL; - this->video_out->close (this->video_out); - this->decoder_running = 0; - } - if (this->buffer) { - free (this->buffer); - this->buffer = NULL; - } -} - -static char *xvid_get_id(void) { - return "XviD video decoder"; -} - -static void xvid_dispose (video_decoder_t *this_gen) { - free (this_gen); -} - -static void *init_video_decoder_plugin (xine_t *xine, void *data) { - xvid_decoder_t *this; - XVID_INIT_PARAM xinit; - - xinit.cpu_flags = 0; - xvid_init(NULL, 0, &xinit, NULL); - if (xinit.api_version != API_VERSION) { - printf (_("xvid: there is mismatch between API used by currently installed XviD\n" - "xvid: library (%d.%d) and library used to compile this plugin (%d.%d).\n" - "xvid: Compiling this plugin against current XviD library should help.\n"), - xinit.api_version >> 16, xinit.api_version & 0xFFFF, - API_VERSION >> 16, API_VERSION & 0xFFFF); - return NULL; - } - - this = (xvid_decoder_t *) xine_xmalloc (sizeof (xvid_decoder_t)); - - this->video_decoder.init = xvid_init_plugin; - this->video_decoder.decode_data = xvid_decode_data; - this->video_decoder.flush = xvid_flush; - this->video_decoder.close = xvid_close_plugin; - this->video_decoder.get_identifier = xvid_get_id; - this->video_decoder.dispose = xvid_dispose; - this->frame_size = 0; - - return (video_decoder_t *) this; -} - -/* - * exported plugin catalog entry - */ - -static uint32_t video_types[] = { - BUF_VIDEO_XVID, - 0 - }; - -static decoder_info_t dec_info_video = { - video_types, /* supported types */ - 3 /* priority */ -}; - -static uint32_t video_types2[] = { - BUF_VIDEO_DIVX5, - 0 - }; - -static decoder_info_t dec_info_video2 = { - video_types2, /* supported types */ - 10 /* priority */ -}; - -plugin_info_t xine_plugin_info[] = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_VIDEO_DECODER, 10, "xvid", XINE_VERSION_CODE, &dec_info_video, init_video_decoder_plugin }, - { PLUGIN_VIDEO_DECODER, 10, "xvid-divx5", XINE_VERSION_CODE, &dec_info_video2, init_video_decoder_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; |