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_utils.h 25 * 26 * @brief 27 * Contains declarations of miscellaneous utility functions used by the encoder 28 * 29 * @author 30 * Harish 31 * 32 * @par List of Functions: 33 * -ih264e_input_queue_update() 34 * -ih264e_get_min_level() 35 * -ih264e_get_lvl_idx() 36 * -ih264e_get_dpb_size() 37 * -ih264e_get_total_pic_buf_size() 38 * -ih264e_get_pic_mv_bank_size() 39 * -ih264e_pic_buf_mgr_add_bufs() 40 * -ih264e_mv_buf_mgr_add_bufs() 41 * -ih264e_init_quant_params() 42 * -ih264e_init_air_map() 43 * -ih264e_codec_init() 44 * -ih264e_pic_init() 45 * 46 * @remarks 47 * None 48 * 49 ******************************************************************************* 50 */ 51 52 #ifndef IH264E_UTILS_H_ 53 #define IH264E_UTILS_H_ 54 55 /** 56 ******************************************************************************* 57 * 58 * @brief 59 * Queues the current buffer, gets back a another buffer for encoding with corrent 60 * picture type 61 * 62 * @par Description: 63 * 64 * @param[in] ps_codec 65 * Pointer to codec descriptor 66 * 67 * @param[in] ps_ive_ip 68 * Current input buffer to the encoder 69 * 70 * @param[out] ps_inp 71 * Buffer to be encoded in the current pass 72 * 73 * @returns 74 * Flag indicating if we have a pre-enc skip or not 75 * 76 * @remarks 77 * 78 ******************************************************************************* 79 */ 80 WORD32 ih264e_input_queue_update(codec_t *ps_codec, 81 ive_video_encode_ip_t *ps_ive_ip, 82 inp_buf_t *ps_enc_buff); 83 84 /** 85 ******************************************************************************* 86 * 87 * @brief 88 * Used to get minimum level index for a given picture size 89 * 90 * @par Description: 91 * Gets the minimum level index and then gets corresponding level. 92 * Also used to ignore invalid levels like 2.3, 3.3 etc 93 * 94 * @param[in] wd 95 * Width 96 * 97 * @param[in] ht 98 * Height 99 * 100 * @returns Level index for a given level 101 * 102 * @remarks 103 * 104 ******************************************************************************* 105 */ 106 WORD32 ih264e_get_min_level(WORD32 wd, WORD32 ht); 107 108 /** 109 ******************************************************************************* 110 * 111 * @brief 112 * Used to get level index for a given level 113 * 114 * @par Description: 115 * Converts from level_idc (which is multiplied by 30) to an index that can be 116 * used as a lookup. Also used to ignore invalid levels like 2.2 , 3.2 etc 117 * 118 * @param[in] level 119 * Level of the stream 120 * 121 * @returns Level index for a given level 122 * 123 * @remarks 124 * 125 ******************************************************************************* 126 */ 127 WORD32 ih264e_get_lvl_idx(WORD32 level); 128 129 /** 130 ******************************************************************************* 131 * 132 * @brief returns maximum number of pictures allowed in dpb for a given level 133 * 134 * @par Description: 135 * For given width, height and level, number of pictures allowed in decoder 136 * picture buffer is computed as per Annex A.3.1 137 * 138 * @param[in] level 139 * level of the bit-stream 140 * 141 * @param[in] pic_size 142 * width * height 143 * 144 * @returns Number of buffers in DPB 145 * 146 * @remarks 147 * From annexure A.3.1 of H264 specification, 148 * max_dec_frame_buffering <= MaxDpbSize, where MaxDpbSize is equal to 149 * Min( 1024 * MaxDPB / ( PicWidthInMbs * FrameHeightInMbs * 384 ), 16 ) and 150 * MaxDPB is given in Table A-1 in units of 1024 bytes. However the MaxDPB size 151 * presented in the look up table gas_ih264_lvl_tbl is in units of 512 152 * bytes. Hence the expression is modified accordingly. 153 * 154 ******************************************************************************* 155 */ 156 WORD32 ih264e_get_dpb_size(WORD32 level, WORD32 pic_size); 157 158 /** 159 ******************************************************************************* 160 * 161 * @brief 162 * Used to get reference picture buffer size for a given level and 163 * and padding used 164 * 165 * @par Description: 166 * Used to get reference picture buffer size for a given level and padding used 167 * Each picture is padded on all four sides 168 * 169 * @param[in] pic_size 170 * Number of luma samples (Width * Height) 171 * 172 * @param[in] level 173 * Level 174 * 175 * @param[in] horz_pad 176 * Total padding used in horizontal direction 177 * 178 * @param[in] vert_pad 179 * Total padding used in vertical direction 180 * 181 * @returns Total picture buffer size 182 * 183 * @remarks 184 * 185 * 186 ******************************************************************************* 187 */ 188 WORD32 ih264e_get_total_pic_buf_size(WORD32 pic_size, WORD32 level, 189 WORD32 horz_pad, WORD32 vert_pad, 190 WORD32 num_ref_frames, 191 WORD32 num_reorder_frames); 192 193 /** 194 ******************************************************************************* 195 * 196 * @brief Returns MV bank buffer size for a given number of luma samples 197 * 198 * @par Description: 199 * For given number of luma samples one MV bank size is computed. 200 * Each MV bank includes pu_map and enc_pu_t for all the min PUs(4x4) in a picture 201 * 202 * @param[in] num_luma_samples 203 * Max number of luma pixels in the frame 204 * 205 * @returns Total MV Bank size 206 * 207 * @remarks 208 * 209 * 210 ******************************************************************************* 211 */ 212 WORD32 ih264e_get_pic_mv_bank_size(WORD32 num_luma_samples); 213 214 /** 215 ******************************************************************************* 216 * 217 * @brief 218 * Function to initialize ps_pic_buf structs add pic buffers to 219 * buffer manager in case of non-shared mode 220 * 221 * @par Description: 222 * Function to initialize ps_pic_buf structs add pic buffers to 223 * buffer manager in case of non-shared mode 224 * To be called once per stream or for every reset 225 * 226 * @param[in] ps_codec 227 * Pointer to codec context 228 * 229 * @returns error status 230 * 231 * @remarks 232 * 233 * 234 ******************************************************************************* 235 */ 236 IH264E_ERROR_T ih264e_pic_buf_mgr_add_bufs(codec_t *ps_codec); 237 238 /** 239 ******************************************************************************* 240 * 241 * @brief Function to add buffers to MV Bank buffer manager 242 * 243 * @par Description: 244 * Function to add buffers to MV Bank buffer manager. To be called once per 245 * stream or for every reset 246 * 247 * @param[in] ps_codec 248 * Pointer to codec context 249 * 250 * @returns error status 251 * 252 * @remarks 253 * 254 ******************************************************************************* 255 */ 256 IH264E_ERROR_T ih264e_mv_buf_mgr_add_bufs(codec_t *ps_codec); 257 258 /** 259 ******************************************************************************* 260 * 261 * @brief Function to initialize quant params structure 262 * 263 * @par Description: 264 * The forward quantization modules depends on qp/6, qp mod 6, forward scale 265 * matrix, forward threshold matrix, weight list. The inverse quantization 266 * modules depends on qp/6, qp mod 6, inverse scale matrix, weight list. 267 * These params are initialized in this function. 268 * 269 * @param[in] ps_proc 270 * pointer to process context 271 * 272 * @param[in] qp 273 * quantization parameter 274 * 275 * @returns none 276 * 277 * @remarks 278 * 279 ******************************************************************************* 280 */ 281 void ih264e_init_quant_params(process_ctxt_t *ps_proc, int qp); 282 283 /** 284 ******************************************************************************* 285 * 286 * @brief 287 * Initialize AIR mb frame Map 288 * 289 * @par Description: 290 * Initialize AIR mb frame map 291 * MB frame map indicates which frame an Mb should be coded as intra according to AIR 292 * 293 * @param[in] ps_codec 294 * Pointer to codec context 295 * 296 * @returns error_status 297 * 298 * @remarks 299 * 300 * 301 ******************************************************************************* 302 */ 303 IH264E_ERROR_T ih264e_init_air_map(codec_t *ps_codec); 304 305 /** 306 ******************************************************************************* 307 * 308 * @brief 309 * Codec level initializations 310 * 311 * @par Description: 312 * Initializes the codec with parameters that needs to be set before encoding 313 * first frame 314 * 315 * @param[in] ps_codec 316 * Pointer to codec context 317 * 318 * @param[in] ps_inp_buf 319 * Pointer to input buffer context 320 * 321 * @returns error_status 322 * 323 * @remarks 324 * 325 * 326 ******************************************************************************* 327 */ 328 IH264E_ERROR_T ih264e_codec_init(codec_t *ps_codec); 329 330 /** 331 ******************************************************************************* 332 * 333 * @brief 334 * Picture level initializations 335 * 336 * @par Description: 337 * Before beginning to encode the frame, the current function initializes all 338 * the ctxts (proc, entropy, me, ...) basing on the input configured params. 339 * It locates space for storing recon in the encoder picture buffer set, fetches 340 * reference frame from encoder picture buffer set. Calls RC pre-enc to get 341 * qp and pic type for the current frame. Queues proc jobs so that 342 * the other threads can begin encoding. In brief, this function sets up the 343 * tone for the entire encoder. 344 * 345 * @param[in] ps_codec 346 * Pointer to codec context 347 * 348 * @param[in] ps_inp_buf 349 * Pointer to input buffer context 350 * 351 * @returns error_status 352 * 353 * @remarks 354 * 355 * 356 ******************************************************************************* 357 */ 358 IH264E_ERROR_T ih264e_pic_init(codec_t *ps_codec, inp_buf_t *ps_inp_buf); 359 360 #endif /* IH264E_UTILS_H_ */ 361