120 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /******************************************************************************
 | |
|  *
 | |
|  * Copyright 2007, Silicon Image, Inc.  All rights reserved.
 | |
|  * No part of this work may be reproduced, modified, distributed, transmitted,
 | |
|  * transcribed, or translated into any language or computer format, in any form
 | |
|  * or by any means without written permission of: Silicon Image, Inc., 1060
 | |
|  * East Arques Avenue, Sunnyvale, California 94085
 | |
|  *
 | |
|  *****************************************************************************/
 | |
| /**
 | |
|  * @file media_buffer.c
 | |
|  *
 | |
|  * @brief
 | |
|  *          Media Buffer implementation
 | |
|  *
 | |
|  * <pre>
 | |
|  *
 | |
|  *   Principal Author: Joerg Detert
 | |
|  *   Creation date:    Feb 28, 2008
 | |
|  *
 | |
|  * </pre>
 | |
|  *
 | |
|  *****************************************************************************/
 | |
| #include <pthread.h>
 | |
| 
 | |
| #include "media_buffer.h"
 | |
| #include "media_buffer_pool.h"
 | |
| 
 | |
| static pthread_mutex_t gAtomicMutex;
 | |
| 
 | |
| void AtomicMutexInit()
 | |
| {
 | |
|     pthread_mutex_init (&gAtomicMutex, NULL);
 | |
| }
 | |
| 
 | |
| void AtomicMutexDestory()
 | |
| {
 | |
|     pthread_mutex_destroy (&gAtomicMutex);
 | |
| }
 | |
| 
 | |
| static uint32_t osAtomicIncrement(uint32_t* pVar)
 | |
| {
 | |
|     uint32_t ret;
 | |
| 
 | |
|     /* Lock the atomic mutex */
 | |
|     pthread_mutex_lock(&gAtomicMutex);
 | |
| 
 | |
|     /* increment */
 | |
|     ret = ++(*pVar);
 | |
| 
 | |
|     /* Unlock the atomic mutex */
 | |
|     pthread_mutex_unlock(&gAtomicMutex);
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| static uint32_t osAtomicDecrement(uint32_t* pVar)
 | |
| {
 | |
|     uint32_t ret;
 | |
| 
 | |
|     /* Lock the atomic mutex */
 | |
|     pthread_mutex_lock(&gAtomicMutex);
 | |
| 
 | |
|     /* increment */
 | |
|     ret = --(*pVar);
 | |
| 
 | |
|     /* Unlock the atomic mutex */
 | |
|     pthread_mutex_unlock(&gAtomicMutex);
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /******************************************************************************
 | |
|  * MediaBufInit
 | |
|  *****************************************************************************/
 | |
| void MediaBufInit(MediaBuffer_t *pBuf)
 | |
| {
 | |
|     DCT_ASSERT(pBuf != NULL);
 | |
| 
 | |
|     pBuf->lockCount        = 0U;
 | |
|     pBuf->pOwner           = NULL;
 | |
| }
 | |
| 
 | |
| 
 | |
| /******************************************************************************
 | |
|  * MediaBufLockBuffer
 | |
|  *****************************************************************************/
 | |
| RESULT MediaBufLockBuffer(MediaBuffer_t* pBuf)
 | |
| {
 | |
|     DCT_ASSERT(pBuf != NULL);
 | |
|     DCT_ASSERT(pBuf->pOwner != NULL);
 | |
| 
 | |
|     osAtomicIncrement( &pBuf->lockCount );
 | |
| 
 | |
|     return RET_SUCCESS;
 | |
| }
 | |
| 
 | |
| 
 | |
| /******************************************************************************
 | |
|  * MediaBufUnlockBuffer
 | |
|  *****************************************************************************/
 | |
| RESULT MediaBufUnlockBuffer(MediaBuffer_t* pBuf)
 | |
| {
 | |
|     DCT_ASSERT(pBuf != NULL);
 | |
| 	if (pBuf->pOwner == NULL)
 | |
| 	{
 | |
| 		return RET_FAILURE;
 | |
| 	}
 | |
| 
 | |
|     uint32_t val = osAtomicDecrement( &pBuf->lockCount );
 | |
| 
 | |
|     if(val == 0U)
 | |
|     {
 | |
|         MediaBufPoolFreeBuffer(pBuf->pOwner, pBuf);
 | |
|     }
 | |
| 
 | |
|     return RET_SUCCESS;
 | |
| }
 |