[vlc-commits] macosx: input manager: add a rate limit for INPUT_EVENT_POSITION

David Fuhrmann git at videolan.org
Sat Feb 4 15:54:32 CET 2017


vlc | branch: master | David Fuhrmann <dfuhrmann at videolan.org> | Sat Feb  4 15:50:39 2017 +0100| [fb95315753577256aa708d005f45e05c474cce4c] | committer: David Fuhrmann

macosx: input manager: add a rate limit for INPUT_EVENT_POSITION

For certain demuxers like mkv, that event is triggered with
very high rates (>= 100 events per second), which is not needed
to update our second-based controls.

By rate limiting in this patch, total CPU reduction from 30 to
15 % can be observed.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fb95315753577256aa708d005f45e05c474cce4c
---

 modules/gui/macosx/VLCInputManager.h |  1 +
 modules/gui/macosx/VLCInputManager.m | 17 +++++++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/modules/gui/macosx/VLCInputManager.h b/modules/gui/macosx/VLCInputManager.h
index 791463c..f1d4a1d 100644
--- a/modules/gui/macosx/VLCInputManager.h
+++ b/modules/gui/macosx/VLCInputManager.h
@@ -36,6 +36,7 @@
 - (void)inputThreadChanged;
 
 - (void)playbackStatusUpdated;
+- (void)playbackPositionUpdated;
 
 - (void)resumeItunesPlayback:(id)sender;
 
diff --git a/modules/gui/macosx/VLCInputManager.m b/modules/gui/macosx/VLCInputManager.m
index f8bf908..cbd4d0e 100644
--- a/modules/gui/macosx/VLCInputManager.m
+++ b/modules/gui/macosx/VLCInputManager.m
@@ -49,6 +49,7 @@ static int InputThreadChanged(vlc_object_t *p_this, const char *psz_var,
     return VLC_SUCCESS;
 }
 
+static NSDate *lastPositionUpdate = nil;
 
 static int InputEvent(vlc_object_t *p_this, const char *psz_var,
                       vlc_value_t oldval, vlc_value_t new_val, void *param)
@@ -64,8 +65,14 @@ static int InputEvent(vlc_object_t *p_this, const char *psz_var,
                 [[[VLCMain sharedInstance] mainMenu] performSelectorOnMainThread:@selector(updatePlaybackRate) withObject: nil waitUntilDone:NO];
                 break;
             case INPUT_EVENT_POSITION:
-                [[[VLCMain sharedInstance] mainWindow] performSelectorOnMainThread:@selector(updateTimeSlider) withObject: nil waitUntilDone:NO];
-                [[[VLCMain sharedInstance] statusBarIcon] performSelectorOnMainThread:@selector(updateProgress) withObject:nil waitUntilDone:NO];
+
+                // Rate limit to 100 ms
+                if (lastPositionUpdate && fabs([lastPositionUpdate timeIntervalSinceNow]) < 0.1)
+                    break;
+
+                lastPositionUpdate = [NSDate date];
+
+                [inputManager performSelectorOnMainThread:@selector(playbackPositionUpdated) withObject:nil waitUntilDone:NO];
                 break;
             case INPUT_EVENT_TITLE:
             case INPUT_EVENT_CHAPTER:
@@ -244,6 +251,12 @@ static int InputEvent(vlc_object_t *p_this, const char *psz_var,
     });
 }
 
+- (void)playbackPositionUpdated
+{
+    [[[VLCMain sharedInstance] mainWindow] updateTimeSlider];
+    [[[VLCMain sharedInstance] statusBarIcon] updateProgress];
+}
+
 - (void)playbackStatusUpdated
 {
     intf_thread_t *p_intf = getIntf();



More information about the vlc-commits mailing list