Projects
home:enzokiel
avidemux3
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 13
View file
avidemux3.changes
Changed
@@ -1,7 +1,7 @@ ------------------------------------------------------------------- -Wed Apr 08 09:11:41 UTC 2026 - enzokiel@kabelmail.de +Sat Apr 18 09:58:37 UTC 2026 - enzokiel@kabelmail.de -- Update to version 2.8.2.git20260407 +- Update to version 2.8.2.git20260417 - No changelog available -------------------------------------------------------------------
View file
avidemux3.spec
Changed
@@ -19,7 +19,7 @@ Name: avidemux3 Summary: Graphical video editing and transcoding tool License: GPL-2.0-only -Version: 2.8.2.git20260407 +Version: 2.8.2.git20260417 Release: 0 URL: https://github.com/mean00/avidemux2 ExclusiveArch: %ix86 x86_64
View file
avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_bullseye
Added
+(directory)
View file
avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_bullseye/Dockerfile
Added
@@ -0,0 +1,145 @@ +FROM debian:bullseye + +ARG DEBIAN_FRONTEND=noninteractive +ARG USER_UID=1000 +ARG USER_GID=1000 +ARG USERNAME=bullseye + +#RUN echo 'Acquire::http::Proxy "http://192.168.0.9:3142";' > /etc/apt/apt.conf.d/01proxy +RUN sed -i 's/ main / main contrib non-free non-free-firmware/' /etc/apt/sources.list +RUN echo "deb http://archive.debian.org/debian bullseye-backports main contrib non-free" > /etc/apt/sources.list.d/bullseye-backports.list +RUN apt-get update +RUN apt-get install -y \ + apt-utils \ + bison \ + build-essential \ + bzip2 \ + ca-certificates \ + ccache \ + check \ + curl \ + cmake-latest \ + flex \ + git \ + git-lfs \ + gperf \ + lcov \ + libbsd-dev \ + libffi-dev \ + libglib2.0-0 \ + libncurses-dev \ + libpixman-1-0 \ + libsdl2-2.0-0 \ + libslirp0 \ + libusb-1.0-0-dev \ + make \ + ninja-build \ + python3 \ + python3-venv \ + python3-crcmod \ + ruby \ + sudo \ + unzip \ + usbutils \ + wget \ + xz-utils \ + zip \ + build-essential pkg-config yasm \ + libsqlite3-dev \ + libxv-dev libvdpau-dev libva-dev libglu1-mesa-dev \ + libasound2-dev libpulse-dev \ + libx264-dev libxvidcore-dev \ + libmp3lame-dev libtwolame-dev libopus-dev libvorbis-dev libogg-dev \ + libpng-dev libass-dev \ + file \ + squashfs-tools + # app image + RUN apt-get install -y desktop-file-utils fakeroot fuse patchelf python3-pip python3-setuptools squashfs-tools strace util-linux zsync + RUN apt-get install -y zsh neovim + + RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \ + && : + #libaften-dev \ + +# App image +RUN wget --no-proxy https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage && \ +chmod +x appimage-builder-1.1.0-x86_64.AppImage && \ + mv appimage-builder-1.1.0-x86_64.AppImage /usr/local/bin/appimage-builder + +RUN wget --no-proxy https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -O /usr/local/bin/linuxdeploy && \ + chmod +x /usr/local/bin/linuxdeploy + +RUN wget --no-proxy https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage \ + -O /usr/local/bin/linuxdeploy-plugin-appimage && \ + wget --no-proxy https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage \ + -O /usr/local/bin/linuxdeploy-plugin-qt && \ + wget --no-proxy https://github.com/AppImage/type2-runtime/releases/download/continuous/runtime-x86_64 \ + -O /usr/local/bin/runtime-x86_64 && \ + wget --no-proxy https://github.com/AppImage/appimagetool/releases/download/1.9.0/appimagetool-x86_64.AppImage \ + -O /usr/local/bin/appimagetool1 && \ + chmod +x /usr/local/bin/* +RUN useradd -m bullseye && usermod --shell /usr/bin/zsh bullseye +RUN chmod a+rwx /opt /usr/local/bin +# +# + +# +# +# +# Extra packages +# +# +# +RUN apt-get install -y \ + libx264-dev \ + libx265-dev \ + libvpx-dev \ + libaom-dev \ + libfuse-dev \ + libfaad-dev \ + libopencore-amrnb-dev \ + libopencore-amrwb-dev + +RUN apt-get install -y \ + qt6-base-dev qt6-l10n-tools qt6-wayland + + #libfaac-dev \ + #libfdk-aac-dev \ +#libfuse2t64 + +# +CMD "/bin/bash" + + +RUN cd /tmp && git clone https://github.com/FFmpeg/nv-codec-headers.git && cd nv-codec-headers && make install + +################################### +# Setup user env +################################### +USER ${USERNAME} +# +RUN cd /tmp && /usr/local/bin/appimagetool1 --appimage-extract && mv squashfs-root /opt/appimagetool-extracted +# +RUN cat <<EOF > /home/bullseye/.zshrc +# History Settings +HISTFILE=~/.zsh_history +HISTSIZE=10000 +SAVEHIST=10000 +setopt appendhistory +setopt sharehistory + +# Completion System +autoload -Uz compinit && compinit + +# Prompt +PROMPT='%F{cyan}%n@docker%f %F{blue}%~%f %# ' + +# Aliases +alias ls='ls --color=auto' +alias ll='ls -lah' +EOF +# give access to image tool +ENV PATH="/opt/appimagetool-extracted/usr/bin/:$PATH" + + +
View file
avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_bullseye/devcontainer.json
Added
@@ -0,0 +1,36 @@ +{ + /* A name for the dev container displayed in the UI */ + "name": "Avidemux", + /* container name when creating container */ + "image": "avidemux/avidemux_bullseye:latest", + /* mount the local folder to /workspaces folder of Docker image */ + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/avidemux,type=bind", + /* the path of workspace folder, which means that this folder will be opened after container is running + */ + "workspaceFolder": "/workspaces/avidemux", + /* mount the VS Code extensions to the target path, and then they don't need to be installed again when rebuilding the container + */ + "mounts": + "source=extensionCache,target=/root/.vscode-server/extensions,type=volume", + "source=/run/udev,target=/run/udev,type=bind,consistency=delegated" + , + /* follow the commands of Dockerfile to create the container + */ + "build": { + "dockerfile": "Dockerfile" + }, + /* Machine specific settings that should be copied into the container + */ + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "idf.gitPath": "/usr/bin/git" + }, + /* An array of extensions that should be installed into the container. */ + "extensions": , + /* start the container with privileged mode, otherwise the devices cannot be accessed on the Docker image. + */ + "runArgs": "--privileged", "--name", "avidemux_bullseye", + /* --device=/dev/alpha:/dev/beta + */ + "remoteUser": "bullseye" +}
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_fedora/Dockerfile -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_fedora/Dockerfile
Changed
@@ -39,8 +39,12 @@ x264-devel \ x265-devel RUN dnf -y install qt6-*{devel,doc}* +RUN dnf -y install SDL3-devel RUN dnf -y clean all +RUN cd /tmp && git clone https://github.com/FFmpeg/nv-codec-headers.git && cd nv-codec-headers && make install + + WORKDIR /home/fedora/workspace RUN chown fedora:fedora /home/fedora/workspace
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_fedora/devcontainer.json -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_fedora/devcontainer.json
Changed
@@ -29,7 +29,8 @@ "extensions": , /* start the container with privileged mode, otherwise the devices cannot be accessed on the Docker image. */ - "runArgs": "--privileged", + "runArgs": "--privileged", "--name", "avidemux_fedora43", + /* --device=/dev/alpha:/dev/beta */ "remoteUser": "fedora"
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_mxe64/Dockerfile -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_mxe64/Dockerfile
Changed
@@ -66,7 +66,7 @@ fuse patchelf python3-pip python3-setuptools squashfs-tools strace \ util-linux zsync libfuse2t64 \ zsh neovim \ - autoconf \ + autoconf \ automake \ autopoint \ bash \ @@ -102,7 +102,7 @@ nsis-doc \ nsis-pluginapi - RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \ +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \ && : #libaften-dev \ @@ -149,6 +149,7 @@ echo "MXE_TARGETS := x86_64-w64-mingw32.shared" > settings.mk \ && echo "JOBS := 4" >> settings.mk && make qt6-qtbase RUN cd /opt/mxe && make qt6 +RUN cd /opt/mxe && make opencore-amr && make fdk-aac && make sdl3 RUN echo Done ENV PATH="/opt/mxe/usr/bin:/usr/local/bin:/opt/mxe/bin:/opt/mxe/usr/x86_64-pc-linux-gnu/qt6/bin/:${PATH}" # --- install libaom
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_mxe64/devcontainer.json -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_mxe64/devcontainer.json
Changed
@@ -29,7 +29,7 @@ "extensions": , /* start the container with privileged mode, otherwise the devices cannot be accessed on the Docker image. */ - "runArgs": "--privileged", + "runArgs": "--privileged", "--name", "avidemux_mxe", /* --device=/dev/alpha:/dev/beta */ "remoteUser": "mxe", @@ -37,6 +37,6 @@ "devpod": { "containerInactivityTimeout": "90m" } - }, - "postCreateCommand": "bash .devcontainer_mxe64/post-create.sh" + } +/* "postCreateCommand": "bash .devcontainer_mxe64/post-create.sh" */ }
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_trixie/Dockerfile -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_trixie/Dockerfile
Changed
@@ -42,7 +42,6 @@ libglib2.0-0 \ libncurses-dev \ libpixman-1-0 \ - libsdl2-2.0-0 \ libslirp0 \ libusb-1.0-0-dev \ make \ @@ -69,6 +68,7 @@ libx264-dev libxvidcore-dev \ libmp3lame-dev libtwolame-dev libopus-dev libvorbis-dev libogg-dev \ libpng-dev libass-dev + RUN apt-get install -y \ libfaac-dev \ libfdk-aac-dev \ @@ -84,6 +84,15 @@ RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \ && : #libaften-dev \ +# Missing packages + RUN apt-get install -y \ + libopencore-amrnb-dev \ + libopencore-amrwb-dev \ + libdca-dev \ + libfaad-dev + RUN apt-get install -y libsdl3-dev + + #libaften-dev # App image RUN wget --no-proxy https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage && \ @@ -104,6 +113,9 @@ chmod +x /usr/local/bin/* RUN useradd -m trixie && usermod --shell /usr/bin/zsh trixie # +RUN cd /tmp && git clone https://github.com/FFmpeg/nv-codec-headers.git && cd nv-codec-headers && make install +# Cleanup +#RUN apt autoclean && apt autoremove # CMD "/bin/bash"
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_trixie/devcontainer.json -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_trixie/devcontainer.json
Changed
@@ -29,7 +29,7 @@ "extensions": , /* start the container with privileged mode, otherwise the devices cannot be accessed on the Docker image. */ - "runArgs": "--privileged", + "runArgs": "--privileged", "--name", "avidemux_trixie", /* --device=/dev/alpha:/dev/beta */ "remoteUser": "trixie"
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_ubuntu2510/Dockerfile -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_ubuntu2510/Dockerfile
Changed
@@ -58,11 +58,15 @@ libvpx-dev \ libaom-dev \ file \ + && apt-get install -y libsdl3-dev \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* \ && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \ && : +RUN cd /tmp && git clone https://github.com/FFmpeg/nv-codec-headers.git && cd nv-codec-headers && make install + + RUN rm -f /etc/apt/apt.conf.d/01proxy # # Reuse Arm & Riscv toolchains
View file
avidemux2-2.8.2.git20260407.tar.xz/.devcontainer_ubuntu2510/devcontainer.json -> avidemux2-2.8.2.git20260417.tar.xz/.devcontainer_ubuntu2510/devcontainer.json
Changed
@@ -29,7 +29,7 @@ "extensions": , /* start the container with privileged mode, otherwise the devices cannot be accessed on the Docker image. */ - "runArgs": "--privileged", + "runArgs": "--privileged", "--name", "avidemux_ubuntu2510", /* --device=/dev/alpha:/dev/beta */ "remoteUser": "ubuntu"
View file
avidemux2-2.8.2.git20260407.tar.xz/appImage/checkDeps.py -> avidemux2-2.8.2.git20260417.tar.xz/appImage/checkDeps.py
Changed
@@ -46,7 +46,7 @@ for root, _, files in os.walk(appdir_path): for f in files: # Check for shared objects or files in bin folders - if f.endswith(".so") or ".so." in f or "/bin/" in root: + if f.endswith(".so") or ".so." in f or "/bin/" in root or root.endswith("/bin"): all_targets.append(os.path.join(root, f)) # 2. Check each target for host leaks
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/cli/CMakeLists.txt -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/cli/CMakeLists.txt
Changed
@@ -106,7 +106,7 @@ ADD_SUBDIRECTORY(ADM_UIs ./ADM_UIsCli) ADD_SUBDIRECTORY(ADM_userInterfaces ./ADM_userInterfacesCli) -SDLify(../common/main.cpp) +# SDLify(../common/main.cpp) IF(ADM_SUBVERSION) ADD_SOURCE_CFLAGS(../common/main.cpp "-DADM_SUBVERSION=\"${ADM_SUBVERSION}\"") ADD_SOURCE_CFLAGS(../common/main.cpp "-DFFMPEG_VERSION=\"${FFMPEG_VERSION}\"") @@ -158,9 +158,9 @@ TARGET_LINK_LIBRARIES(avidemux3_cli PRIVATE ADM_commonUI6_CLI) # SDL -IF(USE_SDL) - TARGET_LINK_LIBRARIES(avidemux3_cli PRIVATE ${SDL2_LIBRARY} ${SDL2_MAIN}) -ENDIF() +# IF(USE_SDL) +# TARGET_LINK_LIBRARIES(avidemux3_cli PRIVATE ${SDL2_LIBRARY} ${SDL2_MAIN}) +# ENDIF() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # OS Specific
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/common/main.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/common/main.cpp
Changed
@@ -14,6 +14,7 @@ ***************************************************************************/ #include "config.h" // +// #include "ADM_coreDemuxer.h" #include "ADM_coreVideoFilterFunc.h" #include "ADM_crashdump.h" @@ -39,6 +40,13 @@ #include "adm_main.h" #include "audio_out.h" #include "prefs.h" + +#ifdef USE_SDL3 +#define SDL_MAIN_HANDLED +#include <SDL3/SDL.h> +#include <SDL3/SDL_main.h> // Optional, +#endif + #ifdef USE_VDPAU #if ADM_UI_TYPE_BUILD == ADM_UI_CLI bool vdpauProbe(void) @@ -105,11 +113,13 @@ static flavors myFlavors = {"qt4", "qt5", "qt6"}; +#ifndef WIN32 #ifdef main extern "C" { int main(int _argc, char *_argv); } +#endif #endif // main int main(int _argc, char *_argv)
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_commonUI/DIA_prefs.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_commonUI/DIA_prefs.cpp
Changed
@@ -14,8 +14,6 @@ #include "ADM_default.h" #include "config.h" -#include "prefs.h" -#include "ADM_Video.h" #include "ADM_pp.h" #include "ADM_qtx.h" @@ -30,6 +28,9 @@ #include "GUI_sdlRender.h" #endif +#include "ADM_indexingFlags.h" +#include "prefs.h" + extern const char *getNativeRendererDesc(int type); #ifdef USE_VDPAU @@ -206,21 +207,20 @@ ADM_info("Avisynth port: %d\n", defaultPortAvisynth); // Indexing -//#define INDEXING_PREFS_VERBOSE + // #define INDEXING_PREFS_VERBOSE uint32_t indexingFlags = ADM_IDX_FLAGS_DEFAULT; if (!prefs->get(INDEXING_INDEXING_FLAGS, &indexingFlags)) { indexingFlags = ADM_IDX_FLAGS_DEFAULT; } -#if 0 uint32_t idxPsFiles = flagsToIdxSettings(indexingFlags, ADM_IDX_FLAGS_OFFSET_MPEGPS); uint32_t idxTsFiles = flagsToIdxSettings(indexingFlags, ADM_IDX_FLAGS_OFFSET_MPEGTS); -#endif uint32_t idxMkvFiles = flagsToIdxSettings(indexingFlags, ADM_IDX_FLAGS_OFFSET_MATROSKA); uint32_t idxMp4Files = flagsToIdxSettings(indexingFlags, ADM_IDX_FLAGS_OFFSET_MP4); #ifdef INDEXING_PREFS_VERBOSE - ADM_info("Indexing flags: %" PRIu32" -> MPEG-PS: %" PRIu32" MPEG-TS: %" PRIu32" Matroska: %" PRIu32" MP4: %" PRIu32"\n", - indexingFlags, idxPsFiles, idxTsFiles, idxMkvFiles, idxMp4Files); + ADM_info("Indexing flags: %" PRIu32 " -> MPEG-PS: %" PRIu32 " MPEG-TS: %" PRIu32 " Matroska: %" PRIu32 + " MP4: %" PRIu32 "\n", + indexingFlags, idxPsFiles, idxTsFiles, idxMkvFiles, idxMp4Files); #endif // HDR @@ -488,26 +488,25 @@ frameAvisynth.swallow(&uintDefaultPortAvisynth); // Indexing - diaElemFrame frameIndexing(QT_TRANSLATE_NOOP("adm","Writing index to disk")); + diaElemFrame frameIndexing(QT_TRANSLATE_NOOP("adm", "Index files")); #define IDX_FORCE_MEM 0 #define IDX_USE_SAVED 1 #define IDX_WRITE_TO_DISK 2 - diaMenuEntry indexingEntries = { - {IDX_FORCE_MEM, QT_TRANSLATE_NOOP("adm","Disabled"), NULL }, - {IDX_USE_SAVED, QT_TRANSLATE_NOOP("adm","Read-only"), NULL }, - {IDX_WRITE_TO_DISK, QT_TRANSLATE_NOOP("adm","Enabled"), NULL } - }; -#if 0 - diaElemMenu menuIndexingPs(&idxPsFiles, QT_TRANSLATE_NOOP("adm","MPEG-PS files:"), NB_ITEMS(indexingEntries), indexingEntries); - diaElemMenu menuIndexingTs(&idxTsFiles, QT_TRANSLATE_NOOP("adm","MPEG-TS files:"), NB_ITEMS(indexingEntries), indexingEntries); -#endif - diaElemMenu menuIndexingMkv(&idxMkvFiles, QT_TRANSLATE_NOOP("adm","Matroska files:"), NB_ITEMS(indexingEntries), indexingEntries); - diaElemMenu menuIndexingMp4(&idxMp4Files, QT_TRANSLATE_NOOP("adm","MP4 files:"), NB_ITEMS(indexingEntries), indexingEntries); + diaMenuEntry indexingEntries = {{IDX_FORCE_MEM, QT_TRANSLATE_NOOP("adm", "Disable"), NULL}, + {IDX_USE_SAVED, QT_TRANSLATE_NOOP("adm", "Load existing only"), NULL}, + {IDX_WRITE_TO_DISK, QT_TRANSLATE_NOOP("adm", "Enable"), NULL}}; + + diaElemMenu menuIndexingPs(&idxPsFiles, QT_TRANSLATE_NOOP("adm", "MPEG-PS (.idx2):"), NB_ITEMS(indexingEntries), + indexingEntries); + diaElemMenu menuIndexingTs(&idxTsFiles, QT_TRANSLATE_NOOP("adm", "MPEG-TS (.idx2):"), NB_ITEMS(indexingEntries), + indexingEntries); + diaElemMenu menuIndexingMkv(&idxMkvFiles, QT_TRANSLATE_NOOP("adm", "Matroska (.idxb):"), NB_ITEMS(indexingEntries), + indexingEntries); + diaElemMenu menuIndexingMp4(&idxMp4Files, QT_TRANSLATE_NOOP("adm", "MP4 (.idxb):"), NB_ITEMS(indexingEntries), + indexingEntries); -#if 0 frameIndexing.swallow(&menuIndexingPs); frameIndexing.swallow(&menuIndexingTs); -#endif frameIndexing.swallow(&menuIndexingMkv); frameIndexing.swallow(&menuIndexingMp4); @@ -544,6 +543,10 @@ , {RENDER_SDL, QT_TRANSLATE_NOOP("adm", "SDL"), NULL} #endif +#ifdef USE_SDL3 + , + {RENDER_SDL3, QT_TRANSLATE_NOOP("adm", "SDL3"), NULL} +#endif }; diaElemMenu menuVideoMode(&render, QT_TRANSLATE_NOOP("adm", "Video _display:"), NB_ITEMS(videoMode), videoMode); #ifdef USE_SDL @@ -1003,14 +1006,12 @@ // Indexing indexingFlags = 0; -#if 0 indexingFlags += idxSettingsToFlags(idxPsFiles, ADM_IDX_FLAGS_OFFSET_MPEGPS); indexingFlags += idxSettingsToFlags(idxTsFiles, ADM_IDX_FLAGS_OFFSET_MPEGTS); -#endif indexingFlags += idxSettingsToFlags(idxMkvFiles, ADM_IDX_FLAGS_OFFSET_MATROSKA); indexingFlags += idxSettingsToFlags(idxMp4Files, ADM_IDX_FLAGS_OFFSET_MP4); #ifdef INDEXING_PREFS_VERBOSE - ADM_info("Setting indexing flags to %" PRIu32"\n", indexingFlags); + ADM_info("Setting indexing flags to %" PRIu32 "\n", indexingFlags); #endif prefs->set(INDEXING_INDEXING_FLAGS, indexingFlags); @@ -1065,24 +1066,24 @@ uint32_t flags = 0; switch (off) { - case ADM_IDX_FLAGS_OFFSET_MPEGPS: - case ADM_IDX_FLAGS_OFFSET_MPEGTS: - case ADM_IDX_FLAGS_OFFSET_MATROSKA: - case ADM_IDX_FLAGS_OFFSET_MP4: - break; - default: - return flags; + case ADM_IDX_FLAGS_OFFSET_MPEGPS: + case ADM_IDX_FLAGS_OFFSET_MPEGTS: + case ADM_IDX_FLAGS_OFFSET_MATROSKA: + case ADM_IDX_FLAGS_OFFSET_MP4: + break; + default: + return flags; } switch (val) { - case IDX_FORCE_MEM: - flags |= ADM_IDX_FLAG_IGNORE_INDEX_FILE << off; - break; - case IDX_WRITE_TO_DISK: - flags |= ADM_IDX_FLAG_WRITE_INDEX_FILE << off; - case IDX_USE_SAVED: - default: - break; + case IDX_FORCE_MEM: + flags |= ADM_IDX_FLAG_IGNORE_INDEX_FILE << off; + break; + case IDX_WRITE_TO_DISK: + flags |= ADM_IDX_FLAG_WRITE_INDEX_FILE << off; + case IDX_USE_SAVED: + default: + break; } return flags; } @@ -1091,13 +1092,13 @@ { switch (off) { - case ADM_IDX_FLAGS_OFFSET_MPEGPS: - case ADM_IDX_FLAGS_OFFSET_MPEGTS: - case ADM_IDX_FLAGS_OFFSET_MATROSKA: - case ADM_IDX_FLAGS_OFFSET_MP4: - break; - default: - return IDX_WRITE_TO_DISK; + case ADM_IDX_FLAGS_OFFSET_MPEGPS: + case ADM_IDX_FLAGS_OFFSET_MPEGTS: + case ADM_IDX_FLAGS_OFFSET_MATROSKA: + case ADM_IDX_FLAGS_OFFSET_MP4: + break; + default: + return IDX_WRITE_TO_DISK; } flags >>= off; if (flags & ADM_IDX_FLAG_WRITE_INDEX_FILE)
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_render_qt/CMakeLists.txt -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_render_qt/CMakeLists.txt
Changed
@@ -28,11 +28,17 @@ TARGET_SOURCES(${ADM_LIB} PRIVATE GUI_xvRender.cpp) TARGET_LINK_LIBRARIES(${ADM_LIB} PUBLIC ${XVIDEO_LIBRARY_DIR} ${XEXT_LIBRARY_DIR}) ENDIF() -IF(USE_SDL) +IF(USE_SDL3) + MESSAGE(STATUS "SDL3 enabled, disabling SDL2 to avoid symbol conflicts.") + TARGET_SOURCES(${ADM_LIB} PRIVATE GUI_sdl3Render.cpp) + TARGET_INCLUDE_DIRECTORIES(${ADM_LIB} PRIVATE ${SDL3_INCLUDE_DIRS}) + TARGET_LINK_LIBRARIES(${ADM_LIB} PUBLIC ${SDL3_LIBRARIES}) +ELSEIF(USE_SDL) TARGET_SOURCES(${ADM_LIB} PRIVATE GUI_sdlRender.cpp) SDLify(GUI_sdlRender.cpp) TARGET_LINK_LIBRARIES(${ADM_LIB} PUBLIC ${SDL2_LIBRARY}) ENDIF() + IF(USE_VDPAU) ADD_CORE_INCLUDE(ADM_coreVdpau) TARGET_SOURCES(${ADM_LIB} PRIVATE GUI_vdpauRender.cpp)
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_render_qt/GUI_render.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_render_qt/GUI_render.h
Changed
@@ -74,6 +74,7 @@ RENDER_DXVA2 = 8, RENDER_DEFAULT = 9, RENDER_GTK = 10, + RENDER_SDL3 = 11, RENDER_LAST } ADM_RENDER_TYPE; /**
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_render_qt/GUI_renderFactory_common.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_render_qt/GUI_renderFactory_common.cpp
Changed
@@ -22,6 +22,10 @@ extern VideoRenderBase *spawnSimpleRender(); +#ifdef USE_SDL3 +extern VideoRenderBase *spawnSdl3Render(); +#endif + #ifdef USE_SDL extern VideoRenderBase *spawnSdlRender(); #endif @@ -84,6 +88,12 @@ break; #endif +#if defined(USE_SDL3) + case RENDER_SDL3: { + TRY_RENDERER_SPAWN_ALL(spawnSdl3Render, "SDL3") + } + break; +#endif #if defined(USE_SDL) case RENDER_SDL: { TRY_RENDERER_SPAWN_ALL(spawnSdlRender, "SDL")
View file
avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_render_qt/GUI_sdl3Render.cpp
Added
@@ -0,0 +1,318 @@ +/*************************************************************************** + copyright : (C) 2026 + email : fixounet@free.fr + * + * SDL3 version +***************************************************************************/ + +#include "ADM_default.h" +#include "config.h" +// + +// clang-format off +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "ADM_qtx.h" + +extern "C" +{ +// get rid of warnings due to different definitions +#undef HAVE_INTTYPES_H +#undef HAVE_MALLOC_H +#undef HAVE_STDINT_H +#undef HAVE_SYS_TYPES_H +#include <SDL3/SDL.h> +} + + +#include "ADM_colorspace.h" +#include "GUI_render.h" +#include "GUI_accelRender.h" +#include "GUI_sdl3Render.h" +// clang-format on + +class sdl3RenderImpl : public VideoRenderBase +{ + protected: + GUI_WindowInfo winfo; + int accel; + + public: + sdl3RenderImpl(void); + virtual ~sdl3RenderImpl(); + virtual bool init(GUI_WindowInfo *window, uint32_t w, uint32_t h, float zoom); + virtual bool stop(void); + virtual bool displayImage(ADMImage *pic); + virtual bool changeZoom(float newZoom); + virtual bool usingUIRedraw(void) + { + return false; + }; + virtual bool refresh(void); + const char *getName(); + + protected: + bool init_sdl_window_once(GUI_WindowInfo *); + bool cleanup(void); + void rescaleDisplay(void); + bool sdl_running; + SDL_Texture *sdl_texture; +}; + +/** + * spawnSdl3Render + */ +VideoRenderBase *spawnSdl3Render() +{ + return new sdl3RenderImpl(); +} + +static bool sdl3_video_initialized = false; +static SDL_Window *sdl_window = NULL; +static SDL_Renderer *sdl_renderer = NULL; +static void *last_known_surface = nullptr; + +/** + * static SDL logging + */ +static void SDL_Logger(void *userdata, int category, SDL_LogPriority priority, const char *message) +{ + ADM_info("SDL3 %s\n", message); +} + +/** + * sdlRenderImpl + */ +sdl3RenderImpl::sdl3RenderImpl(void) +{ + sdl_running = false; + sdl_texture = NULL; + accel = -1; + memset(&winfo, 0, sizeof(GUI_WindowInfo)); + winfo.scalingFactor = 1.; + ADM_info("SDL3 Created\n"); +} + +sdl3RenderImpl::~sdl3RenderImpl() +{ + stop(); +} + +bool sdl3RenderImpl::stop(void) +{ + ADM_info("SDL3 Stopping\n"); + cleanup(); + if (sdl_running) + { + ADM_info("SDL3 Video subsystem state preserved (Wayland)\n"); + sdl_running = false; + } + return true; +} + +void sdl3RenderImpl::rescaleDisplay(void) +{ + // SDL3 natively expects window coordinates in Device Independent Pixels (DIPs). + // Mutating display limits with physical scalingFactor corrupts Wayland subsurface logic, projecting large offsets. + // displayWidth and displayHeight internally remain unscaled DIP values. +} +/* + * + */ +bool sdl3RenderImpl::init_sdl_window_once(GUI_WindowInfo *window) +{ + if (sdl_window && last_known_surface != window->windowOpaquePointer) + { + ADM_info("SDL3 Surface changed! Recreating SDL window.\n"); + cleanup(); + if (sdl_window) + SDL_DestroyWindow(sdl_window); + sdl_window = nullptr; + sdl_renderer = nullptr; + sdl3_video_initialized = false; + } + if (sdl3_video_initialized && sdl_window && sdl_renderer) + return true; + + int version = SDL_GetVersion(); + ADM_info("SDL3 Runtime SDL Version: %d.%d.%d\n", SDL_VERSIONNUM_MAJOR(version), SDL_VERSIONNUM_MINOR(version), + SDL_VERSIONNUM_MICRO(version)); + + SDL_SetLogOutputFunction(SDL_Logger, NULL); + // Bridge with qt6 window + QT_LINUX_WINDOW_ENGINE engine = admDetectQtEngine(); + if (engine == QT_WAYLAND_ENGINE) + { + SDL_SetHint(SDL_HINT_VIDEO_DRIVER, "wayland"); + SDL_SetHint(SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR, "0"); + if (window->display) + { + SDL_SetPointerProperty(SDL_GetGlobalProperties(), SDL_PROP_GLOBAL_VIDEO_WAYLAND_WL_DISPLAY_POINTER, + window->display); + } + } + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl,opengles2,software"); + + if (!SDL_InitSubSystem(SDL_INIT_VIDEO)) + { + const char *err = SDL_GetError(); + ADM_warning("SDL3 Video subsystem init failed, error: %s\n", (err && *err) ? err : "Unknown"); + return false; + } + ADM_info("SDL3 Video subsystem init ok, using driver: %s\n", SDL_GetCurrentVideoDriver()); + SDL_PropertiesID props = SDL_CreateProperties(); + SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, "avidemux_sdl3"); + // SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN, true); + // SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, (int)w); + // SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, (int)h); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_X_NUMBER, 00); + SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_Y_NUMBER, 00); + SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN, true); + switch (engine) + { + case QT_WAYLAND_ENGINE: + ADM_info("SDL3 Using Wayland backend for borderless window\n"); + SDL_SetPointerProperty(props, SDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER, window->windowOpaquePointer); + SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN, true); + SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN, true); + break; + case QT_X11_ENGINE: + ADM_info("SDL3 Using X11 backend for borderless window\n"); + SDL_SetPointerProperty(props, SDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER, (void *)winfo.systemWindowId); + SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN, true); + break; + default: +#ifdef _WIN32 + ADM_info("SDL3 Using WIN32 backend for borderless window\n"); + SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN, true); + SDL_SetPointerProperty(props, SDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER, (void *)winfo.systemWindowId); +#endif + break; + } + sdl_window = SDL_CreateWindowWithProperties(props); + SDL_DestroyProperties(props); + SDL_SetWindowPosition(sdl_window, 0, 0); + if (!sdl_window) + { + ADM_warning("SDL3 Window creation failed: %s\n", SDL_GetError()); + return false;
View file
avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_render_qt/GUI_sdl3Render.h
Added
@@ -0,0 +1,9 @@ +#ifndef GUI_SDL3RENDER_H +#define GUI_SDL3RENDER_H + +#include "GUI_render.h" + +// Forward declare VideoRenderBase since GUI_render.h provides it +VideoRenderBase *spawnSdl3Render(void); + +#endif // GUI_SDL3RENDER_H
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/Q_gui2.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/Q_gui2.cpp
Changed
@@ -671,8 +671,8 @@ if (currentStyle) currentStyleName = currentStyle->objectName().toLower(); // style names are case-insensitive - float stretchFactor = (0 == strcmp(currentStyleName.toUtf8().constData(), "windows11")) ? - 1.25 : DEFAULT_CT_DISPLAY_STRETCH_FACTOR; + float stretchFactor = + (0 == strcmp(currentStyleName.toUtf8().constData(), "windows11")) ? 1.25 : DEFAULT_CT_DISPLAY_STRETCH_FACTOR; ui.currentTime->setFixedSize(stretchFactor * ctrect.width(), ui.currentTime->height()); #else ui.currentTime->setFixedSize(DEFAULT_CT_DISPLAY_STRETCH_FACTOR * ctrect.width(), ui.currentTime->height()); @@ -883,13 +883,13 @@ setAcceptDrops(true); -// clang-format off + // clang-format off #ifndef __APPLE__ setWindowIcon(QIcon(MKICON(avidemux-icon))); #else setWindowIcon(QIcon(MKOSXICON(avidemux))); #endif -// clang-format on + // clang-format on // Hook also the toolbar connect(ui.toolBar, SIGNAL(actionTriggered(QAction *)), this, SLOT(searchToolBar(QAction *))); @@ -1918,7 +1918,7 @@ if (NULL != getenv("ADM_QT_STYLE_VERBOSE")) { - QString styleName ="unknown style"; + QString styleName = "unknown style"; QStyle *currentStyle = qApp->style(); if (currentStyle) styleName = currentStyle->objectName(); @@ -2894,12 +2894,17 @@ #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) ADM_info("Starting Qt5 GUI...\n"); #else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + ADM_info("Starting Qt6 GUI...\n"); +#else ADM_info("Starting Qt4 GUI...\n"); #endif +#endif initTranslator(); global_argc = nargc; global_argv = nargv; + ADM_renderLibInit(&UI_Hooks); #if !defined(__APPLE__) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // Despite HiDPI scaling being supported from Qt 5.6 on, important aspects @@ -3729,17 +3734,23 @@ ((MainWindow *)QuiMainWindows)->calcDockWidgetDimensions(reqw, reqh); reqw += w; reqh += h; - UI_setBlockZoomChangesFlag(true); - QuiMainWindows->resize(reqw, reqh); - ADM_info("Resizing the main window to %dx%d px\n", reqw, reqh); -#ifdef _WIN32 - QRect fs = QuiMainWindows->frameGeometry(); + uint32_t screenW = 0, screenH = 0; #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) QRect space = QApplication::desktop()->availableGeometry(); #else - QRect space = QApplication::primaryScreen()->availableGeometry(); + QRect space = QGuiApplication::primaryScreen()->availableGeometry(); #endif + if (reqw > (uint32_t)space.width()) + reqw = space.width(); + if (reqh > (uint32_t)space.height()) + reqh = space.height(); + + UI_setBlockZoomChangesFlag(true); + QuiMainWindows->resize(reqw, reqh); + ADM_info("Resizing the main window to %dx%d px (Screen: %dx%d)\n", reqw, reqh, space.width(), space.height()); +#ifdef _WIN32 + QRect fs = QuiMainWindows->frameGeometry(); int x = fs.x() + fs.width() - space.x() - space.width(); bool move = false; if (x > 0) // the right edge of the window doesn't fit into the screen
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.cpp
Changed
@@ -21,22 +21,33 @@ #include <QPaintEngine> #include <QPainter> #include <QWindow> +#include <QMainWindow> #include "ADM_qtx.h" #if QT_VERSION < QT_VERSION_CHECK(6, 5, 0) #if !defined(__APPLE__) #include <QWindow> #if !defined(_WIN32) - extern "C" void *XOpenDisplay(char *); +typedef struct _XDisplay Display; +extern "C" Display *XOpenDisplay(const char *display_name); #endif #endif #else #include <QGuiApplication> using namespace QNativeInterface; #endif -/* Probably on unix/X11 ..*/ #ifdef __APPLE__ #include <Carbon/Carbon.h> +#else +// +#ifndef _WIN32 +// Linux +#if defined(HAVE_QPLATFORM_NATIVE) +#define USE_NATIVE_API +#include <QtGui/qpa/qplatformnativeinterface.h> +#endif #endif +#endif +// #include "ADM_assert.h" #include "DIA_coreToolkit.h" #include "GUI_render.h" @@ -99,7 +110,11 @@ doOnce = false; _width = _height = 0; hostFrame = z; - + if (admDetectQtEngine() == QT_WAYLAND_ENGINE) + { + setAttribute(Qt::WA_DontCreateNativeAncestors); + setAttribute(Qt::WA_NativeWindow); + } } //{setAutoFillBackground(false);} #endif // Haiku @@ -115,6 +130,14 @@ */ void ADM_Qvideo::paintEvent(QPaintEvent *ev) { + if (admDetectQtEngine() == QT_WAYLAND_ENGINE) + { + if (windowHandle() && window()) + { + QPoint wp = mapTo(window(), QPoint(0, 0)); + windowHandle()->setPosition(wp); + } + } // printf("Paint event\n"); if (drawer) { @@ -137,6 +160,21 @@ renderExposeEventFromUI(); } } + +bool ADM_Qvideo::eventFilter(QObject *obj, QEvent *event) +{ + if (admDetectQtEngine() == QT_WAYLAND_ENGINE) + { + if (event->type() == QEvent::Resize || event->type() == QEvent::Move || event->type() == QEvent::LayoutRequest) + { + if (windowHandle() && window()) + { + windowHandle()->setPosition(mapTo(window(), QPoint(0, 0))); + } + } + } + return QWidget::eventFilter(obj, event); +} /** \fn setADMSize */ @@ -183,6 +221,17 @@ void UI_QT4VideoWidget(QFrame *host) { videoWindow = new ADM_Qvideo(host); + if (admDetectQtEngine() == QT_WAYLAND_ENGINE) + { + videoWindow->winId(); + if (videoWindow->windowHandle() && QuiMainWindows && QuiMainWindows->windowHandle()) + { + videoWindow->windowHandle()->setParent(QuiMainWindows->windowHandle()); + // Hook main window layout events to force Wayland subsurface alignment when parents dynamically map and + // shift + QuiMainWindows->installEventFilter(videoWindow); + } + } videoWindow->show(); } //************************* @@ -229,7 +278,8 @@ * */ static void *myDisplay = NULL; -static int mySystemWindowId = 0; +static uint64_t mySystemWindowId = 0; +static void *myWindowOpaque = NULL; /* * Apple, let them null * @@ -249,45 +299,66 @@ } #else // linux +typedef struct _XDisplay Display; +extern "C" Display *XOpenDisplay(const char *display_name); static void systemWindowInfo_once() { -#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0) - myDisplay = XOpenDisplay(NULL); - mySystemWindowId = videoWindow->winId(); -#else + // Always refresh surface and system IDs + switch (admDetectQtEngine()) { - ADM_info("Running on platform %s\n", currentQApplication()->platformName().toLatin1().data()); - switch (admDetectQtEngine()) + case QT_X11_ENGINE: { + if (!myDisplay) { - case QT_X11_ENGINE: { - auto x11 = currentQApplication()->nativeInterface<QNativeInterface::QX11Application>(); - if (x11) + auto *x11App = qApp->nativeInterface<QNativeInterface::QX11Application>(); + if (x11App) { - ADM_info("found x11 display\n"); - myDisplay = x11->display(); - mySystemWindowId = videoWindow->winId(); + myDisplay = x11App->display(); } - } - break; - case QT_WAYLAND_ENGINE: { - auto wayland = currentQApplication()->nativeInterface<QNativeInterface::QWaylandApplication>(); - if (wayland) + else { - ADM_info("found wayland display\n"); - myDisplay = wayland->display(); - mySystemWindowId = 0; + myDisplay = XOpenDisplay(NULL); } + ADM_info("found x11 display\n"); } - break; - default: { - ADM_warning("Cannot get qt engine infos\n"); - myDisplay = NULL; - mySystemWindowId = 0; - break; + mySystemWindowId = videoWindow->winId(); + } + break; + case QT_WAYLAND_ENGINE: { + mySystemWindowId = 0; + QPlatformNativeInterface *native = currentQApplication()->platformNativeInterface(); +#ifdef USE_NATIVE_API + if (native && videoWindow) + { + videoWindow->winId(); // Force handle creation + if (videoWindow->windowHandle()) + { + if (!myDisplay) + { + myDisplay = native->nativeResourceForIntegration("display"); + } + struct wl_surface *wlSurface = static_cast<struct wl_surface *>( + native->nativeResourceForWindow("surface", videoWindow->windowHandle())); + myWindowOpaque = wlSurface; + } + else + { + myWindowOpaque = NULL; + } } + else + { + myWindowOpaque = NULL; } - } +#else + myWindowOpaque = NULL; #endif + } + break;
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/T_preview.h
Changed
@@ -1,57 +1,62 @@ #ifndef T_preview_h #define T_preview_h +#include <QFrame> #include <QPaintEvent> #include <QWidget> -#include <QFrame> /** * */ class ADM_QvideoDrawer { -public: - virtual ~ADM_QvideoDrawer() {} - virtual bool draw(QWidget *widget, QPaintEvent *ev)=0; + public: + virtual ~ADM_QvideoDrawer() + { + } + virtual bool draw(QWidget *widget, QPaintEvent *ev) = 0; }; /** \class ADM_Qvideo */ -class ADM_Qvideo : public QWidget +class ADM_Qvideo : public QWidget { - Q_OBJECT - ADM_QvideoDrawer *drawer; - bool doOnce; - QFrame *hostFrame; -protected: - int _width,_height; -public: - ADM_Qvideo(QFrame *z); - ~ADM_Qvideo(); - void paintEvent(QPaintEvent *ev); - void setADMSize(int width,int height); - void setDrawer(ADM_QvideoDrawer *d) - { - drawer=d; - } - // This disables internal double buffer of Qt - // Set it to false if the native Qt redraw system is used - QPaintEngine *paintEngine() const - { - return NULL; // Disable - } - void useExternalRedraw(bool external) - { + Q_OBJECT + ADM_QvideoDrawer *drawer; + bool doOnce; + QFrame *hostFrame; + + protected: + int _width, _height; + + public: + ADM_Qvideo(QFrame *z); + ~ADM_Qvideo(); + void paintEvent(QPaintEvent *ev); + void setADMSize(int width, int height); + bool eventFilter(QObject *obj, QEvent *event) override; + void setDrawer(ADM_QvideoDrawer *d) + { + drawer = d; + } + // This disables internal double buffer of Qt + // Set it to false if the native Qt redraw system is used + QPaintEngine *paintEngine() const + { + return NULL; // Disable + } + void useExternalRedraw(bool external) + { #ifndef __APPLE__ - setAttribute( Qt::WA_PaintOnScreen, external ); + setAttribute(Qt::WA_PaintOnScreen, external); #endif - } - QSize sizeHint() const - { - if(!_width || !_height) return QWidget::sizeHint(); - return QSize(_width,_height); - } - + } + QSize sizeHint() const + { + if (!_width || !_height) + return QWidget::sizeHint(); + return QSize(_width, _height); + } }; -#endif // T_preview_h +#endif // T_preview_h
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/file_qt4.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/ADM_userInterfaces/ADM_gui/file_qt4.cpp
Changed
@@ -482,20 +482,29 @@ */ uint8_t FileSel_SelectDir(const char *title, char *target, uint32_t max, const char *source, const char *extension) { - QString fileName; - QFileDialog::Options options = QFileDialog::ShowDirsOnly; + QString start; + std::string lastRead; + if (source) + { + start = source; + } else + { + admCoreUtils::getLastReadFolder(lastRead); + if (lastRead.size()) + start = lastRead.c_str(); + } - fileName = QFileDialog::getExistingDirectory(fileSelGetParent(), title, source, options); + QString fileName = QFileDialog::getExistingDirectory(fileSelGetParent(), title, start, QFileDialog::ShowDirsOnly); - if (!fileName.isNull()) - { - const char *s = fileName.toUtf8().constData(); - strncpy(target, s, max); + if (fileName.isNull()) + return 0; - return 1; - } + const char *s = fileName.toUtf8().constData(); + strncpy(target, s, max); + lastRead = s; + admCoreUtils::setLastReadFolder(lastRead); - return 0; + return 1; } void GUI_FileSelWriteExtension(const char *label, const char *extension,SELFILE_CB cb) {
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/CMakeLists.txt -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/CMakeLists.txt
Changed
@@ -103,7 +103,9 @@ # Qt4 openGL INCLUDE(admCheckOpenGl) IF(NOT APPLE) - INCLUDE(FindSDL2) + IF(NOT USE_SDL3) + INCLUDE(FindSDL2) + ENDIF() ENDIF() # #-- @@ -242,7 +244,10 @@ # SDL -if(USE_SDL) +if(USE_SDL3) + MESSAGE(STATUS "Linking main app with SDL3") + TARGET_LINK_LIBRARIES(avidemux3_${QT_EXTENSION} PRIVATE SDL3) +elseif(USE_SDL) TARGET_LINK_LIBRARIES(avidemux3_${QT_EXTENSION} PRIVATE ${SDL2_LIBRARY} ${SDL2_MAIN}) ENDIF()
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux/qt4/cmake/admCheckQt6.cmake -> avidemux2-2.8.2.git20260417.tar.xz/avidemux/qt4/cmake/admCheckQt6.cmake
Changed
@@ -38,6 +38,9 @@ MESSAGE(STATUS "Checking for Qt6Network") FIND_PACKAGE(Qt6 COMPONENTS Network) + MESSAGE(STATUS "Checking for GuiPrivate") # This is needed to get the wayland window id + FIND_PACKAGE(Qt6 COMPONENTS GuiPrivate) + IF(Qt6Core_FOUND AND Qt6Gui_FOUND AND Qt6Widgets_FOUND AND Qt6OpenGLWidgets_FOUND AND Qt6Network_FOUND) MESSAGE(STATUS "Qt6 found") SET(QT6_FOUND 1) @@ -52,6 +55,10 @@ SET(QT_QTGUI_LIBRARY ${Qt6Gui_LIBRARIES} ${Qt6Widgets_LIBRARIES} ${Qt6OpenGLWidgets_LIBRARIES}) SET(QT_DEFINITIONS ${Qt6Core_DEFINITIONS} ${Qt6Widgets_DEFINITIONS} ${Qt6OpenGLWidgets_DEFINITIONS} ${Qt6Network_DEFINITIONS}) + IF(Qt6GuiPrivate_FOUND) + SET(QT_QTGUI_LIBRARY ${QT_QTGUI_LIBRARY} Qt6::GuiPrivate) + SET(QT_DEFINITIONS ${QT_DEFINITIONS} -DHAVE_QPLATFORM_NATIVE) + ENDIF() MARK_AS_ADVANCED(LRELEASE_EXECUTABLE) MARK_AS_ADVANCED(QT_MKSPECS_DIR)
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/ADM_coreDemuxer/include/ADM_Video.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreDemuxer/include/ADM_Video.h
Changed
@@ -38,20 +38,6 @@ #define ADM_COL_FLAG_MATRIX_COEFF_SET (1<<3) #define ADM_COL_FLAG_HDR_INFO_SET (1<<4) -#define ADM_IDX_FLAG_WRITE_INDEX_FILE 1 -#define ADM_IDX_FLAG_IGNORE_INDEX_FILE (1<<1) - -#define ADM_IDX_FLAGS_OFFSET_MPEGPS 0 -#define ADM_IDX_FLAGS_OFFSET_MPEGTS 4 -#define ADM_IDX_FLAGS_OFFSET_MATROSKA 8 -#define ADM_IDX_FLAGS_OFFSET_MP4 12 - -#define ADM_IDX_FLAGS_DEFAULT \ -((ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MPEGPS) + \ - (ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MPEGTS) + \ - (ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MATROSKA) + \ - (ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MP4)) - typedef struct { uint32_t encoding; // Same as in wavheader
View file
avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreDemuxer/include/ADM_indexingFlags.h
Added
@@ -0,0 +1,44 @@ +/*************************************************************************** + * Definitions used to store indexing settings for various demuxers * + * in a single uint32_t value * + * Copyright (C) 2026 eumagga0x2a * + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef ADM_IDX_FLAGS_H +#define ADM_IDX_FLAGS_H + +// Allow a particular demuxer to create index files on disk. +// If unset, use existing ones if possible, else create index in-memory. +#define ADM_IDX_FLAG_WRITE_INDEX_FILE 1 +// Create index in-memory, even if a matching valid index file on disk exists. +#define ADM_IDX_FLAG_IGNORE_INDEX_FILE (1<<1) + +// Each demuxer has 4 bits in a single uint32_t preference. +#define ADM_IDX_FLAGS_OFFSET_MPEGPS 0 +#define ADM_IDX_FLAGS_OFFSET_MPEGTS 4 +#define ADM_IDX_FLAGS_OFFSET_MATROSKA 8 +#define ADM_IDX_FLAGS_OFFSET_MP4 12 + +// By default, create index files on disk. +#define ADM_IDX_FLAGS_DEFAULT \ +((ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MPEGPS) + \ + (ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MPEGTS) + \ + (ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MATROSKA) + \ + (ADM_IDX_FLAG_WRITE_INDEX_FILE << ADM_IDX_FLAGS_OFFSET_MP4)) + +typedef enum +{ + ADM_IDX_WRITE_TO_DISK = 0, + ADM_IDX_USE_EXISTING, + ADM_IDX_MEMFILE_ONLY +} ADM_indexingType; + +#endif
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/ADM_coreDemuxerMpeg/include/ADM_indexFile.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreDemuxerMpeg/include/ADM_indexFile.h
Changed
@@ -66,7 +66,7 @@ indexFile(); ~indexFile(); - bool open(const char *name); + bool open(const char *name, bool memOnly = false); bool close(void); bool goToSection(const char *section); bool readSection(const char *section);
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/ADM_coreDemuxerMpeg/src/ADM_indexFile.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreDemuxerMpeg/src/ADM_indexFile.cpp
Changed
@@ -118,9 +118,10 @@ */ -bool indexFile::open(const char *name) +bool indexFile::open(const char *name, bool memOnly) { - file=ADM_fopen(name,"rt"); + if(!memOnly) + file = ADM_fopen(name,"rt"); if(!file) { mFile = mfopen(name,"rt");
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/ADM_coreUI/include/ADM_windowInfo.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreUI/include/ADM_windowInfo.h
Changed
@@ -4,20 +4,21 @@ */ /*************************************************************************** -* * -* 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 2 of the License, or * -* (at your option) any later version. * -* * -***************************************************************************/ + * * + * 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 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ #ifndef ADM_WINDOW_INFO_H #define ADM_WINDOW_INFO_H typedef struct { - void *display; // X11 display System - void *widget; // QT widget - int systemWindowId; + void *display; // X11 display System + void *widget; // QT widget + int systemWindowId; // X11 window + void *windowOpaquePointer; // for SDL/Wayland , wl_surface int x; int y; int width;
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/ADM_coreUtils/src/prefs2.conf -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreUtils/src/prefs2.conf
Changed
@@ -88,7 +88,7 @@ string:audiodevice, ALSA string:alsa_device, "dmix" } -uint32_t:videodevice, 0, 0, 10 +uint32_t:videodevice, 0, 0, 11 # priority{ uint32_t:encoding, 3, 0, 4
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/ADM_coreUtils/src/prefs2_pref.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/ADM_coreUtils/src/prefs2_pref.h
Changed
@@ -9,83 +9,83 @@ const char *max; char *Value; }optionDesc; -#endif -static optionDesc myOptions={ -{ VERSION_APIVERSION,"version.apiVersion" ,ADM_param_uint32_t ,"1", 0, 999}, -{ FEATURES_SWAP_IF_A_GREATER_THAN_B,"features.swap_if_A_greater_than_B",ADM_param_bool ,"1", 0, 1}, -{ FEATURES_SAVEPREFSONEXIT,"features.saveprefsonexit" ,ADM_param_bool ,"1", 0, 1}, -{ FEATURES_IGNORESAVEDMARKERS,"features.ignoresavedmarkers" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_REUSE_2PASS_LOG,"features.reuse_2pass_log" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_AUDIOBAR_USES_MASTER,"features.audiobar_uses_master" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_THREADING_LAVC,"features.threading_lavc" ,ADM_param_uint32_t ,"0", 0, 32}, -{ FEATURES_CPU_CAPS,"features.cpu_caps" ,ADM_param_uint32_t ,"4294967295", 0, 4294967295}, -{ FEATURES_CACHE_SIZE,"features.cache_size" ,ADM_param_uint32_t ,"16", 8, 16}, -{ FEATURES_SHARED_CACHE,"features.shared_cache" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_MPEG_NO_LIMIT,"features.mpeg_no_limit" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_DXVA2,"features.dxva2" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_DXVA2_OVERRIDE_BLACKLIST_VERSION,"features.dxva2_override_blacklist_version",ADM_param_bool ,"0", 0, 1}, -{ FEATURES_DXVA2_OVERRIDE_BLACKLIST_PROFILE,"features.dxva2_override_blacklist_profile",ADM_param_bool ,"0", 0, 1}, -{ FEATURES_VDPAU,"features.vdpau" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_XVBA,"features.xvba" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_LIBVA,"features.libva" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_NVDEC,"features.nvdec" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_VIDEOTOOLBOX,"features.videotoolbox" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_ENABLE_OPENGL,"features.enable_opengl" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_FILTER_PREVIEW_CANVAS_OPENGL,"features.filter_preview_canvas_opengl",ADM_param_bool ,"1", 0, 1}, -{ FEATURES_CAP_REFRESH_ENABLED,"features.cap_refresh_enabled" ,ADM_param_bool ,"0", 0, 1}, -{ FEATURES_CAP_REFRESH_VALUE,"features.cap_refresh_value" ,ADM_param_uint32_t ,"100", 10, 1000}, -{ FEATURES_SDLDRIVER,"features.sdlDriver" ,ADM_param_stdstring ,"", 0, 0}, -{ FEATURES_USE_LAST_READ_DIR_AS_TARGET,"features.use_last_read_dir_as_target",ADM_param_bool ,"0", 0, 1}, -{ FEATURES_SWAP_MOUSE_WHEEL,"features.swap_mouse_wheel" ,ADM_param_bool ,"0", 0, 1}, -{ KEYBOARD_SHORTCUTS_USE_ALTERNATE_KBD_SHORTCUTS,"keyboard_shortcuts.use_alternate_kbd_shortcuts",ADM_param_bool ,"0", 0, 1}, -{ KEYBOARD_SHORTCUTS_SWAP_UP_DOWN_KEYS,"keyboard_shortcuts.swap_up_down_keys",ADM_param_bool ,"0", 0, 1}, -{ KEYBOARD_SHORTCUTS_ALT_MARK_A,"keyboard_shortcuts.alt_mark_a" ,ADM_param_stdstring ,"I", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_MARK_B,"keyboard_shortcuts.alt_mark_b" ,ADM_param_stdstring ,"O", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_RESET_MARK_A,"keyboard_shortcuts.alt_reset_mark_a",ADM_param_stdstring ,"U", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_RESET_MARK_B,"keyboard_shortcuts.alt_reset_mark_b",ADM_param_stdstring ,"P", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_RESET_MARKERS,"keyboard_shortcuts.alt_reset_markers",ADM_param_stdstring ,"R", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_GOTO_MARK_A,"keyboard_shortcuts.alt_goto_mark_a",ADM_param_stdstring ,"A", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_GOTO_MARK_B,"keyboard_shortcuts.alt_goto_mark_b",ADM_param_stdstring ,"B", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_BEGIN,"keyboard_shortcuts.alt_begin" ,ADM_param_stdstring ,"S", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_END,"keyboard_shortcuts.alt_end" ,ADM_param_stdstring ,"E", 0, 0}, -{ KEYBOARD_SHORTCUTS_ALT_DELETE,"keyboard_shortcuts.alt_delete" ,ADM_param_stdstring ,"Delete", 0, 0}, -{ UPDATE_ENABLED,"update.enabled" ,ADM_param_bool ,"1", 0, 1}, -{ UPDATE_LASTCHECK,"update.lastCheck" ,ADM_param_uint32_t ,"0", 0, 5000}, -{ LASTFILES_LASTDIR_READ,"lastfiles.lastdir_read" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTFILES_LASTDIR_WRITE,"lastfiles.lastdir_write" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTFILES_FILE1,"lastfiles.file1" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTFILES_FILE2,"lastfiles.file2" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTFILES_FILE3,"lastfiles.file3" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTFILES_FILE4,"lastfiles.file4" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTPROJECTS_LASTDIR_READ,"lastprojects.lastdir_read" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTPROJECTS_LASTDIR_WRITE,"lastprojects.lastdir_write" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTPROJECTS_FILE1,"lastprojects.file1" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTPROJECTS_FILE2,"lastprojects.file2" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTPROJECTS_FILE3,"lastprojects.file3" ,ADM_param_stdstring ,"", 0, 0}, -{ LASTPROJECTS_FILE4,"lastprojects.file4" ,ADM_param_stdstring ,"", 0, 0}, -{ MESSAGE_LEVEL,"message_level" ,ADM_param_uint32_t ,"2", 0, 2}, -{ AUDIO_DEVICE_AUDIODEVICE,"audio_device.audiodevice" ,ADM_param_stdstring ,"ALSA", 0, 0}, -{ AUDIO_DEVICE_ALSA_DEVICE,"audio_device.alsa_device" ,ADM_param_stdstring ,"dmix", 0, 0}, -{ VIDEODEVICE,"videodevice" ,ADM_param_uint32_t ,"0", 0, 10}, -{ PRIORITY_ENCODING,"priority.encoding" ,ADM_param_uint32_t ,"3", 0, 4}, -{ PRIORITY_PLAYBACK,"priority.playback" ,ADM_param_uint32_t ,"0", 0, 4}, -{ DEFAULT_POSTPROC_TYPE,"Default.postproc_type" ,ADM_param_uint32_t ,"0", 0, 7}, -{ DEFAULT_POSTPROC_VALUE,"Default.postproc_value" ,ADM_param_uint32_t ,"0", 0, 5}, -{ DEFAULT_DOWNMIXING,"Default.downmixing" ,ADM_param_uint32_t ,"1", 0, 5}, -{ DEFAULT_LANGUAGE,"Default.language" ,ADM_param_stdstring ,"", 0, 0}, -{ DEFAULT_WARN_FOR_FONTS,"Default.warn_for_fonts" ,ADM_param_bool ,"1", 0, 1}, -{ DEFAULT_MULTILOAD_USE_CUSTOM_SIZE,"Default.multiload_use_custom_size",ADM_param_bool ,"0", 0, 1}, -{ DEFAULT_MULTILOAD_CUSTOM_SIZE_M,"Default.multiload_custom_size_m" ,ADM_param_uint32_t ,"4000", 250, 8192}, -{ DEFAULT_DELETE_FIRST_PASS_LOG_FILES,"Default.delete_first_pass_log_files",ADM_param_bool ,"0", 0, 1}, -{ AVISYNTH_AVISYNTH_ALWAYS_ASK,"avisynth.avisynth_always_ask" ,ADM_param_bool ,"0", 0, 1}, -{ AVISYNTH_AVISYNTH_DEFAULTPORT,"avisynth.avisynth_defaultport" ,ADM_param_uint32_t ,"9999", 1024, 65535}, -{ AVISYNTH_AVISYNTH_LOCALPORT,"avisynth.avisynth_localport" ,ADM_param_uint32_t ,"0", 1024, 65535}, -{ RESET_ENCODER_ON_VIDEO_LOAD,"reset_encoder_on_video_load" ,ADM_param_bool ,"0", 0, 1}, -{ PICTURES_LOAD_IN_REVERSE_ORDER,"pictures.load_in_reverse_order" ,ADM_param_bool ,"0", 0, 1}, -{ PICTURES_FPS_TYPE,"pictures.fps_type" ,ADM_param_uint32_t ,"1", 0, 6}, -{ HDR_TONEMAPPING,"hdr.tonemapping" ,ADM_param_uint32_t ,"1", 0, 99}, -{ HDR_TARGET_LUMINANCE,"hdr.target_luminance" ,ADM_param_float ,"100.0", 0.0, 1000.0}, -{ HDR_OUT_OF_GAMUT_HANDLING,"hdr.out_of_gamut_handling" ,ADM_param_uint32_t ,"0", 0, 99}, -{ INDEXING_INDEXING_FLAGS,"indexing.indexing_flags" ,ADM_param_uint32_t ,"0", 0, 4294967295}, +#endif +static optionDesc myOptions = { + {VERSION_APIVERSION, "version.apiVersion", ADM_param_uint32_t, "1", 0, 999}, + {FEATURES_SWAP_IF_A_GREATER_THAN_B, "features.swap_if_A_greater_than_B", ADM_param_bool, "1", 0, 1}, + {FEATURES_SAVEPREFSONEXIT, "features.saveprefsonexit", ADM_param_bool, "1", 0, 1}, + {FEATURES_IGNORESAVEDMARKERS, "features.ignoresavedmarkers", ADM_param_bool, "0", 0, 1}, + {FEATURES_REUSE_2PASS_LOG, "features.reuse_2pass_log", ADM_param_bool, "0", 0, 1}, + {FEATURES_AUDIOBAR_USES_MASTER, "features.audiobar_uses_master", ADM_param_bool, "0", 0, 1}, + {FEATURES_THREADING_LAVC, "features.threading_lavc", ADM_param_uint32_t, "0", 0, 32}, + {FEATURES_CPU_CAPS, "features.cpu_caps", ADM_param_uint32_t, "4294967295", 0, 4294967295}, + {FEATURES_CACHE_SIZE, "features.cache_size", ADM_param_uint32_t, "16", 8, 16}, + {FEATURES_SHARED_CACHE, "features.shared_cache", ADM_param_bool, "0", 0, 1}, + {FEATURES_MPEG_NO_LIMIT, "features.mpeg_no_limit", ADM_param_bool, "0", 0, 1}, + {FEATURES_DXVA2, "features.dxva2", ADM_param_bool, "0", 0, 1}, + {FEATURES_DXVA2_OVERRIDE_BLACKLIST_VERSION, "features.dxva2_override_blacklist_version", ADM_param_bool, "0", 0, 1}, + {FEATURES_DXVA2_OVERRIDE_BLACKLIST_PROFILE, "features.dxva2_override_blacklist_profile", ADM_param_bool, "0", 0, 1}, + {FEATURES_VDPAU, "features.vdpau", ADM_param_bool, "0", 0, 1}, + {FEATURES_XVBA, "features.xvba", ADM_param_bool, "0", 0, 1}, + {FEATURES_LIBVA, "features.libva", ADM_param_bool, "0", 0, 1}, + {FEATURES_NVDEC, "features.nvdec", ADM_param_bool, "0", 0, 1}, + {FEATURES_VIDEOTOOLBOX, "features.videotoolbox", ADM_param_bool, "0", 0, 1}, + {FEATURES_ENABLE_OPENGL, "features.enable_opengl", ADM_param_bool, "0", 0, 1}, + {FEATURES_FILTER_PREVIEW_CANVAS_OPENGL, "features.filter_preview_canvas_opengl", ADM_param_bool, "1", 0, 1}, + {FEATURES_CAP_REFRESH_ENABLED, "features.cap_refresh_enabled", ADM_param_bool, "0", 0, 1}, + {FEATURES_CAP_REFRESH_VALUE, "features.cap_refresh_value", ADM_param_uint32_t, "100", 10, 1000}, + {FEATURES_SDLDRIVER, "features.sdlDriver", ADM_param_stdstring, "", 0, 0}, + {FEATURES_USE_LAST_READ_DIR_AS_TARGET, "features.use_last_read_dir_as_target", ADM_param_bool, "0", 0, 1}, + {FEATURES_SWAP_MOUSE_WHEEL, "features.swap_mouse_wheel", ADM_param_bool, "0", 0, 1}, + {KEYBOARD_SHORTCUTS_USE_ALTERNATE_KBD_SHORTCUTS, "keyboard_shortcuts.use_alternate_kbd_shortcuts", ADM_param_bool, + "0", 0, 1}, + {KEYBOARD_SHORTCUTS_SWAP_UP_DOWN_KEYS, "keyboard_shortcuts.swap_up_down_keys", ADM_param_bool, "0", 0, 1}, + {KEYBOARD_SHORTCUTS_ALT_MARK_A, "keyboard_shortcuts.alt_mark_a", ADM_param_stdstring, "I", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_MARK_B, "keyboard_shortcuts.alt_mark_b", ADM_param_stdstring, "O", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_RESET_MARK_A, "keyboard_shortcuts.alt_reset_mark_a", ADM_param_stdstring, "U", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_RESET_MARK_B, "keyboard_shortcuts.alt_reset_mark_b", ADM_param_stdstring, "P", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_RESET_MARKERS, "keyboard_shortcuts.alt_reset_markers", ADM_param_stdstring, "R", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_GOTO_MARK_A, "keyboard_shortcuts.alt_goto_mark_a", ADM_param_stdstring, "A", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_GOTO_MARK_B, "keyboard_shortcuts.alt_goto_mark_b", ADM_param_stdstring, "B", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_BEGIN, "keyboard_shortcuts.alt_begin", ADM_param_stdstring, "S", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_END, "keyboard_shortcuts.alt_end", ADM_param_stdstring, "E", 0, 0}, + {KEYBOARD_SHORTCUTS_ALT_DELETE, "keyboard_shortcuts.alt_delete", ADM_param_stdstring, "Delete", 0, 0}, + {UPDATE_ENABLED, "update.enabled", ADM_param_bool, "1", 0, 1}, + {UPDATE_LASTCHECK, "update.lastCheck", ADM_param_uint32_t, "0", 0, 5000}, + {LASTFILES_LASTDIR_READ, "lastfiles.lastdir_read", ADM_param_stdstring, "", 0, 0}, + {LASTFILES_LASTDIR_WRITE, "lastfiles.lastdir_write", ADM_param_stdstring, "", 0, 0}, + {LASTFILES_FILE1, "lastfiles.file1", ADM_param_stdstring, "", 0, 0}, + {LASTFILES_FILE2, "lastfiles.file2", ADM_param_stdstring, "", 0, 0}, + {LASTFILES_FILE3, "lastfiles.file3", ADM_param_stdstring, "", 0, 0}, + {LASTFILES_FILE4, "lastfiles.file4", ADM_param_stdstring, "", 0, 0}, + {LASTPROJECTS_LASTDIR_READ, "lastprojects.lastdir_read", ADM_param_stdstring, "", 0, 0}, + {LASTPROJECTS_LASTDIR_WRITE, "lastprojects.lastdir_write", ADM_param_stdstring, "", 0, 0}, + {LASTPROJECTS_FILE1, "lastprojects.file1", ADM_param_stdstring, "", 0, 0}, + {LASTPROJECTS_FILE2, "lastprojects.file2", ADM_param_stdstring, "", 0, 0}, + {LASTPROJECTS_FILE3, "lastprojects.file3", ADM_param_stdstring, "", 0, 0}, + {LASTPROJECTS_FILE4, "lastprojects.file4", ADM_param_stdstring, "", 0, 0}, + {MESSAGE_LEVEL, "message_level", ADM_param_uint32_t, "2", 0, 2}, + {AUDIO_DEVICE_AUDIODEVICE, "audio_device.audiodevice", ADM_param_stdstring, "ALSA", 0, 0}, + {AUDIO_DEVICE_ALSA_DEVICE, "audio_device.alsa_device", ADM_param_stdstring, "dmix", 0, 0}, + {VIDEODEVICE, "videodevice", ADM_param_uint32_t, "0", 0, 11}, + {PRIORITY_ENCODING, "priority.encoding", ADM_param_uint32_t, "3", 0, 4}, + {PRIORITY_PLAYBACK, "priority.playback", ADM_param_uint32_t, "0", 0, 4}, + {DEFAULT_POSTPROC_TYPE, "Default.postproc_type", ADM_param_uint32_t, "0", 0, 7}, + {DEFAULT_POSTPROC_VALUE, "Default.postproc_value", ADM_param_uint32_t, "0", 0, 5}, + {DEFAULT_DOWNMIXING, "Default.downmixing", ADM_param_uint32_t, "1", 0, 5}, + {DEFAULT_LANGUAGE, "Default.language", ADM_param_stdstring, "", 0, 0}, + {DEFAULT_WARN_FOR_FONTS, "Default.warn_for_fonts", ADM_param_bool, "1", 0, 1}, + {DEFAULT_MULTILOAD_USE_CUSTOM_SIZE, "Default.multiload_use_custom_size", ADM_param_bool, "0", 0, 1}, + {DEFAULT_MULTILOAD_CUSTOM_SIZE_M, "Default.multiload_custom_size_m", ADM_param_uint32_t, "4000", 250, 8192}, + {DEFAULT_DELETE_FIRST_PASS_LOG_FILES, "Default.delete_first_pass_log_files", ADM_param_bool, "0", 0, 1}, + {AVISYNTH_AVISYNTH_ALWAYS_ASK, "avisynth.avisynth_always_ask", ADM_param_bool, "0", 0, 1}, + {AVISYNTH_AVISYNTH_DEFAULTPORT, "avisynth.avisynth_defaultport", ADM_param_uint32_t, "9999", 1024, 65535}, + {AVISYNTH_AVISYNTH_LOCALPORT, "avisynth.avisynth_localport", ADM_param_uint32_t, "0", 1024, 65535}, + {RESET_ENCODER_ON_VIDEO_LOAD, "reset_encoder_on_video_load", ADM_param_bool, "0", 0, 1}, + {PICTURES_LOAD_IN_REVERSE_ORDER, "pictures.load_in_reverse_order", ADM_param_bool, "0", 0, 1}, + {PICTURES_FPS_TYPE, "pictures.fps_type", ADM_param_uint32_t, "1", 0, 6}, + {HDR_TONEMAPPING, "hdr.tonemapping", ADM_param_uint32_t, "1", 0, 99}, + {HDR_TARGET_LUMINANCE, "hdr.target_luminance", ADM_param_float, "100.0", 0.0, 1000.0}, + {HDR_OUT_OF_GAMUT_HANDLING, "hdr.out_of_gamut_handling", ADM_param_uint32_t, "0", 0, 99}, + {INDEXING_INDEXING_FLAGS, "indexing.indexing_flags", ADM_param_uint32_t, "0", 0, 4294967295}, }; -
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/cmake/admCheckMiscLibs.cmake -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/cmake/admCheckMiscLibs.cmake
Changed
@@ -6,28 +6,55 @@ checkGettext() SET(ADM_LOCALE "${CMAKE_INSTALL_PREFIX}/share/locale") +######################################## +# SDL3 +######################################## +OPTION(SDL3 "" ON) + +MESSAGE(STATUS "Checking for SDL3 ") +MESSAGE(STATUS "**************************************") + +IF(SDL3 AND NOT MSVC) + FIND_PACKAGE(PkgConfig) + PKG_CHECK_MODULES(SDL3 sdl3) + PRINT_LIBRARY_INFO("SDL3" SDL3_FOUND "${SDL3_INCLUDE_DIR}" "${SDL3_LIBRARY}") + + MARK_AS_ADVANCED(SDL3_INCLUDE_DIR) + MARK_AS_ADVANCED(SDL3_LIBRARY) + + IF(SDL3_FOUND) + SET(USE_SDL3 1) + ENDIF() +ELSE() + MESSAGE("${MSG_DISABLE_OPTION}") +ENDIF() + +APPEND_SUMMARY_LIST("Miscellaneous" "SDL3" "${USE_SDL3}") + +MESSAGE("") + ######################################## # SDL -######################################## +######################### /tmp/logCmakebuildCore_debug############### OPTION(SDL "" ON) MESSAGE(STATUS "Checking for SDL>=2 (only for windows)") MESSAGE(STATUS "**************************************") IF(SDL AND WIN32 AND NOT MSVC) - FIND_PACKAGE(SDL2) - PRINT_LIBRARY_INFO("SDL2" SDL2_FOUND "${SDL2_INCLUDE_DIR}" "${SDL2_LIBRARY}") + FIND_PACKAGE(SDL2) + PRINT_LIBRARY_INFO("SDL2" SDL2_FOUND "${SDL2_INCLUDE_DIR}" "${SDL2_LIBRARY}") - MARK_AS_ADVANCED(SDLMAIN_LIBRARY) - MARK_AS_ADVANCED(SDL2_INCLUDE_DIR) - MARK_AS_ADVANCED(SDL2_LIBRARY) + MARK_AS_ADVANCED(SDLMAIN_LIBRARY) + MARK_AS_ADVANCED(SDL2_INCLUDE_DIR) + MARK_AS_ADVANCED(SDL2_LIBRARY) - IF(SDL2_FOUND) - SET(USE_SDL 1) - ENDIF() + IF(SDL2_FOUND) + SET(USE_SDL 1) + ENDIF() ELSE() - MESSAGE("${MSG_DISABLE_OPTION}") + MESSAGE("${MSG_DISABLE_OPTION}") ENDIF() APPEND_SUMMARY_LIST("Miscellaneous" "SDL" "${USE_SDL}") @@ -38,27 +65,27 @@ # XVideo ######################################## IF(UNIX AND NOT APPLE) - OPTION(XVIDEO "" ON) + OPTION(XVIDEO "" ON) - IF(XVIDEO) - MESSAGE(STATUS "Checking for XVideo") - MESSAGE(STATUS "*******************") + IF(XVIDEO) + MESSAGE(STATUS "Checking for XVideo") + MESSAGE(STATUS "*******************") - FIND_HEADER_AND_LIB(XVIDEO X11/extensions/Xvlib.h Xv XvShmPutImage) - FIND_HEADER_AND_LIB(XEXT X11/extensions/XShm.h Xext XShmAttach) - PRINT_LIBRARY_INFO("XVideo" XVIDEO_FOUND "${XVIDEO_INCLUDE_DIR}" "${XVIDEO_LIBRARY_DIR}") - PRINT_LIBRARY_INFO("Xext" XEXT_FOUND "${XEXT_INCLUDE_DIR}" "${XEXT_LIBRARY_DIR}") + FIND_HEADER_AND_LIB(XVIDEO X11/extensions/Xvlib.h Xv XvShmPutImage) + FIND_HEADER_AND_LIB(XEXT X11/extensions/XShm.h Xext XShmAttach) + PRINT_LIBRARY_INFO("XVideo" XVIDEO_FOUND "${XVIDEO_INCLUDE_DIR}" "${XVIDEO_LIBRARY_DIR}") + PRINT_LIBRARY_INFO("Xext" XEXT_FOUND "${XEXT_INCLUDE_DIR}" "${XEXT_LIBRARY_DIR}") - IF(XVIDEO_FOUND AND XEXT_FOUND) - SET(USE_XV 1) - ENDIF() + IF(XVIDEO_FOUND AND XEXT_FOUND) + SET(USE_XV 1) + ENDIF() - MESSAGE("") - ENDIF() + MESSAGE("") + ENDIF() - APPEND_SUMMARY_LIST("Miscellaneous" "XVideo" "${XVIDEO_FOUND}") + APPEND_SUMMARY_LIST("Miscellaneous" "XVideo" "${XVIDEO_FOUND}") ELSE() - SET(XVIDEO_CAPABLE FALSE) + SET(XVIDEO_CAPABLE FALSE) ENDIF() ######################################## @@ -71,26 +98,26 @@ PRINT_LIBRARY_INFO("execinfo" EXECINFO_FOUND "${EXECINFO_INCLUDE_DIR}" "${EXECINFO_LIBRARY_DIR}") IF(EXECINFO_INCLUDE_DIR) - # Try linking without -lexecinfo - ADM_COMPILE(execinfo.cpp "" ${EXECINFO_INCLUDE_DIR} "" WITHOUT_LIBEXECINFO outputWithoutLibexecinfo) - - IF(WITHOUT_LIBEXECINFO) - SET(EXECINFO_LIBRARY_DIR "") - SET(HAVE_EXECINFO 1) - - MESSAGE(STATUS "execinfo not required") - ELSE() - ADM_COMPILE(execinfo.cpp "" ${EXECINFO_INCLUDE_DIR} ${EXECINFO_LIBRARY_DIR} WITH_LIBEXECINFO outputWithLibexecinfo) - - IF(WITH_LIBEXECINFO) - SET(HAVE_EXECINFO 1) - - MESSAGE(STATUS "execinfo is required") - ELSE() - MESSAGE(STATUS "Does not work, without ${outputWithoutLibexecinfo}") - MESSAGE(STATUS "Does not work, with ${outputWithLibexecinfo}") - ENDIF() - ENDIF() + # Try linking without -lexecinfo + ADM_COMPILE(execinfo.cpp "" ${EXECINFO_INCLUDE_DIR} "" WITHOUT_LIBEXECINFO outputWithoutLibexecinfo) + + IF(WITHOUT_LIBEXECINFO) + SET(EXECINFO_LIBRARY_DIR "") + SET(HAVE_EXECINFO 1) + + MESSAGE(STATUS "execinfo not required") + ELSE() + ADM_COMPILE(execinfo.cpp "" ${EXECINFO_INCLUDE_DIR} ${EXECINFO_LIBRARY_DIR} WITH_LIBEXECINFO outputWithLibexecinfo) + + IF(WITH_LIBEXECINFO) + SET(HAVE_EXECINFO 1) + + MESSAGE(STATUS "execinfo is required") + ELSE() + MESSAGE(STATUS "Does not work, without ${outputWithoutLibexecinfo}") + MESSAGE(STATUS "Does not work, with ${outputWithLibexecinfo}") + ENDIF() + ENDIF() ENDIF() MESSAGE("")
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_core/cmake/config.h.cmake -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_core/cmake/config.h.cmake
Changed
@@ -39,8 +39,11 @@ #if ${CONFIG_HEADER_TYPE} == ADM_BUILD_GTK || ${CONFIG_HEADER_TYPE} == ADM_BUILD_QT4 /* SDL detected */ +#cmakedefine USE_SDL3 +#ifndef USE_SDL3 #cmakedefine USE_SDL #endif +#endif #if ${CONFIG_HEADER_TYPE} == ADM_BUILD_GTK || ${CONFIG_HEADER_TYPE} == ADM_BUILD_QT4 /* XVideo detected */
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/Matroska/ADM_mkvIndexer.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/Matroska/ADM_mkvIndexer.cpp
Changed
@@ -26,6 +26,7 @@ #include "ADM_videoInfoExtractor.h" #include "ADM_vidMisc.h" #include "ADM_metaToFile.h" +#include "ADM_indexingFlags.h" #include "prefs.h" #define VIDEO _tracks0 @@ -764,38 +765,32 @@ const char *ss; uint64_t pos; uint8_t res=1; - bool indexOnDisk = true; + + ADM_indexingType idxt = ADM_IDX_WRITE_TO_DISK; bool indexAllowOverwrite = true; - bool memOnly = false; + uint32_t indexingFlags = ADM_IDX_FLAGS_DEFAULT; - uint32_t indexingFlags = 0; if (prefs->get(INDEXING_INDEXING_FLAGS, &indexingFlags)) { indexingFlags >>= ADM_IDX_FLAGS_OFFSET_MATROSKA; if (!(indexingFlags & ADM_IDX_FLAG_WRITE_INDEX_FILE)) { - indexOnDisk = false; + idxt = ADM_IDX_USE_EXISTING; } if (indexingFlags & ADM_IDX_FLAG_IGNORE_INDEX_FILE) { - indexOnDisk = false; - memOnly = true; + idxt = ADM_IDX_MEMFILE_ONLY; ADM_info("Mem-only indexing.\n"); } } if (NULL != getenv("ADM_NOINDEX_MKV") && !strncmp(getenv("ADM_NOINDEX_MKV"), "1", 1)) - indexOnDisk = false; + idxt = ADM_IDX_MEMFILE_ONLY; - if (!memOnly) + if (idxt != ADM_IDX_MEMFILE_ONLY && loadIndex(_idxName, parser->getFileSize())) { - if (NULL != getenv("ADM_MKV_INDEX_ALLOW_OVERWRITE") && !strncmp(getenv("ADM_MKV_INDEX_ALLOW_OVERWRITE"), "0", 1)) - indexAllowOverwrite = false; - if (loadIndex(_idxName, parser->getFileSize())) - { - printf("MKV Video track indexing loaded from \"%s\"\n", _idxName.c_str()); - return ADM_OK; - } + printf("MKV Video track index loaded from \"%s\"\n", _idxName.c_str()); + return ADM_OK; } mkvIndex tmpCluster; @@ -872,8 +867,10 @@ _work = NULL; //ADM_info("MKV Found %u clusters\n",(int)_clusters.size()); - if (indexOnDisk) + if (idxt == ADM_IDX_WRITE_TO_DISK) { + if (NULL != getenv("ADM_MKV_INDEX_ALLOW_OVERWRITE") && !strncmp(getenv("ADM_MKV_INDEX_ALLOW_OVERWRITE"), "0", 1)) + indexAllowOverwrite = false; if ((res == ADM_OK) && (!!VIDEO.index.size())) { saveIndex(_idxName, parser->getFileSize(), indexAllowOverwrite);
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/Mp4/ADM_mp4.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/Mp4/ADM_mp4.cpp
Changed
@@ -73,7 +73,7 @@ #include "ADM_mp3info.h" #include "ADM_dcainfo.h" #include "ADM_audioXiphUtils.h" - +#include "ADM_indexingFlags.h" #include "prefs.h" #if 1 @@ -384,30 +384,29 @@ _idxName = name; _idxName += ".idxb"; - bool indexOnDisk = true; + + ADM_indexingType idxt = ADM_IDX_WRITE_TO_DISK; bool indexAllowOverwrite = true; - bool memOnly = false; + uint32_t indexingFlags = ADM_IDX_FLAGS_DEFAULT; - uint32_t indexingFlags = 0; if (prefs->get(INDEXING_INDEXING_FLAGS, &indexingFlags)) { indexingFlags >>= ADM_IDX_FLAGS_OFFSET_MP4; if (!(indexingFlags & ADM_IDX_FLAG_WRITE_INDEX_FILE)) { - indexOnDisk = false; + idxt = ADM_IDX_USE_EXISTING; } if (indexingFlags & ADM_IDX_FLAG_IGNORE_INDEX_FILE) { - indexOnDisk = false; - memOnly = true; + idxt = ADM_IDX_MEMFILE_ONLY; ADM_info("Mem-only indexing.\n"); } } if (NULL != getenv("ADM_NOINDEX_MP4") && !strncmp(getenv("ADM_NOINDEX_MP4"), "1", 1)) - indexOnDisk = false; + idxt = ADM_IDX_MEMFILE_ONLY; - if (indexOnDisk) + if (idxt == ADM_IDX_WRITE_TO_DISK) { if (NULL != getenv("ADM_MP4_INDEX_ALLOW_OVERWRITE") && !strncmp(getenv("ADM_MP4_INDEX_ALLOW_OVERWRITE"), "0", 1)) indexAllowOverwrite = false; @@ -543,7 +542,7 @@ if(extractSPSInfo_mp4Header(VDEO.extraData,VDEO.extraDataSize,&info)) { bool indexLoadedFromDisk = false; - if (!memOnly) + if (idxt != ADM_IDX_MEMFILE_ONLY) { if (loadIndex(_idxName, fileSize)) { @@ -667,7 +666,7 @@ ADM_info("Field encoded H.264 stream detected, # fields: %u\n",fields); else ADM_info("Probably a frame encoded H.264 stream.\n"); - if (indexOnDisk && !cancelled) + if (idxt == ADM_IDX_WRITE_TO_DISK && !cancelled) { saveIndex(_idxName, fileSize, indexAllowOverwrite); } @@ -689,7 +688,7 @@ _video_bih.biHeight = _mainaviheader.dwHeight = info.height; } bool indexLoadedFromDisk = false; - if (!memOnly) + if (idxt != ADM_IDX_MEMFILE_ONLY) { if (loadIndex(_idxName, fileSize)) { @@ -761,7 +760,7 @@ work=NULL; delete bfer; bfer=NULL; - if (indexOnDisk && !cancelled) + if (idxt == ADM_IDX_WRITE_TO_DISK && !cancelled) { saveIndex(_idxName, fileSize, indexAllowOverwrite); }
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_ps.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_ps.cpp
Changed
@@ -19,35 +19,60 @@ #include "DIA_coreToolkit.h" #include "ADM_indexFile.h" #include "ADM_ps.h" +#include "prefs.h" #include <math.h> #define MY_CLASS psHeader #include "ADM_coreDemuxerMpegTemplate.cpp.h" uint32_t ADM_UsecFromFps1000(uint32_t fps1000); -uint8_t psIndexer(const char *file); +uint8_t psIndexer(const char *file, bool memOnly); /** - \fn open - \brief open the flv file, gather infos and build index(es). + \fn open + \brief Wrapper for internal function to open given MPEG-PS file. */ - uint8_t psHeader::open(const char *name) { + ADM_indexingType idxt = ADM_IDX_WRITE_TO_DISK; + uint32_t indexingFlags = ADM_IDX_FLAGS_DEFAULT; + + if (prefs->get(INDEXING_INDEXING_FLAGS, &indexingFlags)) + { + indexingFlags >>= ADM_IDX_FLAGS_OFFSET_MPEGPS; + if (!(indexingFlags & ADM_IDX_FLAG_WRITE_INDEX_FILE)) + { + idxt = ADM_IDX_USE_EXISTING; + } + if (indexingFlags & ADM_IDX_FLAG_IGNORE_INDEX_FILE) + { + idxt = ADM_IDX_MEMFILE_ONLY; + ADM_info("Mem-only indexing.\n"); + } + } + + return openInternal(name, idxt); +} +/** + \fn openInternal + \brief Open given MPEG-PS file, detect streams and their properties and build index(es). +*/ +uint8_t psHeader::openInternal(const char *name, ADM_indexingType &strategy) +{ char *idxName=(char *)malloc(strlen(name)+6); uint8_t r=1; sprintf(idxName,"%s.idx2",name); ListOfIndexFiles.push_back(idxName); - if(!ADM_fileExist(idxName)) - r=psIndexer(name); + if (strategy == ADM_IDX_MEMFILE_ONLY || !ADM_fileExist(idxName)) + r = psIndexer(name, strategy != ADM_IDX_WRITE_TO_DISK); if(r!=ADM_OK) { if(r==ADM_IGN) ADM_warning("Indexing cancelled by the user, deleting the index file. Bye.\n"); if(!r) ADM_error("Indexing of %s failed, aborting\n",name); - if(ADM_fileExist(idxName) && !ADM_eraseFile(idxName)) + if(strategy == ADM_IDX_WRITE_TO_DISK && ADM_fileExist(idxName) && !ADM_eraseFile(idxName)) ADM_warning("Could not delete %s\n",idxName); free(idxName); return r; @@ -61,9 +86,9 @@ indexFile index; r=0; - if(!index.open(idxName)) + if(!index.open(idxName, strategy == ADM_IDX_MEMFILE_ONLY)) { - printf("psDemux Cannot open index file %s\n",idxName); + printf("psDemux Cannot open %s file %s\n", (strategy == ADM_IDX_MEMFILE_ONLY) ? "in-memory index" : "index", idxName); free(idxName); return false; } @@ -76,6 +101,12 @@ version=index.getAsUint32("Version"); if(version!=ADM_INDEX_FILE_VERSION) { + ADM_warning("Index file version mismatch, expected %" PRIu32", got %" PRIu32"\n", ADM_INDEX_FILE_VERSION, version); + if (strategy == ADM_IDX_MEMFILE_ONLY) + { + ADM_error("Index file version mismatch despite in-memory indexing, bailing out.\n"); + goto abt; + } if(GUI_Question(QT_TRANSLATE_NOOP("psdemuxer","This file's index has been created with an older version of avidemux.\nThe file must be re-indexed. Proceed?"))) reindex=true; goto abt; @@ -202,14 +233,21 @@ } abt: index.close(); - if(reindex) + if (reindex && strategy != ADM_IDX_MEMFILE_ONLY) { - uint8_t success=ADM_eraseFile(idxName); + uint8_t success = 1; + if (strategy == ADM_IDX_WRITE_TO_DISK) + success = ADM_eraseFile(idxName); + else + strategy = ADM_IDX_MEMFILE_ONLY; free(idxName); if(success) - r=open(name); - else + { + r = openInternal(name, strategy); + }else + { ADM_error("Can't delete old index file.\n"); + } }else { free(idxName);
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_ps.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_ps.h
Changed
@@ -24,6 +24,7 @@ #include "ADM_audioStream.h" #include "dmx_io.h" #include "ADM_indexFile.h" +#include "ADM_indexingFlags.h" #include "dmxPSPacket.h" #include <BVector.h> #include "ADM_coreDemuxerMpeg.h" @@ -128,6 +129,7 @@ BVector <ADM_psTrackDescriptor *> listOfAudioTracks; ListOfScr listOfScrGap; + uint8_t openInternal(const char *name, ADM_indexingType &strategy); bool readVideo(indexFile *index); bool readAudio(indexFile *index, const char *name); bool readIndex(indexFile *index);
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_psComputeTimeStamp.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_psComputeTimeStamp.cpp
Changed
@@ -7,7 +7,6 @@ #include "ADM_default.h" #include "fourcc.h" #include "DIA_coreToolkit.h" -#include "ADM_indexFile.h" #include "ADM_ps.h" #include <math.h>
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_psIndex.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegPS/ADM_psIndex.cpp
Changed
@@ -121,7 +121,7 @@ public: PsIndexer(void); ~PsIndexer(); - uint8_t run(const char *file); + uint8_t run(const char *file, bool mem); bool writeVideo(PSVideo *video); bool writeAudio(void); bool writeSystem(const char *filename,bool append); @@ -140,11 +140,11 @@ \fn psIndexer \brief main indexing loop for mpeg2 payload */ -uint8_t psIndexer(const char *file) +uint8_t psIndexer(const char *file, bool memOnly) { uint8_t r; PsIndexer *dx=new PsIndexer; - r=dx->run(file); + r=dx->run(file,memOnly); delete dx; return r; } @@ -177,7 +177,7 @@ /** \fn run */ -uint8_t PsIndexer::run(const char *file) +uint8_t PsIndexer::run(const char *file, bool mem) { uint32_t temporal_ref,val; uint64_t fullSize; @@ -197,14 +197,20 @@ char *indexName=(char *)malloc(strlen(file)+6); sprintf(indexName,"%s.idx2",file); - index=qfopen(indexName,"wt",true); + index = mem ? NULL : qfopen(indexName,"wt",true); if(!index) { - printf("PsIndex Cannot create %s\n",indexName); + if (mem) + ADM_info("Forcing in-memory indexing.\n"); + else + ADM_warning("Cannot create index file \"%s\"\n", indexName); mFile = mfopen(indexName,"wt"); if (!mFile) { - printf("PsIndex Cannot create memFile either\n"); + if (mem) + ADM_error("Cannot create memFile!\n"); + else + ADM_error("Cannot create memFile either.\n"); free(indexName); return 0; }
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_ts.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_ts.cpp
Changed
@@ -21,33 +21,60 @@ #include "ADM_indexFile.h" #include "ADM_ts.h" #include "ADM_videoInfoExtractor.h" +#include "prefs.h" #define MY_CLASS tsHeader #include "ADM_coreDemuxerMpegTemplate.cpp.h" -extern uint8_t tsIndexer(const char *file); +extern uint8_t tsIndexer(const char *file, bool memOnly); /** - \fn open - \brief open the flv file, gather infos and build index(es). + \fn open + \brief Wrapper for openInternal to query preferences in a single location. */ - uint8_t tsHeader::open(const char *name) { + ADM_indexingType idxt = ADM_IDX_WRITE_TO_DISK; + uint32_t indexingFlags = ADM_IDX_FLAGS_DEFAULT; + + if (prefs->get(INDEXING_INDEXING_FLAGS, &indexingFlags)) + { + indexingFlags >>= ADM_IDX_FLAGS_OFFSET_MPEGTS; + if (!(indexingFlags & ADM_IDX_FLAG_WRITE_INDEX_FILE)) + { + idxt = ADM_IDX_USE_EXISTING; + } + if (indexingFlags & ADM_IDX_FLAG_IGNORE_INDEX_FILE) + { + idxt = ADM_IDX_MEMFILE_ONLY; + ADM_info("Mem-only indexing.\n"); + } + } + + return openInternal(name, idxt); +} + +/** + \fn openInternal + \brief Open given MPEG-TS file, gather infos and build index(es). +*/ +uint8_t tsHeader::openInternal(const char *name, ADM_indexingType &strategy) +{ char *idxName=(char *)malloc(strlen(name)+6); uint8_t r=1; sprintf(idxName,"%s.idx2",name); ListOfIndexFiles.push_back(idxName); - if(!ADM_fileExist(idxName)) - r=tsIndexer(name); + + if(strategy == ADM_IDX_MEMFILE_ONLY || !ADM_fileExist(idxName)) + r = tsIndexer(name, strategy != ADM_IDX_WRITE_TO_DISK); if(r!=ADM_OK) { if(r==ADM_IGN) ADM_warning("Indexing cancelled by the user, deleting the index file. Bye.\n"); if(!r) ADM_error("Indexing of %s failed, aborting\n",name); - if(ADM_fileExist(idxName) && !ADM_eraseFile(idxName)) + if(strategy == ADM_IDX_WRITE_TO_DISK && ADM_fileExist(idxName) && !ADM_eraseFile(idxName)) ADM_warning("Could not delete %s\n",idxName); free(idxName); return r; @@ -61,9 +88,9 @@ r=0; indexFile index; - if(!index.open(idxName)) + if(!index.open(idxName, strategy == ADM_IDX_MEMFILE_ONLY)) { - printf("tsDemux Cannot open index file %s\n",idxName); + printf("tsDemux Cannot open %s file %s\n", idxName, (strategy == ADM_IDX_MEMFILE_ONLY) ? "in-memory index" : "index", idxName); free(idxName); return false; } @@ -82,6 +109,12 @@ version=index.getAsUint32("Version"); if(version!=ADM_INDEX_FILE_VERSION) { + ADM_warning("Index file version mismatch, expected %" PRIu32", got %" PRIu32"\n", ADM_INDEX_FILE_VERSION, version); + if (strategy == ADM_IDX_MEMFILE_ONLY) + { + ADM_error("Index file version mismatch despite in-memory indexing, bailing out.\n"); + goto abt; + } if(GUI_Question(QT_TRANSLATE_NOOP("tsdemuxer","This file's index has been created with an older version of avidemux.\nThe file must be re-indexed. Proceed?"))) reindex=true; goto abt; @@ -144,16 +177,25 @@ } abt: index.close(); - if(reindex) + if (reindex && strategy != ADM_IDX_MEMFILE_ONLY) { - uint8_t success=ADM_eraseFile(idxName); - free(idxName); - if(success) - r=open(name); + uint8_t success = 1; + if (strategy == ADM_IDX_WRITE_TO_DISK) + success = ADM_eraseFile(idxName); else + strategy = ADM_IDX_MEMFILE_ONLY; + free(idxName); + if (success) + { + r = openInternal(name, strategy); + } else + { ADM_error("Can't delete old index file.\n"); - }else + } + } else + { free(idxName); + } printf("tsDemuxer open() returned %d\n",r); return r; }
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_ts.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_ts.h
Changed
@@ -24,6 +24,7 @@ #include "ADM_audioStream.h" #include "dmx_io.h" #include "ADM_indexFile.h" +#include "ADM_indexingFlags.h" #include "dmxTSPacket.h" #include <vector> #include "ADM_coreDemuxerMpeg.h" @@ -113,29 +114,32 @@ class tsHeader :public vidHeader { protected: - - bool fieldEncoded; - bool readVideo(indexFile *index); - bool readAudio(indexFile *index,const char *name); - bool readIndex(indexFile *index); - - bool processVideoIndex(char *buffer); - bool processAudioIndex(char *buffer); + uint32_t videoPid; + uint32_t lastFrame; + bool fieldEncoded; + bool videoNeedEscaping; + uint64_t sizeOfVideoInBytes; + uint64_t videoDuration; // cached value in microseconds std::vector <dmxFrame *> ListOfFrames; std::vector <std::string> ListOfIndexFiles; + std::vector <ADM_tsTrackDescriptor *> listOfAudioTracks; fileParser parser; - uint32_t lastFrame; - tsPacketLinear *tsPacket; + tsPacketLinear *tsPacket; + + uint8_t openInternal(const char *name, ADM_indexingType &strategy); + + bool readVideo(indexFile *index); + bool readAudio(indexFile *index, const char *name); + bool readIndex(indexFile *index); + + bool processVideoIndex(char *buffer); + bool processAudioIndex(char *buffer); + uint64_t timeConvert(uint64_t x); bool updatePtsDts(void); bool updateIdr(void); - bool videoNeedEscaping; - uint64_t sizeOfVideoInBytes; - uint64_t videoDuration; // cached value in microseconds -protected: - vector <ADM_tsTrackDescriptor *>listOfAudioTracks; - uint32_t videoPid; + public:
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndex.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndex.cpp
Changed
@@ -45,7 +45,7 @@ \fn TsIndexer \brief main indexing loop for mpeg2 payload */ -uint8_t tsIndexer(const char *file) +uint8_t tsIndexer(const char *file, bool memOnly) { uint8_t r; ADM_TS_TRACK *tracks; @@ -109,7 +109,7 @@ r=0; }else { - r=dx->run( file,&(tracks0)); + r=dx->run(file, &(tracks0), memOnly); delete dx; dx=NULL; }
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndex.h -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndex.h
Changed
@@ -147,7 +147,7 @@ public: TsIndexerBase(listOfTsAudioTracks *tr); virtual ~TsIndexerBase(); -virtual uint8_t run(const char *file,ADM_TS_TRACK *videoTrac)=0; +virtual uint8_t run(const char *file, ADM_TS_TRACK *videoTrac, bool memOnly)=0; bool writeVideo(TSVideo *video,ADM_TS_TRACK_TYPE trkType); bool writeAudio(void); bool writeSystem(const char *filename,int append=0); @@ -202,7 +202,7 @@ { } - uint8_t run(const char *file,ADM_TS_TRACK *videoTrac); + uint8_t run(const char *file, ADM_TS_TRACK *videoTrac, bool memOnly); }; class TsIndexerVC1: public TsIndexerBase @@ -218,7 +218,7 @@ { } - uint8_t run(const char *file,ADM_TS_TRACK *videoTrac); + uint8_t run(const char *file, ADM_TS_TRACK *videoTrac, bool memOnly); TsIndexerVC1(listOfTsAudioTracks *tr) : TsIndexerBase(tr) { @@ -238,7 +238,7 @@ { } - uint8_t run(const char *file,ADM_TS_TRACK *videoTrac); + uint8_t run(const char *file, ADM_TS_TRACK *videoTrac, bool memOnly); TsIndexerMpeg2(listOfTsAudioTracks *tr) : TsIndexerBase(tr) { @@ -266,7 +266,7 @@ { } - uint8_t run(const char *file,ADM_TS_TRACK *videoTrac); + uint8_t run(const char *file, ADM_TS_TRACK *videoTrac, bool memOnly); TsIndexerH265(listOfTsAudioTracks *tr) : TsIndexerBase(tr) {
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexH264.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexH264.cpp
Changed
@@ -216,7 +216,7 @@ \fn run \brief Index H264 stream */ -uint8_t TsIndexerH264::run(const char *file, ADM_TS_TRACK *videoTrac) +uint8_t TsIndexerH264::run(const char *file, ADM_TS_TRACK *videoTrac, bool memOnly) { bool seq_found=false; bool firstSps=true; @@ -240,17 +240,23 @@ memset(&data,0,sizeof(data)); data.picStructure=pictureFrame; - string indexName=string(file); - indexName=indexName+string(".idx2"); - index=qfopen(indexName,(const char*)"wt",true); + string indexName = file; + indexName += ".idx2"; - if(!index) + index = memOnly ? NULL : qfopen(indexName,"wt",true); + if (!index) { - ADM_error("TsIndexerH264 Cannot create %s\n",indexName.c_str()); - mFile=mfopen(indexName,"wt"); + if (memOnly) + ADM_info("Forcing in-memory indexing.\n"); + else + ADM_warning("Cannot create index file \"%s\"\n", indexName.c_str()); + mFile = mfopen(indexName,"wt"); if (!mFile) { - printf("TsIndexerH264 Cannot create memFile either\n"); + if (memOnly) + ADM_error("Cannot create memFile!\n"); + else + ADM_error("Cannot create memFile either.\n"); return 0; } }
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexH265.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexH265.cpp
Changed
@@ -293,7 +293,7 @@ \fn run \brief Index H265 stream */ -uint8_t TsIndexerH265::run(const char *file,ADM_TS_TRACK *videoTrac) +uint8_t TsIndexerH265::run(const char *file,ADM_TS_TRACK *videoTrac, bool memOnly) { TSVideo video; indexerData data; @@ -311,18 +311,24 @@ memset(&data,0,sizeof(data)); data.picStructure=pictureFrame; - string indexName=string(file); - indexName=indexName+string(".idx2"); - index=qfopen(indexName,(const char*)"wt",true); + string indexName = file; + indexName += ".idx2"; - if(!index) + index = memOnly ? NULL : qfopen(indexName,"wt",true); + if (!index) { - printf("TsIndexerH265 Cannot create %s\n",indexName.c_str()); - mFile=mfopen(indexName,"wt"); + if (memOnly) + ADM_info("Forcing in-memory indexing.\n"); + else + ADM_warning("Cannot create index file \"%s\"\n", indexName.c_str()); + mFile = mfopen(indexName,"wt"); if (!mFile) { - printf("TsIndexerH265 Cannot create memFile either\n"); - return false; + if (memOnly) + ADM_error("Cannot create memFile!\n"); + else + ADM_error("Cannot create memFile either.\n"); + return 0; } }
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexMpeg2.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexMpeg2.cpp
Changed
@@ -44,7 +44,7 @@ /** \fn runMpeg2 */ -uint8_t TsIndexerMpeg2::run(const char *file,ADM_TS_TRACK *videoTrac) +uint8_t TsIndexerMpeg2::run(const char *file,ADM_TS_TRACK *videoTrac, bool memOnly) { uint32_t temporal_ref,val; bool seq_found=false; @@ -69,21 +69,28 @@ memset(&data,0,sizeof(data)); - string indexName=string(file); - indexName=indexName+string(".idx2"); + string indexName = file; + indexName =+ ".idx2"; index=qfopen(indexName,"wt",true); - if(!index) + index = memOnly ? NULL : qfopen(indexName,"wt",true); + if (!index) { - printf("TsIndexerMpeg2 Cannot create %s\n",indexName.c_str()); - mFile=mfopen(indexName,"wt"); + if (memOnly) + ADM_info("Forcing in-memory indexing.\n"); + else + ADM_warning("Cannot create index file \"%s\"\n", indexName.c_str()); + mFile = mfopen(indexName,"wt"); if (!mFile) { - printf("TsIndexerMpeg2 Cannot create memFile either\n"); + if (memOnly) + ADM_error("Cannot create memFile!\n"); + else + ADM_error("Cannot create memFile either.\n"); return 0; } } - + int append=0; #ifdef ASK_APPEND_SEQUENCED append=1;
View file
avidemux2-2.8.2.git20260407.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexVC1.cpp -> avidemux2-2.8.2.git20260417.tar.xz/avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsIndexVC1.cpp
Changed
@@ -26,7 +26,7 @@ \fn runVC1 \brief Index VC1 stream */ -uint8_t TsIndexerVC1::run(const char *file,ADM_TS_TRACK *videoTrac) +uint8_t TsIndexerVC1::run(const char *file,ADM_TS_TRACK *videoTrac, bool memOnly) { uint32_t temporal_ref,val; uint8_t buffer50*1024; @@ -49,21 +49,28 @@ memset(&data,0,sizeof(data)); data.picStructure=pictureFrame; - - string indexName=string(file); - indexName=indexName+string(".idx2"); - index=qfopen(indexName,"wt",true); - if(!index) + string indexName = file; + indexName += ".idx2"; + + index = memOnly ? NULL : qfopen(indexName,"wt",true); + if (!index) { - printf("TsIndex Cannot create %s\n",indexName.c_str()); - mFile=mfopen(indexName,"wt"); + if (memOnly) + ADM_info("Forcing in-memory indexing.\n"); + else + ADM_warning("Cannot create index file \"%s\"\n", indexName.c_str()); + mFile = mfopen(indexName,"wt"); if (!mFile) { - printf("TsIndex Cannot create memFile either\n"); - return false; + if (memOnly) + ADM_error("Cannot create memFile!\n"); + else + ADM_error("Cannot create memFile either.\n"); + return 0; } } + writeSystem(file,false); pkt=new tsPacketLinearTracker(videoTrac->trackPid, audioTracks);
View file
avidemux2-2.8.2.git20260417.tar.xz/devpod_debianbullseye.bash
Added
@@ -0,0 +1,2 @@ +#!/bin/sh +devpod up . --ide none --id adm-bullseye --devcontainer-path .devcontainer_bullseye/devcontainer.json $@
View file
avidemux2-2.8.2.git20260407.tar.xz/devpod_debiantrixie.sh -> avidemux2-2.8.2.git20260417.tar.xz/devpod_debiantrixie.sh
Changed
@@ -1,1 +1,2 @@ -devpod up . --ide none --id adm-trixie --devcontainer-path .devcontainer_trixie/devcontainer.json +#!/bin/sh +devpod up . --ide none --id adm-trixie --devcontainer-path .devcontainer_trixie/devcontainer.json $@
View file
avidemux2-2.8.2.git20260407.tar.xz/devpod_fedora.sh -> avidemux2-2.8.2.git20260417.tar.xz/devpod_fedora.sh
Changed
@@ -1,1 +1,2 @@ -devpod up . --id adm-fedora --ide none --devcontainer-path .devcontainer_fedora/devcontainer.json +#!/bin/sh +devpod up . --id adm-fedora --ide none --devcontainer-path .devcontainer_fedora/devcontainer.json $@
View file
avidemux2-2.8.2.git20260407.tar.xz/devpod_mxe64.sh -> avidemux2-2.8.2.git20260417.tar.xz/devpod_mxe64.sh
Changed
@@ -1,3 +1,3 @@ # echo "Dont forget devpod provider set-options --provider docker --option INACTIVITY_TIMEOUT=90m" -devpod up . --ide none --id adm-mxe64 --devcontainer-path .devcontainer_mxe64/devcontainer.json +devpod up . --ide none --id adm-mxe64 --devcontainer-path .devcontainer_mxe64/devcontainer.json $@
View file
avidemux2-2.8.2.git20260407.tar.xz/devpod_ubuntu2510.sh -> avidemux2-2.8.2.git20260417.tar.xz/devpod_ubuntu2510.sh
Changed
@@ -1,1 +1,2 @@ -devpod up . --ide none --id adm-ubuntu --devcontainer-path .devcontainer_ubuntu2510/devcontainer.json +#!/bin/sh +devpod up . --ide none --id adm-ubuntu --devcontainer-path .devcontainer_ubuntu2510/devcontainer.json $@
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.