📄 rtp.c
字号:
retVal = rtpRead(hRTP, buf, len, p);
if (s->hRTCP && retVal >= 0)
{
/* Informs the RTCP session about a packet that was received in the corresponding
RTP session.*/
rtcpRTPPacketRecv(s->hRTCP, p->sSrc, timestamp, p->timestamp, p->sequenceNumber);
}
return retVal;
}
/************************************************************************************
* rtpGetPort
* description: Returns the current port of the RTP session.
* input: hRTP - Handle of the RTP session.
* output: none.
* return value: If no error occurs, the function returns the current port value.
* Otherwise, it returns a negative value.
***********************************************************************************/
RVAPI
RvUint16 RVCALLCONV rtpGetPort(
IN HRTPSESSION hRTP) /* RTP Session Opaque Handle */
{
rtpSession* s = (rtpSession *)hRTP;
RvAddress localAddress;
RvUint16 sockPort = 0;
RvStatus res;
res = RvSocketGetLocalAddress(&s->socket, &localAddress);
if (res == RV_OK)
{
sockPort = RvAddressGetIpPort(&localAddress);
RvAddressDestruct(&localAddress);
}
return sockPort;
}
/************************************************************************************
* rtpGetVersion
* description: Returns the RTP version of the installed RTP Stack.
* input: none.
* output: none.
* return value: If no error occurs, the function returns the current version value.
* Otherwise, it returns a negative value.
***********************************************************************************/
RVAPI
char * RVCALLCONV rtpGetVersion(void)
{
return (char*)VERSION_STR;
}
/************************************************************************************
* rtpGetVersionNum
* description: Returns the RTP version of the installed RTP Stack.
* input: none.
* output: none.
* return value: If no error occurs, the function returns the current version value.
* Otherwise, it returns a negative value.
***********************************************************************************/
RVAPI
RvUint32 RVCALLCONV rtpGetVersionNum(void)
{
return VERSION_NUM;
}
/* == ENDS: Basic RTP Functions == */
/* == Accessory RTP Functions == */
/************************************************************************************
* rtpGetRTCPSession
* description: Returns the RTCP session.
* input: hRTP - Handle of RTP session.
* output: none.
* return value: hRTCP - Handle of RTCP session.
***********************************************************************************/
RVAPI
HRTCPSESSION RVCALLCONV rtpGetRTCPSession(
IN HRTPSESSION hRTP)
{
rtpSession *s = (rtpSession *)hRTP;
return (s->hRTCP);
}
/************************************************************************************
* rtpSetRTCPSession
* description: set the RTCP session.
* input: hRTP - Handle of RTP session.
* hRTCP - Handle of RTCP session.
* output: none.
* return value:return 0.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpSetRTCPSession(
IN HRTPSESSION hRTP,
IN HRTCPSESSION hRTCP)
{
rtpSession *s = (rtpSession *)hRTP;
s->hRTCP = hRTCP;
return RV_OK;
}
/************************************************************************************
* rtpGetHeaderLength
* description: return the header of RTP message.
* input: none.
* output: none.
* return value:The return value is twelve.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpGetHeaderLength(void)
{
return 12;
}
/************************************************************************************
* rtpRegenSSRC
* description: Generates a new synchronization source value for the RTP session.
* This function, in conjunction with rtpGetSSRC() may be used to
* change the SSRC value when an SSRC collision is detected.
* input: hRTP - Handle of RTP session.
* output: none.
* return value: ssrc - If an error occurs, the function returns a negative value.
* If no error occurs, the function returns a non-negative value.
***********************************************************************************/
RVAPI
RvUint32 RVCALLCONV rtpRegenSSRC(
IN HRTPSESSION hRTP)
{
rtpSession *s = (rtpSession *)hRTP;
RvRandom randomValue;
/* those line is to prevent collision.*/
RvRandomGeneratorGetValue(&rvRtpInstance.randomGenerator, &randomValue);
s->sSrc = (RvUint32)randomValue * (RvUint32)(RvTimestampGet() >> 16);
s->sSrc &= ~s->sSrcMask;
s->sSrc |= s->sSrcPattern;
return s->sSrc;
}
/************************************************************************************
* rtpSetGroupAddress
* description: Defines a multicast IP for the RTP session.
* input: hRTP - Handle of RTP session.
* ip - Multicast IP address for the RTP session.
* output: none.
* return value: return 0.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpSetGroupAddress(
IN HRTPSESSION hRTP, /* RTP Session Opaque Handle */
IN RvUint32 ip)
{
rtpSession *s = (rtpSession *)hRTP;
RvAddress addresses[2];
RvStatus res;
RvAddressConstructIpv4(&addresses[0], ip, RV_ADDRESS_IPV4_ANYPORT);
RvAddressConstructIpv4(&addresses[1], rvRtpInstance.localIp, RV_ADDRESS_IPV4_ANYPORT);
/* This function adds the specified address (in network format) to the specified
Multicast interface for the specified socket.*/
res = RvSocketJoinMulticastGroup(&s->socket, addresses, addresses+1);
RvAddressDestruct(&addresses[0]);
RvAddressDestruct(&addresses[1]);
return res;
}
/************************************************************************************
* rtpResume
* description: Causes a blocked rtpRead() or rtpReadEx() function running in
* another thread to fail.
* input: hRTP - Handle of RTP session.
* output: none.
* return value: If an error occurs, the function returns a negative value.
* If no error occurs, the function returns a non-negative value.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpResume(
IN HRTPSESSION hRTP)
{
rtpSession *s = (rtpSession *)hRTP;
RvAddress localAddress;
RvAddressIpv4* localIpV4;
RvStatus status;
status = RvSocketGetLocalAddress(&s->socket, &localAddress);
if (status == RV_OK)
{
localIpV4 = (RvAddressIpv4 *)RvAddressGetIpv4(&localAddress);
if (RvAddressIpv4GetIp(localIpV4) == RV_ADDRESS_IPV4_ANYADDRESS)
{
/* No specific IP on this socket - use our default one */
if (rvRtpInstance.localIp != RV_ADDRESS_IPV4_ANYADDRESS)
RvAddressIpv4SetIp(localIpV4, rvRtpInstance.localIp);
else
RvAddressIpv4SetIp(localIpV4, rvRtpInstance.hostIPs[0]);
}
/* We send a dummy buffer to get this connection released from its blocking mode */
RvSocketSendBuffer(&s->socket, (RvUint8*)"", 1, &localAddress, NULL);
RvAddressDestruct(&localAddress);
}
return status;
}
/************************************************************************************
* rtpUseSequenceNumber
* description: Forces the Stack to accept user input for the sequence number of
* the RTP packet. The RTP Stack usually determines the sequence number.
* However, the application can force its own sequence number.
* Call rtpUseSequenceNumber() at the beginning of the RTP session and
* then specify the sequence number in the rtpParam structure of the
* rtpWrite() function.
* input: hRTP - Handle of RTP session.
* output: none.
* return value: return 0.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpUseSequenceNumber(
IN HRTPSESSION hRTP)
{
rtpSession *s = (rtpSession *)hRTP;
s->useSequenceNumber = 1;
return RV_OK;
}
/************************************************************************************
* rtpSetReceiveBufferSize
* description: Changes the RTP session receive buffer size.
* input: hRTP - Handle of RTP session.
* output: none.
* return value: return 0.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpSetReceiveBufferSize(
IN HRTPSESSION hRTP,
IN int size)
{
rtpSession* s = (rtpSession *)hRTP;
/* This function sets the size of the read/write buffers of a socket*/
return RvSocketSetBuffers(&s->socket, -1, size);
}
/************************************************************************************
* rtpSetTransmitBufferSize
* description: Changes the RTP session transmit buffer size.
* input: hRTP - Handle of RTP session.
* size - The new transmit buffer size.
* output: none.
* return value: return 0.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpSetTransmitBufferSize(
IN HRTPSESSION hRTP,
IN int size)
{
rtpSession* s = (rtpSession *)hRTP;
/* This function sets the size of the read/write buffers of a socket*/
return RvSocketSetBuffers(&s->socket, size, -1);
}
/************************************************************************************
* rtpSetTrasmitBufferSize
* description: Changes the RTP session transmit buffer size.
* input: hRTP - Handle of RTP session.
* size - The new transmit buffer size.
* output: none.
* return value: return 0.
* comment : obsolete function provided for compatibility with prev. version
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpSetTrasmitBufferSize(
IN HRTPSESSION hRTP,
IN int size)
{
return rtpSetTransmitBufferSize(hRTP, size);
}
/************************************************************************************
* rtpGetAvailableBytes
* description: Gets the number of bytes available for reading in the RTP session.
* input: hRTP - Handle of RTP session.
* output: none.
* return value: If an error occurs, the function returns a negative value.
* If no error occurs, the function returns a non-negative value.
***********************************************************************************/
RVAPI
RvInt32 RVCALLCONV rtpGetAvailableBytes(
IN HRTPSESSION hRTP)
{
rtpSession *s = (rtpSession *)hRTP;
RvSize_t bytes;
RvStatus ret;
/* This function returns the number of bytes in the specified socket that are
available for reading.*/
ret = RvSocketGetBytesAvailable(&s->socket, &bytes);
if (ret != RV_OK)
return ret;
return (RvInt32)bytes;
}
/* == ENDS: Accessory RTP Functions == */
/* == Internal RTP Functions == */
static void rtpEvent(
IN RvSelectEngine* selectEngine,
IN RvSelectFd* fd,
IN RvSelectEvents selectEvent,
IN RvBool error)
{
rtpSession* s;
RV_UNUSED_ARG(selectEngine);
RV_UNUSED_ARG(selectEvent);
RV_UNUSED_ARG(error);
s = RV_GET_STRUCT(rtpSession, selectFd, fd);
if (s->eventHandler)
{
s->eventHandler((HRTPSESSION)s, s->context);
}
}
static RvBool isMyIP(RvUint32 ip)
{
RvUint32 i;
for (i = 0; (i < RV_RTP_MAXIPS) && (rvRtpInstance.hostIPs[i]); i++)
{
if (ip == rvRtpInstance.hostIPs[i])
return RV_TRUE;
}
return RV_FALSE;
}
/* == ENDS: Internal RTP Functions == */
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -