xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/common/media_buffer/media_buffer.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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