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