更新时间: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; } }
父主题: Engine实现接口(C++语言)