123 lines
3.6 KiB
C++
123 lines
3.6 KiB
C++
/*
|
|
* eis_algo_service.h
|
|
*
|
|
* Copyright (c) 2021 Rockchip Electronics Co.,Ltd
|
|
*
|
|
* 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.
|
|
*
|
|
* Author: Cody Xie <cody.xie@rock-chips.com>
|
|
*/
|
|
#ifndef ALGOS_AEIS_EIS_ALGO_H
|
|
#define ALGOS_AEIS_EIS_ALGO_H
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "RkAiqCalibDbTypesV2.h"
|
|
#include "drm_device.h"
|
|
#include "dvs_app.h"
|
|
#include "eis_loader.h"
|
|
#include "imu_service.h"
|
|
#include "remap_backend.h"
|
|
#include "rk_aiq_algo_des.h"
|
|
#include "rk_aiq_types_priv.h"
|
|
#include "scaler_service.h"
|
|
#include "task_service.h"
|
|
#include "rk_aiq_algo_types.h"
|
|
#include "xcam_common.h"
|
|
|
|
namespace XCam {
|
|
|
|
class DmaVideoBuffer;
|
|
|
|
}
|
|
|
|
using namespace XCam;
|
|
|
|
namespace RkCam {
|
|
|
|
struct FecMeshConfig;
|
|
struct FecMeshBuffer;
|
|
class FecRemapBackend;
|
|
|
|
class EisAlgoAdaptor : public std::enable_shared_from_this<EisAlgoAdaptor> {
|
|
public:
|
|
EisAlgoAdaptor() = default;
|
|
virtual ~EisAlgoAdaptor();
|
|
EisAlgoAdaptor(const EisAlgoAdaptor&) = delete;
|
|
const EisAlgoAdaptor& operator=(const EisAlgoAdaptor&) = delete;
|
|
|
|
XCamReturn Config(const AlgoCtxInstanceCfg* config, const CalibDbV2_Eis_t* calib);
|
|
XCamReturn Prepare(const rk_aiq_mems_sensor_intf_t* mems_sensor_intf,
|
|
const isp_drv_share_mem_ops_t* mem_ops);
|
|
bool IsValid() { return valid_; }
|
|
bool IsEnabled() { return enable_; }
|
|
|
|
void Start();
|
|
void OnFrameEvent(const RkAiqAlgoProcAeis* input);
|
|
void GetProcResult(RkAiqAlgoProcResAeis* output);
|
|
void Stop();
|
|
|
|
private:
|
|
XCamReturn LoadLibrary();
|
|
XCamReturn CreateImuService(const rk_aiq_mems_sensor_intf_t* mems_sensor_intf);
|
|
XCamReturn CreateScalerService();
|
|
XCamReturn CreateFecRemapBackend(const FecMeshConfig& config,
|
|
const isp_drv_share_mem_ops_t* mem_ops);
|
|
|
|
int OnMeshCallback(struct dvsEngine* engine, struct meshxyFEC* mesh);
|
|
|
|
// Import image buffers
|
|
// Alloc Drm Buffers if image mode enabled
|
|
void ImportImageBuffers(std::map<int, int> indexes);
|
|
|
|
// Check if hardware compatible
|
|
bool valid_;
|
|
// Enable/Disable by user
|
|
bool enable_;
|
|
bool started_;
|
|
// Configs and calib data
|
|
const CalibDbV2_Eis_t* calib_;
|
|
|
|
// DVS algo library
|
|
std::shared_ptr<DvsLibrary> lib_;
|
|
std::unique_ptr<struct dvsEngine> engine_;
|
|
std::map<int, std::unique_ptr<meshxyFEC>> dvs_meshes_;
|
|
std::map<int, std::unique_ptr<imageData>> dvs_images_;
|
|
|
|
// The remap backend
|
|
std::unique_ptr<FecRemapBackend> remap_;
|
|
std::map<int, FecMeshBuffer*> remap_meshes_;
|
|
FecMeshBuffer* default_mesh_;
|
|
|
|
// IMU Service Handler
|
|
std::unique_ptr<ImuService> imu_;
|
|
|
|
// Scaler Service Handler
|
|
std::unique_ptr<ScalerService> scl_;
|
|
// Drm Buffer Manager
|
|
// DrmDevice should implement singlton
|
|
std::shared_ptr<DrmDevice> drm_dev_;
|
|
using ImageBuffer = std::shared_ptr<DmaVideoBuffer>;
|
|
using ImageBufferList = std::vector<ImageBuffer>;
|
|
// index <unique>, original fd
|
|
std::map<int, int> image_indexes_;
|
|
// index <unique>, nr image, scaled images
|
|
std::tuple<int, ImageBuffer, ImageBufferList> image_groups_;
|
|
};
|
|
|
|
} // namespace RkCam
|
|
|
|
#endif // ALGOS_AEIS_EIS_ALGO_H
|