[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