diff --git a/cc/modules/io/ioBindings.h b/cc/modules/io/ioBindings.h index 7ad6ef40..1da5102d 100644 --- a/cc/modules/io/ioBindings.h +++ b/cc/modules/io/ioBindings.h @@ -10,7 +10,7 @@ namespace IoBindings { std::string path; int flags = cv::IMREAD_COLOR; cv::Mat img; - + std::string executeCatchCvExceptionWorker() { img = cv::imread(path, flags); if (img.rows == 0 && img.cols == 0) { @@ -18,41 +18,41 @@ namespace IoBindings { } return ""; } - + bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) { return StringConverter::arg(0, &path, info); } - + bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) { return IntConverter::optArg(1, &flags, info); } - + FF_VAL getReturnValue() { return Mat::Converter::wrap(img); } }; - + struct ImwriteWorker : CatchCvExceptionWorker { public: std::string path; cv::Mat img; std::vector flags; - + std::string executeCatchCvExceptionWorker() { cv::imwrite(path, img); return ""; } - + bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) { return StringConverter::arg(0, &path, info) || Mat::Converter::arg(1, &img, info); } - + bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) { return IntArrayConverter::optArg(2, &flags, info); } }; - + struct ImencodeWorker : CatchCvExceptionWorker { public: std::string ext; @@ -60,7 +60,7 @@ namespace IoBindings { std::vector flags; char *data; size_t dataSize; - + std::string executeCatchCvExceptionWorker() { std::vector dataVec; cv::imencode(ext, img, dataVec, flags); @@ -69,40 +69,44 @@ namespace IoBindings { memcpy(data, reinterpret_cast(dataVec.data()), dataSize); return ""; } - + bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) { return StringConverter::arg(0, &ext, info) || Mat::Converter::arg(1, &img, info); } - + bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) { return IntArrayConverter::optArg(2, &flags, info); } - + + static void freeBufferCallback(char* data, void* hint) { + free(data); + } + FF_VAL getReturnValue() { - return Nan::NewBuffer(data, dataSize).ToLocalChecked(); + return Nan::NewBuffer(data, dataSize, freeBufferCallback, 0).ToLocalChecked(); } }; - + struct ImdecodeWorker : CatchCvExceptionWorker { public: int flags; cv::Mat img; char *data; size_t dataSize; - + std::string executeCatchCvExceptionWorker() { std::vector vec(dataSize); memcpy(vec.data(), data, dataSize); img = cv::imdecode(vec, flags); return ""; } - + FF_VAL getReturnValue() { return Mat::Converter::wrap(img); } }; - + }