Skip to content

Instantly share code, notes, and snippets.

@rnixx
Last active April 7, 2021 10:19
Show Gist options
  • Save rnixx/02b632f58d16e884a7d15341c0743241 to your computer and use it in GitHub Desktop.
Save rnixx/02b632f58d16e884a7d15341c0743241 to your computer and use it in GitHub Desktop.
--- video_ffpyplayer.py 2021-04-07 11:27:07.000952871 +0200
+++ video.py 2021-04-07 11:27:09.336960012 +0200
@@ -58,6 +58,7 @@
from kivy.clock import Clock, mainthread
from kivy.logger import Logger
from kivy.core.video import VideoBase
+from kivy.core.window import Window
from kivy.graphics import Rectangle, BindTexture
from kivy.graphics.texture import Texture
from kivy.graphics.fbo import Fbo
@@ -111,7 +112,6 @@
self._seek_queue = []
self._ffplayer_need_quit = False
self._wakeup_queue = Queue(maxsize=1)
- self._trigger = Clock.create_trigger(self._redraw)
super(VideoFFPy, self).__init__(**kwargs)
@@ -211,7 +211,7 @@
self._texture = fbo.texture
else:
self._texture = Texture.create(size=self._size,
- colorfmt='rgba')
+ colorfmt='rgba')
# XXX FIXME
# self.texture.add_reload_observer(self.reload_buffer)
@@ -404,6 +404,14 @@
# Disabled as an attempt to fix kivy issue #6210
# self._ffplayer.set_volume(self._volume)
+ # Register on_close handler on window to make sure we can cleanup
+ # gracefully if application exits during video playback.
+ Window.bind(on_close=self.cleanup)
+
+ # Create redraw trigger
+ self._trigger = Clock.create_trigger(self._redraw)
+
+ # Create frame fetching thread
self._thread = Thread(
target=self._next_frame_run,
name='Next frame',
@@ -417,9 +425,15 @@
def load(self):
self.unload()
+ def cleanup(self, window):
+ self.unload()
+
def unload(self):
+ Window.unbind(on_close=self.cleanup)
+
if self._trigger is not None:
self._trigger.cancel()
+ self._trigger = None
# if thread is still alive, set it to exit and wake it
self._wakeup_thread()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment