Skip to content

Commit 20d45a0

Browse files
provide freeBufferCallback to Nan::NewBuffer to fix imencode crashes in electron when buffer is released
1 parent 2aa1aed commit 20d45a0

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

cc/modules/io/ioBindings.h

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,57 +10,57 @@ namespace IoBindings {
1010
std::string path;
1111
int flags = cv::IMREAD_COLOR;
1212
cv::Mat img;
13-
13+
1414
std::string executeCatchCvExceptionWorker() {
1515
img = cv::imread(path, flags);
1616
if (img.rows == 0 && img.cols == 0) {
1717
return "empty Mat";
1818
}
1919
return "";
2020
}
21-
21+
2222
bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
2323
return StringConverter::arg(0, &path, info);
2424
}
25-
25+
2626
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
2727
return IntConverter::optArg(1, &flags, info);
2828
}
29-
29+
3030
FF_VAL getReturnValue() {
3131
return Mat::Converter::wrap(img);
3232
}
3333
};
34-
34+
3535
struct ImwriteWorker : CatchCvExceptionWorker {
3636
public:
3737
std::string path;
3838
cv::Mat img;
3939
std::vector<int> flags;
40-
40+
4141
std::string executeCatchCvExceptionWorker() {
4242
cv::imwrite(path, img);
4343
return "";
4444
}
45-
45+
4646
bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
4747
return StringConverter::arg(0, &path, info)
4848
|| Mat::Converter::arg(1, &img, info);
4949
}
50-
50+
5151
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
5252
return IntArrayConverter::optArg(2, &flags, info);
5353
}
5454
};
55-
55+
5656
struct ImencodeWorker : CatchCvExceptionWorker {
5757
public:
5858
std::string ext;
5959
cv::Mat img;
6060
std::vector<int> flags;
6161
char *data;
6262
size_t dataSize;
63-
63+
6464
std::string executeCatchCvExceptionWorker() {
6565
std::vector<uchar> dataVec;
6666
cv::imencode(ext, img, dataVec, flags);
@@ -69,40 +69,44 @@ namespace IoBindings {
6969
memcpy(data, reinterpret_cast<char*>(dataVec.data()), dataSize);
7070
return "";
7171
}
72-
72+
7373
bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
7474
return StringConverter::arg(0, &ext, info)
7575
|| Mat::Converter::arg(1, &img, info);
7676
}
77-
77+
7878
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
7979
return IntArrayConverter::optArg(2, &flags, info);
8080
}
81-
81+
82+
static void freeBufferCallback(char* data, void* hint) {
83+
free(data);
84+
}
85+
8286
FF_VAL getReturnValue() {
83-
return Nan::NewBuffer(data, dataSize).ToLocalChecked();
87+
return Nan::NewBuffer(data, dataSize, freeBufferCallback, 0).ToLocalChecked();
8488
}
8589
};
86-
90+
8791
struct ImdecodeWorker : CatchCvExceptionWorker {
8892
public:
8993
int flags;
9094
cv::Mat img;
9195
char *data;
9296
size_t dataSize;
93-
97+
9498
std::string executeCatchCvExceptionWorker() {
9599
std::vector<uchar> vec(dataSize);
96100
memcpy(vec.data(), data, dataSize);
97101
img = cv::imdecode(vec, flags);
98102
return "";
99103
}
100-
104+
101105
FF_VAL getReturnValue() {
102106
return Mat::Converter::wrap(img);
103107
}
104108
};
105-
109+
106110

107111
}
108112

0 commit comments

Comments
 (0)