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

本文详细介绍了Mediapipe框架中的Packet机制,探讨了如何在C++中实现input/output传输任意数据类型的问题。通过对RTTI dynamic_cast和void* + type两种方法的分析,指出它们的优缺点。最终,文章揭示了Mediapipe的Packet是如何通过template和TypeInfo实现统一的数据类型管理,确保在不支持RTTI的环境下也能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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() const {
   
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值