1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------ 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License. 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------------------------------------------- 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: ./src/get_audio_specific_config.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per second review comments 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) change audioObjectType to Int 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) do not set pVars->prog_config.profile 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) clean up status flag, default to SUCCESS 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (4) fix multiple lines comments 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Change getbits.h to ibstream.h 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) updated revision history 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) declare audioObjectType as enum type 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Replace some instances of getbits to get9_n_lessbits 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber when the number of bits read is 9 or less. 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Added support for backward and non-backward (explicit) 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mode for Parametric Stereo (PS) used in enhanced AAC+ 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars = pointer to the structure that holds all information for 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber this instance of the library. pVars->prog_config is directly 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used, and pVars->mc_info, pVars->prog_config, 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->pWinSeqInfo, pVars->SFBWidth128 are needed indirectly 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for calling set_mc_info. Data type pointer to tDec_Int_File 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 0 if successfully decoded AudioSpecificConfig 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1 if un-supported config is used for this release 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config contents are updated with the information read in. 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info contents are updated with channel information. 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->pWinSeqInfo contents are updated with window information. 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->SFBWidth128 contents are updated with scale factor band width data. 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function reads the bitstream for the structure "AudioSpecificConfig", 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and sets the decoder configuration that is needed by the decoder to be able 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to decode the media properly. 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall not use global variables 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3: 1999(E) 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Part 3 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 1 p18 1.6 Interface to MPEG-4 Systems 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 4 p13 4.4.1 GA Specific Configuration 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Amendment p10 6.2.1 AudioSpecificInfo 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Amendment p78 8.2 Decoder configuration (GASpecificConfig) 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) AAC DecoderSpecificInfo Information 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PacketVideo descriptions - San Diego 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = SUCCESS; 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = &(pVars->inputStream); 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = CALL getbits( 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber neededBits = LEN_OBJ_TYPE + LEN_SAMP_RATE_IDX, 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = pInputStream) 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING (pInputStream) 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURNING (temp) 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber audioObjectType = (temp & 0x1f0) >> 4; 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.profile = audioObjectType; 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.sampling_rate_idx = temp & 0xf; 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (pVars->prog_config.sampling_rate_idx == 0xf) 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sampling_rate = CALL getbits( 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber neededBits = LEN_SAMP_RATE, 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = pInputStream); 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING (pInputStream) 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURNING (sampling_rate) 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber channel_config = CALL getbits( 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber neededBits = LEN_CHAN_CONFIG, 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = pInputStream); 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING (pInputStream) 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURNING (channel_config) 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (channel_config > 2) 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (((audioObjectType == MP4AUDIO_AAC_MAIN) OR 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_AAC_LC) OR 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_AAC_SSR) OR 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_LTP) OR 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_AAC_SCALABLE) OR 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_TWINVQ)) AND (status == -1)) 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = CALL get_GA_specific_config( 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars = pVars, 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber channel_config = channel_config, 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber audioObjectType = audioObjectType, 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = pInputStream); 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING (pVars->mc_info,channel_config,pInputStream) 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURNING (status) 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (audioObjectType == MP4AUDIO_CELP) 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (audioObjectType == MP4AUDIO_HVXC) 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (audioObjectType == MP4AUDIO_TTSI) 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ((audioObjectType == 13) OR (audioObjectType == 14) OR 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == 15) OR (audioObjectType == 16)) 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (((audioObjectType == MP4AUDIO_ER_AAC_LC) OR 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_AAC_LTP) OR 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) OR 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_TWINVQ) OR 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_BSAC) OR 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_AAC_LD)) AND (status == -1)) 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (audioObjectType == MP4AUDIO_ER_CELP) 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (audioObjectType == MP4AUDIO_ER_HVXC) 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ((audioObjectType == MP4AUDIO_ER_HILN) OR 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_PARAMETRIC)) 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ((audioObjectType == MP4AUDIO_ER_AAC_LC) OR 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_AAC_LTP) OR 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) OR 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_TWINVQ) OR 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_BSAC) OR 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_AAC_LD) OR 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_CELP) OR 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_HVXC) OR 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_ER_HILN) OR 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_PARAMETRIC)) 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber epConfig = CALL getbits( 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber neededBits = LEN_EP_CONFIG, 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = pInputStream); 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING (pInputStream) 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURNING (epConfig) 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (epConfig == 2) 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURN status; 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_mp4ff_const.h" 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_tmp4audioobjecttype.h" 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_audio_specific_config.h" 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "get_ga_specific_config.h" 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h" 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sfb.h" /* Where samp_rate_info[] is declared */ 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt get_audio_specific_config(tDec_Int_File * const pVars) 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt temp; 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tMP4AudioObjectType audioObjectType; 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber //UInt32 sampling_rate; 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt channel_config; 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt syncExtensionType; 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt extensionAudioObjectType = 0; 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt extensionSamplingFrequencyIndex = 0; 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream; 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int status; 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = SUCCESS; 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream = &(pVars->inputStream); 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.upsamplingFactor = 1; /* default to regular AAC */ 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = get9_n_lessbits(LEN_OBJ_TYPE + LEN_SAMP_RATE_IDX, 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The following code can directly set the values of elements in 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * MC_Info, rather than first setting the values in pVars->prog_config 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and then copy these values to MC_Info by calling set_mc_info. 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * In order to keep consistent with get_prog_config (ADIF) and 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * get_adts_header (ADTS), the code here is still copying 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the info, and set the pVars->current_program = 0 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* AudioObjectType */ 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber audioObjectType = (tMP4AudioObjectType)((temp & 0x1f0) >> 4); 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.ExtendedAudioObjectType = audioObjectType; /* default */ 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* saving an audioObjectType into a profile field */ 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* pVars->prog_config.profile = audioObjectType; */ 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* sampling rate index */ 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.sampling_rate_idx = temp & 0xf; 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.sampling_rate_idx > 0xb) 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Only support 12 sampling frequencies from array samp_rate_info ( see sfb.cpp) 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 7350 Hz (index 0xc) is not supported, the other indexes are reserved or escape 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.sampling_rate_idx == 0xf) /* escape sequence */ 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * sampling rate not listed in Table 1.6.2, 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * this release does not support this 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*sampling_rate = getbits( LEN_SAMP_RATE, 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream);*/ 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber getbits(LEN_SAMP_RATE, pInputStream); /* future use */ 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber channel_config = get9_n_lessbits(LEN_CHAN_CONFIG, 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((channel_config > 2) && (!pVars->aacConfigUtilityEnabled)) 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * AAC lib does not support more than two channels 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * signal error when in decoder mode 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * do not test when in utility mode 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = 1; 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (audioObjectType == MP4AUDIO_SBR || audioObjectType == MP4AUDIO_PS) 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* to disable explicit backward compatiblity check */ 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR; 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.sbrPresentFlag = 1; 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (audioObjectType == MP4AUDIO_PS) 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.psPresentFlag = 1; 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_PS; 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber extensionSamplingFrequencyIndex = /* extensionSamplingFrequencyIndex */ 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber get9_n_lessbits(LEN_SAMP_RATE_IDX, 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (extensionSamplingFrequencyIndex == 0x0f) 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * sampling rate not listed in Table 1.6.2, 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * this release does not support this 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*sampling_rate = getbits( LEN_SAMP_RATE, 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream);*/ 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber getbits(LEN_SAMP_RATE, pInputStream); 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber audioObjectType = (tMP4AudioObjectType) get9_n_lessbits(LEN_OBJ_TYPE , 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((/*(audioObjectType == MP4AUDIO_AAC_MAIN) ||*/ 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_AAC_LC) || 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*(audioObjectType == MP4AUDIO_AAC_SSR) ||*/ 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (audioObjectType == MP4AUDIO_LTP) /*||*/ 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*(audioObjectType == MP4AUDIO_AAC_SCALABLE) ||*/ 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*(audioObjectType == MP4AUDIO_TWINVQ)*/) && (status == SUCCESS)) 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber status = get_GA_specific_config(pVars, 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream, 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber channel_config, 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber audioObjectType); 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * verify that Program config returned a supported audio object type 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((pVars->mc_info.audioObjectType != MP4AUDIO_AAC_LC) && 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (pVars->mc_info.audioObjectType != MP4AUDIO_LTP)) 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return 1; /* status != SUCCESS invalid aot */ 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return 1; /* status != SUCCESS invalid aot or invalid parameter */ 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * SBR tool explicit signaling ( backward compatible ) 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (extensionAudioObjectType != MP4AUDIO_SBR) 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber syncExtensionType = (UInt)get17_n_lessbits(LEN_SYNC_EXTENSION_TYPE, 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (syncExtensionType == 0x2b7) 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber extensionAudioObjectType = get9_n_lessbits( /* extensionAudioObjectType */ 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LEN_OBJ_TYPE, 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (extensionAudioObjectType == MP4AUDIO_SBR) 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.sbrPresentFlag = get1bits(pInputStream); /* sbrPresentFlag */ 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->mc_info.sbrPresentFlag == 1) 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber extensionSamplingFrequencyIndex = 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber get9_n_lessbits( /* extensionSamplingFrequencyIndex */ 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LEN_SAMP_RATE_IDX, 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->aacPlusEnabled == true) 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.upsamplingFactor = (samp_rate_info[extensionSamplingFrequencyIndex].samp_rate >> 1) == 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate ? 2 : 1; 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((Int)extensionSamplingFrequencyIndex == pVars->prog_config.sampling_rate_idx) 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.sampling_rate_idx < 6) 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->aacPlusEnabled = false; 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.bDownSampledSbr = true; 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.sampling_rate_idx = extensionSamplingFrequencyIndex; 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (extensionSamplingFrequencyIndex == 0x0f) 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * sampling rate not listed in Table 1.6.2, 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * this release does not support this 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*sampling_rate = getbits( LEN_SAMP_RATE, 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream);*/ 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber getbits(LEN_SAMP_RATE, pInputStream); 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* syncExtensionType */ 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber syncExtensionType = (UInt)get17_n_lessbits(LEN_SYNC_EXTENSION_TYPE, 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInputStream); 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (syncExtensionType == 0x548) 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.psPresentFlag = get1bits(pInputStream); /* psPresentFlag */ 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->mc_info.psPresentFlag) 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber extensionAudioObjectType = MP4AUDIO_PS; 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Rewind bitstream pointer so that the syncExtensionType reading has no 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * effect when decoding raw bitstream 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits -= LEN_SYNC_EXTENSION_TYPE; 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.ExtendedAudioObjectType = (eMP4AudioObjectType)extensionAudioObjectType; 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (!status) 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Rewind bitstream pointer so that the syncExtensionType reading has no 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * effect when decoding raw bitstream 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->inputStream.usedBits -= LEN_SYNC_EXTENSION_TYPE; 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For implicit signalling, no hint that sbr or ps is used, so we need to 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * check the sampling frequency of the aac content, if lesser or equal to 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 24 KHz, by defualt upsample, otherwise, do nothing 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((pVars->prog_config.sampling_rate_idx >= 6) && (pVars->aacPlusEnabled == true) && 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber audioObjectType == MP4AUDIO_AAC_LC) 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.upsamplingFactor = 2; 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.sampling_rate_idx -= 3; 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.sbrPresentFlag = 1; 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->sbrDecoderData.SbrChannel[0].syncState = SBR_NOT_INITIALIZED; 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->sbrDecoderData.SbrChannel[1].syncState = SBR_NOT_INITIALIZED; 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else /* MP4AUDIO_SBR was detected */ 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Set the real output frequency use by the SBR tool, define tentative upsample ratio 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->aacPlusEnabled == true) 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.upsamplingFactor = (samp_rate_info[extensionSamplingFrequencyIndex].samp_rate >> 1) == 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate ? 2 : 1; 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((Int)extensionSamplingFrequencyIndex == pVars->prog_config.sampling_rate_idx) 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pVars->prog_config.sampling_rate_idx < 6) 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->aacPlusEnabled = false; 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->mc_info.bDownSampledSbr = true; 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pVars->prog_config.sampling_rate_idx = extensionSamplingFrequencyIndex; 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if ( extensionAudioObjectType != MP4AUDIO_SBR ) */ 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The following object types are not supported in this release, 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * however, keep these interfaces for future implementation 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if (audioObjectType == MP4AUDIO_CELP) 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if (audioObjectType == MP4AUDIO_HVXC) 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if (audioObjectType == MP4AUDIO_TTSI) 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if ((audioObjectType == 13) || (audioObjectType == 14) || 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == 15) || (audioObjectType == 16)) 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* The following objects are Amendment 1 objects */ 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if (((audioObjectType == MP4AUDIO_ER_AAC_LC) || 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_AAC_LTP) || 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) || 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_TWINVQ) || 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_BSAC) || 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_AAC_LD)) && (status == -1)) 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * should call get_GA_specific_config 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * for this release, do not support Error Resilience 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * temporary solution is set status flag and exit decoding 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* status = 1; 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if (audioObjectType == MP4AUDIO_ER_CELP) 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if (audioObjectType == MP4AUDIO_ER_HVXC) 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if ((audioObjectType == MP4AUDIO_ER_HILN) || 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_PARAMETRIC)) 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *if ((audioObjectType == MP4AUDIO_ER_AAC_LC) || 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_AAC_LTP) || 661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) || 662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_TWINVQ) || 663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_BSAC) || 664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_AAC_LD) || 665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_CELP) || 666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_HVXC) || 667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_ER_HILN) || 668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (audioObjectType == MP4AUDIO_PARAMETRIC)) 669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *{ 670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* error protection config */ 672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * epConfig = 674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * getbits( 675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * LEN_EP_CONFIG, 676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pInputStream); 677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if (epConfig == 2) 679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* should call ErrorProtectionSpecificConfig() */ 682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * status = 1; 684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *} 687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return status; 690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 692