/* * rk_aiq_algo_des.h * * Copyright (c) 2019 Rockchip Corporation * * 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. * */ #ifndef _RK_AIQ_ALGO_DES_H_ #define _RK_AIQ_ALGO_DES_H_ #include "base/xcam_common.h" #include "rk_aiq_comm.h" /* * This file is used to define all the algos interfaces, eg. including ae, awb * af, anr and etc. . The typical call routine by user is as follow: * 1) create_context * Should call this before any other interfaces, and should be called only * once. * 2) prepare * some algos have lots of pre-condtions, these condtions may consist of * sensor_descriptors, tuning params for algo. This interface may be called * after |create_context| or |post_process|, and shouldn't be called * after |pre_process| or |processing|. That means the configs can't be * changed during the process stage, and could be repeated(re-config) until * one completed process routine. * 3) pre_process * We separate the whole process to 3 steps: pre-process, processing and * post-process. The caller will call all algos pre-process firstly, then * call processing, then post-process at last. * There may exist the dependancy between algos's params. pre-process aims * to solve the dependancy. It collects all the dependancy before processing. * 4) processing * runs the algos then outputs the result. * 5) post_process * reserved. * 6) destroy_context * */ RKAIQ_BEGIN_DECLARE typedef struct _RkAiqAlgoContext RkAiqAlgoContext; typedef enum RkAiqAlgoType_e { RK_AIQ_ALGO_TYPE_NONE = -1, RK_AIQ_ALGO_TYPE_AE, RK_AIQ_ALGO_TYPE_AWB, RK_AIQ_ALGO_TYPE_AF, RK_AIQ_ALGO_TYPE_ABLC, RK_AIQ_ALGO_TYPE_ADPCC, RK_AIQ_ALGO_TYPE_AMERGE, RK_AIQ_ALGO_TYPE_ATMO, RK_AIQ_ALGO_TYPE_ANR, RK_AIQ_ALGO_TYPE_ALSC, RK_AIQ_ALGO_TYPE_AGIC, RK_AIQ_ALGO_TYPE_ADEBAYER, RK_AIQ_ALGO_TYPE_ACCM, RK_AIQ_ALGO_TYPE_AGAMMA, RK_AIQ_ALGO_TYPE_AWDR, RK_AIQ_ALGO_TYPE_ADHAZ, RK_AIQ_ALGO_TYPE_A3DLUT, RK_AIQ_ALGO_TYPE_ALDCH, RK_AIQ_ALGO_TYPE_AR2Y, RK_AIQ_ALGO_TYPE_ACP, RK_AIQ_ALGO_TYPE_AIE, RK_AIQ_ALGO_TYPE_ASHARP, RK_AIQ_ALGO_TYPE_AORB, RK_AIQ_ALGO_TYPE_ACGC, RK_AIQ_ALGO_TYPE_ASD, RK_AIQ_ALGO_TYPE_ADRC, RK_AIQ_ALGO_TYPE_ADEGAMMA, RK_AIQ_ALGO_TYPE_ARAWNR, RK_AIQ_ALGO_TYPE_AMFNR, RK_AIQ_ALGO_TYPE_AYNR, RK_AIQ_ALGO_TYPE_ACNR, RK_AIQ_ALGO_TYPE_AEIS, RK_AIQ_ALGO_TYPE_AFEC, RK_AIQ_ALGO_TYPE_AMD, RK_AIQ_ALGO_TYPE_AGAIN, RK_AIQ_ALGO_TYPE_MAX } RkAiqAlgoType_t; typedef struct _AlgoCtxInstanceCfg { uint32_t isp_hw_version; uint32_t module_hw_version; } AlgoCtxInstanceCfg; typedef struct _RkAiqAlgoDesComm { const char* version; const char* vendor; const char* description; RkAiqAlgoType_t type; int id; XCamReturn (*create_context) (RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg); XCamReturn (*destroy_context) (RkAiqAlgoContext *context); } RkAiqAlgoDesComm; // base structs in order to abstract same interface // for all algos typedef enum RkAiqAlgoConfType_e { RK_AIQ_ALGO_CONFTYPE_INIT = 0, RK_AIQ_ALGO_CONFTYPE_UPDATECALIB = 0x01, RK_AIQ_ALGO_CONFTYPE_CHANGEMODE = 0x02, RK_AIQ_ALGO_CONFTYPE_NEEDRESET = 0x04, RK_AIQ_ALGO_CONFTYPE_CHANGERES = 0x08, RK_AIQ_ALGO_CONFTYPE_KEEPSTATUS = 0x10, RK_AIQ_ALGO_CONFTYPE_MAX } RkAiqAlgoConfType_t; typedef struct _RkAiqAlgoCom { RkAiqAlgoContext *ctx; uint32_t frame_id; union { struct { int working_mode; // real type is rk_aiq_working_mode_t or rk_aiq_isp_hdr_mode_t int sns_op_width; int sns_op_height; int conf_type; } prepare; //for prepare function struct { bool init; } proc; //for pre/processing/post function } u; void* reserverd; //transfer whatever used by prepare/pre/processing/post } RkAiqAlgoCom; typedef struct _RkAiqAlgoResCom { void* palce_holder[1]; } RkAiqAlgoResCom; typedef struct _RkAiqAlgoDescription { RkAiqAlgoDesComm common; XCamReturn (*prepare)(RkAiqAlgoCom* params); XCamReturn (*pre_process)(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams); XCamReturn (*processing)(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams); XCamReturn (*post_process)(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams); } RkAiqAlgoDescription; RKAIQ_END_DECLARE #endif //_RK_AIQ_ALGO_DES_H_