| /****************************************************************************** |
| * |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| |
| /** |
| ******************************************************************************* |
| * @file |
| * ih264e_process.h |
| * |
| * @brief |
| * Contains functions for codec thread |
| * |
| * @author |
| * ittiam |
| * |
| * @remarks |
| * None |
| * |
| ******************************************************************************* |
| */ |
| |
| #ifndef IH264E_PROCESS_H_ |
| #define IH264E_PROCESS_H_ |
| |
| /*****************************************************************************/ |
| /* Function Declarations */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * |
| * @brief This function generates sps, pps set on request |
| * |
| * @par Description |
| * When the encoder is set in header generation mode, the following function |
| * is called. This generates sps and pps headers and returns the control back |
| * to caller. |
| * |
| * @param[in] ps_codec |
| * pointer to codec context |
| * |
| * @return success or failure error code |
| * |
| ****************************************************************************** |
| */ |
| IH264E_ERROR_T ih264e_generate_sps_pps |
| ( |
| codec_t *ps_codec |
| ); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief initialize entropy context. |
| * |
| * @par Description: |
| * Before invoking the call to perform to entropy coding the entropy context |
| * associated with the job needs to be initialized. This involves the start |
| * mb address, end mb address, slice index and the pointer to location at |
| * which the mb residue info and mb header info are packed. |
| * |
| * @param[in] ps_proc |
| * Pointer to the current process context |
| * |
| * @returns error status |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| IH264E_ERROR_T ih264e_init_entropy_ctxt(process_ctxt_t *ps_proc); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief entry point for entropy coding |
| * |
| * @par Description |
| * This function calls lower level functions to perform entropy coding for a |
| * group (n rows) of mb's. After encoding 1 row of mb's, the function takes |
| * back the control, updates the ctxt and calls lower level functions again. |
| * This process is repeated till all the rows or group of mb's (which ever is |
| * minimum) are coded |
| * |
| * @param[in] ps_proc |
| * process context |
| * |
| * @returns error status |
| * |
| * @remarks |
| * NOTE : It is assumed that this routine is invoked at the start of a slice, |
| * so the slice header is generated by default. |
| * |
| ******************************************************************************* |
| */ |
| IH264E_ERROR_T ih264e_entropy(process_ctxt_t *ps_proc); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Packs header information of a mb in to a buffer |
| * |
| * @par Description: |
| * After the deciding the mode info of a macroblock, the syntax elements |
| * associated with the mb are packed and stored. The entropy thread unpacks |
| * this buffer and generates the end bit stream. |
| * |
| * @param[in] ps_proc |
| * Pointer to the current process context |
| * |
| * @returns error status |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| IH264E_ERROR_T ih264e_pack_header_data |
| ( |
| process_ctxt_t *ps_proc |
| ); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief update process context after encoding an mb. This involves preserving |
| * the current mb information for later use, initialize the proc ctxt elements to |
| * encode next mb. |
| * |
| * @par Description: |
| * This function performs house keeping tasks after encoding an mb. |
| * After encoding an mb, various elements of the process context needs to be |
| * updated to encode the next mb. For instance, the source, recon and reference |
| * pointers, mb indices have to be adjusted to the next mb. The slice index of |
| * the current mb needs to be updated. If mb qp modulation is enabled, then if |
| * the qp changes the quant param structure needs to be updated. Also to encoding |
| * the next mb, the current mb info is used as part of mode prediction or mv |
| * prediction. Hence the current mb info has to preserved at top/top left/left |
| * locations. |
| * |
| * @param[in] ps_proc |
| * Pointer to the current process context |
| * |
| * @returns none |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_update_proc_ctxt |
| ( |
| process_ctxt_t *ps_proc |
| ); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief initialize process context. |
| * |
| * @par Description: |
| * Before dispatching the current job to process thread, the process context |
| * associated with the job is initialized. Usually every job aims to encode one |
| * row of mb's. Basing on the row indices provided by the job, the process |
| * context's buffer ptrs, slice indices and other elements that are necessary |
| * during core-coding are initialized. |
| * |
| * @param[in] ps_proc |
| * Pointer to the current process context |
| * |
| * @returns error status |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function performs luma & chroma padding |
| * |
| * @par Description: |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @param[in] pu1_curr_pic_luma |
| * Pointer to luma buffer |
| * |
| * @param[in] pu1_curr_pic_chroma |
| * Pointer to chroma buffer |
| * |
| * @param[in] i4_mb_x |
| * mb index x |
| * |
| * @param[in] i4_mb_y |
| * mb index y |
| * |
| * @param[in] i4_pad_ht |
| * number of rows to be padded |
| * |
| * @returns error status |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| IH264E_ERROR_T ih264e_pad_recon_buffer |
| ( |
| process_ctxt_t *ps_proc, |
| UWORD8 *pu1_curr_pic_luma, |
| UWORD8 *pu1_curr_pic_chroma, |
| WORD32 i4_mb_x, |
| WORD32 i4_mb_y, |
| WORD32 i4_pad_ht |
| ); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function performs luma half pel planes generation |
| * |
| * @par Description: |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns error status |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| IH264E_ERROR_T ih264e_halfpel_generation |
| ( |
| process_ctxt_t *ps_proc, |
| UWORD8 *pu1_curr_pic_luma, |
| WORD32 i4_mb_x, |
| WORD32 i4_mb_y |
| ); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief This function performs luma & chroma core coding for a set of mb's. |
| * |
| * @par Description: |
| * The mb to be coded is taken and is evaluated over a predefined set of modes |
| * (intra (i16, i4, i8)/inter (mv, skip)) for best cost. The mode with least cost |
| * is selected and using intra/inter prediction filters, prediction is carried out. |
| * The deviation between src and pred signal constitutes error signal. This error |
| * signal is transformed (hierarchical transform if necessary) and quantized. The |
| * quantized residue is packed in to entropy buffer for entropy coding. This is |
| * repeated for all the mb's enlisted under the job. |
| * |
| * @param[in] ps_proc |
| * Process context corresponding to the job |
| * |
| * @returns error status |
| * |
| * @remarks none |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_process(process_ctxt_t *ps_proc); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * Function to update rc context after encoding |
| * |
| * @par Description |
| * This function updates the rate control context after the frame is encoded. |
| * Number of bits consumed by the current frame, frame distortion, frame cost, |
| * number of intra/inter mb's, ... are passed on to rate control context for |
| * updating the rc model. |
| * |
| * @param[in] ps_codec |
| * Handle to codec context |
| * |
| * @param[in] ctxt_sel |
| * frame context selector |
| * |
| * @param[in] pic_cnt |
| * pic count |
| * |
| * @returns i4_stuffing_byte |
| * number of stuffing bytes (if necessary) |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_update_rc_post_enc(codec_t *ps_codec, WORD32 ctxt_sel, WORD32 pic_cnt); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * entry point of a spawned encoder thread |
| * |
| * @par Description: |
| * The encoder thread dequeues a proc/entropy job from the encoder queue and |
| * calls necessary routines. |
| * |
| * @param[in] pv_proc |
| * Process context corresponding to the thread |
| * |
| * @returns error status |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_process_thread(void *pv_proc); |
| |
| #endif /* IH264E_PROCESS_H_ */ |