[源码] Meidapipe框架分析——Packet

Mediapipe Packet

参考:https://google.github.io/mediapipe/

mediapipe采用图架构实现,主要包括:

  • Calculator: 独立功能的计算单元,可以理解为图的节点,有多个input/ouput stream
  • Graph: 构建,管理Calculator,多个Calculator组合成Graph。
  • Packet: Calculator之间通过input/output stream相连,Packet是stream中传输的数据单元。

input/output任意数据类型?

目标:设计上Calculator有多个input/ouput,任何Calculator的input/ouput可以相连。

在java上有Object/instanceof,可以很容易用Object作为数据传递,instanceof确定类型。但c++上有什么实现方式?

1. RTTI dynamic_cast

可以使用dynamic_cast实现类似java的方式。

class Object {
   
}
class Data : public Object {
   
}

Object *input;
Data* input_data = dynamic_cast<Data*>(input);

缺点:dynamic_cast必须是类继承层次之间的转换,我们传递的数据必须继承Object,但如果我们想传递vector, shared_ptr这些stl库呢?

2. void* + type

更暴力的方法就是封装一个class直接传void*,但会有很大隐患,类型少的话用用也还勉强可以。

class Data {
   
    void* ptr;
    Type type;      //typeid(T) 或者 枚举

    void Data(ptr, type);
    void ~Data {
   
        switch (type) {
   
            delete ptr;
        }
    };
}

Packet实现

mediapipe中Packet采用封装,template的方法实现

相关代码:

type_util.h,TypeInfo做了1件事,每个type对应了唯一hashcode,而且也能在不支持rtti下实现。

//不支持rtti
class TypeInfo {
   
    size_t HashCode(
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值