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