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_rate_control.h 25 * 26 * @brief 27 * This file contains function declarations of api functions for h264 rate 28 * control 29 * 30 * @author 31 * ittiam 32 * 33 * @remarks 34 * None 35 * 36 ******************************************************************************* 37 */ 38 39 #ifndef IH264E_RATE_CONTROL_H_ 40 #define IH264E_RATE_CONTROL_H_ 41 42 /*****************************************************************************/ 43 /* Function Declarations */ 44 /*****************************************************************************/ 45 46 /** 47 ******************************************************************************* 48 * 49 * @brief 50 * This function initializes rate control context and variables 51 * 52 * @par Description 53 * This function initializes rate control type, source and target frame rate, 54 * average and peak bitrate, intra-inter frame interval and initial 55 * quantization parameter 56 * 57 * @param[in] pv_rc_api 58 * Handle to rate control api 59 * 60 * @param[in] pv_frame_time 61 * Handle to frame time context 62 * 63 * @param[in] pv_time_stamp 64 * Handle to time stamp context 65 * 66 * @param[in] pv_pd_frm_rate 67 * Handle to pull down frame time context 68 * 69 * @param[in] u4_max_frm_rate 70 * Maximum frame rate 71 * 72 * @param[in] u4_src_frm_rate 73 * Source frame rate 74 * 75 * @param[in] u4_tgt_frm_rate 76 * Target frame rate 77 * 78 * @param[in] e_rate_control_type 79 * Rate control type 80 * 81 * @param[in] u4_avg_bit_rate 82 * Average bit rate 83 * 84 * @param[in] u4_peak_bit_rate 85 * Peak bit rate 86 * 87 * @param[in] u4_max_delay 88 * Maximum delay between frames 89 * 90 * @param[in] u4_intra_frame_interval 91 * Intra frame interval 92 * 93 * @param[in] i4_inter_frm_int 94 * Inter frame interval 95 * 96 * @param[in] pu1_init_qp 97 * Initial qp 98 * 99 * @param[in] i4_max_inter_frm_int 100 * Maximum inter frame interval 101 * 102 * @param[in] pu1_min_max_qp 103 * Array of min/max qp 104 * 105 * @param[in] u1_profile_level 106 * Encoder profile level 107 * 108 * @returns none 109 * 110 * @remarks 111 * 112 ******************************************************************************* 113 */ 114 void ih264e_rc_init(void *pv_rc_api, 115 void *pv_frame_time, 116 void *pv_time_stamp, 117 void *pv_pd_frm_rate, 118 UWORD32 u4_max_frm_rate, 119 UWORD32 u4_src_frm_rate, 120 UWORD32 u4_tgt_frm_rate, 121 rc_type_e e_rate_control_type, 122 UWORD32 u4_avg_bit_rate, 123 UWORD32 u4_peak_bit_rate, 124 UWORD32 u4_max_delay, 125 UWORD32 u4_intra_frame_interval, 126 WORD32 i4_inter_frm_int, 127 UWORD8 *pu1_init_qp, 128 WORD32 i4_max_inter_frm_int, 129 UWORD8 *pu1_min_max_qp, 130 UWORD8 u1_profile_level); 131 132 /** 133 ******************************************************************************* 134 * 135 * @brief Function to get picture details 136 * 137 * @par Description 138 * This function returns the Picture type(I/P/B) 139 * 140 * @param[in] pv_rc_api 141 * Handle to Rate control api 142 * 143 * @returns 144 * Picture type 145 * 146 * @remarks none 147 * 148 ******************************************************************************* 149 */ 150 picture_type_e ih264e_rc_get_picture_details(void *pv_rc_api, 151 WORD32 *pi4_pic_id, 152 WORD32 *pi4_pic_disp_order_no); 153 154 155 /** 156 ******************************************************************************* 157 * 158 * @brief Function to set frame rate inside RC. 159 * 160 * @par Description 161 * This function is called before encoding the current frame and gets the qp 162 * for the current frame from rate control module 163 * 164 * @param[in] ps_rate_control_api 165 * Handle to rate control api 166 * 167 * @param[in] ps_pd_frm_rate 168 * Handle to pull down frm rate context 169 * 170 * @param[in] ps_time_stamp 171 * Handle to time stamp context 172 * 173 * @param[in] ps_frame_time 174 * Handle to frame time context 175 * 176 * @returns 177 * Skip or encode the current frame 178 * 179 * @remarks 180 * 181 ******************************************************************************* 182 */ 183 WORD32 ih264e_update_rc_framerates(void *ps_rate_control_api, 184 void *ps_pd_frm_rate, 185 void *ps_time_stamp, 186 void *ps_frame_time 187 ); 188 189 /** 190 ******************************************************************************* 191 * 192 * @brief Function to update mb info for rate control context 193 * 194 * @par Description 195 * After encoding a mb, information such as mb type, qp used, mb distortion 196 * resulted in encoding the block and so on needs to be preserved for modelling 197 * RC. This is preserved via this function call. 198 * 199 * @param[in] ps_frame_info 200 * Handle Frame info context 201 * 202 * @param[in] ps_proc 203 * Process context 204 * 205 * @returns 206 * 207 * @remarks 208 * 209 ******************************************************************************* 210 */ 211 void ih264e_update_rc_mb_info(frame_info_t *ps_frame_info, void *pv_proc); 212 213 /** 214 ******************************************************************************* 215 * 216 * @brief Function to get rate control buffer status 217 * 218 * @par Description 219 * This function is used to get buffer status(underflow/overflow) by rate 220 * control module 221 * 222 * @param[in] pv_rc_api 223 * Handle to rate control api context 224 * 225 * @param[in] i4_total_frame_bits 226 * Total frame bits 227 * 228 * @param[in] u1_pic_type 229 * Picture type 230 * 231 * @param[in] pi4_num_bits_to_prevent_vbv_underflow 232 * Number of bits to prevent underflow 233 * 234 * @param[out] pu1_is_enc_buf_overflow 235 * Buffer overflow indication flag 236 * 237 * @param[out] pu1_is_enc_buf_underflow 238 * Buffer underflow indication flag 239 * 240 * @returns 241 * 242 * @remarks 243 * 244 ******************************************************************************* 245 */ 246 void ih264e_rc_get_buffer_status(void *pv_rc_api, 247 WORD32 i4_total_frame_bits, 248 picture_type_e e_pic_type, 249 WORD32 *pi4_num_bits_to_prevent_vbv_underflow, 250 UWORD8 *pu1_is_enc_buf_overflow, 251 UWORD8 *pu1_is_enc_buf_underflow); 252 253 /** 254 ******************************************************************************* 255 * 256 * @brief Function to update rate control module after encoding 257 * 258 * @par Description 259 * This function is used to update the rate control module after the current 260 * frame encoding is done with details such as bits consumed, SAD for I/P/B, 261 * intra cost ,mb type and other 262 * 263 * @param[in] ps_rate_control_api 264 * Handle to rate control api context 265 * 266 * @param[in] ps_frame_info 267 * Handle to frame info context 268 * 269 * @param[in] ps_pd_frm_rate 270 * Handle to pull down frame rate context 271 * 272 * @param[in] ps_time_stamp 273 * Handle to time stamp context 274 * 275 * @param[in] ps_frame_time 276 * Handle to frame time context 277 * 278 * @param[in] i4_total_mb_in_frame 279 * Total mb in frame 280 * 281 * @param[in] pe_vop_coding_type 282 * Picture coding type 283 * 284 * @param[in] i4_is_first_frame 285 * Is first frame 286 * 287 * @param[in] pi4_is_post_encode_skip 288 * Post encoding skip flag 289 * 290 * @param[in] u1_frame_qp 291 * Frame qp 292 * 293 * @param[in] pi4_num_intra_in_prev_frame 294 * Number of intra mbs in previous frame 295 * 296 * @param[in] pi4_avg_activity 297 * Average activity 298 * 299 * @returns 300 * 301 * @remarks 302 * 303 ******************************************************************************* 304 */ 305 WORD32 ih264e_rc_post_enc(void *ps_rate_control_api, 306 frame_info_t *ps_frame_info, 307 void *ps_pd_frm_rate, 308 void *ps_time_stamp, 309 void *ps_frame_time, 310 WORD32 i4_total_mb_in_frame, 311 picture_type_e *pe_vop_coding_type, 312 WORD32 i4_is_first_frame, 313 WORD32 *pi4_is_post_encode_skip, 314 UWORD8 u1_frame_qp, 315 WORD32 *pi4_num_intra_in_prev_frame, 316 WORD32 *pi4_avg_activity); 317 318 /** 319 ******************************************************************************* 320 * 321 * @brief Function to update bits consumed info to rate control context 322 * 323 * @par Description 324 * Function to update bits consume info to rate control context 325 * 326 * @param[in] ps_frame_info 327 * Frame info context 328 * 329 * @param[in] ps_entropy 330 * Entropy context 331 * 332 * @returns 333 * total bits consumed by the frame 334 * 335 * @remarks 336 * 337 ******************************************************************************* 338 */ 339 void ih264e_update_rc_bits_info(frame_info_t *ps_frame_info, void *pv_entropy); 340 341 #endif /* IH264E_RATE_CONTROL_H */ 342 343