wangrong
2025-01-18 8b0e31121a9a29b92a41fc575138a2e9b4c12d8e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
 
#include "vp_meta_publisher.h"
 
namespace vp_nodes {
    vp_meta_publisher::vp_meta_publisher(/* args */) {
 
    }
 
    vp_meta_publisher::~vp_meta_publisher() {
 
    }
 
    void vp_meta_publisher::add_subscriber(std::shared_ptr<vp_meta_subscriber> subscriber) {
        std::lock_guard<std::mutex> guard(this->subscribers_lock);
        this->subscribers.push_back(subscriber);
    }
 
    void vp_meta_publisher::remove_subscriber(std::shared_ptr<vp_meta_subscriber> subscriber) {
        std::lock_guard<std::mutex> guard(this->subscribers_lock);
        for (auto i = this->subscribers.begin(); i != this->subscribers.end();) {
            if(*i == subscriber) {
                i = this->subscribers.erase(i);
            }
            else {
                i++;
            }
        }     
    }
 
    // by default, we push meta to next nodes indiscriminately, each next node has the same meta pointer.
    // in some situations, we need push meta depend on condition, refer to vp_split_node which would push meta by channel index or push a deep copy pf meta(new pointer to new memory). 
    void vp_meta_publisher::push_meta(std::shared_ptr<vp_objects::vp_meta> meta) {
        std::lock_guard<std::mutex> guard(this->subscribers_lock);
        for (auto i = this->subscribers.begin(); i != this->subscribers.end(); i++) {
            (*i)->meta_flow(meta);
        }
    }
}