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.
This commit is contained in:
2022-09-02 23:44:20 -04:00
parent 8b901251b8
commit 93ab33eb56
+12 -11
View File
@@ -2,6 +2,7 @@ from PyQt5.QtCore import QUrl, QSize, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QOpenGLFramebufferObject from PyQt5.QtGui import QOpenGLFramebufferObject
from PyQt5.QtOpenGL import QGLContext from PyQt5.QtOpenGL import QGLContext
from PyQt5.QtQuick import QQuickFramebufferObject from PyQt5.QtQuick import QQuickFramebufferObject
from mpv import MPV, MpvRenderContext, OpenGlCbGetProcAddrFn from mpv import MPV, MpvRenderContext, OpenGlCbGetProcAddrFn
@@ -9,7 +10,7 @@ def get_process_address(_, name):
glctx = QGLContext.currentContext() glctx = QGLContext.currentContext()
if glctx is None: if glctx is None:
return 0 return 0
return int(glctx.getProcAddress(name.decode('utf-8'))) return int(glctx.getProcAddress(name.decode("utf-8")))
class MpvObject(QQuickFramebufferObject): class MpvObject(QQuickFramebufferObject):
@@ -37,7 +38,7 @@ class MpvObject(QQuickFramebufferObject):
"""Slot for receiving the update event on the correct thread""" """Slot for receiving the update event on the correct thread"""
self.update() self.update()
def createRenderer(self) -> 'QQuickFramebufferObject.Renderer': def createRenderer(self) -> "QQuickFramebufferObject.Renderer":
"""Overrides the default createRenderer function to create a """Overrides the default createRenderer function to create a
MpvRenderer instance""" MpvRenderer instance"""
print("Calling overridden createRenderer") print("Calling overridden createRenderer")
@@ -58,18 +59,16 @@ class MpvRenderer(QQuickFramebufferObject.Renderer):
print("Creating MpvRenderer") print("Creating MpvRenderer")
super(MpvRenderer, self).__init__() super(MpvRenderer, self).__init__()
self.obj = parent 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: def createFramebufferObject(self, size: QSize) -> QOpenGLFramebufferObject:
"""Overrides the base createFramebufferObject function, augmenting it to """Overrides the base createFramebufferObject function, augmenting it to
create an MpvRenderContext using opengl""" 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) return QQuickFramebufferObject.Renderer.createFramebufferObject(self, size)
@@ -84,4 +83,6 @@ class MpvRenderer(QQuickFramebufferObject.Renderer):
height = int(rect.height() * factor) height = int(rect.height() * factor)
fbo = int(self.framebufferObject().handle()) 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}
)