xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/aiq_core/thumbnails.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * thumbnails.h - A service to produce thumbnails for algorithms
3  *
4  *  Copyright (c) 2021-2022 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  */
19 #ifndef AIQ_CORE_THUMBNAILS_H
20 #define AIQ_CORE_THUMBNAILS_H
21 
22 #include <atomic>
23 #include <cstdint>
24 #include <functional>
25 #include <map>
26 #include <memory>
27 
28 #include "iq_parser_v2/RkAiqCalibDbTypesV2.h"
29 #include "xcore/base/xcam_defs.h"
30 #include "xcore/task_service.h"
31 #include "xcore/task_traits.h"
32 #include "xcore/video_buffer.h"
33 
34 XCAM_BEGIN_DECLARE
35 
36 #define RAW_DOMAIN_FAKE_NODE_START_BIT 0
37 #define RAW_DOMAIN_FAKE_NODES_COUNT    8
38 #define RAW_DOMAIN_START_BIT           RAW_DOMAIN_FAKE_NODE_START_BIT + RAW_DOMAIN_FAKE_NODES_COUNT
39 #define RAW_DOMAIN_NODES_COUNT         8
40 #define RGB_DOMAIN_START_BIT           RAW_DOMAIN_START_BIT + RAW_DOMAIN_NODES_COUNT
41 #define RGB_DOMAIN_NODES_COUNT         8
42 #define YUV_DOMAIN_START_BIT           RGB_DOMAIN_START_BIT + RGB_DOMAIN_NODES_COUNT
43 #define YUV_DOMAIN_NODES_COUNT         16
44 
45 // Hardware independent **hardware** node definition
46 typedef enum rkaiq_pipeline_node_e {
47     // FAKE RAW pipelines
48     RKAIQ_PIPELINE_NODE_FAKE_SHORT  = 1ULL << (RAW_DOMAIN_FAKE_NODE_START_BIT + 0),
49     RKAIQ_PIPELINE_NODE_FAKE_MIDDLE = 1ULL << (RAW_DOMAIN_FAKE_NODE_START_BIT + 1),
50     RKAIQ_PIPELINE_NODE_FAKE_LONG   = 1ULL << (RAW_DOMAIN_FAKE_NODE_START_BIT + 2),
51     // Real RAW pipelines
52     RKAIQ_PIPELINE_NODE_BLC      = 1ULL << (RAW_DOMAIN_START_BIT + 0),
53     RKAIQ_PIPELINE_NODE_DPCC     = 1ULL << (RAW_DOMAIN_START_BIT + 1),
54     RKAIQ_PIPELINE_NODE_HDRMERGE = 1ULL << (RAW_DOMAIN_START_BIT + 2),
55     RKAIQ_PIPELINE_NODE_RAWNR    = 1ULL << (RAW_DOMAIN_START_BIT + 3),
56     RKAIQ_PIPELINE_NODE_LSC      = 1ULL << (RAW_DOMAIN_START_BIT + 4),
57     RKAIQ_PIPELINE_NODE_HDRTMO   = 1ULL << (RAW_DOMAIN_START_BIT + 5),
58     RKAIQ_PIPELINE_NODE_GIC      = 1ULL << (RAW_DOMAIN_START_BIT + 6),
59     // RGB domains
60     RKAIQ_PIPELINE_NODE_DEBAYER = 1ULL << (RGB_DOMAIN_START_BIT + 0),
61     RKAIQ_PIPELINE_NODE_CCM     = 1ULL << (RGB_DOMAIN_START_BIT + 1),
62     RKAIQ_PIPELINE_NODE_GAMMA   = 1ULL << (RGB_DOMAIN_START_BIT + 2),
63     RKAIQ_PIPELINE_NODE_WDR     = 1ULL << (RGB_DOMAIN_START_BIT + 3),
64     RKAIQ_PIPELINE_NODE_DEHAZE  = 1ULL << (RGB_DOMAIN_START_BIT + 4),
65     RKAIQ_PIPELINE_NODE_3DLUT   = 1ULL << (RGB_DOMAIN_START_BIT + 5),
66     // YUV domains
67     RKAIQ_PIPELINE_NODE_LDCH = 1ULL << (YUV_DOMAIN_START_BIT + 0),
68     RKAIQ_PIPELINE_NODE_CSM  = 1ULL << (YUV_DOMAIN_START_BIT + 1),
69     RKAIQ_PIPELINE_NODE_CP   = 1ULL << (YUV_DOMAIN_START_BIT + 2),
70     RKAIQ_PIPELINE_NODE_IE   = 1ULL << (YUV_DOMAIN_START_BIT + 3),
71     // YUV PP domains
72     RKAIQ_PIPELINE_NODE_TNR        = 1ULL << (YUV_DOMAIN_START_BIT + 4),
73     RKAIQ_PIPELINE_NODE_YNR        = 1ULL << (YUV_DOMAIN_START_BIT + 5),
74     RKAIQ_PIPELINE_NODE_UVNR       = 1ULL << (YUV_DOMAIN_START_BIT + 6),
75     RKAIQ_PIPELINE_NODE_SHARP      = 1ULL << (YUV_DOMAIN_START_BIT + 7),
76     RKAIQ_PIPELINE_NODE_EDGEFILTER = 1ULL << (YUV_DOMAIN_START_BIT + 8),
77     RKAIQ_PIPELINE_NODE_ORB        = 1ULL << (YUV_DOMAIN_START_BIT + 9),
78     RKAIQ_PIPELINE_NODE_FEC        = 1ULL << (YUV_DOMAIN_START_BIT + 10),
79     // ...
80 } rkaiq_pipeline_node_t;
81 
82 typedef struct rkaiq_thumbnails_s {
83     uint32_t frame_id;
84     rkaiq_thumbnails_config_t config;
85     XCamVideoBuffer* buffer;
86 } rkaiq_thumbnails_t;
87 
88 // For hwi only
89 typedef enum rkaiq_stream_type_e {
90     RKISP_STREAM_NONE,
91     RKISP20_STREAM_MIPITX_S,
92     RKISP20_STREAM_MIPITX_M,
93     RKISP20_STREAM_MIPITX_L,
94     RKISP20_STREAM_SP_RAW,
95     RKISP20_STREAM_SP,
96     RKISP20_STREAM_TNR,
97     RKISP20_STREAM_NR,
98     RKISP20_STREAM_FEC,
99     // RKISP21_SP,
100     RKISP_STREAM_MAX,
101 } rkaiq_stream_type_t;
102 
103 // For hwi only
104 typedef struct rkaiq_image_source_s {
105     uint32_t frame_id;
106     // video streams that produce image sources
107     rkaiq_stream_type_t src_type;
108     // the full size image info
109     XCamVideoBufferInfo full_image_info;
110     // The buffer of image source
111     // maybe smaller than fullsize image
112     XCamVideoBuffer* image_source;
113 } rkaiq_image_source_t;
114 
115 XCAM_END_DECLARE
116 
117 namespace RkCam {
118 
119 namespace thumbnails {
120 class ThumbnailsConfig;
121 class ThumbnailsBufferManager;
122 struct ScalerParam;
123 using ScalerService = XCam::TaskService<ScalerParam>;
124 }  // namespace thumbnails
125 
126 class ThumbnailsService {
127  public:
128     ThumbnailsService();
129     virtual ~ThumbnailsService();
130     ThumbnailsService(const ThumbnailsService&) = delete;
131     ThumbnailsService& operator=(const ThumbnailsService&) = delete;
132 
133     XCamReturn Prepare(const CalibDbV2_Thumbnails_Param_t* calib);
134     XCamReturn Start();
135     XCamReturn Stop();
136 
137     using ResultCallback = std::function<void(const rkaiq_thumbnails_t& thumbnail)>;
138 
139     void SetResultCallback(const ResultCallback& cb);
140     void OnFrameEvent(const rkaiq_image_source_t& source);
141 
142  private:
143     std::shared_ptr<thumbnails::ThumbnailsConfig> config_;
144     std::unique_ptr<thumbnails::ThumbnailsBufferManager> bufferManager_;
145     std::map<int, std::unique_ptr<thumbnails::ScalerService>> scalers_;
146     ResultCallback callback_;
147     std::atomic_bool stopped_;
148 };
149 
150 }  // namespace RkCam
151 
152 #endif  // AIQ_CORE_THUMBNAILS_H
153