def _before_change_mpv_widget_parent(self): """ According to Qt docs, reparenting an OpenGLWidget will destory the GL context. In mpv widget, it calls _mpv_opengl_cb_uninit_gl. After uninit_gl, mpv can't show video anymore because video_out is destroyed. See mpv mpv_opengl_cb_uninit_gl implementation for more details. """ _mpv_set_property_string(self._app.player._mpv.handle, b'vid', b'no')
def _after_change_mpv_widget_parent(self): """ To recover the video show, we should reinit gl and reinit video. gl is automatically reinited when the mpv_widget do painting. We should manually reinit video. NOTE(cosven): After some investigation, I found that the API in mpv to reinit video_out(maybe video is almost same as video_out) is init_best_video_out. Theoretically, sending 'video-reload' command will trigger this API. However, we can't run this command in our case and I don't know why. Another way to trigger the API is to switch track. Changing vid property just switch the track. Inpect mpv init_best_video_out caller for more details. You should see mp_switch_track_n is one of the entrypoint. """ _mpv_set_property_string(self._app.player._mpv.handle, b'vid', b'1')