1250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/* ------------------------------------------------------------------ 2250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Copyright (C) 1998-2009 PacketVideo 3250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * 4250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * you may not use this file except in compliance with the License. 6250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * You may obtain a copy of the License at 7250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * 8250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * 10250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Unless required by applicable law or agreed to in writing, software 11250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * express or implied. 14250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * See the License for the specific language governing permissions 15250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * and limitations under the License. 16250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * ------------------------------------------------------------------- 17250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 18250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/* 19250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 20250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 21250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PacketVideo Corp. 22250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber MP3 Decoder Library 23250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 24250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Filename: pvmp3_framedecoder.cpp 25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Functions: 27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_framedecoder 28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_InitDecoder 29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_resetDecoder 30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Date: 09/21/2007 32250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 33250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 34250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY 35250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 36250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 37250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description: 38250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 39250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 40250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS 41250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 42250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberInput 43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt = pointer to the external interface structure. See the file 44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3decoder_api.h for a description of each field. 45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Data type of pointer to a tPVMP3DecoderExternal 46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber structure. 47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pMem = void pointer to hide the internal implementation of the library 49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber It is cast back to a tmp3dec_file structure. This structure 50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber contains information that needs to persist between calls to 51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber this function, or is too big to be placed on the stack, even 52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber though the data is only needed during execution of this function 53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Data type void pointer, internally pointer to a tmp3dec_file 54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber structure. 55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Outputs: 58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber status = ERROR condition. see structure ERROR_CODE 59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Pointers and Buffers Modified: 61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pMem contents are modified. 62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt: (more detail in the file pvmp3decoder_api.h) 63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber inputBufferUsedLength - number of array elements used up by the stream. 64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber samplingRate - sampling rate in samples per sec 65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber bitRate - bit rate in bits per second, varies frame to frame. 66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTIONS DESCRIPTION 71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_framedecoder 73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber frame decoder library driver 74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_InitDecoder 75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Decoder Initialization 76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_resetDecoder 77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Reset Decoder 78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS 81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES 85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996) 87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension 88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE 91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------ 93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/ 94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; INCLUDES 98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_framedecoder.h" 102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_dec_defs.h" 103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_poly_phase_synthesis.h" 104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_tables.h" 105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_imdct_synth.h" 106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_alias_reduction.h" 107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_reorder.h" 108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_dequantize_sample.h" 109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_stereo_proc.h" 110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_mpeg2_stereo_proc.h" 111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_get_side_info.h" 112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_get_scale_factors.h" 113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_mpeg2_get_scale_factors.h" 114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_decode_header.h" 115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_get_main_data_size.h" 116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "s_tmp3dec_file.h" 117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_getbits.h" 118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "mp3_mem_funcs.h" 119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; MACROS 123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Define module specific macros here 124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; DEFINES 129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Include all pre-processor statements here. Include conditional 130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; compile variables also. 131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL FUNCTION DEFINITIONS 135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Function Prototype declaration 136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Variable declaration - defined here and used outside this module 141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL FUNCTION REFERENCES 145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare functions defined elsewhere and referenced in this module 146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare variables used in this module but defined elsewhere 151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE 155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt, 158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber void *pMem) 159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{ 160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber ERROR_CODE errorCode = NO_DECODING_ERROR; 162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 crc_error_count = 0; 164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint32 sent_crc = 0; 165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint32 computed_crc = 0; 166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp3dec_chan *pChVars[CHAN]; 168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp3dec_file *pVars = (tmp3dec_file *)pMem; 169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber mp3Header info_data; 171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber mp3Header *info = &info_data; 172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.pBuffer = pExt->pInputBuffer; 174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.usedBits = pExt->inputBufferUsedLength << 3; 177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.inputBufferCurrentLength = pExt->inputBufferCurrentLength; 178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber errorCode = pvmp3_decode_header(&pVars->inputStream, 181250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info, 182250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &computed_crc); 183250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 184250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (errorCode != NO_DECODING_ERROR) 185250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 186250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = 0; 187250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return errorCode; 188250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 189250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 190250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->num_channels = (info->mode == MPG_MD_MONO) ? 1 : 2; 191250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->num_channels = pVars->num_channels; 192250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 193250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 outputFrameSize = (info->version_x == MPEG_1) ? 194250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 2 * SUBBANDS_NUMBER * FILTERBANK_BANDS : 195250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber SUBBANDS_NUMBER * FILTERBANK_BANDS; 196250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 197250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber outputFrameSize = (info->mode == MPG_MD_MONO) ? outputFrameSize : outputFrameSize << 1; 198250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 199250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 200250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 201250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Check if output buffer has enough room to hold output PCM 202250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 203250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (pExt->outputFrameSize >= outputFrameSize) 204250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 205250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = outputFrameSize; 206250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 207250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 208250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 209250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = 0; 210250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return OUTPUT_BUFFER_TOO_SMALL; 211250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 212250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 213250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 214250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ LEFT] = &pVars->perChan[ LEFT]; 215250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT] = &pVars->perChan[RIGHT]; 216250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 217250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 218250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 219250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 220250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (info->error_protection) 221250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 222250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 223250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Get crc content 224250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 225250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber sent_crc = getUpTo17bits(&pVars->inputStream, 16); 226250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 227250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 228250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 229250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (info->layer_description == 3) 230250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 231250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 gr; 232250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 ch; 233250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint32 main_data_end; 234250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 bytes_to_discard; 235250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int16 *ptrOutBuffer = pExt->pOutputBuffer; 236250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 237250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 238250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Side Information must be extracted from the bitstream and store for use 239250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * during the decoded of the associated frame 240250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 241250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 242250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber errorCode = pvmp3_get_side_info(&pVars->inputStream, 243250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo, 244250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info, 245250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &computed_crc); 246250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 247250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (errorCode != NO_DECODING_ERROR) 248250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 249250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = 0; 250250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return errorCode; 251250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 252250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 253250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 254250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * If CRC was sent, check that matches the one got while parsing data 255250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * disable crc if this is the desired mode 256250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 257250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (info->error_protection) 258250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 259250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if ((computed_crc != sent_crc) && pExt->crcEnabled) 260250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 261250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber crc_error_count++; 262250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 263250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 264250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 265250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 266250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * main data (scalefactors, Huffman coded, etc,) are not necessarily located 267250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * adjacent to the side-info. Beginning of main data is located using 268250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * field "main_data_begin" of the current frame. The length does not include 269250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * header and side info. 270250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * "main_data_begin" points to the first bit of main data of a frame. It is a negative 271250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * offset in bytes from the first byte of the sync word 272250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * main_data_begin = 0 <===> main data start rigth after side info. 273250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 274250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 275250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 temp = pvmp3_get_main_data_size(info, pVars); 276250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 277250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 278250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 279250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Check if available data holds a full frame, if not flag an error 280250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 281250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 282250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if ((uint32)pVars->predicted_frame_size > pVars->inputStream.inputBufferCurrentLength) 283250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 284250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = 0; 285250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return NO_ENOUGH_MAIN_DATA_ERROR; 286250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 287250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 288250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 289250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Fill in internal circular buffer 290250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 291250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillMainDataBuf(pVars, temp); 292250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 293250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 294250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber main_data_end = pVars->mainDataStream.usedBits >> 3; /* in bytes */ 295250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if ((main_data_end << 3) < pVars->mainDataStream.usedBits) 296250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 297250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber main_data_end++; 298250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.usedBits = main_data_end << 3; 299250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 300250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 301250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 302250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber bytes_to_discard = pVars->frame_start - pVars->sideInfo.main_data_begin - main_data_end; 303250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 304250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 305250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (main_data_end > BUFSIZE) /* check overflow on the buffer */ 306250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 307250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->frame_start -= BUFSIZE; 308250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 309250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.usedBits -= (BUFSIZE << 3); 310250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 311250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 312250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->frame_start += temp; 313250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 314250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 315250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (bytes_to_discard < 0 || crc_error_count) 316250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 317250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 318250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Not enough data to decode, then we should avoid reading this 319250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * data ( getting/ignoring sido info and scale data) 320250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Main data could be located in the previous frame, so an unaccounted 321250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * frame can cause incorrect processing 322250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Just run the polyphase filter to "clean" the history buffer 323250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 324250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber errorCode = NO_ENOUGH_MAIN_DATA_ERROR; 325250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 326250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 327250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Clear the input to these filters 328250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 329250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 330250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)pChVars[RIGHT]->work_buf_int32, 331250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 332250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[RIGHT]->work_buf_int32[0])); 333250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 334250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)pChVars[LEFT]->work_buf_int32, 335250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 336250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[LEFT]->work_buf_int32[0])); 337250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 338250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* clear circular buffers, to avoid any glitch */ 339250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576], 340250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 341250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 480*sizeof(pChVars[ LEFT]->circ_buffer[0])); 342250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576], 343250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 344250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 480*sizeof(pChVars[RIGHT]->circ_buffer[0])); 345250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 346250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ LEFT]->used_freq_lines = 575; 347250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->used_freq_lines = 575; 348250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 349250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 350250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 351250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 352250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.usedBits += (bytes_to_discard << 3); 353250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 354250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 355250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 356250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * if (fr_ps->header->version_x == MPEG_1), use 2 granules, otherwise just 1 357250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 358250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber for (gr = 0; gr < (1 + !(info->version_x)); gr++) 359250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 360250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (errorCode != NO_ENOUGH_MAIN_DATA_ERROR) 361250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 362250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber for (ch = 0; ch < pVars->num_channels; ch++) 363250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 364250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 part2_start = pVars->mainDataStream.usedBits; 365250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 366250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (info->version_x == MPEG_1) 367250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 368250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 369250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_get_scale_factors(&pVars->scaleFactors[ch], 370250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo, 371250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber gr, 372250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber ch, 373250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->mainDataStream); 374250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 375250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 376250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 377250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 * tmp = pVars->Scratch_mem; 378250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_mpeg2_get_scale_factors(&pVars->scaleFactors[ch], 379250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo, 380250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber gr, 381250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber ch, 382250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info, 383250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber (uint32 *)tmp, 384250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->mainDataStream); 385250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 386250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 387250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ch]->used_freq_lines = pvmp3_huffman_parsing(pChVars[ch]->work_buf_int32, 388250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[ch].gran[gr], 389250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars, 390250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber part2_start, 391250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info); 392250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 393250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 394250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_dequantize_sample(pChVars[ch]->work_buf_int32, 395250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->scaleFactors[ch], 396250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[ch].gran[gr], 397250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ch]->used_freq_lines, 398250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info); 399250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 400250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 401250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 402250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 403250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } /* for (ch=0; ch<stereo; ch++) */ 404250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 405250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (pVars->num_channels == 2) 406250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 407250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 408250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 used_freq_lines = (pChVars[ LEFT]->used_freq_lines > 409250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->used_freq_lines) ? 410250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ LEFT]->used_freq_lines : 411250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->used_freq_lines; 412250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 413250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ LEFT]->used_freq_lines = used_freq_lines; 414250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->used_freq_lines = used_freq_lines; 415250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 416250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (info->version_x == MPEG_1) 417250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 418250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_stereo_proc(pChVars[ LEFT]->work_buf_int32, 419250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->work_buf_int32, 420250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->scaleFactors[RIGHT], 421250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[LEFT].gran[gr], 422250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber used_freq_lines, 423250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info); 424250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 425250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 426250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 427250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 * tmp = pVars->Scratch_mem; 428250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_mpeg2_stereo_proc(pChVars[ LEFT]->work_buf_int32, 429250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->work_buf_int32, 430250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->scaleFactors[RIGHT], 431250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[ LEFT].gran[gr], 432250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[RIGHT].gran[gr], 433250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber (uint32 *)tmp, 434250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber used_freq_lines, 435250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info); 436250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 437250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 438250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 439250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } /* if ( errorCode != NO_ENOUGH_MAIN_DATA_ERROR) */ 440250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 441250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber for (ch = 0; ch < pVars->num_channels; ch++) 442250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 443250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 444250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_reorder(pChVars[ch]->work_buf_int32, 445250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[ch].gran[gr], 446250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pChVars[ ch]->used_freq_lines, 447250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info, 448250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->Scratch_mem); 449250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 450250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_alias_reduction(pChVars[ch]->work_buf_int32, 451250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pVars->sideInfo.ch[ch].gran[gr], 452250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &pChVars[ ch]->used_freq_lines, 453250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber info); 454250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 455250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 456250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 457250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * IMDCT 458250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 459250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* set mxposition 460250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * In case of mixed blocks, # of bands with long 461250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * blocks (2 or 4) else 0 462250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 463250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint16 mixedBlocksLongBlocks = 0; /* 0 = long or short, 2=mixed, 4=mixed 2.5@8000 */ 464250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (pVars->sideInfo.ch[ch].gran[gr].mixed_block_flag && 465250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->sideInfo.ch[ch].gran[gr].window_switching_flag) 466250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 467250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2)) 468250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 469250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber mixedBlocksLongBlocks = 4; /* mpeg2.5 @ 8 KHz */ 470250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 471250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 472250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 473250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber mixedBlocksLongBlocks = 2; 474250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 475250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 476250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 477250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_imdct_synth(pChVars[ch]->work_buf_int32, 478250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ch]->overlap, 479250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->sideInfo.ch[ch].gran[gr].block_type, 480250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber mixedBlocksLongBlocks, 481250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ ch]->used_freq_lines, 482250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->Scratch_mem); 483250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 484250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 485250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 486250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Polyphase synthesis 487250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 488250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 489250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_poly_phase_synthesis(pChVars[ch], 490250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->num_channels, 491250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->equalizerType, 492250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber &ptrOutBuffer[ch]); 493250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 494250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 495250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber }/* end ch loop */ 496250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 497250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber ptrOutBuffer += pVars->num_channels * SUBBANDS_NUMBER * FILTERBANK_BANDS; 498250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } /* for (gr=0;gr<Max_gr;gr++) */ 499250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 500250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* skip ancillary data */ 501250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (info->bitrate_index > 0) 502250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { /* if not free-format */ 503250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 504250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 ancillary_data_lenght = pVars->predicted_frame_size << 3; 505250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 506250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber ancillary_data_lenght -= pVars->inputStream.usedBits; 507250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 508250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* skip ancillary data */ 509250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (ancillary_data_lenght > 0) 510250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 511250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.usedBits += ancillary_data_lenght; 512250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 513250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 514250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 515250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 516250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 517250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * This overrides a possible NO_ENOUGH_MAIN_DATA_ERROR 518250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 519250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber errorCode = NO_DECODING_ERROR; 520250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 521250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 522250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 523250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 524250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 525250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * The info on the header leads to an unsupported layer, more data 526250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * will not fix this, so this is a bad frame, 527250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 528250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 529250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = 0; 530250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return UNSUPPORTED_LAYER; 531250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 532250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 533250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3; 534250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->totalNumberOfBitsUsed += pVars->inputStream.usedBits; 535250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->version = info->version_x; 536250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->samplingRate = mp3_s_freq[info->version_x][info->sampling_frequency]; 537250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->bitRate = mp3_bitrate[pExt->version][info->bitrate_index]; 538250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 539250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 540250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 541250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Always verify buffer overrun condition 542250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 543250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 544250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (pExt->inputBufferUsedLength > pExt->inputBufferCurrentLength) 545250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 546250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->outputFrameSize = 0; 547250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber errorCode = NO_ENOUGH_MAIN_DATA_ERROR; 548250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 549250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 550250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return errorCode; 551250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 552250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber} 553250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 554250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 555250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 556250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE 557250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 558250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 559250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber__inline void fillDataBuf(tmp3Bits *pMainData, 560250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint32 val) /* val to write into the buffer */ 561250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{ 562250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pMainData->pBuffer[module(pMainData->offset++, BUFSIZE)] = (uint8)val; 563250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber} 564250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 565250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 566250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Hubervoid fillMainDataBuf(void *pMem, int32 temp) 567250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{ 568250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp3dec_file *pVars = (tmp3dec_file *)pMem; 569250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 570250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 571250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 offset = (pVars->inputStream.usedBits) >> INBUF_ARRAY_INDEX_SHIFT; 572250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 573250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 574250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Check if input circular buffer boundaries need to be enforced 575250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 576250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if ((offset + temp) < BUFSIZE) 577250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 578250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint8 * ptr = pVars->inputStream.pBuffer + offset; 579250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 580250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber offset = pVars->mainDataStream.offset; 581250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 582250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 583250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Check if main data circular buffer boundaries need to be enforced 584250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 585250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if ((offset + temp) < BUFSIZE) 586250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 587250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memcpy((pVars->mainDataStream.pBuffer + offset), ptr, temp*sizeof(uint8)); 588250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.offset += temp; 589250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 590250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 591250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 592250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 tmp1 = *(ptr++); 593250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--) /* read main data. */ 594250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 595250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber int32 tmp2 = *(ptr++); 596250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillDataBuf(&pVars->mainDataStream, tmp1); 597250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillDataBuf(&pVars->mainDataStream, tmp2); 598250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp1 = *(ptr++); 599250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 600250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 601250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (temp&1) 602250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 603250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillDataBuf(&pVars->mainDataStream, tmp1); 604250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 605250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 606250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* adjust circular buffer counter */ 607250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.offset = module(pVars->mainDataStream.offset, BUFSIZE); 608250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 609250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 610250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber else 611250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 612250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--) /* read main data. */ 613250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 614250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++ , BUFSIZE))); 615250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++ , BUFSIZE))); 616250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 617250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber if (temp&1) 618250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber { 619250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset , BUFSIZE))); 620250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 621250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber } 622250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 623250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 624250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.usedBits += (temp) << INBUF_ARRAY_INDEX_SHIFT; 625250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber} 626250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 627250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 628250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 629250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 630250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 631250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE 632250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 633250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 634250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberuint32 pvmp3_decoderMemRequirements(void) 635250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{ 636250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber uint32 size; 637250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 638250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber size = (uint32) sizeof(tmp3dec_file); 639250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber return (size); 640250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber} 641250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 642250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 643250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 644250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 645250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE 646250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 647250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 648250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_decode_huff_cw.h" 649250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 650250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Hubervoid pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt, 651250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber void *pMem) 652250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{ 653250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 654250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp3dec_file *pVars; 655250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber huffcodetab *pHuff; 656250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 657250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars = (tmp3dec_file *)pMem; 658250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 659250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->num_channels = 0; 660250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 661250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->totalNumberOfBitsUsed = 0; 662250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->inputBufferCurrentLength = 0; 663250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pExt->inputBufferUsedLength = 0; 664250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 665250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.offset = 0; 666250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 667250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)pVars->mainDataBuffer, 668250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 669250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber BUFSIZE*sizeof(*pVars->mainDataBuffer)); 670250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 671250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 672250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.pBuffer = pExt->pInputBuffer; 673250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 674250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 675250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Initialize huffman decoding table 676250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 677250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 678250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff = pVars->ht; 679250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[0].linbits = 0; 680250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[0].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; 681250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[1].linbits = 0; 682250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[1].pdec_huff_tab = pvmp3_decode_huff_cw_tab1; 683250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[2].linbits = 0; 684250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[2].pdec_huff_tab = pvmp3_decode_huff_cw_tab2; 685250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[3].linbits = 0; 686250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[3].pdec_huff_tab = pvmp3_decode_huff_cw_tab3; 687250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[4].linbits = 0; 688250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[4].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 4 is not used */ 689250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[5].linbits = 4; 690250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[5].pdec_huff_tab = pvmp3_decode_huff_cw_tab5; 691250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[6].linbits = 0; 692250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[6].pdec_huff_tab = pvmp3_decode_huff_cw_tab6; 693250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[7].linbits = 0; 694250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[7].pdec_huff_tab = pvmp3_decode_huff_cw_tab7; 695250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[8].linbits = 0; 696250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[8].pdec_huff_tab = pvmp3_decode_huff_cw_tab8; 697250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[9].linbits = 0; 698250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[9].pdec_huff_tab = pvmp3_decode_huff_cw_tab9; 699250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[10].linbits = 0; 700250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[10].pdec_huff_tab = pvmp3_decode_huff_cw_tab10; 701250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[11].linbits = 0; 702250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[11].pdec_huff_tab = pvmp3_decode_huff_cw_tab11; 703250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[12].linbits = 0; 704250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[12].pdec_huff_tab = pvmp3_decode_huff_cw_tab12; 705250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[13].linbits = 0; 706250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[13].pdec_huff_tab = pvmp3_decode_huff_cw_tab13; 707250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[14].linbits = 0; 708250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[14].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 14 is not used */ 709250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[15].linbits = 0; 710250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[15].pdec_huff_tab = pvmp3_decode_huff_cw_tab15; 711250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[16].linbits = 1; 712250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[16].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 713250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[17].linbits = 2; 714250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[17].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 715250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[18].linbits = 3; 716250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[18].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 717250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[19].linbits = 4; 718250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[19].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 719250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[20].linbits = 6; 720250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[20].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 721250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[21].linbits = 8; 722250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[21].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 723250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[22].linbits = 10; 724250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[22].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 725250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[23].linbits = 13; 726250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[23].pdec_huff_tab = pvmp3_decode_huff_cw_tab16; 727250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[24].linbits = 4; 728250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[24].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 729250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[25].linbits = 5; 730250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[25].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 731250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[26].linbits = 6; 732250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[26].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 733250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[27].linbits = 7; 734250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[27].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 735250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[28].linbits = 8; 736250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[28].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 737250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[29].linbits = 9; 738250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[29].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 739250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[30].linbits = 11; 740250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[30].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 741250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[31].linbits = 13; 742250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[31].pdec_huff_tab = pvmp3_decode_huff_cw_tab24; 743250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[32].linbits = 0; 744250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[32].pdec_huff_tab = pvmp3_decode_huff_cw_tab32; 745250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[33].linbits = 0; 746250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pHuff[33].pdec_huff_tab = pvmp3_decode_huff_cw_tab33; 747250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 748250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 749250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Initialize polysynthesis circular buffer mechanism 750250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 751250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* clear buffers */ 752250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 753250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pvmp3_resetDecoder(pMem); 754250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 755250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber} 756250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 757250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 758250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*---------------------------------------------------------------------------- 759250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE 760250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/ 761250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 762250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 763250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Hubervoid pvmp3_resetDecoder(void *pMem) 764250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{ 765250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 766250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp3dec_file *pVars; 767250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber tmp3dec_chan *pChVars[CHAN]; 768250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 769250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars = (tmp3dec_file *)pMem; 770250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ LEFT] = &pVars->perChan[ LEFT]; 771250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT] = &pVars->perChan[RIGHT]; 772250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 773250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->frame_start = 0; 774250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 775250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.offset = 0; 776250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 777250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.pBuffer = pVars->mainDataBuffer; 778250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->mainDataStream.usedBits = 0; 779250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 780250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 781250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pVars->inputStream.usedBits = 0; // in bits 782250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 783250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 784250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[ LEFT]->used_freq_lines = 575; 785250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pChVars[RIGHT]->used_freq_lines = 575; 786250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 787250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 788250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 789250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Initialize polysynthesis circular buffer mechanism 790250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 791250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 792250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576], 793250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 794250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 480*sizeof(pChVars[ LEFT]->circ_buffer[0])); 795250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576], 796250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 797250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 480*sizeof(pChVars[RIGHT]->circ_buffer[0])); 798250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 799250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 800250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)pChVars[ LEFT]->overlap, 801250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 802250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ LEFT]->overlap[0])); 803250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 804250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 805250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)pChVars[ RIGHT]->overlap, 806250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 807250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ RIGHT]->overlap[0])); 808250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 809250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 810250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 811250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 812250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 813250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber /* 814250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Clear all the structures 815250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */ 816250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 817250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 818250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pVars->scaleFactors[RIGHT], 819250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 820250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber sizeof(mp3ScaleFactors)); 821250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 822250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pVars->scaleFactors[LEFT], 823250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 824250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber sizeof(mp3ScaleFactors)); 825250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 826250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pVars->sideInfo, 827250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 828250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber sizeof(mp3SideInfo)); 829250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 830250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber pv_memset((void*)&pVars->sideInfo, 831250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 0, 832250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber sizeof(mp3SideInfo)); 833250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber 834250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber} 835