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

📄 speexcodec.cxx

📁 sloedgy open sip stack source code
💻 CXX
📖 第 1 页 / 共 2 页
字号:
                                   EQUIVALENCE_MANUFACTURER_CODE,
                                   NULL, 0, 0, P_MAX_INDEX)
{
  PStringStream s;
  if (sampleRate == 8000)
    s << "Speex bs" << speex_nb_mode.bitstream_version << " Narrow" << mode;
  else
    s << "Speex bs" << speex_wb_mode.bitstream_version << " Wide" << mode;
  PINDEX len = s.GetLength();
  memcpy(nonStandardData.GetPointer(len), (const char *)s, len);
}


/////////////////////////////////////////////////////////////////////////

SpeexNarrow2AudioCapability::SpeexNarrow2AudioCapability()
  : SpeexNonStandardAudioCapability(2, 8000) 
{
}


PObject * SpeexNarrow2AudioCapability::Clone() const
{
  return new SpeexNarrow2AudioCapability(*this);
}


PString SpeexNarrow2AudioCapability::GetFormatName() const
{
  return OpalSpeexNarrow_5k95;
}


/////////////////////////////////////////////////////////////////////////

SpeexNarrow3AudioCapability::SpeexNarrow3AudioCapability()
  : SpeexNonStandardAudioCapability(3, 8000) 
{
}


PObject * SpeexNarrow3AudioCapability::Clone() const
{
  return new SpeexNarrow3AudioCapability(*this);
}


PString SpeexNarrow3AudioCapability::GetFormatName() const
{
  return OpalSpeexNarrow_8k;
}


/////////////////////////////////////////////////////////////////////////

SpeexNarrow4AudioCapability::SpeexNarrow4AudioCapability()
  : SpeexNonStandardAudioCapability(4, 8000) 
{
}


PObject * SpeexNarrow4AudioCapability::Clone() const
{
  return new SpeexNarrow4AudioCapability(*this);
}


PString SpeexNarrow4AudioCapability::GetFormatName() const
{
  return OpalSpeexNarrow_11k;
}


/////////////////////////////////////////////////////////////////////////

SpeexNarrow5AudioCapability::SpeexNarrow5AudioCapability()
  : SpeexNonStandardAudioCapability(5, 8000) 
{
}


PObject * SpeexNarrow5AudioCapability::Clone() const
{
  return new SpeexNarrow5AudioCapability(*this);
}


PString SpeexNarrow5AudioCapability::GetFormatName() const
{
  return OpalSpeexNarrow_15k;
}


/////////////////////////////////////////////////////////////////////////

SpeexNarrow6AudioCapability::SpeexNarrow6AudioCapability()
  : SpeexNonStandardAudioCapability(6, 8000) 
{
}


PObject * SpeexNarrow6AudioCapability::Clone() const
{
  return new SpeexNarrow6AudioCapability(*this);
}


PString SpeexNarrow6AudioCapability::GetFormatName() const
{
  return OpalSpeexNarrow_18k2;
}


/////////////////////////////////////////////////////////////////////////

SpeexWide6AudioCapability::SpeexWide6AudioCapability()
  : SpeexNonStandardAudioCapability(6, 16000) 
{
}


PObject * SpeexWide6AudioCapability::Clone() const
{
  return new SpeexWide6AudioCapability(*this);
}


PString SpeexWide6AudioCapability::GetFormatName() const
{
  return OpalSpeexWide_20k6;
}


#endif


/////////////////////////////////////////////////////////////////////////////

Opal_Speex_Transcoder::Opal_Speex_Transcoder(const OpalMediaFormat & inputMediaFormat,
                                             const OpalMediaFormat & outputMediaFormat,
                                             unsigned inputBytesPerFrame,
                                             unsigned outputBytesPerFrame)
  : OpalFramedTranscoder(inputMediaFormat, outputMediaFormat, inputBytesPerFrame, outputBytesPerFrame)
{
  bits = new SpeexBits;
  speex_bits_init(bits);
}


Opal_Speex_Transcoder::~Opal_Speex_Transcoder()
{
  speex_bits_destroy(bits); 
  delete bits;
}


///////////////////////////////////////////////////////////////////////////////

Opal_Speex_Decoder::Opal_Speex_Decoder(const OpalMediaFormat & inputMediaFormat, int mode, int sampleRate)
  : Opal_Speex_Transcoder(inputMediaFormat, OpalPCM16, Speex_Bytes_Per_Frame(mode, sampleRate), (sampleRate == 8000)?NARROW_SAMPLES_PER_FRAME*2:WIDE_SAMPLES_PER_FRAME*2)
{
  if (sampleRate == 8000)
    decoder = speex_decoder_init(&speex_nb_mode);
  else
    decoder = speex_decoder_init(&speex_wb_mode);
  samples_per_frame = (sampleRate == 8000)?NARROW_SAMPLES_PER_FRAME:WIDE_SAMPLES_PER_FRAME;
}


Opal_Speex_Decoder::~Opal_Speex_Decoder()
{
  if (decoder != NULL)
    speex_decoder_destroy(decoder);
}


BOOL Opal_Speex_Decoder::ConvertFrame(const BYTE * src, BYTE * dst)
{
  speex_bits_reset(bits);
  speex_bits_read_from(bits, (char *)src, inputBytesPerFrame); 
  speex_decode_int(decoder, bits, (spx_int16_t *) dst); 

  return TRUE;
}


BOOL Opal_Speex_Decoder::ConvertSilentFrame(BYTE * dst)
{
  speex_decode_int(decoder, NULL, (spx_int16_t *) dst);

  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////

Opal_Speex_Encoder::Opal_Speex_Encoder(const OpalMediaFormat & outputMediaFormat, int mode, int sampleRate)
  : Opal_Speex_Transcoder(OpalPCM16, outputMediaFormat, (sampleRate == 8000)?NARROW_SAMPLES_PER_FRAME*2:WIDE_SAMPLES_PER_FRAME*2, Speex_Bytes_Per_Frame(mode, sampleRate))
{
  if (sampleRate == 8000)
    encoder = speex_encoder_init(&speex_nb_mode);
  else
    encoder = speex_encoder_init(&speex_wb_mode);
  speex_encoder_ctl(encoder, SPEEX_SET_MODE, &mode);
  samples_per_frame = (sampleRate == 8000)?NARROW_SAMPLES_PER_FRAME:WIDE_SAMPLES_PER_FRAME;
  PTRACE(3, "Codec\tSpeex encoder created");
}


Opal_Speex_Encoder::~Opal_Speex_Encoder()
{
  if (encoder != NULL)
    speex_encoder_destroy(encoder);
}
 

BOOL Opal_Speex_Encoder::ConvertFrame(const BYTE * src, BYTE * dst)
{
  speex_bits_reset(bits); 
  speex_encode_int(encoder, (spx_int16_t *) src, bits); 

  speex_bits_write(bits, (char *)dst, outputBytesPerFrame); 

  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////

Opal_Speex_5k95_PCM::Opal_Speex_5k95_PCM()
  : Opal_Speex_Decoder(OpalSpeexNarrow_5k95, 2, 8000)
{
}


Opal_PCM_Speex_5k95::Opal_PCM_Speex_5k95()
  : Opal_Speex_Encoder(OpalSpeexNarrow_5k95, 2, 8000)
{
}


Opal_Speex_8k_PCM::Opal_Speex_8k_PCM()
  : Opal_Speex_Decoder(OpalSpeexNarrow_8k, 3, 8000)
{
}


Opal_PCM_Speex_8k::Opal_PCM_Speex_8k()
  : Opal_Speex_Encoder(OpalSpeexNarrow_8k, 3, 8000)
{
}


Opal_Speex_11k_PCM::Opal_Speex_11k_PCM()
  : Opal_Speex_Decoder(OpalSpeexNarrow_11k, 4, 8000)
{
}


Opal_PCM_Speex_11k::Opal_PCM_Speex_11k()
  : Opal_Speex_Encoder(OpalSpeexNarrow_11k, 4, 8000)
{
}


Opal_Speex_15k_PCM::Opal_Speex_15k_PCM()
  : Opal_Speex_Decoder(OpalSpeexNarrow_15k, 5, 8000)
{
}


Opal_PCM_Speex_15k::Opal_PCM_Speex_15k()
  : Opal_Speex_Encoder(OpalSpeexNarrow_15k, 5, 8000)
{
}


Opal_Speex_18k2_PCM::Opal_Speex_18k2_PCM()
  : Opal_Speex_Decoder(OpalSpeexNarrow_18k2, 6, 8000)
{
}


Opal_PCM_Speex_18k2::Opal_PCM_Speex_18k2()
  : Opal_Speex_Encoder(OpalSpeexNarrow_18k2, 6, 8000)
{
}


Opal_Speex_20k6_PCM::Opal_Speex_20k6_PCM()
  : Opal_Speex_Decoder(OpalSpeexWide_20k6, 6, 16000)
{
}


Opal_PCM_Speex_20k6::Opal_PCM_Speex_20k6()
  : Opal_Speex_Encoder(OpalSpeexWide_20k6, 6, 16000)
{
}


/////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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