1 /* 2 * remap_backend.h - The backend hardware/software to do remap 3 * 4 * Copyright (c) 2021 Rockchip Electronics Co., Ltd. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * Author: Cody Xie <cody.xie@rock-chips.com> 19 */ 20 #ifndef ALGOS_AEIS_REMAP_BACKEND_H 21 #define ALGOS_AEIS_REMAP_BACKEND_H 22 23 #include <cstdint> 24 #include <memory> 25 #include <vector> 26 #include <mutex> 27 28 #include "rk_aiq_types_priv.h" 29 30 #ifdef OPENCV3_SUPPORT 31 #include <opencv3/opencv.hpp> 32 #endif 33 34 struct meshxyFEC; 35 36 namespace RkCam { 37 38 struct MeshBuffer {}; 39 40 class RemapBackend { 41 public: 42 RemapBackend() = default; 43 virtual ~RemapBackend() = default; 44 RemapBackend(const RemapBackend&) = delete; 45 const RemapBackend& operator=(const RemapBackend&) = delete; 46 47 virtual void Remap(MeshBuffer* info) = 0; 48 }; 49 50 #ifdef OPENCV3_SUPPORT 51 struct CvMeshBuffer : public MeshBuffer { 52 Cv::Mat MapX; 53 Cv::Mat MapY; 54 }; 55 56 class CvRemapBackend final : public RemapBackend {}; 57 #endif 58 59 struct FecMeshConfig { 60 int Width; 61 int Height; 62 unsigned char MeshDensity; 63 unsigned long MeshSize; 64 }; 65 66 struct FecMeshBuffer final : public MeshBuffer { 67 FecMeshBuffer() = default; FecMeshBufferfinal68 explicit FecMeshBuffer(const rk_aiq_fec_share_mem_info_t* mem) 69 : FrameId(-1), 70 ImageBufferIndex(-1), 71 ImageBufferSize(0), 72 Index(-1), 73 Size(mem->size), 74 Fd(mem->fd), 75 UserPtr(mem->map_addr), 76 MeshXi(mem->meshxi), 77 MeshXf(mem->meshxf), 78 MeshYi(mem->meshyi), 79 MeshYf(mem->meshyf), 80 State(mem->state){}; ~FecMeshBufferfinal81 virtual ~FecMeshBuffer() { 82 // Free user malloced memory 83 if (Fd < 0 && UserPtr != nullptr) { 84 free(UserPtr); 85 } 86 } 87 FecMeshBuffer(const FecMeshBuffer&) = default; 88 FecMeshBuffer& operator=(const FecMeshBuffer&) = default; 89 uint32_t FrameId; 90 int32_t ImageBufferIndex; 91 int32_t ImageBufferSize; 92 // Buffer Index 93 size_t Index; 94 // Total size of UserPtr 95 size_t Size; 96 // Fd < 0 - if UserPtr valid, means malloced address 97 int Fd; 98 // Mapped address if it is imported dma_buf 99 // Virtual address if it is malloc backed buf 100 void* UserPtr; 101 // All these are offset of UserPtr 102 // Memory layout: 103 // | MeshXi | MeshYi | MeshXf | MeshYf 104 unsigned short* MeshXi; 105 unsigned char* MeshXf; 106 unsigned short* MeshYi; 107 unsigned char* MeshYf; 108 // State[0] = 1 - Used by hardware 109 // State[0] = 0 - Used by user 110 char* State; 111 }; 112 113 class FecRemapBackend final : public RemapBackend { 114 public: 115 FecRemapBackend(const FecMeshConfig& config, const isp_drv_share_mem_ops_t* mem_ops); 116 virtual ~FecRemapBackend(); 117 GetConfig()118 FecMeshConfig& GetConfig() { return config_; } 119 120 FecMeshBuffer* AllocUserBuffer(); 121 void FreeUserBuffer(FecMeshBuffer* buf); 122 FecMeshBuffer* GetAvailUserBuffer(); 123 124 // Does not do actual remap, but put result to hardware 125 void Remap(MeshBuffer* info) override; 126 void Remap(struct meshxyFEC* mesh); 127 128 void ImportHwBuffers(); 129 void ReleaseHwBuffers(); 130 FecMeshBuffer* GetFreeHwBuffer(); 131 FecMeshBuffer* GetPendingHwResult(); 132 133 // Debug only 134 void GetMeshFromFile(MeshBuffer* info); 135 void WriteMeshToFile(MeshBuffer* info); 136 137 private: 138 FecMeshConfig config_; 139 const isp_drv_share_mem_ops_t* mem_ops_; 140 void* mem_ctx_; 141 std::mutex user_mtx_; 142 std::vector<std::unique_ptr<FecMeshBuffer>> user_buffers_; 143 size_t user_buffer_index_; 144 std::vector<std::unique_ptr<FecMeshBuffer>> hw_buffers_; 145 size_t hw_buffer_index_; 146 uint32_t last_result_id_; 147 }; 148 149 } // namespace RkCam 150 151 #endif // ALGOS_AEIS_REMAP_BACKEND_H 152