From 93ab33eb56867f4795329c0828f3d8e57c80ee3a Mon Sep 17 00:00:00 2001 From: restitux Date: Fri, 2 Sep 2022 23:44:20 -0400 Subject: [PATCH] Fix broken playback in Mpv widget Widget playback was broken under QQmlApplicationEngine based workflows. Refactoring MpvRenderContext creation to happen in the constructor fixed playback in this workflow. --- ikinuki_client/qtmpv.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ikinuki_client/qtmpv.py b/ikinuki_client/qtmpv.py index db7480a..39909ca 100644 --- a/ikinuki_client/qtmpv.py +++ b/ikinuki_client/qtmpv.py @@ -2,6 +2,7 @@ from PyQt5.QtCore import QUrl, QSize, pyqtSignal, pyqtSlot from PyQt5.QtGui import QOpenGLFramebufferObject from PyQt5.QtOpenGL import QGLContext from PyQt5.QtQuick import QQuickFramebufferObject + from mpv import MPV, MpvRenderContext, OpenGlCbGetProcAddrFn @@ -9,7 +10,7 @@ def get_process_address(_, name): glctx = QGLContext.currentContext() if glctx is None: return 0 - return int(glctx.getProcAddress(name.decode('utf-8'))) + return int(glctx.getProcAddress(name.decode("utf-8"))) class MpvObject(QQuickFramebufferObject): @@ -37,7 +38,7 @@ class MpvObject(QQuickFramebufferObject): """Slot for receiving the update event on the correct thread""" self.update() - def createRenderer(self) -> 'QQuickFramebufferObject.Renderer': + def createRenderer(self) -> "QQuickFramebufferObject.Renderer": """Overrides the default createRenderer function to create a MpvRenderer instance""" print("Calling overridden createRenderer") @@ -58,18 +59,16 @@ class MpvRenderer(QQuickFramebufferObject.Renderer): print("Creating MpvRenderer") super(MpvRenderer, self).__init__() self.obj = parent - self.ctx = None + self.ctx = MpvRenderContext( + self.obj.mpv, + "opengl", + opengl_init_params={"get_proc_address": self.obj._proc_addr_wrapper}, + ) + self.ctx.update_cb = self.obj.on_update def createFramebufferObject(self, size: QSize) -> QOpenGLFramebufferObject: """Overrides the base createFramebufferObject function, augmenting it to create an MpvRenderContext using opengl""" - if self.obj.mpv_gl is None: - print("Creating mpv gl") - self.ctx = MpvRenderContext(self.obj.mpv, 'opengl', - opengl_init_params={ - 'get_proc_address': self.obj._proc_addr_wrapper - }) - self.ctx.update_cb = self.obj.on_update return QQuickFramebufferObject.Renderer.createFramebufferObject(self, size) @@ -84,4 +83,6 @@ class MpvRenderer(QQuickFramebufferObject.Renderer): height = int(rect.height() * factor) fbo = int(self.framebufferObject().handle()) - self.ctx.render(flip_y=False, opengl_fbo={'w': width, 'h': height, 'fbo': fbo}) + self.ctx.render( + flip_y=False, opengl_fbo={"w": width, "h": height, "fbo": fbo} + )