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_seek_synch.cpp
25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   Functions:
27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pvmp3_seek_synch
28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pvmp3_header_sync
29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     Date: 9/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 Huberpvmp3_frame_synch
43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberInput
45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pExt = pointer to the external interface structure. See the file
46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           pvmp3decoder_api.h for a description of each field.
47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           Data type of pointer to a tPVMP3DecoderExternal
48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           structure.
49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pMem = void pointer to hide the internal implementation of the library
51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           It is cast back to a tmp3dec_file structure. This structure
52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           contains information that needs to persist between calls to
53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           this function, or is too big to be placed on the stack, even
54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           though the data is only needed during execution of this function
55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           Data type void pointer, internally pointer to a tmp3dec_file
56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber           structure.
57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTION DESCRIPTION
61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    search mp3 sync word, when found, it verifies, based on header parameters,
63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    the locations of the very next sync word,
64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    - if fails, then indicates a false sync,
65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    - otherwise, it confirm synchronization of at least 2 consecutives frames
66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS
69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES
73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE
76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; INCLUDES
83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_seek_synch.h"
86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_getbits.h"
87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "s_tmp3dec_file.h"
88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pv_mp3dec_fxd_op.h"
89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_tables.h"
90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; MACROS
94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Define module specific macros here
95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; DEFINES
100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Include all pre-processor statements here. Include conditional
101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; compile variables also.
102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL FUNCTION DEFINITIONS
106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Function Prototype declaration
107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Variable declaration - defined here and used outside this module
112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL FUNCTION REFERENCES
116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare functions defined elsewhere and referenced in this module
117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare variables used in this module but defined elsewhere
122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberERROR_CODE pvmp3_frame_synch(tPVMP3DecoderExternal *pExt,
131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             void                  *pMem) /* bit stream structure */
132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint16 val;
134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    ERROR_CODE err;
135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3dec_file      *pVars;
137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pVars = (tmp3dec_file *)pMem;
139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pVars->inputStream.pBuffer = pExt->pInputBuffer;
141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pVars->inputStream.usedBits = (pExt->inputBufferUsedLength << 3); // in bits
142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pVars->inputStream.inputBufferCurrentLength = (pExt->inputBufferCurrentLength); // in bits
145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    err = pvmp3_header_sync(&pVars->inputStream);
147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (err == NO_DECODING_ERROR)
149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        /* validate synchronization by checking two consecutive sync words */
151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        // to avoid multiple bitstream accesses
153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        uint32 temp = getNbits(&pVars->inputStream, 21);
154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        // put back whole header
155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pVars->inputStream.usedBits -= 21 + SYNC_WORD_LNGTH;
156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32  version;
158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        switch (temp >> 19)  /* 2 */
160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            case 0:
162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                version = MPEG_2_5;
163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                break;
164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            case 2:
165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                version = MPEG_2;
166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                break;
167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            case 3:
168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                version = MPEG_1;
169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                break;
170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            default:
171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                version = INVALID_VERSION;
172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                break;
173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        int32 freq_index = (temp << 20) >> 30;
176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (version != INVALID_VERSION && (freq_index != 3))
178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            int32 numBytes = fxp_mul32_Q28(mp3_bitrate[version][(temp<<16)>>28] << 20,
180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                           inv_sfreq[freq_index]);
181250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
182250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            numBytes >>= (20 - version);
183250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
184250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if (version != MPEG_1)
185250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
186250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                numBytes >>= 1;
187250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
188250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if ((temp << 22) >> 31)
189250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
190250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                numBytes++;
191250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
192250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
193250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if (numBytes > (int32)pVars->inputStream.inputBufferCurrentLength)
194250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
195250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /* frame should account for padding and 2 bytes to check sync */
196250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                pExt->CurrentFrameLength = numBytes + 3;
197250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                return (SYNCH_LOST_ERROR);
198250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
199250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            else if (numBytes == (int32)pVars->inputStream.inputBufferCurrentLength)
200250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
201250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /* No enough data to validate, but current frame appears to be correct ( EOF case) */
202250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3;
203250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                return (NO_DECODING_ERROR);
204250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
205250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            else
206250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
207250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
208250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                int32 offset = pVars->inputStream.usedBits + ((numBytes) << 3);
209250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
210250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                offset >>= INBUF_ARRAY_INDEX_SHIFT;
211250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                uint8    *pElem  = pVars->inputStream.pBuffer + offset;
212250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                uint16 tmp1 = *(pElem++);
213250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                uint16 tmp2 = *(pElem);
214250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
215250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                val = (tmp1 << 3);
216250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                val |= (tmp2 >> 5);
217250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
218250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
219250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        else
220250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
221250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            val = 0; // force mismatch
222250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
223250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
224250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (val == SYNC_WORD)
225250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
226250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3; ///  !!!!!
227250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            err = NO_DECODING_ERROR;
228250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
229250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        else
230250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
231250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            pExt->inputBufferCurrentLength = 0;
232250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            err = SYNCH_LOST_ERROR;
233250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
234250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
235250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else
236250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
237250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pExt->inputBufferCurrentLength = 0;
238250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
239250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
240250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    return(err);
241250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
242250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
243250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
244250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*
245250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
246250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY
247250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
248250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
249250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description:
250250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
251250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
252250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS
253250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
254250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberpvmp3_header_sync
255250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
256250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberInput
257250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3Bits *inputStream,     structure holding the input stream parameters
258250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
259250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
260250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTION DESCRIPTION
261250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
262250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    search mp3 sync word
263250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
264250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
265250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS
266250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
267250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
268250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
269250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES
270250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
271250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
272250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE
273250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
274250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
275250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
276250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
277250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
278250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
279250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
280250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
281250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
282250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberERROR_CODE pvmp3_header_sync(tmp3Bits  *inputStream)
283250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
284250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint16 val;
285250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    uint32 availableBits = (inputStream->inputBufferCurrentLength << 3); // in bits
286250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
287250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    // byte aligment
288250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    inputStream->usedBits = (inputStream->usedBits + 7) & 8;
289250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
290250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    val = (uint16)getUpTo17bits(inputStream, SYNC_WORD_LNGTH);
291250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
292250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    while (((val&SYNC_WORD) != SYNC_WORD) && (inputStream->usedBits < availableBits))
293250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
294250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        val <<= 8;
295250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        val |= getUpTo9bits(inputStream, 8);
296250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
297250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
298250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if ((val&SYNC_WORD) == SYNC_WORD && (inputStream->usedBits < availableBits))
299250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
300250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return(NO_DECODING_ERROR);
301250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
302250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else
303250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
304250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        return(SYNCH_LOST_ERROR);
305250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
306250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
307250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
308250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
309