std::shared_ptr<BaseDataType> _output;
// _results should be updated by user callback.
std::vector<std::shared_ptr<BaseResultType> > _results;
- void *_user_data { nullptr };
bool _completed { false };
std::condition_variable _event;
std::mutex _mutex;
void wait() override;
void wakeup() override;
- void setCb(const NodeCb &cb, void *user_data);
+ void setCb(const NodeCb &cb);
NodeCb getCb();
- void setUserData(void *user_data);
- void *getUserData();
std::vector<std::shared_ptr<BaseResultType> > &getResults();
void addResult(std::shared_ptr<BaseResultType> result);
};
} else if (node->getType() == NodeType::CB) {
auto callbackNode = dynamic_pointer_cast<CallbackNode>(node);
NodeCb cb = callbackNode->getCb();
- void *user_data = callbackNode->getUserData();
-
- if (!cb || !user_data) {
- SINGLEO_LOGE("Callback function or user data is null.");
- throw InvalidOperation("Callback function or user data is null.");
+ if (!cb) {
+ SINGLEO_LOGE("Callback function is null.");
+ throw InvalidOperation("Callback function is null.");
}
for (auto &n : node->getDependencies()) {
// Call the callback function registered in this callback node.
// In this callback, new data should be set by calling node->setOutput()
// if new data is made. TODO. consider for multiple inputs later.
- cb(user_data);
+ cb(node);
}
// Wake up.
using namespace singleo::inference;
using namespace singleo::services;
-void BridgeNodeCallback(void *user_data)
+void BridgeNodeCallback(shared_ptr<INode> &node)
{
- CallbackNode *node = static_cast<CallbackNode *>(user_data);
- shared_ptr<ImageDataType> imageData = dynamic_pointer_cast<ImageDataType>(node->getInputs()[0]);
+ auto callbackNode = dynamic_pointer_cast<CallbackNode>(node);
+ shared_ptr<ImageDataType> imageData = dynamic_pointer_cast<ImageDataType>(callbackNode->getInputs()[0]);
size_t buffer_size = imageData->width * imageData->height * imageData->byte_per_pixel;
ImageDataType newImage;
cout << "Face detection result" << endl;
- auto &results = node->getResults();
+ auto &results = callbackNode->getResults();
for (auto r : results) {
if (r->_type != ResultType::FACE_DETECTION) {
cout << "invalid result type" << endl;
cout << rect.left << " x " << rect.top << " ~ " << rect.right << " x " << rect.bottom << endl;
}
- node->setOutput(make_shared<ImageDataType>(newImage));
+ callbackNode->setOutput(make_shared<ImageDataType>(newImage));
}
// GraphA : input ----> face_detection ----> callback ----> face_landmark_detection ----> output
auto callback_node = make_shared<CallbackNode>();
callback_node->setName("callback");
- callback_node->setCb(BridgeNodeCallback, callback_node.get());
+ callback_node->setCb(BridgeNodeCallback);
callback_node->addDependency(face_detection_node);
taskManager->addNode(callback_node);
auto callback_node = make_shared<CallbackNode>();
callback_node->setName("callback");
- callback_node->setCb(BridgeNodeCallback, callback_node.get());
+ callback_node->setCb(BridgeNodeCallback);
callback_node->addDependency(face_detection_node_a);
callback_node->addDependency(face_detection_node_b);
taskManager->addNode(callback_node);
}
}
-void LastNodeCallback(void *user_data)
+void LastNodeCallback(shared_ptr<INode> &node)
{
- CallbackNode *node = static_cast<CallbackNode *>(user_data);
-
- auto &results = node->getResults();
+ auto callbackNode = dynamic_pointer_cast<CallbackNode>(node);
+ auto &results = callbackNode->getResults();
cout << "result count = " << results.size() << endl;
auto bridge_callback_node = make_shared<CallbackNode>();
bridge_callback_node->setName("bridge_callback");
- bridge_callback_node->setCb(BridgeNodeCallback, bridge_callback_node.get());
+ bridge_callback_node->setCb(BridgeNodeCallback);
bridge_callback_node->addDependency(face_detection_node);
taskManager->addNode(bridge_callback_node);
auto lase_callback_node = make_shared<CallbackNode>();
lase_callback_node->setName("last_callback");
- lase_callback_node->setCb(LastNodeCallback, lase_callback_node.get());
+ lase_callback_node->setCb(LastNodeCallback);
lase_callback_node->addDependency(face_detection_node);
lase_callback_node->addDependency(face_landmark_node);
taskManager->addNode(lase_callback_node);