diff --git a/mediapipe/tasks/ios/vision/object_detector/sources/MPPObjectDetector.mm b/mediapipe/tasks/ios/vision/object_detector/sources/MPPObjectDetector.mm index 8c8b0c3bb..6d02710a7 100644 --- a/mediapipe/tasks/ios/vision/object_detector/sources/MPPObjectDetector.mm +++ b/mediapipe/tasks/ios/vision/object_detector/sources/MPPObjectDetector.mm @@ -37,8 +37,8 @@ static NSString *const kImageOutStreamName = @"image_out"; static NSString *const kImageTag = @"IMAGE"; static NSString *const kNormRectStreamName = @"norm_rect_in"; static NSString *const kNormRectTag = @"NORM_RECT"; - static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorGraph"; +static NSString *const kTaskName = @"objectDetector"; #define InputPacketMap(imagePacket, normalizedRectPacket) \ { \ @@ -58,6 +58,7 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG - (instancetype)initWithOptions:(MPPObjectDetectorOptions *)options error:(NSError **)error { self = [super init]; + NSLog(@"Object Detector Initializing with dispatch queu and weak self"); if (self) { MPPTaskInfo *taskInfo = [[MPPTaskInfo alloc] initWithTaskGraphName:kTaskGraphName @@ -85,8 +86,12 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG // Capturing `self` as weak in order to avoid `self` being kept in memory // and cause a retain cycle, after self is set to `nil`. MPPObjectDetector *__weak weakSelf = self; + dispatch_queue_t callbackQueue = dispatch_queue_create([MPPVisionTaskRunner uniqueQueueNameWithTaskName:kTaskName], NULL); packetsCallback = [=](absl::StatusOr statusOrPackets) { - if ([!weakSelf && weakSelf.objectDetectorDelegate + if (!weakSelf) { + return; + } + if (![weakSelf.objectDetectorDelegate respondsToSelector:@selector (objectDetector:didFinishDetectionWithResult:timestampInMilliseconds:error:)]) { return; @@ -94,10 +99,12 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG NSError *callbackError = nil; if (![MPPCommonUtils checkCppError:statusOrPackets.status() toError:&callbackError]) { - [_objectDetectorDelegate objectDetector:weakSelf + dispatch_async(callbackQueue, ^{ + [weakSelf.objectDetectorDelegate objectDetector:weakSelf didFinishDetectionWithResult:nil timestampInMilliseconds:Timestamp::Unset().Value() error:callbackError]; + }); return; } @@ -109,15 +116,18 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG MPPObjectDetectionResult *result = [MPPObjectDetectionResult objectDetectionResultWithDetectionsPacket:statusOrPackets.value()[kDetectionsStreamName .cppString]]; - - [weakSelf.objectDetectorDelegate + + NSInteger timeStampInMilliseconds = outputPacketMap[kImageOutStreamName.cppString] + .Timestamp() + .Value() / + kMicroSecondsPerMilliSecond; + dispatch_async(callbackQueue, ^{ + [weakSelf.objectDetectorDelegate objectDetector:weakSelf didFinishDetectionWithResult:result - timestampInMilliseconds:outputPacketMap[kImageOutStreamName.cppString] - .Timestamp() - .Value() / - kMicroSecondsPerMilliSecond + timestampInMilliseconds:timeStampInMilliseconds error:callbackError]; + }); }; }