Browse Source

reworked frame updates

Alexander Hendrich 11 năm trước cách đây
mục cha
commit
bdd4729518

+ 1 - 1
bbiwarg/Constants.cs

@@ -12,7 +12,7 @@ namespace bbiwarg
     class Constants
     {
         // Logger
-        public static readonly LogSubject LogLevel = LogSubject.Timer;
+        public static readonly LogSubject LogLevel = LogSubject.None;
         public static readonly int ConsoleWidth = 90;
         public static readonly int ConsoleHeight = 30;
         

+ 2 - 3
bbiwarg/Graphics/OutputWindow.cs

@@ -91,10 +91,9 @@ namespace bbiwarg.Graphics
             GL.MatrixMode(MatrixMode.Modelview);
             GL.LoadMatrix(ref modelview);
 
-            if(!(inputProvider is VideoInputProvider) || (inputProvider is VideoInputProvider && !((VideoInputProvider)inputProvider).IsPaused))
-                inputHandler.updateFrame();
+            inputHandler.updateFrame();
 
-            Title = Constants.OutputTitle + " (Frame: " + inputProvider.CurrentFrame + ")";
+            Title = Constants.OutputTitle + " (Frame: " + inputProvider.CurrentFrameID + ")";
 
             Timer.start("buildTextures");
             GL.Enable(EnableCap.Texture2D);

+ 24 - 23
bbiwarg/InputHandler.cs

@@ -26,8 +26,8 @@ namespace bbiwarg
         private InputFrame currentInputFrame;
         private int imageWidth;
         private int imageHeight;
-        private int currentFrame;
-        private int lastFrame;
+        private int currentFrameID;
+        private int lastFrameID;
 
         private DepthImage depthImage;
         private EdgeImage edgeImage;
@@ -49,8 +49,8 @@ namespace bbiwarg
             this.inputProvider = inputProvider;
             this.imageWidth = inputProvider.ImageWidth;
             this.imageHeight = inputProvider.ImageHeight;
-            this.currentFrame = inputProvider.CurrentFrame;
-            this.lastFrame = this.currentFrame - 1;
+            this.currentFrameID = inputProvider.CurrentFrameID;
+            this.lastFrameID = this.currentFrameID - 1;
 
             initializeConsistentObjects();
         }
@@ -100,25 +100,28 @@ namespace bbiwarg
         {
             Timer.start("updateFrame");
 
-            beforeUpdateFrame();
+            if (currentFrameID != inputProvider.CurrentFrameID)
+            {
+                beforeUpdateFrame();
 
-            if (lastFrame-currentFrame > 20)
-                resetConsistentObjects();
+                if (lastFrameID - currentFrameID > 20)
+                    resetConsistentObjects();
 
-            createConfidenceImage();
-            createDepthImage();
-            createEdgeImage();
+                createConfidenceImage();
+                createDepthImage();
+                createEdgeImage();
 
-            detectFingers();
-            trackFingers();
+                detectFingers();
+                trackFingers();
 
-            detectHands();
-            detectPalm();
+                detectHands();
+                detectPalm();
 
-            detectTouchEvents();
-            trackTouchEvents();
+                detectTouchEvents();
+                trackTouchEvents();
 
-            afterUpdateFrame();
+                afterUpdateFrame();
+            }
 
             Timer.stop("updateFrame");
         }
@@ -127,13 +130,11 @@ namespace bbiwarg
         {
             Timer.start("beforeUpdateFrame");
 
-            Timer.start("getInputFrame");
-            currentInputFrame = inputProvider.getInputFrame();
-            Timer.stop("getInputFrame");
+            currentInputFrame = inputProvider.CurrentFrame;
 
-            lastFrame = currentFrame;
-            currentFrame = currentInputFrame.FrameNumber;
-            Logger.CurrentFrame = currentFrame;
+            lastFrameID = currentFrameID;
+            currentFrameID = currentInputFrame.FrameID;
+            Logger.CurrentFrame = currentFrameID;
 
             if (Constants.TuioEnabled)
                 tuioCommunicator.initFrame();

+ 3 - 3
bbiwarg/InputProviders/InputFrame.cs

@@ -8,14 +8,14 @@ namespace bbiwarg.InputProviders
 {
     class InputFrame
     {
-        public int FrameNumber { get; private set; }
+        public int FrameID { get; private set; }
         public int Width { get; private set; }
         public int Height { get; private set; }
         public IntPtr RawDepthData { get; private set; }
         public IntPtr RawConfidenceData { get; private set; }
 
-        public InputFrame(int frameNumber, int width, int height, IntPtr rawDepthData, IntPtr rawConfidenceData) {
-            FrameNumber = frameNumber;
+        public InputFrame(int frameID, int width, int height, IntPtr rawDepthData, IntPtr rawConfidenceData) {
+            FrameID = frameID;
             Width = width;
             Height = height;
             RawDepthData = rawDepthData;

+ 15 - 14
bbiwarg/InputProviders/InputProvider.cs

@@ -11,9 +11,8 @@ namespace bbiwarg.InputProviders
     {
         public int ImageWidth { get; private set; }
         public int ImageHeight { get; private set; }
-        public virtual int CurrentFrame { get { return frameCounter; }}
-
-        protected int frameCounter = 0;
+        public virtual int CurrentFrameID { get { return device.FrameId; }}
+        public InputFrame CurrentFrame { get; private set; }
 
         protected IHandle handle;
         protected IDevice device;
@@ -43,6 +42,19 @@ namespace bbiwarg.InputProviders
         {
             depthImage = device.RegisterDataHandle<Iisu.Data.IImageData>("SOURCE.CAMERA.DEPTH.Image");
             confidenceImage = device.RegisterDataHandle<Iisu.Data.IImageData>("SOURCE.CAMERA.CONFIDENCE.Image");
+            device.EventManager.RegisterEventListener("DEVICE.DataFrame", new onNewFrameDelegate(onNewFrame));
+        }
+
+        private delegate void onNewFrameDelegate(String name, uint frameID);
+
+        private void onNewFrame(String name, uint frameID)
+        {
+            device.UpdateFrame(false);
+            IntPtr rawDepthData = depthImage.Value.Raw;
+            IntPtr rawConfidenceData = confidenceImage.Value.Raw;
+            device.ReleaseFrame();
+
+            CurrentFrame =  new InputFrame(CurrentFrameID, ImageWidth, ImageHeight, rawDepthData, rawConfidenceData);
         }
 
         public void start() {
@@ -56,16 +68,5 @@ namespace bbiwarg.InputProviders
         public void stop() {
             device.Stop(true);
         }
-
-        public InputFrame getInputFrame()
-        {
-            device.UpdateFrame(false);
-            frameCounter++;
-            IntPtr rawDepthData = depthImage.Value.Raw;
-            IntPtr rawConfidenceData = confidenceImage.Value.Raw;
-            device.ReleaseFrame();
-
-            return new InputFrame(CurrentFrame, ImageWidth, ImageHeight, rawDepthData, rawConfidenceData);
-        }
     }
 }

+ 3 - 3
bbiwarg/InputProviders/VideoInputProvider.cs

@@ -10,7 +10,7 @@ namespace bbiwarg.InputProviders
 {
     class VideoInputProvider : InputProvider
     {
-        public override int CurrentFrame { get { return currentMovieFrame.Value; } }
+        public override int CurrentFrameID { get { return currentMovieFrame.Value; } }
         public String MoviePath { get; private set; }
         public bool IsPaused { get { return (playStep.Value == 0); } }
 
@@ -56,7 +56,7 @@ namespace bbiwarg.InputProviders
             int nextFrame = currentMovieFrame.Value + 1;
             while (currentMovieFrame.Value != nextFrame)
             {
-                device.UpdateFrame(false);
+                device.UpdateFrame(true);
                 device.ReleaseFrame();
             }
             playStep.Value = 0;
@@ -69,7 +69,7 @@ namespace bbiwarg.InputProviders
             int previousFrame = currentMovieFrame.Value - 1;
             while (currentMovieFrame.Value != previousFrame)
             {
-                device.UpdateFrame(false);
+                device.UpdateFrame(true);
                 device.ReleaseFrame();
             }
             playStep.Value = 0;