Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/layer3.c view on Meta::CPAN
/*
* Mpeg Layer-3 audio decoder
* --------------------------
* copyright (c) 1995-1999 by Michael Hipp.
* All rights reserved. See also 'README'
*
* Optimize-TODO: put short bands into the band-field without the stride
* of 3 reals
* Length-optimze: unify long and short band code where it is possible
*/
#if 0
#define L3_DEBUG 1
#endif
#if 0
#define CUT_HF
#endif
#include <stdlib.h>
#include "mpg123.h"
#include "huffman.h"
#include "common.h"
#include "getbits.h"
static real ispow[8207];
static real aa_ca[8],aa_cs[8];
static real COS1[12][6];
static real win[4][36];
static real win1[4][36];
static real gainpow2[256+118+4];
/* non static for external 3dnow functions */
real COS9[9];
static real COS6_1,COS6_2;
real tfcos36[9];
static real tfcos12[3];
#define NEW_DCT9
#ifdef NEW_DCT9
static real cos9[3],cos18[3];
#endif
struct bandInfoStruct {
int longIdx[23];
int longDiff[22];
int shortIdx[14];
int shortDiff[13];
};
int longLimit[9][23];
int shortLimit[9][14];
struct bandInfoStruct bandInfo[9] = {
/* MPEG 1.0 */
{ {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
{4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
{0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
{4,4,4,4,6,8,10,12,14,18,22,30,56} } ,
{ {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
{4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
{0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
{4,4,4,4,6,6,10,12,14,16,20,26,66} } ,
{ {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} ,
{4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} ,
{0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} ,
{4,4,4,4,6,8,12,16,20,26,34,42,12} } ,
/* MPEG 2.0 */
{ {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
{0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
{4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
/*
{ {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
{6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
*/
/* changed 19th value fropm 330 to 332 */
{ {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576},
{6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36 } ,
{0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} ,
{4,4,4,6,8,10,12,14,18,24,32,44,12 } } ,
{ {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
{0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
{4,4,4,6,8,10,12,14,18,24,30,40,18 } } ,
/* MPEG 2.5 */
{ {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
{0,12,24,36,54,78,108,144,186,240,312,402,522,576},
{4,4,4,6,8,10,12,14,18,24,30,40,18} },
{ {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
{6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
{0,12,24,36,54,78,108,144,186,240,312,402,522,576},
{4,4,4,6,8,10,12,14,18,24,30,40,18} },
{ {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
{12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2},
{0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576},
{8,8,8,12,16,20,24,28,36,2,2,2,26} } ,
};
static int mapbuf0[9][152];
static int mapbuf1[9][156];
static int mapbuf2[9][44];
static int *map[9][3];
static int *mapend[9][3];
static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16];
static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16];
/*
* init tables for layer-3
*/
void init_layer3(int down_sample_sblimit)
{
int i,j,k,l;
#ifdef REAL_IS_FIXED
double tmparray[8207];
double twotothequarter = pow((double)2.0, (double)0.25);
double current = pow((double)2.0, (double)(0.25 * 47));
#endif
for(i=-256;i<118+4;i++) {
#ifdef REAL_IS_FIXED
/* Possibly a few too many multiplies - single bit errors will
* propagate. It may change the gradient of the (log) power curve
* slighty */
current = current / twotothequarter;
gainpow2[i+256] = DOUBLE_TO_REAL(current);
#else
# ifdef USE_MMX
if(!param.down_sample)
gainpow2[i+256] = 16384.0 * pow((double)2.0,-0.25 * (double) (i+210) );
else
# endif
gainpow2[i+256] = DOUBLE_TO_REAL(pow((double)2.0,-0.25 * (double) (i+210) ));
#endif
}
#ifdef REAL_IS_FIXED
for(i=0;i<8207;i++)
tmparray[i] = 0.0;
tmparray[1] = 1.0;
for(i=2;i<8207;i++) {
if(!tmparray[i]) {
tmparray[i] = pow((double)i,(double)(4.0/3.0));
for(j = 2; (j <= i) && ((i * j) < 8207); j++) {
/* Degradation due to lots of multiplies: A double has
* 52 bits of mantissa. A long has 32 bits (on the IPaq).
* Hence we can create 20 bits of error without fussing.
* Assuming that a 1 bit error multiplies to 2 bits, then 4,
* then 8, and noting that 2^13 is 8196 (we go up to 8207),
* we may have a problem. Resolve this by limiting to 4
* multiplies before recalculating. */
for(k = i, l = 0; (k * j) <= 8207 && (l < 4); k *= j, l++) {
( run in 0.855 second using v1.01-cache-2.11-cpan-364913b4093 )