1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 
21 /**
22 *******************************************************************************
23 * @file
24 *  ih264e_process.h
25 *
26 * @brief
27 *  Contains functions for codec thread
28 *
29 * @author
30 *  ittiam
31 *
32 * @remarks
33 *  None
34 *
35 *******************************************************************************
36 */
37 
38 #ifndef IH264E_PROCESS_H_
39 #define IH264E_PROCESS_H_
40 
41 /*****************************************************************************/
42 /* Function Declarations                                                     */
43 /*****************************************************************************/
44 
45 /**
46 ******************************************************************************
47 *
48 *  @brief This function generates sps, pps set on request
49 *
50 *  @par   Description
51 *  When the encoder is set in header generation mode, the following function
52 *  is called. This generates sps and pps headers and returns the control back
53 *  to caller.
54 *
55 *  @param[in]    ps_codec
56 *  pointer to codec context
57 *
58 *  @return      success or failure error code
59 *
60 ******************************************************************************
61 */
62 IH264E_ERROR_T    ih264e_generate_sps_pps
63         (
64             codec_t   *ps_codec
65         );
66 
67 /**
68 *******************************************************************************
69 *
70 * @brief   initialize entropy context.
71 *
72 * @par Description:
73 *  Before invoking the call to perform to entropy coding the entropy context
74 *  associated with the job needs to be initialized. This involves the start
75 *  mb address, end mb address, slice index and the pointer to location at
76 *  which the mb residue info and mb header info are packed.
77 *
78 * @param[in] ps_proc
79 *  Pointer to the current process context
80 *
81 * @returns error status
82 *
83 * @remarks none
84 *
85 *******************************************************************************
86 */
87 IH264E_ERROR_T ih264e_init_entropy_ctxt(process_ctxt_t *ps_proc);
88 
89 /**
90 *******************************************************************************
91 *
92 * @brief entry point for entropy coding
93 *
94 * @par Description
95 *  This function calls lower level functions to perform entropy coding for a
96 *  group (n rows) of mb's. After encoding 1 row of mb's,  the function takes
97 *  back the control, updates the ctxt and calls lower level functions again.
98 *  This process is repeated till all the rows or group of mb's (which ever is
99 *  minimum) are coded
100 *
101 * @param[in] ps_proc
102 *  process context
103 *
104 * @returns  error status
105 *
106 * @remarks
107 * NOTE : It is assumed that this routine is invoked at the start of a slice,
108 * so the slice header is generated by default.
109 *
110 *******************************************************************************
111 */
112 IH264E_ERROR_T ih264e_entropy(process_ctxt_t *ps_proc);
113 
114 /**
115 *******************************************************************************
116 *
117 * @brief Packs header information of a mb in to a buffer
118 *
119 * @par Description:
120 *  After the deciding the mode info of a macroblock, the syntax elements
121 *  associated with the mb are packed and stored. The entropy thread unpacks
122 *  this buffer and generates the end bit stream.
123 *
124 * @param[in] ps_proc
125 *  Pointer to the current process context
126 *
127 * @returns error status
128 *
129 * @remarks none
130 *
131 *******************************************************************************
132 */
133 IH264E_ERROR_T ih264e_pack_header_data
134     (
135         process_ctxt_t *ps_proc
136     );
137 
138 /**
139 *******************************************************************************
140 *
141 * @brief   update process context after encoding an mb. This involves preserving
142 * the current mb information for later use, initialize the proc ctxt elements to
143 * encode next mb.
144 *
145 * @par Description:
146 *  This function performs house keeping tasks after encoding an mb.
147 *  After encoding an mb, various elements of the process context needs to be
148 *  updated to encode the next mb. For instance, the source, recon and reference
149 *  pointers, mb indices have to be adjusted to the next mb. The slice index of
150 *  the current mb needs to be updated. If mb qp modulation is enabled, then if
151 *  the qp changes the quant param structure needs to be updated. Also to encoding
152 *  the next mb, the current mb info is used as part of mode prediction or mv
153 *  prediction. Hence the current mb info has to preserved at top/top left/left
154 *  locations.
155 *
156 * @param[in] ps_proc
157 *  Pointer to the current process context
158 *
159 * @returns none
160 *
161 * @remarks none
162 *
163 *******************************************************************************
164 */
165 WORD32 ih264e_update_proc_ctxt
166     (
167         process_ctxt_t *ps_proc
168     );
169 
170 /**
171 *******************************************************************************
172 *
173 * @brief   initialize process context.
174 *
175 * @par Description:
176 *  Before dispatching the current job to process thread, the process context
177 *  associated with the job is initialized. Usually every job aims to encode one
178 *  row of mb's. Basing on the row indices provided by the job, the process
179 *  context's buffer ptrs, slice indices and other elements that are necessary
180 *  during core-coding are initialized.
181 *
182 * @param[in] ps_proc
183 *  Pointer to the current process context
184 *
185 * @returns error status
186 *
187 * @remarks none
188 *
189 *******************************************************************************
190 */
191 IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc);
192 
193 /**
194 *******************************************************************************
195 *
196 * @brief This function performs luma & chroma padding
197 *
198 * @par Description:
199 *
200 * @param[in] ps_proc
201 *  Process context corresponding to the job
202 *
203 * @param[in] pu1_curr_pic_luma
204 *  Pointer to luma buffer
205 *
206 * @param[in] pu1_curr_pic_chroma
207 *  Pointer to chroma buffer
208 *
209 * @param[in] i4_mb_x
210 *  mb index x
211 *
212 * @param[in] i4_mb_y
213 *  mb index y
214 *
215 * @param[in] i4_pad_ht
216 *  number of rows to be padded
217 *
218 * @returns  error status
219 *
220 * @remarks none
221 *
222 *******************************************************************************
223 */
224 IH264E_ERROR_T ih264e_pad_recon_buffer
225     (
226         process_ctxt_t *ps_proc,
227         UWORD8 *pu1_curr_pic_luma,
228         UWORD8 *pu1_curr_pic_chroma,
229         WORD32 i4_mb_x,
230         WORD32 i4_mb_y,
231         WORD32 i4_pad_ht
232     );
233 
234 /**
235 *******************************************************************************
236 *
237 * @brief This function performs luma half pel planes generation
238 *
239 * @par Description:
240 *
241 * @param[in] ps_proc
242 *  Process context corresponding to the job
243 *
244 * @returns  error status
245 *
246 * @remarks none
247 *
248 *******************************************************************************
249 */
250 IH264E_ERROR_T ih264e_halfpel_generation
251     (
252         process_ctxt_t *ps_proc,
253         UWORD8 *pu1_curr_pic_luma,
254         WORD32 i4_mb_x,
255         WORD32 i4_mb_y
256     );
257 
258 /**
259 *******************************************************************************
260 *
261 * @brief This function performs luma & chroma core coding for a set of mb's.
262 *
263 * @par Description:
264 *  The mb to be coded is taken and is evaluated over a predefined set of modes
265 *  (intra (i16, i4, i8)/inter (mv, skip)) for best cost. The mode with least cost
266 *  is selected and using intra/inter prediction filters, prediction is carried out.
267 *  The deviation between src and pred signal constitutes error signal. This error
268 *  signal is transformed (hierarchical transform if necessary) and quantized. The
269 *  quantized residue is packed in to entropy buffer for entropy coding. This is
270 *  repeated for all the mb's enlisted under the job.
271 *
272 * @param[in] ps_proc
273 *  Process context corresponding to the job
274 *
275 * @returns  error status
276 *
277 * @remarks none
278 *
279 *******************************************************************************
280 */
281 WORD32 ih264e_process(process_ctxt_t *ps_proc);
282 
283 /**
284 *******************************************************************************
285 *
286 * @brief
287 *  Function to update rc context after encoding
288 *
289 * @par   Description
290 *  This function updates the rate control context after the frame is encoded.
291 *  Number of bits consumed by the current frame, frame distortion, frame cost,
292 *  number of intra/inter mb's, ... are passed on to rate control context for
293 *  updating the rc model.
294 *
295 * @param[in] ps_codec
296 *  Handle to codec context
297 *
298 * @param[in] ctxt_sel
299 *  frame context selector
300 *
301 * @param[in] pic_cnt
302 *  pic count
303 *
304 * @returns i4_stuffing_byte
305 *  number of stuffing bytes (if necessary)
306 *
307 * @remarks
308 *
309 *******************************************************************************
310 */
311 WORD32 ih264e_update_rc_post_enc(codec_t *ps_codec, WORD32 ctxt_sel, WORD32 pic_cnt);
312 
313 /**
314 *******************************************************************************
315 *
316 * @brief
317 *  entry point of a spawned encoder thread
318 *
319 * @par Description:
320 *  The encoder thread dequeues a proc/entropy job from the encoder queue and
321 *  calls necessary routines.
322 *
323 * @param[in] pv_proc
324 *  Process context corresponding to the thread
325 *
326 * @returns  error status
327 *
328 * @remarks
329 *
330 *******************************************************************************
331 */
332 WORD32 ih264e_process_thread(void *pv_proc);
333 
334 #endif /* IH264E_PROCESS_H_ */
335