hc
2023-02-14 9c26bd2fb3d1b04cfe748cd7a8d8883feff5250f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/******************************************************************************
 *
 * 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;
}