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