init ems server code
This commit is contained in:
148
plat/rtp/src/rtp_msg.c
Normal file
148
plat/rtp/src/rtp_msg.c
Normal file
@@ -0,0 +1,148 @@
|
||||
#include "./include/rtp_pub.h"
|
||||
#include "./include/rtp.h"
|
||||
#include "./include/rtp_const.h"
|
||||
#include "./include/rtp_def.h"
|
||||
#include "./include/rtp_struct.h"
|
||||
|
||||
extern void rtp_port_init(WORD port);
|
||||
extern int rtp_release_udp_port(WORD hdlPort);
|
||||
|
||||
int rtp_recv_msg_handling(WORD hdlPort, BYTE *rtpMsgRvBuf, WORD len)
|
||||
{
|
||||
RTP_PACKET *packet = (RTP_PACKET *) rtpMsgRvBuf;
|
||||
RTP_PORT *port = &rtpHdlPort[hdlPort];
|
||||
RTP_SAP *sap;
|
||||
BYTE cc, csLen;
|
||||
WORD sn;
|
||||
|
||||
if ((port->mode != RTP_MODE_RECVONLY) &&
|
||||
(port->mode != RTP_MODE_SENDRECV))
|
||||
return -1;
|
||||
|
||||
if (port->sapIndex >= RTP_MAX_NUM_OF_SAP)
|
||||
return -1;
|
||||
|
||||
sap = &rtpSap[port->sapIndex];
|
||||
|
||||
if (sap->rtp_recv == NULL)
|
||||
return -1;
|
||||
|
||||
cc = packet->ver & 0x0F;
|
||||
csLen = cc * 4;
|
||||
|
||||
sn = ntohs(packet->sn);
|
||||
|
||||
return (sap->rtp_recv(port->usrPort, hdlPort, packet->pt & 0x7F, packet->sn, rtpMsgRvBuf + 12 + csLen, len - 12 - csLen));
|
||||
}
|
||||
|
||||
int rtp_handshake_proc(WORD hdlPort)
|
||||
{
|
||||
RTP_PORT *port = &rtpHdlPort[hdlPort];
|
||||
RTP_SAP *sap;
|
||||
|
||||
if (port->sapIndex >= RTP_MAX_NUM_OF_SAP)
|
||||
return -1;
|
||||
|
||||
sap = &rtpSap[port->sapIndex];
|
||||
if (sap->rtp_handshake == NULL)
|
||||
return -1;
|
||||
|
||||
if (sap->rtp_handshake(port->usrPort, hdlPort, port->rtpPort * 2 + RTP_BASE_UDP_PORT) == -1)
|
||||
{
|
||||
if (++port->times >= 3)
|
||||
{
|
||||
rtp_release_udp_port(hdlPort);
|
||||
rtp_port_init(hdlPort);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
port->timer = RTP_HANDSHAKE_TIMER;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtp_recv_udp_msg()
|
||||
{
|
||||
int port, i, len, addrLen = sizeof(struct sockaddr);
|
||||
|
||||
for (port = 0; port < RTP_MAX_NUM_OF_PORT; port++)
|
||||
{
|
||||
if (rtpHdlPort[port].flag == 0)
|
||||
continue;
|
||||
|
||||
if (rtpHdlPort[port].timer > 0)
|
||||
{
|
||||
if (--rtpHdlPort[port].timer == 0)
|
||||
rtp_handshake_proc(port);
|
||||
}
|
||||
|
||||
if (rtpHdlPort[port].fd == -1)
|
||||
continue;
|
||||
|
||||
if (rtpHdlPortFd[port] != rtpHdlPort[port].fd)
|
||||
{
|
||||
printf("fd has been changed: fd: %d, HdlPortFd: %d\n", rtpHdlPort[port].fd, rtpHdlPortFd[port]);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
len = recvfrom(rtpHdlPort[port].fd, rtpMsgRvBuf, RTP_MAX_UDP_MSG_LEN,
|
||||
0, (struct sockaddr *)&rtpSrcInAddr, &addrLen);
|
||||
if (len < 0)
|
||||
break;
|
||||
|
||||
if (len >= RTP_MAX_UDP_MSG_LEN)
|
||||
continue;
|
||||
|
||||
rtp_recv_msg_handling(port, rtpMsgRvBuf, len);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtp_send_udp_msg(WORD hdlPort, BYTE *msg, WORD len)
|
||||
{
|
||||
int ret, fd = rtpHdlPort[hdlPort].fd;
|
||||
|
||||
if (len >= RTP_MAX_PAYLOAD_SIZE)
|
||||
return -1;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
rtpDstInAddr.sin_addr.s_addr = rtpHdlPort[hdlPort].sess.dstIp;
|
||||
rtpDstInAddr.sin_port = htons(rtpHdlPort[hdlPort].sess.dstPort);
|
||||
|
||||
ret = sendto(fd, msg, len, 0, (struct sockaddr *) &rtpDstInAddr, sizeof(rtpDstInAddr));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtp_send(BYTE sapIndex, WORD usrPort, WORD hdlPort, WORD sn, RTP_PAYLOAD *payload, WORD len)
|
||||
{
|
||||
RTP_PACKET *packet = (RTP_PACKET *) payload;
|
||||
|
||||
if ((hdlPort >= RTP_MAX_NUM_OF_PORT) ||
|
||||
(len > RTP_MAX_PAYLOAD_SIZE) ||
|
||||
(payload == NULL))
|
||||
return -1;
|
||||
|
||||
if ((rtpHdlPort[hdlPort].sapIndex != sapIndex) ||
|
||||
(rtpHdlPort[hdlPort].usrPort != usrPort))
|
||||
return -1;
|
||||
|
||||
if (rtpHdlPort[hdlPort].mode < RTP_MODE_SENDONLY)
|
||||
return -1;
|
||||
|
||||
packet->ver = 0x80;
|
||||
packet->pt = rtpHdlPort[hdlPort].sess.plType;
|
||||
packet->sn = htons(sn);
|
||||
rtpHdlPort[hdlPort].timeStamp += rtpHdlPort[hdlPort].inc;
|
||||
packet->timeStamp = htonl(rtpHdlPort[hdlPort].timeStamp);
|
||||
packet->ssrc = htonl(sapIndex + usrPort + hdlPort);
|
||||
|
||||
return rtp_send_udp_msg(hdlPort, (BYTE *) packet, len + 12);
|
||||
}
|
||||
Reference in New Issue
Block a user