Home | History | Annotate | Download | only in xcore
      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