/****************************************************************************** * * Copyright (C) 2018 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 ihevce_multi_thrd_structs.h * * \brief * This file contains structure definations of multi thread based processing * * \date * 18/09/2012 * * \author * Ittiam * ****************************************************************************** */ #ifndef _IHEVCE_MULTI_THRD_STRUCTS_H_ #define _IHEVCE_MULTI_THRD_STRUCTS_H_ /*****************************************************************************/ /* File Includes */ /*****************************************************************************/ /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ /** Maximum number of modules on whose outputs any module's inputs are dependent */ #define MAX_IN_DEP 80 /** Maximum number of modules whose inputs are dependent on any module's outputs */ #define MAX_OUT_DEP 80 /*****************************************************************************/ /* Function Macros */ /*****************************************************************************/ /*****************************************************************************/ /* Typedefs */ /*****************************************************************************/ /*****************************************************************************/ /* Enums */ /*****************************************************************************/ typedef enum { ME_JOB_ENC_LYR = 0, ENC_LOOP_JOB, ENC_LOOP_JOB1, ENC_LOOP_JOB2, ENC_LOOP_JOB3, ENC_LOOP_JOB4, //MBR: enc_loop job instance created for each bit-rate. //change instances based on IHEVCE_MAX_NUM_BITRATES NUM_ENC_JOBS_QUES, } HEVCE_ENC_JOB_TYPES_T; typedef enum { DECOMP_JOB_LYR0 = 0, DECOMP_JOB_LYR1, DECOMP_JOB_LYR2, DECOMP_JOB_LYR3, ME_JOB_LYR4, ME_JOB_LYR3, ME_JOB_LYR2, ME_JOB_LYR1, IPE_JOB_LYR0, NUM_PRE_ENC_JOBS_QUES, } HEVCE_PRE_ENC_JOB_TYPES_T; /*****************************************************************************/ /* Structure */ /*****************************************************************************/ /** ****************************************************************************** * @brief IPE Job parameters structure ****************************************************************************** */ typedef struct { /*!< Index of the CTB Row */ WORD32 i4_ctb_row_no; } ipe_job_node_t; /** ****************************************************************************** * @brief ME Job parameters structure ****************************************************************************** */ typedef struct { /** Index of the Vertical unit Row */ WORD32 i4_vert_unit_row_no; WORD32 i4_tile_col_idx; } me_job_node_t; /** ****************************************************************************** * @brief Encode Loop Job parameters structure ****************************************************************************** */ typedef struct { /** Index of the CTB Row */ WORD32 i4_ctb_row_no; WORD32 i4_tile_col_idx; WORD32 i4_bitrate_instance_no; } enc_loop_job_node_t; /** ****************************************************************************** * @brief Decomposition Job parameters structure ****************************************************************************** */ typedef struct { /** Index of the Vertical unit Row */ WORD32 i4_vert_unit_row_no; } decomp_job_node_t; /** ****************************************************************************** * @brief Union Job parameters structure ****************************************************************************** */ typedef union /* Make sure that the size is a multiple of 4 */ { ipe_job_node_t s_ipe_job_info; me_job_node_t s_me_job_info; enc_loop_job_node_t s_enc_loop_job_info; decomp_job_node_t s_decomp_job_info; } job_info_t; /** ****************************************************************************** * @brief Job Queue Element parameters structure ****************************************************************************** */ typedef struct { /** Array of flags indicating the input dependencies of the module. * Flag set to 0 indicates that the input dependency is resolved. * Processing can start only after all the flags are 0. * * This has to be the first element of the array, MAX_IN_DEP has to be multiple of 4 */ UWORD8 au1_in_dep[MAX_IN_DEP]; /** Pointer to the next link in the job queue */ void *pv_next; /** Job information ctxt of the module */ job_info_t s_job_info; /** Array of offsets for the output dependencies' pointers. * Indicates the location where the dependency flag needs to * be set after the processing of the current NMB/row/slice */ UWORD32 au4_out_ofsts[MAX_OUT_DEP]; /** Number of input dependencies to be checked before starting current task */ WORD32 i4_num_input_dep; /** Number of output dependencies to be updated after finishing current task */ WORD32 i4_num_output_dep; /** indicates what type of task is to be executed * [ME_JOB for layer 0,ENC_LOOP_JOB] are valid * -1 will be set if this hob task type is irrelevant */ HEVCE_ENC_JOB_TYPES_T i4_task_type; /** indicates what type of task is to be executed * [ME_JOB for coarse and refine layers, DECOMP Jobs and IPE JOB] are valid * -1 will be set if this hob task type is irrelevant */ HEVCE_PRE_ENC_JOB_TYPES_T i4_pre_enc_task_type; } job_queue_t; /** ****************************************************************************** * @brief Job Queue Handle structure ****************************************************************************** */ typedef struct { /** Pointer to the next link in the job queue */ void *pv_next; } job_queue_handle_t; /*****************************************************************************/ /* Extern Variable Declarations */ /*****************************************************************************/ /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ #endif /* _IHEVCE_MULTI_THRD_STRUCTS_H_ */