xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_job_queue.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar *******************************************************************************
20*c83a76b0SSuyog Pawar * @file
21*c83a76b0SSuyog Pawar *  ihevcd_job_queue.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar *  Contains functions for job queue
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar *  Harish
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar *  None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* File Includes                                                             */
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar #include <stdio.h>
40*c83a76b0SSuyog Pawar #include <stddef.h>
41*c83a76b0SSuyog Pawar #include <stdlib.h>
42*c83a76b0SSuyog Pawar #include <string.h>
43*c83a76b0SSuyog Pawar #include <assert.h>
44*c83a76b0SSuyog Pawar 
45*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
46*c83a76b0SSuyog Pawar #include "iv.h"
47*c83a76b0SSuyog Pawar #include "ivd.h"
48*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
49*c83a76b0SSuyog Pawar #include "ithread.h"
50*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
51*c83a76b0SSuyog Pawar 
52*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
53*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
54*c83a76b0SSuyog Pawar #include "ihevcd_job_queue.h"
55*c83a76b0SSuyog Pawar 
56*c83a76b0SSuyog Pawar /**
57*c83a76b0SSuyog Pawar *******************************************************************************
58*c83a76b0SSuyog Pawar *
59*c83a76b0SSuyog Pawar * @brief Returns size for job queue context. Does not include job queue buffer
60*c83a76b0SSuyog Pawar * requirements
61*c83a76b0SSuyog Pawar *
62*c83a76b0SSuyog Pawar * @par   Description
63*c83a76b0SSuyog Pawar * Returns size for job queue context. Does not include job queue buffer
64*c83a76b0SSuyog Pawar * requirements. Buffer size required to store the jobs should be allocated in
65*c83a76b0SSuyog Pawar * addition to the value returned here.
66*c83a76b0SSuyog Pawar *
67*c83a76b0SSuyog Pawar * @returns Size of the job queue context
68*c83a76b0SSuyog Pawar *
69*c83a76b0SSuyog Pawar * @remarks
70*c83a76b0SSuyog Pawar *
71*c83a76b0SSuyog Pawar *******************************************************************************
72*c83a76b0SSuyog Pawar */
ihevcd_jobq_ctxt_size()73*c83a76b0SSuyog Pawar WORD32 ihevcd_jobq_ctxt_size()
74*c83a76b0SSuyog Pawar {
75*c83a76b0SSuyog Pawar     WORD32 size;
76*c83a76b0SSuyog Pawar     size = sizeof(jobq_t);
77*c83a76b0SSuyog Pawar     size += ithread_get_mutex_lock_size();
78*c83a76b0SSuyog Pawar     return size;
79*c83a76b0SSuyog Pawar }
80*c83a76b0SSuyog Pawar 
81*c83a76b0SSuyog Pawar /**
82*c83a76b0SSuyog Pawar *******************************************************************************
83*c83a76b0SSuyog Pawar *
84*c83a76b0SSuyog Pawar * @brief
85*c83a76b0SSuyog Pawar *   Locks the jobq conext
86*c83a76b0SSuyog Pawar *
87*c83a76b0SSuyog Pawar * @par   Description
88*c83a76b0SSuyog Pawar *   Locks the jobq conext by calling ithread_mutex_lock()
89*c83a76b0SSuyog Pawar *
90*c83a76b0SSuyog Pawar * @param[in] ps_jobq
91*c83a76b0SSuyog Pawar *   Job Queue context
92*c83a76b0SSuyog Pawar *
93*c83a76b0SSuyog Pawar * @returns IHEVCD_FAIL if mutex lock fails else IHEVCD_SUCCESS
94*c83a76b0SSuyog Pawar *
95*c83a76b0SSuyog Pawar * @remarks
96*c83a76b0SSuyog Pawar *
97*c83a76b0SSuyog Pawar *******************************************************************************
98*c83a76b0SSuyog Pawar */
ihevcd_jobq_lock(jobq_t * ps_jobq)99*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_lock(jobq_t *ps_jobq)
100*c83a76b0SSuyog Pawar {
101*c83a76b0SSuyog Pawar     WORD32 retval;
102*c83a76b0SSuyog Pawar     retval = ithread_mutex_lock(ps_jobq->pv_mutex);
103*c83a76b0SSuyog Pawar     if(retval)
104*c83a76b0SSuyog Pawar     {
105*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_FAIL;
106*c83a76b0SSuyog Pawar     }
107*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
108*c83a76b0SSuyog Pawar }
109*c83a76b0SSuyog Pawar 
110*c83a76b0SSuyog Pawar /**
111*c83a76b0SSuyog Pawar *******************************************************************************
112*c83a76b0SSuyog Pawar *
113*c83a76b0SSuyog Pawar * @brief
114*c83a76b0SSuyog Pawar *   Unlocks the jobq conext
115*c83a76b0SSuyog Pawar *
116*c83a76b0SSuyog Pawar * @par   Description
117*c83a76b0SSuyog Pawar *   Unlocks the jobq conext by calling ithread_mutex_unlock()
118*c83a76b0SSuyog Pawar *
119*c83a76b0SSuyog Pawar * @param[in] ps_jobq
120*c83a76b0SSuyog Pawar *   Job Queue context
121*c83a76b0SSuyog Pawar *
122*c83a76b0SSuyog Pawar * @returns IHEVCD_FAIL if mutex unlock fails else IHEVCD_SUCCESS
123*c83a76b0SSuyog Pawar *
124*c83a76b0SSuyog Pawar * @remarks
125*c83a76b0SSuyog Pawar *
126*c83a76b0SSuyog Pawar *******************************************************************************
127*c83a76b0SSuyog Pawar */
128*c83a76b0SSuyog Pawar 
ihevcd_jobq_unlock(jobq_t * ps_jobq)129*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_unlock(jobq_t *ps_jobq)
130*c83a76b0SSuyog Pawar {
131*c83a76b0SSuyog Pawar     WORD32 retval;
132*c83a76b0SSuyog Pawar     retval = ithread_mutex_unlock(ps_jobq->pv_mutex);
133*c83a76b0SSuyog Pawar     if(retval)
134*c83a76b0SSuyog Pawar     {
135*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_FAIL;
136*c83a76b0SSuyog Pawar     }
137*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
138*c83a76b0SSuyog Pawar 
139*c83a76b0SSuyog Pawar }
140*c83a76b0SSuyog Pawar /**
141*c83a76b0SSuyog Pawar *******************************************************************************
142*c83a76b0SSuyog Pawar *
143*c83a76b0SSuyog Pawar * @brief
144*c83a76b0SSuyog Pawar *   Yeilds the thread
145*c83a76b0SSuyog Pawar *
146*c83a76b0SSuyog Pawar * @par   Description
147*c83a76b0SSuyog Pawar *   Unlocks the jobq conext by calling
148*c83a76b0SSuyog Pawar * ihevcd_jobq_unlock(), ithread_yield() and then ihevcd_jobq_lock()
149*c83a76b0SSuyog Pawar * jobq is unlocked before to ensure the jobq can be accessed by other threads
150*c83a76b0SSuyog Pawar * If unlock is not done before calling yield then no other thread can access
151*c83a76b0SSuyog Pawar * the jobq functions and update jobq.
152*c83a76b0SSuyog Pawar *
153*c83a76b0SSuyog Pawar * @param[in] ps_jobq
154*c83a76b0SSuyog Pawar *   Job Queue context
155*c83a76b0SSuyog Pawar *
156*c83a76b0SSuyog Pawar * @returns IHEVCD_FAIL if mutex lock unlock or yield fails else IHEVCD_SUCCESS
157*c83a76b0SSuyog Pawar *
158*c83a76b0SSuyog Pawar * @remarks
159*c83a76b0SSuyog Pawar *
160*c83a76b0SSuyog Pawar *******************************************************************************
161*c83a76b0SSuyog Pawar */
ihevcd_jobq_yield(jobq_t * ps_jobq)162*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_yield(jobq_t *ps_jobq)
163*c83a76b0SSuyog Pawar {
164*c83a76b0SSuyog Pawar 
165*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
166*c83a76b0SSuyog Pawar 
167*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T rettmp;
168*c83a76b0SSuyog Pawar     rettmp = ihevcd_jobq_unlock(ps_jobq);
169*c83a76b0SSuyog Pawar     RETURN_IF((rettmp != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), rettmp);
170*c83a76b0SSuyog Pawar 
171*c83a76b0SSuyog Pawar     //NOP(1024 * 8);
172*c83a76b0SSuyog Pawar     ithread_yield();
173*c83a76b0SSuyog Pawar 
174*c83a76b0SSuyog Pawar     rettmp = ihevcd_jobq_lock(ps_jobq);
175*c83a76b0SSuyog Pawar     RETURN_IF((rettmp != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), rettmp);
176*c83a76b0SSuyog Pawar     return ret;
177*c83a76b0SSuyog Pawar }
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar 
180*c83a76b0SSuyog Pawar /**
181*c83a76b0SSuyog Pawar *******************************************************************************
182*c83a76b0SSuyog Pawar *
183*c83a76b0SSuyog Pawar * @brief free the job queue pointers
184*c83a76b0SSuyog Pawar *
185*c83a76b0SSuyog Pawar * @par   Description
186*c83a76b0SSuyog Pawar * Frees the jobq context
187*c83a76b0SSuyog Pawar *
188*c83a76b0SSuyog Pawar * @param[in] pv_buf
189*c83a76b0SSuyog Pawar * Memoy for job queue buffer and job queue context
190*c83a76b0SSuyog Pawar *
191*c83a76b0SSuyog Pawar * @returns Pointer to job queue context
192*c83a76b0SSuyog Pawar *
193*c83a76b0SSuyog Pawar * @remarks
194*c83a76b0SSuyog Pawar * Since it will be called only once by master thread this is not thread safe.
195*c83a76b0SSuyog Pawar *
196*c83a76b0SSuyog Pawar *******************************************************************************
197*c83a76b0SSuyog Pawar */
ihevcd_jobq_free(jobq_t * ps_jobq)198*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_free(jobq_t *ps_jobq)
199*c83a76b0SSuyog Pawar {
200*c83a76b0SSuyog Pawar     WORD32 ret;
201*c83a76b0SSuyog Pawar     ret = ithread_mutex_destroy(ps_jobq->pv_mutex);
202*c83a76b0SSuyog Pawar 
203*c83a76b0SSuyog Pawar     if(0 == ret)
204*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
205*c83a76b0SSuyog Pawar     else
206*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_FAIL;
207*c83a76b0SSuyog Pawar }
208*c83a76b0SSuyog Pawar 
209*c83a76b0SSuyog Pawar /**
210*c83a76b0SSuyog Pawar *******************************************************************************
211*c83a76b0SSuyog Pawar *
212*c83a76b0SSuyog Pawar * @brief Initialize the job queue
213*c83a76b0SSuyog Pawar *
214*c83a76b0SSuyog Pawar * @par   Description
215*c83a76b0SSuyog Pawar * Initializes the jobq context and sets write and read pointers to start of
216*c83a76b0SSuyog Pawar * job queue buffer
217*c83a76b0SSuyog Pawar *
218*c83a76b0SSuyog Pawar * @param[in] pv_buf
219*c83a76b0SSuyog Pawar * Memoy for job queue buffer and job queue context
220*c83a76b0SSuyog Pawar *
221*c83a76b0SSuyog Pawar * @param[in] buf_size
222*c83a76b0SSuyog Pawar * Size of the total memory allocated
223*c83a76b0SSuyog Pawar *
224*c83a76b0SSuyog Pawar * @returns Pointer to job queue context
225*c83a76b0SSuyog Pawar *
226*c83a76b0SSuyog Pawar * @remarks
227*c83a76b0SSuyog Pawar * Since it will be called only once by master thread this is not thread safe.
228*c83a76b0SSuyog Pawar *
229*c83a76b0SSuyog Pawar *******************************************************************************
230*c83a76b0SSuyog Pawar */
ihevcd_jobq_init(void * pv_buf,WORD32 buf_size)231*c83a76b0SSuyog Pawar void* ihevcd_jobq_init(void *pv_buf, WORD32 buf_size)
232*c83a76b0SSuyog Pawar {
233*c83a76b0SSuyog Pawar     jobq_t *ps_jobq;
234*c83a76b0SSuyog Pawar     UWORD8 *pu1_buf;
235*c83a76b0SSuyog Pawar     pu1_buf = (UWORD8 *)pv_buf;
236*c83a76b0SSuyog Pawar 
237*c83a76b0SSuyog Pawar     ps_jobq = (jobq_t *)pu1_buf;
238*c83a76b0SSuyog Pawar     pu1_buf += sizeof(jobq_t);
239*c83a76b0SSuyog Pawar     buf_size -= sizeof(jobq_t);
240*c83a76b0SSuyog Pawar 
241*c83a76b0SSuyog Pawar     ps_jobq->pv_mutex = pu1_buf;
242*c83a76b0SSuyog Pawar     pu1_buf += ithread_get_mutex_lock_size();
243*c83a76b0SSuyog Pawar     buf_size -= ithread_get_mutex_lock_size();
244*c83a76b0SSuyog Pawar 
245*c83a76b0SSuyog Pawar     if(buf_size <= 0)
246*c83a76b0SSuyog Pawar         return NULL;
247*c83a76b0SSuyog Pawar 
248*c83a76b0SSuyog Pawar     ithread_mutex_init(ps_jobq->pv_mutex);
249*c83a76b0SSuyog Pawar 
250*c83a76b0SSuyog Pawar     ps_jobq->pv_buf_base = pu1_buf;
251*c83a76b0SSuyog Pawar     ps_jobq->pv_buf_wr = pu1_buf;
252*c83a76b0SSuyog Pawar     ps_jobq->pv_buf_rd = pu1_buf;
253*c83a76b0SSuyog Pawar     ps_jobq->pv_buf_end = pu1_buf + buf_size;
254*c83a76b0SSuyog Pawar     ps_jobq->i4_terminate = 0;
255*c83a76b0SSuyog Pawar 
256*c83a76b0SSuyog Pawar 
257*c83a76b0SSuyog Pawar     return ps_jobq;
258*c83a76b0SSuyog Pawar }
259*c83a76b0SSuyog Pawar /**
260*c83a76b0SSuyog Pawar *******************************************************************************
261*c83a76b0SSuyog Pawar *
262*c83a76b0SSuyog Pawar * @brief
263*c83a76b0SSuyog Pawar *   Resets the jobq conext
264*c83a76b0SSuyog Pawar *
265*c83a76b0SSuyog Pawar * @par   Description
266*c83a76b0SSuyog Pawar *   Resets the jobq conext by initilizing job queue context elements
267*c83a76b0SSuyog Pawar *
268*c83a76b0SSuyog Pawar * @param[in] ps_jobq
269*c83a76b0SSuyog Pawar *   Job Queue context
270*c83a76b0SSuyog Pawar *
271*c83a76b0SSuyog Pawar * @returns IHEVCD_FAIL if lock unlock fails else IHEVCD_SUCCESS
272*c83a76b0SSuyog Pawar *
273*c83a76b0SSuyog Pawar * @remarks
274*c83a76b0SSuyog Pawar *
275*c83a76b0SSuyog Pawar *******************************************************************************
276*c83a76b0SSuyog Pawar */
ihevcd_jobq_reset(jobq_t * ps_jobq)277*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_reset(jobq_t *ps_jobq)
278*c83a76b0SSuyog Pawar {
279*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
280*c83a76b0SSuyog Pawar     ret = ihevcd_jobq_lock(ps_jobq);
281*c83a76b0SSuyog Pawar     RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
282*c83a76b0SSuyog Pawar 
283*c83a76b0SSuyog Pawar     ps_jobq->pv_buf_wr      = ps_jobq->pv_buf_base;
284*c83a76b0SSuyog Pawar     ps_jobq->pv_buf_rd      = ps_jobq->pv_buf_base;
285*c83a76b0SSuyog Pawar     ps_jobq->i4_terminate   = 0;
286*c83a76b0SSuyog Pawar     ret = ihevcd_jobq_unlock(ps_jobq);
287*c83a76b0SSuyog Pawar     RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
288*c83a76b0SSuyog Pawar 
289*c83a76b0SSuyog Pawar     return ret;
290*c83a76b0SSuyog Pawar }
291*c83a76b0SSuyog Pawar 
292*c83a76b0SSuyog Pawar /**
293*c83a76b0SSuyog Pawar *******************************************************************************
294*c83a76b0SSuyog Pawar *
295*c83a76b0SSuyog Pawar * @brief
296*c83a76b0SSuyog Pawar *   Deinitializes the jobq conext
297*c83a76b0SSuyog Pawar *
298*c83a76b0SSuyog Pawar * @par   Description
299*c83a76b0SSuyog Pawar *   Deinitializes the jobq conext by calling ihevc_jobq_reset()
300*c83a76b0SSuyog Pawar * and then destrying the mutex created
301*c83a76b0SSuyog Pawar *
302*c83a76b0SSuyog Pawar * @param[in] ps_jobq
303*c83a76b0SSuyog Pawar *   Job Queue context
304*c83a76b0SSuyog Pawar *
305*c83a76b0SSuyog Pawar * @returns IHEVCD_FAIL if lock unlock fails else IHEVCD_SUCCESS
306*c83a76b0SSuyog Pawar *
307*c83a76b0SSuyog Pawar * @remarks
308*c83a76b0SSuyog Pawar *
309*c83a76b0SSuyog Pawar *******************************************************************************
310*c83a76b0SSuyog Pawar */
ihevcd_jobq_deinit(jobq_t * ps_jobq)311*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_deinit(jobq_t *ps_jobq)
312*c83a76b0SSuyog Pawar {
313*c83a76b0SSuyog Pawar     WORD32 retval;
314*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
315*c83a76b0SSuyog Pawar 
316*c83a76b0SSuyog Pawar     ret = ihevcd_jobq_reset(ps_jobq);
317*c83a76b0SSuyog Pawar     RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
318*c83a76b0SSuyog Pawar 
319*c83a76b0SSuyog Pawar     retval = ithread_mutex_destroy(ps_jobq->pv_mutex);
320*c83a76b0SSuyog Pawar     if(retval)
321*c83a76b0SSuyog Pawar     {
322*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_FAIL;
323*c83a76b0SSuyog Pawar     }
324*c83a76b0SSuyog Pawar 
325*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
326*c83a76b0SSuyog Pawar }
327*c83a76b0SSuyog Pawar 
328*c83a76b0SSuyog Pawar 
329*c83a76b0SSuyog Pawar /**
330*c83a76b0SSuyog Pawar *******************************************************************************
331*c83a76b0SSuyog Pawar *
332*c83a76b0SSuyog Pawar * @brief
333*c83a76b0SSuyog Pawar *   Terminates the jobq
334*c83a76b0SSuyog Pawar *
335*c83a76b0SSuyog Pawar * @par   Description
336*c83a76b0SSuyog Pawar *   Terminates the jobq by setting a flag in context.
337*c83a76b0SSuyog Pawar *
338*c83a76b0SSuyog Pawar * @param[in] ps_jobq
339*c83a76b0SSuyog Pawar *   Job Queue context
340*c83a76b0SSuyog Pawar *
341*c83a76b0SSuyog Pawar * @returns IHEVCD_FAIL if lock unlock fails else IHEVCD_SUCCESS
342*c83a76b0SSuyog Pawar *
343*c83a76b0SSuyog Pawar * @remarks
344*c83a76b0SSuyog Pawar *
345*c83a76b0SSuyog Pawar *******************************************************************************
346*c83a76b0SSuyog Pawar */
347*c83a76b0SSuyog Pawar 
ihevcd_jobq_terminate(jobq_t * ps_jobq)348*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_terminate(jobq_t *ps_jobq)
349*c83a76b0SSuyog Pawar {
350*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
351*c83a76b0SSuyog Pawar     ret = ihevcd_jobq_lock(ps_jobq);
352*c83a76b0SSuyog Pawar     RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
353*c83a76b0SSuyog Pawar 
354*c83a76b0SSuyog Pawar     ps_jobq->i4_terminate = 1;
355*c83a76b0SSuyog Pawar 
356*c83a76b0SSuyog Pawar     ret = ihevcd_jobq_unlock(ps_jobq);
357*c83a76b0SSuyog Pawar     RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
358*c83a76b0SSuyog Pawar     return ret;
359*c83a76b0SSuyog Pawar }
360*c83a76b0SSuyog Pawar 
361*c83a76b0SSuyog Pawar 
362*c83a76b0SSuyog Pawar /**
363*c83a76b0SSuyog Pawar *******************************************************************************
364*c83a76b0SSuyog Pawar *
365*c83a76b0SSuyog Pawar * @brief Adds a job to the queue
366*c83a76b0SSuyog Pawar *
367*c83a76b0SSuyog Pawar * @par   Description
368*c83a76b0SSuyog Pawar * Adds a job to the queue and updates wr address to next location.
369*c83a76b0SSuyog Pawar * Format/content of the job structure is abstracted and hence size of the job
370*c83a76b0SSuyog Pawar * buffer is being passed.
371*c83a76b0SSuyog Pawar *
372*c83a76b0SSuyog Pawar * @param[in] ps_jobq
373*c83a76b0SSuyog Pawar *   Job Queue context
374*c83a76b0SSuyog Pawar *
375*c83a76b0SSuyog Pawar * @param[in] pv_job
376*c83a76b0SSuyog Pawar *   Pointer to the location that contains details of the job to be added
377*c83a76b0SSuyog Pawar *
378*c83a76b0SSuyog Pawar * @param[in] job_size
379*c83a76b0SSuyog Pawar *   Size of the job buffer
380*c83a76b0SSuyog Pawar *
381*c83a76b0SSuyog Pawar * @param[in] blocking
382*c83a76b0SSuyog Pawar *   To signal if the write is blocking or non-blocking.
383*c83a76b0SSuyog Pawar *
384*c83a76b0SSuyog Pawar * @returns
385*c83a76b0SSuyog Pawar *
386*c83a76b0SSuyog Pawar * @remarks
387*c83a76b0SSuyog Pawar * Job Queue buffer is assumed to be allocated to handle worst case number of jobs
388*c83a76b0SSuyog Pawar * Wrap around is not supported
389*c83a76b0SSuyog Pawar *
390*c83a76b0SSuyog Pawar *******************************************************************************
391*c83a76b0SSuyog Pawar */
ihevcd_jobq_queue(jobq_t * ps_jobq,void * pv_job,WORD32 job_size,WORD32 blocking)392*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_queue(jobq_t *ps_jobq, void *pv_job, WORD32 job_size, WORD32 blocking)
393*c83a76b0SSuyog Pawar {
394*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
395*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T rettmp;
396*c83a76b0SSuyog Pawar     UWORD8 *pu1_buf;
397*c83a76b0SSuyog Pawar     UNUSED(blocking);
398*c83a76b0SSuyog Pawar 
399*c83a76b0SSuyog Pawar     rettmp = ihevcd_jobq_lock(ps_jobq);
400*c83a76b0SSuyog Pawar     RETURN_IF((rettmp != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), rettmp);
401*c83a76b0SSuyog Pawar 
402*c83a76b0SSuyog Pawar     pu1_buf = (UWORD8 *)ps_jobq->pv_buf_wr;
403*c83a76b0SSuyog Pawar     if((UWORD8 *)ps_jobq->pv_buf_end >= (pu1_buf + job_size))
404*c83a76b0SSuyog Pawar     {
405*c83a76b0SSuyog Pawar         memcpy(ps_jobq->pv_buf_wr, pv_job, job_size);
406*c83a76b0SSuyog Pawar         ps_jobq->pv_buf_wr = (UWORD8 *)ps_jobq->pv_buf_wr + job_size;
407*c83a76b0SSuyog Pawar         ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
408*c83a76b0SSuyog Pawar     }
409*c83a76b0SSuyog Pawar     else
410*c83a76b0SSuyog Pawar     {
411*c83a76b0SSuyog Pawar         /* Handle wrap around case */
412*c83a76b0SSuyog Pawar         /* Wait for pv_buf_rd to consume first job_size number of bytes
413*c83a76b0SSuyog Pawar          * from the beginning of job queue
414*c83a76b0SSuyog Pawar          */
415*c83a76b0SSuyog Pawar         ret = (IHEVCD_ERROR_T)IHEVCD_FAIL;
416*c83a76b0SSuyog Pawar     }
417*c83a76b0SSuyog Pawar 
418*c83a76b0SSuyog Pawar     ps_jobq->i4_terminate = 0;
419*c83a76b0SSuyog Pawar 
420*c83a76b0SSuyog Pawar     rettmp = ihevcd_jobq_unlock(ps_jobq);
421*c83a76b0SSuyog Pawar     RETURN_IF((rettmp != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), rettmp);
422*c83a76b0SSuyog Pawar 
423*c83a76b0SSuyog Pawar     return ret;
424*c83a76b0SSuyog Pawar }
425*c83a76b0SSuyog Pawar /**
426*c83a76b0SSuyog Pawar *******************************************************************************
427*c83a76b0SSuyog Pawar *
428*c83a76b0SSuyog Pawar * @brief Gets next from the Job queue
429*c83a76b0SSuyog Pawar *
430*c83a76b0SSuyog Pawar * @par   Description
431*c83a76b0SSuyog Pawar * Gets next job from the job queue and updates rd address to next location.
432*c83a76b0SSuyog Pawar * Format/content of the job structure is abstracted and hence size of the job
433*c83a76b0SSuyog Pawar * buffer is being passed. If it is a blocking call and if there is no new job
434*c83a76b0SSuyog Pawar * then this functions unlocks the mutext and calls yield and then locks it back.
435*c83a76b0SSuyog Pawar * and continues till a job is available or terminate is set
436*c83a76b0SSuyog Pawar *
437*c83a76b0SSuyog Pawar * @param[in] ps_jobq
438*c83a76b0SSuyog Pawar *   Job Queue context
439*c83a76b0SSuyog Pawar *
440*c83a76b0SSuyog Pawar * @param[out] pv_job
441*c83a76b0SSuyog Pawar *   Pointer to the location that contains details of the job to be written
442*c83a76b0SSuyog Pawar *
443*c83a76b0SSuyog Pawar * @param[in] job_size
444*c83a76b0SSuyog Pawar *   Size of the job buffer
445*c83a76b0SSuyog Pawar *
446*c83a76b0SSuyog Pawar * @param[in] blocking
447*c83a76b0SSuyog Pawar *   To signal if the read is blocking or non-blocking.
448*c83a76b0SSuyog Pawar *
449*c83a76b0SSuyog Pawar * @returns
450*c83a76b0SSuyog Pawar *
451*c83a76b0SSuyog Pawar * @remarks
452*c83a76b0SSuyog Pawar * Job Queue buffer is assumed to be allocated to handle worst case number of jobs
453*c83a76b0SSuyog Pawar * Wrap around is not supported
454*c83a76b0SSuyog Pawar *
455*c83a76b0SSuyog Pawar *******************************************************************************
456*c83a76b0SSuyog Pawar */
ihevcd_jobq_dequeue(jobq_t * ps_jobq,void * pv_job,WORD32 job_size,WORD32 blocking)457*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_jobq_dequeue(jobq_t *ps_jobq, void *pv_job, WORD32 job_size, WORD32 blocking)
458*c83a76b0SSuyog Pawar {
459*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret;
460*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T rettmp;
461*c83a76b0SSuyog Pawar     volatile UWORD8 *pu1_buf;
462*c83a76b0SSuyog Pawar 
463*c83a76b0SSuyog Pawar     rettmp = ihevcd_jobq_lock(ps_jobq);
464*c83a76b0SSuyog Pawar     RETURN_IF((rettmp != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), rettmp);
465*c83a76b0SSuyog Pawar     pu1_buf = (UWORD8 *)ps_jobq->pv_buf_rd;
466*c83a76b0SSuyog Pawar 
467*c83a76b0SSuyog Pawar 
468*c83a76b0SSuyog Pawar     if((UWORD8 *)ps_jobq->pv_buf_end >= (pu1_buf + job_size))
469*c83a76b0SSuyog Pawar     {
470*c83a76b0SSuyog Pawar         while(1)
471*c83a76b0SSuyog Pawar         {
472*c83a76b0SSuyog Pawar             pu1_buf = (UWORD8 *)ps_jobq->pv_buf_rd;
473*c83a76b0SSuyog Pawar             if((UWORD8 *)ps_jobq->pv_buf_wr >= (pu1_buf + job_size))
474*c83a76b0SSuyog Pawar             {
475*c83a76b0SSuyog Pawar                 memcpy(pv_job, ps_jobq->pv_buf_rd, job_size);
476*c83a76b0SSuyog Pawar                 ps_jobq->pv_buf_rd = (UWORD8 *)ps_jobq->pv_buf_rd + job_size;
477*c83a76b0SSuyog Pawar                 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
478*c83a76b0SSuyog Pawar                 break;
479*c83a76b0SSuyog Pawar             }
480*c83a76b0SSuyog Pawar             else
481*c83a76b0SSuyog Pawar             {
482*c83a76b0SSuyog Pawar                 /* If all the entries have been dequeued, then break and return */
483*c83a76b0SSuyog Pawar                 if(1 == ps_jobq->i4_terminate)
484*c83a76b0SSuyog Pawar                 {
485*c83a76b0SSuyog Pawar                     ret = (IHEVCD_ERROR_T)IHEVCD_FAIL;
486*c83a76b0SSuyog Pawar                     break;
487*c83a76b0SSuyog Pawar                 }
488*c83a76b0SSuyog Pawar 
489*c83a76b0SSuyog Pawar                 if(1 == blocking)
490*c83a76b0SSuyog Pawar                 {
491*c83a76b0SSuyog Pawar                     ihevcd_jobq_yield(ps_jobq);
492*c83a76b0SSuyog Pawar 
493*c83a76b0SSuyog Pawar                 }
494*c83a76b0SSuyog Pawar                 else
495*c83a76b0SSuyog Pawar                 {
496*c83a76b0SSuyog Pawar                     /* If there is no job available,
497*c83a76b0SSuyog Pawar                      * and this is non blocking call then return fail */
498*c83a76b0SSuyog Pawar                     ret = (IHEVCD_ERROR_T)IHEVCD_FAIL;
499*c83a76b0SSuyog Pawar                 }
500*c83a76b0SSuyog Pawar             }
501*c83a76b0SSuyog Pawar         }
502*c83a76b0SSuyog Pawar     }
503*c83a76b0SSuyog Pawar     else
504*c83a76b0SSuyog Pawar     {
505*c83a76b0SSuyog Pawar         /* Handle wrap around case */
506*c83a76b0SSuyog Pawar         /* Wait for pv_buf_rd to consume first job_size number of bytes
507*c83a76b0SSuyog Pawar          * from the beginning of job queue
508*c83a76b0SSuyog Pawar          */
509*c83a76b0SSuyog Pawar         ret = (IHEVCD_ERROR_T)IHEVCD_FAIL;
510*c83a76b0SSuyog Pawar     }
511*c83a76b0SSuyog Pawar     rettmp = ihevcd_jobq_unlock(ps_jobq);
512*c83a76b0SSuyog Pawar     RETURN_IF((rettmp != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), rettmp);
513*c83a76b0SSuyog Pawar 
514*c83a76b0SSuyog Pawar     return ret;
515*c83a76b0SSuyog Pawar }
516