aac.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. /* 
  22.  * Notes:
  23.  *  - file formatted with tabstops == 4 spaces 
  24.  */
  25. #include <mp4av_common.h>
  26. /*
  27.  * AAC Config in ES:
  28.  *
  29.  * AudioObjectType  5 bits
  30.  * samplingFrequencyIndex  4 bits
  31.  * if (samplingFrequencyIndex == 0xF)
  32.  * samplingFrequency 24 bits 
  33.  * channelConfiguration  4 bits
  34.  * GA_SpecificConfig
  35.  *  FrameLengthFlag  1 bit 1024 or 960
  36.  *  DependsOnCoreCoder 1 bit (always 0)
  37.  *  ExtensionFlag  1 bit (always 0)
  38.  */
  39. extern "C" u_int8_t MP4AV_AacConfigGetSamplingRateIndex(u_int8_t* pConfig)
  40. {
  41. return ((pConfig[0] << 1) | (pConfig[1] >> 7)) & 0xF;
  42. }
  43. extern "C" u_int32_t MP4AV_AacConfigGetSamplingRate(u_int8_t* pConfig)
  44. {
  45. u_int8_t index =
  46. MP4AV_AacConfigGetSamplingRateIndex(pConfig);
  47. if (index == 0xF) {
  48. return (pConfig[1] & 0x7F) << 17
  49. | pConfig[2] << 9
  50. | pConfig[3] << 1
  51. | (pConfig[4] >> 7);
  52. }
  53. return AdtsSamplingRates[index];
  54. }
  55. extern "C" u_int16_t MP4AV_AacConfigGetSamplingWindow(u_int8_t* pConfig)
  56. {
  57. u_int8_t adjust = 0;
  58. if (MP4AV_AacConfigGetSamplingRateIndex(pConfig) == 0xF) {
  59. adjust = 3;
  60. }
  61. if ((pConfig[1 + adjust] >> 2) & 0x1) {
  62. return 960;
  63. }
  64. return 1024;
  65. }
  66. extern "C" u_int8_t MP4AV_AacConfigGetChannels(u_int8_t* pConfig)
  67. {
  68. u_int8_t adjust = 0;
  69. if (MP4AV_AacConfigGetSamplingRateIndex(pConfig) == 0xF) {
  70. adjust = 3;
  71. }
  72. return (pConfig[1 + adjust] >> 3) & 0xF;
  73. }
  74. extern "C" bool MP4AV_AacGetConfigurationFromAdts(
  75. u_int8_t** ppConfig,
  76. u_int32_t* pConfigLength,
  77. u_int8_t* pHdr)
  78. {
  79. return MP4AV_AacGetConfiguration(
  80. ppConfig,
  81. pConfigLength,
  82. MP4AV_AdtsGetProfile(pHdr),
  83. MP4AV_AdtsGetSamplingRate(pHdr),
  84. MP4AV_AdtsGetChannels(pHdr));
  85. }
  86. extern "C" bool MP4AV_AacGetConfiguration(
  87. u_int8_t** ppConfig,
  88. u_int32_t* pConfigLength,
  89. u_int8_t profile,
  90. u_int32_t samplingRate,
  91. u_int8_t channels)
  92. {
  93. /* create the appropriate decoder config */
  94. u_int8_t* pConfig = (u_int8_t*)malloc(2);
  95. if (pConfig == NULL) {
  96. return false;
  97. }
  98. u_int8_t samplingRateIndex = 
  99. MP4AV_AdtsFindSamplingRateIndex(samplingRate);
  100. pConfig[0] =
  101. ((profile + 1) << 3) | ((samplingRateIndex & 0xe) >> 1);
  102. pConfig[1] =
  103. ((samplingRateIndex & 0x1) << 7) | (channels << 3);
  104. /* LATER this option is not currently used in MPEG4IP
  105. if (samplesPerFrame == 960) {
  106. pConfig[1] |= (1 << 2);
  107. }
  108. */
  109. *ppConfig = pConfig;
  110. *pConfigLength = 2;
  111. return true;
  112. }