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

流媒体/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. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. #include "systems.h"
  22. #include "mpeg4_audio_config.h"
  23. #include "bitstream/bitstream.h"
  24. static long freq_index_to_freq[] = {
  25.   96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 
  26.   12000, 11025, 8000, 7350 };
  27. extern "C" int audio_object_type_is_aac (mpeg4_audio_config_t *mptr)
  28. {
  29.   unsigned int audio_object;
  30.   audio_object = mptr->audio_object_type;
  31.   if (audio_object == 1 || 
  32.       audio_object == 2 ||
  33.       audio_object == 3 || 
  34.       audio_object == 4 ||
  35.       audio_object == 6 ||
  36.       audio_object == 7) 
  37.     return 1;
  38.   return 0;
  39. }
  40. extern "C" int audio_object_type_is_celp (mpeg4_audio_config_t *mptr)
  41. {
  42.   unsigned int audio_object;
  43.   audio_object = mptr->audio_object_type;
  44.   if (audio_object == 8) 
  45.     return 1;
  46.   return 0;
  47. }
  48. extern "C" void decode_mpeg4_audio_config (const uint8_t *buffer, 
  49.    uint32_t buf_len,
  50.    mpeg4_audio_config_t *mptr)
  51. {
  52.   CBitstream bit;
  53.   uint32_t ret;
  54.   bit.init(buffer, buf_len * 8);
  55.   if (bit.getbits(5, &ret) < 0)
  56.     return;
  57.   mptr->audio_object_type = ret;
  58.   if (bit.getbits(4, &ret) < 0)
  59.     return;
  60.   if (ret == 0xf) {
  61.     if (bit.getbits(24, &ret) < 0) 
  62.       return;
  63.     mptr->frequency = ret;
  64.   } else {
  65.     mptr->frequency = freq_index_to_freq[ret];
  66.   }
  67.   if (bit.getbits(4, &ret) < 0)
  68.     return;
  69.   mptr->channels = ret;
  70.   // rptr points to remaining bits - starting with 0x04, moving
  71.   // down buffer_len.
  72.   if (audio_object_type_is_aac(mptr)) {
  73.     if (bit.getbits(1, &ret) < 0)
  74.       return;
  75.     if (ret == 0) {
  76.       mptr->codec.aac.frame_len_1024 = 1;
  77.     } else {
  78.       mptr->codec.aac.frame_len_1024 = 0;
  79.     }
  80.   } else if (audio_object_type_is_celp(mptr)){
  81.     try {
  82.       mptr->codec.celp.isBaseLayer = bit.GetBits(1);
  83.       if (mptr->codec.celp.isBaseLayer == 0) {
  84. mptr->codec.celp.isBWSLayer = bit.GetBits(1);
  85. if (mptr->codec.celp.isBWSLayer == 0) {
  86.   mptr->codec.celp.CELP_BRS_id = bit.GetBits(2);
  87. }
  88.       }
  89.       mptr->codec.celp.NumOfBitsInBuffer=bit.bits_remain();
  90.       mptr->codec.celp.excitation_mode = bit.GetBits(1);
  91.       mptr->codec.celp.sample_rate_mode = bit.GetBits(1);
  92.       mptr->codec.celp.fine_rate_control = bit.GetBits(1);
  93.       if (mptr->codec.celp.excitation_mode == CELP_EXCITATION_MODE_RPE) {
  94. mptr->codec.celp.rpe_config = bit.GetBits(3);
  95. // 16000 is 10 msec, all others are 15 msec
  96. if (mptr->codec.celp.rpe_config == 1) // 16000 bitrate
  97.   mptr->codec.celp.samples_per_frame = (16000 * 10) / 1000;
  98. else
  99.   mptr->codec.celp.samples_per_frame = (16000 * 15) / 1000;
  100.       } else {
  101. mptr->codec.celp.mpe_config = bit.GetBits(5);
  102. mptr->codec.celp.num_enh_layers = bit.GetBits(2);
  103. if (mptr->codec.celp.sample_rate_mode == 1) {
  104.   // 16kHz sample rate
  105.   if (mptr->codec.celp.mpe_config < 16) {
  106.     mptr->codec.celp.samples_per_frame = (16000 * 20) / 1000;
  107.   } else {
  108.     mptr->codec.celp.samples_per_frame = (16000 * 10) / 1000;
  109.   }
  110. } else {
  111.   if (bit.bits_remain() > 0) {
  112.     mptr->codec.celp.bwsm = bit.GetBits(1);
  113.   } else {
  114.     mptr->codec.celp.bwsm = 0;
  115.   }
  116.   if (mptr->codec.celp.mpe_config < 3) {
  117.     //40
  118.     mptr->codec.celp.samples_per_frame = (8000 * 40) / 1000;
  119.   } else if (mptr->codec.celp.mpe_config < 6) {
  120.     // 30
  121.     mptr->codec.celp.samples_per_frame = (8000 * 30) / 1000;
  122.   } else if (mptr->codec.celp.mpe_config < 22) {
  123.     // 20
  124.     mptr->codec.celp.samples_per_frame = (8000 * 20) / 1000;
  125.   } else if (mptr->codec.celp.mpe_config < 27) {
  126.     // 10
  127.     mptr->codec.celp.samples_per_frame = (8000 * 10) / 1000;
  128.   } else {
  129.     // 30
  130.     mptr->codec.celp.samples_per_frame = (8000 * 30) / 1000;
  131.   }
  132.   if (mptr->codec.celp.bwsm != 0) {
  133.     mptr->codec.celp.samples_per_frame *= 2;
  134.   }
  135. }      
  136.       }
  137.     } catch (...) {}
  138.   }
  139. }