⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtp.c

📁 h.248协议源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        IN  HRTPSESSION  hRTP)
{
    rtpSession *s = (rtpSession *)hRTP;

    return (s->hRTCP);
}


RVVXDAPI
RvInt32 VXDCALLCONV rtpSetRTCPSession(
        IN  HRTPSESSION   hRTP,
        IN  HRTCPSESSION  hRTCP)
{
    rtpSession *s = (rtpSession *)hRTP;

    s->hRTCP = hRTCP;

    return 0;
}


RVVXDAPI
RvInt32 VXDCALLCONV rtpGetHeaderLength(void)
{
    return 12;
}

RVVXDAPI
RvUint32 VXDCALLCONV rtpRegenSSRC(
        IN  HRTPSESSION  hRTP)
{
    rtpSession *s = (rtpSession *)hRTP;

	rvMutexLock(&s->mutex);

	s->sSrc = rvTimeGetEpochTime(NULL);
#ifdef _MTS_
    s->sSrc *= rand_r(&seed);
#else
    s->sSrc *= rand();
#endif
    s->sSrc &= ~s->sSrcMask;
    s->sSrc |= s->sSrcPattern;
    
	rvMutexUnlock(&s->mutex);
    return s->sSrc;
}

RVVXDAPI
RvInt32 VXDCALLCONV rtpSetGroupAddress(
        IN HRTPSESSION hRTP,	/* RTP Session Opaque Handle */
        IN RvUint32       ip)
{
    rtpSession *s = (rtpSession *)hRTP;
    rvMutexLock(&s->mutex);
    rvSocketJoinMulticastGroup(&s->socket, ip, RV_INET_ADDRANY);
    rvMutexUnlock(&s->mutex);
    return 0;
}


RVVXDAPI
RvInt32 VXDCALLCONV rtpResume(
        IN	HRTPSESSION hRTP)
{
    rtpSession *s = (rtpSession *)hRTP;
	RvHost h;
	RvSocketAddr toAddr;

	rvMutexLock(&s->mutex);
	rvHostConstruct(&h, "127.0.0.1");
	rvSocketAddrConstructInet(&toAddr, &h, 0, rvSocketGetPort(&s->socket));
    rvSocketSendTo(&s->socket, (RvUint8*)"", 1, &toAddr);
	rvMutexUnlock(&s->mutex);
    return 0;
}

RVVXDAPI 
RvInt32 VXDCALLCONV rtpUseSequenceNumber(
                IN HRTPSESSION  hRTP)
{
    rtpSession *s = (rtpSession *)hRTP;

    s->useSequenceNumber = 1;

    return 0;
}

RVVXDAPI 
RvInt32 VXDCALLCONV rtpSetReceiveBufferSize(
                IN HRTPSESSION  hRTP,
		IN int size)
{
    rtpSession *s = (rtpSession *)hRTP;

	rvMutexLock(&s->mutex);
    rvSocketSetRecvBufferSize(&s->socket, size);
	rvMutexUnlock(&s->mutex);

    return 0;
}

RVVXDAPI 
RvInt32 VXDCALLCONV rtpSetTransmitBufferSize(
                IN HRTPSESSION  hRTP,
		IN int size)
{
    rtpSession *s = (rtpSession *)hRTP;

	rvMutexLock(&s->mutex);
    rvSocketSetRecvBufferSize(&s->socket, size);
	rvMutexUnlock(&s->mutex);

    return 0;
}

RVVXDAPI 
RvInt32 VXDCALLCONV rtpGetAvailableBytes(
                IN HRTPSESSION  hRTP)
{
    rtpSession *s = (rtpSession *)hRTP;
    int bytes=(-1);
	rvMutexUnlock(&s->mutex);
    /* ????liBytesAvailable(s->socket, &bytes); */
	rvMutexLock(&s->mutex);
    return bytes;
}
                  /* == ENDS: Accessory RTP Functions == */

#ifdef _ATM_
                        /* == RTP ATM Functions == */

RvInt32 VXDCALLCONV rtpatmInit(RvBool bListen, RvUint8 atmSelector, RvUint16 port)
{
    int res = rtpInit();
    liatmInit();
    return res;
}

RVVXDAPI
void VXDCALLCONV rtpatmEnd(void)
{
    rtpEnd();
    liatmEnd();
}


RVVXDAPI
HRTPSESSION VXDCALLCONV rtpatmOpenFrom(
        IN  RvUint8               atmSelector,
        IN  RvUint16              port,
        IN  RTPATMDIRECTION     Direction,
        IN  RvUint32              ssrcPattern,
        IN  RvUint32              ssrcMask,
	    IN  void*               buffer,
	    IN  int	                bufferSize)
{
    rtpSession * s  = (rtpSession *)buffer;

    if (bufferSize < rtpGetAllocationSize())
	    return NULL;
    
    memset(buffer, 0 , rtpGetAllocationSize());

    s->bUseATM        = TRUE;    
    s->isAllocated    = FALSE;
    s->sSrcPattern    = ssrcPattern;
    s->sSrcMask       = ssrcMask;
    s->sequenceNumber = (RvUint16)
#ifdef _MTS_
      rand_r(&seed);
#else
    rand();
#endif
    s->socket = liatmCreateSocket((Direction==ATMLISTEN),atmSelector,port);

    rtpRegenSSRC((HRTPSESSION)s); 
    liBlock(s->socket);
	
    return (HRTPSESSION)s;
}


RVVXDAPI
HRTPSESSION VXDCALLCONV rtpatmOpenEx(
        IN  RvUint8               atmSelector,
        IN  RvUint16              port,
        IN  RTPATMDIRECTION     Direction,
        IN  RvUint32              ssrcPattern,
        IN  RvUint32              ssrcMask,
        IN  char *              cname)
{
    rtpSession *s  = (rtpSession*)rvMemAlloc(rtpGetAllocationSize());

    if (s==NULL) 
	    return NULL;
	memset(s, 0, rtpGetAllocationSize());
    
    if (rtpatmOpenFrom(atmSelector, port, Direction, ssrcPattern, ssrcMask, (void*)s, rtpGetAllocationSize())==NULL)
    {
	    rvMemFree(s);
	    return NULL;
    }
    s->isAllocated=TRUE;

    if (cname)
        s->hRTCP = rtcpOpen(s->sSrc, ++port, cname);

    return (HRTPSESSION) s;
}


RVVXDAPI
HRTPSESSION VXDCALLCONV rtpatmOpen(
        IN  RvUint8               atmSelector,
        IN  RvUint16              port,
        IN  RTPATMDIRECTION     Direction,
        IN  RvUint32              ssrcPattern,
        IN  RvUint32              ssrcMask)
{
    return rtpatmOpenEx(atmSelector, port, Direction, ssrcPattern, ssrcMask, NULL);
}


RVVXDAPI
RvUint32 VXDCALLCONV rtpatmClose(IN  HRTPSESSION  hRTP)
{
    rtpSession * s     = (rtpSession *)hRTP;
    RvUint8        bzero = 0;
    
    if (s->hRTCP)
        rtcpClose(s->hRTCP);
    
    liatmCallOn       (s->socket, 0, NULL, NULL);
    liatmSendData     (s->socket, &bzero, 1);
    liatmDeleteSocket (s->socket);

    if (s->isAllocated)
	    rvMemFree(s);
    
    return 0;
} 

RVVXDAPI
void VXDCALLCONV rtpatmSetEventHandler(
        IN  HRTPSESSION        hRTP,
        IN  LPRTPEVENTHANDLER  eventHandler,
        IN  void *             context)
{
    if (hRTP)
    {
        ATMSOCKET socket = ((rtpSession *)hRTP)->socket;

        ((rtpSession *)hRTP)->eventHandler  = eventHandler;
        ((rtpSession *)hRTP)->context       = context;
        
        liUnblock   (((rtpSession*)hRTP)->socket);
        liatmCallOn (((rtpSession*)hRTP)->socket, liEvRead, (eventHandler) ? rtpEvent:NULL, (void*)hRTP);
    }
}


RVVXDAPI
void VXDCALLCONV rtpSetATMRemoteAddress(
	IN HRTPSESSION 	hRTP,	/* RTP Session Opaque Handle */
	IN RvUint8	*atmAddr,
	IN RvUint32	addrLength,
	IN RvUint16	selector)
{
    rtpSession *s = (rtpSession *)hRTP;

    if (atmAddr)
    {
        s->atmAddr     = atmAddr;
        s->addrLength  = addrLength;
    }

    if (selector)
        s->selector = selector;
    else 
        s->selector = s->atmAddr[s->addrLength-1];
}


RVVXDAPI
RvInt32 VXDCALLCONV rtpatmConnect(IN HRTPSESSION hRTP)
{
    rtpSession * s = (rtpSession*) hRTP;
    int          res;

    res = liatmConnect(s->socket, s->atmAddr, s->addrLength,TRUE,0,(int*)&s->selector);

    /*if (res != (-1))
        liatmCallOn (s->socket, liEvRead, (s->eventHandler) ? rtpEvent:NULL, (void*)hRTP);*/
        
    return res;
}

RVVXDAPI
RvInt32 VXDCALLCONV rtpatmWrite(
        IN  HRTPSESSION  hRTP,
        IN  void *       buf,
        IN  RvInt32        len,
        IN  rtpParam *   p)
{
    int     retVal;
    RvUint32 *header;

    rtpSession *s = (rtpSession *)hRTP;

    if (s->socket==INVALID_SOCKET)
        return (-1);

    header = (RvUint32*)((char*)buf+p->sByte-12);

    if (s->useSequenceNumber)
        s->sequenceNumber=p->sequenceNumber;
    p->sequenceNumber=s->sequenceNumber;

    header[0]=0;
    header[0]=bitfieldSet(header[0],2,30,2);	
    header[0]=bitfieldSet(header[0],p->marker,23,1);	
    header[0]=bitfieldSet(header[0],p->payload,16,7);	
    header[0]=bitfieldSet(header[0],s->sequenceNumber++,0,16);	
    header[1]=p->timestamp;
    header[2]=s->sSrc;
    p->len=len-p->sByte;
	       
	ConvertToNetwork(header,0,3);
	retVal = liatmSendData(s->socket,(RvUint8*)header,len-((char*)header-(char*)buf));
	
    if (s->hRTCP  &&  retVal >= 0)
    {
        rtcpRTPPacketSent(s->hRTCP, p->len, p->timestamp);
    }

    return retVal;
}


RVVXDAPI
RvInt32 VXDCALLCONV rtpatmWriteFirst(
        IN  HRTPSESSION  hRTP,
        IN  void *       buf,
        IN  RvInt32        len)
{
    int retVal;
    rtpParam p;
    rtpSession *s;
    RvUint32 *header;

    memset (&p,0,sizeof(rtpParam));
    p.timestamp = 0;
    p.marker    = TRUE;
    p.payload   = 0; //PCMU;
    //OUT     RvUint32  sSrc;
    //OUT     RvUint16  sequenceNumber;
    p.sByte     = 12;
    //OUT     int     len;

    s = (rtpSession *)hRTP;

    header=(RvUint32*)((char*)buf+p.sByte-12);

    if (s->useSequenceNumber)
        s->sequenceNumber=p.sequenceNumber;
    p.sequenceNumber=s->sequenceNumber;

    header[0]=0;
    header[0]=bitfieldSet(header[0],2,30,2);	
    header[0]=bitfieldSet(header[0],p.marker,23,1);	
    header[0]=bitfieldSet(header[0],p.payload,16,7);	
    header[0]=bitfieldSet(header[0],s->sequenceNumber++,0,16);	
    header[1]=p.timestamp;
    header[2]=s->sSrc;
    p.len=len-p.sByte;
	       
	ConvertToNetwork(header,0,3);
	
    if (retVal=liatmSendData(s->socket, (RvUint8*)header, len-((char*)header-(char*)buf))<0)
	    retVal=0;

    if (s->hRTCP  &&  retVal >= 0)
    {
        rtcpRTPPacketSent(s->hRTCP, p.len, p.timestamp);
    }

    return retVal;
}

RVVXDAPI
RvInt32 VXDCALLCONV rtpatmRead(
        IN  HRTPSESSION  hRTP,
        IN  void        *buf,
        IN  RvInt32        len,
        OUT rtpParam    *p)
{
    rtpSession * s      = (rtpSession *)hRTP;
    RvUint32     * header = buf;


    if (s->socket==INVALID_SOCKET)
        return (-1);

    p->len = liatmRecvData(s->socket,(char*)buf,len);  
    
    ConvertFromNetwork(buf,0,3);
    
    //if (isMyIP(ip) && s->sSrc==((RvUint32*)buf)[2]) return (-1);
    if (p->len==(-1) || p->len<12) 
        return (-1);
    
	ConvertFromNetwork(buf,3,bitfieldGet(header[0],24,4));

    p->timestamp        = header[1];
    p->sequenceNumber   = (RvUint16)bitfieldGet(header[0],0,16);
    p->sSrc             = header[2];
    p->marker           = bitfieldGet(header[0],23,1);
    p->payload          = (unsigned char)bitfieldGet(header[0],16,7);
    p->sByte            = 12 + bitfieldGet(header[0],24,4) * sizeof(RvUint32);
    
    if (bitfieldGet(header[0],28,1))
    {
        int xStart = p->sByte/sizeof(RvUint32);

        ConvertFromNetwork(buf,xStart,1);
        ConvertFromNetwork(buf,xStart+1,bitfieldGet(header[xStart],0,16));
        p->sByte += bitfieldGet(header[xStart],0,16)*sizeof(RvUint32);
    }

    return 0;
}


RVVXDAPI
RvInt32 VXDCALLCONV rtpatmReadEx(
        IN  HRTPSESSION  hRTP,
        IN  void *       buf,
        IN  RvInt32        len,
        IN  RvUint32       timestamp,
        OUT rtpParam *   p)
{
    rtpSession *s = (rtpSession *)hRTP;
    int retVal;

    retVal = rtpatmRead(hRTP, buf, len, p);

    if (s->hRTCP  &&  retVal >= 0)
    {
        rtcpRTPPacketRecv(s->hRTCP, p->sSrc, timestamp,  p->timestamp, p->sequenceNumber);
    }

    return retVal;
}


RVVXDAPI 
RvInt32 rtpatmGetATMAddr(IN HRTPSESSION  hRTP, RvUint8 Addr[ATM_ADDR_SIZE], RvUint32 *NumofDigits)
{
    return liatmGetLocalAddr(((rtpSession*)hRTP)->socket,Addr,NumofDigits);
}

RVVXDAPI
RvBool VXDCALLCONV rtpatmIsATM(IN HRTPSESSION hRTP)
{
    return ((rtpSession*)hRTP)->bUseATM;
}

                 /* == ENDS: RTP ATM Functions == */
#endif



#ifdef __cplusplus
}              
#endif




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -