Compare commits
5 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
f98506d3bb |
|||
| 6a81c77cf8 | |||
|
797de7c2a9 |
|||
|
206336bdd1 |
|||
|
dfd1702835 |
23 changed files with 743 additions and 7936 deletions
|
|
@ -35,7 +35,7 @@ jobs:
|
|||
ISSUE_TOKEN: ${{ secrets.issue_token }}
|
||||
LABEL_NUMBER: 13
|
||||
fix_only: all -git-annex
|
||||
skip_package: dotnet9-stage0 dotnet8-stage0 py3-boto3 py3-botocore
|
||||
skip_package: dotnet9-stage0 dotnet8-stage0 py3-boto3 py3-botocore dotnet10-stage0
|
||||
steps:
|
||||
- name: Environment setup
|
||||
run: apk add grep coreutils gawk curl wget bash nodejs git jq sed
|
||||
|
|
|
|||
|
|
@ -26,3 +26,25 @@ jobs:
|
|||
run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh
|
||||
- name: Create issues
|
||||
run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh
|
||||
check-pmos-latest:
|
||||
name: Check pmos(v25.12) repo
|
||||
runs-on: aarch64
|
||||
container:
|
||||
image: alpine:latest
|
||||
env:
|
||||
downstream: http://mirror.postmarketos.org/postmarketos/v25.12
|
||||
ISSUE_TOKEN: ${{ secrets.issue_token }}
|
||||
LABEL_NUMBER: 14
|
||||
fix_only: all
|
||||
skip_package: device-clockworkpi-uconsole-radxa-cm5 device-pine64-pinenote u-boot-radxa-cm5
|
||||
steps:
|
||||
- name: Environment setup
|
||||
run: apk add grep coreutils gawk curl wget bash nodejs git jq sed
|
||||
- name: Get scripts
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Check out-of-date packages
|
||||
run: ${{ github.workspace }}/.forgejo/bin/check_ver.sh
|
||||
- name: Create issues
|
||||
run: ${{ github.workspace }}/.forgejo/bin/create_issue.sh
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
diff --git a/serial/SerialPortManager.cpp.orig b/serial/SerialPortManager.cpp
|
||||
index 22565b5..d444eee 100644
|
||||
--- a/serial/SerialPortManager.cpp.orig
|
||||
+++ b/serial/SerialPortManager.cpp
|
||||
@@ -1945,8 +1945,9 @@ void SerialPortManager::attemptRecovery()
|
||||
}
|
||||
} else {
|
||||
qCWarning(log_core_serial) << "Serial port recovery attempt failed";
|
||||
- if (eventCallback) {
|
||||
- eventCallback->onStatusUpdate(QString("Recovery attempt %1 failed").arg(m_connectionRetryCount));
|
||||
+ if (eventCallback) {
|
||||
+ int crc = m_connectionRetryCount;
|
||||
+ eventCallback->onStatusUpdate(QString("Recovery attempt %1 failed").arg(crc));
|
||||
}
|
||||
|
||||
// Try again if we haven't exceeded max attempts
|
||||
@@ -2034,4 +2035,4 @@ void SerialPortManager::applyCommandBasedBaudrateChange(int baudRate, const QStr
|
||||
} else {
|
||||
qCWarning(log_core_serial) << logPrefix << "Failed to apply user selected baudrate:" << baudRate;
|
||||
}
|
||||
-}
|
||||
\ No newline at end of file
|
||||
+}
|
||||
|
|
@ -0,0 +1,586 @@
|
|||
From 4478cfb004d3db7797e99fd3bdb23bf880a9c85b Mon Sep 17 00:00:00 2001
|
||||
From: John Lane <1786613+johnlane@users.noreply.github.com>
|
||||
Date: Wed, 3 Dec 2025 21:19:33 +0000
|
||||
Subject: [PATCH 1/2] Remove additional backslashes and add missing cpp and h
|
||||
files
|
||||
|
||||
---
|
||||
openterfaceQT.pro | 28 +++++++++++++++++++---------
|
||||
1 file changed, 19 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/openterfaceQT.pro b/openterfaceQT.pro
|
||||
index 3460dbac..f0d878e8 100644
|
||||
--- a/openterfaceQT.pro
|
||||
+++ b/openterfaceQT.pro
|
||||
@@ -84,16 +84,26 @@ SOURCES += main.cpp \
|
||||
!win32 {
|
||||
SOURCES += host/backend/ffmpegbackendhandler.cpp \
|
||||
host/backend/gstreamerbackendhandler.cpp \
|
||||
- host/backend/gstreamer/sinkselector.cpp \\
|
||||
- host/backend/gstreamer/queueconfigurator.cpp \\
|
||||
- host/backend/gstreamer/videooverlaymanager.cpp \\
|
||||
- host/backend/gstreamer/pipelinebuilder.cpp
|
||||
+ host/backend/gstreamer/pipelinefactory.cpp \
|
||||
+ host/backend/gstreamer/externalgstrunner.cpp \
|
||||
+ host/backend/gstreamer/inprocessgstrunner.cpp \
|
||||
+ host/backend/gstreamer/sinkselector.cpp \
|
||||
+ host/backend/gstreamer/queueconfigurator.cpp \
|
||||
+ host/backend/gstreamer/videooverlaymanager.cpp \
|
||||
+ host/backend/gstreamer/pipelinebuilder.cpp \
|
||||
+ host/backend/gstreamer/recordingmanager.cpp \
|
||||
+ host/backend/gstreamer/gstreamerhelpers.cpp
|
||||
HEADERS += host/backend/ffmpegbackendhandler.h \
|
||||
host/backend/gstreamerbackendhandler.h \
|
||||
- host/backend/gstreamer/sinkselector.h \\
|
||||
- host/backend/gstreamer/queueconfigurator.h \\
|
||||
- host/backend/gstreamer/videooverlaymanager.h \\
|
||||
- host/backend/gstreamer/pipelinebuilder.h
|
||||
+ host/backend/gstreamer/pipelinefactory.h \
|
||||
+ host/backend/gstreamer/externalgstrunner.h \
|
||||
+ host/backend/gstreamer/inprocessgstrunner.h \
|
||||
+ host/backend/gstreamer/sinkselector.h \
|
||||
+ host/backend/gstreamer/queueconfigurator.h \
|
||||
+ host/backend/gstreamer/videooverlaymanager.h \
|
||||
+ host/backend/gstreamer/pipelinebuilder.h \
|
||||
+ host/backend/gstreamer/recordingmanager.h \
|
||||
+ host/backend/gstreamer/gstreamerhelpers.h
|
||||
}
|
||||
|
||||
|
||||
@@ -263,4 +273,4 @@ TRANSLATIONS += config/languages/openterface_en.ts \
|
||||
config/languages/openterface_se.ts \
|
||||
config/languages/openterface_de.ts \
|
||||
config/languages/openterface_zh.ts
|
||||
- # Add more languages here
|
||||
\ No newline at end of file
|
||||
+ # Add more languages here
|
||||
|
||||
From ccd8f51fe510684439edf0d5f8083e4dd1423836 Mon Sep 17 00:00:00 2001
|
||||
From: John Lane <1786613+johnlane@users.noreply.github.com>
|
||||
Date: Wed, 3 Dec 2025 21:26:20 +0000
|
||||
Subject: [PATCH 2/2] De-duplicate logging categories
|
||||
|
||||
---
|
||||
host/backend/gstreamer/gstreamerhelpers.cpp | 22 ++--
|
||||
host/backend/gstreamer/queueconfigurator.cpp | 8 +-
|
||||
.../backend/gstreamer/videooverlaymanager.cpp | 118 +++++++++---------
|
||||
3 files changed, 74 insertions(+), 74 deletions(-)
|
||||
|
||||
diff --git a/host/backend/gstreamer/gstreamerhelpers.cpp b/host/backend/gstreamer/gstreamerhelpers.cpp
|
||||
index 6fc1dd6e..4739da17 100644
|
||||
--- a/host/backend/gstreamer/gstreamerhelpers.cpp
|
||||
+++ b/host/backend/gstreamer/gstreamerhelpers.cpp
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <QDebug>
|
||||
#include <QLoggingCategory>
|
||||
|
||||
-Q_LOGGING_CATEGORY(log_gstreamer_backend, "opf.backend.gstreamer")
|
||||
+Q_LOGGING_CATEGORY(log_gstreamer_gstreamerhelpers, "opf.backend.gstreamerhelpers")
|
||||
|
||||
using namespace Openterface::GStreamer::GstHelpers;
|
||||
|
||||
@@ -16,7 +16,7 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme
|
||||
{
|
||||
if (!elementPtr) {
|
||||
if (outError) *outError = QStringLiteral("Element pointer is null");
|
||||
- qCWarning(log_gstreamer_backend) << "setPipelineStateWithTimeout: element pointer is null";
|
||||
+ qCWarning(log_gstreamer_gstreamerhelpers) << "setPipelineStateWithTimeout: element pointer is null";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme
|
||||
|
||||
GstStateChangeReturn ret = gst_element_set_state(element, static_cast<GstState>(targetState));
|
||||
if (ret == GST_STATE_CHANGE_FAILURE) {
|
||||
- qCCritical(log_gstreamer_backend) << "Failed to set element state to" << targetState;
|
||||
+ qCCritical(log_gstreamer_gstreamerhelpers) << "Failed to set element state to" << targetState;
|
||||
// Try to pull any error from the bus for diagnostics
|
||||
// Caller may pass a bus to parseAndLogGstErrorMessage, but we don't have it here.
|
||||
if (outError) *outError = QStringLiteral("Failed to set state (GST_STATE_CHANGE_FAILURE)");
|
||||
@@ -35,13 +35,13 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme
|
||||
ret = gst_element_get_state(element, &state, &pending, static_cast<GstClockTime>(timeoutMs) * GST_MSECOND);
|
||||
if (ret == GST_STATE_CHANGE_FAILURE) {
|
||||
if (outError) *outError = QStringLiteral("State change failure");
|
||||
- qCCritical(log_gstreamer_backend) << "State change failure waiting for target state";
|
||||
+ qCCritical(log_gstreamer_gstreamerhelpers) << "State change failure waiting for target state";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (state != static_cast<GstState>(targetState)) {
|
||||
if (outError) *outError = QStringLiteral("Element did not reach target state in timeout");
|
||||
- qCCritical(log_gstreamer_backend) << "Element failed to reach state" << targetState << "(current:" << state << ", pending:" << pending << ")";
|
||||
+ qCCritical(log_gstreamer_gstreamerhelpers) << "Element failed to reach state" << targetState << "(current:" << state << ", pending:" << pending << ")";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -51,14 +51,14 @@ bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* eleme
|
||||
void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* busPtr, const char* context)
|
||||
{
|
||||
if (!busPtr) {
|
||||
- qCWarning(log_gstreamer_backend) << "Bus not available for error details" << (context ? context : "");
|
||||
+ qCWarning(log_gstreamer_gstreamerhelpers) << "Bus not available for error details" << (context ? context : "");
|
||||
return;
|
||||
}
|
||||
|
||||
GstBus* bus = static_cast<GstBus*>(busPtr);
|
||||
GstMessage* msg = gst_bus_pop_filtered(bus, GST_MESSAGE_ERROR);
|
||||
if (!msg) {
|
||||
- qCDebug(log_gstreamer_backend) << "No error message available on bus" << (context ? context : "");
|
||||
+ qCDebug(log_gstreamer_gstreamerhelpers) << "No error message available on bus" << (context ? context : "");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -66,8 +66,8 @@ void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* busPtr
|
||||
gchar* debug_info = nullptr;
|
||||
gst_message_parse_error(msg, &error, &debug_info);
|
||||
|
||||
- qCCritical(log_gstreamer_backend) << "GStreamer Error:" << (error ? error->message : "Unknown") << (context ? context : "");
|
||||
- qCCritical(log_gstreamer_backend) << "Debug info:" << (debug_info ? debug_info : "None");
|
||||
+ qCCritical(log_gstreamer_gstreamerhelpers) << "GStreamer Error:" << (error ? error->message : "Unknown") << (context ? context : "");
|
||||
+ qCCritical(log_gstreamer_gstreamerhelpers) << "Debug info:" << (debug_info ? debug_info : "None");
|
||||
|
||||
if (error) g_error_free(error);
|
||||
if (debug_info) g_free(debug_info);
|
||||
@@ -79,13 +79,13 @@ void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* busPtr
|
||||
bool Openterface::GStreamer::GstHelpers::setPipelineStateWithTimeout(void* /*elementPtr*/, int /*targetState*/, int /*timeoutMs*/, QString* outError)
|
||||
{
|
||||
if (outError) *outError = QStringLiteral("GStreamer not available in this build");
|
||||
- qCWarning(log_gstreamer_backend) << "setPipelineStateWithTimeout called but GStreamer is not compiled in";
|
||||
+ qCWarning(log_gstreamer_gstreamerhelpers) << "setPipelineStateWithTimeout called but GStreamer is not compiled in";
|
||||
return false;
|
||||
}
|
||||
|
||||
void Openterface::GStreamer::GstHelpers::parseAndLogGstErrorMessage(void* /*busPtr*/, const char* context)
|
||||
{
|
||||
- qCDebug(log_gstreamer_backend) << "GStreamer not compiled in - no bus to parse" << (context ? context : "");
|
||||
+ qCDebug(log_gstreamer_gstreamerhelpers) << "GStreamer not compiled in - no bus to parse" << (context ? context : "");
|
||||
}
|
||||
|
||||
#endif // HAVE_GSTREAMER
|
||||
diff --git a/host/backend/gstreamer/queueconfigurator.cpp b/host/backend/gstreamer/queueconfigurator.cpp
|
||||
index b7bea42e..12290193 100644
|
||||
--- a/host/backend/gstreamer/queueconfigurator.cpp
|
||||
+++ b/host/backend/gstreamer/queueconfigurator.cpp
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <gst/gst.h>
|
||||
#endif
|
||||
|
||||
-Q_LOGGING_CATEGORY(log_gstreamer_backend, "opf.backend.gstreamer")
|
||||
+Q_LOGGING_CATEGORY(log_gstreamer_queueconfigurator, "opf.backend.queueconfigurator")
|
||||
|
||||
using namespace Openterface::GStreamer;
|
||||
|
||||
@@ -26,10 +26,10 @@ void QueueConfigurator::configureDisplayQueue(void* pipeline)
|
||||
"max-size-time", G_GUINT64_CONSTANT(100000000), // 100ms
|
||||
"leaky", 2, // GST_QUEUE_LEAK_DOWNSTREAM
|
||||
NULL);
|
||||
- qCDebug(log_gstreamer_backend) << "✓ Configured display queue with higher priority for qtsink";
|
||||
+ qCDebug(log_gstreamer_queueconfigurator) << "✓ Configured display queue with higher priority for qtsink";
|
||||
gst_object_unref(displayQueue);
|
||||
} else {
|
||||
- qCDebug(log_gstreamer_backend) << "Display queue element not found (no named display-queue)";
|
||||
+ qCDebug(log_gstreamer_queueconfigurator) << "Display queue element not found (no named display-queue)";
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(pipeline);
|
||||
@@ -50,7 +50,7 @@ void QueueConfigurator::configureRecordingQueue(void* pipeline)
|
||||
"max-size-time", G_GUINT64_CONSTANT(500000000), // 500ms
|
||||
"leaky", 1, // GST_QUEUE_LEAK_UPSTREAM
|
||||
NULL);
|
||||
- qCDebug(log_gstreamer_backend) << "✓ Configured recording queue with lower priority relative to display";
|
||||
+ qCDebug(log_gstreamer_queueconfigurator) << "✓ Configured recording queue with lower priority relative to display";
|
||||
gst_object_unref(recordingQueue);
|
||||
}
|
||||
#else
|
||||
diff --git a/host/backend/gstreamer/videooverlaymanager.cpp b/host/backend/gstreamer/videooverlaymanager.cpp
|
||||
index d8bf42f3..2dbe3bbf 100644
|
||||
--- a/host/backend/gstreamer/videooverlaymanager.cpp
|
||||
+++ b/host/backend/gstreamer/videooverlaymanager.cpp
|
||||
@@ -22,7 +22,7 @@ static int x11_overlay_error_handler_local(Display* display, XErrorEvent* error)
|
||||
}
|
||||
#endif
|
||||
|
||||
-Q_LOGGING_CATEGORY(log_gstreamer_backend, "opf.backend.gstreamer")
|
||||
+Q_LOGGING_CATEGORY(log_gstreamer_videooverlaymanager, "opf.backend.videooverlaymanager")
|
||||
|
||||
using namespace Openterface::GStreamer;
|
||||
|
||||
@@ -30,36 +30,36 @@ bool VideoOverlayManager::embedVideoInWidget(void* pipeline, QWidget* widget)
|
||||
{
|
||||
#ifdef HAVE_GSTREAMER
|
||||
if (!widget || !pipeline) {
|
||||
- qCWarning(log_gstreamer_backend) << "Cannot embed video: widget or pipeline is null";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Cannot embed video: widget or pipeline is null";
|
||||
return false;
|
||||
}
|
||||
|
||||
GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink");
|
||||
if (!videoSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "No video sink element named 'videosink' found in pipeline";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink element named 'videosink' found in pipeline";
|
||||
videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
|
||||
if (!videoSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "No video overlay interface found in pipeline either";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video overlay interface found in pipeline either";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
WId winId = widget->winId();
|
||||
if (winId) {
|
||||
- qCDebug(log_gstreamer_backend) << "Embedding video in widget with window ID:" << winId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Embedding video in widget with window ID:" << winId;
|
||||
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), winId);
|
||||
gst_object_unref(videoSink);
|
||||
- qCDebug(log_gstreamer_backend) << "Video embedded in widget successfully";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Video embedded in widget successfully";
|
||||
return true;
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Widget window ID is null, cannot embed video";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Widget window ID is null, cannot embed video";
|
||||
gst_object_unref(videoSink);
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(pipeline)
|
||||
Q_UNUSED(widget)
|
||||
- qCDebug(log_gstreamer_backend) << "Using autovideosink for video output (no in-process GStreamer)";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Using autovideosink for video output (no in-process GStreamer)";
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
@@ -68,36 +68,36 @@ bool VideoOverlayManager::embedVideoInGraphicsView(void* pipeline, QGraphicsView
|
||||
{
|
||||
#ifdef HAVE_GSTREAMER
|
||||
if (!view || !pipeline) {
|
||||
- qCWarning(log_gstreamer_backend) << "Cannot embed video: graphics view or pipeline is null";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Cannot embed video: graphics view or pipeline is null";
|
||||
return false;
|
||||
}
|
||||
|
||||
GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink");
|
||||
if (!videoSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "No video sink element named 'videosink' found in pipeline";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink element named 'videosink' found in pipeline";
|
||||
videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
|
||||
if (!videoSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "No video overlay interface found in pipeline either";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video overlay interface found in pipeline either";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
WId winId = view->winId();
|
||||
if (winId) {
|
||||
- qCDebug(log_gstreamer_backend) << "Embedding video in graphics view with window ID:" << winId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Embedding video in graphics view with window ID:" << winId;
|
||||
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), winId);
|
||||
gst_object_unref(videoSink);
|
||||
- qCDebug(log_gstreamer_backend) << "Video embedded in graphics view successfully";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Video embedded in graphics view successfully";
|
||||
return true;
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Graphics view window ID is null, cannot embed video";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Graphics view window ID is null, cannot embed video";
|
||||
gst_object_unref(videoSink);
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(pipeline)
|
||||
Q_UNUSED(view)
|
||||
- qCDebug(log_gstreamer_backend) << "Using autovideosink for video output (no in-process GStreamer)";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Using autovideosink for video output (no in-process GStreamer)";
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
@@ -106,36 +106,36 @@ bool VideoOverlayManager::embedVideoInVideoPane(void* pipeline, ::VideoPane* vid
|
||||
{
|
||||
#ifdef HAVE_GSTREAMER
|
||||
if (!videoPane || !pipeline) {
|
||||
- qCWarning(log_gstreamer_backend) << "Cannot embed video: VideoPane or pipeline is null";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Cannot embed video: VideoPane or pipeline is null";
|
||||
return false;
|
||||
}
|
||||
|
||||
GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink");
|
||||
if (!videoSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "No video sink element named 'videosink' found in pipeline";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink element named 'videosink' found in pipeline";
|
||||
videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
|
||||
if (!videoSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "No video overlay interface found in pipeline either";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video overlay interface found in pipeline either";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
WId winId = videoPane->getVideoOverlayWindowId();
|
||||
if (winId) {
|
||||
- qCDebug(log_gstreamer_backend) << "Embedding video in VideoPane overlay with window ID:" << winId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Embedding video in VideoPane overlay with window ID:" << winId;
|
||||
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), winId);
|
||||
gst_object_unref(videoSink);
|
||||
- qCDebug(log_gstreamer_backend) << "Video embedded in VideoPane overlay successfully";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Video embedded in VideoPane overlay successfully";
|
||||
return true;
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "VideoPane overlay window ID is null, cannot embed video";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "VideoPane overlay window ID is null, cannot embed video";
|
||||
gst_object_unref(videoSink);
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(pipeline)
|
||||
Q_UNUSED(videoPane)
|
||||
- qCDebug(log_gstreamer_backend) << "Using autovideosink for video output (no in-process GStreamer)";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Using autovideosink for video output (no in-process GStreamer)";
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
@@ -144,7 +144,7 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
{
|
||||
#ifdef HAVE_GSTREAMER
|
||||
if (!videoSinkPtr || windowId == 0) {
|
||||
- qCWarning(log_gstreamer_backend) << "Invalid parameters for overlay setup: sink=" << videoSinkPtr << "windowId=" << windowId;
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Invalid parameters for overlay setup: sink=" << videoSinkPtr << "windowId=" << windowId;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
|
||||
// Check if the sink supports video overlay interface
|
||||
if (GST_IS_VIDEO_OVERLAY(videoSink)) {
|
||||
- qCDebug(log_gstreamer_backend) << "Sink supports video overlay - setting up overlay with window ID:" << windowId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Sink supports video overlay - setting up overlay with window ID:" << windowId;
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
// Add X11 error handling to prevent segmentation fault
|
||||
@@ -175,12 +175,12 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
if (g_object_class_find_property(G_OBJECT_GET_CLASS(videoSink), "force-aspect-ratio")) {
|
||||
// Allow the sink to stretch to the configured render rectangle so overlay scales to widget size
|
||||
g_object_set(videoSink, "force-aspect-ratio", FALSE, NULL);
|
||||
- qCDebug(log_gstreamer_backend) << "Disabled force-aspect-ratio on video sink to allow fill scaling";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Disabled force-aspect-ratio on video sink to allow fill scaling";
|
||||
}
|
||||
|
||||
if (g_object_class_find_property(G_OBJECT_GET_CLASS(videoSink), "pixel-aspect-ratio")) {
|
||||
g_object_set(videoSink, "pixel-aspect-ratio", "1/1", NULL);
|
||||
- qCDebug(log_gstreamer_backend) << "Set pixel-aspect-ratio to 1:1 on video sink";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Set pixel-aspect-ratio to 1:1 on video sink";
|
||||
}
|
||||
|
||||
// Configure render rectangle based on provided targets
|
||||
@@ -188,13 +188,13 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
QSize widgetSize = videoWidget->size();
|
||||
if (widgetSize.width() > 0 && widgetSize.height() > 0) {
|
||||
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(videoSink), 0, 0, widgetSize.width(), widgetSize.height());
|
||||
- qCDebug(log_gstreamer_backend) << "Set render rectangle to widget size:" << widgetSize;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Set render rectangle to widget size:" << widgetSize;
|
||||
}
|
||||
} else if (graphicsVideoItem) {
|
||||
QRectF itemRect = graphicsVideoItem->boundingRect();
|
||||
if (itemRect.width() > 0 && itemRect.height() > 0) {
|
||||
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(videoSink), 0, 0, (gint)itemRect.width(), (gint)itemRect.height());
|
||||
- qCDebug(log_gstreamer_backend) << "Set render rectangle to video item size:" << itemRect.size();
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Set render rectangle to video item size:" << itemRect.size();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,18 +205,18 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
XCloseDisplay(display);
|
||||
|
||||
if (x11_overlay_error_occurred_local) {
|
||||
- qCWarning(log_gstreamer_backend) << "X11 error occurred during overlay setup - continuing without embedding";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "X11 error occurred during overlay setup - continuing without embedding";
|
||||
} else {
|
||||
- qCDebug(log_gstreamer_backend) << "Video overlay setup completed successfully";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Video overlay setup completed successfully";
|
||||
}
|
||||
} else if (!old_handler) {
|
||||
- qCDebug(log_gstreamer_backend) << "Video overlay setup completed (no X11 error handling)";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Video overlay setup completed (no X11 error handling)";
|
||||
}
|
||||
#endif
|
||||
|
||||
- qCDebug(log_gstreamer_backend) << "Overlay setup completed";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Overlay setup completed";
|
||||
} catch (...) {
|
||||
- qCCritical(log_gstreamer_backend) << "Exception during video overlay setup - continuing without embedding";
|
||||
+ qCCritical(log_gstreamer_videooverlaymanager) << "Exception during video overlay setup - continuing without embedding";
|
||||
#ifdef Q_OS_LINUX
|
||||
if (display && old_handler) {
|
||||
XSetErrorHandler(old_handler);
|
||||
@@ -242,17 +242,17 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
if (gst_iterator_next(iter, &item) == GST_ITERATOR_OK) {
|
||||
actualSink = GST_ELEMENT(g_value_get_object(&item));
|
||||
if (actualSink && GST_IS_VIDEO_OVERLAY(actualSink)) {
|
||||
- qCDebug(log_gstreamer_backend) << "Found overlay-capable sink inside autovideosink";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Found overlay-capable sink inside autovideosink";
|
||||
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(actualSink), windowId);
|
||||
// Use target widget size if available to set explicit render rectangle so scaling works
|
||||
if (videoWidget) {
|
||||
QSize widgetSize = videoWidget->size();
|
||||
if (widgetSize.width() > 0 && widgetSize.height() > 0) {
|
||||
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(actualSink), 0, 0, widgetSize.width(), widgetSize.height());
|
||||
- qCDebug(log_gstreamer_backend) << "Set render rectangle to widget size for autovideosink child sink:" << widgetSize;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Set render rectangle to widget size for autovideosink child sink:" << widgetSize;
|
||||
if (g_object_class_find_property(G_OBJECT_GET_CLASS(actualSink), "force-aspect-ratio")) {
|
||||
g_object_set(actualSink, "force-aspect-ratio", FALSE, NULL);
|
||||
- qCDebug(log_gstreamer_backend) << "Disabled force-aspect-ratio on autovideosink child sink";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Disabled force-aspect-ratio on autovideosink child sink";
|
||||
}
|
||||
} else {
|
||||
gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(actualSink), 0, 0, -1, -1);
|
||||
@@ -269,18 +269,18 @@ bool VideoOverlayManager::setupVideoOverlay(void* videoSinkPtr, WId windowId, QW
|
||||
}
|
||||
gst_iterator_free(iter);
|
||||
}
|
||||
- qCDebug(log_gstreamer_backend) << "autovideosink selected sink doesn't support overlay - video will display in separate window";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "autovideosink selected sink doesn't support overlay - video will display in separate window";
|
||||
return false;
|
||||
}
|
||||
|
||||
- qCWarning(log_gstreamer_backend) << "Sink does not support video overlay:" << sinkName;
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Sink does not support video overlay:" << sinkName;
|
||||
return false;
|
||||
#else
|
||||
Q_UNUSED(videoSinkPtr)
|
||||
Q_UNUSED(windowId)
|
||||
Q_UNUSED(videoWidget)
|
||||
Q_UNUSED(graphicsVideoItem)
|
||||
- qCDebug(log_gstreamer_backend) << "No in-process GStreamer - overlay unavailable";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "No in-process GStreamer - overlay unavailable";
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
@@ -300,7 +300,7 @@ bool VideoOverlayManager::setupVideoOverlayForPipeline(void* pipeline, WId windo
|
||||
gst_object_unref(videoSink);
|
||||
return ok;
|
||||
}
|
||||
- qCWarning(log_gstreamer_backend) << "No video sink found in pipeline";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "No video sink found in pipeline";
|
||||
return false;
|
||||
#else
|
||||
Q_UNUSED(pipeline)
|
||||
@@ -315,10 +315,10 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
::VideoPane* videoPane,
|
||||
bool &pendingFlag)
|
||||
{
|
||||
- qCDebug(log_gstreamer_backend) << "VideoOverlayManager: Completing pending overlay setup...";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "VideoOverlayManager: Completing pending overlay setup...";
|
||||
|
||||
if (!pendingFlag || !pipeline) {
|
||||
- qCDebug(log_gstreamer_backend) << "No pending setup or no pipeline";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "No pending setup or no pipeline";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -326,7 +326,7 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
const bool isXcb = platform.contains("xcb", Qt::CaseInsensitive);
|
||||
const bool hasXDisplay = !qgetenv("DISPLAY").isEmpty();
|
||||
if (!isXcb || !hasXDisplay) {
|
||||
- qCWarning(log_gstreamer_backend) << "Skipping deferred overlay setup: platform is" << platform << "(DISPLAY set:" << hasXDisplay << ")";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Skipping deferred overlay setup: platform is" << platform << "(DISPLAY set:" << hasXDisplay << ")";
|
||||
pendingFlag = false;
|
||||
return false;
|
||||
}
|
||||
@@ -335,7 +335,7 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
|
||||
if (videoPane) {
|
||||
windowId = videoPane->getVideoOverlayWindowId();
|
||||
- qCDebug(log_gstreamer_backend) << "Completing overlay setup with VideoPane window ID:" << windowId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Completing overlay setup with VideoPane window ID:" << windowId;
|
||||
} else if (graphicsVideoItem) {
|
||||
if (graphicsVideoItem->scene()) {
|
||||
QList<QGraphicsView*> views = graphicsVideoItem->scene()->views();
|
||||
@@ -344,21 +344,21 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
if (auto pane = qobject_cast<VideoPane*>(view)) {
|
||||
if (pane->isDirectGStreamerModeEnabled() && pane->getOverlayWidget()) {
|
||||
windowId = pane->getVideoOverlayWindowId();
|
||||
- qCDebug(log_gstreamer_backend) << "Completing overlay setup with VideoPane overlay widget window ID:" << windowId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Completing overlay setup with VideoPane overlay widget window ID:" << windowId;
|
||||
} else {
|
||||
- qCDebug(log_gstreamer_backend) << "VideoPane overlay widget still not ready";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "VideoPane overlay widget still not ready";
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
windowId = view->winId();
|
||||
- qCDebug(log_gstreamer_backend) << "Completing overlay setup with graphics view window ID:" << windowId;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Completing overlay setup with graphics view window ID:" << windowId;
|
||||
}
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Graphics video item has no associated view";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Graphics video item has no associated view";
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Graphics video item has no scene";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Graphics video item has no scene";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -367,7 +367,7 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
GstElement* videoSink = gst_bin_get_by_name(GST_BIN(pipeline), "videosink");
|
||||
if (!videoSink) {
|
||||
videoSink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
|
||||
- if (videoSink) qCDebug(log_gstreamer_backend) << "Deferred path: found sink by overlay interface";
|
||||
+ if (videoSink) qCDebug(log_gstreamer_videooverlaymanager) << "Deferred path: found sink by overlay interface";
|
||||
}
|
||||
|
||||
if (videoSink) {
|
||||
@@ -384,14 +384,14 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
targetWidget = videoWidget;
|
||||
}
|
||||
if (targetWidget) {
|
||||
- qCDebug(log_gstreamer_backend) << "Deferred: binding qt6videosink to QWidget" << targetWidget;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Deferred: binding qt6videosink to QWidget" << targetWidget;
|
||||
g_object_set(G_OBJECT(videoSink), "widget", (gpointer)targetWidget, nullptr);
|
||||
gst_object_unref(videoSink);
|
||||
pendingFlag = false;
|
||||
- qCDebug(log_gstreamer_backend) << "Deferred qt6videosink binding completed";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Deferred qt6videosink binding completed";
|
||||
return true;
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Deferred: no target QWidget available to bind qt6videosink";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Deferred: no target QWidget available to bind qt6videosink";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -399,30 +399,30 @@ bool VideoOverlayManager::completePendingOverlaySetup(void* pipeline,
|
||||
const bool looksLikeXSink = sinkNameBA.contains("xvimage") || sinkNameBA.contains("ximage");
|
||||
|
||||
if (!supportsOverlay) {
|
||||
- qCWarning(log_gstreamer_backend) << "Deferred overlay skipped: sink does not support overlay interface (" << sinkName << ")";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Deferred overlay skipped: sink does not support overlay interface (" << sinkName << ")";
|
||||
gst_object_unref(videoSink);
|
||||
pendingFlag = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!looksLikeXSink) {
|
||||
- qCWarning(log_gstreamer_backend) << "Deferred overlay skipped: sink is not an X sink (" << sinkName << ") on platform" << QGuiApplication::platformName();
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Deferred overlay skipped: sink is not an X sink (" << sinkName << ") on platform" << QGuiApplication::platformName();
|
||||
gst_object_unref(videoSink);
|
||||
pendingFlag = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
- qCDebug(log_gstreamer_backend) << "Setting up deferred video overlay with window ID:" << windowId << "using sink" << sinkName;
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Setting up deferred video overlay with window ID:" << windowId << "using sink" << sinkName;
|
||||
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videoSink), windowId);
|
||||
gst_object_unref(videoSink);
|
||||
pendingFlag = false;
|
||||
- qCDebug(log_gstreamer_backend) << "Deferred overlay setup completed successfully";
|
||||
+ qCDebug(log_gstreamer_videooverlaymanager) << "Deferred overlay setup completed successfully";
|
||||
return true;
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Could not find video sink for deferred overlay setup";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Could not find video sink for deferred overlay setup";
|
||||
}
|
||||
} else {
|
||||
- qCWarning(log_gstreamer_backend) << "Still no valid window ID available for deferred overlay setup";
|
||||
+ qCWarning(log_gstreamer_videooverlaymanager) << "Still no valid window ID available for deferred overlay setup";
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -1,29 +1,54 @@
|
|||
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
|
||||
pkgname=openterface-qt
|
||||
pkgver=0.3.13
|
||||
pkgver=0.5.7
|
||||
pkgrel=0
|
||||
pkgdesc="Openterface Mini-KVM Host Application"
|
||||
arch="all !armhf" # missing qt6-qtmultimedia
|
||||
# armhf: missing qt6-qtmultimedia
|
||||
# riscv64: missing libgtk-3
|
||||
arch="all !armhf !riscv64"
|
||||
url="https://openterface.com/"
|
||||
license="AGPL-3.0-only"
|
||||
depends="qt6-qtmultimedia-ffmpeg hicolor-icon-theme"
|
||||
makedepends="qt6-qtbase-dev qt6-qtmultimedia-dev qt6-qtserialport-dev qt6-qtsvg-dev qt6-qtmultimedia-dev libusb-dev"
|
||||
depends="
|
||||
gst-plugins-good-qt
|
||||
hicolor-icon-theme
|
||||
qt6-qtmultimedia-ffmpeg
|
||||
"
|
||||
makedepends="
|
||||
cmake
|
||||
ffmpeg-dev
|
||||
libgudev-dev
|
||||
libjpeg-turbo-dev
|
||||
libusb-dev
|
||||
libx11-dev
|
||||
libxv-dev
|
||||
patchelf
|
||||
qt6-qtbase-dev
|
||||
qt6-qtmultimedia-dev
|
||||
qt6-qtserialport-dev
|
||||
samurai
|
||||
v4l-utils-dev
|
||||
"
|
||||
install="$pkgname.post-install"
|
||||
builddir="$srcdir"/Openterface_QT-$pkgver
|
||||
options="!check" # No testsuite
|
||||
source="
|
||||
$pkgname-$pkgver.tar.gz::https://github.com/TechxArtisanStudio/Openterface_QT/archive/$pkgver.tar.gz
|
||||
openterfaceQT.desktop
|
||||
51-openterface-permissions.rules
|
||||
348_address-use-of-deleted-function.patch
|
||||
423_deduplicate-logging-categories-and-remove-backslashes.patch
|
||||
use-system-libs.patch
|
||||
"
|
||||
|
||||
prepare() {
|
||||
default_prepare
|
||||
mkdir build && cd build
|
||||
qmake6 ..
|
||||
# OPENTERFACE_BUILD_STATIC: do not build vendored dependencies
|
||||
cmake -DOPENTERFACE_BUILD_STATIC=OFF ..
|
||||
}
|
||||
|
||||
build() {
|
||||
make -C build
|
||||
ninja -C build
|
||||
}
|
||||
|
||||
package() {
|
||||
|
|
@ -33,9 +58,16 @@ package() {
|
|||
install -Dm644 "$builddir"/images/icon_32.png "$pkgdir"/usr/share/icons/hicolor/32x32/apps/openterfaceQT.png
|
||||
install -Dm644 "$builddir"/images/icon_64.png "$pkgdir"/usr/share/icons/hicolor/64x64/apps/openterfaceQT.png
|
||||
install -Dm644 "$builddir"/images/icon_128.png "$pkgdir"/usr/share/icons/hicolor/128x128/apps/openterfaceQT.png
|
||||
|
||||
# vanilla build does not set rpath, since it usually wants to use vendored libs
|
||||
patchelf --set-rpath '/usr/lib' "$pkgdir"/usr/bin/openterfaceQT
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
7261ce2875b1617d27945de591c72779d2305889b7f53bb6758cb5e1d4dc01c969fef1638726d868f75e995c44a8e2c453cac45c90cfb3d140b8120523c4038d openterface-qt-0.3.13.tar.gz
|
||||
996415d6f7d3ed950901c380a0520ddab8c31e8d3c2e2bb3a5f631a5600cace6bcf6bf89871e4e4ef818009eeb08c448fd793e1e4758ecccf1e1a21ff04fd560 openterface-qt-0.5.7.tar.gz
|
||||
e39cfa04cbcb59e8ba54110a28eff41854f73fa7c4baeeed5433907c79781946f12bd3a731763caa1d591e664eab0650bdbd2a844954baa12bb96a76a17c6e4f openterfaceQT.desktop
|
||||
f50d721a6a2d1e0183c81e99230e91e127ee6c6f3243af1cff3e3cb78e2913ebab3346ec8b461a4710220d1ce2e12a7cc960ded6e0dc2def539375c6e737b647 51-openterface-permissions.rules
|
||||
69b5556ec9e56792e848ea1ff9374e12e6901da821ecd9d6f2f521ea30f48e564c2cd0631fc1360acd6c8c6249cfa718d5baf7ed6929e1e92f63eeaea578bcb3 348_address-use-of-deleted-function.patch
|
||||
47580d07a2d971ad2010e78373d1abbcbc05b3fbd3a7e466faed50dc9a0d632db30c0a7622e7324aeb0eb38d49e3241cb6cebc835f7adeed977b1dd7b48ea5f6 423_deduplicate-logging-categories-and-remove-backslashes.patch
|
||||
22ecac74fe0923f39f538a5d587f8c100d9709631a1584bd20646e09dcf777cd3042670d08195626220f0494e5efa9549a299c5e1fd8c42f991ec5746b42cc86 use-system-libs.patch
|
||||
"
|
||||
72
backports/openterface-qt/use-system-libs.patch
Normal file
72
backports/openterface-qt/use-system-libs.patch
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index e0e8ea1..c861725 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -244,7 +244,7 @@ endif()
|
||||
# Add XCB cursor library for static linking (Linux only) - Legacy support
|
||||
if(UNIX AND NOT APPLE AND XCB_CURSOR_FOUND)
|
||||
# This is redundant now but keeping for compatibility
|
||||
- message(STATUS "XCB cursor already linked via static approach above")
|
||||
+ target_link_libraries(openterfaceQT PRIVATE X11)
|
||||
endif()
|
||||
|
||||
# Add TurboJPEG if available
|
||||
@@ -307,4 +307,4 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
-# Qt components already found above
|
||||
\ No newline at end of file
|
||||
+# Qt components already found above
|
||||
diff --git a/cmake/FFmpeg.cmake b/cmake/FFmpeg.cmake
|
||||
index ef0699e..660e765 100644
|
||||
--- a/cmake/FFmpeg.cmake
|
||||
+++ b/cmake/FFmpeg.cmake
|
||||
@@ -19,7 +19,7 @@ if(NOT DEFINED FFMPEG_PREFIX)
|
||||
if(WIN32)
|
||||
set(FFMPEG_PREFIX "C:/ffmpeg-static" CACHE PATH "FFmpeg installation directory")
|
||||
else()
|
||||
- set(FFMPEG_PREFIX "/opt/ffmpeg" CACHE PATH "FFmpeg installation directory")
|
||||
+ set(FFMPEG_PREFIX "/usr" CACHE PATH "FFmpeg installation directory")
|
||||
endif()
|
||||
message(STATUS "Using default FFMPEG_PREFIX: ${FFMPEG_PREFIX}")
|
||||
endif()
|
||||
@@ -116,7 +116,7 @@ if(NOT FFMPEG_FOUND)
|
||||
message(STATUS "FFmpeg search paths: ${FFMPEG_SEARCH_PATHS}")
|
||||
foreach(SEARCH_PATH ${FFMPEG_SEARCH_PATHS})
|
||||
# For static builds, prefer .a files; check common lib directories
|
||||
- set(LIB_EXTENSIONS ".a")
|
||||
+ set(LIB_EXTENSIONS ".so")
|
||||
|
||||
# Platform-specific library paths
|
||||
if(WIN32)
|
||||
diff --git a/cmake/GStreamer.cmake b/cmake/GStreamer.cmake
|
||||
index 220e9f5..576535f 100644
|
||||
--- a/cmake/GStreamer.cmake
|
||||
+++ b/cmake/GStreamer.cmake
|
||||
@@ -316,10 +316,11 @@ else()
|
||||
# Check for Qt6 plugin availability in system
|
||||
message(STATUS "Checking for Qt6 GStreamer plugin in system...")
|
||||
find_file(GSTREAMER_QT6_PLUGIN
|
||||
- NAMES libgstqt6.so
|
||||
+ NAMES libgstqml6.so
|
||||
PATHS
|
||||
/usr/lib/x86_64-linux-gnu/gstreamer-1.0
|
||||
/usr/lib/aarch64-linux-gnu/gstreamer-1.0
|
||||
+ /usr/lib/gstreamer-1.0
|
||||
/usr/local/lib/gstreamer-1.0
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
diff --git a/cmake/Resources.cmake b/cmake/Resources.cmake
|
||||
index 2d28b89..e2009e3 100644
|
||||
--- a/cmake/Resources.cmake
|
||||
+++ b/cmake/Resources.cmake
|
||||
@@ -336,7 +336,7 @@ install(FILES ${CMAKE_SOURCE_DIR}/com.openterface.openterfaceQT.metainfo.xml
|
||||
if(COMMAND qt_generate_deploy_app_script)
|
||||
qt_generate_deploy_app_script(
|
||||
TARGET openterfaceQT
|
||||
- FILENAME_VARIABLE deploy_script
|
||||
+ OUTPUT_SCRIPT deploy_script
|
||||
NO_UNSUPPORTED_PLATFORM_ERROR
|
||||
)
|
||||
install(SCRIPT ${deploy_script})
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
Section "InputClass"
|
||||
Identifier "evdev touchscreen"
|
||||
MatchProduct "tt21000"
|
||||
MatchIsTouchscreen "on"
|
||||
Driver "evdev"
|
||||
EndSection
|
||||
Section "InputClass"
|
||||
Identifier "RotateTouch"
|
||||
MatchProduct "w9013"
|
||||
Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"
|
||||
EndSection
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
ACTION=="remove", GOTO="libinput_device_group_end"
|
||||
KERNEL!="event[0-9]*", GOTO="libinput_device_group_end"
|
||||
|
||||
ATTRS{phys}=="?*", ATTRS{name}=="cyttsp5", ENV{LIBINPUT_DEVICE_GROUP}="pinenotetouch"
|
||||
ATTRS{phys}=="?*", ATTRS{name}=="w9013 2D1F:0095 Stylus", ENV{LIBINPUT_DEVICE_GROUP}="pinenotetouch"
|
||||
|
||||
ATTRS{phys}=="?*", ATTRS{name}=="cyttsp5", ENV{LIBINPUT_CALIBRATION_MATRIX}="-1 0 1 0 -1 1"
|
||||
|
||||
LABEL="libinput_device_group_end"
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
SUBSYSTEM=="module", KERNEL=="rockchip_ebc", RUN+="/bin/chgrp video /sys/module/%k/parameters/dclk_select /sys/module/%k/parameters/auto_refresh /sys/module/%k/parameters/bw_dither_invert /sys/module/%k/parameters/bw_threshold /sys/module/%k/parameters/bw_mode /sys/module/%k/parameters/diff_mode /sys/module/%k/parameters/direct_mode /sys/module/%k/parameters/limit_fb_blits /sys/module/%k/parameters/panel_reflection /sys/module/%k/parameters/refresh_threshold /sys/module/%k/parameters/refresh_waveform /sys/module/%k/parameters/skip_reset /sys/module/%k/parameters/split_area_limit /sys/module/%k/parameters/default_waveform", RUN+="/bin/chmod g+w /sys/module/%k/parameters/bw_threshold /sys/module/%k/parameters/bw_mode /sys/module/%k/parameters/default_waveform /sys/module/%k/parameters/diff_mode /sys/module/%k/parameters/direct_mode /sys/module/%k/parameters/limit_fb_blits /sys/module/%k/parameters/panel_reflection /sys/module/%k/parameters/refresh_threshold /sys/module/%k/parameters/refresh_waveform /sys/module/%k/parameters/skip_reset /sys/module/%k/parameters/auto_refresh /sys/module/%k/parameters/bw_dither_invert /sys/module/%k/parameters/split_area_limit"
|
||||
DRIVER=="rockchip-ebc", RUN+="/bin/chgrp video /sys/%p/power/control", RUN+="/bin/chmod g+w /sys/%p/power/control"
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
# Maintainer: Petr Hodina <phodina@protonmail.com>
|
||||
pkgname=device-pine64-pinenote
|
||||
pkgdesc="Pine64 PineNote"
|
||||
pkgver=2
|
||||
pkgrel=9
|
||||
url="https://postmarketos.org"
|
||||
license="MIT"
|
||||
arch="aarch64"
|
||||
options="!check !archcheck"
|
||||
depends="
|
||||
u-boot-pine64-pinenote
|
||||
linux-pine64-pinenote
|
||||
postmarketos-base
|
||||
"
|
||||
makedepends="devicepkg-dev"
|
||||
source="
|
||||
deviceinfo
|
||||
modules-initfs
|
||||
phoc.ini
|
||||
local-overrides.quirks
|
||||
50-touchscreen.conf
|
||||
81-libinput-pinenote.rules
|
||||
82-ebc-rockchip.rules
|
||||
panfrost.conf
|
||||
rockchip_ebc.conf
|
||||
"
|
||||
subpackages="
|
||||
$pkgname-nonfree-firmware:nonfree_firmware
|
||||
$pkgname-phosh
|
||||
"
|
||||
|
||||
build() {
|
||||
devicepkg_build $startdir $pkgname
|
||||
}
|
||||
|
||||
package() {
|
||||
devicepkg_package $startdir $pkgname
|
||||
|
||||
install -Dm644 "$srcdir"/local-overrides.quirks \
|
||||
-t "$pkgdir"/etc/libinput/
|
||||
install -Dm644 "$srcdir"/50-touchscreen.conf \
|
||||
-t "$pkgdir"/etc/X11/xorg.conf.d
|
||||
install -Dm644 "$srcdir"/81-libinput-pinenote.rules \
|
||||
-t "$pkgdir"/usr/lib/udev/rules.d
|
||||
install -Dm644 "$srcdir"/82-ebc-rockchip.rules \
|
||||
"$pkgdir"/usr/lib/udev/rules.d
|
||||
install -Dm644 "$srcdir"/panfrost.conf \
|
||||
-t "$pkgdir"/etc/modprobe.d
|
||||
install -Dm644 "$srcdir"/rockchip_ebc.conf \
|
||||
"$pkgdir"/etc/modprobe.d
|
||||
}
|
||||
|
||||
phosh() {
|
||||
install_if="$pkgname=$pkgver-r$pkgrel phosh"
|
||||
depends="postmarketos-theme"
|
||||
|
||||
install -Dm644 "$srcdir"/phoc.ini \
|
||||
-t "$subpkgdir"/etc/phosh
|
||||
}
|
||||
|
||||
nonfree_firmware() {
|
||||
pkgdesc="WiFi, Bluetooth and display firmware"
|
||||
depends="firmware-pine64-pinenote linux-firmware"
|
||||
mkdir "$subpkgdir"
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
5829b9b52206a7520066e4bb3c08c2535d98002a3940664a0239344f5e7522fe7b6a9cb0c0074f9846c7e42c40746f2991f6aeeefeba8efa9140c16630b2893e deviceinfo
|
||||
473accb3497244742dd9fd15f8a02957a13e08fa4d4393fec185ecbb27f1f17726e4b5ece22da861151f9d358d3266206c647def8aa75adb672b6f1f1904c66f modules-initfs
|
||||
4bf5158fbd53274a7429e825bb66225001f2403a4851e2d6803323b77d9095738ee3e5340ac85baf3e86bb4f47d38af8cbd78d8a5055c59a62f5b06e722e19cb phoc.ini
|
||||
1123720962c9c8fec3c50302ca6a3dd56e2907dc9eea361a7b8eb4201b042476633d41a0ee4f6ab61d9c60eeccc894f83491ba9fa309a9bce2f1db0b0341d79d local-overrides.quirks
|
||||
ac433eebbc35a48561837495997aee4e55510b979bc0d8e3bafb761bc1be5b4bdeed2f456369dcbc582688aefd07c63966b0d72b6ffa99e84cfd868e677f02c8 50-touchscreen.conf
|
||||
2bc51f200baefc37abfaaad368a911244999e906bdca4b728ac233f49a8fb3ae7206ee3c95cdb20d7dceae2a31d25a57f4e1da4fd67057fd64724b8232e42aed 81-libinput-pinenote.rules
|
||||
19e922eec89dba419798c4e1dc9b39c040db33986d0969a39a8220c642fa081763f15ff2418115d5a748af4054a1be0784927d1712ea79942c2b237ebab47728 82-ebc-rockchip.rules
|
||||
6ba6638754e00908243de2f73ed6898dac03638a200dcf7b7cd9684757355ee1eb0ac874af0f971ad2e054c1a8c471867bdaea4d9aaf7eea6d3cf81ac7dd73a2 panfrost.conf
|
||||
b52d2e7f0c62d7c313b6db9aeb706cdb2596b6aa637aeddb862abf1e256103377fb6267e38cd4285e25d32112acf8d03bbf32ecff7be3dfbb9176209ea7ae283 rockchip_ebc.conf
|
||||
"
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
# Please use double quotes only. You can source this file in shell
|
||||
# scripts.
|
||||
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Pine64 PineNote"
|
||||
deviceinfo_manufacturer="Pine64"
|
||||
deviceinfo_codename="pine64-pinenote"
|
||||
deviceinfo_year="2021"
|
||||
deviceinfo_dtb="rockchip/rk3566-pinenote-v1.2"
|
||||
deviceinfo_arch="aarch64"
|
||||
deviceinfo_gpu_accelerated="true"
|
||||
|
||||
# Device related
|
||||
deviceinfo_chassis="tablet"
|
||||
deviceinfo_keyboard="false"
|
||||
deviceinfo_external_storage="false"
|
||||
deviceinfo_screen_width="1404"
|
||||
deviceinfo_screen_height="1872"
|
||||
deviceinfo_getty="ttyS2;1500000"
|
||||
|
||||
# initfs
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="rkdeveloptool"
|
||||
deviceinfo_flash_sparse="true"
|
||||
|
||||
deviceinfo_boot_part_start="65536"
|
||||
|
||||
deviceinfo_sd_embed_firmware="u-boot/pine64-pinenote/u-boot-rockchip.bin:1"
|
||||
deviceinfo_sd_embed_firmware_step_size="32768"
|
||||
|
||||
deviceinfo_flash_rk_partition_kernel="boot"
|
||||
deviceinfo_flash_rk_partition_rootfs="os1"
|
||||
|
||||
deviceinfo_generate_extlinux_config="true"
|
||||
deviceinfo_kernel_cmdline="drm.debug=0x0 vt.color=0xf earlycon console=tty0 console=ttyS2,1500000n8 PMOS_FORCE_PARTITION_RESIZE"
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[PineNote]
|
||||
MatchName=cyttsp5
|
||||
AttrPalmPressureThreshold=28
|
||||
AttrThumbPressureThreshold=27
|
||||
AttrSizeHint=210x157
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
tps65185-regulator
|
||||
rockchip_ebc
|
||||
drm_kms_helper
|
||||
drm_shmem_helper
|
||||
pvi_waveform
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
softdep panfrost pre: rockchip_ebc
|
||||
# blacklist rockchip_ebc
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
# /etc/phosh/phoc.ini
|
||||
# Overwrites values set in /usr/share/phosh/phoc.ini
|
||||
|
||||
# e-ink is an "Unknown" display type for now in mainline
|
||||
[output:Unknown-1]
|
||||
scale = 2.0
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
# rockchip-rga will crash the kernel on unload at the moment
|
||||
blacklist rockchip-rga
|
||||
blacklist ws8100_pen
|
||||
|
||||
options rockchip_ebc direct_mode=0 auto_refresh=1 refresh_threshold=60 split_area_limit=0 panel_reflection=1 prepare_prev_before_a2=0 dclk_select=0
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
# Reference: <https://postmarketos.org/vendorkernel>
|
||||
# Kernel config based on: arch/arm64/configs/(CHANGEME!)
|
||||
|
||||
pkgname=linux-pine64-pinenote
|
||||
pkgver=6.12.0
|
||||
pkgrel=0
|
||||
pkgdesc="Pine64 PineNote kernel fork"
|
||||
arch="aarch64"
|
||||
_carch="arm64"
|
||||
_flavor="pine64-pinenote"
|
||||
url="https://kernel.org"
|
||||
license="GPL-2.0-only"
|
||||
options="!strip !check !tracedeps pmb:cross-native"
|
||||
makedepends="
|
||||
bash
|
||||
bc
|
||||
bison
|
||||
devicepkg-dev
|
||||
findutils
|
||||
flex
|
||||
openssl-dev
|
||||
perl
|
||||
"
|
||||
|
||||
# Source
|
||||
_repository="linux"
|
||||
_commit="9d066a65f5cbaa8cd3bfc73a1b54fbac2d0f76ac"
|
||||
_config="config-$_flavor.$arch"
|
||||
source="
|
||||
$pkgname-$_commit.tar.gz::https://github.com/m-weigand/linux/archive/$_commit.tar.gz
|
||||
$_config
|
||||
"
|
||||
builddir="$srcdir/$_repository-$_commit"
|
||||
|
||||
prepare() {
|
||||
default_prepare
|
||||
REPLACE_GCCH=0 \
|
||||
. downstreamkernel_prepare
|
||||
}
|
||||
|
||||
build() {
|
||||
unset LDFLAGS
|
||||
make ARCH="$_carch" CC="${CC:-gcc}" \
|
||||
KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-postmarketOS"
|
||||
}
|
||||
|
||||
package() {
|
||||
downstreamkernel_package "$builddir" "$pkgdir" "$_carch" "$_flavor"
|
||||
|
||||
make modules_install dtbs_install \
|
||||
ARCH="$_carch" \
|
||||
INSTALL_MOD_PATH="$pkgdir" \
|
||||
INSTALL_DTBS_PATH="$pkgdir/boot/dtbs"
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
d3c2510f9f835a0570fbb812cec2f9e12e402878c1f9f214364ae1918bc4c00f69a1fc5e005cf6b85c0690e6fd5f6ce9e61efd88145a83725ed12b6b8c07b97e linux-pine64-pinenote-9d066a65f5cbaa8cd3bfc73a1b54fbac2d0f76ac.tar.gz
|
||||
99294bd6c53b1cf3832addbc80ea23b9089bb03463e2a9ebe93ab5feb1b2ff9ee38f158032705429230765bae2df23bb3401ec14902134c80d9dd6e58e188be5 config-pine64-pinenote.aarch64
|
||||
"
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,34 +0,0 @@
|
|||
# Maintainer: Petr Hodina <phodina@protonmail.com>
|
||||
pkgname=pinenote-dbus-service
|
||||
pkgver=0.2.2_pre5
|
||||
_gittag=0.2.2-dev5
|
||||
pkgrel=1
|
||||
pkgdesc="Dbus daemon for controlling driver aspects on Pine64 Pinenote"
|
||||
url="https://github.com/m-weigand/pinenote_dbus_service"
|
||||
arch="aarch64"
|
||||
license="MIT"
|
||||
makedepends="cargo"
|
||||
depends="dbus-dev"
|
||||
source="
|
||||
pinenote-dbus-service-$_gittag.tar.gz::https://github.com/m-weigand/pinenote_dbus_service/archive/refs/tags/v$_gittag.tar.gz
|
||||
pinenote.initd
|
||||
"
|
||||
|
||||
builddir="$srcdir/pinenote_dbus_service-$_gittag"
|
||||
|
||||
build() {
|
||||
cargo build --release --locked
|
||||
}
|
||||
|
||||
package() {
|
||||
cargo install --path . --root="$pkgdir/usr"
|
||||
install -Dm644 dbus_security_configuration/pinenote.conf -t "$pkgdir"/usr/share/dbus-1/system.d/
|
||||
install -Dm755 "$srcdir"/pinenote.initd $pkgdir/etc/init.d/pinenote
|
||||
rm "$pkgdir"/usr/.crates.toml
|
||||
rm "$pkgdir"/usr/.crates2.json
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
10cf05f9e1e8affec97b532611a9bffb86928cabe4eb9bd321b66e8dba340e6a7916fa0c8286f81300bfa655d5596bba09f0316abcafa6c55128823c78acb807 pinenote-dbus-service-0.2.2-dev5.tar.gz
|
||||
362c20218610e7a5349eef40d54463a05906e258157e590ad1635591a548ddc60050142cfab41a0423797182e5ae392a7fe6476fc71b9c01cece384351e6f148 pinenote.initd
|
||||
"
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
#!/sbin/openrc-run
|
||||
|
||||
description="Launch DBus service for driver aspects"
|
||||
command="/usr/bin/pinenote_dbus_service"
|
||||
command_background=yes
|
||||
pidfile="/run/${RC_SVCNAME}.pid"
|
||||
|
||||
depend() {
|
||||
need dbus
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue