ADS

To use ads you need to configure AVDoris properly

let playerViewController = AVPlayerViewController()

let adsOverlayView = UIView()
let adsConfig = DorisAdsConfig(adContainerVC: playerViewController, adContainerView: adsOverlayView)
let dorisConfig = AVDorisConfig(uiType: .native(playerViewController: playerViewController), playerConfig: .default, adsConfig: adsConfig)

avDoris = AVDorisFactory.create(player: AVPlayer(), config: dorisConfig, output: self)

Note

You have to manage adsOverlayView visibility based on DorisAdsEvent

CSAI (Client-side ads)

VOD Example(VMAP or VAST adTagUrl)

let adURL = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ar%3Dpreonly&cmsid=496&vid=short_onecue&correlator="
let contentURL = URL(string: "https://storage.googleapis.com/gvabox/media/samples/stock.mp4")!

let streamType = DorisCSAIImaStreamType.vod(contentURL, adUrl: adURL)
let csaiProvider = DorisCSAIProvider.ima(streamType)
let sourceType = DorisSourceType.csai(csaiProvider)

let source = DorisSource(type: sourceType)

avDoris.load(source: source)

LIVE Example(only VAST adTagUrl)

let vastAdURL = "https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_preroll_skippable&sz=640x480&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator="
let contentURL = URL(string: "https://cph-p2p-msl.akamaized.net/hls/live/2000341/test/master.m3u8")!

//if your Live stream has SCTE markers that indicates where to play ads, you can also set any vastAdURL as midrollUrl
let streamType = DorisCSAIImaStreamType.live(contentURL, prerollUrl: vastAdURL, midrollUrl: nil)
let csaiProvider = DorisCSAIProvider.ima(streamType)
let sourceType = DorisSourceType.csai(csaiProvider)

let source = DorisSource(type: sourceType)

avDoris.load(source: source)

Note

content of Live stream will play in background muted when ads are playing

SSAI (Server-side ads)

Yospace SSAI Provider (VOD)
let yospaceStreamUrlString = ""
let streamType = DorisSSAIYospaceStreamType.vod(url: yospaceStreamUrlString)
let ssaiProvider = DorisSSAIProvider.yospace(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)

let source = DorisSource(type: sourceType)

avDoris.load(source: source)
Yospace SSAI Provider (LIVE)
let yospaceStreamUrlString = ""
let streamType = DorisSSAIYospaceStreamType.dvrLive(url: yospaceStreamUrlString)
let ssaiProvider = DorisSSAIProvider.yospace(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)

let source = DorisSource(type: sourceType)

avDoris.load(source: source)
Google IMA SSAI Provider (VOD)
let imaSSAIVODData = DorisImaVODData(contentSourceId: "2528370", videoId: "tears-of-steel", authToken: nil, adTagParameters: nil)
let streamType = DorisSSAIImaStreamType.vod(imaSSAIVODData)
let ssaiProvider = DorisSSAIProvider.ima(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)

let source = DorisSource(type: sourceType)

avDoris.load(source: source)
Google IMA SSAI Provider (LIVE)
let imaSSAIData = DorisImaLiveData(assetKey: "sN_IYUG8STe1ZzhIIE_ksA", authToken: nil, adTagParameters: nil, adTagParametersValidFrom: .distantPast, adTagParametersValidUntil: .distantFuture)
let streamType = DorisSSAIImaStreamType.live(imaSSAIData)
let ssaiProvider = DorisSSAIProvider.ima(streamType)
let sourceType = DorisSourceType.ssai(ssaiProvider)

let source = DorisSource(type: sourceType)

avDoris.load(source: source)
IMA SSAI (LIVE) Ad tag parameters

AVDoris ships with an automated solution to invalidate and request up-to-date ad tag parameters for live IMA streams. The default ad tag parameters can be provided initially for DorisImaLiveData

AdTagParameters Example:

let adTagParameters = [
    // Provide key value pairs.
    "iu": "/network_id/directory/ad_unit",
    "ppid": "12JD92JD8078S8J29SDOAKC0EF230337",

    // Custom parameters can also be provided as a nested dictionary.
    // The player will serialize these in the required format.
    "cust_params": [
        "neighborhood": "drama"
        "row": "indienovelas"
    ]
]

Note

Only String values, and [String : String] (for cust_params) are accepted. Invalid values will be omitted from the stream request.

To enable automatic ad tag parameter invalidation, provide the a time range adTagParametersValidFrom and adTagParametersValidUntil for which the parameters are valid. If nil is provided for this values it is considered by AVDoris that initial parameters are permanently valid during stream playback

When the ad tag parameters expire, AVDoris will request new parameters through it’s delegate callback.

If the ad tag parameters are requested as a result of a seek, the seek operation will be suspended until valid parameters are provided.

extension ViewController: DorisPlayerOutputProtocol {
    func onAdvertisementEvent(_ event: DorisAdsEvent) {
        switch event {
        case .adTagParametersRequired(let data): 
        // Date provided for which ad parameters are requested.
        let date = data.date

        // Provide new ad tag parameters
        avdoris.replaceAdTagParameters(
            adTagParameters: [:],
            validFrom: date.addingTimeInterval(-30),
            validUntil: date.addingTimeInterval(+30))
        default: return
        }
    }
}

ADS events

You can handle ads related events by confirming to DorisPlayerOutputProtocol

extension ViewController: DorisPlayerOutputProtocol {
    func onAdvertisementEvent(_ event: AVDoris.DorisAdsEvent) {
        switch event {
        case .adBreakStarted(let adBreak, let pendingSeekPosition): break
        case .adBreakEnded(let adBreakEndedData): break        
        case .adProgressChanged(let adProgressChangedData): break
        default: break
        }
    }
}

Note all possible events can be found here DorisAdsEvent

Doris