xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/aeis/remap_backend.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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