#ifndef __SINGLEO_COMMON_TYPES_H__
#define __SINGLEO_COMMON_TYPES_H__
+#include <cstring>
#include <vector>
+#include "SingleoLog.h"
+#include "SingleoException.h"
namespace singleo
{
};
struct ImageDataType : public BaseDataType {
- ImageDataType() : BaseDataType(DataType::IMAGE)
- {}
unsigned char *ptr {};
unsigned int width {};
unsigned int height {};
unsigned int byte_per_pixel {};
ImagePixelFormat pixel_format { ImagePixelFormat::NONE };
bool custom { false };
+
+ ImageDataType() : BaseDataType(DataType::IMAGE)
+ {}
+
+ ImageDataType(const ImageDataType &other) : BaseDataType(DataType::IMAGE)
+ {
+ unsigned int size = other.width * other.height * other.byte_per_pixel;
+ if (size == 0) {
+ SINGLEO_LOGE("ImageDataType::operator=() : Invalid size");
+ throw singleo::exception::InvalidOperation("ImageDataType::operator=() : Invalid size");
+ }
+
+ ptr = new unsigned char[size];
+ memcpy(ptr, other.ptr, size);
+
+ width = other.width;
+ height = other.height;
+ byte_per_pixel = other.byte_per_pixel;
+ pixel_format = other.pixel_format;
+ }
+
+ ImageDataType &operator=(const ImageDataType &other) = delete;
};
struct RawDataType : public BaseDataType {
{
ImagePreprocessor preprocessor(data);
ImageDataType preprocessed = dynamic_cast<ImageDataType &>(preprocessor.getData());
- ImageDataType copied = preprocessed;
- size_t buffer_size = copied.width * copied.height * copied.byte_per_pixel;
-
- // We have to avoid from grapping input feed stream so copy the captured data to new one.
- // Ps. This allocated buffer should be released as soon as the completion of invoke in async manager's thread loop.
- copied.ptr = new unsigned char[buffer_size];
- memcpy(copied.ptr, preprocessed.ptr, buffer_size);
+ ImageDataType copied(preprocessed);
if (_user_cb) {
// if postprocessor isn't in progress, postprocess current camera preview image.
}
// Make sure to release copied buffer if incoming queue isn't empty so skipped pushing the buffer.
+ // If empty then push the buffer to the incoming queue. This buffer will be released at the end of runTaskManager function.
if (_async_manager->pushInput(copied) != SINGLEO_ERROR_NONE)
delete copied.ptr;
}
auto_zoom->runTaskManager(data);
- // This buffer was allocated and copied in inputServiceCb callback.
- // So make sure to release this buffer here.
- auto specific_data = dynamic_cast<ImageDataType &>(data);
+ auto imageData = dynamic_cast<ImageDataType &>(data);
- delete specific_data.ptr;
+ // A given imageData has been used so release it here.
+ delete imageData.ptr;
});
}
{
// TODO. consider for multiple inputs later.
_task->invoke(*_inputs[0]);
+
+ auto input = dynamic_pointer_cast<ImageDataType>(_inputs[0]);
+
+ // Inference request has been completed so release input data if the data was internally allocated
+ // by callback node.
+ if (input->custom)
+ delete input->ptr;
+
+ _inputs.clear();
}
BaseResultType &InferenceNode::getTaskResult()
}
node->invoke();
-
- auto input = dynamic_pointer_cast<ImageDataType>(node->getInputs()[0]);
-
- // Inference request has been completed so release input data if the data was internally allocated by callback node.
- if (input->custom)
- delete input->ptr;
-
- // Service request to 'input' has been completed so clean up it.
- node->getInputs().clear();
node->wakeup();
return;
degreeMap[d_node]++;
if (d_node->getType() != NodeType::INFERENCE && d_node->getType() != NodeType::TRAINING) {
- SINGLEO_LOGE("The bridge node should be located between two task nodes such as InferenceNode or TrainingNode.");
- throw InvalidOperation("The bridge node should be located between two task nodes such as InferenceNode or TrainingNode.");
+ SINGLEO_LOGE(
+ "The bridge node should be located between two task nodes such as InferenceNode or TrainingNode.");
+ throw InvalidOperation(
+ "The bridge node should be located between two task nodes such as InferenceNode or TrainingNode.");
}
}
} else if (node->getType() == NodeType::INFERENCE || node->getType() == NodeType::TRAINING) {
{
auto callbackNode = dynamic_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;
+ ImageDataType newImage(*imageData);
const int answer[][4] = { { 553, 87, 583, 129 }, { 397, 110, 427, 149 } };
- newImage = *imageData;
- newImage.ptr = new unsigned char[buffer_size];
- memcpy(newImage.ptr, imageData->ptr, buffer_size);
newImage.custom = true;
cv::Mat cv_image(cv::Size(newImage.width, newImage.height), CV_MAKETYPE(CV_8U, 3), newImage.ptr);