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