1 /******************************************************************************
2 *
3 * Copyright 2007, Silicon Image, Inc. All rights reserved.
4 * No part of this work may be reproduced, modified, distributed, transmitted,
5 * transcribed, or translated into any language or computer format, in any form
6 * or by any means without written permission of: Silicon Image, Inc., 1060
7 * East Arques Avenue, Sunnyvale, California 94085
8 *
9 *****************************************************************************/
10 /**
11 * @file media_buffer.c
12 *
13 * @brief
14 * Media Buffer implementation
15 *
16 * <pre>
17 *
18 * Principal Author: Joerg Detert
19 * Creation date: Feb 28, 2008
20 *
21 * </pre>
22 *
23 *****************************************************************************/
24 #include <pthread.h>
25
26 #include "media_buffer.h"
27 #include "media_buffer_pool.h"
28
29 static pthread_mutex_t gAtomicMutex;
30
AtomicMutexInit()31 void AtomicMutexInit()
32 {
33 pthread_mutex_init (&gAtomicMutex, NULL);
34 }
35
AtomicMutexDestory()36 void AtomicMutexDestory()
37 {
38 pthread_mutex_destroy (&gAtomicMutex);
39 }
40
osAtomicIncrement(uint32_t * pVar)41 static uint32_t osAtomicIncrement(uint32_t* pVar)
42 {
43 uint32_t ret;
44
45 /* Lock the atomic mutex */
46 pthread_mutex_lock(&gAtomicMutex);
47
48 /* increment */
49 ret = ++(*pVar);
50
51 /* Unlock the atomic mutex */
52 pthread_mutex_unlock(&gAtomicMutex);
53
54 return ret;
55 }
56
57
osAtomicDecrement(uint32_t * pVar)58 static uint32_t osAtomicDecrement(uint32_t* pVar)
59 {
60 uint32_t ret;
61
62 /* Lock the atomic mutex */
63 pthread_mutex_lock(&gAtomicMutex);
64
65 /* increment */
66 ret = --(*pVar);
67
68 /* Unlock the atomic mutex */
69 pthread_mutex_unlock(&gAtomicMutex);
70
71 return ret;
72 }
73
74 /******************************************************************************
75 * MediaBufInit
76 *****************************************************************************/
MediaBufInit(MediaBuffer_t * pBuf)77 void MediaBufInit(MediaBuffer_t *pBuf)
78 {
79 DCT_ASSERT(pBuf != NULL);
80
81 pBuf->lockCount = 0U;
82 pBuf->pOwner = NULL;
83 }
84
85
86 /******************************************************************************
87 * MediaBufLockBuffer
88 *****************************************************************************/
MediaBufLockBuffer(MediaBuffer_t * pBuf)89 RESULT MediaBufLockBuffer(MediaBuffer_t* pBuf)
90 {
91 DCT_ASSERT(pBuf != NULL);
92 DCT_ASSERT(pBuf->pOwner != NULL);
93
94 osAtomicIncrement( &pBuf->lockCount );
95
96 return RET_SUCCESS;
97 }
98
99
100 /******************************************************************************
101 * MediaBufUnlockBuffer
102 *****************************************************************************/
MediaBufUnlockBuffer(MediaBuffer_t * pBuf)103 RESULT MediaBufUnlockBuffer(MediaBuffer_t* pBuf)
104 {
105 DCT_ASSERT(pBuf != NULL);
106 if (pBuf->pOwner == NULL)
107 {
108 return RET_FAILURE;
109 }
110
111 uint32_t val = osAtomicDecrement( &pBuf->lockCount );
112
113 if(val == 0U)
114 {
115 MediaBufPoolFreeBuffer(pBuf->pOwner, pBuf);
116 }
117
118 return RET_SUCCESS;
119 }
120