Home | History | Annotate | Download | only in encoder
      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