Skip to content

Session Compatibility

Portions of this guide are adapted from OpenRV Reference Manual, Chapter 6, (c) Contributors to the OpenRV Project, Apache 2.0. Content has been rewritten for the TypeScript/WebGL2 implementation of OpenRV Web.


Overview

OpenRV Web provides bidirectional session interoperability: it can import desktop RV session files (.rv) with full node graph reconstruction, and it has its own native session format (.orvproject) with auto-save, snapshot versioning, and crash recovery.

This guide covers the RV/GTO session format, the node mapping between desktop RV and OpenRV Web, supported and unsupported features, and a practical migration guide for teams moving from desktop RV to the browser-based workflow.


RV Session Format (GTO)

Desktop OpenRV saves sessions in the GTO (Graph Topology Object) binary format. A GTO file serializes the complete node graph as a collection of named objects, each containing typed properties organized into components.

GTO Structure

A GTO file consists of:

  • Objects: Named entities corresponding to nodes in the graph. Each object has a protocol string identifying its node type (e.g., RVFileSource, RVSequenceGroup, RVStackGroup)
  • Components: Named property groups within an object (e.g., media, color, transform, cut)
  • Properties: Typed data values within a component. GTO supports integers, floats, strings, and arrays of these types

Property Types

GTO supports the following property data types, all of which are handled by the gto-js parser:

GTO TypeTypeScript MappingExample Usage
int (scalar)numberFrame numbers, indices
int (array)number[]EDL frame lists, marker positions
float (scalar)numberExposure, opacity, wipe position
float (array)number[]CDL slope/offset/power (RGB triplets), color values
stringstringFile paths, node names, display names
string (array)string[]Source media paths, view node references
byte (array)Uint8ArrayBinary data (annotations, thumbnails)

How OpenRV Web Reads GTO

The GTOGraphLoader (src/core/session/GTOGraphLoader.ts) uses the gto-js library to parse the binary GTO format. The loading process:

  1. Parse binary data: The gto-js parser reads the GTO header, object table, and property data
  2. Extract session metadata: The RVSession object provides global settings (current frame, FPS, in/out points, markers, display name, comment)
  3. Map protocols to node types: Each GTO object's protocol string is mapped to an OpenRV Web node type using the PROTOCOL_TO_NODE_TYPE lookup table
  4. Create nodes: NodeFactory.create(type) instantiates nodes for each recognized protocol
  5. Restore properties: GTO properties are transferred to the node's PropertyContainer
  6. Reconstruct connections: Input/output connections specified in the GTO data are re-established between nodes
  7. Build the graph: The reconstructed nodes are added to a Graph instance with the correct output node

Node Mapping

The following table shows how desktop RV node types map to OpenRV Web node types:

Source Nodes

RV ProtocolOpenRV Web NodeDescription
RVFileSourceFileSourceNodeSingle image file
RVImageSourceFileSourceNodeImage source (alias for RVFileSource)
RVMovieSourceVideoSourceNodeVideo file
RVSequenceSourceSequenceSourceNodeImage sequence
RVMovieProcProceduralSourceNodeProcedural test patterns

Group Nodes

RV ProtocolOpenRV Web NodeDescription
RVSequenceGroupSequenceGroupNodeLinear playback of sources
RVStackGroupStackGroupNodeLayered compositing with blend modes
RVLayoutGroupLayoutGroupNodeGrid/spatial arrangement
RVSwitchGroupSwitchGroupNodeA/B switching
RVFolderGroupFolderGroupNodeOrganizational container
RVRetimeGroupRetimeGroupNodeSpeed/time remapping

Effect and Processing Nodes

RV ProtocolOpenRV Web NodeStatus
RVCDLCDLNodeSupported
RVColorColor adjustmentsProperties mapped to session color state
RVTransform2DTransform stateProperties mapped to session transform
RVLensWarpLens distortion stateProperties mapped to session lens params
RVLinearizeLinearize stateTransfer function selection
RVCacheLUTCacheLUTNodePre-cache LUT application
RVLookLUTLUT stateLook LUT reference
RVRetimeRetime propertiesMapped to RetimeGroupNode

Display and View Nodes

RV ProtocolOpenRV Web NodeStatus
RVDisplayColorDisplay color stateProperties read for display configuration
RVDisplayStereoStereo display stateStereo mode and settings
RVSourceStereoSource stereo statePer-source stereo configuration
RVViewGroupView stateView configuration container
RVDisplayGroupDisplay stateDisplay configuration container
RVViewPipelineGroupPipeline stateView pipeline configuration
RVOverlayOverlay stateHUD and overlay settings
RVFormatFormat statePixel format configuration
RVChannelMapChannel stateChannel remapping

Color Management Nodes

RV ProtocolOpenRV Web NodeStatus
RVOCIOOCIO stateOCIO color space settings (partially implemented)
RVICCTransformICC stateICC profile transforms

Supported Features

The following table summarizes which desktop RV session features are supported when loading .rv files in OpenRV Web:

Feature CategoryFeatureStatusNotes
SourcesFile source referencesSupportedPath stored; user prompted to re-select files
Image sequencesSupportedPattern and frame range restored
Video sourcesSupportedRequires re-loading the video file
Procedural sources (.movieproc)SupportedFull URL parsing with OpenRV aliases
ViewsSequence viewSupportedEDL data, durations, frame mapping
Stack viewSupportedComposite type, per-layer blend modes
Layout viewSupportedGrid configuration, spacing
Switch viewSupportedActive input index
Folder organizationSupportedPass-through container
RetimeSupportedScale, offset, reverse, explicit mapping, warp keyframes
ColorExposure, brightness, contrast, saturationSupportedMapped to color adjustment state
Hue rotationSupportedMapped to color state
CDL (Slope, Offset, Power, Saturation)SupportedFull SOP + Sat
Color temperature / tintSupportedMapped to color state
PlaybackCurrent frameSupportedRestored on load
In/out pointsSupportedFrame range restored
FPSSupportedPlayback rate restored
MarkersSupportedFrame positions with notes and colors
Loop modeSupportedLoop, once, bounce
Frame incrementSupportedStep size for frame advance
AnnotationsPaint strokesSupportedPer-frame annotations
Paint effects (ghost, hold)SupportedEffect modes restored
StereoStereo modeSupportedAll software stereo modes
Eye swapSupportedLeft/right reversal
Convergence offsetSupportedHorizontal parallax adjustment
Per-eye transformsSupportedGeometric correction
Session MetadataDisplay nameSupportedSession title
CommentSupportedDescriptive text
Creation context / originSupportedSession provenance
Background colorSupportedCanvas background
Transform2D transform (rotate, flip, scale)SupportedMapped to session transform state
Lens distortionSupportedK1, K2, center point
Crop regionSupportedEnabled flag, region bounds
LUTLUT file referenceSupportedPath stored; file must be re-loaded
LUT intensitySupportedBlend amount (0-1)
Not SupportedMu/Python scriptsNot supportedNo scripting engine in browser
Custom plugin node typesNot supportedOnly built-in node types recognized
Hardware display calibrationNot supportedNo OS-level display access
Embedded OCIO configsPartially supportedConfig must be re-loaded separately
Audio tracks (RVSoundTrack)RecognizedNode created but audio not decoded from GTO
Waveform display nodeRecognizedNode type stored but not rendered

Session State Schema

The SessionState interface (src/core/session/SessionState.ts) defines the complete serializable state at schema version 2:

FieldTypeDescription
versionnumberSchema version (currently 2)
namestringProject name
createdAtstringISO 8601 creation timestamp
modifiedAtstringISO 8601 last-modified timestamp
mediaMediaReference[]Source file references
playbackPlaybackStateFrame, in/out, FPS, loop mode, volume, marks
paintSerializedPaintStatePer-frame annotations and paint effects
viewViewStateZoom and pan position
colorColorAdjustmentsBrightness, contrast, saturation, exposure, gamma
cdlCDLValuesASC CDL Slope, Offset, Power, Saturation
filtersFilterSettingsBlur, sharpen parameters
transformTransform2DRotation, flip, scale, translate
cropCropStateCrop region
lensLensDistortionParamsK1, K2, center point
wipeWipeStateWipe mode and position
stackStackLayer[]Layer stack configuration
noiseReductionNoiseReductionParams?Noise reduction settings
watermarkWatermarkState?Watermark overlay
lutPathstring?LUT file reference (path only, not embedded)
lutIntensitynumberLUT blend amount (0-1)
parPARState?Pixel aspect ratio correction
backgroundPatternBackgroundPatternState?Alpha visualization pattern
playlistPlaylistState?Multi-clip playlist
notesNote[]?Review notes and comments
versionGroupsVersionGroup[]?Version comparison groups
statusesStatusEntry[]?Shot status entries
graphSerializedGraph?Node graph topology (v2+)

Migration Guide: Desktop RV to OpenRV Web

Step 1: Open the .rv Session File

Load the .rv session file into OpenRV Web via the file picker or drag-and-drop. The GTOGraphLoader parses the binary GTO data and reconstructs the node graph.

Desktop RV sessions store absolute filesystem paths for source media. Since the browser cannot access local filesystems directly, OpenRV Web will prompt you to re-select each media file:

  1. A file reload dialog appears for each source reference
  2. The dialog shows the expected filename from the original session
  3. Select the matching file from your local filesystem
  4. If the filename differs, a mismatch warning is displayed
  5. Click "Skip" to continue without loading a particular source

For image sequences, you may need to select all frame files at once.

Step 3: Verify Restored State

After media files are linked, verify that the session state has been correctly restored:

  • View arrangement: Check that sources appear in the correct order (sequence) or layers (stack)
  • Color corrections: Verify that exposure, CDL, and color adjustments match the desktop session
  • Playback settings: Confirm FPS, in/out points, and markers are present
  • Annotations: Check that per-frame paint annotations appear correctly

Step 4: Re-apply Unsupported Features

The following features from the desktop session will need manual re-application:

FeatureAction Required
OCIO configurationRe-load the .ocio config file via the OCIO panel
Custom Mu/Python scriptsNo equivalent; functionality must be achieved through built-in tools
Plugin-dependent node typesThese nodes are skipped during import
Hardware display calibrationUse the browser's built-in color management
LUT files referenced by pathRe-load LUT files via the LUT panel

Step 5: Save as .orvproject

Once the session is verified, save it in the native format:

  1. Press Ctrl+S or click the Save button
  2. The session is exported as an .orvproject JSON file
  3. Media references with blob URLs are marked with requiresReload: true
  4. Subsequent loads of the .orvproject will prompt for file re-selection

Native Session Management

.orvproject Format

OpenRV Web's native session format is a JSON file containing the complete SessionState. The SessionSerializer handles:

  • Save: toJSON() collects state from the session, paint engine, and viewer. Blob URLs are detected and flagged with requiresReload: true to prevent saving invalid URLs
  • Load: loadFromFile() validates the JSON structure, checks the schema version, and applies migrations if needed. For media with requiresReload: true, a file reload dialog prompts the user to re-select each file
  • Migration: Automatic migration from schema version 1 to version 2. The version field enables forward compatibility as the schema evolves

Auto-Save

The AutoSaveManager provides automatic session persistence:

  • Storage: IndexedDB database (openrv-web-autosave)
  • Interval: Configurable from 1 to 30 minutes (default: 5 minutes)
  • Debouncing: Multiple rapid changes are batched within a debounce window
  • Max versions: Configurable limit (1-100, default: 10) with auto-pruning of oldest entries
  • Crash recovery: On startup, the manager checks for a clean shutdown flag. If missing (indicating a crash or forced close), it emits a recoveryAvailable event so the UI can offer to restore the most recent auto-save

Auto-save indicator states:

StateVisualDescription
idleCloud icon, mutedShows relative time since last save
savingCloud icon, pulsingSave in progress
savedCloud-check icon, greenSuccessfully saved (3 seconds)
errorCloud-off icon, redSave failed (clickable for retry)
disabledCloud-off icon, mutedAuto-save is turned off

Snapshots

The SnapshotManager provides manual and automatic versioned snapshots:

  • Storage: IndexedDB database (openrv-web-snapshots)
  • Types: Manual snapshots (user-created, up to 50) and auto-checkpoints (system-created before major operations, up to 10)
  • Preview metadata: Each snapshot stores source name, current frame, annotation count, and whether a color grade is active
  • Operations: Create, restore, rename, export (portable JSON), import, delete, clear all
  • Search and filter: Snapshots can be searched by name/description and filtered by type (All / Manual / Auto)

Playlist Management

The PlaylistManager handles multi-clip editorial workflows:

  • Clip management: Add, remove, reorder clips with automatic global frame recalculation
  • Frame mapping: Converts global timeline frames to clip-local frame numbers
  • Loop modes: Single clip loop, all clips loop, and no-loop with playlistEnded event
  • EDL import/export: Import RV EDL files; export CMX3600 EDL for NLE interchange
  • Navigation: advance() and goBack() handle clip boundary transitions

Session Graph Persistence

Starting with schema version 2, the .orvproject format includes an optional graph field containing the serialized node graph topology. This preserves:

  • Node types and IDs
  • Input/output connections between nodes
  • Property values for all nodes
  • The active output node

When the graph field is absent (version 1 projects), OpenRV Web falls back to reconstructing a default graph from the media references and playback state.

IndexedDB Storage Architecture

OpenRV Web uses two separate IndexedDB databases for persistent storage:

DatabasePurposeContents
openrv-web-autosaveAuto-save entriesSession state snapshots with timestamps and metadata
openrv-web-snapshotsManual and auto snapshotsVersioned session snapshots with preview metadata

Both databases use auto-incrementing integer keys and store the full SessionState object as a structured clone. Storage quota is monitored via the Storage API, and warnings are emitted when available space drops below a threshold.

Blob URL Lifecycle

A critical aspect of session persistence is the handling of blob URLs. When a user loads a local file, the browser creates a blob URL via URL.createObjectURL(). These URLs are:

  • Session-scoped: Valid only within the current browser tab
  • Not serializable: Invalid after browser close, navigation, or crash
  • Detectable: Start with blob: prefix

The SessionSerializer handles this by:

  1. Detecting blob URLs during save
  2. Setting requiresReload: true on the media reference
  3. Clearing the path to prevent saving invalid URLs
  4. On load, prompting the user to re-select each file via the file reload dialog

This ensures that saved sessions remain portable and valid, even when media files are not available at the original URL.

Version Migration

The session state schema includes a version number for forward compatibility. When loading a session with an older schema version, the SessionSerializer applies migrations automatically:

  • v1 to v2: Adds the graph field for node graph topology persistence, adds noiseReduction and watermark fields, adds playlist, notes, versionGroups, and statuses fields

Future schema changes will follow the same migration pattern, ensuring that older .orvproject files remain loadable.


Released under the MIT License.