blob: 9cfdac89d6d785960f9715503e541477fea98766 [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
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*/
62IH264E_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*/
87IH264E_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*/
112IH264E_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*/
133IH264E_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*/
165WORD32 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*/
191IH264E_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*/
224IH264E_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*/
250IH264E_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*/
281WORD32 ih264e_process(process_ctxt_t *ps_proc);
282
283/**
284*******************************************************************************
285*
286* @brief
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530287* 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*/
311WORD32 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*/
332WORD32 ih264e_process_thread(void *pv_proc);
333
334#endif /* IH264E_PROCESS_H_ */