/******************************************************************************
|
*
|
* 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;
|
}
|