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