Skip to content

Instantly share code, notes, and snippets.

@trin94
Last active January 3, 2020 09:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trin94/a930f2a13cee1c9fd21cab0393bf4663 to your computer and use it in GitHub Desktop.
Save trin94/a930f2a13cee1c9fd21cab0393bf4663 to your computer and use it in GitHub Desktop.
Usage of opengl_cb is deprecated. Use https://gist.github.com/jaseg/657e8ecca3267c0d82ec85d40f423caa instead.
#!/usr/bin/env python3
import ctypes
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
gi.require_version('GL', '1.0')
from OpenGL import GL, GLX
from mpv import MPV, _mpv_get_sub_api, _mpv_opengl_cb_set_update_callback, \
_mpv_opengl_cb_init_gl, OpenGlCbGetProcAddrFn, _mpv_opengl_cb_draw, \
MpvSubApi, OpenGlCbUpdateFn, _mpv_opengl_cb_uninit_gl
def get_process_address(_, name):
address = GLX.glXGetProcAddress(name.decode("utf-8"))
return ctypes.cast(address, ctypes.c_void_p).value
class MainClass(Gtk.Window):
def __init__(self, media):
super(MainClass, self).__init__()
self.media = media
self.set_default_size(600, 400)
self.connect("destroy", self.on_destroy)
frame = Gtk.Frame()
self.area = OpenGlArea()
self.area.connect("realize", self.play)
frame.add(self.area)
self.add(frame)
self.show_all()
def on_destroy(self, widget, data=None):
Gtk.main_quit()
def play(self, arg1):
self.area.play(self.media)
# noinspection PyTypeChecker
class OpenGlArea(Gtk.GLArea):
def __init__(self, **properties):
super().__init__(**properties)
self.mpv = MPV(vo='opengl-cb')
self.mpv_gl = _mpv_get_sub_api(self.mpv.handle, MpvSubApi.MPV_SUB_API_OPENGL_CB)
self.on_update_c = OpenGlCbUpdateFn(self.wrapped_c_render_func)
self.get_proc_addr_c = OpenGlCbGetProcAddrFn(get_process_address)
_mpv_opengl_cb_set_update_callback(self.mpv_gl, self.on_update_c, None)
self.connect("realize", self.on_realize)
self.connect("render", self.on_render)
self.connect("unrealize", self.on_unrealize)
def on_realize(self, area):
self.make_current()
_mpv_opengl_cb_init_gl(self.mpv_gl, None, self.get_proc_addr_c, None)
def on_unrealize(self, arg):
_mpv_opengl_cb_uninit_gl(self.mpv_gl)
self.mpv.terminate()
def wrapped_c_render_func(self, ctx=None):
self.queue_render()
def on_render(self, arg1, arg2):
factor = self.get_scale_factor()
rect = self.get_allocated_size()[0]
width = rect.width * factor
height = -rect.height * factor
_mpv_opengl_cb_draw(self.mpv_gl, GL.glGetIntegerv(GL.GL_DRAW_FRAMEBUFFER_BINDING), width, height)
def play(self, media):
self.mpv.play(media)
if __name__ == '__main__':
import locale
locale.setlocale(locale.LC_NUMERIC, 'C')
application = MainClass(media='test.webm')
Gtk.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment