int MpdSipxPcmu::decode(const MpRtpBufPtr &pPacket, unsigned decodedBufferLength,// has always sufficient size MpAudioSample *samplesBuffer, UtlBoolean bIsPLCFrame) { if (!pPacket.isValid()) return 0; unsigned payloadSize = pPacket->getPayloadSize(); unsigned maxPayloadSize = smCodecInfo.getMaxPacketBits()/8; assert(payloadSize <= maxPayloadSize); if (payloadSize > maxPayloadSize) { return 0; } int sampleCount = pPacket->getPayloadSize(); // number of samples to decode G711U_Decoder(sampleCount, (const uint8_t*)pPacket->getDataPtr(), samplesBuffer); return sampleCount; }
int MpJitterBuffer::ReceivePacket(JB_uchar* RTPpacket, JB_size RTPlength, JB_ulong TS) { int numSamples = 0; unsigned char* pRtpData = NULL; struct rtpHeader* pHdr = (struct rtpHeader*) RTPpacket; int cc; int payloadType; int overhead; payloadType = (pHdr->mpt) & 0x7f; cc = (pHdr->vpxcc) & 0x0f; overhead = sizeof(struct rtpHeader) + (cc*sizeof(int)); switch (payloadType) { case 0: // G.711 u-Law case 8: // G.711 a-Law numSamples = RTPlength - overhead;; pRtpData = RTPpacket + overhead; break; default: break; } if (0 == numSamples) { return 0; } if (numSamples != 160) { if (debugCount++ < 10) { printf("RTPlength=%d, cc=%d, payloadType=%d\n", RTPlength, cc, payloadType); } } if (JbQWait > 0) { JbQWait--; } if (JbQueueSize == JbQCount) { // discard some data... JbQOut = JbQIn + numSamples; JbQCount -= numSamples; } switch (payloadType) { case 0: // G.711 u-Law G711U_Decoder(numSamples, pRtpData, JbQ+JbQIn); break; case 8: // G.711 a-Law G711A_Decoder(numSamples, pRtpData, JbQ+JbQIn); break; default: break; } JbQCount += numSamples; JbQIn += numSamples; if (JbQIn >= JbQueueSize) { JbQIn -= JbQueueSize; } return 0; }