1 /* 2 * x3a_result_factory.cpp - 3A result factory 3 * 4 * Copyright (c) 2015 Intel Corporation 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: Wind Yuan <feng.yuan (at) intel.com> 19 */ 20 21 #include "x3a_result_factory.h" 22 23 namespace XCam { 24 25 #define XCAM_3A_RESULT_FACTORY(DataType, res_type, from) \ 26 DataType *ret = \ 27 new DataType (res_type); \ 28 if (from) { \ 29 uint32_t type = xcam_3a_result_type (from); \ 30 if (type != XCAM_3A_RESULT_NULL && type != res_type) { \ 31 XCAM_ASSERT (false); \ 32 XCAM_LOG_WARNING ("create result from wrong type:%d to type:%d", type, res_type); \ 33 } \ 34 ret->set_standard_result (*from); \ 35 } \ 36 return ret; 37 38 39 Mutex X3aResultFactory::_mutex; 40 SmartPtr<X3aResultFactory> X3aResultFactory::_instance (NULL); 41 42 SmartPtr<X3aResultFactory> 43 X3aResultFactory::instance () 44 { 45 SmartLock locker (_mutex); 46 if (_instance.ptr ()) 47 return _instance; 48 49 _instance = new X3aResultFactory; 50 return _instance; 51 } 52 53 X3aResultFactory::X3aResultFactory () 54 { 55 } 56 57 X3aResultFactory::~X3aResultFactory () 58 { 59 } 60 61 SmartPtr<X3aResult> 62 X3aResultFactory::create_3a_result (XCam3aResultHead *from) 63 { 64 SmartPtr<X3aResult> result (NULL); 65 66 XCAM_ASSERT (from); 67 if (!from) 68 return result; 69 70 uint32_t type = xcam_3a_result_type (from); 71 72 switch (type) { 73 case XCAM_3A_RESULT_WHITE_BALANCE: 74 result = create_whitebalance ((XCam3aResultWhiteBalance*)from); 75 break; 76 case XCAM_3A_RESULT_BLACK_LEVEL: 77 result = create_blacklevel ((XCam3aResultBlackLevel*)from); 78 break; 79 case XCAM_3A_RESULT_YUV2RGB_MATRIX: 80 result = create_yuv2rgb_colormatrix ((XCam3aResultColorMatrix*)from); 81 break; 82 case XCAM_3A_RESULT_RGB2YUV_MATRIX: 83 result = create_rgb2yuv_colormatrix ((XCam3aResultColorMatrix*)from); 84 break; 85 case XCAM_3A_RESULT_EXPOSURE: 86 result = create_exposure ((XCam3aResultExposure*)from); 87 break; 88 case XCAM_3A_RESULT_FOCUS: 89 result = create_focus ((XCam3aResultFocus*)from); 90 break; 91 case XCAM_3A_RESULT_DEMOSAIC: 92 result = create_demosaicing ((XCam3aResultDemosaic*)from); 93 break; 94 case XCAM_3A_RESULT_DEFECT_PIXEL_CORRECTION: 95 result = create_defectpixel ((XCam3aResultDefectPixel*)from); 96 break; 97 case XCAM_3A_RESULT_NOISE_REDUCTION: 98 result = create_noise_reduction ((XCam3aResultNoiseReduction*)from); 99 break; 100 case XCAM_3A_RESULT_3D_NOISE_REDUCTION: 101 result = create_3d_noise_reduction ((XCam3aResultTemporalNoiseReduction*)from); 102 break; 103 case XCAM_3A_RESULT_TEMPORAL_NOISE_REDUCTION_YUV: 104 result = create_yuv_temp_noise_reduction ((XCam3aResultTemporalNoiseReduction*)from); 105 break; 106 case XCAM_3A_RESULT_EDGE_ENHANCEMENT: 107 result = create_edge_enhancement ((XCam3aResultEdgeEnhancement*)from); 108 break; 109 case XCAM_3A_RESULT_MACC: 110 result = create_macc ((XCam3aResultMaccMatrix*)from); 111 break; 112 case XCAM_3A_RESULT_CHROMA_TONE_CONTROL: 113 result = create_chroma_tone_control ((XCam3aResultChromaToneControl*)from); 114 break; 115 case XCAM_3A_RESULT_Y_GAMMA: 116 result = create_y_gamma_table ((XCam3aResultGammaTable*)from); 117 break; 118 case XCAM_3A_RESULT_R_GAMMA: 119 result = create_r_gamma_table ((XCam3aResultGammaTable*)from); 120 break; 121 case XCAM_3A_RESULT_G_GAMMA: 122 result = create_g_gamma_table ((XCam3aResultGammaTable*)from); 123 break; 124 case XCAM_3A_RESULT_B_GAMMA: 125 result = create_b_gamma_table ((XCam3aResultGammaTable*)from); 126 break; 127 case XCAM_3A_RESULT_BAYER_NOISE_REDUCTION: 128 result = create_bayer_noise_reduction ((XCam3aResultBayerNoiseReduction*)from); 129 break; 130 case XCAM_3A_RESULT_BRIGHTNESS: 131 result = create_brightness ((XCam3aResultBrightness*)from); 132 break; 133 case XCAM_3A_RESULT_WAVELET_NOISE_REDUCTION: 134 result = create_wavelet_noise_reduction ((XCam3aResultWaveletNoiseReduction*)from); 135 break; 136 case XCAM_3A_RESULT_FACE_DETECTION: 137 result = create_face_detection ((XCamFDResult*)from); 138 break; 139 case XCAM_3A_RESULT_DVS: 140 result = create_digital_video_stabilizer ((XCamDVSResult*)from); 141 break; 142 default: 143 XCAM_LOG_WARNING ("create 3a result with unknown result type:%d", type); 144 break; 145 } 146 147 return result; 148 } 149 150 SmartPtr<X3aWhiteBalanceResult> 151 X3aResultFactory::create_whitebalance (XCam3aResultWhiteBalance *from) 152 { 153 XCAM_3A_RESULT_FACTORY (X3aWhiteBalanceResult, XCAM_3A_RESULT_WHITE_BALANCE, from); 154 } 155 156 SmartPtr<X3aBlackLevelResult> 157 X3aResultFactory::create_blacklevel (XCam3aResultBlackLevel *from) 158 { 159 XCAM_3A_RESULT_FACTORY (X3aBlackLevelResult, XCAM_3A_RESULT_BLACK_LEVEL, from); 160 } 161 162 SmartPtr<X3aColorMatrixResult> 163 X3aResultFactory::create_rgb2yuv_colormatrix (XCam3aResultColorMatrix *from) 164 { 165 XCAM_3A_RESULT_FACTORY (X3aColorMatrixResult, XCAM_3A_RESULT_RGB2YUV_MATRIX, from); 166 } 167 168 SmartPtr<X3aColorMatrixResult> 169 X3aResultFactory::create_yuv2rgb_colormatrix (XCam3aResultColorMatrix *from) 170 { 171 XCAM_3A_RESULT_FACTORY (X3aColorMatrixResult, XCAM_3A_RESULT_YUV2RGB_MATRIX, from); 172 } 173 174 SmartPtr<X3aExposureResult> 175 X3aResultFactory::create_exposure (XCam3aResultExposure *from) 176 { 177 XCAM_3A_RESULT_FACTORY (X3aExposureResult, XCAM_3A_RESULT_EXPOSURE, from); 178 } 179 180 SmartPtr<X3aFocusResult> 181 X3aResultFactory::create_focus (XCam3aResultFocus *from) 182 { 183 XCAM_3A_RESULT_FACTORY (X3aFocusResult, XCAM_3A_RESULT_FOCUS, from); 184 } 185 186 SmartPtr<X3aDemosaicResult> 187 X3aResultFactory::create_demosaicing (XCam3aResultDemosaic *from) 188 { 189 XCAM_3A_RESULT_FACTORY (X3aDemosaicResult, XCAM_3A_RESULT_DEMOSAIC, from); 190 } 191 192 SmartPtr<X3aDefectPixelResult> 193 X3aResultFactory::create_defectpixel (XCam3aResultDefectPixel *from) 194 { 195 XCAM_3A_RESULT_FACTORY (X3aDefectPixelResult, XCAM_3A_RESULT_DEFECT_PIXEL_CORRECTION, from); 196 } 197 198 SmartPtr<X3aNoiseReductionResult> 199 X3aResultFactory::create_noise_reduction (XCam3aResultNoiseReduction *from) 200 { 201 XCAM_3A_RESULT_FACTORY (X3aNoiseReductionResult, XCAM_3A_RESULT_NOISE_REDUCTION, from); 202 } 203 204 SmartPtr<X3aTemporalNoiseReduction> 205 X3aResultFactory::create_3d_noise_reduction (XCam3aResultTemporalNoiseReduction *from) 206 { 207 XCAM_3A_RESULT_FACTORY (X3aTemporalNoiseReduction, XCAM_3A_RESULT_3D_NOISE_REDUCTION, from); 208 } 209 210 SmartPtr<X3aTemporalNoiseReduction> 211 X3aResultFactory::create_yuv_temp_noise_reduction (XCam3aResultTemporalNoiseReduction *from) 212 { 213 XCAM_3A_RESULT_FACTORY (X3aTemporalNoiseReduction, XCAM_3A_RESULT_TEMPORAL_NOISE_REDUCTION_YUV, from); 214 } 215 216 SmartPtr<X3aEdgeEnhancementResult> 217 X3aResultFactory::create_edge_enhancement (XCam3aResultEdgeEnhancement *from) 218 { 219 XCAM_3A_RESULT_FACTORY (X3aEdgeEnhancementResult, XCAM_3A_RESULT_EDGE_ENHANCEMENT, from); 220 } 221 222 SmartPtr<X3aGammaTableResult> 223 X3aResultFactory::create_y_gamma_table (XCam3aResultGammaTable *from) 224 { 225 XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_Y_GAMMA, from); 226 } 227 228 SmartPtr<X3aGammaTableResult> 229 X3aResultFactory::create_r_gamma_table (XCam3aResultGammaTable *from) 230 { 231 XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_R_GAMMA, from); 232 } 233 234 SmartPtr<X3aGammaTableResult> 235 X3aResultFactory::create_g_gamma_table (XCam3aResultGammaTable *from) 236 { 237 XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_G_GAMMA, from); 238 } 239 240 SmartPtr<X3aGammaTableResult> 241 X3aResultFactory::create_b_gamma_table (XCam3aResultGammaTable *from) 242 { 243 XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_B_GAMMA, from); 244 } 245 246 SmartPtr<X3aMaccMatrixResult> 247 X3aResultFactory::create_macc (XCam3aResultMaccMatrix *from) 248 { 249 XCAM_3A_RESULT_FACTORY (X3aMaccMatrixResult, XCAM_3A_RESULT_MACC, from); 250 } 251 252 SmartPtr<X3aChromaToneControlResult> 253 X3aResultFactory::create_chroma_tone_control (XCam3aResultChromaToneControl *from) 254 { 255 XCAM_3A_RESULT_FACTORY (X3aChromaToneControlResult, XCAM_3A_RESULT_CHROMA_TONE_CONTROL, from); 256 } 257 258 SmartPtr<X3aBayerNoiseReduction> 259 X3aResultFactory::create_bayer_noise_reduction (XCam3aResultBayerNoiseReduction *from) 260 { 261 XCAM_3A_RESULT_FACTORY (X3aBayerNoiseReduction, XCAM_3A_RESULT_BAYER_NOISE_REDUCTION, from); 262 } 263 264 SmartPtr<X3aBrightnessResult> 265 X3aResultFactory::create_brightness (XCam3aResultBrightness *from) 266 { 267 XCAM_3A_RESULT_FACTORY (X3aBrightnessResult, XCAM_3A_RESULT_BRIGHTNESS, from); 268 } 269 270 SmartPtr<X3aWaveletNoiseReduction> 271 X3aResultFactory::create_wavelet_noise_reduction (XCam3aResultWaveletNoiseReduction *from) 272 { 273 XCAM_3A_RESULT_FACTORY (X3aWaveletNoiseReduction, XCAM_3A_RESULT_WAVELET_NOISE_REDUCTION, from); 274 } 275 276 SmartPtr<X3aFaceDetectionResult> 277 X3aResultFactory::create_face_detection (XCamFDResult *from) 278 { 279 uint32_t type = xcam_3a_result_type (from); 280 if (type != XCAM_3A_RESULT_FACE_DETECTION) { 281 XCAM_ASSERT (false); 282 XCAM_LOG_WARNING ("X3aResultFactory create face detection failed with wrong type"); 283 } 284 285 X3aFaceDetectionResult *fd_res = new X3aFaceDetectionResult ( 286 XCAM_3A_RESULT_FACE_DETECTION, 287 from->head.process_type, 288 from->face_num * sizeof (XCamFaceInfo)); 289 fd_res->set_standard_result (*from); 290 291 return fd_res; 292 } 293 294 SmartPtr<X3aDVSResult> 295 X3aResultFactory::create_digital_video_stabilizer (XCamDVSResult *from) 296 { 297 XCAM_3A_RESULT_FACTORY (X3aDVSResult, XCAM_3A_RESULT_DVS, from); 298 } 299 }; 300 301 302