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