📄 decode.c
字号:
/**********************************************************************
* ISO MPEG Audio Subgroup Software Simulation Group (1996)
* ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
*
* $Id: decode.c,v 1.2 1996/03/28 03:13:37 rowlands Exp $
*
* $Log: decode.c,v $
* Revision 1.2 1996/03/28 03:13:37 rowlands
* Merged layers 1-2 and layer 3 revisions
*
* Revision 1.1 1996/02/14 03:45:52 rowlands
* Initial revision
*
* Received from FhG
**********************************************************************/
/**********************************************************************
* date programmers comment *
* 2/25/91 Douglas Wong, start of version 1.0 records *
* Davis Pan *
* 3/06/91 Douglas Wong rename: setup.h to dedef.h *
* dfilter to defilter *
* dwindow to dewindow *
* integrated "quantizer", "scalefactor" *
* combined window_samples routine into *
* filter samples *
* 3/31/91 Bill Aspromonte replaced read_filter by *
* create_syn_filter and introduced a *
* new Sub-Band Synthesis routine called *
* SubBandSynthesis() *
* 5/10/91 Vish (PRISM) Ported to Macintosh and Unix. *
* Changed "out_fifo()" so that last *
* unfilled block is also written out. *
* "create_syn_filter()" was modified so *
* that calculation precision is same as *
* in specification tables. *
* Changed "decode_scale()" to reflect *
* specifications. *
* Removed all routines used by *
* "synchronize_buffer()". This is now *
* replaced by "seek_sync()". *
* Incorporated Jean-Georges Fritsch's *
* "bitstream.c" package. *
* Deleted "reconstruct_sample()". *
* 27jun91 dpwe (Aware) Passed outFile and &sampFrames as *
* args to out_fifo() - were global. *
* Moved "alloc_*" reader to common.c. *
* alloc, sblimit, stereo passed via new *
* 'frame_params struct (were globals). *
* Added JOINT STEREO decoding, lyrs I&II*
* Affects: decode_bitalloc,buffer_samps *
* Plus a few other cleanups. *
* 6/10/91 Earle Jennings conditional expansion added in *
* II_dequantize_sample to handle range *
* problems in MSDOS version *
* 8/8/91 Jens Spille Change for MS-C6.00 *
*10/1/91 S.I. Sudharsanan, Ported to IBM AIX platform. *
* Don H. Lee, *
* Peter W. Farrett *
*10/3/91 Don H. Lee implemented CRC-16 error protection *
* newly introduced functions are *
* buffer_CRC and recover_CRC_error. *
* 2/11/92 W. Joseph Carter Ported new code to Macintosh. Most *
* important fixes involved changing *
* 16-bit ints to long or unsigned in *
* bit alloc routines for quant of 65535 *
* and passing proper function args. *
* Removed "Other Joint Stereo" option *
* and made bitrate be total channel *
* bitrate, irrespective of the mode. *
* Fixed many small bugs & reorganized. *
* 7/27/92 Juan Pineda Bug fix in SubBandSynthesis() *
*--------------------------------------------------------------------*
* 6/14/92 Juan Pineda Layer III decoding routines added. *
* Amit Gulati Follows CD 3-11172 rev2. Contains *
* hacks deal with evolving available *
* layerIII bitstreams. Some (minor) *
* modification of prior LI&II code. *
* 10/25/92 Amit Gulati Updated layerIII routines. Added code *
* for subblock_gain, switched block *
* modes, stereo pre-processing. *
* Corrected sign bits for huffman *
* decoding of quadruples region and *
* adjusted gain factor in III_dequant. *
* 11/21/92 Amit Gulati Several layerIII bugs fixed. *
* 12/15/92 Amit Gulati Corrected reordering (indexing) *
* Stan Searing within IMDCT routine. *
* 8/24/93 Masahiro Iwadare Included IS modification in Layer III.*
* Changed for 1 pass decoding. *
* 9/07/93 Toshiyuki Ishino Integrated Layer III with Ver 3.9. *
*--------------------------------------------------------------------*
* 11/20/93 Masahiro Iwadare Integrated Layer III with Ver 4.0. *
*--------------------------------------------------------------------*
* 7/14/94 Juergen Koller Bug fixes in Layer III code *
*--------------------------------------------------------------------*
* 08/11/94 IIS Bug fixes in Layer III code *
*--------------------------------------------------------------------*
* 9/20/94 Davis Pan Modification to avoid premature *
* synchword detection *
*--------------------------------------------------------------------*
* 11/09/94 Jon Rowlands Merged premature synchword detection *
* fix into layer III code version *
*--------------------------------------------------------------------*
* 07/12/95 Soeren H. Nielsen Changes for LSF Layer I and II *
*--------------------------------------------------------------------*
* 8/95 Roland Bitto Adapted to MPEG2 *
* 9/8/95 Roalnd Bitto Bugfix in Function III_stereo *
**********************************************************************/
#include "common.h"
#include "decoder.h"
#include "huffman.h"
/***************************************************************
/*
/* This module contains the core of the decoder ie all the
/* computational routines. (Layer I and II only)
/* Functions are common to both layer unless
/* otherwise specified.
/*
/***************************************************************/
/*****************************************************************
/*
/* The following routines decode the system information
/*
/****************************************************************/
/************ Layer I, Layer II & Layer III ******************/
void decode_info(bs, fr_ps)
Bit_stream_struc *bs;
frame_params *fr_ps;
{
layer *hdr = fr_ps->header;
hdr->version = get1bit(bs);
hdr->lay = 4-getbits(bs,2);
hdr->error_protection = !get1bit(bs); /* error protect. TRUE/FALSE */
hdr->bitrate_index = getbits(bs,4);
hdr->sampling_frequency = getbits(bs,2);
hdr->padding = get1bit(bs);
hdr->extension = get1bit(bs);
hdr->mode = getbits(bs,2);
hdr->mode_ext = getbits(bs,2);
hdr->copyright = get1bit(bs);
hdr->original = get1bit(bs);
hdr->emphasis = getbits(bs,2);
}
/*******************************************************************
/*
/* The bit allocation information is decoded. Layer I
/* has 4 bit per subband whereas Layer II is Ws and bit rate
/* dependent.
/*
/********************************************************************/
/**************************** Layer II *************/
void II_decode_bitalloc(bs, bit_alloc, fr_ps)
Bit_stream_struc *bs;
unsigned int bit_alloc[2][SBLIMIT];
frame_params *fr_ps;
{
int i,j;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
al_table *alloc = fr_ps->alloc;
for (i=0;i<jsbound;i++) for (j=0;j<stereo;j++)
bit_alloc[j][i] = (char) getbits(bs,(*alloc)[i][0].bits);
for (i=jsbound;i<sblimit;i++) /* expand to 2 channels */
bit_alloc[0][i] = bit_alloc[1][i] =
(char) getbits(bs,(*alloc)[i][0].bits);
for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++)
bit_alloc[j][i] = 0;
}
/**************************** Layer I *************/
void I_decode_bitalloc(bs, bit_alloc, fr_ps)
Bit_stream_struc *bs;
unsigned int bit_alloc[2][SBLIMIT];
frame_params *fr_ps;
{
int i,j;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
int b;
for (i=0;i<jsbound;i++) for (j=0;j<stereo;j++)
bit_alloc[j][i] = getbits(bs,4);
for (i=jsbound;i<SBLIMIT;i++) {
b = getbits(bs,4);
for (j=0;j<stereo;j++)
bit_alloc[j][i] = b;
}
}
/*****************************************************************
/*
/* The following two functions implement the layer I and II
/* format of scale factor extraction. Layer I involves reading
/* 6 bit per subband as scale factor. Layer II requires reading
/* first the scfsi which in turn indicate the number of scale factors
/* transmitted.
/* Layer I : I_decode_scale
/* Layer II : II_decode_scale
/*
/****************************************************************/
/************************** Layer I stuff ************************/
void I_decode_scale(bs, bit_alloc, scale_index, fr_ps)
Bit_stream_struc *bs;
unsigned int bit_alloc[2][SBLIMIT], scale_index[2][3][SBLIMIT];
frame_params *fr_ps;
{
int i,j;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
for (i=0;i<SBLIMIT;i++) for (j=0;j<stereo;j++)
if (!bit_alloc[j][i])
scale_index[j][0][i] = SCALE_RANGE-1;
else /* 6 bit per scale factor */
scale_index[j][0][i] = getbits(bs,6);
}
/*************************** Layer II stuff ***************************/
void II_decode_scale(bs,scfsi, bit_alloc,scale_index, fr_ps)
Bit_stream_struc *bs;
unsigned int scfsi[2][SBLIMIT], bit_alloc[2][SBLIMIT],
scale_index[2][3][SBLIMIT];
frame_params *fr_ps;
{
int i,j;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
for (i=0;i<sblimit;i++) for (j=0;j<stereo;j++) /* 2 bit scfsi */
if (bit_alloc[j][i]) scfsi[j][i] = (char) getbits(bs,2);
for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++)
scfsi[j][i] = 0;
for (i=0;i<sblimit;i++) for (j=0;j<stereo;j++) {
if (bit_alloc[j][i])
switch (scfsi[j][i]) {
/* all three scale factors transmitted */
case 0 : scale_index[j][0][i] = getbits(bs,6);
scale_index[j][1][i] = getbits(bs,6);
scale_index[j][2][i] = getbits(bs,6);
break;
/* scale factor 1 & 3 transmitted */
case 1 : scale_index[j][0][i] =
scale_index[j][1][i] = getbits(bs,6);
scale_index[j][2][i] = getbits(bs,6);
break;
/* scale factor 1 & 2 transmitted */
case 3 : scale_index[j][0][i] = getbits(bs,6);
scale_index[j][1][i] =
scale_index[j][2][i] = getbits(bs,6);
break;
/* only one scale factor transmitted */
case 2 : scale_index[j][0][i] =
scale_index[j][1][i] =
scale_index[j][2][i] = getbits(bs,6);
break;
default : break;
}
else {
scale_index[j][0][i] = scale_index[j][1][i] =
scale_index[j][2][i] = SCALE_RANGE-1;
}
}
for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++) {
scale_index[j][0][i] = scale_index[j][1][i] =
scale_index[j][2][i] = SCALE_RANGE-1;
}
}
/**************************************************************
/*
/* The following two routines take care of reading the
/* compressed sample from the bit stream for both layer 1 and
/* layer 2. For layer 1, read the number of bits as indicated
/* by the bit_alloc information. For layer 2, if grouping is
/* indicated for a particular subband, then the sample size has
/* to be read from the bits_group and the merged samples has
/* to be decompose into the three distinct samples. Otherwise,
/* it is the same for as layer one.
/*
/**************************************************************/
/******************************* Layer I stuff ******************/
void I_buffer_sample(bs, sample, bit_alloc, fr_ps)
unsigned int FAR sample[2][3][SBLIMIT];
unsigned int bit_alloc[2][SBLIMIT];
Bit_stream_struc *bs;
frame_params *fr_ps;
{
int i,j,k;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
unsigned int s;
for (i=0;i<jsbound;i++) for (j=0;j<stereo;j++)
if ( (k = bit_alloc[j][i]) == 0)
sample[j][0][i] = 0;
else
sample[j][0][i] = (unsigned int) getbits(bs,k+1);
for (i=jsbound;i<SBLIMIT;i++) {
if ( (k = bit_alloc[0][i]) == 0)
s = 0;
else
s = (unsigned int)getbits(bs,k+1);
for (j=0;j<stereo;j++)
sample[j][0][i] = s;
}
}
/*************************** Layer II stuff ************************/
void II_buffer_sample(bs,sample,bit_alloc,fr_ps)
unsigned int FAR sample[2][3][SBLIMIT];
unsigned int bit_alloc[2][SBLIMIT];
Bit_stream_struc *bs;
frame_params *fr_ps;
{
int i,j,k,m;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
al_table *alloc = fr_ps->alloc;
for (i=0;i<sblimit;i++) for (j=0;j<((i<jsbound)?stereo:1);j++) {
if (bit_alloc[j][i]) {
/* check for grouping in subband */
if ((*alloc)[i][bit_alloc[j][i]].group==3)
for (m=0;m<3;m++) {
k = (*alloc)[i][bit_alloc[j][i]].bits;
sample[j][m][i] = (unsigned int) getbits(bs,k);
}
else { /* bit_alloc = 3, 5, 9 */
unsigned int nlevels, c=0;
nlevels = (*alloc)[i][bit_alloc[j][i]].steps;
k=(*alloc)[i][bit_alloc[j][i]].bits;
c = (unsigned int) getbits(bs, k);
for (k=0;k<3;k++) {
sample[j][k][i] = c % nlevels;
c /= nlevels;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -