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_decode_header.cpp 25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Date: 09/21/2007 27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY 30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description: 33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS 36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput 38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber tbits *inputStream, bit stream 39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber mp3Header *info, 40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 *crc 41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Returns 42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber mp3Header *info, structure holding the parsed mp3 header info 44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 *crc initialized crc computation 45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION 49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber gets mp3 header information 51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS 54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES 58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996) 60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension 61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE 64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/ 67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES 71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_decode_header.h" 74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_crc.h" 75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_getbits.h" 76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_seek_synch.h" 77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS 81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here 82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES 87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional 88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also. 89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS 93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration 94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module 99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES 103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module 104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere 109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE 113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberERROR_CODE pvmp3_decode_header(tmp3Bits *inputStream, 116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber mp3Header *info, 117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 *crc) 118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber ERROR_CODE err = NO_DECODING_ERROR; 121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 temp; 122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* 124ebdc652a891659d83386c3f92715ad6c70c8ba2dJames Dong * Verify that at least the header is complete 125ebdc652a891659d83386c3f92715ad6c70c8ba2dJames Dong * Note that SYNC_WORD_LNGTH is in unit of bits, but inputBufferCurrentLength 126ebdc652a891659d83386c3f92715ad6c70c8ba2dJames Dong * is in unit of bytes. 127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 128ebdc652a891659d83386c3f92715ad6c70c8ba2dJames Dong if (inputStream->inputBufferCurrentLength < ((SYNC_WORD_LNGTH + 21) >> 3)) 129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber return NO_ENOUGH_MAIN_DATA_ERROR; 131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* 134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * MPEG Audio Version ID 135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber temp = getUpTo17bits(inputStream, SYNC_WORD_LNGTH); 137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if ((temp & SYNC_WORD) != SYNC_WORD) 138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber err = pvmp3_header_sync(inputStream); 140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (err != NO_DECODING_ERROR) 142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber return err; 144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber temp = getNbits(inputStream, 21); // to avoid multiple bitstream accesses 148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber switch (temp >> 19) /* 2 */ 151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case 0: 153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->version_x = MPEG_2_5; 154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case 2: 156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->version_x = MPEG_2; 157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber case 3: 159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->version_x = MPEG_1; 160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber default: 162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->version_x = INVALID_VERSION; 163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber err = UNSUPPORTED_LAYER; 164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber break; 165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->layer_description = 4 - ((temp << 13) >> 30); /* 2 */ 168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->error_protection = !((temp << 15) >> 31); /* 1 */ 169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (info->error_protection) 171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *crc = 0xffff; /* CRC start value */ 173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber calculate_crc((temp << 16) >> 16, 16, crc); 174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->bitrate_index = (temp << 16) >> 28; /* 4 */ 177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->sampling_frequency = (temp << 20) >> 30; /* 2 */ 178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->padding = (temp << 22) >> 31; /* 1 */ 179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->extension = (temp << 23) >> 31; /* 1 */ 180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->mode = (temp << 24) >> 30; /* 2 */ 181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->mode_ext = (temp << 26) >> 30; /* 2 */ 182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->copyright = (temp << 27) >> 31; /* 1 */ 183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->original = (temp << 28) >> 31; /* 1 */ 184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber info->emphasis = (temp << 30) >> 30; /* 2 */ 185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (!info->bitrate_index || info->sampling_frequency == 3) 188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber err = UNSUPPORTED_FREE_BITRATE; 190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber return(err); 193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber} 194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 195