Novus Stream Solutions
All tutorials

Novus Examples

Test a video pipeline with the 401-file video set

The video category grew from 70 files to 401, and the point of the expansion is that degraded clips now name the pristine clip they came from. This guide covers choosing codec, container, streaming, caption, and AI-video fixtures, and using the ground-truth pairing to turn "looks better" into a number.

Video is the format family where testing goes wrong most quietly. An encoder that drops a colour tag, a player that mishandles a fragmented MP4, an upscaler that sharpens noise into detail, a caption parser that chokes on a byte-order mark — none of these throw an error. They produce a file that plays, and you find out later. That is the argument for fixtures whose properties are stated rather than inferred.

The video category in Novus Examples used to be the thinnest part of the catalog: the most subcategories of any category and the fewest files in each. It is now 401 files and the second-largest category, built around one idea that changes how you can use it. Every degraded clip records the pristine clip it was derived from, and the two share a group so you can find the pair. That means an upscaler or a denoiser is no longer judged by eye — you have the original to measure against.

This guide covers the five things the set is good for: comparing codecs and containers without a re-encode muddying the comparison, exercising HLS and DASH players against manifests that actually load, feeding caption parsers the encodings they will meet in the wild, checking accessibility handling on tracks whose dispositions are genuinely set, and scoring AI-video output against ground truth.

Contents
  1. 1.1. Start from the purpose, not the extension
  2. 2.2. Compare codecs and containers without confounding the test
  3. 3.3. Point a player at a real streaming package
  4. 4.4. Break your caption parser on purpose
  5. 5.5. Test accessibility on tracks that are genuinely tagged
  6. 6.6. Score AI-video output against the ground truth
  7. 7.7. Keep a small video suite in regression

Two ways to finish

Format and playback testing

Codecs, containers, pixel formats, streaming manifests, and the metadata around them.

Model and pipeline scoring

Degraded clips paired with a pristine reference, so output quality can be measured rather than judged.

  1. 1

    1. Start from the purpose, not the extension

    The video set is large enough that browsing by file type is the slow route. Purpose pages group the fixtures by the job: /for/video-codec-testing for codec and container work, /for/streaming-manifest-testing for HLS and DASH, /for/caption-encoding and /for/subtitle-testing for timed text, /for/media-accessibility for multi-track audio and subtitles, /for/media-metadata-testing for chapters and container tags, and a purpose page for each AI-video task — upscaling, denoise, matting, interpolation, depth, stabilisation, restoration, segmentation, and colourisation.

    Each fixture still carries a spec sheet, and for video the sheet is where the useful detail lives: the codec and encoder settings, the pixel format, the frame cadence, whether a rotation flag is set, and — for the paired fixtures — the identifier of the reference clip. Read it before you run anything, because half the value of a fixture is knowing exactly what was done to it.

    • Browse /video for the whole set, or a /for/… purpose page to narrow by job.
    • The spec sheet names the codec, pixel format, cadence, and reference clip.
  2. 2

    2. Compare codecs and containers without confounding the test

    The codec set is deliberately controlled. Fourteen codecs cover the common and the awkward, seven pixel formats cover subsampling and bit depth, and — the part that matters most — seven containers are stream-copied from a single encode rather than re-encoded per container. Only the wrapper differs. If your tool handles the MP4 and fails on the MKV, the problem is unambiguously container handling, because the video bitstream inside them is byte-identical.

    Around that sit the variations that break players and transcoders in practice: GOP length and B-frame structure, faststart versus not, fragmented MP4, interlaced content, rotation metadata that a naive player ignores, and VP9 with an alpha channel. That last one is worth a warning, because probing it wrongly is the expected mistake — WebM stores VP9 alpha in a block-additional element signalled by a flag, and some decoders ignore it and report an opaque pixel format. The fixture documents this so a false alarm does not cost you an afternoon.

    • Seven containers stream-copied from one encode: a container bug cannot hide behind a re-encode.
    • Fourteen codecs, seven pixel formats, plus GOP, B-frame, faststart, fMP4, interlace, and rotation variants.
    • VP9 alpha in WebM, with the common mis-probe documented on the fixture itself.
  3. 3

    3. Point a player at a real streaming package

    Streaming fixtures come in two shapes. Some are parser-only manifests — an HLS playlist or a DASH MPD you feed to a manifest parser without needing the media to exist. Others are complete, playable packages: the manifest, the initialisation segment, and the media segments, ready for an actual player.

    For those to work in a browser player they have to be fetchable cross-origin, so streaming fixtures are the single documented exception to the library's download-only rule: they are served inline with permissive CORS, and Safari gets a correct MIME type for the .m3u8. Everything else about the sandboxing stays in place. The practical upshot is that you can paste a manifest URL into your player and it will load, rather than downloading a file you then have to serve yourself.

    Ad-signalling fixtures sit alongside them — VAST, VMAP, and SCTE-35 — for testing an insertion pipeline reads the markers rather than skipping past them.

    • Playable HLS and DASH packages, plus manifest-only fixtures for parser tests.
    • Served inline with CORS so an external player can fetch them directly.
    • VAST, VMAP, and SCTE-35 fixtures for ad-insertion testing.
  4. 4

    4. Break your caption parser on purpose

    Caption bugs are almost always encoding bugs, and almost never reproduce on the tidy UTF-8 file a developer tests with. The timed-text set exists to supply the untidy ones: UTF-8 with and without a byte-order mark, UTF-16 in both byte orders, CRLF and LF and files that mix the two, cp1252, and scripts that expose assumptions — CJK, Arabic, Hebrew, Cyrillic, and emoji. SCC fixtures carry computed odd parity rather than plausible-looking bytes, so a parser that ignores parity is caught.

    There is also a set of intentionally-corrupt captions, which are the fixtures worth keeping in a regression suite. A caption parser that throws on a malformed cue is fine; one that silently drops it and renders a video with missing subtitles is the failure you want to catch before a viewer does.

    • Encodings, BOMs, and line endings that real caption files actually arrive with.
    • SRT, WebVTT, ASS/SSA, TTML, and DFXP, plus SCC with real parity.
    • Intentionally-corrupt captions for the silent-drop failure mode.
  5. 5

    5. Test accessibility on tracks that are genuinely tagged

    A multi-track fixture is only useful if the tracks are actually labelled, and this is where most hand-made test files fall short: the language tags are placeholders and the dispositions are unset, so a player that ignores them passes. The accessibility fixtures set them for real — language tags on each subtitle and audio track, and default, forced, hearing-impaired, visual-impaired, and comment dispositions applied where they belong.

    That lets you test the behaviours that matter to a viewer who needs them: does your player select the forced track for foreign dialogue without being asked, does it offer the SDH subtitle track distinctly from the ordinary one, and does it surface the audio-description track at all. Chapter fixtures in six formats and container-metadata fixtures cover the surrounding metadata handling.

    • Real language tags and default/forced/SDH/audio-description dispositions.
    • Chapters in six formats, container tags, cover art, and timecode.
  6. 6

    6. Score AI-video output against the ground truth

    This is the part that turns the set from a pile of clips into a measurement tool. For ten AI-video tasks, each degraded input names a pristine clip it was derived from: a downscaled clip for upscaling, a noisy one for denoise, a frame-decimated one for interpolation, a desaturated one for colourisation, a shaky one for stabilisation, a heavily compressed one for restoration, and per-frame alpha or mask ground truth for matting and segmentation.

    Run the degraded clip through your model, then compare the output to the reference rather than to your impression of it. The encodes are two-tier by design — ground truths are encoded at a higher quality than the inputs — so the measurement floor sits below the thing you are measuring, and codec artefacts in the reference do not become the limit of what you can detect.

    A practical caution: match the fixture to the claim you are testing. An upscaler evaluated only on a clean downscale will look better than it is, because real footage arrives with compression damage as well as missing resolution. Reach for the restoration fixtures too if that is what your users will feed it.

    • Ten task suites, each pairing a degraded input to its own ground truth.
    • Two-tier encoding keeps the reference cleaner than the input under test.
    • Test on the damage your users actually have, not only the cleanest degradation.
  7. 7

    7. Keep a small video suite in regression

    You do not need many. A container pair to catch wrapper handling, one caption file with an awkward encoding, one intentionally-corrupt container, one streaming package, and one ground-truth pair for whatever your pipeline claims to improve will catch most of what breaks.

    Because everything is generated deterministically, the same fixture is byte-identical every time you download it. A newly failing test means your code changed, not that the fixture did — which is the property that makes a regression suite worth having at all. The reference at Read a spec sheet and use what it tells you covers reading the properties, and Test with clean and noisy pairs covers the paired-fixture pattern in general.

A reference clip turns an opinion into a measurement

The single most useful property of the video set is that degraded clips name the pristine clip they came from, so model output can be scored rather than eyeballed. Beyond that, prefer the controlled comparisons — one encode across seven containers isolates container handling; a caption file with a BOM isolates encoding handling. And keep the intentionally-corrupt fixtures in your suite, because the dangerous video failures are the silent ones.

Frequently asked questions

Quick answers to common questions about this topic.

How many video fixtures are there?

401, up from 70. They cover codecs, containers and pixel formats, playable HLS and DASH packages, captions and subtitles across encodings, multi-track accessibility fixtures, chapters and container metadata, intentionally-corrupt containers, and ten AI-video task suites where degraded clips are paired with ground truth.

What does "paired with ground truth" mean?

Each degraded clip records the identifier of the pristine clip it was derived from, and the two share a group so you can find each other from either side. Instead of judging whether an upscaler output looks better, you compare it to the original it was downscaled from and get a number.

Can I load the HLS and DASH fixtures in a browser player?

Yes. Streaming fixtures are the one documented exception to the download-only rule: they are served inline with permissive CORS so an external player can fetch the manifest and its segments cross-origin, and Safari receives a correct MIME type for .m3u8. Only the attachment header is dropped for that path — the sandbox CSP and nosniff protections stay.

Why do seven containers share one encode?

So that only the wrapper differs. If each container had been encoded separately, a failure could be caused by the codec settings rather than the container, and the test would prove nothing. Stream-copying one encode into seven containers makes container handling the only variable.

Are there deliberately broken video files?

Yes — intentionally-corrupt captions and intentionally-corrupt containers. They matter because the dangerous video failure is silent: a parser that drops a malformed cue and renders a video with missing subtitles is worse than one that throws.