Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19 ------------------------------------------------------------------------------
     20 
     21    PacketVideo Corp.
     22    MP3 Decoder Library
     23 
     24    Filename: pvmp3_framedecoder.cpp
     25 
     26    Functions:
     27     pvmp3_framedecoder
     28     pvmp3_InitDecoder
     29     pvmp3_resetDecoder
     30 
     31     Date: 09/21/2007
     32 
     33 ------------------------------------------------------------------------------
     34  REVISION HISTORY
     35 
     36 
     37  Description:
     38 
     39 ------------------------------------------------------------------------------
     40  INPUT AND OUTPUT DEFINITIONS
     41 
     42 Input
     43     pExt = pointer to the external interface structure. See the file
     44            pvmp3decoder_api.h for a description of each field.
     45            Data type of pointer to a tPVMP3DecoderExternal
     46            structure.
     47 
     48     pMem = void pointer to hide the internal implementation of the library
     49            It is cast back to a tmp3dec_file structure. This structure
     50            contains information that needs to persist between calls to
     51            this function, or is too big to be placed on the stack, even
     52            though the data is only needed during execution of this function
     53            Data type void pointer, internally pointer to a tmp3dec_file
     54            structure.
     55 
     56 
     57  Outputs:
     58      status = ERROR condition.  see structure  ERROR_CODE
     59 
     60  Pointers and Buffers Modified:
     61     pMem contents are modified.
     62     pExt: (more detail in the file pvmp3decoder_api.h)
     63     inputBufferUsedLength - number of array elements used up by the stream.
     64     samplingRate - sampling rate in samples per sec
     65     bitRate - bit rate in bits per second, varies frame to frame.
     66 
     67 
     68 
     69 ------------------------------------------------------------------------------
     70  FUNCTIONS DESCRIPTION
     71 
     72     pvmp3_framedecoder
     73         frame decoder library driver
     74     pvmp3_InitDecoder
     75         Decoder Initialization
     76     pvmp3_resetDecoder
     77         Reset Decoder
     78 
     79 ------------------------------------------------------------------------------
     80  REQUIREMENTS
     81 
     82 
     83 ------------------------------------------------------------------------------
     84  REFERENCES
     85 
     86  [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
     87      ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
     88 
     89 ------------------------------------------------------------------------------
     90  PSEUDO-CODE
     91 
     92 ------------------------------------------------------------------------------
     93 */
     94 
     95 
     96 /*----------------------------------------------------------------------------
     97 ; INCLUDES
     98 ----------------------------------------------------------------------------*/
     99 
    100 
    101 #include "pvmp3_framedecoder.h"
    102 #include "pvmp3_dec_defs.h"
    103 #include "pvmp3_poly_phase_synthesis.h"
    104 #include "pvmp3_tables.h"
    105 #include "pvmp3_imdct_synth.h"
    106 #include "pvmp3_alias_reduction.h"
    107 #include "pvmp3_reorder.h"
    108 #include "pvmp3_dequantize_sample.h"
    109 #include "pvmp3_stereo_proc.h"
    110 #include "pvmp3_mpeg2_stereo_proc.h"
    111 #include "pvmp3_get_side_info.h"
    112 #include "pvmp3_get_scale_factors.h"
    113 #include "pvmp3_mpeg2_get_scale_factors.h"
    114 #include "pvmp3_decode_header.h"
    115 #include "pvmp3_get_main_data_size.h"
    116 #include "s_tmp3dec_file.h"
    117 #include "pvmp3_getbits.h"
    118 #include "mp3_mem_funcs.h"
    119 
    120 
    121 /*----------------------------------------------------------------------------
    122 ; MACROS
    123 ; Define module specific macros here
    124 ----------------------------------------------------------------------------*/
    125 
    126 
    127 /*----------------------------------------------------------------------------
    128 ; DEFINES
    129 ; Include all pre-processor statements here. Include conditional
    130 ; compile variables also.
    131 ----------------------------------------------------------------------------*/
    132 
    133 /*----------------------------------------------------------------------------
    134 ; LOCAL FUNCTION DEFINITIONS
    135 ; Function Prototype declaration
    136 ----------------------------------------------------------------------------*/
    137 
    138 /*----------------------------------------------------------------------------
    139 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    140 ; Variable declaration - defined here and used outside this module
    141 ----------------------------------------------------------------------------*/
    142 
    143 /*----------------------------------------------------------------------------
    144 ; EXTERNAL FUNCTION REFERENCES
    145 ; Declare functions defined elsewhere and referenced in this module
    146 ----------------------------------------------------------------------------*/
    147 
    148 /*----------------------------------------------------------------------------
    149 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    150 ; Declare variables used in this module but defined elsewhere
    151 ----------------------------------------------------------------------------*/
    152 
    153 /*----------------------------------------------------------------------------
    154 ; FUNCTION CODE
    155 ----------------------------------------------------------------------------*/
    156 
    157 ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt,
    158                               void              *pMem)
    159 {
    160 
    161     ERROR_CODE        errorCode  = NO_DECODING_ERROR;
    162 
    163     int32   crc_error_count = 0;
    164     uint32  sent_crc = 0;
    165     uint32  computed_crc = 0;
    166 
    167     tmp3dec_chan   *pChVars[CHAN];
    168     tmp3dec_file   *pVars = (tmp3dec_file *)pMem;
    169 
    170     mp3Header info_data;
    171     mp3Header *info = &info_data;
    172 
    173     pVars->inputStream.pBuffer  = pExt->pInputBuffer;
    174 
    175 
    176     pVars->inputStream.usedBits  = pExt->inputBufferUsedLength << 3;
    177     pVars->inputStream.inputBufferCurrentLength  = pExt->inputBufferCurrentLength;
    178 
    179 
    180     errorCode = pvmp3_decode_header(&pVars->inputStream,
    181                                     info,
    182                                     &computed_crc);
    183 
    184     if (errorCode != NO_DECODING_ERROR)
    185     {
    186         pExt->outputFrameSize = 0;
    187         return errorCode;
    188     }
    189 
    190     pVars->num_channels = (info->mode == MPG_MD_MONO) ? 1 : 2;
    191     pExt->num_channels = pVars->num_channels;
    192 
    193     int32 outputFrameSize = (info->version_x == MPEG_1) ?
    194                             2 * SUBBANDS_NUMBER * FILTERBANK_BANDS :
    195                             SUBBANDS_NUMBER * FILTERBANK_BANDS;
    196 
    197     outputFrameSize = (info->mode == MPG_MD_MONO) ? outputFrameSize : outputFrameSize << 1;
    198 
    199 
    200     /*
    201      *  Check if output buffer has enough room to hold output PCM
    202      */
    203     if (pExt->outputFrameSize >= outputFrameSize)
    204     {
    205         pExt->outputFrameSize = outputFrameSize;
    206     }
    207     else
    208     {
    209         pExt->outputFrameSize = 0;
    210         return OUTPUT_BUFFER_TOO_SMALL;
    211     }
    212 
    213 
    214     pChVars[ LEFT] = &pVars->perChan[ LEFT];
    215     pChVars[RIGHT] = &pVars->perChan[RIGHT];
    216 
    217 
    218 
    219 
    220     if (info->error_protection)
    221     {
    222         /*
    223          *  Get crc content
    224          */
    225         sent_crc = getUpTo17bits(&pVars->inputStream, 16);
    226     }
    227 
    228 
    229     if (info->layer_description == 3)
    230     {
    231         int32 gr;
    232         int32 ch;
    233         uint32 main_data_end;
    234         int32 bytes_to_discard;
    235         int16 *ptrOutBuffer = pExt->pOutputBuffer;
    236 
    237         /*
    238          * Side Information must be extracted from the bitstream and store for use
    239          * during the decoded of the associated frame
    240          */
    241 
    242         errorCode = pvmp3_get_side_info(&pVars->inputStream,
    243                                         &pVars->sideInfo,
    244                                         info,
    245                                         &computed_crc);
    246 
    247         if (errorCode != NO_DECODING_ERROR)
    248         {
    249             pExt->outputFrameSize = 0;
    250             return errorCode;
    251         }
    252 
    253         /*
    254          *  If CRC was sent, check that matches the one got while parsing data
    255          *  disable crc if this is the desired mode
    256          */
    257         if (info->error_protection)
    258         {
    259             if ((computed_crc != sent_crc) && pExt->crcEnabled)
    260             {
    261                 crc_error_count++;
    262             }
    263         }
    264 
    265         /*
    266          * main data (scalefactors, Huffman coded, etc,) are not necessarily located
    267          * adjacent to the side-info. Beginning of main data is located using
    268          * field "main_data_begin" of the current frame. The length does not include
    269          * header and side info.
    270          * "main_data_begin" points to the first bit of main data of a frame. It is a negative
    271          * offset in bytes from the first byte of the sync word
    272          * main_data_begin = 0  <===> main data start rigth after side info.
    273          */
    274 
    275         int32 temp = pvmp3_get_main_data_size(info, pVars);
    276 
    277 
    278         /*
    279          *  Check if available data holds a full frame, if not flag an error
    280          */
    281 
    282         if ((uint32)pVars->predicted_frame_size > pVars->inputStream.inputBufferCurrentLength)
    283         {
    284             pExt->outputFrameSize = 0;
    285             return NO_ENOUGH_MAIN_DATA_ERROR;
    286         }
    287 
    288         /*
    289          *  Fill in internal circular buffer
    290          */
    291         fillMainDataBuf(pVars, temp);
    292 
    293 
    294         main_data_end = pVars->mainDataStream.usedBits >> 3; /* in bytes */
    295         if ((main_data_end << 3) < pVars->mainDataStream.usedBits)
    296         {
    297             main_data_end++;
    298             pVars->mainDataStream.usedBits = main_data_end << 3;
    299         }
    300 
    301 
    302         bytes_to_discard = pVars->frame_start - pVars->sideInfo.main_data_begin - main_data_end;
    303 
    304 
    305         if (main_data_end > BUFSIZE)   /* check overflow on the buffer */
    306         {
    307             pVars->frame_start -= BUFSIZE;
    308 
    309             pVars->mainDataStream.usedBits -= (BUFSIZE << 3);
    310         }
    311 
    312         pVars->frame_start += temp;
    313 
    314 
    315         if (bytes_to_discard < 0 || crc_error_count)
    316         {
    317             /*
    318              *  Not enough data to decode, then we should avoid reading this
    319              *  data ( getting/ignoring sido info and scale data)
    320              *  Main data could be located in the previous frame, so an unaccounted
    321              *  frame can cause incorrect processing
    322              *  Just run the polyphase filter to "clean" the history buffer
    323              */
    324             errorCode = NO_ENOUGH_MAIN_DATA_ERROR;
    325 
    326             /*
    327              *  Clear the input to these filters
    328              */
    329 
    330             pv_memset((void*)pChVars[RIGHT]->work_buf_int32,
    331                       0,
    332                       SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[RIGHT]->work_buf_int32[0]));
    333 
    334             pv_memset((void*)pChVars[LEFT]->work_buf_int32,
    335                       0,
    336                       SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[LEFT]->work_buf_int32[0]));
    337 
    338             /*  clear circular buffers, to avoid any glitch */
    339             pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576],
    340                       0,
    341                       480*sizeof(pChVars[ LEFT]->circ_buffer[0]));
    342             pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576],
    343                       0,
    344                       480*sizeof(pChVars[RIGHT]->circ_buffer[0]));
    345 
    346             pChVars[ LEFT]->used_freq_lines = 575;
    347             pChVars[RIGHT]->used_freq_lines = 575;
    348 
    349         }
    350         else
    351         {
    352             pVars->mainDataStream.usedBits += (bytes_to_discard << 3);
    353         }
    354 
    355         /*
    356          *  if (fr_ps->header->version_x == MPEG_1), use 2 granules, otherwise just 1
    357          */
    358         for (gr = 0; gr < (1 + !(info->version_x)); gr++)
    359         {
    360             if (errorCode != NO_ENOUGH_MAIN_DATA_ERROR)
    361             {
    362                 for (ch = 0; ch < pVars->num_channels; ch++)
    363                 {
    364                     int32 part2_start = pVars->mainDataStream.usedBits;
    365 
    366                     if (info->version_x == MPEG_1)
    367                     {
    368 
    369                         pvmp3_get_scale_factors(&pVars->scaleFactors[ch],
    370                                                 &pVars->sideInfo,
    371                                                 gr,
    372                                                 ch,
    373                                                 &pVars->mainDataStream);
    374                     }
    375                     else
    376                     {
    377                         int32 * tmp = pVars->Scratch_mem;
    378                         pvmp3_mpeg2_get_scale_factors(&pVars->scaleFactors[ch],
    379                                                       &pVars->sideInfo,
    380                                                       gr,
    381                                                       ch,
    382                                                       info,
    383                                                       (uint32 *)tmp,
    384                                                       &pVars->mainDataStream);
    385                     }
    386 
    387                     pChVars[ch]->used_freq_lines = pvmp3_huffman_parsing(pChVars[ch]->work_buf_int32,
    388                                                    &pVars->sideInfo.ch[ch].gran[gr],
    389                                                    pVars,
    390                                                    part2_start,
    391                                                    info);
    392 
    393 
    394                     pvmp3_dequantize_sample(pChVars[ch]->work_buf_int32,
    395                                             &pVars->scaleFactors[ch],
    396                                             &pVars->sideInfo.ch[ch].gran[gr],
    397                                             pChVars[ch]->used_freq_lines,
    398                                             info);
    399 
    400 
    401 
    402 
    403                 }   /* for (ch=0; ch<stereo; ch++)  */
    404 
    405                 if (pVars->num_channels == 2)
    406                 {
    407 
    408                     int32 used_freq_lines = (pChVars[ LEFT]->used_freq_lines  >
    409                                              pChVars[RIGHT]->used_freq_lines) ?
    410                                             pChVars[ LEFT]->used_freq_lines  :
    411                                             pChVars[RIGHT]->used_freq_lines;
    412 
    413                     pChVars[ LEFT]->used_freq_lines = used_freq_lines;
    414                     pChVars[RIGHT]->used_freq_lines = used_freq_lines;
    415 
    416                     if (info->version_x == MPEG_1)
    417                     {
    418                         pvmp3_stereo_proc(pChVars[ LEFT]->work_buf_int32,
    419                                           pChVars[RIGHT]->work_buf_int32,
    420                                           &pVars->scaleFactors[RIGHT],
    421                                           &pVars->sideInfo.ch[LEFT].gran[gr],
    422                                           used_freq_lines,
    423                                           info);
    424                     }
    425                     else
    426                     {
    427                         int32 * tmp = pVars->Scratch_mem;
    428                         pvmp3_mpeg2_stereo_proc(pChVars[ LEFT]->work_buf_int32,
    429                                                 pChVars[RIGHT]->work_buf_int32,
    430                                                 &pVars->scaleFactors[RIGHT],
    431                                                 &pVars->sideInfo.ch[ LEFT].gran[gr],
    432                                                 &pVars->sideInfo.ch[RIGHT].gran[gr],
    433                                                 (uint32 *)tmp,
    434                                                 used_freq_lines,
    435                                                 info);
    436                     }
    437                 }
    438 
    439             } /* if ( errorCode != NO_ENOUGH_MAIN_DATA_ERROR) */
    440 
    441             for (ch = 0; ch < pVars->num_channels; ch++)
    442             {
    443 
    444                 pvmp3_reorder(pChVars[ch]->work_buf_int32,
    445                               &pVars->sideInfo.ch[ch].gran[gr],
    446                               &pChVars[ ch]->used_freq_lines,
    447                               info,
    448                               pVars->Scratch_mem);
    449 
    450                 pvmp3_alias_reduction(pChVars[ch]->work_buf_int32,
    451                                       &pVars->sideInfo.ch[ch].gran[gr],
    452                                       &pChVars[ ch]->used_freq_lines,
    453                                       info);
    454 
    455 
    456                 /*
    457                  *   IMDCT
    458                  */
    459                 /* set mxposition
    460                  * In case of mixed blocks, # of bands with long
    461                  * blocks (2 or 4) else 0
    462                  */
    463                 uint16 mixedBlocksLongBlocks = 0; /*  0 = long or short, 2=mixed, 4=mixed 2.5@8000 */
    464                 if (pVars->sideInfo.ch[ch].gran[gr].mixed_block_flag &&
    465                         pVars->sideInfo.ch[ch].gran[gr].window_switching_flag)
    466                 {
    467                     if ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2))
    468                     {
    469                         mixedBlocksLongBlocks = 4; /* mpeg2.5 @ 8 KHz */
    470                     }
    471                     else
    472                     {
    473                         mixedBlocksLongBlocks = 2;
    474                     }
    475                 }
    476 
    477                 pvmp3_imdct_synth(pChVars[ch]->work_buf_int32,
    478                                   pChVars[ch]->overlap,
    479                                   pVars->sideInfo.ch[ch].gran[gr].block_type,
    480                                   mixedBlocksLongBlocks,
    481                                   pChVars[ ch]->used_freq_lines,
    482                                   pVars->Scratch_mem);
    483 
    484 
    485                 /*
    486                  *   Polyphase synthesis
    487                  */
    488 
    489                 pvmp3_poly_phase_synthesis(pChVars[ch],
    490                                            pVars->num_channels,
    491                                            pExt->equalizerType,
    492                                            &ptrOutBuffer[ch]);
    493 
    494 
    495             }/* end ch loop */
    496 
    497             ptrOutBuffer += pVars->num_channels * SUBBANDS_NUMBER * FILTERBANK_BANDS;
    498         }  /*   for (gr=0;gr<Max_gr;gr++)  */
    499 
    500         /* skip ancillary data */
    501         if (info->bitrate_index > 0)
    502         { /* if not free-format */
    503 
    504             int32 ancillary_data_lenght = pVars->predicted_frame_size << 3;
    505 
    506             ancillary_data_lenght  -= pVars->inputStream.usedBits;
    507 
    508             /* skip ancillary data */
    509             if (ancillary_data_lenght > 0)
    510             {
    511                 pVars->inputStream.usedBits += ancillary_data_lenght;
    512             }
    513 
    514         }
    515 
    516         /*
    517          *  This overrides a possible NO_ENOUGH_MAIN_DATA_ERROR
    518          */
    519         errorCode = NO_DECODING_ERROR;
    520 
    521     }
    522     else
    523     {
    524         /*
    525          * The info on the header leads to an unsupported layer, more data
    526          * will not fix this, so this is a bad frame,
    527          */
    528 
    529         pExt->outputFrameSize = 0;
    530         return UNSUPPORTED_LAYER;
    531     }
    532 
    533     pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3;
    534     pExt->totalNumberOfBitsUsed += pVars->inputStream.usedBits;
    535     pExt->version = info->version_x;
    536     pExt->samplingRate = mp3_s_freq[info->version_x][info->sampling_frequency];
    537     pExt->bitRate = mp3_bitrate[pExt->version][info->bitrate_index];
    538 
    539 
    540     /*
    541      *  Always verify buffer overrun condition
    542      */
    543 
    544     if (pExt->inputBufferUsedLength > pExt->inputBufferCurrentLength)
    545     {
    546         pExt->outputFrameSize = 0;
    547         errorCode = NO_ENOUGH_MAIN_DATA_ERROR;
    548     }
    549 
    550     return errorCode;
    551 
    552 }
    553 
    554 
    555 /*----------------------------------------------------------------------------
    556 ; FUNCTION CODE
    557 ----------------------------------------------------------------------------*/
    558 
    559 __inline void fillDataBuf(tmp3Bits *pMainData,
    560                           uint32 val)       /* val to write into the buffer */
    561 {
    562     pMainData->pBuffer[module(pMainData->offset++, BUFSIZE)] = (uint8)val;
    563 }
    564 
    565 
    566 void fillMainDataBuf(void  *pMem, int32 temp)
    567 {
    568     tmp3dec_file   *pVars = (tmp3dec_file *)pMem;
    569 
    570 
    571     int32 offset = (pVars->inputStream.usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
    572 
    573     /*
    574      *  Check if input circular buffer boundaries need to be enforced
    575      */
    576     if ((offset + temp) < BUFSIZE)
    577     {
    578         uint8 * ptr = pVars->inputStream.pBuffer + offset;
    579 
    580         offset = pVars->mainDataStream.offset;
    581 
    582         /*
    583          *  Check if main data circular buffer boundaries need to be enforced
    584          */
    585         if ((offset + temp) < BUFSIZE)
    586         {
    587             pv_memcpy((pVars->mainDataStream.pBuffer + offset), ptr, temp*sizeof(uint8));
    588             pVars->mainDataStream.offset += temp;
    589         }
    590         else
    591         {
    592             int32 tmp1 = *(ptr++);
    593             for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--)  /* read main data. */
    594             {
    595                 int32 tmp2 = *(ptr++);
    596                 fillDataBuf(&pVars->mainDataStream, tmp1);
    597                 fillDataBuf(&pVars->mainDataStream, tmp2);
    598                 tmp1 = *(ptr++);
    599             }
    600 
    601             if (temp&1)
    602             {
    603                 fillDataBuf(&pVars->mainDataStream, tmp1);
    604             }
    605 
    606             /* adjust circular buffer counter */
    607             pVars->mainDataStream.offset = module(pVars->mainDataStream.offset, BUFSIZE);
    608         }
    609     }
    610     else
    611     {
    612         for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--)  /* read main data. */
    613         {
    614             fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++  , BUFSIZE)));
    615             fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++  , BUFSIZE)));
    616         }
    617         if (temp&1)
    618         {
    619             fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset  , BUFSIZE)));
    620         }
    621     }
    622 
    623 
    624     pVars->inputStream.usedBits += (temp) << INBUF_ARRAY_INDEX_SHIFT;
    625 }
    626 
    627 
    628 
    629 
    630 /*----------------------------------------------------------------------------
    631 ; FUNCTION CODE
    632 ----------------------------------------------------------------------------*/
    633 
    634 uint32 pvmp3_decoderMemRequirements(void)
    635 {
    636     uint32 size;
    637 
    638     size = (uint32) sizeof(tmp3dec_file);
    639     return (size);
    640 }
    641 
    642 
    643 
    644 /*----------------------------------------------------------------------------
    645 ; FUNCTION CODE
    646 ----------------------------------------------------------------------------*/
    647 
    648 #include "pvmp3_decode_huff_cw.h"
    649 
    650 void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt,
    651                        void  *pMem)
    652 {
    653 
    654     tmp3dec_file      *pVars;
    655     huffcodetab       *pHuff;
    656 
    657     pVars = (tmp3dec_file *)pMem;
    658 
    659     pVars->num_channels = 0;
    660 
    661     pExt->totalNumberOfBitsUsed = 0;
    662     pExt->inputBufferCurrentLength = 0;
    663     pExt->inputBufferUsedLength    = 0;
    664 
    665     pVars->mainDataStream.offset = 0;
    666 
    667     pv_memset((void*)pVars->mainDataBuffer,
    668               0,
    669               BUFSIZE*sizeof(*pVars->mainDataBuffer));
    670 
    671 
    672     pVars->inputStream.pBuffer = pExt->pInputBuffer;
    673 
    674     /*
    675      *  Initialize huffman decoding table
    676      */
    677 
    678     pHuff = pVars->ht;
    679     pHuff[0].linbits = 0;
    680     pHuff[0].pdec_huff_tab = pvmp3_decode_huff_cw_tab0;
    681     pHuff[1].linbits = 0;
    682     pHuff[1].pdec_huff_tab = pvmp3_decode_huff_cw_tab1;
    683     pHuff[2].linbits = 0;
    684     pHuff[2].pdec_huff_tab = pvmp3_decode_huff_cw_tab2;
    685     pHuff[3].linbits = 0;
    686     pHuff[3].pdec_huff_tab = pvmp3_decode_huff_cw_tab3;
    687     pHuff[4].linbits = 0;
    688     pHuff[4].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 4 is not used */
    689     pHuff[5].linbits = 4;
    690     pHuff[5].pdec_huff_tab = pvmp3_decode_huff_cw_tab5;
    691     pHuff[6].linbits = 0;
    692     pHuff[6].pdec_huff_tab = pvmp3_decode_huff_cw_tab6;
    693     pHuff[7].linbits = 0;
    694     pHuff[7].pdec_huff_tab = pvmp3_decode_huff_cw_tab7;
    695     pHuff[8].linbits = 0;
    696     pHuff[8].pdec_huff_tab = pvmp3_decode_huff_cw_tab8;
    697     pHuff[9].linbits = 0;
    698     pHuff[9].pdec_huff_tab = pvmp3_decode_huff_cw_tab9;
    699     pHuff[10].linbits = 0;
    700     pHuff[10].pdec_huff_tab = pvmp3_decode_huff_cw_tab10;
    701     pHuff[11].linbits = 0;
    702     pHuff[11].pdec_huff_tab = pvmp3_decode_huff_cw_tab11;
    703     pHuff[12].linbits = 0;
    704     pHuff[12].pdec_huff_tab = pvmp3_decode_huff_cw_tab12;
    705     pHuff[13].linbits = 0;
    706     pHuff[13].pdec_huff_tab = pvmp3_decode_huff_cw_tab13;
    707     pHuff[14].linbits = 0;
    708     pHuff[14].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 14 is not used */
    709     pHuff[15].linbits = 0;
    710     pHuff[15].pdec_huff_tab = pvmp3_decode_huff_cw_tab15;
    711     pHuff[16].linbits = 1;
    712     pHuff[16].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    713     pHuff[17].linbits = 2;
    714     pHuff[17].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    715     pHuff[18].linbits = 3;
    716     pHuff[18].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    717     pHuff[19].linbits = 4;
    718     pHuff[19].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    719     pHuff[20].linbits = 6;
    720     pHuff[20].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    721     pHuff[21].linbits = 8;
    722     pHuff[21].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    723     pHuff[22].linbits = 10;
    724     pHuff[22].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    725     pHuff[23].linbits = 13;
    726     pHuff[23].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
    727     pHuff[24].linbits = 4;
    728     pHuff[24].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    729     pHuff[25].linbits = 5;
    730     pHuff[25].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    731     pHuff[26].linbits = 6;
    732     pHuff[26].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    733     pHuff[27].linbits = 7;
    734     pHuff[27].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    735     pHuff[28].linbits = 8;
    736     pHuff[28].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    737     pHuff[29].linbits = 9;
    738     pHuff[29].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    739     pHuff[30].linbits = 11;
    740     pHuff[30].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    741     pHuff[31].linbits = 13;
    742     pHuff[31].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
    743     pHuff[32].linbits = 0;
    744     pHuff[32].pdec_huff_tab = pvmp3_decode_huff_cw_tab32;
    745     pHuff[33].linbits = 0;
    746     pHuff[33].pdec_huff_tab = pvmp3_decode_huff_cw_tab33;
    747 
    748     /*
    749      *  Initialize polysynthesis circular buffer mechanism
    750      */
    751     /* clear buffers */
    752 
    753     pvmp3_resetDecoder(pMem);
    754 
    755 }
    756 
    757 
    758 /*----------------------------------------------------------------------------
    759 ; FUNCTION CODE
    760 ----------------------------------------------------------------------------*/
    761 
    762 
    763 void pvmp3_resetDecoder(void  *pMem)
    764 {
    765 
    766     tmp3dec_file      *pVars;
    767     tmp3dec_chan      *pChVars[CHAN];
    768 
    769     pVars = (tmp3dec_file *)pMem;
    770     pChVars[ LEFT] = &pVars->perChan[ LEFT];
    771     pChVars[RIGHT] = &pVars->perChan[RIGHT];
    772 
    773     pVars->frame_start = 0;
    774 
    775     pVars->mainDataStream.offset = 0;
    776 
    777     pVars->mainDataStream.pBuffer =  pVars->mainDataBuffer;
    778     pVars->mainDataStream.usedBits = 0;
    779 
    780 
    781     pVars->inputStream.usedBits = 0; // in bits
    782 
    783 
    784     pChVars[ LEFT]->used_freq_lines = 575;
    785     pChVars[RIGHT]->used_freq_lines = 575;
    786 
    787 
    788     /*
    789      *  Initialize polysynthesis circular buffer mechanism
    790      */
    791 
    792     pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576],
    793               0,
    794               480*sizeof(pChVars[ LEFT]->circ_buffer[0]));
    795     pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576],
    796               0,
    797               480*sizeof(pChVars[RIGHT]->circ_buffer[0]));
    798 
    799 
    800     pv_memset((void*)pChVars[ LEFT]->overlap,
    801               0,
    802               SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ LEFT]->overlap[0]));
    803 
    804 
    805     pv_memset((void*)pChVars[ RIGHT]->overlap,
    806               0,
    807               SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ RIGHT]->overlap[0]));
    808 
    809 
    810 
    811 
    812 
    813     /*
    814      *  Clear all the structures
    815      */
    816 
    817 
    818     pv_memset((void*)&pVars->scaleFactors[RIGHT],
    819               0,
    820               sizeof(mp3ScaleFactors));
    821 
    822     pv_memset((void*)&pVars->scaleFactors[LEFT],
    823               0,
    824               sizeof(mp3ScaleFactors));
    825 
    826     pv_memset((void*)&pVars->sideInfo,
    827               0,
    828               sizeof(mp3SideInfo));
    829 
    830     pv_memset((void*)&pVars->sideInfo,
    831               0,
    832               sizeof(mp3SideInfo));
    833 
    834 }
    835