immerVR MovieHint Specification v0.1

1. Scope & Goals

The MovieHint specification defines a simple, text‑based way to describe timed immersive cues associated with a media asset (typically a video). A single cue can describe:

Additional settings (e.g. stereo mode, projection type, color grading, presets) MAY be added later via new keys. The format is deliberately open and extensible. This spec defines:

The format itself is open. Other applications are free to:

Numeric values and enum orderings shown here are examples from immerGallery; other apps may use different internal representations as long as the text names and behavior match.

2. Encoding, whitespace & comments

2.1 Encoding

2.2 Whitespace and line structure

Example of a valid single‑line movieHint:

movieHint 00:00:01,000 00:00:04,000 env:Meadow bg360:backgrounds/gray sky.jpg intensity:0.8 fadeIn:1 fadeOut:0,500 

2.3 Comments

Examples:

# Full-line comment
movieHint 5 10 env:Rain # Inline comment

movieHint 10 20 bg360:"C:/VR # Backgrounds/green.jpg" intensity:0.7 // OK, comment starts here 

2.4 Keywords and extensibility

Current top‑level keywords used in .immerVR files include:

Current parameter keys used inside movieHint:

All keys are:

3. Environment names (ImageEnvironment)

Environment names in files map to the following enum names as currently used in immerGallery:

public enum ImageEnvironment {
  Unknown,
  Rain,
  Meadow,
  MeadowNoButterflies,
  Snow,
  Underwater,
  UnderwaterNoAnimals,
  Halloween,
  Leaves,
  Xmas,
  StPatricksDay,
  HotAirBalloons,
  HotAirBalloonsEgo,
  HotAirBalloonsOnlyEgo,
  HotAirBalloonBirds,
  HotAirBalloonBirdsEgo,
  Birds,
  Easter,
  Platform,
  Egypt,
  None 

Notes:

Environment descriptions (informative):

Comparisons of environment names are case‑insensitive.

4. Time and duration formats

Both absolute times (start/end) and durations (fadeIn/fadeOut) use the same flexible TimeValue syntax in .immerVR: 
Allowed forms:

Parsing rules:

  1. Split the string by ':' from right to left:

2. ​If seconds contain ,fff, parse fff as milliseconds. Otherwise, milliseconds = 0.
3. Missing hours/minutes default to 0.

Examples:

For SRT timecodes, start and end MUST be canonical HH:MM:SS,fff on the timecode line (see chapter 9).

5. .immerVR keywords

5.1 imageEnvironment (global default)

Syntax:

imageEnvironment <EnvironmentName>

Semantics:

5.2 movieHint (timed cue)

5.2.1 Syntax

General form:

movieHint <start> <end> [env:<EnvironmentName>] [bg360:<Path>] [intensity:<float>] [fadeIn:<duration>] [fadeOut:<duration>] [<futureKey>:<value>...] 

Implementation SHOULD treat hints that have neither env: nor bg360: as no‑ops.

5.2.2 env:<EnvironmentName>

Example:

movieHint 3 6 env:Rain
movieHint 00:01:00 00:01:10 env:None 

5.2.3 bg360:<Path>

Indicates a 360° mono background to be shown on the sphere around the user during the hint interval.

Default assumption:

Path value:
The bg360 value starts immediately after bg360: and continues until:

Rules:

Examples:

movieHint 1 4 bg360:/Pictures/background/gray.jpg
movieHint 10 20 bg360:backgrounds/gray sky.jpg intensity:0.8
movieHint 30 40 bg360:"C:/VR Backgrounds/Movie SciFi/green sphere.jpg" fadeIn:1 fadeOut:1 

Image vs video:

5.2.4 intensity:<float>

Scalar effect/background intensity hint.

Example:

movieHint 3 6 env:Rain intensity:0.7
movieHint 10 20 bg360:backgrounds/gray sky.jpg intensity:0.0 

5.2.5 fadeIn:<duration> and fadeOut:<duration>

Durations over which the hint ramps in and out.

Recommended behavior:

Example:

movieHint 00:00:30,000 00:00:40,000 env:Snow bg360:winter/snow360.mp4 intensity:1.0 fadeIn:2 fadeOut:2,000 

6. Runtime semantics

6.1. Always-defined environment

Runtime data typically uses a class/struct like:

public class MovieHint {
  public TimeSpan Start;
  public TimeSpan End;

  // Always set; defaults to Unknown if not specified
  public ImageEnvironment Environment = ImageEnvironment.Unknown;

  // Empty string means "no background override"
  public string Bg360Path = string.Empty;

  public TimeSpan FadeIn = TimeSpan.Zero;
  public TimeSpan FadeOut = TimeSpan.Zero;

  public float Intensity = 1.0f;

The environment is never null; it is always at least Unknown.

6.2. Channel separation

Conceptually, there are two channels:

  1. Environment channel: Controlled by env
  2. Background channel: Controlled by bg360

They are resolved independently at runtime.

6.3. Evaluating active hints at time t

For a given playback time t:

6.3.1 Environment

6.3.2 Background

6.3.3 Fades and intensity

6.4. Overlaps and gaps

6.5. Unknown keys

7. Example .immerVR file

# Example: movieSciFi.mp4.immerVR

# Global default environment
imageEnvironment ​Meadow

# 1–4s: meadow + static 360 background, strong intensity
movieHint 00:00:01,000 00:00:04,000 env:Meadow bg360:/Pictures/background/gray sky.jpg intensity:1.0 fadeIn:1 fadeOut:0,500

# 3–6s: rain effect only, medium intensity, no background override
movieHint 3 6 env:Rain intensity:0.7

# 10–20s: 360° video background, gentle fade in/out, no extra env override
movieHint 00:00:10,000 00:00:20,000 bg360:supported360/green_animated.mp4 intensity:1.0 fadeIn:2 fadeOut:2

# 30–40s: 360° background with spaces in path
movieHint 00:00:30,000 00:00:40,000 bg360:"C:/VR Backgrounds/Movie SciFi/green sphere.jpg" intensity:1.0 fadeIn:1 fadeOut:1

# 50–55s: explicitly disable environment FX even though imageEnvironment=​Meadow
movieHint 50 55 env:None 

8. immerVR SRT Extension

The immerVR SRT extension allows MovieHint information to be embedded into .srt subtitle files in a way that:

8.1. Standard SRT block

Normal SRT blocks look like:

<index>
<start> --> <end>
<subtitle text line 1>
[subtitle text line 2...]
<blank line> 

start and end are always HH:MM:SS,fff.

8.2. Extended timecode line with movieHint

Added data after the standard time range on the timecode line:

<index>
<start> --> <end> IMMERVR MOVIEHINT [ENV:<EnvironmentName>] [BG360:<Path>] [INTENSITY:<float>] [FADEIN:<duration>] [FADEOUT:<duration>] [<futureKey>:<value>...]
<subtitle text lines...>
<blank line> 

Conventions:

Example (subtitle + hint in one block):

1
00:00:05,000 --> 00:00:08,000 IMMERVR MOVIEHINT ENV:Meadow BG360:backgrounds/gray sky.jpg INTENSITY:0.8 FADEIN:1 FADEOUT:0,500
This is the second subtitle. 

Ordinary SRT players:

immerVR-aware players:

8.3. Hint-only blocks

You can define “metadata-only” blocks with no visible subtitle text:

1001
00:00:03,000 --> 00:00:06,000 IMMERVR MOVIEHINT ENV:Rain BG360:/Pictures/background/gray sky.jpg FADEIN:0,500 FADEOUT:0,500

8.4. Paths, comments & whitespace in SRT

Path handling for BG360: in SRT follows the same rules as bg360: in .immerVR:

Example:

2
00:00:10,000 --> 00:00:20,000 IMMERVR MOVIEHINT BG360:"C:/VR Backgrounds/Movie SciFi/green sphere.jpg" INTENSITY:1.0 FADEIN:2 FADEOUT:2 # sci-fi segment
The hero enters the simulation. 

8.5. Extensibility and unknown keys in SRT

9. Implementation notes (non‑normative)

Readers should:

Writers are free to:

For 360° backgrounds, implementations and content creators SHOULD consider not always using the highest-resolution textures. A blurred or otherwise low-detail version of the scene (for example a 1024×512 equirectangular texture) is often sufficient for most of the playback and keeps texture memory usage low. For sequences such as intro and end credits, it can be worthwhile to switch to a higher-resolution spherical texture (for example 8192×4096) that provides more detail and may contain visual references to the movie content. 

Appendix A: Current implementation state of immerGallery

As of immerGallery 1.4 the following parts of the specification have been implemented: