2,543
社区成员
发帖
与我相关
我的任务
分享
void Flow::send(char* buffer, unsigned int size)
{
char encodedDataTemp[48000] = { 0 };
char encodedDataTemp1[48000] = { 0 };
char decodedDataTemp[48000] = { 0 };
char tempData[48000] = { 0,1,2,3,11,12,13,21,22,23,31,32,33,41,42,43,51,52,53,61,62,63,71,72,73,81,82,83,91,92,93 };
if (true)
{
memcpy(tempData, buffer, size);
}
if (mMediaStream)
{
MBRTPHeader *rtpheader;
rtpheader = (MBRTPHeader *)buffer;
if (rtpheader->payloadtype == 103 || rtpheader->payloadtype == 8 || rtpheader->payloadtype == 0 || rtpheader->payloadtype == 105)
{
CMBOpusEncoder1 oMbOpusEncoder;
CMBOpusDecoder1 oMbOpusDecoder;
MBG711Codec1 m_G711CodecDecoder;
//if判断, 如果输入输出是同类型编码, 直接转发, 不进入这个if
if (!((mMediaStream->audioRtpInfo.codecType == 0 && rtpheader->payloadtype==0) ||
(mMediaStream->audioRtpInfo.codecType == 1 && rtpheader->payloadtype == 8) ||
(mMediaStream->audioRtpInfo.codecType == 2 && rtpheader->payloadtype == 105) ||
(mMediaStream->audioRtpInfo.codecType == 4 && rtpheader->payloadtype == 103)))
{
unsigned int statusMB = 1;
int extension_lenth = 0;
if (rtpheader->extension)
{
extension_lenth = buffer[sizeof(MBRTPHeader)+3] & 0xff;
extension_lenth = (extension_lenth << 8) + buffer[sizeof(MBRTPHeader)+2] & 0xff;
extension_lenth = (extension_lenth << 16) + buffer[sizeof(MBRTPHeader)+1] & 0xff;
extension_lenth = (extension_lenth << 24) + buffer[sizeof(MBRTPHeader)] & 0xff;
}
int ret_length = 0;
switch (rtpheader->payloadtype)
{
case 103://opus解码
oMbOpusDecoder.Create();
ret_length = oMbOpusDecoder.DecodeFrame(buffer + sizeof(MBRTPHeader)+extension_lenth, size - sizeof(MBRTPHeader)-extension_lenth, decodedDataTemp, 48000);
oMbOpusDecoder.Destroy();
break;
case 8://G711解码
statusMB = m_G711CodecDecoder.DecodePCMA((unsigned char*)buffer + sizeof(MBRTPHeader)+extension_lenth, size - sizeof(MBRTPHeader)-extension_lenth, (unsigned char*)decodedDataTemp, ret_length);
break;
case 0://G711解码
statusMB = m_G711CodecDecoder.DecodePCMU((unsigned char*)buffer + sizeof(MBRTPHeader)+extension_lenth, size - sizeof(MBRTPHeader)-extension_lenth, (unsigned char*)decodedDataTemp, ret_length);
break;
case 105:
break;
default:
break;
}
MBRTPHeader *rtpheadertmp = (MBRTPHeader *)tempData;
switch (mMediaStream->audioRtpInfo.codecType)
{
case 4://opus编码
oMbOpusEncoder.Create();
oMbOpusEncoder.EncodeFrame(decodedDataTemp, ret_length, encodedDataTemp);
size = oMbOpusEncoder.m_EncodedFrameSize;
oMbOpusEncoder.Destroy();
memcpy(tempData + sizeof(MBRTPHeader)+extension_lenth, encodedDataTemp, size);
rtpheadertmp->payloadtype = 103;
size = size + sizeof(MBRTPHeader)+extension_lenth;
break;
case 1://G711编码
m_G711CodecDecoder.EncodePCMA((unsigned char*)decodedDataTemp, ret_length);
//size = m_G711CodecDecoder.encodedLen;//
size = ret_length / 2;
memcpy(tempData + sizeof(MBRTPHeader)+extension_lenth, m_G711CodecDecoder.encodedData, size);
rtpheadertmp->payloadtype = 8;
size = size + sizeof(MBRTPHeader)+extension_lenth;
break;
case 0://G711编码
m_G711CodecDecoder.EncodePCMU((unsigned char*)decodedDataTemp, ret_length);
//size = m_G711CodecDecoder.encodedLen;//
size = ret_length / 2;
memcpy(tempData + sizeof(MBRTPHeader)+extension_lenth, m_G711CodecDecoder.encodedData, size);
rtpheadertmp->payloadtype = 0;
size = size + sizeof(MBRTPHeader)+extension_lenth;
break;
case 2:
break;
default:
break;
}
}
}
}
assert(mTurnSocket.get());
if(isReady())
{
if (processSendData(tempData, size, mTurnSocket->getConnectedAddress(), mTurnSocket->getConnectedPort()))
{
mTurnSocket->send(tempData, size);
}
if (!mStartingSend)
{
if(mMediaStream)
mMediaStream->onFlowFirstSendRtp(mMediaStream->audioRtpInfo.localrtpid,mMediaStream->videoRtpInfo.localrtpid);
mStartingSend = true;
}
}
else
{
onSendFailure(mTurnSocket->getSocketDescriptor(), boost::system::error_code(flowmanager::InvalidState, boost::asio::error::misc_category));
}
}