summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp')
-rw-r--r--media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp834
1 files changed, 0 insertions, 834 deletions
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
deleted file mode 100644
index 26bc25c..0000000
--- a/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
+++ /dev/null
@@ -1,834 +0,0 @@
-/* ------------------------------------------------------------------
- * Copyright (C) 1998-2009 PacketVideo
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- * -------------------------------------------------------------------
- */
-/*
-------------------------------------------------------------------------------
-
- PacketVideo Corp.
- MP3 Decoder Library
-
- Filename: pvmp3_framedecoder.cpp
-
- Functions:
- pvmp3_framedecoder
- pvmp3_InitDecoder
- pvmp3_resetDecoder
-
- Date: 09/21/2007
-
-------------------------------------------------------------------------------
- REVISION HISTORY
-
-
- Description:
-
-------------------------------------------------------------------------------
- INPUT AND OUTPUT DEFINITIONS
-
-Input
- pExt = pointer to the external interface structure. See the file
- pvmp3decoder_api.h for a description of each field.
- Data type of pointer to a tPVMP3DecoderExternal
- structure.
-
- pMem = void pointer to hide the internal implementation of the library
- It is cast back to a tmp3dec_file structure. This structure
- contains information that needs to persist between calls to
- this function, or is too big to be placed on the stack, even
- though the data is only needed during execution of this function
- Data type void pointer, internally pointer to a tmp3dec_file
- structure.
-
-
- Outputs:
- status = ERROR condition. see structure ERROR_CODE
-
- Pointers and Buffers Modified:
- pMem contents are modified.
- pExt: (more detail in the file pvmp3decoder_api.h)
- inputBufferUsedLength - number of array elements used up by the stream.
- samplingRate - sampling rate in samples per sec
- bitRate - bit rate in bits per second, varies frame to frame.
-
-
-
-------------------------------------------------------------------------------
- FUNCTIONS DESCRIPTION
-
- pvmp3_framedecoder
- frame decoder library driver
- pvmp3_InitDecoder
- Decoder Initialization
- pvmp3_resetDecoder
- Reset Decoder
-
-------------------------------------------------------------------------------
- REQUIREMENTS
-
-
-------------------------------------------------------------------------------
- REFERENCES
-
- [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
- ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
-
-------------------------------------------------------------------------------
- PSEUDO-CODE
-
-------------------------------------------------------------------------------
-*/
-
-
-/*----------------------------------------------------------------------------
-; INCLUDES
-----------------------------------------------------------------------------*/
-
-
-#include "pvmp3_framedecoder.h"
-#include "pvmp3_dec_defs.h"
-#include "pvmp3_poly_phase_synthesis.h"
-#include "pvmp3_tables.h"
-#include "pvmp3_imdct_synth.h"
-#include "pvmp3_alias_reduction.h"
-#include "pvmp3_reorder.h"
-#include "pvmp3_dequantize_sample.h"
-#include "pvmp3_stereo_proc.h"
-#include "pvmp3_mpeg2_stereo_proc.h"
-#include "pvmp3_get_side_info.h"
-#include "pvmp3_get_scale_factors.h"
-#include "pvmp3_mpeg2_get_scale_factors.h"
-#include "pvmp3_decode_header.h"
-#include "pvmp3_get_main_data_size.h"
-#include "s_tmp3dec_file.h"
-#include "pvmp3_getbits.h"
-#include "mp3_mem_funcs.h"
-
-
-/*----------------------------------------------------------------------------
-; MACROS
-; Define module specific macros here
-----------------------------------------------------------------------------*/
-
-
-/*----------------------------------------------------------------------------
-; DEFINES
-; Include all pre-processor statements here. Include conditional
-; compile variables also.
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; LOCAL FUNCTION DEFINITIONS
-; Function Prototype declaration
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; LOCAL STORE/BUFFER/POINTER DEFINITIONS
-; Variable declaration - defined here and used outside this module
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; EXTERNAL FUNCTION REFERENCES
-; Declare functions defined elsewhere and referenced in this module
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
-; Declare variables used in this module but defined elsewhere
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; FUNCTION CODE
-----------------------------------------------------------------------------*/
-
-ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt,
- void *pMem)
-{
-
- ERROR_CODE errorCode = NO_DECODING_ERROR;
-
- int32 crc_error_count = 0;
- uint32 sent_crc = 0;
- uint32 computed_crc = 0;
-
- tmp3dec_chan *pChVars[CHAN];
- tmp3dec_file *pVars = (tmp3dec_file *)pMem;
-
- mp3Header info_data;
- mp3Header *info = &info_data;
-
- pVars->inputStream.pBuffer = pExt->pInputBuffer;
-
-
- pVars->inputStream.usedBits = pExt->inputBufferUsedLength << 3;
- pVars->inputStream.inputBufferCurrentLength = pExt->inputBufferCurrentLength;
-
-
- errorCode = pvmp3_decode_header(&pVars->inputStream,
- info,
- &computed_crc);
-
- if (errorCode != NO_DECODING_ERROR)
- {
- pExt->outputFrameSize = 0;
- return errorCode;
- }
-
- pVars->num_channels = (info->mode == MPG_MD_MONO) ? 1 : 2;
- pExt->num_channels = pVars->num_channels;
-
- int32 outputFrameSize = (info->version_x == MPEG_1) ?
- 2 * SUBBANDS_NUMBER * FILTERBANK_BANDS :
- SUBBANDS_NUMBER * FILTERBANK_BANDS;
-
- outputFrameSize = (info->mode == MPG_MD_MONO) ? outputFrameSize : outputFrameSize << 1;
-
-
- /*
- * Check if output buffer has enough room to hold output PCM
- */
- if (pExt->outputFrameSize >= outputFrameSize)
- {
- pExt->outputFrameSize = outputFrameSize;
- }
- else
- {
- pExt->outputFrameSize = 0;
- return OUTPUT_BUFFER_TOO_SMALL;
- }
-
-
- pChVars[ LEFT] = &pVars->perChan[ LEFT];
- pChVars[RIGHT] = &pVars->perChan[RIGHT];
-
-
-
-
- if (info->error_protection)
- {
- /*
- * Get crc content
- */
- sent_crc = getUpTo17bits(&pVars->inputStream, 16);
- }
-
-
- if (info->layer_description == 3)
- {
- int32 gr;
- int32 ch;
- uint32 main_data_end;
- int32 bytes_to_discard;
- int16 *ptrOutBuffer = pExt->pOutputBuffer;
-
- /*
- * Side Information must be extracted from the bitstream and store for use
- * during the decoded of the associated frame
- */
-
- errorCode = pvmp3_get_side_info(&pVars->inputStream,
- &pVars->sideInfo,
- info,
- &computed_crc);
-
- if (errorCode != NO_DECODING_ERROR)
- {
- pExt->outputFrameSize = 0;
- return errorCode;
- }
-
- /*
- * If CRC was sent, check that matches the one got while parsing data
- * disable crc if this is the desired mode
- */
- if (info->error_protection)
- {
- if ((computed_crc != sent_crc) && pExt->crcEnabled)
- {
- crc_error_count++;
- }
- }
-
- /*
- * main data (scalefactors, Huffman coded, etc,) are not necessarily located
- * adjacent to the side-info. Beginning of main data is located using
- * field "main_data_begin" of the current frame. The length does not include
- * header and side info.
- * "main_data_begin" points to the first bit of main data of a frame. It is a negative
- * offset in bytes from the first byte of the sync word
- * main_data_begin = 0 <===> main data start rigth after side info.
- */
-
- int32 temp = pvmp3_get_main_data_size(info, pVars);
-
-
- /*
- * Check if available data holds a full frame, if not flag an error
- */
-
- if ((uint32)pVars->predicted_frame_size > pVars->inputStream.inputBufferCurrentLength)
- {
- pExt->outputFrameSize = 0;
- return NO_ENOUGH_MAIN_DATA_ERROR;
- }
-
- /*
- * Fill in internal circular buffer
- */
- fillMainDataBuf(pVars, temp);
-
-
- main_data_end = pVars->mainDataStream.usedBits >> 3; /* in bytes */
- if ((main_data_end << 3) < pVars->mainDataStream.usedBits)
- {
- main_data_end++;
- pVars->mainDataStream.usedBits = main_data_end << 3;
- }
-
-
- bytes_to_discard = pVars->frame_start - pVars->sideInfo.main_data_begin - main_data_end;
-
-
- if (main_data_end > BUFSIZE) /* check overflow on the buffer */
- {
- pVars->frame_start -= BUFSIZE;
-
- pVars->mainDataStream.usedBits -= (BUFSIZE << 3);
- }
-
- pVars->frame_start += temp;
-
-
- if (bytes_to_discard < 0 || crc_error_count)
- {
- /*
- * Not enough data to decode, then we should avoid reading this
- * data ( getting/ignoring sido info and scale data)
- * Main data could be located in the previous frame, so an unaccounted
- * frame can cause incorrect processing
- * Just run the polyphase filter to "clean" the history buffer
- */
- errorCode = NO_ENOUGH_MAIN_DATA_ERROR;
-
- /*
- * Clear the input to these filters
- */
-
- pv_memset((void*)pChVars[RIGHT]->work_buf_int32,
- 0,
- SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[RIGHT]->work_buf_int32[0]));
-
- pv_memset((void*)pChVars[LEFT]->work_buf_int32,
- 0,
- SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[LEFT]->work_buf_int32[0]));
-
- /* clear circular buffers, to avoid any glitch */
- pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576],
- 0,
- 480*sizeof(pChVars[ LEFT]->circ_buffer[0]));
- pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576],
- 0,
- 480*sizeof(pChVars[RIGHT]->circ_buffer[0]));
-
- pChVars[ LEFT]->used_freq_lines = 575;
- pChVars[RIGHT]->used_freq_lines = 575;
-
- }
- else
- {
- pVars->mainDataStream.usedBits += (bytes_to_discard << 3);
- }
-
- /*
- * if (fr_ps->header->version_x == MPEG_1), use 2 granules, otherwise just 1
- */
- for (gr = 0; gr < (1 + !(info->version_x)); gr++)
- {
- if (errorCode != NO_ENOUGH_MAIN_DATA_ERROR)
- {
- for (ch = 0; ch < pVars->num_channels; ch++)
- {
- int32 part2_start = pVars->mainDataStream.usedBits;
-
- if (info->version_x == MPEG_1)
- {
-
- pvmp3_get_scale_factors(&pVars->scaleFactors[ch],
- &pVars->sideInfo,
- gr,
- ch,
- &pVars->mainDataStream);
- }
- else
- {
- int32 * tmp = pVars->Scratch_mem;
- pvmp3_mpeg2_get_scale_factors(&pVars->scaleFactors[ch],
- &pVars->sideInfo,
- gr,
- ch,
- info,
- (uint32 *)tmp,
- &pVars->mainDataStream);
- }
-
- pChVars[ch]->used_freq_lines = pvmp3_huffman_parsing(pChVars[ch]->work_buf_int32,
- &pVars->sideInfo.ch[ch].gran[gr],
- pVars,
- part2_start,
- info);
-
-
- pvmp3_dequantize_sample(pChVars[ch]->work_buf_int32,
- &pVars->scaleFactors[ch],
- &pVars->sideInfo.ch[ch].gran[gr],
- pChVars[ch]->used_freq_lines,
- info);
-
-
-
-
- } /* for (ch=0; ch<stereo; ch++) */
-
- if (pVars->num_channels == 2)
- {
-
- int32 used_freq_lines = (pChVars[ LEFT]->used_freq_lines >
- pChVars[RIGHT]->used_freq_lines) ?
- pChVars[ LEFT]->used_freq_lines :
- pChVars[RIGHT]->used_freq_lines;
-
- pChVars[ LEFT]->used_freq_lines = used_freq_lines;
- pChVars[RIGHT]->used_freq_lines = used_freq_lines;
-
- if (info->version_x == MPEG_1)
- {
- pvmp3_stereo_proc(pChVars[ LEFT]->work_buf_int32,
- pChVars[RIGHT]->work_buf_int32,
- &pVars->scaleFactors[RIGHT],
- &pVars->sideInfo.ch[LEFT].gran[gr],
- used_freq_lines,
- info);
- }
- else
- {
- int32 * tmp = pVars->Scratch_mem;
- pvmp3_mpeg2_stereo_proc(pChVars[ LEFT]->work_buf_int32,
- pChVars[RIGHT]->work_buf_int32,
- &pVars->scaleFactors[RIGHT],
- &pVars->sideInfo.ch[ LEFT].gran[gr],
- &pVars->sideInfo.ch[RIGHT].gran[gr],
- (uint32 *)tmp,
- used_freq_lines,
- info);
- }
- }
-
- } /* if ( errorCode != NO_ENOUGH_MAIN_DATA_ERROR) */
-
- for (ch = 0; ch < pVars->num_channels; ch++)
- {
-
- pvmp3_reorder(pChVars[ch]->work_buf_int32,
- &pVars->sideInfo.ch[ch].gran[gr],
- &pChVars[ ch]->used_freq_lines,
- info,
- pVars->Scratch_mem);
-
- pvmp3_alias_reduction(pChVars[ch]->work_buf_int32,
- &pVars->sideInfo.ch[ch].gran[gr],
- &pChVars[ ch]->used_freq_lines,
- info);
-
-
- /*
- * IMDCT
- */
- /* set mxposition
- * In case of mixed blocks, # of bands with long
- * blocks (2 or 4) else 0
- */
- uint16 mixedBlocksLongBlocks = 0; /* 0 = long or short, 2=mixed, 4=mixed 2.5@8000 */
- if (pVars->sideInfo.ch[ch].gran[gr].mixed_block_flag &&
- pVars->sideInfo.ch[ch].gran[gr].window_switching_flag)
- {
- if ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2))
- {
- mixedBlocksLongBlocks = 4; /* mpeg2.5 @ 8 KHz */
- }
- else
- {
- mixedBlocksLongBlocks = 2;
- }
- }
-
- pvmp3_imdct_synth(pChVars[ch]->work_buf_int32,
- pChVars[ch]->overlap,
- pVars->sideInfo.ch[ch].gran[gr].block_type,
- mixedBlocksLongBlocks,
- pChVars[ ch]->used_freq_lines,
- pVars->Scratch_mem);
-
-
- /*
- * Polyphase synthesis
- */
-
- pvmp3_poly_phase_synthesis(pChVars[ch],
- pVars->num_channels,
- pExt->equalizerType,
- &ptrOutBuffer[ch]);
-
-
- }/* end ch loop */
-
- ptrOutBuffer += pVars->num_channels * SUBBANDS_NUMBER * FILTERBANK_BANDS;
- } /* for (gr=0;gr<Max_gr;gr++) */
-
- /* skip ancillary data */
- if (info->bitrate_index > 0)
- { /* if not free-format */
-
- int32 ancillary_data_lenght = pVars->predicted_frame_size << 3;
-
- ancillary_data_lenght -= pVars->inputStream.usedBits;
-
- /* skip ancillary data */
- if (ancillary_data_lenght > 0)
- {
- pVars->inputStream.usedBits += ancillary_data_lenght;
- }
-
- }
-
- /*
- * This overrides a possible NO_ENOUGH_MAIN_DATA_ERROR
- */
- errorCode = NO_DECODING_ERROR;
-
- }
- else
- {
- /*
- * The info on the header leads to an unsupported layer, more data
- * will not fix this, so this is a bad frame,
- */
-
- pExt->outputFrameSize = 0;
- return UNSUPPORTED_LAYER;
- }
-
- pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3;
- pExt->totalNumberOfBitsUsed += pVars->inputStream.usedBits;
- pExt->version = info->version_x;
- pExt->samplingRate = mp3_s_freq[info->version_x][info->sampling_frequency];
- pExt->bitRate = mp3_bitrate[pExt->version][info->bitrate_index];
-
-
- /*
- * Always verify buffer overrun condition
- */
-
- if (pExt->inputBufferUsedLength > pExt->inputBufferCurrentLength)
- {
- pExt->outputFrameSize = 0;
- errorCode = NO_ENOUGH_MAIN_DATA_ERROR;
- }
-
- return errorCode;
-
-}
-
-
-/*----------------------------------------------------------------------------
-; FUNCTION CODE
-----------------------------------------------------------------------------*/
-
-__inline void fillDataBuf(tmp3Bits *pMainData,
- uint32 val) /* val to write into the buffer */
-{
- pMainData->pBuffer[module(pMainData->offset++, BUFSIZE)] = (uint8)val;
-}
-
-
-void fillMainDataBuf(void *pMem, int32 temp)
-{
- tmp3dec_file *pVars = (tmp3dec_file *)pMem;
-
-
- int32 offset = (pVars->inputStream.usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
-
- /*
- * Check if input circular buffer boundaries need to be enforced
- */
- if ((offset + temp) < BUFSIZE)
- {
- uint8 * ptr = pVars->inputStream.pBuffer + offset;
-
- offset = pVars->mainDataStream.offset;
-
- /*
- * Check if main data circular buffer boundaries need to be enforced
- */
- if ((offset + temp) < BUFSIZE)
- {
- pv_memcpy((pVars->mainDataStream.pBuffer + offset), ptr, temp*sizeof(uint8));
- pVars->mainDataStream.offset += temp;
- }
- else
- {
- int32 tmp1 = *(ptr++);
- for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--) /* read main data. */
- {
- int32 tmp2 = *(ptr++);
- fillDataBuf(&pVars->mainDataStream, tmp1);
- fillDataBuf(&pVars->mainDataStream, tmp2);
- tmp1 = *(ptr++);
- }
-
- if (temp&1)
- {
- fillDataBuf(&pVars->mainDataStream, tmp1);
- }
-
- /* adjust circular buffer counter */
- pVars->mainDataStream.offset = module(pVars->mainDataStream.offset, BUFSIZE);
- }
- }
- else
- {
- for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--) /* read main data. */
- {
- fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++ , BUFSIZE)));
- fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++ , BUFSIZE)));
- }
- if (temp&1)
- {
- fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset , BUFSIZE)));
- }
- }
-
-
- pVars->inputStream.usedBits += (temp) << INBUF_ARRAY_INDEX_SHIFT;
-}
-
-
-
-
-/*----------------------------------------------------------------------------
-; FUNCTION CODE
-----------------------------------------------------------------------------*/
-
-uint32 pvmp3_decoderMemRequirements(void)
-{
- uint32 size;
-
- size = (uint32) sizeof(tmp3dec_file);
- return (size);
-}
-
-
-
-/*----------------------------------------------------------------------------
-; FUNCTION CODE
-----------------------------------------------------------------------------*/
-
-#include "pvmp3_decode_huff_cw.h"
-
-void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt,
- void *pMem)
-{
-
- tmp3dec_file *pVars;
- huffcodetab *pHuff;
-
- pVars = (tmp3dec_file *)pMem;
-
- pVars->num_channels = 0;
-
- pExt->totalNumberOfBitsUsed = 0;
- pExt->inputBufferCurrentLength = 0;
- pExt->inputBufferUsedLength = 0;
-
- pVars->mainDataStream.offset = 0;
-
- pv_memset((void*)pVars->mainDataBuffer,
- 0,
- BUFSIZE*sizeof(*pVars->mainDataBuffer));
-
-
- pVars->inputStream.pBuffer = pExt->pInputBuffer;
-
- /*
- * Initialize huffman decoding table
- */
-
- pHuff = pVars->ht;
- pHuff[0].linbits = 0;
- pHuff[0].pdec_huff_tab = pvmp3_decode_huff_cw_tab0;
- pHuff[1].linbits = 0;
- pHuff[1].pdec_huff_tab = pvmp3_decode_huff_cw_tab1;
- pHuff[2].linbits = 0;
- pHuff[2].pdec_huff_tab = pvmp3_decode_huff_cw_tab2;
- pHuff[3].linbits = 0;
- pHuff[3].pdec_huff_tab = pvmp3_decode_huff_cw_tab3;
- pHuff[4].linbits = 0;
- pHuff[4].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 4 is not used */
- pHuff[5].linbits = 4;
- pHuff[5].pdec_huff_tab = pvmp3_decode_huff_cw_tab5;
- pHuff[6].linbits = 0;
- pHuff[6].pdec_huff_tab = pvmp3_decode_huff_cw_tab6;
- pHuff[7].linbits = 0;
- pHuff[7].pdec_huff_tab = pvmp3_decode_huff_cw_tab7;
- pHuff[8].linbits = 0;
- pHuff[8].pdec_huff_tab = pvmp3_decode_huff_cw_tab8;
- pHuff[9].linbits = 0;
- pHuff[9].pdec_huff_tab = pvmp3_decode_huff_cw_tab9;
- pHuff[10].linbits = 0;
- pHuff[10].pdec_huff_tab = pvmp3_decode_huff_cw_tab10;
- pHuff[11].linbits = 0;
- pHuff[11].pdec_huff_tab = pvmp3_decode_huff_cw_tab11;
- pHuff[12].linbits = 0;
- pHuff[12].pdec_huff_tab = pvmp3_decode_huff_cw_tab12;
- pHuff[13].linbits = 0;
- pHuff[13].pdec_huff_tab = pvmp3_decode_huff_cw_tab13;
- pHuff[14].linbits = 0;
- pHuff[14].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 14 is not used */
- pHuff[15].linbits = 0;
- pHuff[15].pdec_huff_tab = pvmp3_decode_huff_cw_tab15;
- pHuff[16].linbits = 1;
- pHuff[16].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[17].linbits = 2;
- pHuff[17].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[18].linbits = 3;
- pHuff[18].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[19].linbits = 4;
- pHuff[19].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[20].linbits = 6;
- pHuff[20].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[21].linbits = 8;
- pHuff[21].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[22].linbits = 10;
- pHuff[22].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[23].linbits = 13;
- pHuff[23].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
- pHuff[24].linbits = 4;
- pHuff[24].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[25].linbits = 5;
- pHuff[25].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[26].linbits = 6;
- pHuff[26].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[27].linbits = 7;
- pHuff[27].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[28].linbits = 8;
- pHuff[28].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[29].linbits = 9;
- pHuff[29].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[30].linbits = 11;
- pHuff[30].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[31].linbits = 13;
- pHuff[31].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
- pHuff[32].linbits = 0;
- pHuff[32].pdec_huff_tab = pvmp3_decode_huff_cw_tab32;
- pHuff[33].linbits = 0;
- pHuff[33].pdec_huff_tab = pvmp3_decode_huff_cw_tab33;
-
- /*
- * Initialize polysynthesis circular buffer mechanism
- */
- /* clear buffers */
-
- pvmp3_resetDecoder(pMem);
-
-}
-
-
-/*----------------------------------------------------------------------------
-; FUNCTION CODE
-----------------------------------------------------------------------------*/
-
-
-void pvmp3_resetDecoder(void *pMem)
-{
-
- tmp3dec_file *pVars;
- tmp3dec_chan *pChVars[CHAN];
-
- pVars = (tmp3dec_file *)pMem;
- pChVars[ LEFT] = &pVars->perChan[ LEFT];
- pChVars[RIGHT] = &pVars->perChan[RIGHT];
-
- pVars->frame_start = 0;
-
- pVars->mainDataStream.offset = 0;
-
- pVars->mainDataStream.pBuffer = pVars->mainDataBuffer;
- pVars->mainDataStream.usedBits = 0;
-
-
- pVars->inputStream.usedBits = 0; // in bits
-
-
- pChVars[ LEFT]->used_freq_lines = 575;
- pChVars[RIGHT]->used_freq_lines = 575;
-
-
- /*
- * Initialize polysynthesis circular buffer mechanism
- */
-
- pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576],
- 0,
- 480*sizeof(pChVars[ LEFT]->circ_buffer[0]));
- pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576],
- 0,
- 480*sizeof(pChVars[RIGHT]->circ_buffer[0]));
-
-
- pv_memset((void*)pChVars[ LEFT]->overlap,
- 0,
- SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ LEFT]->overlap[0]));
-
-
- pv_memset((void*)pChVars[ RIGHT]->overlap,
- 0,
- SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ RIGHT]->overlap[0]));
-
-
-
-
-
- /*
- * Clear all the structures
- */
-
-
- pv_memset((void*)&pVars->scaleFactors[RIGHT],
- 0,
- sizeof(mp3ScaleFactors));
-
- pv_memset((void*)&pVars->scaleFactors[LEFT],
- 0,
- sizeof(mp3ScaleFactors));
-
- pv_memset((void*)&pVars->sideInfo,
- 0,
- sizeof(mp3SideInfo));
-
- pv_memset((void*)&pVars->sideInfo,
- 0,
- sizeof(mp3SideInfo));
-
-}