# jusas/gopromax-conversion-tools architecture

> Architecture diagram of the GitHub repository jusas/gopromax-conversion-tools, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jusas/gopromax-conversion-tools
- Repository: https://github.com/jusas/gopromax-conversion-tools

## Overview

MAX Video Converter is a desktop tool for turning GoPro MAX 360 footage into equirectangular video. The user adds media, inspects metadata and previews frames, adjusts rotation and crop, optionally checks a keyframe render, then queues full renders with selected output settings. Conversion uses ffmpeg filters and writes spherical-video tags with ExifTool; libVLC provides the 360 preview. Some UI wiring and unsampled subsystem details are not shown, so those connections are omitted or marked unverified.

Main entry points: [`src/VideoConversionApp/Services/VideoConverterService.cs`](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoConverterService.cs) (Video conversion), [`src/VideoConversionApp/ViewModels/MediaSelectionViewModel.cs`](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/MediaSelectionViewModel.cs) (Media selection), [`src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs`](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs) (Preview editing), [`src/VideoConversionApp/Services/VideoPreviewService.cs`](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoPreviewService.cs) (Preview generation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_media["Media intake"]
  node_main["Main window"]
  node_selection["Media selection"]
  node_info["Video metadata"]
  node_pool["Media pool"]
end

subgraph group_preview["Preview and editing"]
  node_previewvm["Preview editing"]
  node_previewservice["Preview generation"]
  node_filter["AV filter factory<br/>[AvFilterFactory.cs]"]
  node_player["360 preview player"]
  node_playerstate["Player state"]
end

subgraph group_render["Conversion"]
  node_renderconfig["Render settings"]
  node_queue["Render queue"]
  node_converter["Video conversion"]
end

subgraph group_support["App services"]
  node_config["Configuration<br/>[ConfigManager.cs]"]
  node_settings["Global settings"]
  node_storage["Storage access"]
  node_logger["Logging<br/>[Logger.cs]"]
end

node_user(("Video editor"))
node_ffmpeg["ffmpeg"]
node_exiftool["ExifTool"]
node_output["Equirectangular video"]
node_vlc["libVLC"]

node_user -->|"adds videos"| node_selection
node_selection -.->|"inspects media"| node_info
node_selection -.->|"adds to pool"| node_pool
node_user -->|"adjusts preview"| node_previewvm
node_previewvm -->|"requests previews"| node_previewservice
node_previewservice -->|"builds filters"| node_filter
node_previewservice -->|"generates frames"| node_ffmpeg
node_previewvm -->|"updates state"| node_playerstate
node_player -.->|"plays preview"| node_vlc
node_user -->|"chooses settings"| node_renderconfig
node_user -->|"queues renders"| node_queue
node_queue -.->|"starts rendering"| node_converter
node_converter -->|"builds filters"| node_filter
node_converter -->|"renders video"| node_ffmpeg
node_converter -->|"writes tags"| node_exiftool
node_converter -->|"writes result"| node_output
node_settings -.->|"saves settings"| node_config
node_main -->|"uses storage"| node_storage
node_info -->|"reads paths"| node_config

click node_main "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/MainWindowViewModel.cs"
click node_selection "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/MediaSelectionViewModel.cs"
click node_info "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoInfoService.cs"
click node_pool "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoPoolManager.cs"
click node_previewvm "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs"
click node_previewservice "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoPreviewService.cs"
click node_filter "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/AvFilterFactory.cs"
click node_player "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Views/Components/VideoPlayerView.axaml.cs"
click node_playerstate "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Models/PreviewVideoPlayerState.cs"
click node_renderconfig "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/RenderSettingsViewModel.cs"
click node_queue "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/RenderQueueViewModel.cs"
click node_converter "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoConverterService.cs"
click node_config "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/ConfigManager.cs"
click node_settings "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/GlobalSettingsViewModel.cs"
click node_storage "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/StorageServiceProvider.cs"
click node_logger "https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/Logger.cs"

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_main,node_selection,node_info,node_pool toneBlue
class node_previewvm,node_previewservice,node_filter,node_player,node_playerstate toneAmber
class node_renderconfig,node_queue,node_converter toneMint
class node_config,node_settings,node_storage,node_logger toneRose
class node_user,node_ffmpeg,node_exiftool,node_output,node_vlc toneIndigo
```

## Components

### Media intake

- [Main window](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/MainWindowViewModel.cs): `src/VideoConversionApp/ViewModels/MainWindowViewModel.cs`
- [Media selection](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/MediaSelectionViewModel.cs): `src/VideoConversionApp/ViewModels/MediaSelectionViewModel.cs`
- [Video metadata](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoInfoService.cs): `src/VideoConversionApp/Services/VideoInfoService.cs`
- [Media pool](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoPoolManager.cs): `src/VideoConversionApp/Services/VideoPoolManager.cs`

### Preview and editing

- [Preview editing](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs): `src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs`
- [Preview generation](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoPreviewService.cs): `src/VideoConversionApp/Services/VideoPreviewService.cs`
- [AV filter factory](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/AvFilterFactory.cs): `src/VideoConversionApp/Services/AvFilterFactory.cs`
- [360 preview player](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Views/Components/VideoPlayerView.axaml.cs): `src/VideoConversionApp/Views/Components/VideoPlayerView.axaml.cs`
- [Player state](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Models/PreviewVideoPlayerState.cs): `src/VideoConversionApp/Models/PreviewVideoPlayerState.cs`

### Conversion

- [Render settings](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/RenderSettingsViewModel.cs): `src/VideoConversionApp/ViewModels/RenderSettingsViewModel.cs`
- [Render queue](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/RenderQueueViewModel.cs): `src/VideoConversionApp/ViewModels/RenderQueueViewModel.cs`
- [Video conversion](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/VideoConverterService.cs): `src/VideoConversionApp/Services/VideoConverterService.cs`

### App services

- [Configuration](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/ConfigManager.cs): `src/VideoConversionApp/Services/ConfigManager.cs`
- [Global settings](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/ViewModels/GlobalSettingsViewModel.cs): `src/VideoConversionApp/ViewModels/GlobalSettingsViewModel.cs`
- [Storage access](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/StorageServiceProvider.cs): `src/VideoConversionApp/Services/StorageServiceProvider.cs`
- [Logging](https://github.com/jusas/gopromax-conversion-tools/blob/main/src/VideoConversionApp/Services/Logger.cs): `src/VideoConversionApp/Services/Logger.cs`

### Other components

- **Video editor**
- **ffmpeg**
- **ExifTool**
- **Equirectangular video**
- **libVLC**

## Connections

- Video editor → Media selection: adds videos
- Media selection → Video metadata: inspects media
- Media selection → Media pool: adds to pool
- Video editor → Preview editing: adjusts preview
- Preview editing → Preview generation: requests previews (evidence: `src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs`)
- Preview generation → AV filter factory: builds filters (evidence: `src/VideoConversionApp/Services/VideoPreviewService.cs`)
- Preview generation → ffmpeg: generates frames (evidence: `src/VideoConversionApp/Services/VideoPreviewService.cs`)
- Preview editing → Player state: updates state (evidence: `src/VideoConversionApp/ViewModels/ConversionPreviewViewModel.cs`)
- 360 preview player → libVLC: plays preview
- Video editor → Render settings: chooses settings
- Video editor → Render queue: queues renders
- Render queue → Video conversion: starts rendering
- Video conversion → AV filter factory: builds filters (evidence: `src/VideoConversionApp/Services/VideoConverterService.cs`)
- Video conversion → ffmpeg: renders video (evidence: `src/VideoConversionApp/Services/VideoConverterService.cs`)
- Video conversion → ExifTool: writes tags (evidence: `src/VideoConversionApp/Services/VideoConverterService.cs`)
- Video conversion → Equirectangular video: writes result
- Global settings → Configuration: saves settings
- Main window → Storage access: uses storage (evidence: `src/VideoConversionApp/App.axaml.cs`)
- Video metadata → Configuration: reads paths (evidence: `src/VideoConversionApp/Services/VideoInfoService.cs`)
