blob: 2396c8b4718a4936d44472e3d8813eb4e246ad39 [file] [log] [blame]
/******************************************************************************
*
* 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_ */