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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ python/src/xstudio/version.py
/build/
xstudio_install/
**/qml/*_qml_export.h

# Dolt database files (added by bd init)
.dolt/
*.db
78 changes: 78 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# xSTUDIO - Project Guide

## What is xSTUDIO?
Professional media playback and review application for VFX/film post-production.
- C++17/20, Qt6 QML frontend, CAF (C++ Actor Framework) for concurrency
- OpenEXR, FFmpeg media readers as plugins
- OpenGL GPU-accelerated viewport rendering
- Plugin architecture for media readers, colour operations, etc.

## Build System

**IMPORTANT: Always build as STANDALONE.** Building non-standalone causes linking/dependency issues on Windows.

### Windows Build (Primary)
```bash
# Configure (standalone)
cmake --preset WinRelease

# Build
cmake --build build --config Release --target xstudio

# The build output goes to: build/bin/Release/
```

### Portable Deployment (CRITICAL)
**The user runs xSTUDIO from `portable/bin/`, NOT from `build/bin/Release/`.**
After every build, you MUST copy updated binaries to the correct portable locations:
```bash
# Main exe and core DLLs go to portable/bin/
cp build/bin/Release/xstudio.exe portable/bin/
cp build/src/colour_pipeline/src/Release/colour_pipeline.dll portable/bin/
cp build/src/module/src/Release/module.dll portable/bin/

# PLUGINS go to portable/share/xstudio/plugin/ (NOT portable/bin/)
cp build/src/plugin/colour_pipeline/ocio/src/Release/colour_pipeline_ocio.dll portable/share/xstudio/plugin/
cp build/src/plugin/media_reader/openexr/src/Release/media_reader_openexr.dll portable/share/xstudio/plugin/
cp build/src/plugin/media_reader/ffmpeg/src/Release/media_reader_ffmpeg.dll portable/share/xstudio/plugin/
# Other plugins also live in portable/share/xstudio/plugin/
```
**WARNING: Plugins are loaded from `portable/share/xstudio/plugin/`, NOT `portable/bin/`.
Deploying plugin DLLs to the wrong directory means the old plugin runs silently.**

### Key Build Details
- Generator: Visual Studio 17 2022
- vcpkg for package management (toolchain at ../vcpkg/)
- Qt6 at C:/Qt/6.5.3/msvc2019_64/
- Presets: WinRelease, WinRelWithDebInfo, WinDebug

## Architecture
- **Actor Model**: CAF-based distributed actors with message passing
- **Plugin System**: Dynamic loading for media readers, colour ops
- **Registries**: keyboard_events, media_reader_registry, plugin_manager_registry, etc.
- **Thread Pools**: OpenEXR internal (16 threads), 5 ReaderHelper actors, 4 detail readers

## Key Directories
```
src/plugin/media_reader/openexr/ - EXR reader plugin
src/media_reader/ - Media reader coordination
src/media_cache/ - Frame caching
src/ui/base/src/keyboard.cpp - Hotkey system
src/ui/viewport/src/keypress_monitor.cpp - Key event distribution
src/ui/qml/viewport/src/hotkey_ui.cpp - Hotkey QML model
src/playhead/ - Playback control
```

## Test EXR Sequences
- `L:\tdm\shots\fw\9119\comp\images\FW9119_comp_v001\exr` (81 frames, 1000-1080)

## Working Style

**CRITICAL: Claude acts as ORCHESTRATOR, not implementor.**
- Spin up specialized agents (via Agent tool) for all development work: coding, debugging, building, benchmarking
- This prevents context window compaction and keeps the main conversation lean
- The orchestrator reads results from agents, coordinates next steps, and communicates with the user
- Only do trivial edits (like updating CLAUDE.md) directly — everything else gets delegated

## Issue Tracking
Uses **bd** (beads) for issue tracking. See AGENTS.md for workflow.
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.28 FATAL_ERROR)
cmake_policy(VERSION 3.28)

set(XSTUDIO_GLOBAL_VERSION "1.1.0" CACHE STRING "Version string")
set(XSTUDIO_GLOBAL_VERSION "1.1.2" CACHE STRING "Version string")
set(XSTUDIO_GLOBAL_NAME xStudio)

# set(CMAKE_OSX_DEPLOYMENT_TARGET "14.5" CACHE STRING "Minimum OS X deployment version" FORCE)
Expand Down Expand Up @@ -240,6 +240,11 @@ endif()

add_subdirectory(src)

option(BUILD_EXR_BENCHMARK "Build standalone EXR loading benchmark" OFF)
if(BUILD_EXR_BENCHMARK)
add_subdirectory(bench/exr_benchmark)
endif()

if(INSTALL_XSTUDIO)

# build quickpromise
Expand Down
22 changes: 22 additions & 0 deletions bench/exr_benchmark/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
cmake_minimum_required(VERSION 3.28)
project(exr_benchmark LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(OpenEXR CONFIG REQUIRED)
find_package(Imath CONFIG REQUIRED)

add_executable(exr_benchmark
exr_benchmark.cpp
)

target_link_libraries(exr_benchmark PRIVATE
OpenEXR::OpenEXR
Imath::Imath
)

if(MSVC)
target_compile_options(exr_benchmark PRIVATE /MP /W3)
target_compile_definitions(exr_benchmark PRIVATE NOMINMAX _CRT_SECURE_NO_WARNINGS)
endif()
Loading