Skip to content

Commit c2645ca

Browse files
committed
Migrate vector<uint8> to OwningArrayBuffer
1 parent d0d7533 commit c2645ca

File tree

4 files changed

+21
-22
lines changed

4 files changed

+21
-22
lines changed

packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -471,10 +471,8 @@ getJsiValue(const std::vector<models::instance_segmentation::types::Instance>
471471
instance.setProperty(runtime, "bbox",
472472
getJsiValue(instances[i].bbox, runtime));
473473

474-
// Mask as Uint8Array
475-
auto maskBuffer = std::make_shared<OwningArrayBuffer>(
476-
instances[i].mask.data(), instances[i].mask.size());
477-
jsi::ArrayBuffer arrayBuffer(runtime, maskBuffer);
474+
// Mask as Uint8Array - reuse existing OwningArrayBuffer
475+
jsi::ArrayBuffer arrayBuffer(runtime, instances[i].mask);
478476
auto uint8ArrayCtor =
479477
runtime.global().getPropertyAsFunction(runtime, "Uint8Array");
480478
auto uint8Array = uint8ArrayCtor.callAsConstructor(runtime, arrayBuffer)

packages/react-native-executorch/common/rnexecutorch/models/instance_segmentation/BaseInstanceSegmentation.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,11 +364,10 @@ std::vector<types::Instance> BaseInstanceSegmentation::postprocess(
364364
logitsMat, bboxModel, bboxOriginal, modelInputSize, originalSize,
365365
returnMaskAtOriginalResolution);
366366

367-
instances.emplace_back(
368-
bboxOriginal,
369-
std::vector<uint8_t>(binaryMask.data,
370-
binaryMask.data + binaryMask.total()),
371-
binaryMask.cols, binaryMask.rows, labelIdx, score);
367+
instances.emplace_back(bboxOriginal,
368+
std::make_shared<OwningArrayBuffer>(
369+
binaryMask.data, binaryMask.total()),
370+
binaryMask.cols, binaryMask.rows, labelIdx, score);
372371
}
373372

374373
return finalizeInstances(std::move(instances), iouThreshold, maxInstances);

packages/react-native-executorch/common/rnexecutorch/models/instance_segmentation/Types.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#pragma once
22

33
#include <cstdint>
4+
#include <memory>
5+
#include <rnexecutorch/jsi/OwningArrayBuffer.h>
46
#include <rnexecutorch/utils/computer_vision/Types.h>
5-
#include <vector>
67

78
namespace rnexecutorch::models::instance_segmentation::types {
89

@@ -13,17 +14,17 @@ namespace rnexecutorch::models::instance_segmentation::types {
1314
* and confidence score.
1415
*/
1516
struct Instance {
16-
utils::computer_vision::BBox bbox; ///< Bounding box coordinates
17-
std::vector<uint8_t> mask; ///< Binary mask (0 or 1) for the instance
18-
int32_t maskWidth; ///< Width of the mask array
19-
int32_t maskHeight; ///< Height of the mask array
20-
int32_t classIndex; ///< Model output class index
21-
float score; ///< Confidence score [0, 1]
17+
utils::computer_vision::BBox bbox;
18+
std::shared_ptr<OwningArrayBuffer> mask;
19+
int32_t maskWidth;
20+
int32_t maskHeight;
21+
int32_t classIndex;
22+
float score;
2223

2324
Instance() = default;
24-
Instance(utils::computer_vision::BBox bbox, std::vector<uint8_t> mask,
25-
int32_t maskWidth, int32_t maskHeight, int32_t classIndex,
26-
float score)
25+
Instance(utils::computer_vision::BBox bbox,
26+
std::shared_ptr<OwningArrayBuffer> mask, int32_t maskWidth,
27+
int32_t maskHeight, int32_t classIndex, float score)
2728
: bbox(bbox), mask(std::move(mask)), maskWidth(maskWidth),
2829
maskHeight(maskHeight), classIndex(classIndex), score(score) {}
2930
};

packages/react-native-executorch/common/rnexecutorch/tests/integration/InstanceSegmentationTest.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,11 @@ TEST(InstanceSegResultTests, InstancesHaveValidMasks) {
161161
for (const auto &inst : results) {
162162
EXPECT_GT(inst.maskWidth, 0);
163163
EXPECT_GT(inst.maskHeight, 0);
164-
EXPECT_EQ(inst.mask.size(),
164+
EXPECT_EQ(inst.mask->size(),
165165
static_cast<size_t>(inst.maskWidth) * inst.maskHeight);
166166

167-
for (uint8_t val : inst.mask) {
167+
for (size_t i = 0; i < inst.mask->size(); ++i) {
168+
uint8_t val = inst.mask->data()[i];
168169
EXPECT_TRUE(val == 0 || val == 1);
169170
}
170171
}
@@ -222,7 +223,7 @@ TEST(InstanceSegMaskTests, LowResMaskIsSmallerThanOriginal) {
222223
kMethodName);
223224

224225
if (!hiRes.empty() && !loRes.empty()) {
225-
EXPECT_LE(loRes[0].mask.size(), hiRes[0].mask.size());
226+
EXPECT_LE(loRes[0].mask->size(), hiRes[0].mask->size());
226227
}
227228
}
228229

0 commit comments

Comments
 (0)