154 lines
4.5 KiB
C++
154 lines
4.5 KiB
C++
/*----------------------------------------------------------------------------
|
|
* File: RTCPINIT.C
|
|
* Product: RTP/RTCP implementation
|
|
* Description: Provides RTCP initialization functions.
|
|
*
|
|
* INTEL Corporation Proprietary Information
|
|
* This listing is supplied under the terms of a license agreement with
|
|
* Intel Corporation and may not be copied nor disclosed except in
|
|
* accordance with the terms of that agreement.
|
|
* Copyright (c) 1995 Intel Corporation.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
|
|
#include "rrcm.h"
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
/ Global Variables
|
|
/--------------------------------------------------------------------------*/
|
|
PRTCP_CONTEXT pRTCPContext = NULL;
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
/ External Variables
|
|
/--------------------------------------------------------------------------*/
|
|
extern PRTP_CONTEXT pRTPContext;
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Function : initRTCP
|
|
* Description: RTCP initialization procedures. Creates the initial RTCP
|
|
* session and allocates all initial memory resources.
|
|
*
|
|
* Input : None.
|
|
*
|
|
* Return: OK: RRCM_NoError
|
|
* !0: Error code (see RRCM.H)
|
|
---------------------------------------------------------------------------*/
|
|
DWORD initRTCP (void)
|
|
{
|
|
DWORD dwStatus = RRCM_NoError;
|
|
|
|
IN_OUT_STR ("RTCP: Enter initRTCP()\n");
|
|
|
|
// If RTCP has already been initialized, exit and report the error
|
|
if (pRTCPContext != NULL)
|
|
{
|
|
RRCM_DBG_MSG ("RTCP: ERROR - Multiple RTCP Instances", 0,
|
|
__FILE__, __LINE__, DBG_CRITICAL);
|
|
|
|
IN_OUT_STR ("RTCP: Exit initRTCP()\n");
|
|
return (RRCMError_RTCPReInit);
|
|
}
|
|
|
|
// Obtain RTCP context
|
|
pRTCPContext = (PRTCP_CONTEXT)GlobalAlloc (GMEM_FIXED | GMEM_ZEROINIT,
|
|
sizeof(RTCP_CONTEXT));
|
|
if (pRTCPContext == NULL)
|
|
{
|
|
RRCM_DBG_MSG ("RTCP: ERROR - Resource allocation failed", 0,
|
|
__FILE__, __LINE__, DBG_CRITICAL);
|
|
|
|
IN_OUT_STR ("RTCP: Exit initRTCP()\n");
|
|
|
|
return RRCMError_RTCPResources;
|
|
}
|
|
|
|
// initialize the context critical section
|
|
InitializeCriticalSection(&pRTCPContext->critSect);
|
|
|
|
// Initialize number of desired free cells
|
|
pRTCPContext->dwInitNumFreeRRCMStat = pRTPContext->registry.NumFreeSSRC;
|
|
|
|
// allocate heaps
|
|
dwStatus = allocateRTCPContextHeaps (pRTCPContext);
|
|
if (dwStatus == RRCM_NoError)
|
|
{
|
|
// allocate free list of SSRCs statistic entries
|
|
dwStatus = allocateLinkedList (&pRTCPContext->RRCMFreeStat,
|
|
pRTCPContext->hHeapRRCMStat,
|
|
&pRTCPContext->dwInitNumFreeRRCMStat,
|
|
sizeof(SSRC_ENTRY),
|
|
&pRTCPContext->critSect);
|
|
}
|
|
|
|
// initialize the pseudo-random number generator, for later MD5 use
|
|
RRCMsrand ((unsigned int)timeGetTime());
|
|
|
|
// If initialation failed return all resourses allocated
|
|
if (dwStatus != RRCM_NoError)
|
|
deleteRTCP ();
|
|
|
|
IN_OUT_STR ("RTCP: Exit initRTCP()\n");
|
|
|
|
return (dwStatus);
|
|
}
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Function : deleteRTCP
|
|
* Description: RTCP delete procedures. All RTCP sessions have been deleted
|
|
* at this point, so just delete what's needed.
|
|
*
|
|
* Input : None.
|
|
*
|
|
* Return: FALSE : OK.
|
|
* TRUE : Error code. RTCP couldn't be initialized.
|
|
---------------------------------------------------------------------------*/
|
|
DWORD deleteRTCP (void)
|
|
{
|
|
IN_OUT_STR ("RTCP: Enter deleteRTCP()\n");
|
|
|
|
ASSERT (pRTCPContext);
|
|
|
|
// protect everything from the top
|
|
EnterCriticalSection (&pRTCPContext->critSect);
|
|
|
|
// delete all heaps
|
|
if (pRTCPContext->hHeapRRCMStat)
|
|
{
|
|
if (HeapDestroy (pRTCPContext->hHeapRRCMStat) == FALSE)
|
|
{
|
|
RRCM_DBG_MSG ("RTCP: ERROR - HeapDestroy", GetLastError(),
|
|
__FILE__, __LINE__, DBG_ERROR);
|
|
}
|
|
}
|
|
|
|
if (pRTCPContext->hHeapRTCPSes)
|
|
{
|
|
if (HeapDestroy (pRTCPContext->hHeapRTCPSes) == FALSE)
|
|
{
|
|
RRCM_DBG_MSG ("RTCP: ERROR - HeapDestroy", GetLastError(),
|
|
__FILE__, __LINE__, DBG_ERROR);
|
|
}
|
|
}
|
|
|
|
// protect everything from the top
|
|
LeaveCriticalSection (&pRTCPContext->critSect);
|
|
|
|
DeleteCriticalSection (&pRTCPContext->critSect);
|
|
|
|
// Clean up our context resources
|
|
GlobalFree (pRTCPContext);
|
|
|
|
IN_OUT_STR ("RTCP: Exit deleteRTCP()\n");
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
// [EOF]
|
|
|