⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpeg4_audio_config.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 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. 2001.  All Rights Reserved. *  * Contributor(s):  *              Bill May        wmay@cisco.com */#include "systems.h"#include "mpeg4_audio_config.h"#include "bitstream/bitstream.h"static long freq_index_to_freq[] = {  96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000,   12000, 11025, 8000, 7350 };extern "C" int audio_object_type_is_aac (mpeg4_audio_config_t *mptr){  unsigned int audio_object;  audio_object = mptr->audio_object_type;  if (audio_object == 1 ||       audio_object == 2 ||      audio_object == 3 ||       audio_object == 4 ||      audio_object == 6 ||      audio_object == 7)     return 1;  return 0;}extern "C" int audio_object_type_is_celp (mpeg4_audio_config_t *mptr){  unsigned int audio_object;  audio_object = mptr->audio_object_type;  if (audio_object == 8)     return 1;  return 0;}extern "C" void decode_mpeg4_audio_config (const uint8_t *buffer, 					   uint32_t buf_len,					   mpeg4_audio_config_t *mptr){  CBitstream bit;  uint32_t ret;  bit.init(buffer, buf_len * 8);  if (bit.getbits(5, &ret) < 0)    return;  mptr->audio_object_type = ret;  if (bit.getbits(4, &ret) < 0)    return;  if (ret == 0xf) {    if (bit.getbits(24, &ret) < 0)       return;    mptr->frequency = ret;  } else {    mptr->frequency = freq_index_to_freq[ret];  }  if (bit.getbits(4, &ret) < 0)    return;  mptr->channels = ret;  // rptr points to remaining bits - starting with 0x04, moving  // down buffer_len.  if (audio_object_type_is_aac(mptr)) {    if (bit.getbits(1, &ret) < 0)      return;    if (ret == 0) {      mptr->codec.aac.frame_len_1024 = 1;    } else {      mptr->codec.aac.frame_len_1024 = 0;    }  } else if (audio_object_type_is_celp(mptr)){    try {      mptr->codec.celp.isBaseLayer = bit.GetBits(1);      if (mptr->codec.celp.isBaseLayer == 0) {	mptr->codec.celp.isBWSLayer = bit.GetBits(1);	if (mptr->codec.celp.isBWSLayer == 0) {	  mptr->codec.celp.CELP_BRS_id = bit.GetBits(2);	}      }      mptr->codec.celp.NumOfBitsInBuffer=bit.bits_remain();      mptr->codec.celp.excitation_mode = bit.GetBits(1);      mptr->codec.celp.sample_rate_mode = bit.GetBits(1);      mptr->codec.celp.fine_rate_control = bit.GetBits(1);      if (mptr->codec.celp.excitation_mode == CELP_EXCITATION_MODE_RPE) {	mptr->codec.celp.rpe_config = bit.GetBits(3);	// 16000 is 10 msec, all others are 15 msec	if (mptr->codec.celp.rpe_config == 1) // 16000 bitrate	  mptr->codec.celp.samples_per_frame = (16000 * 10) / 1000;	else	  mptr->codec.celp.samples_per_frame = (16000 * 15) / 1000;      } else {	mptr->codec.celp.mpe_config = bit.GetBits(5);	mptr->codec.celp.num_enh_layers = bit.GetBits(2);	if (mptr->codec.celp.sample_rate_mode == 1) {	  // 16kHz sample rate	  if (mptr->codec.celp.mpe_config < 16) {	    mptr->codec.celp.samples_per_frame = (16000 * 20) / 1000;	  } else {	    mptr->codec.celp.samples_per_frame = (16000 * 10) / 1000;	  }	} else {	  if (bit.bits_remain() > 0) {	    mptr->codec.celp.bwsm = bit.GetBits(1);	  } else {	    mptr->codec.celp.bwsm = 0;	  }	  if (mptr->codec.celp.mpe_config < 3) {	    //40	    mptr->codec.celp.samples_per_frame = (8000 * 40) / 1000;	  } else if (mptr->codec.celp.mpe_config < 6) {	    // 30	    mptr->codec.celp.samples_per_frame = (8000 * 30) / 1000;	  } else if (mptr->codec.celp.mpe_config < 22) {	    // 20	    mptr->codec.celp.samples_per_frame = (8000 * 20) / 1000;	  } else if (mptr->codec.celp.mpe_config < 27) {	    // 10	    mptr->codec.celp.samples_per_frame = (8000 * 10) / 1000;	  } else {	    // 30	    mptr->codec.celp.samples_per_frame = (8000 * 30) / 1000;	  }	  if (mptr->codec.celp.bwsm != 0) {	    mptr->codec.celp.samples_per_frame *= 2;	  }	}            }    } catch (...) {}  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -