# mean00/avidemux2 architecture

> Architecture diagram of the GitHub repository mean00/avidemux2, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-08-05). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mean00/avidemux2
- Repository: https://github.com/mean00/avidemux2

## Overview

#### Purpose and executable entry points
Avidemux is a cross-platform native video editor/transcoder for Linux, Windows, and macOS. The common application startup and command dispatch live in `avidemux/common/main.cpp`, `avidemux/common/gui_main.cpp`, and `avidemux/common/gui_action.cpp`. It is built into alternative front ends: CLI (`avidemux/cli/CMakeLists.txt`), GTK (`avidemux/gtk/CMakeLists.txt`), and Qt-based desktop UI (`avidemux/qt4/CMakeLists.txt`).

#### Shared platform and media core
`avidemux_core` is the lowest-level C/C++ library layer: platform abstraction, threading, dynamic-library loading, crash handling, buffers, timing, preferences, and media primitives. Its exported interfaces create a boundary between reusable core code and application/UI/plugin code. Key paths: `avidemux_core/ADM_core/include/ADM_dynamicLoading.h`, `avidemux_core/ADM_core/src/ADM_dynamicLoading.cpp`, `avidemux_core/ADM_coreUtils/include/ADM_compressedImage.h`.

#### Project editor and timeline model
The editor owns loaded media, editable segments, selected audio tracks, timestamps, seeking, cached frames, and copy/render behavior. UI actions and scripts manipulate this model rather than containers directly. The primary control flow is: load source through a demuxer, construct an editor timeline/segments, preview or seek through decoded frames, then pass selected output settings to processing/muxing. Key paths: `avidemux/common/ADM_editor/include/IEditor.h`, `avidemux/common/ADM_editor/src/ADM_edit.cpp`, `avidemux/common/ADM_editor/src/ADM_segment.cpp`.

#### Decode, filter, and encode pipeline
Video passes from demuxed compressed packets through decoder selection, optional filter-chain processing, then either compressed-stream copy or re-encoding. Audio follows equivalent stream, filter, and encoder paths. The muxer gate makes the copy-versus-process decision before emitting packets. Key paths: `avidemux/common/ADM_videoCodec/src/ADM_dynVideoDecoder.cpp`, `avidemux/common/ADM_videoFilter2/src/ADM_videoFilters.cpp`, `avidemux/common/ADM_muxerGate/src/ADM_videoProcess.cpp`.

#### Dynamic media plugins
Format support and most transformations are supplied as buildable/loadable plugin families rather than embedded in the editor: demuxers, muxers, audio/video codecs, filters, audio devices, and script engines. Plugin APIs and dynamic loaders isolate the application from implementations and allow feature selection at build time. Representative paths: `avidemux_plugins/ADM_demuxers/CMakeLists.txt`, `avidemux_plugins/ADM_muxers/CMakeLists.txt`, `avidemux_plugins/ADM_videoFilters6/CMakeLists.txt`.

#### User interfaces, preview, and automation
The same common editor/control layer is exposed through headless CLI stubs, GTK widgets, or Qt dialogs/rendering. Qt also includes job management and OpenGL rendering; CLI supplies null UI/render implementations. Scripts can automate editor, codec, filter, and output selection via pluggable JavaScript/Python-like engines. Key paths: `avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp`, `avidemux/qt4/ADM_render_qt/GUI_render.cpp`, `avidemux_core/ADM_coreScript/src/ADM_ScriptEngineLoader.cpp`.

#### Runtime dependencies and delivery
CMake orchestrates core, UI, and plugin builds; bootstrap scripts create platform-specific build trees. FFmpeg 7.0.2 is vendored and patched for codec/container functionality. Optional hardware paths include VA-API, VDPAU, NVDEC/NVENC, DXVA2, and Apple VideoToolbox; rendering can use OpenGL, SDL, Xv, or platform APIs. SQLite backs core jobs. Packaging targets include Debian/RPM/tarballs, macOS app/DMG, Windows installers, and AppImage. Key paths: `avidemux_core/ffmpeg_package/ffmpeg-7.0.2.tar.bz2`, `avidemux_core/ADM_coreJobs/src/sqlJobs.cpp`, `appImage/deploy_qt6.sh`.

Main entry points: [`avidemux/common/ADM_editor/include/IEditor.h`](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/include/IEditor.h) (Editor timeline), [`avidemux_core/ADM_core/src/ADM_dynamicLoading.cpp`](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_core/src/ADM_dynamicLoading.cpp) (Dynamic loader), [`avidemux/qt4/ADM_render_qt/GUI_render.cpp`](https://github.com/mean00/avidemux2/blob/master/avidemux/qt4/ADM_render_qt/GUI_render.cpp) (Qt desktop UI), [`avidemux/common/main.cpp`](https://github.com/mean00/avidemux2/blob/master/avidemux/common/main.cpp) (Startup & action dispatch)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application Control"]
  node_startup["Startup &amp; action dispatch<br/>application control<br/>[main.cpp]"]
  node_editor["Editor timeline<br/>project model<br/>[IEditor.h]"]
  node_editor_impl["Editor operations<br/>editor implementation<br/>[ADM_edit.cpp]"]
  node_segments["Segment model<br/>timeline implementation<br/>[ADM_segment.cpp]"]
end

subgraph group_media["Media Pipeline"]
  node_core["avidemux_core<br/>native core library"]
  node_dynamic_loader["Dynamic loader<br/>core runtime service"]
  node_compressed_media["Compressed media primitives<br/>media data API"]
  node_decoder["Video decoder selection<br/>decode stage"]
  node_filters["Video filter chain<br/>processing stage"]
  node_muxer_gate["Copy/process muxer gate<br/>output pipeline gate"]
end

subgraph group_plugins["Plugin Runtime"]
  node_demuxers{{"Demuxer plugins<br/>plugin family<br/>[CMakeLists.txt]"}}
  node_muxers{{"Muxer plugins<br/>plugin family<br/>[CMakeLists.txt]"}}
  node_filter_plugins{{"Filter plugins<br/>plugin family<br/>[CMakeLists.txt]"}}
  node_script_loader["Script engine loader<br/>automation runtime"]
end

subgraph group_frontends["Front Ends"]
  node_cli["CLI front end<br/>headless frontend<br/>[CMakeLists.txt]"]
  node_gtk["GTK front end<br/>desktop frontend<br/>[CMakeLists.txt]"]
  node_qt["Qt desktop UI<br/>desktop frontend<br/>[GUI_render.cpp]"]
  node_jobs["Job manager<br/>Qt job service<br/>[ADM_jobs.cpp]"]
end

subgraph group_delivery["Build &amp; Delivery"]
  node_ffmpeg["Vendored FFmpeg<br/>codec/container dependency"]
  node_job_store[("SQLite job store<br/>persistent job storage<br/>[sqlJobs.cpp]")]
  node_appimage["AppImage packaging<br/>delivery target<br/>[deploy_qt6.sh]"]
end

node_startup -->|"commands"| node_editor
node_editor -->|"implements"| node_editor_impl
node_editor_impl -->|"edits"| node_segments
node_core -->|"includes"| node_dynamic_loader
node_core -->|"provides"| node_compressed_media
node_dynamic_loader -.->|"loads"| node_demuxers
node_dynamic_loader -.->|"loads"| node_muxers
node_dynamic_loader -.->|"loads"| node_filter_plugins
node_demuxers -->|"source streams"| node_editor
node_editor -->|"compressed packets"| node_decoder
node_decoder -->|"decoded frames"| node_filters
node_filter_plugins -.->|"extends"| node_filters
node_editor -->|"timeline and settings"| node_muxer_gate
node_filters -->|"processed frames"| node_muxer_gate
node_muxer_gate -->|"output packets"| node_muxers
node_script_loader -->|"automates"| node_editor
node_cli -->|"invokes"| node_startup
node_gtk -->|"invokes"| node_startup
node_qt -->|"invokes"| node_startup
node_qt -->|"preview and edits"| node_editor
node_qt -->|"manages"| node_jobs
node_jobs -->|"persists"| node_job_store
node_ffmpeg -.->|"codec backend"| node_decoder
node_ffmpeg -.->|"format backend"| node_demuxers
node_appimage -.->|"packages"| node_qt

click node_startup "https://github.com/mean00/avidemux2/blob/master/avidemux/common/main.cpp"
click node_editor "https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/include/IEditor.h"
click node_editor_impl "https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/src/ADM_edit.cpp"
click node_segments "https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/src/ADM_segment.cpp"
click node_core "https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_core/include/ADM_dynamicLoading.h"
click node_dynamic_loader "https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_core/src/ADM_dynamicLoading.cpp"
click node_compressed_media "https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_coreUtils/include/ADM_compressedImage.h"
click node_demuxers "https://github.com/mean00/avidemux2/blob/master/avidemux_plugins/ADM_demuxers/CMakeLists.txt"
click node_decoder "https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_videoCodec/src/ADM_dynVideoDecoder.cpp"
click node_filters "https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_videoFilter2/src/ADM_videoFilters.cpp"
click node_muxer_gate "https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_muxerGate/src/ADM_videoProcess.cpp"
click node_muxers "https://github.com/mean00/avidemux2/blob/master/avidemux_plugins/ADM_muxers/CMakeLists.txt"
click node_filter_plugins "https://github.com/mean00/avidemux2/blob/master/avidemux_plugins/ADM_videoFilters6/CMakeLists.txt"
click node_script_loader "https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_coreScript/src/ADM_ScriptEngineLoader.cpp"
click node_cli "https://github.com/mean00/avidemux2/blob/master/avidemux/cli/CMakeLists.txt"
click node_gtk "https://github.com/mean00/avidemux2/blob/master/avidemux/gtk/CMakeLists.txt"
click node_qt "https://github.com/mean00/avidemux2/blob/master/avidemux/qt4/ADM_render_qt/GUI_render.cpp"
click node_jobs "https://github.com/mean00/avidemux2/blob/master/avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp"
click node_ffmpeg "https://github.com/mean00/avidemux2/blob/master/avidemux_core/ffmpeg_package/ffmpeg-7.0.2.tar.bz2"
click node_job_store "https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_coreJobs/src/sqlJobs.cpp"
click node_appimage "https://github.com/mean00/avidemux2/blob/master/appImage/deploy_qt6.sh"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_startup,node_editor,node_editor_impl,node_segments toneBlue
class node_core,node_dynamic_loader,node_compressed_media,node_decoder,node_filters,node_muxer_gate toneAmber
class node_demuxers,node_muxers,node_filter_plugins,node_script_loader toneMint
class node_cli,node_gtk,node_qt,node_jobs toneRose
class node_ffmpeg,node_job_store,node_appimage toneIndigo
```

## Components

### Application Control

- [Startup & action dispatch](https://github.com/mean00/avidemux2/blob/master/avidemux/common/main.cpp): application control · Starts the app and routes commands into shared control logic. · `avidemux/common/main.cpp`
- [Editor timeline](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/include/IEditor.h): project model · Owns media, segments, tracks, seeking, cached frames, and render/copy state. · `avidemux/common/ADM_editor/include/IEditor.h`
- [Editor operations](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/src/ADM_edit.cpp): editor implementation · `avidemux/common/ADM_editor/src/ADM_edit.cpp`
- [Segment model](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/src/ADM_segment.cpp): timeline implementation · `avidemux/common/ADM_editor/src/ADM_segment.cpp`

### Media Pipeline

- [avidemux_core](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_core/include/ADM_dynamicLoading.h): native core library · Reusable platform, threading, buffers, timing, preferences, and media primitives. · `avidemux_core/ADM_core/include/ADM_dynamicLoading.h`
- [Dynamic loader](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_core/src/ADM_dynamicLoading.cpp): core runtime service · `avidemux_core/ADM_core/src/ADM_dynamicLoading.cpp`
- [Compressed media primitives](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_coreUtils/include/ADM_compressedImage.h): media data API · `avidemux_core/ADM_coreUtils/include/ADM_compressedImage.h`
- [Video decoder selection](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_videoCodec/src/ADM_dynVideoDecoder.cpp): decode stage · `avidemux/common/ADM_videoCodec/src/ADM_dynVideoDecoder.cpp`
- [Video filter chain](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_videoFilter2/src/ADM_videoFilters.cpp): processing stage · `avidemux/common/ADM_videoFilter2/src/ADM_videoFilters.cpp`
- [Copy/process muxer gate](https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_muxerGate/src/ADM_videoProcess.cpp): output pipeline gate · Chooses compressed-stream copy or processing before muxing. · `avidemux/common/ADM_muxerGate/src/ADM_videoProcess.cpp`

### Plugin Runtime

- [Demuxer plugins](https://github.com/mean00/avidemux2/blob/master/avidemux_plugins/ADM_demuxers/CMakeLists.txt): plugin family · Read source containers into compressed streams. · `avidemux_plugins/ADM_demuxers/CMakeLists.txt`
- [Muxer plugins](https://github.com/mean00/avidemux2/blob/master/avidemux_plugins/ADM_muxers/CMakeLists.txt): plugin family · Write selected output containers. · `avidemux_plugins/ADM_muxers/CMakeLists.txt`
- [Filter plugins](https://github.com/mean00/avidemux2/blob/master/avidemux_plugins/ADM_videoFilters6/CMakeLists.txt): plugin family · `avidemux_plugins/ADM_videoFilters6/CMakeLists.txt`
- [Script engine loader](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_coreScript/src/ADM_ScriptEngineLoader.cpp): automation runtime · Loads pluggable engines that automate editor and output settings. · `avidemux_core/ADM_coreScript/src/ADM_ScriptEngineLoader.cpp`

### Front Ends

- [CLI front end](https://github.com/mean00/avidemux2/blob/master/avidemux/cli/CMakeLists.txt): headless frontend · Uses null UI and rendering implementations. · `avidemux/cli/CMakeLists.txt`
- [GTK front end](https://github.com/mean00/avidemux2/blob/master/avidemux/gtk/CMakeLists.txt): desktop frontend · `avidemux/gtk/CMakeLists.txt`
- [Qt desktop UI](https://github.com/mean00/avidemux2/blob/master/avidemux/qt4/ADM_render_qt/GUI_render.cpp): desktop frontend · Provides dialogs, preview rendering, and job management. · `avidemux/qt4/ADM_render_qt/GUI_render.cpp`
- [Job manager](https://github.com/mean00/avidemux2/blob/master/avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp): Qt job service · `avidemux/qt4/ADM_jobs/src/ADM_jobs.cpp`

### Build & Delivery

- [Vendored FFmpeg](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ffmpeg_package/ffmpeg-7.0.2.tar.bz2): codec/container dependency · Patched FFmpeg provides codec and container functionality. · `avidemux_core/ffmpeg_package/ffmpeg-7.0.2.tar.bz2`
- [SQLite job store](https://github.com/mean00/avidemux2/blob/master/avidemux_core/ADM_coreJobs/src/sqlJobs.cpp): persistent job storage · `avidemux_core/ADM_coreJobs/src/sqlJobs.cpp`
- [AppImage packaging](https://github.com/mean00/avidemux2/blob/master/appImage/deploy_qt6.sh): delivery target · `appImage/deploy_qt6.sh`

## Connections

- Startup & action dispatch → Editor timeline: commands
- Editor timeline → Editor operations: implements
- Editor operations → Segment model: edits
- avidemux_core → Dynamic loader: includes
- avidemux_core → Compressed media primitives: provides
- Dynamic loader → Demuxer plugins: loads
- Dynamic loader → Muxer plugins: loads
- Dynamic loader → Filter plugins: loads
- Demuxer plugins → Editor timeline: source streams
- Editor timeline → Video decoder selection: compressed packets
- Video decoder selection → Video filter chain: decoded frames
- Filter plugins → Video filter chain: extends
- Editor timeline → Copy/process muxer gate: timeline and settings
- Video filter chain → Copy/process muxer gate: processed frames
- Copy/process muxer gate → Muxer plugins: output packets
- Script engine loader → Editor timeline: automates
- CLI front end → Startup & action dispatch: invokes
- GTK front end → Startup & action dispatch: invokes
- Qt desktop UI → Startup & action dispatch: invokes
- Qt desktop UI → Editor timeline: preview and edits
- Qt desktop UI → Job manager: manages
- Job manager → SQLite job store: persists
- Vendored FFmpeg → Video decoder selection: codec backend
- Vendored FFmpeg → Demuxer plugins: format backend
- AppImage packaging → Qt desktop UI: packages
