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