更新时间:2021-03-18 GMT+08:00
分享

调用示例

/**
* @file multi_input_output_engine_example.h
*
* Copyright(c)<2018>, <Huawei Technologies Co.,Ltd>
*
* @version 1.0
*
* @date 2018-4-25
*/


#ifndef MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_H_
#define MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_H_

#include "hiaiengine/engine.h"
#include "hiaiengine/data_type.h"
#include "hiaiengine/multitype_queue.h"

#define MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_INPUT_SIZE 3
#define MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_OUTPUT_SIZE 2

namespace hiai {
// Define New Engine
class HIAIMultiEngineExample : public Engine {

public:
    HIAIMultiEngineExample() :
        input_que_(MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_INPUT_SIZE) {}

    // 重载父类Engine的Init
    HIAI_StatusT Init(const AIConfig& config,
        const std::vector<AIModelDescription>& model_desc)
    {
        return HIAI_OK;
    }

    /**
    * @ingroup hiaiengine
    * @brief HIAI_DEFINE_PROCESS
    * @[in]: 定义一个输入端口,一个输出端口
    */
    HIAI_DEFINE_PROCESS(MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_INPUT_SIZE, MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_OUTPUT_SIZE)
private:

    // 私有实现一个成员变量,用来缓存输入队列
    hiai::MultiTypeQueue input_que_;
};

}

#endif //MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_H_
/**
* @file multi_input_output_engine_example.h
*
* Copyright(c)<2018>, <Huawei Technologies Co.,Ltd>
*
* @version 1.0
*
* @date 2018-4-25
*/

#include "multi_input_output_engine_example.h"
#include "use_def_data_type.h"
#include "use_def_errorcode.h"

namespace hiai {

/**
* @ingroup hiaiengine
* @brief HIAI_DEFINE_PROCESS : 实现多端口输入输出处理流程
* @[in]: 定义一个输入端口,一个输出端口,
*        并该Engine注册,其名为“HIAIMultiEngineExample”
*/
HIAI_IMPL_ENGINE_PROCESS("HIAIMultiEngineExample", HIAIMultiEngineExample, MULTI_INPUT_OUTPUT_ENGINE_EXAMPLE_INPUT_SIZE)
{
    // This Engine has three input args and two output 

    // 每个端口接收到的数据可能不是同一个时刻,因此某些输入端口可能是空的
    input_que_.PushData(0,arg0);
    input_que_.PushData(1,arg1);
    input_que_.PushData(2,arg2);

    std::shared_ptr<void> input_arg1;
    std::shared_ptr<void> input_arg2;
    std::shared_ptr<void> input_arg3;

    // 仅当三个端口都有输入数据时才继续后续处理,方式一
    if (!input_que_.PopAllData(input_arg1, input_arg2, input_arg3))
    {
        HIAI_ENGINE_LOG(this, HIAI_INVALID_INPUT_MSG, "fail to process");
        return HIAI_INVALID_INPUT_MSG;
    }

    // 仅当三个端口都有输入数据时才继续后续处理,方式二
/*
    if (!(input_que_.FrontData(0, input_arg1) && input_que_.FrontData(1, input_arg2) && input_que_.FrontData(2, input_arg3)))
    {
        HIAI_ENGINE_LOG(this, HIAI_INVALID_INPUT_MSG, "fail to process");
        return HIAI_INVALID_INPUT_MSG;
    } else {
         input_que_.PopData(0, input_arg1);
         input_que_.PopData(1, input_arg2);
         input_que_.PopData(2, input_arg3);
    }
*/
    // 
    // 中间业务逻辑可以直接调用 DVPP API或AIModelManger API 处理。
    // 

    // 分配内存用来保存结果
    std::shared_ptr<UseDefDataTypeT> output1 =
        std::make_shared<UseDefDataTypeT>();

    std::shared_ptr<UseDefTemplateDataType<uint64_t, uint64_t, uint64_t>> output2 =
        std::make_shared<UseDefTemplateDataType<uint64_t, uint64_t, uint64_t>>();

    // 填充输出数据结构,例如简单赋值
    *output1 = *input_arg2;
    *output2 = *input_arg3;

    // 将输出端口发送到端口0
    hiai::Engine::SendData(0, "UseDefDataTypeT", std::static_pointer_cast<void>(output1));

    // 将输出端口发送到端口1
    hiai::Engine::SendData(1, "UseDefTemplateDataType_uint64_t_uint64_t_uint64_t",
        std::static_pointer_cast<void>(output2));

    return HIAI_OK;
}

}
分享:

    相关文档

    相关产品