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