コード例 #1
0
ファイル: Filter.cpp プロジェクト: uchitaso/orkweb
void UlawToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
{
	m_outputAudioChunk.reset();

	if(inputAudioChunk.get() == NULL)
	{
		return;
	}
	else if(inputAudioChunk->GetNumSamples() == 0)
	{
		return;
	}

	AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails();
	if(SupportsInputRtpPayloadType(outputDetails.m_rtpPayloadType) == false)
	{
		return;
	}

	// Create output buffer
	m_outputAudioChunk.reset(new AudioChunk());
	outputDetails.m_rtpPayloadType = -1;		//  Override details that this filter changes
	outputDetails.m_encoding = PcmAudio;
	int numSamples = inputAudioChunk->GetNumSamples();
	outputDetails.m_numBytes = numSamples*2;
	short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(outputDetails);
	char* inputBuffer = (char*)inputAudioChunk->m_pBuffer;
	

	for(int i=0; i<numSamples; i++)
	{
		outputBuffer[i] = (short)ulaw2linear(inputBuffer[i]);
	}	
}
コード例 #2
0
ファイル: IlbcFilters.cpp プロジェクト: HiPiH/Oreka
void IlbcToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
{
	int r_samples = 0, fs = 0, i = 0, pos = 0, o_samples = 0, j = 0;
	float ilbcf[240];

	m_outputAudioChunk.reset();

	if(inputAudioChunk.get() == NULL) {
		return;
	}

	if(inputAudioChunk->GetNumSamples() == 0) {
		return;
	}

	AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails();

	if(SupportsInputRtpPayloadType(outputDetails.m_rtpPayloadType) == false)
	{
		return;
	}

	r_samples = inputAudioChunk->GetNumSamples();
	if((r_samples % 50) && (r_samples % 38)) {
		/* Strange iLBC frame that is not a multiple of 50 bytes
		 * (30ms frame) and neither is it a multiple of 38 bytes
		 * (20ms frame). We should probably log something? */
                LOG4CXX_ERROR(this->s_ilbclog, "Error, received iLBC frame is not a multiple of 50 or 38!");
		return;
	}

	if(!(r_samples % 50)) {
		i = r_samples / 50;
		o_samples = i * 240;
		fs = 50;
#if 0
		LOG4CXX_INFO(this->s_ilbclog, "Frame size is 50 bytes");
#endif
	} else {
		i = r_samples / 38;
		o_samples = i * 160;
		fs = 38;
#if 0
		LOG4CXX_INFO(this->s_ilbclog, "Frame size is 38 bytes");
#endif
	}

	m_outputAudioChunk.reset(new AudioChunk());
	outputDetails.m_rtpPayloadType = -1;
	outputDetails.m_encoding = PcmAudio;

	outputDetails.m_numBytes = (o_samples * 2);
	short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(outputDetails);
	unsigned char* inputBuffer = (unsigned char*)inputAudioChunk->m_pBuffer;

	for(i = 0; i < r_samples; i += fs) {
		if((pos+((fs == 50) ? 240 : 160)) <= o_samples) {
			if(fs == 50) {
				iLBC_decode(ilbcf, inputBuffer+i, &dec30, 1);

				for(j = 0; j < 240; j++) {
					outputBuffer[pos + j] = (short)ilbcf[j];
				}

				pos += 240;
			} else {
				iLBC_decode(ilbcf, inputBuffer+i, &dec20, 1);

				for(j = 0; j < 160; j++) {
                                        outputBuffer[pos + j] = (short)ilbcf[j];
                                }

                                pos += 160;
			}
		} else {
			/* This should ordinarily never happen.
			 * Log something? */
			CStdString logMsg;

			logMsg.Format("Strange, I ran out of space: pos=%d, o_samples=%d, r_samples=%d, i=%d, "
					"(pos+((fs == 50) ? 240 : 160))=%d",
					pos, o_samples, r_samples, i, (pos+((fs == 50) ? 240 : 160)));
			LOG4CXX_ERROR(this->s_ilbclog, logMsg);
			return;
		}
	}
}