Drop unnecessary arguments from callback for CallbackNode.
Now CallbackNode can act like normal node such as InferenceNode
so drop the unnecessary arguments and get them(input and result)
from CallbackNode itself.
This patch is a step for separating CallbackNode into two nodes
- BridgeNode and EndpointNode - as I shared already, which will drop
the code smell that CallbackNode has two kinds of behaviors.
Change-Id: I25bbc87a1f1d9a82e5c7340b39b8d789599db933
Signed-off-by: Inki Dae <inki.dae@samsung.com>
{
return _name;
}
- void addInput(std::shared_ptr<BaseDataType> input)
- {
- throw exception::InvalidOperation("Not supported.");
- }
+ void addInput(std::shared_ptr<BaseDataType> input) override;
std::vector<std::shared_ptr<BaseDataType> > &getInputs() override;
void addDependency(std::shared_ptr<INode> node) override;
std::vector<std::shared_ptr<INode> > &getDependencies() override;
NodeCb getCb();
void setUserData(void *user_data);
void *getUserData();
- std::vector<std::shared_ptr<BaseResultType> > &getResult();
+ std::vector<std::shared_ptr<BaseResultType> > &getResults();
void addResult(std::shared_ptr<BaseResultType> result);
};
{
enum class NodeType { NONE, INFERENCE, CB };
-using NodeCb = std::function<void(std::vector<BaseResultType *> &results, std::shared_ptr<BaseDataType> input,
- void *user_data)>;
+using NodeCb = std::function<void(void *user_data)>;
class INode
{
return _type;
}
+void CallbackNode::addInput(shared_ptr<BaseDataType> input)
+{
+ _inputs.push_back(input);
+}
+
vector<shared_ptr<BaseDataType> > &CallbackNode::getInputs()
{
return _inputs;
_results.push_back(result);
}
-vector<shared_ptr<BaseResultType> > &CallbackNode::getResult()
+vector<shared_ptr<BaseResultType> > &CallbackNode::getResults()
{
return _results;
}
throw InvalidOperation("Callback function or user data is null.");
}
- vector<BaseResultType *> results;
-
for (auto &n : node->getDependencies()) {
// Add the result if dependency node is inference service not callback.
if (n->getType() == NodeType::INFERENCE) {
auto inferenceNode = dynamic_pointer_cast<InferenceNode>(n);
- results.push_back(&inferenceNode->getInferenceTask()->result());
+ auto &result = inferenceNode->getInferenceTask()->result();
+
+ if (result._type == ResultType::FACE_DETECTION)
+ callbackNode->addResult(make_shared<FdResultType>(
+ dynamic_cast<FdResultType &>(inferenceNode->getInferenceTask()->result())));
+ else if (result._type == ResultType::FACE_LANDMARK)
+ callbackNode->addResult(make_shared<FldResultType>(
+ dynamic_cast<FldResultType &>(inferenceNode->getInferenceTask()->result())));
+ else if (result._type == ResultType::OBJECT_DETECTION)
+ callbackNode->addResult(make_shared<OdResultType>(
+ dynamic_cast<OdResultType &>(inferenceNode->getInferenceTask()->result())));
}
}
+ // TODO. consider for mulitple inputs later.
+ node->addInput(_inputs[0]);
+
// 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(results, _inputs[0], user_data);
+ cb(user_data);
}
// Wake up.
} else {
auto callbackNode = dynamic_pointer_cast<CallbackNode>(lastNode);
- _results = callbackNode->getResult();
+ _results = callbackNode->getResults();
}
return _results;
using namespace singleo::inference;
using namespace singleo::services;
-void BridgeNodeCallback(vector<BaseResultType *> &results, shared_ptr<BaseDataType> inputData, void *user_data)
+void BridgeNodeCallback(void *user_data)
{
- shared_ptr<ImageDataType> imageData = dynamic_pointer_cast<ImageDataType>(inputData);
- size_t buffer_size = imageData->width * imageData->height * imageData->byte_per_pixel;
CallbackNode *node = static_cast<CallbackNode *>(user_data);
+ shared_ptr<ImageDataType> imageData = dynamic_pointer_cast<ImageDataType>(node->getInputs()[0]);
+ size_t buffer_size = imageData->width * imageData->height * imageData->byte_per_pixel;
ImageDataType newImage;
newImage = *imageData;
cv::Mat cv_image(cv::Size(newImage.width, newImage.height), CV_MAKETYPE(CV_8U, 3), newImage.ptr);
cout << "Face detection result" << endl;
+
+ auto &results = node->getResults();
for (auto r : results) {
if (r->_type != ResultType::FACE_DETECTION) {
cout << "invalid result type" << endl;
continue;
}
- FdResultType *f_r = dynamic_cast<FdResultType *>(r);
+ auto f_r = dynamic_pointer_cast<FdResultType>(r);
for (auto rect : f_r->_rects)
cout << rect.left << " x " << rect.top << " ~ " << rect.right << " x " << rect.bottom << endl;
}
}
-void LastNodeCallback(vector<BaseResultType *> &results, shared_ptr<BaseDataType> inputData, void *user_data)
+void LastNodeCallback(void *user_data)
{
CallbackNode *node = static_cast<CallbackNode *>(user_data);
- for (auto &r : results) {
- ASSERT_EQ((r->_type == ResultType::FACE_DETECTION || r->_type == ResultType::FACE_LANDMARK), true);
+ auto &results = node->getResults();
- if (r->_type == ResultType::FACE_DETECTION) {
- auto fdResult = dynamic_cast<FdResultType *>(r);
- node->addResult(make_shared<FdResultType>(*fdResult));
- } else {
- auto fldResult = dynamic_cast<FldResultType *>(r);
- node->addResult(make_shared<FldResultType>(*fldResult));
- }
- }
+ cout << "result count = " << results.size() << endl;
+
+ // Nothing to do in case of last node.
+ // So do anything you want here if you want to do something in last node.
}
// GraphC: