Skip to content

Google Ad Manager AV1 Video Warning (DV360)

Investigation started 2026-08-18. Status: warning persists, but creative is approved and serving.

The Problem

Two creatives with video (Insidious campaign, 320x400) bought programmatically by OMD via DV360 show a "Video ad requirements" warning in DV360's creative review: "Ads that violate Google's policies aren't allowed and won't run."

Affected creatives:

  • https://my.cavai.com/creatives/51784-53814-55643-95722/build#design
  • https://my.cavai.com/creatives/51784-53814-55646-95724/build#design

Two URLs flagged as problematic:

  • https://delivery-6.cavai.com/4613267d-df10-4d49-88d0-0e0cf330da6f/audio/init.mp4
  • https://delivery-6.cavai.com/4613267d-df10-4d49-88d0-0e0cf330da6f/av1_240p/init.mp4

Both are DASH streaming initialization segments. The first is a separate audio track, the second is an AV1-encoded video track. Google found these through "automated checks" (decision type: "Google investigation").

Exchange status in DV360

ExchangeIDStatusFeedbackLast sync
Google Ad Manager742894974Approved (green)"Video ad requirements" warning with problematic URLsN/A
Microsoft Monetize770902979Approved (SSL)NoneAug 17, 2026 3:17 PM

Actual delivery behavior

  • The warning appears ONLY on the Google Ad Manager exchange, not Microsoft Monetize
  • Despite the warning, the creative IS approved on both exchanges
  • Impressions ARE being delivered on publishers with GAM as adserver
  • Preview works fine on VG (publisher site)
  • Unknown: Whether DV360 throttles bidding or excludes certain GAM inventory because of this warning. The warning might reduce reach even though status says "Approved."

Timeline (from Kai Lu, 2026-08-18)

  • Kai reported the warning to Nicolay
  • Nicolay confirmed streaming was recently enabled for all videos >= 4 seconds (3-4 months ago, no issues until now)
  • Streaming was toggled OFF on the creative and republished
  • Warning persists after republish -- Google has not re-scanned or the warning is sticky

The Creative

  • Creative ID path: 51784-53814-55643-95722
  • Stream ID: 4613267d-df10-4d49-88d0-0e0cf330da6f
  • Video file: INSIDIOUS6_TWOWEEKS_ANIM_1_1.mp4
  • Duration: 4.167 seconds (just over 4 sec)
  • Resolution: 1200x1500 (portrait, 0.8 aspect ratio)
  • Has a ChangeVideo operator in the flow
  • Has a custom script that plays the video and pauses on last frame

What We Tested

1. Streaming is OFF in the creative

The builder shows streaming: false and forceStreaming: false on the video block. The Streaming toggle in the Playback section is off.

2. Standalone preview confirms no streaming

Network tab in standalone preview (/banner/{hash}) shows:

  • Only ONE media request: https://delivery-6.cavai.com/.../original (direct MP4, 5.6 MB, status 206)
  • No DASH segments (no init.mp4, no video*.m4s, no audio/*.m4a)
  • The creative does NOT stream at runtime

3. H264 playlist exists and works

https://delivery-6.cavai.com/4613267d-df10-4d49-88d0-0e0cf330da6f/playlist_h264.m3u8 returns a valid playlist (verified in browser).

4. PR #1929 is unrelated

That PR fixes an infinite loop bug in ChangeImageOp/ChangeVideoOp (cycle detection with visited Set). No streaming changes.

5. Recent backend changes are unrelated

The recent backend commits (pulled 2026-08-18) are analytics/export work: DailyExportService, DuckDB, CSV streaming. No video/streaming changes.

Root Cause Analysis

The creative JSON embeds a streamData object containing all available video tracks from Bunny CDN, including AV1 tracks:

json
"streamData": {
  "baseUrl": "https://delivery-6.cavai.com/4613267d-...",
  "audio": {
    "codecs": "mp4a.40.2",
    "init": "init.mp4",
    "media": "audio$Number$.m4a"
  },
  "video": [
    { "codecs": "av01.0.00M.10.0.110.01.01.01", "init": "av1_240p/init.mp4" },
    { "codecs": "av01.0.04M.10.0.110.01.01.01", "init": "av1_360p/init.mp4" },
    { "codecs": "avc1.64000d", "init": "240p/init.mp4" },
    { "codecs": "av01.0.04M.10.0.110.01.01.01", "init": "av1_480p/init.mp4" },
    { "codecs": "avc1.64001e", "init": "360p/init.mp4" },
    ...
  ]
}

Even with streaming disabled, this data is embedded in the published creative. Google's scanner likely either:

  1. Static analysis: Scans the creative's JS/JSON for video URLs and flags AV1 content
  2. Previous scan: The creative may have been published with streaming ON previously, Google scanned it then and saw the AV1 DASH requests, and the rejection persists

Why AV1 specifically is a problem

The minimal-video player (@cavai/minimal-video, source in CE node_modules) has AV1 preference logic:

ts
// player.ts lines 226-242
const hasAv1 = stream.video.find(v => v.codecs.startsWith('av01'))
if (hasAv1 && canPlayType('av01.0.05M.08') === 'probably') {
  // Filter out ALL non-AV1 codecs - only use AV1
  stream.video = stream.video.filter(v => v.codecs.startsWith('av01'))
}

On Chrome (which Google's scanner uses), AV1 is supported, so the player would exclusively use AV1 tracks. Google Ad Manager likely doesn't approve AV1 for video ads.

Audio Track Investigation

The original video file (INSIDIOUS6_TWOWEEKS_ANIM_1_1.mp4) has a silent audio track:

Video: H.264, 1200x1500, 15.5 Mbps, 4.167s
Audio: AAC, 2 channels, 316 kbps, 4.167s
  mean_volume: -91.0 dB (effectively silent)
  max_volume:  -91.0 dB

This silent audio track is why Bunny CDN generates a separate audio/init.mp4 DASH segment. Google flags it as problematic.

Test: re-upload without audio

Stripped the audio track with ffmpeg (-an -c:v copy) and saved as original_no_audio.mp4 (7.9 MB, video-only). Nicolay will re-upload this to the creative and republish.

Expected outcome: Bunny CDN won't generate audio DASH segments, removing audio/init.mp4 from the equation. If the AV1 warning also clears, the silent audio was the root trigger for Google's scan flagging the entire stream.

Status: Pending -- awaiting re-upload and DV360 re-scan.

What to Try Next

Immediate

  1. Re-upload video without audio track (file ready: ~/Downloads/original_no_audio.mp4)
  2. Republish creative
  3. Wait for DV360 re-scan and check if warning clears

If warning persists (AV1 still flagged)

The streamData with AV1 URLs is still in the published JSON even with streaming off. Options:

  • Strip streamData on publish when streaming === false -- since it's never used at runtime, no reason to include it. This would be a backend or AF change at publish time.
  • Strip AV1 tracks from streamData always -- filter out av01 entries from streamData.video when saving. This removes the problematic URLs from the creative payload entirely.
  • Strip AV1 tracks in StreamParser.ts -- filter at the backend level when parsing Bunny's HLS playlist, so AV1 never enters streamData in the first place.

Systemic improvement

Consider generating playlist_h264.m3u8 automatically on video upload rather than requiring a manual API call (POST /videos/:streamId/generate_h264_playlist). This ensures H264-only playlists always exist for VAST tag compatibility.

Key Code Locations

WhatWhere
VAST tag generatorAF/src/utils/TagGenerator.ts (lines 265-306)
Streaming playerCE/node_modules/@cavai/minimal-video/player.ts
AV1 preference logicplayer.ts lines 226-242
Video block componentCE/src/components/creative/CreativeVideoBlock/CreativeVideoBlock.vue
H264 playlist generatorAB/app/Services/Bunny.ts generateH264Playlist() (lines 379-423)
Stream parserAB/app/Services/StreamParser.ts
Video block typesAF/src/pages/Chatbots/components/BuilderVisuals/Blocks/data/types.ts
  • video-system-overview.md -- general video architecture
  • vast-tag-generation.md -- VAST tag details
  • video-playback-engine.md -- playback engine details
  • av1-android-issue.md -- previous AV1 compatibility issue

Internal documentation