Page 1 of 1

Video doesn't scale until manual resize (macOS)

Posted: 11 Nov 2020 15:10
by Timothy Grove
I'm using the VLC bindings for Python with PyQt5 on macOS, and I'm seeing an issue where a video does not scale up or down to fit the QWidget until it is manually resized; sometimes it does, but mostly it doesn't.
All of the early VLC 3.0 versions work fine until I get to 3.0.7. The changelog suggested that there was a sizing glitch fixed between 3.0.8 and 3.0.9, but that doesn't fix this issue for me. I haven't tested 4.0.

I'm digging around in the VLC source code to see if I can understand the problem, but can anyone point me in the right direction?

I'm using an updated version of the sample player given at: https://raw.githubusercontent.com/oaube ... s/qtvlc.py

Code: Select all

#! /usr/bin/python3 import sys import os.path import vlc from PyQt5 import QtGui, QtCore, QtWidgets unicode = str # Python 3 class Player(QtWidgets.QMainWindow): """A simple Media Player using VLC and Qt """ def __init__(self, master=None): QtWidgets.QMainWindow.__init__(self, master) self.setWindowTitle("Media Player") self.instance = vlc.Instance() self.mediaplayer = self.instance.media_player_new() self.createUI() self.isPaused = False def createUI(self): self.widget = QtWidgets.QWidget(self) self.setCentralWidget(self.widget) self.videoframe = QtWidgets.QFrame() self.palette = self.videoframe.palette() self.palette.setColor (QtGui.QPalette.Window, QtGui.QColor(0,0,0)) self.videoframe.setPalette(self.palette) self.videoframe.setAutoFillBackground(True) self.positionslider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self) self.positionslider.setToolTip("Position") self.positionslider.setMaximum(1000) self.positionslider.sliderMoved.connect(self.setPosition) self.hbuttonbox = QtWidgets.QHBoxLayout() self.playbutton = QtWidgets.QPushButton("Play") self.hbuttonbox.addWidget(self.playbutton) self.playbutton.clicked.connect(self.PlayPause) self.stopbutton = QtWidgets.QPushButton("Stop") self.hbuttonbox.addWidget(self.stopbutton) self.stopbutton.clicked.connect(self.Stop) self.hbuttonbox.addStretch(1) self.volumeslider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self) self.volumeslider.setMaximum(100) self.volumeslider.setValue(self.mediaplayer.audio_get_volume()) self.volumeslider.setToolTip("Volume") self.hbuttonbox.addWidget(self.volumeslider) self.volumeslider.valueChanged.connect(self.setVolume) self.vboxlayout = QtWidgets.QVBoxLayout() self.vboxlayout.addWidget(self.videoframe) self.vboxlayout.addWidget(self.positionslider) self.vboxlayout.addLayout(self.hbuttonbox) self.widget.setLayout(self.vboxlayout) open = QtWidgets.QAction("&Open", self) open.triggered.connect(self.OpenFile) exit = QtWidgets.QAction("&Exit", self) exit.triggered.connect(sys.exit) menubar = self.menuBar() filemenu = menubar.addMenu("&File") filemenu.addAction(open) filemenu.addSeparator() filemenu.addAction(exit) self.timer = QtCore.QTimer(self) self.timer.setInterval(200) self.timer.timeout.connect(self.updateUI) def PlayPause(self): if self.mediaplayer.is_playing(): self.mediaplayer.pause() self.playbutton.setText("Play") self.isPaused = True else: if self.mediaplayer.play() == -1: self.OpenFile() return self.mediaplayer.play() self.playbutton.setText("Pause") self.timer.start() self.isPaused = False def Stop(self): self.mediaplayer.stop() self.playbutton.setText("Play") def OpenFile(self, filename=None): if not filename: filename = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", os.path.expanduser('~'))[0] if not filename: return self.media = self.instance.media_new(filename) self.mediaplayer.set_media(self.media) self.media.parse() self.setWindowTitle(self.media.get_meta(0)) if sys.platform.startswith('linux'): # for Linux using the X Server self.mediaplayer.set_xwindow(self.videoframe.winId()) elif sys.platform == "win32": # for Windows self.mediaplayer.set_hwnd(self.videoframe.winId()) elif sys.platform == "darwin": # for MacOS self.mediaplayer.set_nsobject(int(self.videoframe.winId())) self.PlayPause() def setVolume(self, Volume): self.mediaplayer.audio_set_volume(Volume) def setPosition(self, position): self.mediaplayer.set_position(position / 1000.0) def updateUI(self): self.positionslider.setValue(self.mediaplayer.get_position() * 1000) if not self.mediaplayer.is_playing(): self.timer.stop() if not self.isPaused: self.Stop() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) player = Player() player.show() player.resize(640, 480) if sys.argv[1:]: player.OpenFile(sys.argv[1]) sys.exit(app.exec_())
Any suggestions on a workaround? Thanks.

I'm working with Python3.7.6, PyQt5.13.1, macOS Mojave/Catalina; not seeing this on Windows or Linux.

My display uses:

Intel HD Graphics 4000:
Chipset Model: Intel HD Graphics 4000
Type: GPU
Bus: Built-In
VRAM (Dynamic, Max): 1536 MB
Vendor: Intel
Device ID: 0x0166
Revision ID: 0x0009
Metal: Supported, feature set macOS GPUFamily1 v4

Re: Video doesn't scale until manual resize (macOS)

Posted: 12 Nov 2020 06:06
by mfkl
a video does not scale up or down to fit the QWidget until it is manually resized
Could you please share a gif or video of the behavior you observe? I'm not sure that I understand the problem.

Re: Video doesn't scale until manual resize (macOS)

Posted: 12 Nov 2020 22:31
by Timothy Grove
Here are a couple of videos to show this behaviour.

https://drive.google.com/file/d/11Lnwhf ... sp=sharing
https://drive.google.com/file/d/1pIZQkL ... sp=sharing

The first is smaller than the video window when loaded and doesn't scale up until the edge of the player is dragged.
The second is larger and doesn't scale down until the edge of the player is dragged.

The behaviour is first seen in VLC 3.0.7.

Re: Video doesn't scale until manual resize (macOS)

Posted: 16 Nov 2020 04:14
by mfkl
Ok, thanks. Can you repro with the official Qt sample? https://code.videolan.org/videolan/vlc- ... c/QtPlayer

If so, feel free to open a bug report on trac.videolan.org with all your info.

Re: Video doesn't scale until manual resize (macOS)

Posted: 17 Nov 2020 19:11
by Timothy Grove
Ok, will do, once I have some success at building this... Which forum best for discussing compilation issues? Any pre-built versions of this around?

Re: Video doesn't scale until manual resize (macOS)

Posted: 18 Nov 2020 04:50
by mfkl
here or the libvlc discord https://discord.com/invite/3h3K3JF

Re: Video doesn't scale until manual resize (macOS)

Posted: 18 Nov 2020 17:48
by Timothy Grove
Okay, got the code as suggested above and trying to build through QtCreator 4.13.2, with Qt5.13.2, on macOS 10.15.7 (Catalina).

The only thing I altered was QtVLC.pro to indicate paths on my system:

Code: Select all

TEMPLATE = app TARGET = qtvlc DEPENDPATH += . INCLUDEPATH += . \ ../../../include # /Users/timothy/VLCSource/vlc-3.0/include/vlc LIBS += -L/Applications/VLC.app/Contents/MacOS/lib # VLC 3.0.11.1 LIBS += -L/opt/X11/lib # Xquartz.org; X11 no longer included with Mac LIBS += -lvlc -lX11 QT = widgets # Input HEADERS += player.h \ ../../../include/vlc/vlc.h SOURCES += main.cpp player.cpp

Re: Video doesn't scale until manual resize (macOS)

Posted: 18 Nov 2020 17:51
by Timothy Grove
Actually, the compilation steps appear to be okay, but the app start fails:

Code: Select all

15:45:54: Starting /Users/timothy/VLCSource/vlc-3.0/doc/libvlc/build-QtVLC-Desktop_Qt_5_15_0_clang_64bit-Debug/qtvlc.app/Contents/MacOS/qtvlc ... dyld: Symbol not found: _gll_noop Referenced from: /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL Expected in: /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL in /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL 15:45:56: The program has unexpectedly finished. 15:45:56: The process was ended forcefully. 15:45:56: /Users/timothy/VLCSource/vlc-3.0/doc/libvlc/build-QtVLC-Desktop_Qt_5_15_0_clang_64bit-Debug/qtvlc.app/Contents/MacOS/qtvlc crashed.
Seems to be an issue around X11 and OpenGL, but unsure how to correct at the moment...

Re: Video doesn't scale until manual resize (macOS)

Posted: 19 Nov 2020 16:28
by Timothy Grove
Okay, I was able to build the QtVLC player in QtCreator and can reproduce the sizing issue; so off to file the bug report...

This was the QtVLC.pro file I ended up with:

Code: Select all

TEMPLATE = app TARGET = qtvlc DEPENDPATH += . INCLUDEPATH += /Applications/VLC.app/Contents/MacOS/include LIBS += -L/Applications/VLC.app/Contents/MacOS/lib -lvlc # LIBS += -L/opt/X11/lib -lX11 #not required QT += core gui widgets # Input HEADERS += \ player.h SOURCES += \ main.cpp \ player.cpp
And also needed to set the VLC_PLUGIN_PATH in player.cpp"

Code: Select all

Mwindow::Mwindow() { vlcPlayer = NULL; /*need to set VLC_PLUGIN_PATH; both of the following seem to work*/ /*setenv ("VLC_PLUGIN_PATH", "/Applications/VLC.app/Contents/MacOS/plugins", 1);*/ QByteArray ba=QString("/Applications/VLC.app/Contents/MacOS/plugins").toUtf8(); qputenv("VLC_PLUGIN_PATH",ba); /* Initialize libVLC */ vlcInstance = libvlc_new(0, NULL);