Initial setup for CLion
This commit is contained in:
123
MediaClient/rtp/rtp_rx.cpp
Normal file
123
MediaClient/rtp/rtp_rx.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
/***************************************************************************************
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user