📄 decode.c
字号:
/**********************************************************************Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserveddecode.c**********************************************************************//********************************************************************** * MPEG/audio coding/decoding software, work in progress * * NOT for public distribution until verified and approved by the * * MPEG/audio committee. For further information, please contact * * Chad Fogg email: <cfogg@xenon.com> * * * * VERSION 4.1 * * changes made since last update: * * 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 * **********************************************************************/#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; } } } else { /* for no sample transmitted */ for (k=0;k<3;k++) sample[j][k][i] = 0; } if(stereo == 2 && i>= jsbound) /* joint stereo : copy L to R */ for (k=0;k<3;k++) sample[1][k][i] = sample[0][k][i]; } for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++) for (k=0;k<3;k++) sample[j][k][i] = 0;} /**************************************************************/*/* Restore the compressed sample to a factional number./* first complement the MSB of the sample/* for layer I :/* Use s = (s' + 2^(-nb+1) ) * 2^nb / (2^nb-1)/* for Layer II :/* Use the formula s = s' * c + d/*/**************************************************************/static double c[17] = { 1.33333333333, 1.60000000000, 1.14285714286, 1.77777777777, 1.06666666666, 1.03225806452, 1.01587301587, 1.00787401575, 1.00392156863, 1.00195694716, 1.00097751711, 1.00048851979, 1.00024420024, 1.00012208522, 1.00006103888, 1.00003051851, 1.00001525902 };static double d[17] = { 0.500000000, 0.500000000, 0.250000000, 0.500000000, 0.125000000, 0.062500000, 0.031250000, 0.015625000, 0.007812500, 0.003906250, 0.001953125, 0.0009765625, 0.00048828125, 0.00024414063, 0.00012207031, 0.00006103516, 0.00003051758 };/************************** Layer II stuff ************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -