📄 layer3.c
字号:
/*
* $Id: layer3.c,v 1.1.1.1 2004/12/22 10:02:27 zyu Exp $
*/
/*
* Mpeg Layer-3 audio decoder
* --------------------------
* copyright (c) 1995,1996,1997 by Michael Hipp.
* All rights reserved. See also 'README'
*/
#include "mpg123.h"
#include "mpglib.h"
#include "huffman.h"
#if (defined MPEG2||defined MPEG25)
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 */
#endif
//unsigned char rval;
#define GET1BIT() {\
rval = *bufpointer << bitindex;\
bitindex++;\
bufpointer += (bitindex>>3);\
bitindex &= 7;\
rval= rval>>7;\
}
/*
* init tables for layer-3
*/
int mapbuf0[9][152];
int mapbuf1[9][156];
int mapbuf2[9][44];
int *mp;
int cb,lwin;
short *bdf;
int len[4] = { 36,36,12,36 };
void init_layer3(int down_sample_sblimit)
{
int i,j;
for(i=0;i<16;i++)
b0x[i] = 0;
/*
* Modified by DSA 2003.10.31 ok
*/
/*for(j=0;j<4;j++) {
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(j=0;j<4;j++) {
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(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;
}
}
#if (defined MPEG2||defined MPEG25)
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);
}
}
}
#endif
#ifdef MMA_X
/* configure MMA */
for (i=0; i<4+512+32; ++i)
mrambase[i] = decwin_fix[i];
j = 4+512+32;
/* XXX - fix cos tables for actual MMA because of only low 20-bits used */
for (i=0; i<16; ++i)
mrambase[j+i] = cos64[i];
pnts[0] = (real *)&mrambase[j];
j += 16;
for (i=0; i<8; ++i)
mrambase[j+i] = cos32[i];
pnts[1] = (real *)&mrambase[j];
j += 8;
for (i=0; i<4; ++i)
mrambase[j+i] = cos16[i];
pnts[2] = (real *)&mrambase[j];
j += 4;
for (i=0; i<2; ++i)
mrambase[j+i] = cos8[i];
pnts[3] = (real *)&mrambase[j];
j += 2;
mrambase[j] = cos4[0];
pnts[4] = (real *)&mrambase[j];
#endif /* MMA */
}
/*
* read additional side information
*/
#if 1
static void 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");
gr_info->big_values = 288;
}
gr_info->pow2gain = -46 + 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 */
GET1BIT();
if(rval)
{
gr_info->block_type = getbits_fast(2);
GET1BIT();
gr_info->mixed_block_flag = rval;
//get_1bit(&(gr_info->mixed_block_flag));
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;
/*
* Modified by DSA 2003.10.31 ok
*/
// for(i=0;i<3;i++)
// gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
gr_info->full_gain[0] = gr_info->pow2gain + (getbits_fast(3)<<3);
gr_info->full_gain[1] = gr_info->pow2gain + (getbits_fast(3)<<3);
gr_info->full_gain[2] = gr_info->pow2gain + (getbits_fast(3)<<3);
if(gr_info->block_type == 0) {
// fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
// exit(1);
return;
}
/* region_count/start parameters are implicit in this case. */
gr_info->region1start = 36>>1;
gr_info->region2start = 576>>1;
}
else
{
int r0c,r1c;
/*
* Modified by DSA 2003.10.31 ok
*/
// for (i=0; i<3; i++)
// gr_info->table_select[i] = getbits_fast(5);
gr_info->table_select[0] = getbits_fast(5);
gr_info->table_select[1] = getbits_fast(5);
gr_info->table_select[2] = 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;
}
GET1BIT();
gr_info->preflag = rval;
GET1BIT();
gr_info->scalefac_scale = rval;
GET1BIT();
gr_info->count1table_select = rval;
//get_1bit(&(gr_info->preflag));
//get_1bit(&(gr_info->scalefac_scale));
//get_1bit(&(gr_info->scalefac_scale));
}
}
}
#endif
#if (defined MPEG2||defined MPEG25)
/*
* Side Info for MPEG 2.0 / LSF
*/
static void 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){
GET1BIT();
si->private_bits = rval;
//get_1bit(&(si->private_bits));}
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;
}
gr_info->pow2gain = -46 + 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 */
GET1BIT();
if(rval)
{
int i;
gr_info->block_type = getbits_fast(2);
GET1BIT();
gr_info->mixed_block_flag = rval;
//get_1bit(&(gr_info->mixed_block_flag));
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");
exit(1);
}
/* 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;
}
GET1BIT();
gr_info->scalefac_scale = rval;
GET1BIT();
gr_info->count1table_select = rval;
//get_1bit(&(gr_info->scalefac_scale));
//get_1bit(&(gr_info->scalefac_scale));
}
}
#endif
/*
* read scalefactors
*/
#if 1
static int III_get_scale_factors_1(int *scf,struct gr_info_s *gr_info)
{
static 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}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -