205 lines
5.9 KiB
C++
205 lines
5.9 KiB
C++
/*----------------------------------------------------------------------------
|
|
* File: RTCPMEM.C
|
|
* Product: RTP/RTCP implementation
|
|
* Description: Provides memory operations functions for RTCP.
|
|
*
|
|
* 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
|
|
/--------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
/ External Variables
|
|
/--------------------------------------------------------------------------*/
|
|
extern PRTP_CONTEXT pRTPContext;
|
|
#ifdef _DEBUG
|
|
extern char debug_string[];
|
|
#endif
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Function : allocateRTCPContextHeaps
|
|
* Description: Allocates RTCP context heaps
|
|
*
|
|
* Input : pRTCPcntxt: -> to the RTCP context information
|
|
*
|
|
* Return: OK: RRCM_NoError
|
|
* !0: Error code (see RRCM.H)
|
|
---------------------------------------------------------------------------*/
|
|
DWORD allocateRTCPContextHeaps (PRTCP_CONTEXT pRTCPcntxt)
|
|
{
|
|
IN_OUT_STR ("RTCP: Enter allocateRTCPContextHeaps()\n");
|
|
|
|
pRTCPcntxt->hHeapRTCPSes = HeapCreate (
|
|
0,
|
|
(pRTPContext->registry.NumSessions*sizeof(RTCP_SESSION)),
|
|
0);
|
|
if (pRTCPcntxt->hHeapRTCPSes == NULL)
|
|
{
|
|
IN_OUT_STR ("RTCP: Exit allocateRTCPContextHeaps()\n");
|
|
return (RRCMError_RTCPResources);
|
|
}
|
|
|
|
pRTCPcntxt->hHeapRRCMStat = HeapCreate (
|
|
0,
|
|
pRTCPcntxt->dwInitNumFreeRRCMStat*sizeof(SSRC_ENTRY),
|
|
0);
|
|
if (pRTCPcntxt->hHeapRRCMStat == NULL)
|
|
{
|
|
IN_OUT_STR ("RTCP: Exit allocateRTCPContextHeaps()\n");
|
|
return (RRCMError_RTCPResources);
|
|
}
|
|
|
|
IN_OUT_STR ("RTCP: Exit allocateRTCPContextHeaps()\n");
|
|
return (RRCM_NoError);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Function : allocateRTCPSessionHeaps
|
|
* Description: Allocates RTCP session heaps
|
|
*
|
|
* Input : *pRTCPses: ->(->) to the RTCP session's information
|
|
*
|
|
* Return: OK: RRCM_NoError
|
|
* !0: Erro code (see RRCM.H)
|
|
---------------------------------------------------------------------------*/
|
|
DWORD allocateRTCPSessionHeaps (PRTCP_SESSION *pRTCPses)
|
|
{
|
|
DWORD heapSize;
|
|
DWORD dwStatus = RRCM_NoError;
|
|
|
|
IN_OUT_STR ("RTCP: Enter allocateRTCPSessionHeaps()\n");
|
|
|
|
heapSize = NUM_FREE_RCV_BFR*pRTPContext->registry.RTCPrcvBfrSize;
|
|
(*pRTCPses)->hHeapRcvBfr = HeapCreate (0,
|
|
heapSize,
|
|
0);
|
|
if ((*pRTCPses)->hHeapRcvBfr == NULL)
|
|
dwStatus = RRCMError_RTCPResources;
|
|
|
|
if (dwStatus == RRCM_NoError)
|
|
{
|
|
(*pRTCPses)->hHeapRcvBfrList = HeapCreate (0,
|
|
RCV_BFR_LIST_HEAP_SIZE,
|
|
0);
|
|
if ((*pRTCPses)->hHeapRcvBfrList == NULL)
|
|
dwStatus = RRCMError_RTCPResources;
|
|
}
|
|
|
|
if (dwStatus != RRCM_NoError)
|
|
{
|
|
// destroy allocated heaps
|
|
if ((*pRTCPses)->hHeapRcvBfr)
|
|
{
|
|
HeapDestroy ((*pRTCPses)->hHeapRcvBfr);
|
|
(*pRTCPses)->hHeapRcvBfr = NULL;
|
|
}
|
|
if ((*pRTCPses)->hHeapRcvBfrList)
|
|
{
|
|
HeapDestroy ((*pRTCPses)->hHeapRcvBfrList);
|
|
(*pRTCPses)->hHeapRcvBfrList = NULL;
|
|
}
|
|
}
|
|
|
|
IN_OUT_STR ("RTCP: Exit allocateRTCPSessionHeaps()\n");
|
|
return (dwStatus);
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Function : allocateRTCPBfrList
|
|
* Description: Allocates link list of buffers for RTCP (xmit/rcv/...).
|
|
*
|
|
* Input : ptr: -> to the link list to add buffer to
|
|
* hHeapList: Handle to the heap list
|
|
* hHeapBfr: Handle to the heap buffer
|
|
* *numBfr: -> to the number of buffers to allocate
|
|
* bfrSize: Individual buffer size
|
|
*
|
|
* Return: OK: RRCM_NoError
|
|
* !0: Error code (see RRCM.H)
|
|
---------------------------------------------------------------------------*/
|
|
DWORD allocateRTCPBfrList (PLINK_LIST ptr,
|
|
HANDLE hHeapList,
|
|
HANDLE hHeapBfr,
|
|
DWORD *numBfr,
|
|
DWORD bfrSize,
|
|
CRITICAL_SECTION *pCritSect)
|
|
{
|
|
PRTCP_BFR_LIST bfrPtr;
|
|
PLINK_LIST tmpPtr;
|
|
|
|
#ifdef IN_OUT_CHK
|
|
OutputDebugString ("RTCP: Enter allocateRTCPBfrList()\n");
|
|
#endif
|
|
|
|
ASSERT (ptr);
|
|
ASSERT (hHeapList);
|
|
ASSERT (hHeapBfr);
|
|
|
|
// make sure at least one buffer is requested
|
|
if (*numBfr == 0)
|
|
return (RRCMError_RTCPInvalidRequest);
|
|
|
|
// allocate link list on the data structure's heap
|
|
if (allocateLinkedList (ptr, hHeapList, numBfr,
|
|
sizeof(RTCP_BFR_LIST), pCritSect))
|
|
return (RRCMError_RTCPResources);
|
|
|
|
// allocate buffer pool resources starting from the tail
|
|
tmpPtr = ptr->prev;
|
|
while (tmpPtr != NULL)
|
|
{
|
|
// points to buffer structure
|
|
bfrPtr = (PRTCP_BFR_LIST)tmpPtr;
|
|
ASSERT (bfrPtr);
|
|
|
|
// initialize the WSABUF structure on its own heap
|
|
bfrPtr->bfr.buf = (char *)HeapAlloc (hHeapBfr,
|
|
HEAP_ZERO_MEMORY,
|
|
bfrSize);
|
|
if (bfrPtr->bfr.buf == NULL)
|
|
{
|
|
RRCM_DBG_MSG ("RTCP: Error - Cannot Allocate Xmt/Rcv Bfr",
|
|
0, __FILE__, __LINE__, DBG_ERROR);
|
|
|
|
// !!! TODO !!!
|
|
|
|
// update head/tail pointers
|
|
|
|
// delete remaining cells until end of list
|
|
|
|
break;
|
|
}
|
|
|
|
// buffer length
|
|
bfrPtr->bfr.len = bfrSize;
|
|
|
|
// buffer attributes
|
|
bfrPtr->dwBufferCount = 1;
|
|
|
|
// new head pointer
|
|
tmpPtr = bfrPtr->bfrList.next;
|
|
}
|
|
|
|
#ifdef IN_OUT_CHK
|
|
OutputDebugString ("RTCP: Exit allocateRTCPBfrList()\n");
|
|
#endif
|
|
return (RRCM_NoError);
|
|
}
|
|
|
|
|
|
// [EOF]
|
|
|