124 lines
3.1 KiB
C++
124 lines
3.1 KiB
C++
|
|
/***************************************************************************************
|
||
|
|
*
|
||
|
|
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||
|
|
*
|
||
|
|
* By downloading, copying, installing or using the software you agree to this license.
|
||
|
|
* If you do not agree to this license, do not download, install,
|
||
|
|
* copy or use the software.
|
||
|
|
*
|
||
|
|
* Copyright (C) 2014-2024, Happytimesoft Corporation, all rights reserved.
|
||
|
|
*
|
||
|
|
* Redistribution and use in binary forms, with or without modification, are permitted.
|
||
|
|
*
|
||
|
|
* Unless required by applicable law or agreed to in writing, software distributed
|
||
|
|
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||
|
|
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
|
||
|
|
* language governing permissions and limitations under the License.
|
||
|
|
*
|
||
|
|
****************************************************************************************/
|
||
|
|
|
||
|
|
#include "sys_inc.h"
|
||
|
|
#include "rtp_rx.h"
|
||
|
|
#include "rtp.h"
|
||
|
|
|
||
|
|
|
||
|
|
BOOL rtp_data_rx(RTPRXI * p_rxi, uint8 * p_data, int len)
|
||
|
|
{
|
||
|
|
uint8 * p_rtp = p_data;
|
||
|
|
uint32 rtp_len = len;
|
||
|
|
|
||
|
|
// Check for the 12-byte RTP header:
|
||
|
|
if (rtp_len < 12)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint32 rtpHdr = rtp_read_uint32(p_rtp); p_rtp += 4; rtp_len -= 4;
|
||
|
|
uint8 rtpPT = ((rtpHdr & 0x007f0000) >> 16);
|
||
|
|
BOOL rtpMarkerBit = (rtpHdr & 0x00800000) != 0;
|
||
|
|
uint16 rtpSeq = rtpHdr & 0xFFFF;
|
||
|
|
uint32 rtpTimestamp = rtp_read_uint32(p_rtp); p_rtp += 4; rtp_len -= 4;
|
||
|
|
uint32 rtpSSRC = rtp_read_uint32(p_rtp); p_rtp += 4; rtp_len -= 4;
|
||
|
|
|
||
|
|
// Check the RTP version number (it should be 2)
|
||
|
|
if ((rtpHdr & 0xC0000000) != 0x80000000)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Skip over any CSRC identifiers in the header
|
||
|
|
uint32 cc = (rtpHdr >> 24) & 0x0F;
|
||
|
|
if (rtp_len < cc * 4)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
p_rtp += cc * 4; rtp_len -= cc * 4;
|
||
|
|
|
||
|
|
// Check for (& ignore) any RTP header extension
|
||
|
|
if (rtpHdr & 0x10000000)
|
||
|
|
{
|
||
|
|
if (rtp_len < 4)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint32 extHdr = rtp_read_uint32(p_rtp); p_rtp += 4; rtp_len -= 4;
|
||
|
|
uint32 remExtSize = 4 * (extHdr & 0xFFFF);
|
||
|
|
if (rtp_len < remExtSize)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
p_rtp += remExtSize; rtp_len -= remExtSize;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Discard any padding bytes:
|
||
|
|
if (rtpHdr & 0x20000000)
|
||
|
|
{
|
||
|
|
if (rtp_len == 0)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint32 numPaddingBytes = (uint32)p_rtp[rtp_len-1];
|
||
|
|
if (rtp_len < numPaddingBytes)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
rtp_len -= numPaddingBytes;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (0 == p_rxi->rtp_pt)
|
||
|
|
{
|
||
|
|
p_rxi->rtp_pt = rtpPT;
|
||
|
|
}
|
||
|
|
else if (rtpPT != p_rxi->rtp_pt)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (p_rxi->ssrc && p_rxi->ssrc != rtpSSRC)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, prev ssrc[%u], cur ssrc[%u]!!!\r\n", __FUNCTION__, p_rxi->ssrc, rtpSSRC);
|
||
|
|
}
|
||
|
|
p_rxi->ssrc = rtpSSRC;
|
||
|
|
|
||
|
|
if (p_rxi->seq && p_rxi->seq != (uint16)(rtpSeq - 1))
|
||
|
|
{
|
||
|
|
p_rxi->rxf_loss = 1;
|
||
|
|
log_print(HT_LOG_WARN, "%s, prev seq[%u], cur seq[%u]!!!\r\n", __FUNCTION__, p_rxi->seq, rtpSeq);
|
||
|
|
}
|
||
|
|
p_rxi->seq = rtpSeq;
|
||
|
|
|
||
|
|
p_rxi->rxf_marker = rtpMarkerBit;
|
||
|
|
p_rxi->ts = rtpTimestamp;
|
||
|
|
|
||
|
|
p_rxi->p_data = p_rtp;
|
||
|
|
p_rxi->len = rtp_len;
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|