DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

A Pause NonLinear MP4 Without Duration Validates. Quartile Beacons Never Schedule.

A streaming app launches pause inventory for the first time. The VAST tag validates. The frozen frame fills with a fifteen-second MP4. The buyer's dashboard shows delivered impressions.

Nobody sees midpoint or thirdQuartile in the verification feed. The trafficking sheet still lists quartile pixels because the DSP copied them from a preroll template. The player had no <Duration> to divide against, so it never scheduled those beacons.

This is not a broken CDN URL. It is the gap between what the CTV Ad Portfolio added to NonLinear delivery and what older pause tags assumed when pause meant a JPEG with no clock.

Optional on paper, required for video measurement

Before the portfolio work, many pause units were a <NonLinear> with a <StaticResource> image. Duration was genuinely unknown at response time. IAB's signaling guidance still allows omitting <Duration> when the creative is a static image whose on-screen time depends on how long the viewer stays paused.

Portfolio formats changed the payload. Pause, overlay, and several squeezeback layouts now ship <MediaFiles> with MP4 renditions the same way linear pods always have. Quartile events, overlayViewDuration, and skip-style timers all need a declared length on the NonLinear node.

The XSD does not always force that length. A <NonLinear> can contain a video/mp4 <MediaFile> and no sibling <Duration>. Schema validation returns OK. The AdCOM extensions can still echo plcmt=5 for Pause with legal playbackmethod 8 or 9.

Players behave differently once video is involved. Some infer duration from the container after download. Many CTV SDKs do not, because inferring length post-load would fire tracking late or twice. They treat missing Duration as "no timed events for this overlay," play the file, and move on.

What the creative subtree actually promises

plcmt in <Extension ext="adcom"> (or inside <Extension type="ctv_ad_portfolio"> on VAST 2.0) names which portfolio format was bought: 5 Pause, 6 Screensaver, 7 Overlay, 8 Squeezeback, 9 In-Scene. It does not tell the player how long to wait before firing midpoint.

<NonLinearAds> / <NonLinear> is the render contract. Portfolio guidance routes five of six formats through this branch. A linear <Creative> with the same extensions is a different failure mode: the player reads Linear, not plcmt.

<Duration> on the NonLinear element is the clock for overlay-style measurement. VAST expects HH:MM:SS or HH:MM:SS.mmm, the same lexical form as linear ads. Without it, <Tracking event="midpoint"> URLs may exist in the XML and never execute.

<MediaFile type="video/..."> under NonLinear means the player should treat the unit as timed media, not a static plate. That is the combination rule VAST-4.4-nonlinear-video-no-duration targets: video media present, Duration absent.

Static JPEG pause paths can still omit Duration by design. The bug shows up when teams reuse linear trafficking exports: they paste quartile tracking from instream, drop the MP4 into NonLinear <MediaFiles>, and delete <Duration> because the old image-based pause tag never needed it.

How I catch it before the verification vendor does

I start with the live ad tag in the VAST tag tester. Paste the ad server URL or the XML. The tester fetches wrappers, previews the media the player would choose, and lists tracking events on the resolved creative. If the preview shows a progress bar but the NonLinear node has no Duration in the source, quartile URLs are decorative.

Wrapped pause tags are common. Run the same URL through the VAST inspector to see which hop introduces the NonLinear MP4 and whether an upstream wrapper stripped Duration while copying <MediaFiles>.

For interactive pause units, the IAB-style VAST tester loads SIMID sample creatives and logs the player handshake. That workbench is an independent fork, not an IAB Tech Lab product, but it helps separate "SIMID never loaded" from "video played without timed tracking."

After preview, run vastlint check on the resolved InLine. The CTV Ad Portfolio rulepack flags VAST-4.4-nonlinear-video-no-duration when a video <MediaFile> sits under <NonLinear> without <Duration>. An implementation that lets a model emit VAST still has to run that check: the RPC or trafficking export can return OK while the wire contract omits the clock. vastlint is the package that owns this payload (cargo install vastlint, npm install vastlint). It is independent of IAB Tech Lab and of AAO; the spec does not require it, but it is the deterministic check on the XML the buy claimed.

Where to read the format rules

The CTV Ad Portfolio pack page maps each format to plcmt, pos, and playbackmethod, and shows whether delivery is NonLinear or Native Menu.

The pause ads guide walks a correct NonLinear structure: MediaFiles, Duration, and the 8/9 playbackmethod pair for sound on or off.

The 4.3 to 4.4 migration notes explain why NonLinear gained MediaFiles and why portfolio examples still declare version="4.2" while using the new content model.

Rule doc VAST-4.4-nonlinear-video-no-duration cites the portfolio guidance section on handling duration: optional for unknown static images, load-bearing once video MediaFiles are in the NonLinear.

If you are comparing schema-only validation against the July 2026 portfolio drop, the draft 4.4 schema write-up separates XSD findings from finalized signaling rules so you do not treat draft warnings as production blockers.

What I change in trafficking

When the pause or overlay unit is video, I add <Duration> next to the NonLinear <MediaFiles> block and match it to the longest declared rendition, not to the slot length on the media plan. I keep quartile tracking only when Duration is present; otherwise I drop those events or switch to overlayViewDuration with a player that documents how it fires without quartiles.

I do not assume SSAI will infer duration from mezzanine or progressive MP4 on the stitcher side. Stitchers often pass NonLinear through unchanged; if Duration was missing at ingest, it is still missing on the device.

Treat static and video pause tags as two templates. The same plcmt value does not mean the same tracking contract once <MediaFile type="video/mp4"> appears under NonLinear.

Top comments (0)