diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionGraph.cs index 0921a7129..c698a74aa 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionGraph.cs @@ -30,7 +30,7 @@ public float minDetectionConfidence public event EventHandler OnFaceDetectionsOutput { - add => _faceDetectionsStream.AddListener(value); + add => _faceDetectionsStream.AddListener(value, timeoutMicrosec); remove => _faceDetectionsStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionSolution.cs index 05a8b8335..0532346d8 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Face Detection/FaceDetectionSolution.cs @@ -51,7 +51,7 @@ protected override IEnumerator WaitForNextValue() private void OnFaceDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(Detection.Parser); + var value = packet == null ? default : packet.GetProtoList(Detection.Parser); _faceDetectionsAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshGraph.cs index 2cb1d4a62..12ec99e03 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshGraph.cs @@ -51,25 +51,25 @@ public float minTrackingConfidence public event EventHandler OnFaceDetectionsOutput { - add => _faceDetectionsStream.AddListener(value); + add => _faceDetectionsStream.AddListener(value, timeoutMicrosec); remove => _faceDetectionsStream.RemoveListener(value); } public event EventHandler OnMultiFaceLandmarksOutput { - add => _multiFaceLandmarksStream.AddListener(value); + add => _multiFaceLandmarksStream.AddListener(value, timeoutMicrosec); remove => _multiFaceLandmarksStream.RemoveListener(value); } public event EventHandler OnFaceRectsFromLandmarksOutput { - add => _faceRectsFromLandmarksStream.AddListener(value); + add => _faceRectsFromLandmarksStream.AddListener(value, timeoutMicrosec); remove => _faceRectsFromLandmarksStream.RemoveListener(value); } public event EventHandler OnFaceRectsFromDetectionsOutput { - add => _faceRectsFromDetectionsStream.AddListener(value); + add => _faceRectsFromDetectionsStream.AddListener(value, timeoutMicrosec); remove => _faceRectsFromDetectionsStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshSolution.cs index 705b6d4a4..0b74ea3b2 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Face Mesh/FaceMeshSolution.cs @@ -77,28 +77,28 @@ protected override IEnumerator WaitForNextValue() private void OnFaceDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(Detection.Parser); + var value = packet == null ? default : packet.GetProtoList(Detection.Parser); _faceDetectionsAnnotationController.DrawLater(value); } private void OnMultiFaceLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProtoList(NormalizedLandmarkList.Parser); _multiFaceLandmarksAnnotationController.DrawLater(value); } private void OnFaceRectsFromLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProtoList(NormalizedRect.Parser); _faceRectsFromLandmarksAnnotationController.DrawLater(value); } private void OnFaceRectsFromDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProtoList(NormalizedRect.Parser); _faceRectsFromDetectionsAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationGraph.cs index 509c7610e..4a2e99252 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationGraph.cs @@ -15,7 +15,7 @@ public class HairSegmentationGraph : GraphRunner { public event EventHandler OnHairMaskOutput { - add => _hairMaskStream.AddListener(value); + add => _hairMaskStream.AddListener(value, timeoutMicrosec); remove => _hairMaskStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationSolution.cs index 83a6b19ab..ad0b4e17f 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Hair Segmentation/HairSegmentationSolution.cs @@ -41,7 +41,7 @@ protected override IEnumerator WaitForNextValue() private void OnHairMaskOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetImageFrame(); + var value = packet == null ? default : packet.GetImageFrame(); _hairMaskAnnotationController.DrawLater(value); value?.Dispose(); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingGraph.cs index fda30a0e5..405188efb 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingGraph.cs @@ -63,37 +63,37 @@ public float minTrackingConfidence public event EventHandler OnPalmDetectectionsOutput { - add => _palmDetectionsStream.AddListener(value); + add => _palmDetectionsStream.AddListener(value, timeoutMicrosec); remove => _palmDetectionsStream.RemoveListener(value); } public event EventHandler OnHandRectsFromPalmDetectionsOutput { - add => _handRectsFromPalmDetectionsStream.AddListener(value); + add => _handRectsFromPalmDetectionsStream.AddListener(value, timeoutMicrosec); remove => _handRectsFromPalmDetectionsStream.RemoveListener(value); } public event EventHandler OnHandLandmarksOutput { - add => _handLandmarksStream.AddListener(value); + add => _handLandmarksStream.AddListener(value, timeoutMicrosec); remove => _handLandmarksStream.RemoveListener(value); } public event EventHandler OnHandWorldLandmarksOutput { - add => _handWorldLandmarksStream.AddListener(value); + add => _handWorldLandmarksStream.AddListener(value, timeoutMicrosec); remove => _handWorldLandmarksStream.RemoveListener(value); } public event EventHandler OnHandRectsFromLandmarksOutput { - add => _handRectsFromLandmarksStream.AddListener(value); + add => _handRectsFromLandmarksStream.AddListener(value, timeoutMicrosec); remove => _handRectsFromLandmarksStream.RemoveListener(value); } public event EventHandler OnHandednessOutput { - add => _handednessStream.AddListener(value); + add => _handednessStream.AddListener(value, timeoutMicrosec); remove => _handednessStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingSolution.cs index f88346a26..858fac332 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Hand Tracking/HandTrackingSolution.cs @@ -5,7 +5,6 @@ // https://opensource.org/licenses/MIT. using System.Collections; -using System.Collections.Generic; using UnityEngine; namespace Mediapipe.Unity.Sample.HandTracking @@ -81,35 +80,35 @@ protected override IEnumerator WaitForNextValue() private void OnPalmDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(Detection.Parser); + var value = packet == null ? default : packet.GetProtoList(Detection.Parser); _palmDetectionsAnnotationController.DrawLater(value); } private void OnHandRectsFromPalmDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProtoList(NormalizedRect.Parser); _handRectsFromPalmDetectionsAnnotationController.DrawLater(value); } private void OnHandLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProtoList(NormalizedLandmarkList.Parser); _handLandmarksAnnotationController.DrawLater(value); } private void OnHandRectsFromLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProtoList(NormalizedRect.Parser); _handRectsFromLandmarksAnnotationController.DrawLater(value); } private void OnHandednessOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(ClassificationList.Parser); + var value = packet == null ? default : packet.GetProtoList(ClassificationList.Parser); _handLandmarksAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingGraph.cs index 6d0b91383..624c044cd 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingGraph.cs @@ -71,49 +71,49 @@ public float minTrackingConfidence public event EventHandler OnPoseDetectionOutput { - add => _poseDetectionStream.AddListener(value); + add => _poseDetectionStream.AddListener(value, timeoutMicrosec); remove => _poseDetectionStream.RemoveListener(value); } public event EventHandler OnPoseLandmarksOutput { - add => _poseLandmarksStream.AddListener(value); + add => _poseLandmarksStream.AddListener(value, timeoutMicrosec); remove => _poseLandmarksStream.RemoveListener(value); } public event EventHandler OnFaceLandmarksOutput { - add => _faceLandmarksStream.AddListener(value); + add => _faceLandmarksStream.AddListener(value, timeoutMicrosec); remove => _faceLandmarksStream.RemoveListener(value); } public event EventHandler OnLeftHandLandmarksOutput { - add => _leftHandLandmarksStream.AddListener(value); + add => _leftHandLandmarksStream.AddListener(value, timeoutMicrosec); remove => _leftHandLandmarksStream.RemoveListener(value); } public event EventHandler OnRightHandLandmarksOutput { - add => _rightHandLandmarksStream.AddListener(value); + add => _rightHandLandmarksStream.AddListener(value, timeoutMicrosec); remove => _rightHandLandmarksStream.RemoveListener(value); } public event EventHandler OnPoseWorldLandmarksOutput { - add => _poseWorldLandmarksStream.AddListener(value); + add => _poseWorldLandmarksStream.AddListener(value, timeoutMicrosec); remove => _poseWorldLandmarksStream.RemoveListener(value); } public event EventHandler OnSegmentationMaskOutput { - add => _segmentationMaskStream.AddListener(value); + add => _segmentationMaskStream.AddListener(value, timeoutMicrosec); remove => _segmentationMaskStream.RemoveListener(value); } public event EventHandler OnPoseRoiOutput { - add => _poseRoiStream.AddListener(value); + add => _poseRoiStream.AddListener(value, timeoutMicrosec); remove => _poseRoiStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingSolution.cs index ac5defc60..d362b2de3 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Holistic/HolisticTrackingSolution.cs @@ -112,49 +112,49 @@ protected override IEnumerator WaitForNextValue() private void OnPoseDetectionOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(Detection.Parser); + var value = packet == null ? default : packet.GetProto(Detection.Parser); _poseDetectionAnnotationController.DrawLater(value); } private void OnFaceLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedLandmarkList.Parser); _holisticAnnotationController.DrawFaceLandmarkListLater(value); } private void OnPoseLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedLandmarkList.Parser); _holisticAnnotationController.DrawPoseLandmarkListLater(value); } private void OnLeftHandLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedLandmarkList.Parser); _holisticAnnotationController.DrawLeftHandLandmarkListLater(value); } private void OnRightHandLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedLandmarkList.Parser); _holisticAnnotationController.DrawRightHandLandmarkListLater(value); } private void OnPoseWorldLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(LandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(LandmarkList.Parser); _poseWorldLandmarksAnnotationController.DrawLater(value); } private void OnSegmentationMaskOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetImageFrame(); + var value = packet == null ? default : packet.GetImageFrame(); _segmentationMaskAnnotationController.DrawLater(value); value?.Dispose(); } @@ -162,7 +162,7 @@ private void OnSegmentationMaskOutput(object stream, OutputStream.OutputEventArg private void OnPoseRoiOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedRect.Parser); _poseRoiAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingGraph.cs index b418efa66..ae407438d 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingGraph.cs @@ -28,19 +28,19 @@ public class IrisTrackingGraph : GraphRunner { public event EventHandler OnFaceDetectionsOutput { - add => _faceDetectionsStream.AddListener(value); + add => _faceDetectionsStream.AddListener(value, timeoutMicrosec); remove => _faceDetectionsStream.RemoveListener(value); } public event EventHandler OnFaceRectOutput { - add => _faceRectStream.AddListener(value); + add => _faceRectStream.AddListener(value, timeoutMicrosec); remove => _faceRectStream.RemoveListener(value); } public event EventHandler OnFaceLandmarksWithIrisOutput { - add => _faceLandmarksWithIrisStream.AddListener(value); + add => _faceLandmarksWithIrisStream.AddListener(value, timeoutMicrosec); remove => _faceLandmarksWithIrisStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingSolution.cs index 6584187d1..17d591105 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Iris Tracking/IrisTrackingSolution.cs @@ -49,21 +49,21 @@ protected override IEnumerator WaitForNextValue() private void OnFaceDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(Detection.Parser); + var value = packet == null ? default : packet.GetProtoList(Detection.Parser); _faceDetectionsAnnotationController.DrawLater(value); } private void OnFaceRectOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedRect.Parser); _faceRectAnnotationController.DrawLater(value); } private void OnFaceLandmarksWithIrisOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedLandmarkList.Parser); _faceLandmarksWithIrisAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/MediaPipe Video/MediaPipeVideoGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/MediaPipe Video/MediaPipeVideoGraph.cs index c13ad861e..d9c1207f0 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/MediaPipe Video/MediaPipeVideoGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/MediaPipe Video/MediaPipeVideoGraph.cs @@ -18,7 +18,7 @@ public class MediaPipeVideoGraph : GraphRunner public event EventHandler OnOutput { - add => _outputVideoStream.AddListener(value); + add => _outputVideoStream.AddListener(value, timeoutMicrosec); remove => _outputVideoStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionGraph.cs index e650160b0..c07bd8445 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionGraph.cs @@ -14,7 +14,7 @@ public class ObjectDetectionGraph : GraphRunner { public event EventHandler OnOutputDetectionsOutput { - add => _outputDetectionsStream.AddListener(value); + add => _outputDetectionsStream.AddListener(value, timeoutMicrosec); remove => _outputDetectionsStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionSolution.cs index bb56ab074..e310e1829 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Object Detection/ObjectDetectionSolution.cs @@ -39,7 +39,7 @@ protected override IEnumerator WaitForNextValue() private void OnOutputDetectionsOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProtoList(Detection.Parser); + var value = packet == null ? default : packet.GetProtoList(Detection.Parser); _outputDetectionsAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingGraph.cs index f5605b858..f017561f0 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingGraph.cs @@ -62,31 +62,31 @@ public float minTrackingConfidence public event EventHandler OnPoseDetectionOutput { - add => _poseDetectionStream.AddListener(value); + add => _poseDetectionStream.AddListener(value, timeoutMicrosec); remove => _poseDetectionStream.RemoveListener(value); } public event EventHandler OnPoseLandmarksOutput { - add => _poseLandmarksStream.AddListener(value); + add => _poseLandmarksStream.AddListener(value, timeoutMicrosec); remove => _poseLandmarksStream.RemoveListener(value); } public event EventHandler OnPoseWorldLandmarksOutput { - add => _poseWorldLandmarksStream.AddListener(value); + add => _poseWorldLandmarksStream.AddListener(value, timeoutMicrosec); remove => _poseWorldLandmarksStream.RemoveListener(value); } public event EventHandler OnSegmentationMaskOutput { - add => _segmentationMaskStream.AddListener(value); + add => _segmentationMaskStream.AddListener(value, timeoutMicrosec); remove => _segmentationMaskStream.RemoveListener(value); } public event EventHandler OnRoiFromLandmarksOutput { - add => _roiFromLandmarksStream.AddListener(value); + add => _roiFromLandmarksStream.AddListener(value, timeoutMicrosec); remove => _roiFromLandmarksStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingSolution.cs index be7ddc2db..ed16844a2 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Pose Tracking/PoseTrackingSolution.cs @@ -103,28 +103,28 @@ protected override IEnumerator WaitForNextValue() private void OnPoseDetectionOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(Detection.Parser); + var value = packet == null ? default : packet.GetProto(Detection.Parser); _poseDetectionAnnotationController.DrawLater(value); } private void OnPoseLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedLandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedLandmarkList.Parser); _poseLandmarksAnnotationController.DrawLater(value); } private void OnPoseWorldLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(LandmarkList.Parser); + var value = packet == null ? default : packet.GetProto(LandmarkList.Parser); _poseWorldLandmarksAnnotationController.DrawLater(value); } private void OnSegmentationMaskOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetImageFrame(); + var value = packet == null ? default : packet.GetImageFrame(); _segmentationMaskAnnotationController.DrawLater(value); value?.Dispose(); } @@ -132,7 +132,7 @@ private void OnSegmentationMaskOutput(object stream, OutputStream.OutputEventArg private void OnRoiFromLandmarksOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetProto(NormalizedRect.Parser); + var value = packet == null ? default : packet.GetProto(NormalizedRect.Parser); _roiFromLandmarksAnnotationController.DrawLater(value); } } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationGraph.cs b/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationGraph.cs index 80b1dd57e..b94ff1f2a 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationGraph.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationGraph.cs @@ -15,7 +15,7 @@ public class SelfieSegmentationGraph : GraphRunner { public event EventHandler OnSegmentationMaskOutput { - add => _segmentationMaskStream.AddListener(value); + add => _segmentationMaskStream.AddListener(value, timeoutMicrosec); remove => _segmentationMaskStream.RemoveListener(value); } diff --git a/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationSolution.cs b/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationSolution.cs index 814684a92..bff564817 100644 --- a/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationSolution.cs +++ b/Assets/MediaPipeUnity/Samples/Scenes/Selfie Segmentation/SelfieSegmentationSolution.cs @@ -42,7 +42,7 @@ protected override IEnumerator WaitForNextValue() private void OnSegmentationMaskOutput(object stream, OutputStream.OutputEventArgs eventArgs) { var packet = eventArgs.packet; - var value = packet.IsEmpty() ? default : packet.GetImageFrame(); + var value = packet == null ? default : packet.GetImageFrame(); _segmentationMaskAnnotationController.DrawLater(value); value?.Dispose(); } diff --git a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Unity/OutputStream.cs b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Unity/OutputStream.cs index d1bb9a400..b0607784c 100644 --- a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Unity/OutputStream.cs +++ b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Unity/OutputStream.cs @@ -24,11 +24,17 @@ public sealed class OutputStream : IDisposable { public readonly struct OutputEventArgs { + /// + /// that contains the output value. + /// if there's no output. + /// public readonly Packet packet; + public readonly long timestampMicrosecond; - public OutputEventArgs(Packet packet) + internal OutputEventArgs(Packet packet, long timestampMicrosecond) { this.packet = packet; + this.timestampMicrosecond = timestampMicrosecond; } } @@ -80,6 +86,7 @@ private Packet outputPacket private Task _waitTask; private event EventHandler OnReceived; + private long _lastTimestampMicrosec; private Packet _referencePacket; private Packet referencePacket @@ -196,7 +203,23 @@ public void StartPolling() _poller = _calculatorGraph.AddOutputStreamPoller(streamName, observeTimestampBounds); } - public void AddListener(EventHandler callback) + /// + /// + /// + /// When is set to , can be invoked with an empty packet. + /// However, in some cases, most of the output packets can be empty even if the output must be present.
+ /// In that case, specify to mitigate the problem. + ///
+ /// + /// + /// When is set to , can be invoked with an empty packet. + /// However, in some cases, most of the output packets can be empty even if the output must be present.
+ /// + /// This parameter specifies the duration for ignoring empty packets. + /// That is, when receiving an empty packet, will not be invoked + /// unless the specified time has elapsed since the last non-empty output was received. + /// + public void AddListener(EventHandler callback, long emptyPacketThresholdMicrosecond = 0) { ThrowIfDisposed(); @@ -204,7 +227,22 @@ public void AddListener(EventHandler callback) { _calculatorGraph.ObserveOutputStream(streamName, _id, InvokeIfOutputStreamFound, observeTimestampBounds); } - OnReceived += callback; + + if (emptyPacketThresholdMicrosecond <= 0) + { + OnReceived += callback; + return; + } + + OnReceived += (sender, eventArgs) => + { + var stream = (OutputStream)sender; + if (eventArgs.packet == null && eventArgs.timestampMicrosecond - stream._lastTimestampMicrosec <= emptyPacketThresholdMicrosecond) + { + return; + } + callback(stream, eventArgs); + }; } public void RemoveListener(EventHandler eventHandler) @@ -338,7 +376,14 @@ private void ClearWaitTask() private void InvokeOnReceived(Packet nextPacket) { - OnReceived?.Invoke(this, new OutputEventArgs(nextPacket)); + var isEmpty = nextPacket.IsEmpty(); + var timestampMicrosec = nextPacket.TimestampMicroseconds(); + if (!isEmpty) + { + // not thread-safe + _lastTimestampMicrosec = Math.Max(timestampMicrosec, _lastTimestampMicrosec); + } + OnReceived?.Invoke(this, new OutputEventArgs(isEmpty ? null : nextPacket, timestampMicrosec)); } private void ThrowIfDisposed() @@ -366,9 +411,7 @@ private static StatusArgs InvokeIfOutputStreamFound(IntPtr graphPtr, int streamI var packet = outputStream.referencePacket; packet.SwitchNativePtr(packetPtr); - outputStream.InvokeOnReceived(packet); - packet.ReleaseMpResource(); return StatusArgs.Ok();