/*
|
* x3a_result_factory.cpp - 3A result factory
|
*
|
* Copyright (c) 2015 Intel Corporation
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*
|
* Author: Wind Yuan <feng.yuan@intel.com>
|
*/
|
|
#include "x3a_result_factory.h"
|
|
namespace XCam {
|
|
#define XCAM_3A_RESULT_FACTORY(DataType, res_type, from) \
|
DataType *ret = \
|
new DataType (res_type); \
|
if (from) { \
|
uint32_t type = xcam_3a_result_type (from); \
|
if (type != XCAM_3A_RESULT_NULL && type != res_type) { \
|
XCAM_ASSERT (false); \
|
XCAM_LOG_WARNING ("create result from wrong type:%d to type:%d", type, res_type); \
|
} \
|
ret->set_standard_result (*from); \
|
} \
|
return ret;
|
|
|
Mutex X3aResultFactory::_mutex;
|
SmartPtr<X3aResultFactory> X3aResultFactory::_instance (NULL);
|
|
SmartPtr<X3aResultFactory>
|
X3aResultFactory::instance ()
|
{
|
SmartLock locker (_mutex);
|
if (_instance.ptr ())
|
return _instance;
|
|
_instance = new X3aResultFactory;
|
return _instance;
|
}
|
|
X3aResultFactory::X3aResultFactory ()
|
{
|
}
|
|
X3aResultFactory::~X3aResultFactory ()
|
{
|
}
|
|
SmartPtr<X3aResult>
|
X3aResultFactory::create_3a_result (XCam3aResultHead *from)
|
{
|
SmartPtr<X3aResult> result (NULL);
|
|
XCAM_ASSERT (from);
|
if (!from)
|
return result;
|
|
uint32_t type = xcam_3a_result_type (from);
|
|
switch (type) {
|
case XCAM_3A_RESULT_WHITE_BALANCE:
|
result = create_whitebalance ((XCam3aResultWhiteBalance*)from);
|
break;
|
case XCAM_3A_RESULT_BLACK_LEVEL:
|
result = create_blacklevel ((XCam3aResultBlackLevel*)from);
|
break;
|
case XCAM_3A_RESULT_YUV2RGB_MATRIX:
|
result = create_yuv2rgb_colormatrix ((XCam3aResultColorMatrix*)from);
|
break;
|
case XCAM_3A_RESULT_RGB2YUV_MATRIX:
|
result = create_rgb2yuv_colormatrix ((XCam3aResultColorMatrix*)from);
|
break;
|
case XCAM_3A_RESULT_EXPOSURE:
|
result = create_exposure ((XCam3aResultExposure*)from);
|
break;
|
case XCAM_3A_RESULT_FOCUS:
|
result = create_focus ((XCam3aResultFocus*)from);
|
break;
|
case XCAM_3A_RESULT_DEMOSAIC:
|
result = create_demosaicing ((XCam3aResultDemosaic*)from);
|
break;
|
case XCAM_3A_RESULT_DEFECT_PIXEL_CORRECTION:
|
result = create_defectpixel ((XCam3aResultDefectPixel*)from);
|
break;
|
case XCAM_3A_RESULT_NOISE_REDUCTION:
|
result = create_noise_reduction ((XCam3aResultNoiseReduction*)from);
|
break;
|
case XCAM_3A_RESULT_3D_NOISE_REDUCTION:
|
result = create_3d_noise_reduction ((XCam3aResultTemporalNoiseReduction*)from);
|
break;
|
case XCAM_3A_RESULT_TEMPORAL_NOISE_REDUCTION_YUV:
|
result = create_yuv_temp_noise_reduction ((XCam3aResultTemporalNoiseReduction*)from);
|
break;
|
case XCAM_3A_RESULT_EDGE_ENHANCEMENT:
|
result = create_edge_enhancement ((XCam3aResultEdgeEnhancement*)from);
|
break;
|
case XCAM_3A_RESULT_MACC:
|
result = create_macc ((XCam3aResultMaccMatrix*)from);
|
break;
|
case XCAM_3A_RESULT_CHROMA_TONE_CONTROL:
|
result = create_chroma_tone_control ((XCam3aResultChromaToneControl*)from);
|
break;
|
case XCAM_3A_RESULT_Y_GAMMA:
|
result = create_y_gamma_table ((XCam3aResultGammaTable*)from);
|
break;
|
case XCAM_3A_RESULT_R_GAMMA:
|
result = create_r_gamma_table ((XCam3aResultGammaTable*)from);
|
break;
|
case XCAM_3A_RESULT_G_GAMMA:
|
result = create_g_gamma_table ((XCam3aResultGammaTable*)from);
|
break;
|
case XCAM_3A_RESULT_B_GAMMA:
|
result = create_b_gamma_table ((XCam3aResultGammaTable*)from);
|
break;
|
case XCAM_3A_RESULT_BAYER_NOISE_REDUCTION:
|
result = create_bayer_noise_reduction ((XCam3aResultBayerNoiseReduction*)from);
|
break;
|
case XCAM_3A_RESULT_BRIGHTNESS:
|
result = create_brightness ((XCam3aResultBrightness*)from);
|
break;
|
case XCAM_3A_RESULT_WAVELET_NOISE_REDUCTION:
|
result = create_wavelet_noise_reduction ((XCam3aResultWaveletNoiseReduction*)from);
|
break;
|
case XCAM_3A_RESULT_FACE_DETECTION:
|
result = create_face_detection ((XCamFDResult*)from);
|
break;
|
case XCAM_3A_RESULT_DVS:
|
result = create_digital_video_stabilizer ((XCamDVSResult*)from);
|
break;
|
default:
|
XCAM_LOG_WARNING ("create 3a result with unknown result type:%d", type);
|
break;
|
}
|
|
return result;
|
}
|
|
SmartPtr<X3aWhiteBalanceResult>
|
X3aResultFactory::create_whitebalance (XCam3aResultWhiteBalance *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aWhiteBalanceResult, XCAM_3A_RESULT_WHITE_BALANCE, from);
|
}
|
|
SmartPtr<X3aBlackLevelResult>
|
X3aResultFactory::create_blacklevel (XCam3aResultBlackLevel *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aBlackLevelResult, XCAM_3A_RESULT_BLACK_LEVEL, from);
|
}
|
|
SmartPtr<X3aColorMatrixResult>
|
X3aResultFactory::create_rgb2yuv_colormatrix (XCam3aResultColorMatrix *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aColorMatrixResult, XCAM_3A_RESULT_RGB2YUV_MATRIX, from);
|
}
|
|
SmartPtr<X3aColorMatrixResult>
|
X3aResultFactory::create_yuv2rgb_colormatrix (XCam3aResultColorMatrix *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aColorMatrixResult, XCAM_3A_RESULT_YUV2RGB_MATRIX, from);
|
}
|
|
SmartPtr<X3aExposureResult>
|
X3aResultFactory::create_exposure (XCam3aResultExposure *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aExposureResult, XCAM_3A_RESULT_EXPOSURE, from);
|
}
|
|
SmartPtr<X3aFocusResult>
|
X3aResultFactory::create_focus (XCam3aResultFocus *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aFocusResult, XCAM_3A_RESULT_FOCUS, from);
|
}
|
|
SmartPtr<X3aDemosaicResult>
|
X3aResultFactory::create_demosaicing (XCam3aResultDemosaic *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aDemosaicResult, XCAM_3A_RESULT_DEMOSAIC, from);
|
}
|
|
SmartPtr<X3aDefectPixelResult>
|
X3aResultFactory::create_defectpixel (XCam3aResultDefectPixel *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aDefectPixelResult, XCAM_3A_RESULT_DEFECT_PIXEL_CORRECTION, from);
|
}
|
|
SmartPtr<X3aNoiseReductionResult>
|
X3aResultFactory::create_noise_reduction (XCam3aResultNoiseReduction *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aNoiseReductionResult, XCAM_3A_RESULT_NOISE_REDUCTION, from);
|
}
|
|
SmartPtr<X3aTemporalNoiseReduction>
|
X3aResultFactory::create_3d_noise_reduction (XCam3aResultTemporalNoiseReduction *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aTemporalNoiseReduction, XCAM_3A_RESULT_3D_NOISE_REDUCTION, from);
|
}
|
|
SmartPtr<X3aTemporalNoiseReduction>
|
X3aResultFactory::create_yuv_temp_noise_reduction (XCam3aResultTemporalNoiseReduction *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aTemporalNoiseReduction, XCAM_3A_RESULT_TEMPORAL_NOISE_REDUCTION_YUV, from);
|
}
|
|
SmartPtr<X3aEdgeEnhancementResult>
|
X3aResultFactory::create_edge_enhancement (XCam3aResultEdgeEnhancement *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aEdgeEnhancementResult, XCAM_3A_RESULT_EDGE_ENHANCEMENT, from);
|
}
|
|
SmartPtr<X3aGammaTableResult>
|
X3aResultFactory::create_y_gamma_table (XCam3aResultGammaTable *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_Y_GAMMA, from);
|
}
|
|
SmartPtr<X3aGammaTableResult>
|
X3aResultFactory::create_r_gamma_table (XCam3aResultGammaTable *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_R_GAMMA, from);
|
}
|
|
SmartPtr<X3aGammaTableResult>
|
X3aResultFactory::create_g_gamma_table (XCam3aResultGammaTable *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_G_GAMMA, from);
|
}
|
|
SmartPtr<X3aGammaTableResult>
|
X3aResultFactory::create_b_gamma_table (XCam3aResultGammaTable *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aGammaTableResult, XCAM_3A_RESULT_B_GAMMA, from);
|
}
|
|
SmartPtr<X3aMaccMatrixResult>
|
X3aResultFactory::create_macc (XCam3aResultMaccMatrix *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aMaccMatrixResult, XCAM_3A_RESULT_MACC, from);
|
}
|
|
SmartPtr<X3aChromaToneControlResult>
|
X3aResultFactory::create_chroma_tone_control (XCam3aResultChromaToneControl *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aChromaToneControlResult, XCAM_3A_RESULT_CHROMA_TONE_CONTROL, from);
|
}
|
|
SmartPtr<X3aBayerNoiseReduction>
|
X3aResultFactory::create_bayer_noise_reduction (XCam3aResultBayerNoiseReduction *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aBayerNoiseReduction, XCAM_3A_RESULT_BAYER_NOISE_REDUCTION, from);
|
}
|
|
SmartPtr<X3aBrightnessResult>
|
X3aResultFactory::create_brightness (XCam3aResultBrightness *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aBrightnessResult, XCAM_3A_RESULT_BRIGHTNESS, from);
|
}
|
|
SmartPtr<X3aWaveletNoiseReduction>
|
X3aResultFactory::create_wavelet_noise_reduction (XCam3aResultWaveletNoiseReduction *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aWaveletNoiseReduction, XCAM_3A_RESULT_WAVELET_NOISE_REDUCTION, from);
|
}
|
|
SmartPtr<X3aFaceDetectionResult>
|
X3aResultFactory::create_face_detection (XCamFDResult *from)
|
{
|
uint32_t type = xcam_3a_result_type (from);
|
if (type != XCAM_3A_RESULT_FACE_DETECTION) {
|
XCAM_ASSERT (false);
|
XCAM_LOG_WARNING ("X3aResultFactory create face detection failed with wrong type");
|
}
|
|
X3aFaceDetectionResult *fd_res = new X3aFaceDetectionResult (
|
XCAM_3A_RESULT_FACE_DETECTION,
|
from->head.process_type,
|
from->face_num * sizeof (XCamFaceInfo));
|
fd_res->set_standard_result (*from);
|
|
return fd_res;
|
}
|
|
SmartPtr<X3aDVSResult>
|
X3aResultFactory::create_digital_video_stabilizer (XCamDVSResult *from)
|
{
|
XCAM_3A_RESULT_FACTORY (X3aDVSResult, XCAM_3A_RESULT_DVS, from);
|
}
|
};
|