Home | History | Annotate | Download | only in xcore
      1 /*
      2  * x3a_image_process_center.cpp - 3a process center
      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 #include "x3a_image_process_center.h"
     21 
     22 namespace XCam {
     23 
     24 X3aImageProcessCenter::X3aImageProcessCenter()
     25     :   _callback (NULL)
     26 {
     27     XCAM_LOG_DEBUG ("X3aImageProcessCenter construction");
     28 }
     29 
     30 X3aImageProcessCenter::~X3aImageProcessCenter()
     31 {
     32     stop ();
     33     XCAM_LOG_DEBUG ("~X3aImageProcessCenter destruction");
     34 }
     35 
     36 bool
     37 X3aImageProcessCenter::set_image_callback (ImageProcessCallback *callback)
     38 {
     39     XCAM_ASSERT (!_callback);
     40     _callback = callback;
     41     return true;
     42 }
     43 
     44 bool
     45 X3aImageProcessCenter::insert_processor (SmartPtr<ImageProcessor> &processor)
     46 {
     47     _image_processors.push_back (processor);
     48     XCAM_LOG_INFO ("Add processor(%s) into image processor center", XCAM_STR (processor->get_name()));
     49     return true;
     50 }
     51 
     52 bool
     53 X3aImageProcessCenter::has_processors ()
     54 {
     55     return !_image_processors.empty();
     56 }
     57 
     58 XCamReturn
     59 X3aImageProcessCenter::start ()
     60 {
     61     XCamReturn ret = XCAM_RETURN_NO_ERROR;
     62 
     63     if (_image_processors.empty()) {
     64         XCAM_LOG_ERROR ("process center start failed, no processor found");
     65         return XCAM_RETURN_ERROR_PARAM;
     66     }
     67 
     68     for (ImageProcessorList::iterator i_pro = _image_processors.begin ();
     69             i_pro != _image_processors.end(); ++i_pro)
     70     {
     71         SmartPtr<ImageProcessor> &processor = *i_pro;
     72         XCAM_ASSERT (processor.ptr());
     73         processor->set_callback (this);
     74         ret = processor->start ();
     75         if (ret != XCAM_RETURN_NO_ERROR) {
     76             XCAM_LOG_ERROR ("processor(%s) start failed", XCAM_STR(processor->get_name()));
     77             break;
     78         }
     79     }
     80 
     81     if (ret != XCAM_RETURN_NO_ERROR)
     82         stop();
     83     else {
     84         XCAM_LOG_INFO ("3a process center started");
     85     }
     86 
     87     return ret;
     88 }
     89 
     90 XCamReturn
     91 X3aImageProcessCenter::stop ()
     92 {
     93     for (ImageProcessorList::iterator i_pro = _image_processors.begin ();
     94             i_pro != _image_processors.end(); ++i_pro)
     95     {
     96         SmartPtr<ImageProcessor> &processor = *i_pro;
     97         XCAM_ASSERT (processor.ptr());
     98         processor->stop ();
     99     }
    100 
    101     XCAM_LOG_INFO ("3a process center stopped");
    102 
    103     _image_processors.clear();
    104     return XCAM_RETURN_NO_ERROR;
    105 }
    106 
    107 bool
    108 X3aImageProcessCenter::put_buffer (SmartPtr<VideoBuffer> &buf)
    109 {
    110     XCAM_ASSERT (!_image_processors.empty());
    111     if (_image_processors.empty())
    112         return false;
    113 
    114     ImageProcessorList::iterator i_pro = _image_processors.begin ();
    115     SmartPtr<ImageProcessor> &processor = *i_pro;
    116     if (processor->push_buffer (buf) != XCAM_RETURN_NO_ERROR)
    117         return false;
    118     return true;
    119 }
    120 
    121 
    122 XCamReturn
    123 X3aImageProcessCenter::put_3a_results (X3aResultList &results)
    124 {
    125     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    126 
    127     XCAM_FAIL_RETURN (ERROR, !results.empty(), XCAM_RETURN_ERROR_PARAM, "results empty");
    128 
    129     for (ImageProcessorIter i_pro = _image_processors.begin();
    130             i_pro != _image_processors.end(); i_pro++) {
    131         SmartPtr<ImageProcessor> &processor = *i_pro;
    132         XCAM_ASSERT (processor.ptr());
    133         ret = processor->push_3a_results (results);
    134         if (ret != XCAM_RETURN_NO_ERROR && ret != XCAM_RETURN_BYPASS) {
    135             XCAM_LOG_WARNING ("processor(%s) gailed on results", XCAM_STR(processor->get_name()));
    136             break;
    137         }
    138         if (results.empty ()) {
    139             XCAM_LOG_DEBUG ("results done");
    140             return XCAM_RETURN_NO_ERROR;
    141         }
    142     }
    143 
    144     if (!results.empty()) {
    145         XCAM_LOG_DEBUG ("process center: results left without being processed");
    146         return XCAM_RETURN_BYPASS;
    147     }
    148 
    149     return XCAM_RETURN_NO_ERROR;
    150 }
    151 
    152 XCamReturn
    153 X3aImageProcessCenter::put_3a_result (SmartPtr<X3aResult> &result)
    154 {
    155     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    156 
    157     XCAM_FAIL_RETURN (ERROR, !result.ptr(), XCAM_RETURN_ERROR_PARAM, "result empty");
    158 
    159     for (ImageProcessorIter i_pro = _image_processors.begin();
    160             i_pro != _image_processors.end(); i_pro++)
    161     {
    162         SmartPtr<ImageProcessor> &processor = *i_pro;
    163         XCAM_ASSERT (processor.ptr());
    164         ret = processor->push_3a_result (result);
    165 
    166         if (ret == XCAM_RETURN_BYPASS)
    167             continue;
    168 
    169         if (ret == XCAM_RETURN_NO_ERROR)
    170             return XCAM_RETURN_NO_ERROR;
    171 
    172         XCAM_LOG_WARNING ("processor(%s) failed on result", XCAM_STR(processor->get_name()));
    173         return ret;
    174     }
    175 
    176     if (ret == XCAM_RETURN_BYPASS) {
    177         XCAM_LOG_WARNING ("processor center: no processor can handle result()");
    178     }
    179 
    180     return ret;
    181 }
    182 
    183 void
    184 X3aImageProcessCenter::process_buffer_done (ImageProcessor *processor, const SmartPtr<VideoBuffer> &buf)
    185 {
    186     ImageProcessorIter i_pro = _image_processors.begin();
    187     for (; i_pro != _image_processors.end(); ++i_pro)
    188     {
    189         SmartPtr<ImageProcessor> &cur_pro = *i_pro;
    190         XCAM_ASSERT (cur_pro.ptr());
    191         if (cur_pro.ptr() == processor)
    192             break;
    193     }
    194 
    195     XCAM_ASSERT (i_pro != _image_processors.end());
    196     if (i_pro == _image_processors.end()) {
    197         XCAM_LOG_ERROR ("processor doesn't found from list of image center");
    198         return;
    199     }
    200 
    201     if (++i_pro != _image_processors.end()) {
    202         SmartPtr<ImageProcessor> &next_processor = *i_pro;
    203         SmartPtr<VideoBuffer> cur_buf = buf;
    204         XCAM_ASSERT (next_processor.ptr());
    205         XCamReturn ret = next_processor->push_buffer (cur_buf);
    206         if (ret != XCAM_RETURN_NO_ERROR) {
    207             XCAM_LOG_ERROR ("processor(%s) failed in push_buffer", next_processor->get_name());
    208         }
    209         return;
    210     }
    211 
    212     //all processor done
    213     if (_callback)
    214         _callback->process_buffer_done (processor, buf);
    215     else
    216         ImageProcessCallback::process_buffer_done (processor, buf);
    217 }
    218 
    219 void
    220 X3aImageProcessCenter::process_buffer_failed (ImageProcessor *processor, const SmartPtr<VideoBuffer> &buf)
    221 {
    222     if (_callback)
    223         _callback->process_buffer_failed(processor, buf);
    224     else
    225         ImageProcessCallback::process_buffer_failed (processor, buf);
    226 }
    227 
    228 void
    229 X3aImageProcessCenter::process_image_result_done (ImageProcessor *processor, const SmartPtr<X3aResult> &result)
    230 {
    231     if (_callback)
    232         _callback->process_image_result_done(processor, result);
    233     else
    234         ImageProcessCallback::process_image_result_done (processor, result);
    235 }
    236 
    237 };
    238