⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.c

📁 mepg 1 layer3软解码源代码,实现了对MP3文件的软件解码
💻 C
📖 第 1 页 / 共 4 页
字号:
/**********************************************************************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 + -