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_get_main_data_size.cpp
25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     Date: 09/21/2007
27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY
30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
32250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description:
33250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
34250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
35250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS
36250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
37250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Input
38250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    mp3Header *info,         pointer to mp3 header info structure
39250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3dec_file  *pVars
40250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             contains information that needs to persist
41250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             between calls to this function, or is too big to
42250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             be placed on the stack, even though the data is
43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             only needed during execution of this function
44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber  Returns
46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    main data frame size
48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTION DESCRIPTION
51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    get main data frame size
53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS
56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES
60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE
66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; INCLUDES
73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_tables.h"
76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_get_main_data_size.h"
77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pv_mp3dec_fxd_op.h"
78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; MACROS
82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Define module specific macros here
83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; DEFINES
88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Include all pre-processor statements here. Include conditional
89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; compile variables also.
90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL FUNCTION DEFINITIONS
94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Function Prototype declaration
95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Variable declaration - defined here and used outside this module
100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL FUNCTION REFERENCES
104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare functions defined elsewhere and referenced in this module
105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare variables used in this module but defined elsewhere
110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberint32 pvmp3_get_main_data_size(mp3Header *info,
117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                               tmp3dec_file  *pVars)
118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 numBytes = fxp_mul32_Q28(mp3_bitrate[info->version_x][info->bitrate_index] << 20,
122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                   inv_sfreq[info->sampling_frequency]);
123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    numBytes >>= (20 - info->version_x);
126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /*
128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     *  Remove the size of the side information from the main data total
129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     */
130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (info->version_x == MPEG_1)
131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pVars->predicted_frame_size = numBytes;
133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (info->mode == MPG_MD_MONO)
134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            numBytes -= 17;
136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        else
138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            numBytes -= 32;
140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else
143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        numBytes >>= 1;
145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pVars->predicted_frame_size = numBytes;
146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (info->mode == MPG_MD_MONO)
148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            numBytes -= 9;
150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        else
152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            numBytes -= 17;
154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (info->padding)
158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        numBytes++;
160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pVars->predicted_frame_size++;
161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (info->error_protection)
164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        numBytes -= 6;
166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else
168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        numBytes -= 4;
170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (numBytes < 0)
174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        numBytes = 0;
176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    return(numBytes);
179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
181