VASTlint

Mezzanine: the source file behind CTV ad quality

A mezzanine file is the mastering-quality version of a video creative: full resolution, minimally compressed, far too large to stream to a viewer. It exists to be transcoded from. The <Mezzanine> element, added in VAST 4.0, carries the URL of that file inside <MediaFiles> so that server-side platforms can build their renditions from a clean source.

Why stitchers need a mezzanine

In server-side ad insertion, the stitcher must match the ad to the content stream exactly: same resolutions, same bitrate ladder, same codec profile, same segment timing. Whatever renditions the advertiser shipped almost never match, so the stitcher transcodes.

Transcoding from a compressed 720p <MediaFile> means recompressing an already lossy asset: a generational quality loss that shows up on a living-room screen as a visibly softer, blockier ad right after pristine content. Broadcast delivery solved this decades ago by always cutting from masters. The Mezzanine element is that practice expressed in VAST: give the server the master, let it cut every rendition it needs.

Anatomy of the element

Mezzanine sits inside <MediaFiles> next to the playable <MediaFile> renditions:

<MediaFiles>
  <!-- Transcode source: consumed by stitchers, never played -->
  <Mezzanine delivery="progressive" type="video/mp4" width="3840" height="2160"
             codec="h264" fileSize="1580000000" mediaType="video">
    <![CDATA[https://cdn.example.com/masters/spot-30s-uhd-master.mp4]]>
  </Mezzanine>

  <!-- Playable renditions: consumed by players -->
  <MediaFile delivery="progressive" type="video/mp4" width="1920" height="1080" bitrate="8000">
    <![CDATA[https://cdn.example.com/renditions/spot-30s-1080p.mp4]]>
  </MediaFile>
  <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720" bitrate="4000">
    <![CDATA[https://cdn.example.com/renditions/spot-30s-720p.mp4]]>
  </MediaFile>
</MediaFiles>

VAST XML fragment only. This excerpt belongs inside a complete VAST document, so standalone validation will fail until it is wrapped in a full <VAST>response.

  • VAST 4.0: the element is a bare URI with no attributes.
  • VAST 4.1+: adds delivery, type, width, height, codec, id, fileSize, and mediaType, so a pipeline can decide whether the asset qualifies before pulling gigabytes off a CDN.
  • Quality expectations: the spec does not mandate a codec, but the asset should be mastering-grade: source resolution (commonly 1080p or UHD), high bitrate, minimal compression. A re-labeled playback rendition defeats the purpose.

What fails when the mezzanine is missing

  • Stitch-time rejection. SSAI platforms with quality floors reject creatives that offer no transcode source, and the slot refills or goes empty.
  • Silent quality degradation. Platforms without floors transcode from the best available MediaFile, and the ad airs soft next to broadcast-quality content. Nothing errors; the brand just looks worse than the show.
  • Version downgrades strip it. Mezzanine does not exist before VAST 4.0, so a tag re-rendered to 2.0 or 3.0 for compatibility loses the element entirely. The version mismatch post covers why that happens without anyone noticing.
  • Players trying to play it. A misbehaving player that picks the mezzanine as a rendition will stall on a file never meant to stream. Correct players ignore Mezzanine during rendition selection.

Does vastlint validate Mezzanine?

Yes. vastlint checks the element's placement inside <MediaFiles>, version-appropriate structure and attributes, URI validity, and media-type coherence, and flags 4.x-only elements declared under older versions. See the rules reference.

Check whether your CTV tags ship a usable transcode source.Open the VAST tag validator →

Further reading