Skip to content

FreeWheel ads

FreeWheel (Comcast’s ad platform, also known as MRM) is the ad server used by many large broadcasters and premium publishers. It’s a licensed, account-based service: your FreeWheel account manager provisions your network, and there are no public test tags.

Use this guide if your organization serves ads through FreeWheel. If you use Google Ad Manager or any plain VAST/VMAP ad server, you want the Google IMA guide instead.

Everything FreeWheel needs to pick ads for a stream goes into one FreewheelConfig — the values come from your MRM account:

FieldWhat it is
serverUrlyour network’s ad server, e.g. https://<network>.v.fwmrm.net
networkIdyour MRM network id
profilethe player profile, usually <networkId>:<name>, one per platform
siteSectionIdthis player’s placement as registered in MRM
videoAssetIdthe content’s id as ingested in MRM (the ad rules attach to it)
videoDurationMsthe asset’s exact duration, so midroll positions resolve
globalParametersyour consent / identity / targeting key-values, passed verbatim

Consent is always yours to supply (_fw_gdpr, _fw_gdpr_consent, device identifiers…) — the SDK never fabricates it; it adds only fresh pvrn/vprn request randomizers.

The same FreewheelConfig drives either of two integrations — pick per player:

  1. Native FreeWheel SDK — FreeWheel’s own client SDK makes the ad request and plays its slot schedule. On Android and iOS, OGPlayer draws all ad UI here, including the Skip button (with countdown) and “Learn more”.
  2. FreeWheel server as VMAP through IMA — no FreeWheel SDK dependency at all: the FW server answers with standard VMAP, and OGPlayer’s IMA provider plays it like any other tag.
val fw = FreewheelConfig.Builder(
serverUrl = "https://<network>.v.fwmrm.net",
networkId = 12345, profile = "12345:my_android_profile",
siteSectionId = "my_app", videoAssetId = "asset_1",
videoDurationMs = 1_483_000,
).setGlobalParameters(mapOf("_fw_gdpr" to "1", "_fw_gdpr_consent" to consent))
.build()
// 1 · native FreeWheel SDK:
val player = OGPlayer.Builder(context)
.setAdsProvider(FreewheelAdsProvider(activity))
.build()
player.load(OGMediaItem.Builder(url).setAdBreaks(fw).build())

Whichever integration you choose, your app observes the same AdListener callbacks and the viewer sees the same OGPlayer ad chrome.

  1. The FreeWheel SDK is customer-licensed and never bundled with OGPlayer. OGPlayer’s own adapter installs like any other module (Android: tv.ogplayer:ogplayer-ads-freewheel from Maven Central) — but it contains none of FreeWheel’s code. Android: add your own FWAdManager.aar to the app (7.12.x line). iOS: copy the source adapter from the package repo (Adapters/FreeWheel) into your app, next to your licensed AdManager.framework. Web: AdManager.js loads at runtime from FreeWheel’s CDN.
  2. FreeWheel’s flag and resp values are space-separated. Pass real spaces (" play sltp emcr…"); they become the + signs you see in FW request URLs.
  3. Casting ends a slot-ad session (Android) — ads don’t follow onto the TV.
  4. Postrolls play after ENDED. The true end-of-everything signal is PlaybackListener.onPlaybackCompleted, which waits for postrolls.
  5. The demo screens need your values. Because there are no public FreeWheel test tags, the demo apps show a “FreeWheel setup needed” notice until you fill in your own network’s configuration.