// GenericRTP2PCMDecoder.cpp: implementation of the GenericRTP2PCMDecoder class. // ////////////////////////////////////////////////////////////////////// #include "GenericRTP2PCMDecoder.h" #include "RTPPacket.h" #include "AudioSample.h" #include "AudioSampleManager.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// GenericRTP2PCMDecoder::GenericRTP2PCMDecoder() { char subFacilityName[100]; sprintf(subFacilityName, "GenericRTP2PCMDecoder:%x", this); tracer.SetSubFacilityName(subFacilityName); SetTraceLevel(); lastCodec = -1; SetCodecInRegistry(""); } GenericRTP2PCMDecoder::~GenericRTP2PCMDecoder() { } int GenericRTP2PCMDecoder::SetTraceLevel() { long SystemMask = 0; if ((SystemMask = GetRegKeyLong(HKEY_CURRENT_USER, "Software\\Cisco Systems\\MTC\\Tracing", "AllComponents", 0x0)) == 0) { SystemMask = GetRegKeyLong(HKEY_CURRENT_USER, "Software\\Cisco Systems\\MTC\\Tracing", "GenericRTP2PCMDecoder", 0x100000); } tracer.SetSystemMask(SystemMask); return 0; } int GenericRTP2PCMDecoder::SetCodecInRegistry(char *codecName) { SetRegKeyString(HKEY_CURRENT_USER, "Software\\Cisco Systems\\CCNMediaTerm\\1.0", "RTPReceiveCodec", codecName); return 0; } int GenericRTP2PCMDecoder::TransformStarted() { return 0; } int GenericRTP2PCMDecoder::TransformStopped() { SetCodecInRegistry(""); lastCodec = -1; return 0; } int GenericRTP2PCMDecoder::TransformAudioSamples(std::vector > &data, AudioSample **ppAudioSample) { int result = 0; AudioSample *outSample = NULL; AudioSample *inSample = NULL; if (data.size() > 0) { inSample = data[0].first; } if (inSample) { result = AudioSampleManager::GetInstance()->GetAudioSample(&outSample, this); if (outSample) { *ppAudioSample = outSample; outSample->SetFormat(WaveFormat::GetWaveFormat(WaveFormat_PCM_16_8_1)); RTPPacket *rtpHeader = inSample->RTPHeader(); if (rtpHeader) { outSample->SetRTPHeader(rtpHeader->CloneHeader()); if (inSample->DataSize() <= 0) { outSample->SetSilenceDuration(inSample->GetSilenceDuration()); } else { int outputSize = outSample->BufferSize(); int inputSize = inSample->DataSize(); bool writeCodec = false; if (lastCodec != rtpHeader->PayloadType() && rtpHeader->PayloadType() != RTP_PAYLOADTYPE_SID) { writeCodec = true; lastCodec = rtpHeader->PayloadType(); } switch (rtpHeader->PayloadType()) { case RTP_PAYLOADTYPE_G711_ULAW: tracer.tracef(DET, "TransformAudioSamples : %d byte G.711 ULAW packet\n", inputSize); g711Codec.SetULaw(); result = g711Codec.Decode(inSample->Data(), inputSize, outSample->Data(), &outputSize); if (writeCodec) SetCodecInRegistry("G.711 ULaw"); break; case RTP_PAYLOADTYPE_G711_ALAW: tracer.tracef(DET, "TransformAudioSamples : %d byte G.711 ALAW packet\n", inputSize); g711Codec.SetALaw(); result = g711Codec.Decode(inSample->Data(), inputSize, outSample->Data(), &outputSize); if (writeCodec) SetCodecInRegistry("G.711 ALaw"); break; case RTP_PAYLOADTYPE_SID: tracer.tracef(DET, "TransformAudioSamples : %d byte SID packet\n", inputSize); result = 0; outputSize = 4; memcpy(outSample->Data(), inSample->Data(), 4); break; default: result = -10; char codecName[100]; sprintf(codecName, "Unknown Type %u (ERROR)", rtpHeader->PayloadType()); if (writeCodec) SetCodecInRegistry(codecName); } outSample->SetDataSize(outputSize); } } else { result = -20; } } else { result = -30; } } *ppAudioSample = outSample; return result; }