Home | History | Annotate | Download | only in xcore
      1 /*
      2  * pipe_manager.cpp - pipe manager
      3  *
      4  *  Copyright (c) 2016 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  * Author: Yinhang Liu <yinhangx.liu (at) intel.com>
     20  */
     21 
     22 #include "pipe_manager.h"
     23 
     24 #define XCAM_FAILED_STOP(exp, msg, ...)                 \
     25     if ((exp) != XCAM_RETURN_NO_ERROR) {                \
     26         XCAM_LOG_ERROR (msg, ## __VA_ARGS__);           \
     27         stop ();                                        \
     28         return ret;                                     \
     29     }
     30 
     31 namespace XCam {
     32 
     33 PipeManager::PipeManager ()
     34     : _is_running (false)
     35 {
     36     _processor_center = new X3aImageProcessCenter;
     37     XCAM_LOG_DEBUG ("PipeManager construction");
     38 }
     39 
     40 PipeManager::~PipeManager ()
     41 {
     42     XCAM_LOG_DEBUG ("PipeManager destruction");
     43 }
     44 
     45 bool
     46 PipeManager::set_smart_analyzer (SmartPtr<SmartAnalyzer> analyzer)
     47 {
     48     if (is_running ())
     49         return false;
     50 
     51     XCAM_ASSERT (analyzer.ptr () && !_smart_analyzer.ptr ());
     52     _smart_analyzer = analyzer;
     53 
     54     return true;
     55 }
     56 
     57 bool
     58 PipeManager::add_image_processor (SmartPtr<ImageProcessor> processor)
     59 {
     60     if (is_running ())
     61         return false;
     62 
     63     XCAM_ASSERT (processor.ptr ());
     64     return _processor_center->insert_processor (processor);
     65 }
     66 
     67 XCamReturn
     68 PipeManager::start ()
     69 {
     70     XCamReturn ret = XCAM_RETURN_NO_ERROR;
     71 
     72     if (_smart_analyzer.ptr ()) {
     73         if (_smart_analyzer->prepare_handlers () != XCAM_RETURN_NO_ERROR) {
     74             XCAM_LOG_INFO ("prepare smart analyzer handler failed");
     75         }
     76 
     77         _smart_analyzer->set_results_callback (this);
     78         if (_smart_analyzer->init (1920, 1080, 25) != XCAM_RETURN_NO_ERROR) {
     79             XCAM_LOG_INFO ("initialize smart analyzer failed");
     80         }
     81         if (_smart_analyzer->start () != XCAM_RETURN_NO_ERROR) {
     82             XCAM_LOG_INFO ("start smart analyzer failed");
     83         }
     84     }
     85 
     86     if (!_processor_center->has_processors ()) {
     87         XCAM_LOG_ERROR ("image processors empty");
     88     }
     89     _processor_center->set_image_callback (this);
     90     XCAM_FAILED_STOP (ret = _processor_center->start (), "3A process center start failed");
     91 
     92     _is_running = true;
     93 
     94     XCAM_LOG_DEBUG ("pipe manager started");
     95     return XCAM_RETURN_NO_ERROR;
     96 }
     97 
     98 XCamReturn
     99 PipeManager::stop ()
    100 {
    101     _is_running = false;
    102 
    103     if (_smart_analyzer.ptr ()) {
    104         _smart_analyzer->stop ();
    105         _smart_analyzer->deinit ();
    106     }
    107 
    108     if (_processor_center.ptr ())
    109         _processor_center->stop ();
    110 
    111     XCAM_LOG_DEBUG ("pipe manager stopped");
    112     return XCAM_RETURN_NO_ERROR;
    113 }
    114 
    115 XCamReturn
    116 PipeManager::push_buffer (SmartPtr<VideoBuffer> &buf)
    117 {
    118     // need to add sync mode later
    119 
    120     if (_processor_center->put_buffer (buf) == false) {
    121         XCAM_LOG_WARNING ("push buffer failed");
    122         return XCAM_RETURN_ERROR_UNKNOWN;
    123     }
    124 
    125     return XCAM_RETURN_NO_ERROR;
    126 }
    127 
    128 XCamReturn
    129 PipeManager::scaled_image_ready (const SmartPtr<VideoBuffer> &buffer)
    130 {
    131     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    132     if (!_smart_analyzer.ptr ()) {
    133         return XCAM_RETURN_NO_ERROR;
    134     }
    135 
    136     ret = _smart_analyzer->push_buffer (buffer);
    137     XCAM_FAIL_RETURN (
    138         ERROR, ret == XCAM_RETURN_NO_ERROR,
    139         ret, "push scaled buffer failed");
    140 
    141     return XCAM_RETURN_NO_ERROR;
    142 }
    143 
    144 void
    145 PipeManager::x3a_calculation_done (XAnalyzer *analyzer, X3aResultList &results)
    146 {
    147     XCamReturn ret = _processor_center->put_3a_results (results);
    148     if (ret != XCAM_RETURN_NO_ERROR && ret != XCAM_RETURN_BYPASS) {
    149         XCAM_LOG_WARNING ("apply 3a results failed");
    150         return;
    151     }
    152     AnalyzerCallback::x3a_calculation_done (analyzer, results);
    153 }
    154 
    155 void
    156 PipeManager::x3a_calculation_failed (XAnalyzer *analyzer, int64_t timestamp, const char *msg)
    157 {
    158     AnalyzerCallback::x3a_calculation_failed (analyzer, timestamp, msg);
    159 }
    160 
    161 void
    162 PipeManager::process_buffer_done (ImageProcessor *processor, const SmartPtr<VideoBuffer> &buf)
    163 {
    164     ImageProcessCallback::process_buffer_done (processor, buf);
    165     post_buffer (buf);
    166 }
    167 
    168 void
    169 PipeManager::process_buffer_failed (ImageProcessor *processor, const SmartPtr<VideoBuffer> &buf)
    170 {
    171     ImageProcessCallback::process_buffer_failed (processor, buf);
    172 }
    173 
    174 void
    175 PipeManager::process_image_result_done (ImageProcessor *processor, const SmartPtr<X3aResult> &result)
    176 {
    177     ImageProcessCallback::process_image_result_done (processor, result);
    178 }
    179 
    180 };
    181