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.
Describe your placement
Section titled “Describe your placement”Everything FreeWheel needs to pick ads for a stream goes into one
FreewheelConfig — the values come from your MRM account:
| Field | What it is |
|---|---|
serverUrl | your network’s ad server, e.g. https://<network>.v.fwmrm.net |
networkId | your MRM network id |
profile | the player profile, usually <networkId>:<name>, one per platform |
siteSectionId | this player’s placement as registered in MRM |
videoAssetId | the content’s id as ingested in MRM (the ad rules attach to it) |
videoDurationMs | the asset’s exact duration, so midroll positions resolve |
globalParameters | your 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.
Choose an integration
Section titled “Choose an integration”The same FreewheelConfig drives either of two integrations — pick per
player:
- 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”.
- 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())let fw = FreewheelConfig( serverURL: "https://<network>.v.fwmrm.net", networkId: 12345, profile: "12345:my_ios_profile", siteSectionId: "my_app", videoAssetId: "asset_1", videoDurationMs: 1_483_000)
// 1 · native FreeWheel SDK — copy the FWAdsProvider adapter into your app,// next to your licensed AdManager.framework:player.adsProvider = FWAdsProvider()
var item = OGMediaItem(urlString: url)!item.adBreaks = fwplayer.load(item)const fw = { serverUrl: "https://<network>.v.fwmrm.net", networkId: 12345, profile: "12345:my_html5_profile", siteSectionId: "my_site", videoAssetId: "asset_1", videoDurationMs: 1_483_000, globalParameters: { _fw_gdpr: "1", _fw_gdpr_consent: consent },};
// 1 · native FreeWheel SDK (AdManager.js, loaded from FW's CDN):player.adsProvider = new FreewheelAdsProvider();
// 2 · or FW-as-VMAP through IMA (no FW SDK at all):player.adsProvider = new ImaAdsProvider({ vpaidMode: "insecure" });
// same config either way:player.load({ url, adBreaks: fw });Whichever integration you choose, your app observes the same AdListener
callbacks and the viewer sees the same OGPlayer ad chrome.
What FreeWheel integrators must know
Section titled “What FreeWheel integrators must know”- 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-freewheelfrom Maven Central) — but it contains none of FreeWheel’s code. Android: add your ownFWAdManager.aarto the app (7.12.x line). iOS: copy the source adapter from the package repo (Adapters/FreeWheel) into your app, next to your licensedAdManager.framework. Web:AdManager.jsloads at runtime from FreeWheel’s CDN. - FreeWheel’s
flagandrespvalues are space-separated. Pass real spaces (" play sltp emcr…"); they become the+signs you see in FW request URLs. - Casting ends a slot-ad session (Android) — ads don’t follow onto the TV.
- Postrolls play after
ENDED. The true end-of-everything signal isPlaybackListener.onPlaybackCompleted, which waits for postrolls. - 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.