Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ find_package(Qt6 6.4 REQUIRED
Widgets
Xml
)
if(NOT APPLE)
find_package(Qt6 6.4 REQUIRED GuiPrivate)
endif()
if(UNIX AND NOT APPLE)
find_package(Qt6 6.4 REQUIRED COMPONENTS DBus)
# X11 for WindowPicker (Linux/X11)
Expand All @@ -66,6 +69,9 @@ endif()
add_subdirectory(CuteLogger)
add_subdirectory(src)
add_subdirectory(translations)
if(UNIX AND NOT APPLE)
add_subdirectory(MinimalMediaBackend)
endif()

feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)

Expand Down
19 changes: 19 additions & 0 deletions MinimalMediaBackend/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.12...3.31)

project(MinimalMediaBackend)

find_package(Qt6 REQUIRED COMPONENTS Core Multimedia)
find_package(Qt6MultimediaPrivate REQUIRED)

qt_add_plugin(minimalmediaplugin
CLASS_NAME MinimalMediaPlugin
PLUGIN_TYPE multimedia
OUTPUT_TARGETS minimalmediaplugin_targets
minimalmediaplugin.cpp
)

target_link_libraries(minimalmediaplugin PRIVATE
Qt6::Core
Qt6::Multimedia
Qt6::MultimediaPrivate
)
76 changes: 76 additions & 0 deletions MinimalMediaBackend/minimalmediaplugin.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright (c) 2026 Meltytech, LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <private/qplatformmediaplugin_p.h>
#include <private/qplatformmediaintegration_p.h>
#include <private/qplatformvideosink_p.h>

QT_BEGIN_NAMESPACE

// Minimal QPlatformVideoSink — the base class does all the work
class MinimalVideoSink : public QPlatformVideoSink
{
Q_OBJECT
public:
explicit MinimalVideoSink(QVideoSink *sink)
: QPlatformVideoSink(sink)
{}
};

// Minimal integration — only creates video sinks
class MinimalMediaIntegration : public QPlatformMediaIntegration
{
public:
MinimalMediaIntegration()
: QPlatformMediaIntegration(QLatin1String("minimal"))
{}

#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
q23::expected<QPlatformVideoSink *, QString> createVideoSink(QVideoSink *sink) override
{
return new MinimalVideoSink(sink);
}
#else
QMaybe<QPlatformVideoSink *> createVideoSink(QVideoSink *sink) override
{
return new MinimalVideoSink(sink);
}
#endif
};

// Plugin entry point
class MinimalMediaPlugin : public QPlatformMediaPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QPlatformMediaPlugin_iid FILE "minimalmediaplugin.json")

public:
MinimalMediaPlugin(QObject *parent = nullptr)
: QPlatformMediaPlugin(parent)
{}

QPlatformMediaIntegration *create(const QString &key) override
{
if (key == QLatin1String("minimal"))
return new MinimalMediaIntegration;
return nullptr;
}
};

QT_END_NAMESPACE

#include "minimalmediaplugin.moc"
3 changes: 3 additions & 0 deletions MinimalMediaBackend/minimalmediaplugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"Keys": ["minimal"]
}
2 changes: 1 addition & 1 deletion scripts/build-shotcut-msys2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1240,7 +1240,7 @@ function deploy

log Copying some libs from Qt
if [ "$DEBUG_BUILD" != "1" -o "$SDK" = "1" ]; then
cmd cp -p "$QTDIR"/bin/Qt6{Charts,Concurrent,Core,Core5Compat,Gui,Multimedia,Network,OpenGL,OpenGLWidgets,Qml,QmlMeta,QmlModels,QmlWorkerScript,Quick,QuickControls2*,QuickDialogs2,QuickDialogs2QuickImpl,QuickDialogs2Utils,QuickLayouts,QuickTemplates2,QuickWidgets,Sql,Svg,SvgWidgets,UiTools,WebSockets,Widgets,Xml}.dll .
cmd cp -p "$QTDIR"/bin/Qt6{Charts,Concurrent,Core,Core5Compat,Gui,Multimedia,MultimediaQuick,Network,OpenGL,OpenGLWidgets,Qml,QmlMeta,QmlModels,QmlWorkerScript,Quick,QuickControls2*,QuickDialogs2,QuickDialogs2QuickImpl,QuickDialogs2Utils,QuickLayouts,QuickShapes,QuickTemplates2,QuickWidgets,Sql,Svg,SvgWidgets,UiTools,WebSockets,Widgets,Xml}.dll .
fi

if [ "$ENABLE_GLAXNIMATE" = "1" ]; then
Expand Down
4 changes: 3 additions & 1 deletion scripts/build-shotcut.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1202,13 +1202,15 @@ function install_shotcut_linux {
cmd install -p -c COPYING "$FINAL_INSTALL_DIR"
cmd install -p -c "$QTDIR"/translations/qt_*.qm "$FINAL_INSTALL_DIR"/share/shotcut/translations
cmd install -p -c "$QTDIR"/translations/qtbase_*.qm "$FINAL_INSTALL_DIR"/share/shotcut/translations
cmd install -p -c "$QTDIR"/lib/libQt6{Charts,Concurrent,Core,Core5Compat,DBus,Gui,LabsFolderListModel,Multimedia,Network,OpenGL,OpenGLWidgets,Qml,QmlMeta,QmlModels,QmlWorkerScript,Quick,QuickControls2*,QuickDialogs2,QuickDialogs2QuickImpl,QuickDialogs2Utils,QuickLayouts,QuickTemplates2,QuickWidgets,Sql,Svg,SvgWidgets,UiTools,WaylandClient,WaylandEglClientHwIntegration,WebSockets,Widgets,Xml,X11Extras,XcbQpa}.so.6 "$FINAL_INSTALL_DIR"/lib
cmd install -p -c "$QTDIR"/lib/libQt6{Charts,Concurrent,Core,Core5Compat,DBus,Gui,LabsFolderListModel,Multimedia,MultimediaQuick,Network,OpenGL,OpenGLWidgets,Qml,QmlMeta,QmlModels,QmlWorkerScript,Quick,QuickControls2*,QuickDialogs2,QuickDialogs2QuickImpl,QuickDialogs2Utils,QuickLayouts,QuickShapes,QuickTemplates2,QuickWidgets,Sql,Svg,SvgWidgets,UiTools,WaylandClient,WaylandEglClientHwIntegration,WebSockets,Widgets,Xml,X11Extras,XcbQpa}.so.6 "$FINAL_INSTALL_DIR"/lib
cmd install -p -c "$QTDIR"/lib/lib{icudata,icui18n,icuuc}.so* "$FINAL_INSTALL_DIR"/lib
cmd install -d "$FINAL_INSTALL_DIR"/lib/qt6/sqldrivers
cmd cp -a "$QTDIR"/plugins/{egldeviceintegrations,generic,iconengines,imageformats,multimedia,platforminputcontexts,platforms,platformthemes,tls,wayland-decoration-client,wayland-graphics-integration-client,wayland-shell-integration,xcbglintegrations} "$FINAL_INSTALL_DIR"/lib/qt6
cmd cp -p "$QTDIR"/plugins/sqldrivers/libqsqlite.so "$FINAL_INSTALL_DIR"/lib/qt6/sqldrivers
cmd install -d "$FINAL_INSTALL_DIR"/lib/qml
cmd cp -a "$QTDIR"/qml/{Qt,QtCore,QtQml,QtQuick} "$FINAL_INSTALL_DIR"/lib/qml
cmd install -d "$FINAL_INSTALL_DIR"/lib/qt6/multimedia
cmd cp -p MinimalMediaBackend/libminimalmediaplugin.so "$FINAL_INSTALL_DIR"/lib/qt6/multimedia
}

function build_vmaf_darwin {
Expand Down
27 changes: 20 additions & 7 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ add_executable(shotcut WIN32 MACOSX_BUNDLE
transportcontrol.h
util.cpp util.h
videowidget.cpp videowidget.h
hdrpreviewwindow.cpp hdrpreviewwindow.h
widgets/alsawidget.cpp widgets/alsawidget.h
widgets/alsawidget.ui
widgets/audiometerwidget.cpp widgets/audiometerwidget.h
Expand Down Expand Up @@ -266,12 +267,29 @@ add_custom_target(OTHER_FILES
../scripts/staple.sh
)

# Compile HDR gain shader (used by HdrPreview.qml ShaderEffect)
find_program(QSB_EXECUTABLE qsb HINTS
"${Qt6_DIR}/../../../bin" "${Qt6Core_DIR}/../../../bin")
if(QSB_EXECUTABLE)
set(HDR_GAIN_FRAG ${CMAKE_CURRENT_SOURCE_DIR}/qml/views/hdr_gain.frag)
set(HDR_GAIN_QSB ${CMAKE_CURRENT_SOURCE_DIR}/qml/views/hdr_gain.frag.qsb)
add_custom_command(
OUTPUT ${HDR_GAIN_QSB}
COMMAND ${QSB_EXECUTABLE} --glsl "100 es,120,150" --hlsl 50 --msl 12 -o ${HDR_GAIN_QSB} ${HDR_GAIN_FRAG}
DEPENDS ${HDR_GAIN_FRAG}
COMMENT "Compiling HDR gain shader"
)
add_custom_target(hdr_shaders ALL DEPENDS ${HDR_GAIN_QSB})
add_dependencies(shotcut hdr_shaders)
endif()

target_link_libraries(shotcut
PRIVATE
CuteLogger
PkgConfig::mlt++
PkgConfig::FFTW
Qt6::Charts
Qt6::GuiPrivate
Qt6::Multimedia
Qt6::Network
Qt6::OpenGL
Expand Down Expand Up @@ -310,9 +328,7 @@ if(WIN32)

# Windows integration features
target_sources(shotcut PRIVATE windowstools.cpp windowstools.h)
target_sources(shotcut PRIVATE widgets/d3dvideowidget.h widgets/d3dvideowidget.cpp)
target_sources(shotcut PRIVATE widgets/openglvideowidget.h widgets/openglvideowidget.cpp)
target_link_libraries(shotcut PRIVATE d3d11 d3dcompiler ole32)
target_link_libraries(shotcut PRIVATE ole32)

# Runtime exception handler for debug only
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64")
Expand All @@ -331,13 +347,10 @@ if(WIN32)
install(DIRECTORY qml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/shotcut/)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/filter-sets DESTINATION ${CMAKE_INSTALL_PREFIX}/share/shotcut/)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/voices DESTINATION ${CMAKE_INSTALL_PREFIX}/share/shotcut/)
else()
target_sources(shotcut PRIVATE widgets/openglvideowidget.h widgets/openglvideowidget.cpp)
endif()

if(APPLE)
target_sources(shotcut PRIVATE macos.mm macos.h
widgets/metalvideowidget.h widgets/metalvideowidget.mm)
target_sources(shotcut PRIVATE macos.mm macos.h)
set_target_properties(shotcut PROPERTIES
OUTPUT_NAME "Shotcut"
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/packaging/macos/Info.plist.in)
Expand Down
Loading
Loading