2020
2121from lib .mpv import (MPV ,MpvGlGetProcAddressFn ,MpvRenderContext )
2222
23-
24-
2523Log = FFMPEGTools .Log
2624
2725def get_proc_addr (_ , name ):
@@ -32,7 +30,6 @@ def get_proc_addr(_, name):
3230 addr = int (glctx .getProcAddress (qb ))
3331 return addr
3432
35-
3633class VideoWidget (QtWidgets .QFrame ):
3734 """ Sized frame for mpv """
3835 trigger = pyqtSignal (float ,float ,float )
@@ -53,7 +50,7 @@ def updateUI(self,frameNumber,framecount,timeinfo):
5350
5451class VideoGLWidget (QOpenGLWidget ):
5552 trigger = pyqtSignal (float ,float ,float )
56-
53+ onMVPGLUpdate = pyqtSignal ()
5754 def __init__ (self , parent ,mpv ):
5855 QOpenGLWidget .__init__ (self ,parent )
5956 #setSurfaceType(QWindow.OpenGLSurface)
@@ -64,7 +61,8 @@ def __init__(self, parent,mpv):
6461 self .get_proc_addr_c = MpvGlGetProcAddressFn (get_proc_addr )
6562 self ._defaultHeight = 518 #ratio 16:9
6663 self ._defaultWidth = 921
67-
64+ self .onMVPGLUpdate .connect (self .__update )
65+
6866 def initializeGL (self ):
6967 params = {'get_proc_address' : self .get_proc_addr_c }
7068 self .ctx = MpvRenderContext (self .mpv ,
@@ -90,7 +88,6 @@ def paintGL(self):
9088 'fbo' : self .defaultFramebufferObject ()}
9189 self .ctx .render (flip_y = True , opengl_fbo = opengl_fbo )
9290
93-
9491 @pyqtSlot ()
9592 def __update (self ):
9693 if self .window ().isMinimized ():
@@ -104,16 +101,15 @@ def __update(self):
104101 def on_update (self , ctx = None ):
105102 # __update method should run on the thread that creates the
106103 # OpenGLContext, which in general is the main thread.
107- # QMetaObject.invokeMethod can do this trick.
108- QMetaObject .invokeMethod (self , '__update' )
104+ self .onMVPGLUpdate .emit ()
109105
110106 def sizeHint (self ):
111107 return QtCore .QSize (self ._defaultWidth , self ._defaultHeight )
112108
109+ #Called by MpvPlayer#_onTimePos
113110 def updateUI (self ,frameNumber ,framecount ,timeinfo ):
114111 self .trigger .emit (frameNumber ,framecount ,timeinfo )
115112
116-
117113class MpvPlayer ():
118114 ERR_IDS = ["No video or audio streams selected." ,"Failed to recognize file format." ]
119115 def __init__ (self ):
@@ -130,6 +126,7 @@ def initPlayer(self,container):
130126 return self .mediaPlayer
131127
132128 def initGLPlayer (self ):
129+ #stripes when using file explorer (initial call without file)
133130 kwArgs = self .__baseMpvArgs ()
134131 kwArgs ["vo" ]= "libmpv"
135132 self .mediaPlayer = MPV (** kwArgs )
@@ -191,7 +188,9 @@ def __baseMpvArgs(self):
191188 #"demuxer_cache_wait" : 'no', #if yes remote files take too long...
192189 #"demuxer_max_bytes " : '10000MiB',
193190 #"demuxer_backward_playback_step" : 180,
194- "volume" : 100
191+ "volume" : 100 ,
192+ #"gpu_context":'x11egl', # Or explicitly specify 'egl', 'x11', etc.
193+ "opengl_early_flush" :'yes'
195194 }
196195
197196 def _resetState (self ):
@@ -228,35 +227,8 @@ def _hookEvents(self):
228227 self .mediaPlayer .observe_property ("eof-reached" ,self ._onPlayEnd )
229228 #mostly wrong: self.mediaPlayer.observe_property("estimated-frame-count",self._onFramecount)
230229 self .mediaPlayer .observe_property ("video-frame-info" ,self ._onFrameInfo )
231-
232- '''
233- TEst with jasegs event handler...
234- def open_withEvent(self,filePath):
235- print("open:",filePath)
236- try:
237- self._resetState()
238- self.mediaPlayer.close()
239- self.mediaPlayer.loadfile(filePath)
240- #Try to pin down a potential file error
241- @self.mediaPlayer.event_callback('end_file')
242- def eofHandler(evt):
243- self._superviseEndFileEvent(evt)
244- self._getReady()
245- eofHandler.unregister_mpv_events()
246- except Exception as ex:
247- Log.logException("Open mpv file")
248- print(ex)
249-
250- def _superviseEndFileEvent(self,evt):
251- if evt['event']['reason'] != MpvEventEndFile.REDIRECT or evt['event']['reason'] != MpvEventEndFile.RESTARTED:
252- self.lastError=self.ERR_IDS[0]
253- with self.seekLock:
254- print('check notify:',evt)
255- self.seekLock.notify()
256230
257- return True
258- '''
259-
231+
260232 def open (self ,filePath ):
261233 try :
262234 #Very verbose: self.mediaPlayer.register_event_callback(self._oncallback)
@@ -471,7 +443,6 @@ def _passLog(self,loglevel, component, message):
471443 msg = '{}: {}' .format (component , message )
472444 Log .error (">%s" ,msg )
473445 with self .seekLock :
474- #TODO: file not recognized seems not be working"
475446 if message in self .ERR_IDS :
476447 self .lastError = message
477448 self .seekLock .notifyAll ()
@@ -586,13 +557,13 @@ def _createGLWidget(self,parent):
586557 self .player = MpvPlayer ()
587558 mpv = self .player .initGLPlayer ()
588559 self .mpvWidget = VideoGLWidget (parent ,mpv )
589- self .player .connectTo (self .mpvWidget .updateUI )
560+ self .player .connectTo (self .mpvWidget .updateUI ) #GL connect
590561 return self .mpvWidget
591562
592563 def __setupPlayer (self ):
593564 if self .showGL :
594565 return #already happened
595- if self .player :
566+ if self .player : #Non GL connect
596567 self .player .close ()
597568 self .player = MpvPlayer ()
598569 self .player .initPlayer (self .mpvWidget )
0 commit comments