diff --git a/bin/start_viewer.sh b/bin/start_viewer.sh index bd4dd1d8d..8dbf37cec 100755 --- a/bin/start_viewer.sh +++ b/bin/start_viewer.sh @@ -38,6 +38,22 @@ trap '' 16 # Disable swapping echo 0 > /sys/fs/cgroup/memory/memory.swappiness +# Start X server with dummy video driver +export DISPLAY=:0 +rm -rf /tmp/.X0-lock +Xorg :0 -s 0 dpms & + +# Wait for X server to be ready +until xset -display :0 q > /dev/null 2>&1; do + echo "Waiting for X server to be ready" + sleep 0.1 +done + +# Now that X is ready, configure display settings +xset -display :0 s off +xset -display :0 s noblank +xset -display :0 -dpms + # Start viewer sudo -E -u viewer dbus-run-session python viewer.py & diff --git a/docker/Dockerfile.viewer.j2 b/docker/Dockerfile.viewer.j2 index d6a997129..0867172c3 100644 --- a/docker/Dockerfile.viewer.j2 +++ b/docker/Dockerfile.viewer.j2 @@ -45,7 +45,7 @@ RUN c_rehash # QT Base from packages does not support eglfs -{% if board != 'pi5' %} +{% if board != 'pi5' and board != 'pi4-64' %} RUN curl "{{webview_base_url}}/qt{{qt_major_version}}-{{qt_version}}-{{debian_version}}-{{board}}.tar.gz" \ -sL -o "/tmp/qt{{qt_major_version}}-{{qt_version}}-{{debian_version}}-{{board}}.tar.gz" && \ curl "{{webview_base_url}}/qt{{qt_major_version}}-{{qt_version}}-{{debian_version}}-{{board}}.tar.gz.sha256" \ @@ -65,8 +65,12 @@ RUN curl "{{webview_base_url}}/webview-{{qt_version}}-{{debian_version}}-{{board tar -xzf "/tmp/webview-{{qt_version}}-{{debian_version}}-{{board}}-{{webview_git_hash}}.tar.gz" -C /usr/local && \ rm "webview-{{qt_version}}-{{debian_version}}-{{board}}-{{webview_git_hash}}.tar.gz" -ENV QT_QPA_EGLFS_FORCE888=1 +{% if board == 'pi4' and target_platform == 'linux/arm64/v8' %} +ENV QT_QPA_PLATFORM=xcb +ENV DISPLAY=:0 +{% else %} ENV QT_QPA_PLATFORM=linuxfb +{% endif %} # Turn on debug logging for now #ENV QT_LOGGING_RULES=qt.qpa.*=true diff --git a/lib/media_player.py b/lib/media_player.py index 9a330fba7..a8981c9b2 100644 --- a/lib/media_player.py +++ b/lib/media_player.py @@ -2,6 +2,7 @@ import sh import vlc +import platform from lib.device_helper import get_device_type from settings import settings @@ -81,10 +82,15 @@ def get_alsa_audio_device(self): return 'default:CARD=HID' def __get_options(self): - return [ + options = [ f'--alsa-audio-device={self.get_alsa_audio_device()}', ] + if platform.architecture()[0] == '64bit' and get_device_type() == 'pi4': + options.append('--vout=xcb_x11') + + return options + def set_asset(self, uri, duration): self.player.set_mrl(uri) settings.load() diff --git a/tools/image_builder/__main__.py b/tools/image_builder/__main__.py index 20be6fb55..e634eb755 100644 --- a/tools/image_builder/__main__.py +++ b/tools/image_builder/__main__.py @@ -65,10 +65,11 @@ def build_image( ] if board in ['pi1', 'pi2', 'pi3', 'pi4']: - base_apt_dependencies.extend(['libraspberrypi0']) + if not (board == 'pi4' and target_platform == 'linux/arm64/v8'): + base_apt_dependencies.extend(['libraspberrypi0']) if service == 'viewer': - context.update(get_viewer_context(board)) + context.update(get_viewer_context(board, target_platform)) elif service == 'test': context.update(get_test_context()) elif service == 'wifi-connect': @@ -171,7 +172,8 @@ def main( git_hash = str(pygit2.Repository('.').head.target) git_short_hash = git_hash[:SHORT_HASH_LENGTH] - build_parameters = get_build_parameters(build_target) + build_parameters = get_build_parameters(build_target, target_platform) + board = build_parameters['board'] base_image = build_parameters['base_image'] diff --git a/tools/image_builder/utils.py b/tools/image_builder/utils.py index 9b7605b49..cc91cd167 100644 --- a/tools/image_builder/utils.py +++ b/tools/image_builder/utils.py @@ -5,7 +5,7 @@ from tools.image_builder.constants import GITHUB_REPO_URL -def get_build_parameters(build_target: str) -> dict: +def get_build_parameters(build_target: str, target_platform: str | None = None) -> dict: default_build_parameters = { 'board': 'x86', 'base_image': 'debian', @@ -19,11 +19,18 @@ def get_build_parameters(build_target: str) -> dict: 'target_platform': 'linux/arm64/v8', } if build_target == 'pi4': - return { - 'board': 'pi4', - 'base_image': 'balenalib/raspberrypi3-debian', - 'target_platform': 'linux/arm/v8', - } + if target_platform == 'linux/arm64/v8': + return { + 'board': 'pi4', + 'base_image': 'balenalib/raspberrypi4-64-debian', + 'target_platform': 'linux/arm64/v8', + } + else: + return { + 'board': 'pi4', + 'base_image': 'balenalib/raspberrypi3-debian', + 'target_platform': 'linux/arm/v8', + } elif build_target == 'pi3': return { 'board': 'pi3', @@ -98,7 +105,7 @@ def get_test_context() -> dict: } -def get_viewer_context(board: str) -> dict: +def get_viewer_context(board: str, target_platform: str) -> dict: webview_git_hash = ( '389f1ccc' if board == 'pi5' else '5e556681738a1fa918dc9f0bf5879ace2e603e12' @@ -108,6 +115,7 @@ def get_viewer_context(board: str) -> dict: f'{releases_url}/WebView-v0.3.4' if board == 'pi5' else f'{releases_url}/WebView-v0.3.3' ) + context = {} qt_version = '5.15.14' @@ -229,13 +237,22 @@ def get_viewer_context(board: str) -> dict: 'libswscale-dev', ] - if board == 'pi5': + if board == 'pi5' or (board == 'pi4' and target_platform == 'linux/arm64/v8'): apt_dependencies.extend([ 'qt6-base-dev', 'qt6-webengine-dev', ]) - if board not in ['x86', 'pi5']: + if board == 'pi4' and target_platform == 'linux/arm64/v8': + apt_dependencies.extend([ + 'xserver-xorg-core', + 'xserver-xorg-video-fbdev', + 'x11-xserver-utils', + 'xauth', + 'xinit', + ]) + + if board not in ['x86', 'pi5'] and not (board == 'pi4' and target_platform == 'linux/arm64/v8'): apt_dependencies.extend([ 'libraspberrypi0', 'libgst-dev', @@ -246,12 +263,19 @@ def get_viewer_context(board: str) -> dict: if board != 'pi1': apt_dependencies.extend(['libssl1.1']) + if board == 'pi4' and target_platform == 'linux/arm64/v8': + context.update({ + 'board': 'pi4-64', + }) + return { 'apt_dependencies': apt_dependencies, 'qt_version': qt_version, 'qt_major_version': qt_major_version, 'webview_git_hash': webview_git_hash, 'webview_base_url': webview_base_url, + 'target_platform': target_platform, + **context, }