【VC开源代码栏目提醒】:网学会员在VC开源代码频道为大家收集整理了aac.cpp提供大家参考,希望对大家有所帮助!
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is MPEG4IP.
*
* The Initial Developer of the Original Code is Cisco Systems Inc.
* Portions created by Cisco Systems Inc. are
* Copyright (C) Cisco Systems Inc. 2000-2002. All Rights Reserved.
*
* Contributor(s):
* Dave Mackie dmackie@cisco.com
*/
/*
* Notes:
* - file formatted with tabstops == 4 spaces
*/
#include <mp4av_common.h>
/*
* AAC Config in ES:
*
* AudioObjectType 5 bits
* samplingFrequencyIndex 4 bits
* if (samplingFrequencyIndex == 0xF)
* samplingFrequency 24 bits
* channelConfiguration 4 bits
* GA_SpecificConfig
* FrameLengthFlag 1 bit 1024 or 960
* DependsOnCoreCoder 1 bit (always 0)
* ExtensionFlag 1 bit (always 0)
*/
extern "C" u_int8_t MP4AV_AacConfigGetSamplingRateIndex(u_int8_t* pConfig)
{
return ((pConfig[0] << 1) | (pConfig[1] >> 7)) & 0xF;
}
extern "C" u_int32_t MP4AV_AacConfigGetSamplingRate(u_int8_t* pConfig)
{
u_int8_t index =
MP4AV_AacConfigGetSamplingRateIndex(pConfig);
if (index == 0xF) {
return (pConfig[1] & 0x7F) << 17
| pConfig[2] << 9
| pConfig[3] << 1
| (pConfig[4] >> 7);
}
return AdtsSamplingRates[index];
}
extern "C" u_int16_t MP4AV_AacConfigGetSamplingWindow(u_int8_t* pConfig)
{
u_int8_t adjust = 0;
if (MP4AV_AacConfigGetSamplingRateIndex(pConfig) == 0xF) {
adjust = 3;
}
if ((pConfig[1 + adjust] >> 2) & 0x1) {
return 960;
}
return 1024;
}
extern "C" u_int8_t MP4AV_AacConfigGetChannels(u_int8_t* pConfig)
{
u_int8_t adjust = 0;
if (MP4AV_AacConfigGetSamplingRateIndex(pConfig) == 0xF) {
adjust = 3;
}
return (pConfig[1 + adjust] >> 3) & 0xF;
}
extern "C" bool MP4AV_AacGetConfigurationFromAdts(
u_int8_t** ppConfig,
u_int32_t* pConfigLength,
u_int8_t* pHdr)
{
return MP4AV_AacGetConfiguration(
ppConfig,
pConfigLength,
MP4AV_AdtsGetProfile(pHdr),
MP4AV_AdtsGetSamplingRate(pHdr),
MP4AV_AdtsGetChannels(pHdr));
}
extern "C" bool MP4AV_AacGetConfiguration(
u_int8_t** ppConfig,
u_int32_t* pConfigLength,
u_int8_t profile,
u_int32_t samplingRate,
u_int8_t channels)
{
/* create the appropriate decoder config */
u_int8_t* pConfig = (u_int8_t*)malloc(2);
if (pConfig == NULL) {
return false;
}
u_int8_t samplingRateIndex =
MP4AV_AdtsFindSamplingRateIndex(samplingRate);
pConfig[0] =
((profile + 1) << 3) | ((samplingRateIndex & 0xe) >> 1);
pConfig[1] =
((samplingRateIndex & 0x1) << 7) | (channels << 3);
/* LATER this option is not currently used in MPEG4IP
if (samplesPerFrame == 960) {
pConfig[1] |= (1 << 2);
}
*/
*ppConfig = pConfig;
*pConfigLength = 2;
return true;
}