/****************************************************************************** * * 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_utils.h * * @brief * Contains declarations of miscellaneous utility functions used by the encoder * * @author * Harish * * @par List of Functions: * -ih264e_input_queue_update() * -ih264e_get_min_level() * -ih264e_get_lvl_idx() * -ih264e_get_dpb_size() * -ih264e_get_total_pic_buf_size() * -ih264e_get_pic_mv_bank_size() * -ih264e_pic_buf_mgr_add_bufs() * -ih264e_mv_buf_mgr_add_bufs() * -ih264e_init_quant_params() * -ih264e_init_air_map() * -ih264e_codec_init() * -ih264e_pic_init() * * @remarks * None * ******************************************************************************* */ #ifndef IH264E_UTILS_H_ #define IH264E_UTILS_H_ /** ******************************************************************************* * * @brief * Queues the current buffer, gets back a another buffer for encoding with corrent * picture type * * @par Description: * * @param[in] ps_codec * Pointer to codec descriptor * * @param[in] ps_ive_ip * Current input buffer to the encoder * * @param[out] ps_inp * Buffer to be encoded in the current pass * * @returns * Flag indicating if we have a pre-enc skip or not * * @remarks * ******************************************************************************* */ WORD32 ih264e_input_queue_update(codec_t *ps_codec, ive_video_encode_ip_t *ps_ive_ip, inp_buf_t *ps_enc_buff); /** ******************************************************************************* * * @brief * Used to get minimum level index for a given picture size * * @par Description: * Gets the minimum level index and then gets corresponding level. * Also used to ignore invalid levels like 2.3, 3.3 etc * * @param[in] wd * Width * * @param[in] ht * Height * * @returns Level index for a given level * * @remarks * ******************************************************************************* */ WORD32 ih264e_get_min_level(WORD32 wd, WORD32 ht); /** ******************************************************************************* * * @brief * Used to get level index for a given level * * @par Description: * Converts from level_idc (which is multiplied by 30) to an index that can be * used as a lookup. Also used to ignore invalid levels like 2.2 , 3.2 etc * * @param[in] level * Level of the stream * * @returns Level index for a given level * * @remarks * ******************************************************************************* */ WORD32 ih264e_get_lvl_idx(WORD32 level); /** ******************************************************************************* * * @brief returns maximum number of pictures allowed in dpb for a given level * * @par Description: * For given width, height and level, number of pictures allowed in decoder * picture buffer is computed as per Annex A.3.1 * * @param[in] level * level of the bit-stream * * @param[in] pic_size * width * height * * @returns Number of buffers in DPB * * @remarks * From annexure A.3.1 of H264 specification, * max_dec_frame_buffering <= MaxDpbSize, where MaxDpbSize is equal to * Min( 1024 * MaxDPB / ( PicWidthInMbs * FrameHeightInMbs * 384 ), 16 ) and * MaxDPB is given in Table A-1 in units of 1024 bytes. However the MaxDPB size * presented in the look up table gas_ih264_lvl_tbl is in units of 512 * bytes. Hence the expression is modified accordingly. * ******************************************************************************* */ WORD32 ih264e_get_dpb_size(WORD32 level, WORD32 pic_size); /** ******************************************************************************* * * @brief * Used to get reference picture buffer size for a given level and * and padding used * * @par Description: * Used to get reference picture buffer size for a given level and padding used * Each picture is padded on all four sides * * @param[in] pic_size * Number of luma samples (Width * Height) * * @param[in] level * Level * * @param[in] horz_pad * Total padding used in horizontal direction * * @param[in] vert_pad * Total padding used in vertical direction * * @returns Total picture buffer size * * @remarks * * ******************************************************************************* */ WORD32 ih264e_get_total_pic_buf_size(WORD32 pic_size, WORD32 level, WORD32 horz_pad, WORD32 vert_pad, WORD32 num_ref_frames, WORD32 num_reorder_frames); /** ******************************************************************************* * * @brief Returns MV bank buffer size for a given number of luma samples * * @par Description: * For given number of luma samples one MV bank size is computed. * Each MV bank includes pu_map and enc_pu_t for all the min PUs(4x4) in a picture * * @param[in] num_luma_samples * Max number of luma pixels in the frame * * @returns Total MV Bank size * * @remarks * * ******************************************************************************* */ WORD32 ih264e_get_pic_mv_bank_size(WORD32 num_luma_samples); /** ******************************************************************************* * * @brief * Function to initialize ps_pic_buf structs add pic buffers to * buffer manager in case of non-shared mode * * @par Description: * Function to initialize ps_pic_buf structs add pic buffers to * buffer manager in case of non-shared mode * To be called once per stream or for every reset * * @param[in] ps_codec * Pointer to codec context * * @returns error status * * @remarks * * ******************************************************************************* */ IH264E_ERROR_T ih264e_pic_buf_mgr_add_bufs(codec_t *ps_codec); /** ******************************************************************************* * * @brief Function to add buffers to MV Bank buffer manager * * @par Description: * Function to add buffers to MV Bank buffer manager. To be called once per * stream or for every reset * * @param[in] ps_codec * Pointer to codec context * * @returns error status * * @remarks * ******************************************************************************* */ IH264E_ERROR_T ih264e_mv_buf_mgr_add_bufs(codec_t *ps_codec); /** ******************************************************************************* * * @brief Function to initialize quant params structure * * @par Description: * The forward quantization modules depends on qp/6, qp mod 6, forward scale * matrix, forward threshold matrix, weight list. The inverse quantization * modules depends on qp/6, qp mod 6, inverse scale matrix, weight list. * These params are initialized in this function. * * @param[in] ps_proc * pointer to process context * * @param[in] qp * quantization parameter * * @returns none * * @remarks * ******************************************************************************* */ void ih264e_init_quant_params(process_ctxt_t *ps_proc, int qp); /** ******************************************************************************* * * @brief * Initialize AIR mb frame Map * * @par Description: * Initialize AIR mb frame map * MB frame map indicates which frame an Mb should be coded as intra according to AIR * * @param[in] ps_codec * Pointer to codec context * * @returns error_status * * @remarks * * ******************************************************************************* */ IH264E_ERROR_T ih264e_init_air_map(codec_t *ps_codec); /** ******************************************************************************* * * @brief * Codec level initializations * * @par Description: * Initializes the codec with parameters that needs to be set before encoding * first frame * * @param[in] ps_codec * Pointer to codec context * * @param[in] ps_inp_buf * Pointer to input buffer context * * @returns error_status * * @remarks * * ******************************************************************************* */ IH264E_ERROR_T ih264e_codec_init(codec_t *ps_codec); /** ******************************************************************************* * * @brief * Picture level initializations * * @par Description: * Before beginning to encode the frame, the current function initializes all * the ctxts (proc, entropy, me, ...) basing on the input configured params. * It locates space for storing recon in the encoder picture buffer set, fetches * reference frame from encoder picture buffer set. Calls RC pre-enc to get * qp and pic type for the current frame. Queues proc jobs so that * the other threads can begin encoding. In brief, this function sets up the * tone for the entire encoder. * * @param[in] ps_codec * Pointer to codec context * * @param[in] ps_inp_buf * Pointer to input buffer context * * @returns error_status * * @remarks * * ******************************************************************************* */ IH264E_ERROR_T ih264e_pic_init(codec_t *ps_codec, inp_buf_t *ps_inp_buf); #endif /* IH264E_UTILS_H_ */