/****************************************************************************** * * 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_defs.h * * @brief * Definitions used in the encoder * * @author * ittiam * * @remarks * None * ******************************************************************************* */ #ifndef IH264E_DEFS_H_ #define IH264E_DEFS_H_ #define PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u4_nnz, u4_sig_coeff_map, pi2_res_block) \ { \ ps_mb_coeff_data = pv_mb_coeff_data; \ u4_nnz = ps_mb_coeff_data->i4_sig_map_nnz & 0xff; \ if (u4_nnz) \ { \ u4_sig_coeff_map = ps_mb_coeff_data->i4_sig_map_nnz >> 16; \ pi2_res_block = ps_mb_coeff_data->ai2_residue; \ pv_mb_coeff_data = ps_mb_coeff_data->ai2_residue + ALIGN2(u4_nnz); \ } \ else \ { \ pv_mb_coeff_data = ps_mb_coeff_data->ai2_residue; \ } \ } /*****************************************************************************/ /* Width and height restrictions */ /*****************************************************************************/ /** * Minimum width supported by codec */ #define MIN_WD 16 /** * Maximum width supported by codec */ /* changed by haining@ to support Nexus 6P screen size, was previously 1920 */ #define MAX_WD 2560 /** * Minimum height supported by codec */ #define MIN_HT 16 /** * Maximum height supported by codec */ /* changed by haining@ to support Nexus 6P screen size, was previously 1920 */ #define MAX_HT 2560 /*****************************************************************************/ /* Padding sizes */ /*****************************************************************************/ /** * Padding used for top of the frame */ #define PAD_TOP 32 /** * Padding used for bottom of the frame */ #define PAD_BOT 32 /** * Padding used at left of the frame */ #define PAD_LEFT 32 /** * Padding used at right of the frame */ #define PAD_RIGHT 32 /** * Padding for width */ #define PAD_WD (PAD_LEFT + PAD_RIGHT) /** * Padding for height */ #define PAD_HT (PAD_TOP + PAD_BOT) /* * buffer width and height for half pel buffers */ #define HP_BUFF_WD 24 #define HP_BUFF_HT 18 /*****************************************************************************/ /* Number of frame restrictions */ /*****************************************************************************/ /** * Maximum number of reference pictures */ #define MAX_REF_PIC_CNT 2 /** * Minimum number of reference pictures */ #define MIN_REF_PIC_CNT 1 /** * Maximum number of B pictures between two I/P pictures */ #define MAX_NUM_BFRAMES 10 /** * Maximum number of reference buffers in DPB manager */ #define MAX_REF_CNT 32 /*****************************************************************************/ /* Minimum size of inter prediction unit supported by encoder */ /*****************************************************************************/ #define ENC_MIN_PU_SIZE 16 /*****************************************************************************/ /* Num cores releated defs */ /*****************************************************************************/ /** * Maximum number of cores */ #define MAX_NUM_CORES 8 /** * Maximum number of threads for pixel processing */ #define MAX_PROCESS_THREADS MAX_NUM_CORES /** * Maximum process context sets * Used to stagger encoding of MAX_CTXT_SETS in parallel */ #define MAX_CTXT_SETS 1 /** * Maximum number of contexts * Kept as twice the number of threads, to make it easier to initialize the contexts * from master thread */ #define MAX_PROCESS_CTXT MAX_NUM_CORES * MAX_CTXT_SETS /*****************************************************************************/ /* Profile and level restrictions */ /*****************************************************************************/ /** * Max level supported by the codec */ #define MAX_LEVEL IH264_LEVEL_51 /** * Min level supported by the codec */ #define MIN_LEVEL IH264_LEVEL_10 /** * Maximum number of slice headers that are held in memory simultaneously * For single core implementation only 1 slice header is enough. * But for multi-core parsing thread needs to ensure that slice headers are * stored till the last CB in a slice is decoded. * Parsing thread has to wait till last CB of a slice is consumed before reusing * overwriting the slice header * MAX_SLICE_HDR_CNT is assumed to be a power of 2 */ #define LOG2_MAX_SLICE_HDR_CNT 8 #define MAX_SLICE_HDR_CNT (1 << LOG2_MAX_SLICE_HDR_CNT) /* Generic declarations */ #define DEFAULT_MAX_LEVEL 40 #define DEFAULT_RECON_ENABLE 0 #define DEFAULT_RC IVE_RC_STORAGE #define DEFAULT_MAX_FRAMERATE 120000 #define DEFAULT_MAX_BITRATE 20000000 #define DEFAULT_MAX_NUM_BFRAMES 0 #define DEFAULT_MAX_SRCH_RANGE_X 256 #define DEFAULT_MAX_SRCH_RANGE_Y 256 #define DEFAULT_SLICE_PARAM 256 #define DEFAULT_SRC_FRAME_RATE 30000 #define DEFAULT_TGT_FRAME_RATE 30000 #define DEFAULT_BITRATE 6000000 #define DEFAULT_QP_MIN 10 #define DEFAULT_QP_MAX 51 #define DEFAULT_I_QP 25 #define DEFAULT_P_QP 28 #define DEFAULT_B_QP 28 #define DEFAULT_AIR_MODE IVE_AIR_MODE_NONE #define DEFAULT_AIR_REFRESH_PERIOD 30 #define DEFAULT_VBV_DELAY 1000 #define DEFAULT_VBV_SIZE 16800000 /* level 3.1 */ #define DEFAULT_NUM_CORES 1 #define DEFAULT_ME_SPEED_PRESET 100 #define DEFAULT_HPEL 1 #define DEFAULT_QPEL 1 #define DEFAULT_I4 1 #define DEFAULT_I8 0 #define DEFAULT_I16 1 #define DEFAULT_ENABLE_FAST_SAD 0 #define DEFAULT_ENABLE_SATQD 1 #define DEFAULT_MIN_SAD_ENABLE 0 #define DEFAULT_MIN_SAD_DISABLE -1 #define DEFAULT_SRCH_RNG_X 64 #define DEFAULT_SRCH_RNG_Y 48 #define DEFAULT_I_INTERVAL 30 #define DEFAULT_IDR_INTERVAL 1000 #define DEFAULT_B_FRAMES 0 #define DEFAULT_DISABLE_DEBLK_LEVEL 0 #define DEFAULT_PROFILE IV_PROFILE_BASE #define DEFAULT_MIN_INTRA_FRAME_RATE 1 #define DEFAULT_MAX_INTRA_FRAME_RATE 2147483647 #define DEFAULT_MIN_BUFFER_DELAY 30 #define DEFAULT_MAX_BUFFER_DELAY 20000 #define DEFAULT_STRIDE 0 #define DEFAULT_ENC_SPEED_PRESET IVE_USER_DEFINED #define DEFAULT_PRE_ENC_ME 0 #define DEFAULT_PRE_ENC_IPE 0 #define DEFAULT_ENTROPY_CODING_MODE 0 /** Maximum number of entries in input buffer list */ #define MAX_INP_BUF_LIST_ENTRIES 32 /** Maximum number of entries in output buffer list */ #define MAX_OUT_BUF_LIST_ENTRIES 32 /** Maximum number of entries in recon buffer list used within the encoder */ #define MAX_REC_LIST_ENTRIES 16 /** Number of buffers created to hold half-pel planes for every reference buffer */ #define HPEL_PLANES_CNT 1 /** Number of buffers Needed for SUBPEL and BIPRED computation */ #define SUBPEL_BUFF_CNT 4 /** ***************************************************************************** * Macro to compute total size required to hold on set of scaling matrices ***************************************************************************** */ #define SCALING_MAT_SIZE(m_scaling_mat_size) \ { \ m_scaling_mat_size = 6 * TRANS_SIZE_4 * TRANS_SIZE_4; \ m_scaling_mat_size += 6 * TRANS_SIZE_8 * TRANS_SIZE_8; \ m_scaling_mat_size += 6 * TRANS_SIZE_16 * TRANS_SIZE_16; \ m_scaling_mat_size += 2 * TRANS_SIZE_32 * TRANS_SIZE_32; \ } /** ****************************************************************************** * @brief Macros to get raster scan position of a block[8x8] / sub block[4x4] ****************************************************************************** */ #define GET_BLK_RASTER_POS_X(x) ((x & 0x01)) #define GET_BLK_RASTER_POS_Y(y) ((y >> 1)) #define GET_SUB_BLK_RASTER_POS_X(x) ((x & 0x01)) #define GET_SUB_BLK_RASTER_POS_Y(y) ((y >> 1)) #define NUM_RC_MEMTABS 17 /** *************************************************************************** * Enum to hold various mem records being request **************************************************************************** */ enum { /** * Codec Object at API level */ MEM_REC_IV_OBJ, /** * Codec context */ MEM_REC_CODEC, /** * Cabac context */ MEM_REC_CABAC, /** * Cabac context_mb_info */ MEM_REC_CABAC_MB_INFO, /** * entropy context */ MEM_REC_ENTROPY, /** * Buffer to hold coeff data */ MEM_REC_MB_COEFF_DATA, /** * Buffer to hold coeff data */ MEM_REC_MB_HEADER_DATA, /** * Motion vector bank */ MEM_REC_MVBANK, /** * Motion vector bits */ MEM_REC_MVBITS, /** * Holds mem records passed to the codec. */ MEM_REC_BACKUP, /** * Holds SPS */ MEM_REC_SPS, /** * Holds PPS */ MEM_REC_PPS, /** * Holds Slice Headers */ MEM_REC_SLICE_HDR, /** * Contains map indicating slice index per MB basis */ MEM_REC_SLICE_MAP, /** * Holds thread handles */ MEM_REC_THREAD_HANDLE, /** * Holds control call mutex */ MEM_REC_CTL_MUTEX, /** * Holds entropy call mutex */ MEM_REC_ENTROPY_MUTEX, /** * Holds memory for Process JOB Queue */ MEM_REC_PROC_JOBQ, /** * Holds memory for Entropy JOB Queue */ MEM_REC_ENTROPY_JOBQ, /** * Contains status map indicating processing status per MB basis */ MEM_REC_PROC_MAP, /** * Contains status map indicating deblocking status per MB basis */ MEM_REC_DBLK_MAP, /* * Contains AIR map and mask */ MEM_REC_AIR_MAP, /** * Contains status map indicating ME status per MB basis */ MEM_REC_ME_MAP, /** * Holds dpb manager context */ MEM_REC_DPB_MGR, /** * Holds intermediate buffers needed during processing stage * Memory for process contexts is allocated in this memtab */ MEM_REC_PROC_SCRATCH, /** * Holds buffers for vert_bs, horz_bs and QP (all frame level) */ MEM_REC_QUANT_PARAM, /** * Holds top row syntax information */ MEM_REC_TOP_ROW_SYN_INFO, /** * Holds buffers for vert_bs, horz_bs and QP (all frame level) */ MEM_REC_BS_QP, /** * Holds input buffer manager context */ MEM_REC_INP_PIC, /** * Holds output buffer manager context */ MEM_REC_OUT, /** * Holds picture buffer manager context and array of pic_buf_ts * Also holds reference picture buffers in non-shared mode */ MEM_REC_REF_PIC, /* * Mem record for color space conversion */ MEM_REC_CSC, /** * NMB info struct */ MEM_REC_MB_INFO_NMB, /** * Rate control of memory records. */ MEM_REC_RC, /** * Place holder to compute number of memory records. */ MEM_REC_CNT = MEM_REC_RC + NUM_RC_MEMTABS, /* * Do not add anything below */ }; #define DISABLE_DEBLOCK_INTERVAL 8 /** **************************************************************************** * Disable deblock levels * Level 0 enables deblocking completely and level 4 disables completely * Other levels are intermediate values to control deblocking level **************************************************************************** */ enum { /** * Enable deblocking completely */ DISABLE_DEBLK_LEVEL_0, /** * Disable only within MB edges - Not supported currently */ DISABLE_DEBLK_LEVEL_1, /** * Enable deblocking once in DEBLOCK_INTERVAL number of pictures * and for I slices */ DISABLE_DEBLK_LEVEL_2, /** * Enable deblocking only for I slices */ DISABLE_DEBLK_LEVEL_3, /** * Disable deblocking completely */ DISABLE_DEBLK_LEVEL_4 }; /** **************************************************************************** * Number of buffers for I/O based on format **************************************************************************** */ /** Minimum number of input buffers */ #define MIN_INP_BUFS 2 /** Minimum number of output buffers */ #define MIN_OUT_BUFS 1 /** Minimum number of components in bitstream buffer */ #define MIN_BITS_BUFS_COMP 1 /** Minimum number of components in raw buffer */ #define MIN_RAW_BUFS_420_COMP 3 #define MIN_RAW_BUFS_422ILE_COMP 1 #define MIN_RAW_BUFS_RGB565_COMP 1 #define MIN_RAW_BUFS_RGBA8888_COMP 1 #define MIN_RAW_BUFS_420SP_COMP 2 /** Maximum number of active config paramter sets */ #define MAX_ACTIVE_CONFIG_PARAMS 32 /** ****************************************************************************** * @brief Thresholds for luma & chroma to determine if the 8x8 subblock needs * to be encoded or skipped ****************************************************************************** */ #define LUMA_SUB_BLOCK_SKIP_THRESHOLD 4 #define LUMA_BLOCK_SKIP_THRESHOLD 5 #define CHROMA_BLOCK_SKIP_THRESHOLD 4 /** ****************************************************************************** * @brief defines the first byte of a NAL unit * forbidden zero bit - nal_ref_idc - nal_unit_type ****************************************************************************** */ /* [0 - 11 - 00111] */ #define NAL_SPS_FIRST_BYTE 0x67 /* [0 - 11 - 01000] */ #define NAL_PPS_FIRST_BYTE 0x68 /* [0 - 11 - 00001] */ #define NAL_SLICE_FIRST_BYTE 0x61 /* [0 - 00 - 00001] */ #define NAL_NON_REF_SLICE_FIRST_BYTE 0x01 /* [0 - 11 - 00101] */ #define NAL_IDR_SLICE_FIRST_BYTE 0x65 /* [0 - 00 - 01100] */ #define NAL_FILLER_FIRST_BYTE 0x0C /* [0 - 00 - 00110] */ #define NAL_SEI_FIRST_BYTE 0x06 #define H264_ALLOC_INTER_FRM_INTV 2 #define H264_MPEG_QP_MAP 255 #define MPEG2_QP_ELEM (H264_MPEG_QP_MAP + 1) #define H264_QP_ELEM (MAX_H264_QP + 1) #define H264_INIT_QUANT_I 26 #define H264_INIT_QUANT_P 34 #endif /*IH264E_DEFS_H_*/