xref: /aosp_15_r20/external/libavc/common/ih264_list.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker *  ih264_list.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  Contains functions for buf queue
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker *  ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker *  - ih264_list_size
34*495ae853SAndroid Build Coastguard Worker *  - ih264_list_lock
35*495ae853SAndroid Build Coastguard Worker *  - ih264_list_unlock
36*495ae853SAndroid Build Coastguard Worker *  - ih264_list_yield
37*495ae853SAndroid Build Coastguard Worker *  - ih264_list_free
38*495ae853SAndroid Build Coastguard Worker *  - ih264_list_init
39*495ae853SAndroid Build Coastguard Worker *  - ih264_list_reset
40*495ae853SAndroid Build Coastguard Worker *  - ih264_list_deinit
41*495ae853SAndroid Build Coastguard Worker *  - ih264_list_terminate
42*495ae853SAndroid Build Coastguard Worker *  - ih264_list_queue
43*495ae853SAndroid Build Coastguard Worker *  - ih264_list_dequeue
44*495ae853SAndroid Build Coastguard Worker *
45*495ae853SAndroid Build Coastguard Worker * @remarks
46*495ae853SAndroid Build Coastguard Worker *  none
47*495ae853SAndroid Build Coastguard Worker *
48*495ae853SAndroid Build Coastguard Worker *******************************************************************************
49*495ae853SAndroid Build Coastguard Worker */
50*495ae853SAndroid Build Coastguard Worker 
51*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
52*495ae853SAndroid Build Coastguard Worker /* File Includes                                                             */
53*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
54*495ae853SAndroid Build Coastguard Worker 
55*495ae853SAndroid Build Coastguard Worker /* System Include Files */
56*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
57*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
58*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
59*495ae853SAndroid Build Coastguard Worker #include <string.h>
60*495ae853SAndroid Build Coastguard Worker #include <assert.h>
61*495ae853SAndroid Build Coastguard Worker 
62*495ae853SAndroid Build Coastguard Worker /* User Include Files */
63*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
64*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264_list.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
70*495ae853SAndroid Build Coastguard Worker 
71*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
72*495ae853SAndroid Build Coastguard Worker /* Function Definitions                                                      */
73*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
74*495ae853SAndroid Build Coastguard Worker 
75*495ae853SAndroid Build Coastguard Worker /**
76*495ae853SAndroid Build Coastguard Worker *******************************************************************************
77*495ae853SAndroid Build Coastguard Worker *
78*495ae853SAndroid Build Coastguard Worker * @brief Returns size for job queue context.
79*495ae853SAndroid Build Coastguard Worker *
80*495ae853SAndroid Build Coastguard Worker * @par Description
81*495ae853SAndroid Build Coastguard Worker *  Returns size for job queue context.
82*495ae853SAndroid Build Coastguard Worker *
83*495ae853SAndroid Build Coastguard Worker * @param[in] num_entries
84*495ae853SAndroid Build Coastguard Worker *  max number of jobs that can be queued
85*495ae853SAndroid Build Coastguard Worker *
86*495ae853SAndroid Build Coastguard Worker * @param[in] entry_size
87*495ae853SAndroid Build Coastguard Worker *  memory needed for a single job
88*495ae853SAndroid Build Coastguard Worker *
89*495ae853SAndroid Build Coastguard Worker * @returns Size of the job queue context
90*495ae853SAndroid Build Coastguard Worker *
91*495ae853SAndroid Build Coastguard Worker * @remarks
92*495ae853SAndroid Build Coastguard Worker *
93*495ae853SAndroid Build Coastguard Worker *******************************************************************************
94*495ae853SAndroid Build Coastguard Worker */
ih264_list_size(WORD32 num_entries,WORD32 entry_size)95*495ae853SAndroid Build Coastguard Worker WORD32 ih264_list_size(WORD32 num_entries, WORD32 entry_size)
96*495ae853SAndroid Build Coastguard Worker {
97*495ae853SAndroid Build Coastguard Worker     WORD32 size;
98*495ae853SAndroid Build Coastguard Worker     WORD32 clz;
99*495ae853SAndroid Build Coastguard Worker 
100*495ae853SAndroid Build Coastguard Worker     size = sizeof(list_t);
101*495ae853SAndroid Build Coastguard Worker     size += ithread_get_mutex_lock_size();
102*495ae853SAndroid Build Coastguard Worker 
103*495ae853SAndroid Build Coastguard Worker     /* Use next power of two number of entries*/
104*495ae853SAndroid Build Coastguard Worker     clz = CLZ(num_entries);
105*495ae853SAndroid Build Coastguard Worker     num_entries = 1 << (32 - clz);
106*495ae853SAndroid Build Coastguard Worker 
107*495ae853SAndroid Build Coastguard Worker     size += num_entries * entry_size;
108*495ae853SAndroid Build Coastguard Worker     return size;
109*495ae853SAndroid Build Coastguard Worker }
110*495ae853SAndroid Build Coastguard Worker 
111*495ae853SAndroid Build Coastguard Worker /**
112*495ae853SAndroid Build Coastguard Worker *******************************************************************************
113*495ae853SAndroid Build Coastguard Worker *
114*495ae853SAndroid Build Coastguard Worker * @brief Locks the list context
115*495ae853SAndroid Build Coastguard Worker *
116*495ae853SAndroid Build Coastguard Worker * @par Description
117*495ae853SAndroid Build Coastguard Worker *  Locks the list context by calling ithread_mutex_lock()
118*495ae853SAndroid Build Coastguard Worker *
119*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
120*495ae853SAndroid Build Coastguard Worker *  Pointer to job queue context
121*495ae853SAndroid Build Coastguard Worker *
122*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if mutex lock fails else IH264_SUCCESS
123*495ae853SAndroid Build Coastguard Worker *
124*495ae853SAndroid Build Coastguard Worker * @remarks
125*495ae853SAndroid Build Coastguard Worker *
126*495ae853SAndroid Build Coastguard Worker *******************************************************************************
127*495ae853SAndroid Build Coastguard Worker */
ih264_list_lock(list_t * ps_list)128*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_lock(list_t *ps_list)
129*495ae853SAndroid Build Coastguard Worker {
130*495ae853SAndroid Build Coastguard Worker     WORD32 retval;
131*495ae853SAndroid Build Coastguard Worker 
132*495ae853SAndroid Build Coastguard Worker     retval = ithread_mutex_lock(ps_list->pv_mutex);
133*495ae853SAndroid Build Coastguard Worker     if(retval)
134*495ae853SAndroid Build Coastguard Worker         return IH264_FAIL;
135*495ae853SAndroid Build Coastguard Worker     return IH264_SUCCESS;
136*495ae853SAndroid Build Coastguard Worker }
137*495ae853SAndroid Build Coastguard Worker 
138*495ae853SAndroid Build Coastguard Worker /**
139*495ae853SAndroid Build Coastguard Worker *******************************************************************************
140*495ae853SAndroid Build Coastguard Worker *
141*495ae853SAndroid Build Coastguard Worker * @brief Unlocks the list context
142*495ae853SAndroid Build Coastguard Worker *
143*495ae853SAndroid Build Coastguard Worker * @par Description
144*495ae853SAndroid Build Coastguard Worker *  Unlocks the list context by calling ithread_mutex_unlock()
145*495ae853SAndroid Build Coastguard Worker *
146*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
147*495ae853SAndroid Build Coastguard Worker *  Pointer to job queue context
148*495ae853SAndroid Build Coastguard Worker *
149*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if mutex unlock fails else IH264_SUCCESS
150*495ae853SAndroid Build Coastguard Worker *
151*495ae853SAndroid Build Coastguard Worker * @remarks
152*495ae853SAndroid Build Coastguard Worker *
153*495ae853SAndroid Build Coastguard Worker *******************************************************************************
154*495ae853SAndroid Build Coastguard Worker */
ih264_list_unlock(list_t * ps_list)155*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_unlock(list_t *ps_list)
156*495ae853SAndroid Build Coastguard Worker {
157*495ae853SAndroid Build Coastguard Worker     WORD32 retval;
158*495ae853SAndroid Build Coastguard Worker 
159*495ae853SAndroid Build Coastguard Worker     retval = ithread_mutex_unlock(ps_list->pv_mutex);
160*495ae853SAndroid Build Coastguard Worker     if(retval)
161*495ae853SAndroid Build Coastguard Worker         return IH264_FAIL;
162*495ae853SAndroid Build Coastguard Worker     return IH264_SUCCESS;
163*495ae853SAndroid Build Coastguard Worker }
164*495ae853SAndroid Build Coastguard Worker 
165*495ae853SAndroid Build Coastguard Worker /**
166*495ae853SAndroid Build Coastguard Worker *******************************************************************************
167*495ae853SAndroid Build Coastguard Worker *
168*495ae853SAndroid Build Coastguard Worker * @brief Yields the thread
169*495ae853SAndroid Build Coastguard Worker *
170*495ae853SAndroid Build Coastguard Worker * @par Description
171*495ae853SAndroid Build Coastguard Worker *  Unlocks the list context by calling  ih264_list_unlock(), ithread_yield()
172*495ae853SAndroid Build Coastguard Worker *  and then ih264_list_lock(). List is unlocked before to ensure its
173*495ae853SAndroid Build Coastguard Worker *  access by other threads. If unlock is not done before calling yield then
174*495ae853SAndroid Build Coastguard Worker *  no other thread can access the list functions and update list.
175*495ae853SAndroid Build Coastguard Worker *
176*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
177*495ae853SAndroid Build Coastguard Worker *  pointer to Job Queue context
178*495ae853SAndroid Build Coastguard Worker *
179*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if mutex lock unlock or yield fails else IH264_SUCCESS
180*495ae853SAndroid Build Coastguard Worker *
181*495ae853SAndroid Build Coastguard Worker * @remarks
182*495ae853SAndroid Build Coastguard Worker *
183*495ae853SAndroid Build Coastguard Worker *******************************************************************************
184*495ae853SAndroid Build Coastguard Worker */
ih264_list_yield(list_t * ps_list)185*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_yield(list_t *ps_list)
186*495ae853SAndroid Build Coastguard Worker {
187*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret;
188*495ae853SAndroid Build Coastguard Worker 
189*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_unlock(ps_list);
190*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
191*495ae853SAndroid Build Coastguard Worker 
192*495ae853SAndroid Build Coastguard Worker     ithread_yield();
193*495ae853SAndroid Build Coastguard Worker 
194*495ae853SAndroid Build Coastguard Worker     if(ps_list->i4_yield_interval_us > 0)
195*495ae853SAndroid Build Coastguard Worker         ithread_usleep(ps_list->i4_yield_interval_us);
196*495ae853SAndroid Build Coastguard Worker 
197*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_lock(ps_list);
198*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
199*495ae853SAndroid Build Coastguard Worker     return IH264_SUCCESS;
200*495ae853SAndroid Build Coastguard Worker }
201*495ae853SAndroid Build Coastguard Worker 
202*495ae853SAndroid Build Coastguard Worker /**
203*495ae853SAndroid Build Coastguard Worker *******************************************************************************
204*495ae853SAndroid Build Coastguard Worker *
205*495ae853SAndroid Build Coastguard Worker * @brief free the list context
206*495ae853SAndroid Build Coastguard Worker *
207*495ae853SAndroid Build Coastguard Worker * @par Description
208*495ae853SAndroid Build Coastguard Worker *  Frees the list context
209*495ae853SAndroid Build Coastguard Worker *
210*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
211*495ae853SAndroid Build Coastguard Worker *  pointer to Job Queue context
212*495ae853SAndroid Build Coastguard Worker *
213*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if mutex desttroy fails else IH264_SUCCESS
214*495ae853SAndroid Build Coastguard Worker *
215*495ae853SAndroid Build Coastguard Worker * @remarks
216*495ae853SAndroid Build Coastguard Worker *  Since it will be called only once by master thread this is not thread safe.
217*495ae853SAndroid Build Coastguard Worker *
218*495ae853SAndroid Build Coastguard Worker *******************************************************************************
219*495ae853SAndroid Build Coastguard Worker */
ih264_list_free(list_t * ps_list)220*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_free(list_t *ps_list)
221*495ae853SAndroid Build Coastguard Worker {
222*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
223*495ae853SAndroid Build Coastguard Worker 
224*495ae853SAndroid Build Coastguard Worker     ret = ithread_mutex_destroy(ps_list->pv_mutex);
225*495ae853SAndroid Build Coastguard Worker     if(0 == ret)
226*495ae853SAndroid Build Coastguard Worker         return IH264_SUCCESS;
227*495ae853SAndroid Build Coastguard Worker     return IH264_FAIL;
228*495ae853SAndroid Build Coastguard Worker }
229*495ae853SAndroid Build Coastguard Worker 
230*495ae853SAndroid Build Coastguard Worker /**
231*495ae853SAndroid Build Coastguard Worker *******************************************************************************
232*495ae853SAndroid Build Coastguard Worker *
233*495ae853SAndroid Build Coastguard Worker * @brief Initialize the buf queue
234*495ae853SAndroid Build Coastguard Worker *
235*495ae853SAndroid Build Coastguard Worker * @par Description
236*495ae853SAndroid Build Coastguard Worker *  Initializes the list context and sets write and read pointers to start of
237*495ae853SAndroid Build Coastguard Worker *  buf queue buffer
238*495ae853SAndroid Build Coastguard Worker *
239*495ae853SAndroid Build Coastguard Worker * @param[in] pv_buf
240*495ae853SAndroid Build Coastguard Worker *  Memory for job queue context
241*495ae853SAndroid Build Coastguard Worker *
242*495ae853SAndroid Build Coastguard Worker * @param[in] buf_size
243*495ae853SAndroid Build Coastguard Worker *  Size of the total memory allocated
244*495ae853SAndroid Build Coastguard Worker *
245*495ae853SAndroid Build Coastguard Worker * @param[in] num_entries
246*495ae853SAndroid Build Coastguard Worker *  max number of jobs that can be queued
247*495ae853SAndroid Build Coastguard Worker *
248*495ae853SAndroid Build Coastguard Worker * @param[in] entry_size
249*495ae853SAndroid Build Coastguard Worker *  memory needed for a single job
250*495ae853SAndroid Build Coastguard Worker *
251*495ae853SAndroid Build Coastguard Worker * @param[in] yield_interval_us
252*495ae853SAndroid Build Coastguard Worker *  Thread sleep duration
253*495ae853SAndroid Build Coastguard Worker *
254*495ae853SAndroid Build Coastguard Worker * @returns Pointer to job queue context
255*495ae853SAndroid Build Coastguard Worker *
256*495ae853SAndroid Build Coastguard Worker * @remarks
257*495ae853SAndroid Build Coastguard Worker *  Since it will be called only once by master thread this is not thread safe.
258*495ae853SAndroid Build Coastguard Worker *
259*495ae853SAndroid Build Coastguard Worker *******************************************************************************
260*495ae853SAndroid Build Coastguard Worker */
ih264_list_init(void * pv_buf,WORD32 buf_size,WORD32 num_entries,WORD32 entry_size,WORD32 yield_interval_us)261*495ae853SAndroid Build Coastguard Worker void* ih264_list_init(void *pv_buf,
262*495ae853SAndroid Build Coastguard Worker                       WORD32 buf_size,
263*495ae853SAndroid Build Coastguard Worker                       WORD32 num_entries,
264*495ae853SAndroid Build Coastguard Worker                       WORD32 entry_size,
265*495ae853SAndroid Build Coastguard Worker                       WORD32 yield_interval_us)
266*495ae853SAndroid Build Coastguard Worker {
267*495ae853SAndroid Build Coastguard Worker     list_t *ps_list = (list_t *)pv_buf;
268*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf = (UWORD8 *)pv_buf;
269*495ae853SAndroid Build Coastguard Worker 
270*495ae853SAndroid Build Coastguard Worker     pu1_buf += sizeof(list_t);
271*495ae853SAndroid Build Coastguard Worker     buf_size -= sizeof(list_t);
272*495ae853SAndroid Build Coastguard Worker 
273*495ae853SAndroid Build Coastguard Worker     ps_list->pv_mutex = pu1_buf;
274*495ae853SAndroid Build Coastguard Worker     pu1_buf += ithread_get_mutex_lock_size();
275*495ae853SAndroid Build Coastguard Worker     buf_size -= ithread_get_mutex_lock_size();
276*495ae853SAndroid Build Coastguard Worker 
277*495ae853SAndroid Build Coastguard Worker     if (buf_size <= 0)
278*495ae853SAndroid Build Coastguard Worker       return NULL;
279*495ae853SAndroid Build Coastguard Worker 
280*495ae853SAndroid Build Coastguard Worker     ithread_mutex_init(ps_list->pv_mutex);
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker     /* Ensure num_entries is power of two */
283*495ae853SAndroid Build Coastguard Worker     ASSERT(0 == (num_entries & (num_entries - 1)));
284*495ae853SAndroid Build Coastguard Worker 
285*495ae853SAndroid Build Coastguard Worker     /* Ensure remaining buffer is large enough to hold given number of entries */
286*495ae853SAndroid Build Coastguard Worker     ASSERT((num_entries * entry_size) <= buf_size);
287*495ae853SAndroid Build Coastguard Worker 
288*495ae853SAndroid Build Coastguard Worker     ps_list->pv_buf_base = pu1_buf;
289*495ae853SAndroid Build Coastguard Worker     ps_list->i4_terminate = 0;
290*495ae853SAndroid Build Coastguard Worker     ps_list->i4_entry_size = entry_size;
291*495ae853SAndroid Build Coastguard Worker     ps_list->i4_buf_rd_idx = 0;
292*495ae853SAndroid Build Coastguard Worker     ps_list->i4_buf_wr_idx = 0;
293*495ae853SAndroid Build Coastguard Worker     ps_list->i4_log2_buf_max_idx = 32 - CLZ(num_entries);
294*495ae853SAndroid Build Coastguard Worker     ps_list->i4_buf_max_idx = num_entries;
295*495ae853SAndroid Build Coastguard Worker     ps_list->i4_yield_interval_us = yield_interval_us;
296*495ae853SAndroid Build Coastguard Worker 
297*495ae853SAndroid Build Coastguard Worker     return ps_list;
298*495ae853SAndroid Build Coastguard Worker }
299*495ae853SAndroid Build Coastguard Worker 
300*495ae853SAndroid Build Coastguard Worker /**
301*495ae853SAndroid Build Coastguard Worker *******************************************************************************
302*495ae853SAndroid Build Coastguard Worker *
303*495ae853SAndroid Build Coastguard Worker * @brief Resets the list context
304*495ae853SAndroid Build Coastguard Worker *
305*495ae853SAndroid Build Coastguard Worker * @par Description
306*495ae853SAndroid Build Coastguard Worker *  Resets the list context by initializing buf queue context elements
307*495ae853SAndroid Build Coastguard Worker *
308*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
309*495ae853SAndroid Build Coastguard Worker *  Pointer to job queue context
310*495ae853SAndroid Build Coastguard Worker *
311*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if lock unlock fails else IH264_SUCCESS
312*495ae853SAndroid Build Coastguard Worker *
313*495ae853SAndroid Build Coastguard Worker * @remarks
314*495ae853SAndroid Build Coastguard Worker *
315*495ae853SAndroid Build Coastguard Worker *******************************************************************************
316*495ae853SAndroid Build Coastguard Worker */
ih264_list_reset(list_t * ps_list)317*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_reset(list_t *ps_list)
318*495ae853SAndroid Build Coastguard Worker {
319*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
320*495ae853SAndroid Build Coastguard Worker 
321*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_lock(ps_list);
322*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
323*495ae853SAndroid Build Coastguard Worker 
324*495ae853SAndroid Build Coastguard Worker     ps_list->i4_terminate  = 0;
325*495ae853SAndroid Build Coastguard Worker     ps_list->i4_buf_rd_idx = 0;
326*495ae853SAndroid Build Coastguard Worker     ps_list->i4_buf_wr_idx = 0;
327*495ae853SAndroid Build Coastguard Worker 
328*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_unlock(ps_list);
329*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
330*495ae853SAndroid Build Coastguard Worker 
331*495ae853SAndroid Build Coastguard Worker     return ret;
332*495ae853SAndroid Build Coastguard Worker }
333*495ae853SAndroid Build Coastguard Worker 
334*495ae853SAndroid Build Coastguard Worker /**
335*495ae853SAndroid Build Coastguard Worker *******************************************************************************
336*495ae853SAndroid Build Coastguard Worker *
337*495ae853SAndroid Build Coastguard Worker * @brief De-initializes the list context
338*495ae853SAndroid Build Coastguard Worker *
339*495ae853SAndroid Build Coastguard Worker * @par Description
340*495ae853SAndroid Build Coastguard Worker *  De-initializes the list context by calling ih264_list_reset() and then
341*495ae853SAndroid Build Coastguard Worker *  destroying the mutex created
342*495ae853SAndroid Build Coastguard Worker *
343*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
344*495ae853SAndroid Build Coastguard Worker *  Pointer to job queue context
345*495ae853SAndroid Build Coastguard Worker *
346*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if lock unlock fails else IH264_SUCCESS
347*495ae853SAndroid Build Coastguard Worker *
348*495ae853SAndroid Build Coastguard Worker * @remarks
349*495ae853SAndroid Build Coastguard Worker *
350*495ae853SAndroid Build Coastguard Worker *******************************************************************************
351*495ae853SAndroid Build Coastguard Worker */
ih264_list_deinit(list_t * ps_list)352*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_deinit(list_t *ps_list)
353*495ae853SAndroid Build Coastguard Worker {
354*495ae853SAndroid Build Coastguard Worker     WORD32 retval;
355*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
356*495ae853SAndroid Build Coastguard Worker 
357*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_reset(ps_list);
358*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
359*495ae853SAndroid Build Coastguard Worker 
360*495ae853SAndroid Build Coastguard Worker     retval = ithread_mutex_destroy(ps_list->pv_mutex);
361*495ae853SAndroid Build Coastguard Worker     if(retval)
362*495ae853SAndroid Build Coastguard Worker         return IH264_FAIL;
363*495ae853SAndroid Build Coastguard Worker     return IH264_SUCCESS;
364*495ae853SAndroid Build Coastguard Worker }
365*495ae853SAndroid Build Coastguard Worker 
366*495ae853SAndroid Build Coastguard Worker /**
367*495ae853SAndroid Build Coastguard Worker *******************************************************************************
368*495ae853SAndroid Build Coastguard Worker *
369*495ae853SAndroid Build Coastguard Worker * @brief Terminates the list
370*495ae853SAndroid Build Coastguard Worker *
371*495ae853SAndroid Build Coastguard Worker * @par Description
372*495ae853SAndroid Build Coastguard Worker *  Terminates the list by setting a flag in context.
373*495ae853SAndroid Build Coastguard Worker *
374*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
375*495ae853SAndroid Build Coastguard Worker *  Pointer to job queue context
376*495ae853SAndroid Build Coastguard Worker *
377*495ae853SAndroid Build Coastguard Worker * @returns IH264_FAIL if lock unlock fails else IH264_SUCCESS
378*495ae853SAndroid Build Coastguard Worker *
379*495ae853SAndroid Build Coastguard Worker * @remarks
380*495ae853SAndroid Build Coastguard Worker *
381*495ae853SAndroid Build Coastguard Worker *******************************************************************************
382*495ae853SAndroid Build Coastguard Worker */
ih264_list_terminate(list_t * ps_list)383*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_terminate(list_t *ps_list)
384*495ae853SAndroid Build Coastguard Worker {
385*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
386*495ae853SAndroid Build Coastguard Worker 
387*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_lock(ps_list);
388*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
389*495ae853SAndroid Build Coastguard Worker 
390*495ae853SAndroid Build Coastguard Worker     ps_list->i4_terminate = 1;
391*495ae853SAndroid Build Coastguard Worker 
392*495ae853SAndroid Build Coastguard Worker     ret = ih264_list_unlock(ps_list);
393*495ae853SAndroid Build Coastguard Worker     RETURN_IF((ret != IH264_SUCCESS), ret);
394*495ae853SAndroid Build Coastguard Worker     return ret;
395*495ae853SAndroid Build Coastguard Worker }
396*495ae853SAndroid Build Coastguard Worker 
397*495ae853SAndroid Build Coastguard Worker /**
398*495ae853SAndroid Build Coastguard Worker *******************************************************************************
399*495ae853SAndroid Build Coastguard Worker *
400*495ae853SAndroid Build Coastguard Worker * @brief Adds a job to the queue
401*495ae853SAndroid Build Coastguard Worker *
402*495ae853SAndroid Build Coastguard Worker * @par Description
403*495ae853SAndroid Build Coastguard Worker *  Adds a buffer to the queue and updates write address to next location.
404*495ae853SAndroid Build Coastguard Worker *
405*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
406*495ae853SAndroid Build Coastguard Worker *  Pointer to job queue context
407*495ae853SAndroid Build Coastguard Worker *
408*495ae853SAndroid Build Coastguard Worker * @param[in] pv_buf
409*495ae853SAndroid Build Coastguard Worker *  Pointer to the location that contains details of the job to be added
410*495ae853SAndroid Build Coastguard Worker *
411*495ae853SAndroid Build Coastguard Worker * @param[in] blocking
412*495ae853SAndroid Build Coastguard Worker *  To signal if the write is blocking or non-blocking.
413*495ae853SAndroid Build Coastguard Worker *
414*495ae853SAndroid Build Coastguard Worker * @returns IH264_SUCCESS on success and IH264_FAIL on fail
415*495ae853SAndroid Build Coastguard Worker *
416*495ae853SAndroid Build Coastguard Worker * @remarks
417*495ae853SAndroid Build Coastguard Worker *  Job Queue buffer is assumed to be allocated to handle worst case number of
418*495ae853SAndroid Build Coastguard Worker *  buffers. Wrap around is not supported
419*495ae853SAndroid Build Coastguard Worker *
420*495ae853SAndroid Build Coastguard Worker *******************************************************************************
421*495ae853SAndroid Build Coastguard Worker */
ih264_list_queue(list_t * ps_list,void * pv_buf,WORD32 blocking)422*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_queue(list_t *ps_list, void *pv_buf, WORD32 blocking)
423*495ae853SAndroid Build Coastguard Worker {
424*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
425*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T rettmp;
426*495ae853SAndroid Build Coastguard Worker     WORD32 diff;
427*495ae853SAndroid Build Coastguard Worker     void *pv_buf_wr;
428*495ae853SAndroid Build Coastguard Worker     volatile WORD32 *pi4_wr_idx, *pi4_rd_idx;
429*495ae853SAndroid Build Coastguard Worker     WORD32 buf_size = ps_list->i4_entry_size;
430*495ae853SAndroid Build Coastguard Worker 
431*495ae853SAndroid Build Coastguard Worker 
432*495ae853SAndroid Build Coastguard Worker     rettmp = ih264_list_lock(ps_list);
433*495ae853SAndroid Build Coastguard Worker     RETURN_IF((rettmp != IH264_SUCCESS), rettmp);
434*495ae853SAndroid Build Coastguard Worker 
435*495ae853SAndroid Build Coastguard Worker     while(1)
436*495ae853SAndroid Build Coastguard Worker     {
437*495ae853SAndroid Build Coastguard Worker         /* Ensure wr idx does not go beyond rd idx by more than number of entries
438*495ae853SAndroid Build Coastguard Worker          */
439*495ae853SAndroid Build Coastguard Worker         pi4_wr_idx = &ps_list->i4_buf_wr_idx;
440*495ae853SAndroid Build Coastguard Worker         pi4_rd_idx = &ps_list->i4_buf_rd_idx;
441*495ae853SAndroid Build Coastguard Worker         diff = *pi4_wr_idx - *pi4_rd_idx;
442*495ae853SAndroid Build Coastguard Worker 
443*495ae853SAndroid Build Coastguard Worker         if(diff < ps_list->i4_buf_max_idx)
444*495ae853SAndroid Build Coastguard Worker         {
445*495ae853SAndroid Build Coastguard Worker             WORD32 wr_idx;
446*495ae853SAndroid Build Coastguard Worker             wr_idx = ps_list->i4_buf_wr_idx & (ps_list->i4_buf_max_idx - 1);
447*495ae853SAndroid Build Coastguard Worker             pv_buf_wr = (UWORD8 *)ps_list->pv_buf_base + wr_idx * buf_size;
448*495ae853SAndroid Build Coastguard Worker 
449*495ae853SAndroid Build Coastguard Worker             memcpy(pv_buf_wr, pv_buf, buf_size);
450*495ae853SAndroid Build Coastguard Worker             ps_list->i4_buf_wr_idx++;
451*495ae853SAndroid Build Coastguard Worker             break;
452*495ae853SAndroid Build Coastguard Worker         }
453*495ae853SAndroid Build Coastguard Worker         else
454*495ae853SAndroid Build Coastguard Worker         {
455*495ae853SAndroid Build Coastguard Worker             /* wr is ahead, so wait for rd to consume */
456*495ae853SAndroid Build Coastguard Worker             if(blocking)
457*495ae853SAndroid Build Coastguard Worker             {
458*495ae853SAndroid Build Coastguard Worker                 ih264_list_yield(ps_list);
459*495ae853SAndroid Build Coastguard Worker             }
460*495ae853SAndroid Build Coastguard Worker             else
461*495ae853SAndroid Build Coastguard Worker             {
462*495ae853SAndroid Build Coastguard Worker                 ret = IH264_FAIL;
463*495ae853SAndroid Build Coastguard Worker                 break;
464*495ae853SAndroid Build Coastguard Worker             }
465*495ae853SAndroid Build Coastguard Worker         }
466*495ae853SAndroid Build Coastguard Worker     }
467*495ae853SAndroid Build Coastguard Worker     ps_list->i4_terminate = 0;
468*495ae853SAndroid Build Coastguard Worker 
469*495ae853SAndroid Build Coastguard Worker     rettmp = ih264_list_unlock(ps_list);
470*495ae853SAndroid Build Coastguard Worker     RETURN_IF((rettmp != IH264_SUCCESS), rettmp);
471*495ae853SAndroid Build Coastguard Worker 
472*495ae853SAndroid Build Coastguard Worker     return ret;
473*495ae853SAndroid Build Coastguard Worker }
474*495ae853SAndroid Build Coastguard Worker 
475*495ae853SAndroid Build Coastguard Worker /**
476*495ae853SAndroid Build Coastguard Worker *******************************************************************************
477*495ae853SAndroid Build Coastguard Worker *
478*495ae853SAndroid Build Coastguard Worker * @brief Gets next job from the job queue
479*495ae853SAndroid Build Coastguard Worker *
480*495ae853SAndroid Build Coastguard Worker * @par   Description
481*495ae853SAndroid Build Coastguard Worker *  Gets next job from the job queue and updates rd address to next location.
482*495ae853SAndroid Build Coastguard Worker *  If it is a blocking call and if there is no new buf then this functions
483*495ae853SAndroid Build Coastguard Worker *  unlocks the mutex and calls yield and then locks it back and continues
484*495ae853SAndroid Build Coastguard Worker *  till a buf is available or terminate is set
485*495ae853SAndroid Build Coastguard Worker *
486*495ae853SAndroid Build Coastguard Worker * @param[in] ps_list
487*495ae853SAndroid Build Coastguard Worker *  Pointer to Job Queue context
488*495ae853SAndroid Build Coastguard Worker *
489*495ae853SAndroid Build Coastguard Worker * @param[out] pv_buf
490*495ae853SAndroid Build Coastguard Worker *  Pointer to the location that contains details of the buf to be written
491*495ae853SAndroid Build Coastguard Worker *
492*495ae853SAndroid Build Coastguard Worker * @param[in] blocking
493*495ae853SAndroid Build Coastguard Worker *  To signal if the read is blocking or non-blocking.
494*495ae853SAndroid Build Coastguard Worker *
495*495ae853SAndroid Build Coastguard Worker * @returns
496*495ae853SAndroid Build Coastguard Worker *
497*495ae853SAndroid Build Coastguard Worker * @remarks
498*495ae853SAndroid Build Coastguard Worker *  Job Queue buffer is assumed to be allocated to handle worst case number of
499*495ae853SAndroid Build Coastguard Worker *  buffers. Wrap around is not supported
500*495ae853SAndroid Build Coastguard Worker *
501*495ae853SAndroid Build Coastguard Worker *******************************************************************************
502*495ae853SAndroid Build Coastguard Worker */
ih264_list_dequeue(list_t * ps_list,void * pv_buf,WORD32 blocking)503*495ae853SAndroid Build Coastguard Worker IH264_ERROR_T ih264_list_dequeue(list_t *ps_list, void *pv_buf, WORD32 blocking)
504*495ae853SAndroid Build Coastguard Worker {
505*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
506*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T rettmp;
507*495ae853SAndroid Build Coastguard Worker     WORD32 buf_size = ps_list->i4_entry_size;
508*495ae853SAndroid Build Coastguard Worker     WORD32 diff;
509*495ae853SAndroid Build Coastguard Worker     void *pv_buf_rd;
510*495ae853SAndroid Build Coastguard Worker     volatile WORD32 *pi4_wr_idx, *pi4_rd_idx;
511*495ae853SAndroid Build Coastguard Worker 
512*495ae853SAndroid Build Coastguard Worker     rettmp = ih264_list_lock(ps_list);
513*495ae853SAndroid Build Coastguard Worker     RETURN_IF((rettmp != IH264_SUCCESS), rettmp);
514*495ae853SAndroid Build Coastguard Worker 
515*495ae853SAndroid Build Coastguard Worker     while(1)
516*495ae853SAndroid Build Coastguard Worker     {
517*495ae853SAndroid Build Coastguard Worker         /* Ensure wr idx is ahead of rd idx and
518*495ae853SAndroid Build Coastguard Worker          * wr idx does not go beyond rd idx by more than number of entries
519*495ae853SAndroid Build Coastguard Worker          */
520*495ae853SAndroid Build Coastguard Worker         pi4_wr_idx = &ps_list->i4_buf_wr_idx;
521*495ae853SAndroid Build Coastguard Worker         pi4_rd_idx = &ps_list->i4_buf_rd_idx;
522*495ae853SAndroid Build Coastguard Worker         diff = *pi4_wr_idx - *pi4_rd_idx;
523*495ae853SAndroid Build Coastguard Worker 
524*495ae853SAndroid Build Coastguard Worker         if(diff > 0)
525*495ae853SAndroid Build Coastguard Worker         {
526*495ae853SAndroid Build Coastguard Worker             WORD32 rd_idx;
527*495ae853SAndroid Build Coastguard Worker             rd_idx = ps_list->i4_buf_rd_idx & (ps_list->i4_buf_max_idx - 1);
528*495ae853SAndroid Build Coastguard Worker             pv_buf_rd = (UWORD8 *)ps_list->pv_buf_base + rd_idx * buf_size;
529*495ae853SAndroid Build Coastguard Worker 
530*495ae853SAndroid Build Coastguard Worker             memcpy(pv_buf, pv_buf_rd, buf_size);
531*495ae853SAndroid Build Coastguard Worker             ps_list->i4_buf_rd_idx++;
532*495ae853SAndroid Build Coastguard Worker             break;
533*495ae853SAndroid Build Coastguard Worker         }
534*495ae853SAndroid Build Coastguard Worker         else
535*495ae853SAndroid Build Coastguard Worker         {
536*495ae853SAndroid Build Coastguard Worker             /* If terminate is signaled then break */
537*495ae853SAndroid Build Coastguard Worker             if(ps_list->i4_terminate)
538*495ae853SAndroid Build Coastguard Worker             {
539*495ae853SAndroid Build Coastguard Worker                 ret = IH264_FAIL;
540*495ae853SAndroid Build Coastguard Worker                 break;
541*495ae853SAndroid Build Coastguard Worker             }
542*495ae853SAndroid Build Coastguard Worker             /* wr is ahead, so wait for rd to consume */
543*495ae853SAndroid Build Coastguard Worker             if(blocking)
544*495ae853SAndroid Build Coastguard Worker             {
545*495ae853SAndroid Build Coastguard Worker                 ih264_list_yield(ps_list);
546*495ae853SAndroid Build Coastguard Worker             }
547*495ae853SAndroid Build Coastguard Worker             else
548*495ae853SAndroid Build Coastguard Worker             {
549*495ae853SAndroid Build Coastguard Worker                 ret = IH264_FAIL;
550*495ae853SAndroid Build Coastguard Worker                 break;
551*495ae853SAndroid Build Coastguard Worker             }
552*495ae853SAndroid Build Coastguard Worker         }
553*495ae853SAndroid Build Coastguard Worker     }
554*495ae853SAndroid Build Coastguard Worker 
555*495ae853SAndroid Build Coastguard Worker     rettmp = ih264_list_unlock(ps_list);
556*495ae853SAndroid Build Coastguard Worker     RETURN_IF((rettmp != IH264_SUCCESS), rettmp);
557*495ae853SAndroid Build Coastguard Worker 
558*495ae853SAndroid Build Coastguard Worker     return ret;
559*495ae853SAndroid Build Coastguard Worker }
560