ORIAnnotations Test Media

Two scripts produce the test media used by the ORIAnnotations sync test suite:

Script Media Source
create_test_media.sh Real-footage QuickTimes (sparks, StEM2 clips) Netflix open content on public S3
create_otio_test_media.py Synthetic OTIO test sequences A/B/C/D Generated locally — no download

Prerequisites

Tool Purpose Notes
aws CLI Download source material from S3 brew install awscli
oiiotool Convert Chimera TIFs to 1080p sRGB PNGs Part of OpenImageIO
ffmpeg (OCIO build) Encode QuickTimes Must have drawtext and ocio filters
python + ffmpeg_dailies Slate + burn-in encoding See ffmpeg-dailies

The script expects the ffmpeg-dailies repo to be a sibling of ORIAnnotations:

git/
├── ORIAnnotations/
└── ffmpeg-dailies/

Usage

cd test_media/
./create_test_media.sh

The script is idempotent — re-running it skips any step whose output already exists.

Options

--keep-raw    Do not delete downloaded TIF files after PNG conversion
--validate    Run ffprobe checks on encoded files after encoding

Environment variable overrides

Variable Default Description
FFMPEG_DAILIES_DIR ../../ffmpeg-dailies Path to the ffmpeg-dailies repo
FFMPEG_BIN ffmpeg Path to the OCIO-enabled ffmpeg binary

Example:

FFMPEG_BIN=/opt/tools/ffmpeg-ocio/bin/ffmpeg \
FFMPEG_DAILIES_DIR=/opt/tools/ffmpeg-dailies \
./create_test_media.sh --validate

Output layout

test_media/
├── source/
│   ├── frames/
│   │   ├── sparks/            # EXRs, frames 6100–6199 (ACEScg, source 59.94fps)
│   │   ├── chimera_wind/      # PNGs, frames 66600–66699 (sRGB, source 59.94fps)
│   │   ├── chimera_cars/      # PNGs, frames 2500–2599   (sRGB, source 23.98fps)
│   │   ├── chimera_dancers/   # PNGs, frames 21800–21899 (sRGB, source 59.94fps)
│   │   ├── chimera_fountains/ # PNGs, frames 5400–5499   (sRGB, source 23.98fps)
│   │   ├── seq_A/             # PNGs, frames 100–119 (synthetic, 24fps)
│   │   ├── seq_B/             # PNGs, frames 100–119 (synthetic, 24fps)
│   │   ├── seq_C/             # PNGs, frames 100–119 (synthetic, 24fps)
│   │   └── seq_D/             # PNGs, frames 100–119 (synthetic, 24fps)
│   ├── encoded/
│   │   ├── sparks.mov
│   │   ├── chimera_wind.mov
│   │   ├── chimera_cars.mov
│   │   ├── chimera_dancers.mov
│   │   ├── chimera_fountains.mov
│   │   ├── seq_A.mov          # ProRes, 24fps, TC 00:00:04:04
│   │   ├── seq_B.mov
│   │   ├── seq_C.mov
│   │   └── seq_D.mov
│   ├── otio_test_quicktime.otio   # 20-clip timeline referencing seq_*.mov
│   └── otio_test_imageseq.otio   # 20-clip timeline referencing PNG sequences

All source/ content is gitignored.


OTIO synthetic test media (create_otio_test_media.py)

Generates four lightweight synthetic image sequences (A/B/C/D) and two OTIO timeline files. No downloads required — everything is rendered locally from Pillow.

Requires Pillow >= 10, opentimelineio (both in the project .venv), and ffmpeg on PATH. Set FFMPEG_BIN=/path/to/ffmpeg to use a non-default binary.

Running the OTIO script

cd test_media/
python create_otio_test_media.py

The script is idempotent — re-running skips any step whose output already exists.

Flags: --skip-frames / --skip-encode / --skip-otio skip individual phases.

Example with a custom ffmpeg:

FFMPEG_BIN=/path/to/ffmpeg python create_otio_test_media.py

Frame content

Each 1280×720 PNG frame has a white background with black text:

  • Large centered label — sequence name (A, B, C, or D)
  • Frame: NNN — absolute frame number (100–119)
  • Rel: N — relative frame index, 0-based (0–19)

OTIO timeline structure

Both OTIO files contain a single video track with 20 clips, each 1 frame at 24fps. Clips alternate A→B→C→D. Clip i (0-indexed) references sequence [A,B,C,D][i % 4] at source_range.start_time = RationalTime(100 + i, 24).

Example: the 4th clip (index 3) is sequence D at frame 103; the 5th clip (index 4) is sequence A at frame 104.

Media paths are relative to test_media/source/, so the files are portable as long as the source/ directory structure is intact.


Timecode reference

Each encoded QuickTime has an embedded start timecode at 25fps that corresponds to the source frame number. This lets RV (and other tools) reconcile frame identity when the same content is loaded as both a QT and an image sequence.

Clip Source frames Source FPS Encoded at Embedded TC (25fps)
sparks 6100–6199 59.94 25fps 00:04:04:00
chimera_wind 66600–66699 59.94 25fps 00:44:24:00
chimera_cars 2500–2599 23.98 25fps 00:01:40:00
chimera_dancers 21800–21899 59.94 25fps 00:14:32:00
chimera_fountains 5400–5499 23.98 25fps 00:03:36:00

Note: the actual TC embedded in the QuickTime is shifted back by one frame (the slate frame), so the first content frame lands on the TC shown above.

Color pipeline

  • sparks: ACEScg EXR → OCIO (ACEScg → sRGB - Display, ACES 1.0 - SDR Video) → H264 QT
  • chimera clips: 4K DCI P3 PQ TIF → oiiotool --powc 2 (approximate display gamma) → 1080p sRGB PNG → H264 QT (no OCIO step; gamma already baked)

Source credits

All media from Netflix Open Content, freely available via public S3 under their respective licenses.


This site uses Just the Docs, a documentation theme for Jekyll.