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