Home | History | Annotate | Download | only in xcore
      1 /*
      2  * x3a_result.h - 3A calculation result
      3  *
      4  *  Copyright (c) 2014-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 #ifndef XCAM_3A_RESULT_H
     22 #define XCAM_3A_RESULT_H
     23 
     24 #include <xcam_std.h>
     25 #include <base/xcam_3a_result.h>
     26 #include <base/xcam_smart_result.h>
     27 #include <list>
     28 
     29 namespace XCam {
     30 
     31 class X3aResult
     32 {
     33 protected:
     34     explicit X3aResult (
     35         uint32_t type,
     36         XCamImageProcessType process_type = XCAM_IMAGE_PROCESS_ALWAYS,
     37         int64_t timestamp = XCam::InvalidTimestamp
     38     )
     39         : _type (type)
     40         , _process_type (process_type)
     41         , _timestamp (timestamp)
     42         , _ptr (NULL)
     43         , _processed (false)
     44     {}
     45 
     46 public:
     47     virtual ~X3aResult() {}
     48 
     49     void *get_ptr () const {
     50         return _ptr;
     51     }
     52     bool is_done() const {
     53         return _processed;
     54     }
     55     void set_done (bool flag) {
     56         _processed = flag;
     57     }
     58     void set_timestamp (int64_t timestamp) {
     59         _timestamp = timestamp;
     60     }
     61     int64_t get_timestamp () const {
     62         return _timestamp;
     63     }
     64     uint32_t get_type () const {
     65         return _type;
     66     }
     67 
     68     void set_process_type (XCamImageProcessType process) {
     69         _process_type = process;
     70     }
     71     XCamImageProcessType get_process_type () const {
     72         return _process_type;
     73     }
     74 
     75 protected:
     76     void set_ptr (void *ptr) {
     77         _ptr = ptr;
     78     }
     79 
     80     //virtual bool to_isp_config (SmartPtr<X3aIspConfig>  &config) = 0;
     81 
     82 private:
     83     XCAM_DEAD_COPY (X3aResult);
     84 
     85 protected:
     86     //XCam3aResultType      _type;
     87     uint32_t              _type;  // XCam3aResultType
     88     XCamImageProcessType  _process_type;
     89     int64_t               _timestamp;
     90     void                 *_ptr;
     91     bool                  _processed;
     92 };
     93 
     94 typedef std::list<SmartPtr<X3aResult>>  X3aResultList;
     95 
     96 void x3a_list_remove_result (X3aResultList &list, uint32_t type);
     97 
     98 /* !
     99  * \template StandardResult must inherited from XCam3aResultHead
    100  */
    101 template <typename StandardResult>
    102 class X3aStandardResultT
    103     : public X3aResult
    104 {
    105 public:
    106     explicit X3aStandardResultT (uint32_t type, XCamImageProcessType process_type = XCAM_IMAGE_PROCESS_ALWAYS, uint32_t extra_size = 0)
    107         : X3aResult (type, process_type)
    108         , _result (NULL)
    109         , _extra_size (extra_size)
    110     {
    111         _result = (StandardResult *) xcam_malloc0 (sizeof (StandardResult) + _extra_size);
    112         XCAM_ASSERT (_result);
    113         set_ptr ((void*) _result);
    114         _result->head.type = (XCam3aResultType) type;
    115         _result->head.process_type = _process_type;
    116         _result->head.version = xcam_version ();
    117     }
    118     ~X3aStandardResultT () {
    119         xcam_free (_result);
    120     }
    121 
    122     void set_standard_result (StandardResult &res) {
    123         uint32_t offset = sizeof (XCam3aResultHead);
    124         XCAM_ASSERT (sizeof (StandardResult) >= offset);
    125 
    126         if (_extra_size > 0) {
    127             memcpy ((uint8_t*)(_result) + offset, (uint8_t*)(&res) + offset, _extra_size);
    128         } else {
    129             memcpy ((uint8_t*)(_result) + offset, (uint8_t*)(&res) + offset, sizeof (StandardResult) - offset);
    130         }
    131     }
    132 
    133     StandardResult &get_standard_result () {
    134         return *_result;
    135     }
    136     const StandardResult &get_standard_result () const {
    137         return *_result;
    138     }
    139     StandardResult *get_standard_result_ptr () {
    140         return _result;
    141     }
    142 
    143 private:
    144     StandardResult *_result;
    145     uint32_t        _extra_size;
    146 };
    147 
    148 typedef X3aStandardResultT<XCam3aResultWhiteBalance>   X3aWhiteBalanceResult;
    149 typedef X3aStandardResultT<XCam3aResultBlackLevel>     X3aBlackLevelResult;
    150 typedef X3aStandardResultT<XCam3aResultColorMatrix>    X3aColorMatrixResult;
    151 typedef X3aStandardResultT<XCam3aResultExposure>       X3aExposureResult;
    152 typedef X3aStandardResultT<XCam3aResultFocus>          X3aFocusResult;
    153 typedef X3aStandardResultT<XCam3aResultDemosaic>       X3aDemosaicResult;
    154 typedef X3aStandardResultT<XCam3aResultDefectPixel>    X3aDefectPixelResult;
    155 typedef X3aStandardResultT<XCam3aResultNoiseReduction> X3aNoiseReductionResult;
    156 typedef X3aStandardResultT<XCam3aResultEdgeEnhancement>  X3aEdgeEnhancementResult;
    157 typedef X3aStandardResultT<XCam3aResultGammaTable>     X3aGammaTableResult;
    158 typedef X3aStandardResultT<XCam3aResultMaccMatrix>     X3aMaccMatrixResult;
    159 typedef X3aStandardResultT<XCam3aResultChromaToneControl> X3aChromaToneControlResult;
    160 typedef X3aStandardResultT<XCam3aResultBayerNoiseReduction> X3aBayerNoiseReduction;
    161 typedef X3aStandardResultT<XCam3aResultBrightness>      X3aBrightnessResult;
    162 typedef X3aStandardResultT<XCam3aResultTemporalNoiseReduction> X3aTemporalNoiseReduction;
    163 typedef X3aStandardResultT<XCam3aResultWaveletNoiseReduction> X3aWaveletNoiseReduction;
    164 typedef X3aStandardResultT<XCamFDResult>               X3aFaceDetectionResult;
    165 typedef X3aStandardResultT<XCamDVSResult>              X3aDVSResult;
    166 };
    167 
    168 #endif //XCAM_3A_RESULT_H
    169