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

流媒体/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, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "mp4live.h"
  22. #include "audio_lame.h"
  23. #include <mp4av.h>
  24. CLameAudioEncoder::CLameAudioEncoder()
  25. {
  26. m_mp3FrameBuffer = NULL;
  27. }
  28. bool CLameAudioEncoder::Init(CLiveConfig* pConfig, bool realTime)
  29. {
  30. m_pConfig = pConfig;
  31. lame_init(&m_lameParams);
  32. m_lameParams.num_channels = 
  33. m_pConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS);
  34. m_lameParams.in_samplerate = 
  35. m_pConfig->GetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE);
  36. m_lameParams.brate = 
  37. m_pConfig->GetIntegerValue(CONFIG_AUDIO_BIT_RATE);
  38. m_lameParams.mode = 0;
  39. m_lameParams.quality = 2;
  40. m_lameParams.silent = 1;
  41. m_lameParams.gtkflag = 0;
  42. lame_init_params(&m_lameParams);
  43. if (m_lameParams.in_samplerate != m_lameParams.out_samplerate) {
  44. error_message("warning: lame audio sample rate mismatch");
  45. m_pConfig->SetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE, 
  46. m_lameParams.out_samplerate);
  47. }
  48. m_samplesPerFrame = MP4AV_Mp3GetSamplingWindow(
  49. m_pConfig->GetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE));
  50. m_mp3FrameMaxSize = (u_int)(1.25 * m_samplesPerFrame) + 7200;
  51. m_mp3FrameBufferSize = 2 * m_mp3FrameMaxSize;
  52. m_mp3FrameBufferLength = 0;
  53. m_mp3FrameBuffer = (u_int8_t*)malloc(m_mp3FrameBufferSize);
  54. if (!m_mp3FrameBuffer) {
  55. return false;
  56. }
  57. return true;
  58. }
  59. u_int32_t CLameAudioEncoder::GetSamplesPerFrame()
  60. {
  61. return m_samplesPerFrame;
  62. }
  63. bool CLameAudioEncoder::EncodeSamples(
  64. u_int16_t* pBuffer, 
  65. u_int32_t bufferLength)
  66. {
  67. if (m_pConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS) == 2) {
  68. bool rc;
  69. u_int16_t* leftBuffer = NULL;
  70. u_int16_t* rightBuffer = NULL;
  71. DeinterleaveStereoSamples(
  72. pBuffer, 
  73. bufferLength / 2, 
  74. &leftBuffer, 
  75. &rightBuffer);
  76. rc = EncodeSamples(leftBuffer, rightBuffer, bufferLength / 2);
  77. free(leftBuffer);
  78. free(rightBuffer);
  79. return rc; 
  80. // else channels == 1
  81. return EncodeSamples(pBuffer, NULL, bufferLength);
  82. }
  83. bool CLameAudioEncoder::EncodeSamples(
  84. u_int16_t* pLeftBuffer, 
  85. u_int16_t* pRightBuffer, 
  86. u_int32_t bufferLength)
  87. {
  88. u_int32_t mp3DataLength = 0;
  89. if (pLeftBuffer) {
  90. // call lame encoder
  91. mp3DataLength = lame_encode_buffer(
  92. &m_lameParams,
  93. (short*)pLeftBuffer, 
  94. (short*)pRightBuffer, 
  95. m_samplesPerFrame,
  96. (char*)&m_mp3FrameBuffer[m_mp3FrameBufferLength], 
  97. m_mp3FrameBufferSize - m_mp3FrameBufferLength);
  98. } else { // pLeftBuffer == NULL, signal to stop encoding
  99. mp3DataLength = lame_encode_finish(
  100. &m_lameParams,
  101. (char*)&m_mp3FrameBuffer[m_mp3FrameBufferLength], 
  102. m_mp3FrameBufferSize - m_mp3FrameBufferLength);
  103. }
  104. m_mp3FrameBufferLength += mp3DataLength;
  105. return (mp3DataLength > 0);
  106. }
  107. bool CLameAudioEncoder::GetEncodedSamples(
  108. u_int8_t** ppBuffer, 
  109. u_int32_t* pBufferLength,
  110. u_int32_t* pNumSamples)
  111. {
  112. const u_int8_t* mp3Frame;
  113. u_int32_t mp3FrameLength;
  114. if (!MP4AV_Mp3GetNextFrame(m_mp3FrameBuffer, m_mp3FrameBufferLength, 
  115.   &mp3Frame, &mp3FrameLength)) {
  116. return false;
  117. }
  118. // check if we have all the bytes for the MP3 frame
  119. if (mp3FrameLength > m_mp3FrameBufferLength) {
  120. return false;
  121. }
  122. // need a buffer for this MP3 frame
  123. *ppBuffer = (u_int8_t*)malloc(mp3FrameLength);
  124. if (*ppBuffer == NULL) {
  125. return false;
  126. }
  127. // copy the MP3 frame
  128. memcpy(*ppBuffer, mp3Frame, mp3FrameLength);
  129. *pBufferLength = mp3FrameLength;
  130. // shift what remains in the buffer down
  131. memcpy(m_mp3FrameBuffer, 
  132. mp3Frame + mp3FrameLength, 
  133. m_mp3FrameBufferLength - mp3FrameLength);
  134. m_mp3FrameBufferLength -= mp3FrameLength;
  135. *pNumSamples = m_samplesPerFrame;
  136. return true;
  137. }
  138. void CLameAudioEncoder::Stop()
  139. {
  140. free(m_mp3FrameBuffer);
  141. m_mp3FrameBuffer = NULL;
  142. }