Fixed premature deallocation of C++ masks in iOS Image Segmenter

This commit is contained in:
Prianka Liz Kariat 2023-09-19 19:59:07 +05:30
parent d5fa4a157e
commit 6e80941215

View File

@ -243,16 +243,18 @@ using ::mediapipe::tasks::core::PacketsCallback;
return; return;
} }
PacketMap &outputPacketMap = liveStreamResult.value(); // Output packet map is moved to a block variable that will not be deallocated for the lifetime of the `dispatch_async` call. Eventhough masks are not copied, we have to ensure that they are not de allocated before the delegate call completes.
__block PacketMap outputPacketMap = std::move(liveStreamResult.value());
if (outputPacketMap[kImageOutStreamName.cppString].IsEmpty()) { if (outputPacketMap[kImageOutStreamName.cppString].IsEmpty()) {
return; return;
} }
dispatch_async(_callbackQueue, ^{
MPPImageSegmenterResult *result = MPPImageSegmenterResult *result =
[MPPImageSegmenter imageSegmenterResultWithOutputPacketMap:outputPacketMap [MPPImageSegmenter imageSegmenterResultWithOutputPacketMap:outputPacketMap
shouldCopyMaskPacketData:NO]; shouldCopyMaskPacketData:NO];
dispatch_async(_callbackQueue, ^{
[self.imageSegmenterLiveStreamDelegate imageSegmenter:self [self.imageSegmenterLiveStreamDelegate imageSegmenter:self
didFinishSegmentationWithResult:result didFinishSegmentationWithResult:result
timestampInMilliseconds:result.timestampInMilliseconds timestampInMilliseconds:result.timestampInMilliseconds