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