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_seek_synch.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Functions:
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_seek_synch
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_header_sync
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 9/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 Huberpvmp3_frame_synch
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pExt = pointer to the external interface structure. See the file
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           pvmp3decoder_api.h for a description of each field.
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           Data type of pointer to a tPVMP3DecoderExternal
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           structure.
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pMem = void pointer to hide the internal implementation of the library
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           It is cast back to a tmp3dec_file structure. This structure
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           contains information that needs to persist between calls to
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           this function, or is too big to be placed on the stack, even
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           though the data is only needed during execution of this function
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           Data type void pointer, internally pointer to a tmp3dec_file
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber           structure.
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    search mp3 sync word, when found, it verifies, based on header parameters,
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    the locations of the very next sync word,
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    - if fails, then indicates a false sync,
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    - otherwise, it confirm synchronization of at least 2 consecutives frames
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_seek_synch.h"
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_getbits.h"
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "s_tmp3dec_file.h"
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_tables.h"
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberERROR_CODE pvmp3_frame_synch(tPVMP3DecoderExternal *pExt,
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                             void                  *pMem) /* bit stream structure */
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint16 val;
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ERROR_CODE err;
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3dec_file      *pVars;
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pVars = (tmp3dec_file *)pMem;
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pVars->inputStream.pBuffer = pExt->pInputBuffer;
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pVars->inputStream.usedBits = (pExt->inputBufferUsedLength << 3); // in bits
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pVars->inputStream.inputBufferCurrentLength = (pExt->inputBufferCurrentLength); // in bits
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    err = pvmp3_header_sync(&pVars->inputStream);
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (err == NO_DECODING_ERROR)
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /* validate synchronization by checking two consecutive sync words */
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        // to avoid multiple bitstream accesses
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        uint32 temp = getNbits(&pVars->inputStream, 21);
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        // put back whole header
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pVars->inputStream.usedBits -= 21 + SYNC_WORD_LNGTH;
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32  version;
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        switch (temp >> 19)  /* 2 */
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case 0:
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                version = MPEG_2_5;
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case 2:
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                version = MPEG_2;
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            case 3:
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                version = MPEG_1;
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            default:
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                version = INVALID_VERSION;
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                break;
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 freq_index = (temp << 20) >> 30;
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (version != INVALID_VERSION && (freq_index != 3))
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 numBytes = fxp_mul32_Q28(mp3_bitrate[version][(temp<<16)>>28] << 20,
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                           inv_sfreq[freq_index]);
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            numBytes >>= (20 - version);
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (version != MPEG_1)
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                numBytes >>= 1;
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if ((temp << 22) >> 31)
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                numBytes++;
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            if (numBytes > (int32)pVars->inputStream.inputBufferCurrentLength)
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                /* frame should account for padding and 2 bytes to check sync */
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pExt->CurrentFrameLength = numBytes + 3;
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                return (SYNCH_LOST_ERROR);
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else if (numBytes == (int32)pVars->inputStream.inputBufferCurrentLength)
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                /* No enough data to validate, but current frame appears to be correct ( EOF case) */
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3;
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                return (NO_DECODING_ERROR);
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            else
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            {
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                int32 offset = pVars->inputStream.usedBits + ((numBytes) << 3);
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                offset >>= INBUF_ARRAY_INDEX_SHIFT;
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                uint8    *pElem  = pVars->inputStream.pBuffer + offset;
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                uint16 tmp1 = *(pElem++);
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                uint16 tmp2 = *(pElem);
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                val = (tmp1 << 3);
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                val |= (tmp2 >> 5);
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            }
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            val = 0; // force mismatch
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (val == SYNC_WORD)
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3; ///  !!!!!
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            err = NO_DECODING_ERROR;
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            pExt->inputBufferCurrentLength = 0;
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            err = SYNCH_LOST_ERROR;
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pExt->inputBufferCurrentLength = 0;
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return(err);
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberpvmp3_header_sync
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3Bits *inputStream,     structure holding the input stream parameters
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    search mp3 sync word
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberERROR_CODE pvmp3_header_sync(tmp3Bits  *inputStream)
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint16 val;
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 availableBits = (inputStream->inputBufferCurrentLength << 3); // in bits
286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    // byte aligment
288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    inputStream->usedBits = (inputStream->usedBits + 7) & 8;
289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    val = (uint16)getUpTo17bits(inputStream, SYNC_WORD_LNGTH);
291d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
292d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    while (((val&SYNC_WORD) != SYNC_WORD) && (inputStream->usedBits < availableBits))
293d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
294d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        val <<= 8;
295d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        val |= getUpTo9bits(inputStream, 8);
296d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
297d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
298d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if ((val&SYNC_WORD) == SYNC_WORD && (inputStream->usedBits < availableBits))
299d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
300d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return(NO_DECODING_ERROR);
301d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
302d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else
303d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
304d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return(SYNCH_LOST_ERROR);
305d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
306d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
307d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
308d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
309