|
|
/*----------------------------------------------------------------------------
* 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]
|