Changes between Version 1 and Version 2 of OvaReleaseNote-0.5.0-RC5


Ignore:
Timestamp:
08/20/11 16:59:39 (21 months ago)
Author:
paul
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OvaReleaseNote-0.5.0-RC5

    v1 v2  
    1 Text goes here 
     1[[TracNav(OVATOC)]] 
     2 
     3= What's New? (Release Candidate 5) = 
     4 
     5The following versions have been issued as "release candidates". 
     6 
     7   * '''OVA for AS3''' v0.6.0 RC5 
     8   * '''OVA for JW Player 4''' v0.5.0 RC5 
     9   * '''OVA for JW Player 5''' v0.5.0 RC5 
     10   * '''OVA for Flowplayer''' v0.6.0 RC5 
     11 
     12The following API changes have occurred in this release: 
     13 
     14   * The javascript callback events - `onVASTLoadSuccess()`, `onVASTLoadFailure()`, `onVASTLoadTimeout()` have been renamed to `onTemplateLoadSuccess()`, `onTemplateLoadFailure()`, `onTemplateLoadTimeout()` 
     15   * `onTemplateLoadDeferred()` has been added as part of the support for "on demand" loading of ad slots 
     16 
     17The following functional changes are in this release: 
     18 
     19   * VAST 2 wrapper support 
     20   * VPAID 1.1 Linear Ad support (JW only. Flowplayer support will be in the next RC along with non-linear VPAID support) 
     21   * An ability to configure a "Skip Ad" button 
     22   * Dramatically simplified configuration for pre-roll only setups 
     23   * Support for the specification of 'fail-over' ad servers 
     24   * The OVA for AS3 SWC has been renamed to 'ova-as3-<version>.swc' 
     25   * Deferred loading of ads via the 'delayAdRequestUntilPlay' option 
     26   * A "cache-buster" parameter is can be added to the end of wrapped VAST ad requests (config driven) 
     27   * Finer grain control when disabling the control bar during linear ad playback 
     28   * Support added for a range of new ad tag variables - e.g. "__page-url__" etc. 
     29   * Several ad server examples added: 
     30      * AdForm - VAST 2 Linear 
     31      * Lightningcast - VAST 1 Linear 
     32      * Adap.tv - VAST 2 Linear 
     33      * Spotxchange - VAST 2 Linear 
     34      * Smartclip - VAST 1 Linear and VAST 2 VPAID Linear 
     35      * Telemetry - VAST 1 and 2 VPAID Linear 
     36      * TidalTV - VAST 2 VPAID Linear 
     37      * Liverail VPAID Linear 
     38      * Eyewonder VPAID Linear 
     39      * Mov.ad VPAID Linear 
     40      * Adotube VAST2 Linear/Non-Linear and VPAID Linear/Non-Linear 
     41      * OpenX V3 (Hosted) - See section 21 
     42   * Show clips can now have the duration forcibly set via a shows "setDurationFromMetaData" config option 
     43   * Completely rewritten logic for setting the show stream based on the meta data - fixes pseudo-streaming control bar issues 
     44   * Media files can be excluded from a VAST response based on mime type 
     45   * Ticket 226 - Critical Timestamp.secondsToTimestamp() fix - was producing invalid timestamp for times greater than 60 mins 
     46   * Support for new Media, Player width/height and AS version based dynamic ad tag variables 
     47   * Added onLinearAdSkipped() Javascript callback method - this is triggered when the user skips an ad via the skip ad button 
     48   * Resolved a parsing issue with international characters in ad notice definitions by replacing the JSwoof JSON parser used in OVA for JW Player 4 & 5 with the standard Adobe parser 
     49   * Ensured that a "allowScriptAccess" param tag is used when a companion SWF is inserted into a page 
     50   * Added support for custom impression tracking using Google Analytics tracking (and standard OVA impression tracking which is enabled by default but can be turned off) 
     51   * A new set of Javascript callback events supported with VPAID Ads 
     52   * Added support for the direct injection of a VAST Response into OVA via the "ova.vast" flashvar or the "inject" ad server type 
     53   * Added a new configuration option "tagParams" to allow custom parameters to be added to an ad tag at runtime 
     54   * OVA for Flowplayer is now compatible with the Flowplayer BWCheck plugin 
     55   * Cleaned up and extended the Javascript callback API methods - ad object now passed back and some method names changed 
     56   * Added support for Companion <AdParameters> to be passed in to SWF companions 
     57   * Added "linearScaling" config option to allow scaling parameters on linear ad streams to be forcibly set (JW5 and Flowplayer only) 
     58   * Improved support for RTMP ads - auto-detection of netConnectionAddress (where feasible) and new support for custom "streamer" definitions 
     59   * Confirmed OVA for Flowplayer works with Clustering plugin 
     60   * "allowPlaylistControl" option re-introduced for OVA for JW 4/5 to allow the full playlist to be maintained in the player once OVA has finished scheduling the ads 
     61   * "enforceLinearAdsOnPlaylistSelection" option introduced for OVA for JW5 to allow playlist selections to check if pre-rolls should first be played 
     62   * Implemented overlay ad support on live streams - OVA for JW5 and OVA for Flowplayer only 
     63   * Added a config option to allow the control bar height to be specified 
     64   * Made sure "blockUntilOriginalPlaylistLoaded" actually works with OVA for JW5 
     65   * Now clear the JW5 playlist on OVA initialisation unless "clearPlaylist" is set to "false" (OVA for JW5 only) 
     66   * OVA for Flowplayer tested against Flowplayer 3.2.6 
     67   * Corrected the sizing of the Click Through region on linear ads so that it excludes the control bar in fullscreen mode (OVA for JW5 only) 
     68   * Support added into OVA for Flowplayer for URL resolvers/proxies to be used on RTMP ad stream URLs (e.g. Akamai etc.) 
     69   * SWF Companions now have the click tag passed as the following flashvar variables - "clicktag, clickTag, clickTAG" 
     70   * A configuration option has been added to allow a timeout value to be set on ad calls - this stops ad servers blocking the player if they don't return a value and hold the call open 
     71   * Fixed an issue that stopped "keepOverlayVisibleAfterClick" working with custom regions 
     72   * Modified the click through open URL logic to ensure that IE browsers use the ExternalInterface("window.open") rather than the AS3 navigateToURL() method - this fixes an issue where IE popup blockers blocked click throughs if "wmode" was set to opaque 
     73   * Added a "target" option to the "clickSign" notice element to allow a "target" window to be specified for a click through ("_self", "_blank", "_top", "_parent") - default is "_blank" 
     74   * Added support for hard coding the player dimensions in the OVA configuration (JW5 only) 
     75   * A config option has been added to allow the default title and description for ads to be changed when shown in playlist selection controls 
     76   * Added support for a splash image to be set (via the "image=X" flashvar) on a playlist that only contains a linear ad (OVA for JW5 only) 
     77   * (OVA for JW 5 only) - upgraded support for JW 5.6 that allows nested JSON configuration (which means the configuration of OVA for JW 5 is now equivalent to OVA for Flowplayer when using the JW Javascript Embedder approach) 
     78   * (OVA for Flowplayer only) - added an example to illustrate how to use OVA with Flowplayer Secure Streaming 
     79   * Added Ads config group setting 'additionalParamsForSWFCompanions' to allow additional parameters to be added to the companion SWF object/embed tags as the code is inserted into the page 
     80   * Added support for RTMP subscribe to be forcibly set to true or false on ad clips (OVA for JW5 only) 
     81   * An "on-demand" model has been implemented to ensure that ad requests are only made when required (via the "loadOnDemand" option) 
     82   * A "refreshOnReplay" option has been provided to ensure that the ad slot is refreshed each time it is played (only available when paired with the "loadOnDemand" option) 
     83   * Added support for ad scheduling javascript callbacks  
     84   * Added a VASTController.unload() call to allow any open URLLoaders and SWFs to be forcibly closed by the parent SWF 
     85   * Support has been added for OVA to reschedule against new playlists/clips loaded into JW Player via the Javascript API `jwplayer("container").load()` - that allows HTML playlists to be supported 
     86   
     87{{{#!td style="background: #FFD586" 
     88'''IMPORTANT NOTE:''' OVA for JW 4/5 in RC4 uses a different JSON parser (the default Adobe parser is now used). This parser requires strict compliance to the JSON definition rules - additional commas etc. in an OVA JSON configuration will result in the JSON parser throwing an exception. For this reason, when upgrading to the latest OVA for JW Player plugin, please check your configuration for JSON compliance. If your setup does not work with the new release of OVA it is likely to be due to the fact that your OVA configuration was slightly non-compliant. It is worth nothing that many of the previous OVA examples had extra commas etc. specified in the OVA configuration blocks breaking those examples when run against the latest OVA release. 
     89}}} 
     90 
     91For example, the following configuration will throw a JSON exception now (notice the extraneous comma after the second ad slot definition): 
     92 
     93{{{ 
     94     ... 
     95     "ads": { 
     96          "schedule": [ 
     97                { 
     98                }, 
     99                { 
     100                }, 
     101          ] 
     102     } 
     103}}} 
     104 
     105The exception will appear in the OVA debug output as follows: 
     106 
     107{{{ 
     10814:02:12 GMT+0000 Debuggable: OVA Configuration parsing exception - Unexpected ] 
     109}}} 
     110 
     111== 1. Download the Release Candidates == 
     112 
     113You can grab the latest development builds from [http://developer.longtailvideo.com/ova/wiki/OvaDownload here]. 
     114 
     115== 2. RC4 Examples == 
     116 
     117You can find the full set of RC4 examples here: 
     118 
     119   * [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer OVA for Flowplayer] 
     120   * [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.4x OVA for JW Player 4] 
     121   * [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x OVA for JW Player 5] 
     122 
     123== 3. VAST2 wrapper support == 
     124 
     125Support has been added for the VAST 2 wrapper. For more information on the format of VAST 2 wrappers, refer to the [http://www.iab.net/vast IAB site]. 
     126 
     127For an example of the VAST 2 wrapper in action, click [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/xml-wrapper/example02.html here]. 
     128 
     129Automatic support for a cache-buster parameter being added to the wrapped ad tag has been provided via the "addCacheBuster" config variable. Set this  
     130config option to true to turn on the cache buster parameter. 
     131 
     132{{{ 
     133... 
     134      "server": { 
     135              "type": "direct", 
     136              "addCacheBuster": true, 
     137              "tag": "your-ad-tag-goes-here" 
     138      } 
     139... 
     140}}} 
     141 
     142== 4. VPAID support == 
     143 
     144Support has been added for VPAID 1.1 linear ads. At this time the support has been added to the AS3 framework, OVA for JW4 and OVA for JW5 plugins. 
     145 
     146For a detailed account of the VPAID API as defined by the IAB, please refer to the [http://www.iab.net/vpaid VPAID specification]. 
     147 
     148=== 4.1 Enabling VPAID for OVA for Flowplayer === 
     149 
     150VPAID ads will be played by default with OVA for Flowplayer. No specific configuration is required. 
     151 
     152To see an example VPAID linear ad in action with Flowplayer, click [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer/examples/vpaid here]. 
     153 
     154==== 4.1.1 VPAID and Flowplayer 3.2.6 Control Bars ==== 
     155 
     156The standard Flowplayer 3.2.6 Control Bars currently have a small issue that may cause problems with the sizing of VPAID linear ads. 
     157 
     158Flowplayer 3.2.6 when used with flowplayer-controls.3.2.4 or flowplayer-controls.3.2.5 will report the height of the controls as 0. 
     159 
     160OVA uses the sizing information for the control bars when configuring VPAID ads. Incorrect sizing information will result in the VPAID ad not displaying correctly around the control bar area. 
     161 
     162To force the sizing of the control bar to be correctly recognised by OVA, a control bar "height" option has been introduced. 
     163 
     164Use this option as follows: 
     165 
     166{{{ 
     167   "ads": { 
     168        "controls": { 
     169             "height": 30 
     170        } 
     171   } 
     172}}} 
     173 
     174This option can be found in action [http://static.openvideoads.org/qa/rc4-final/ova/ova.flowplayer/examples/controlbar/example05.html here]. 
     175 
     176==== 4.1.2 VPAID Ads and "always" autoHide control bars ==== 
     177 
     178By default, VPAID ads will cover "always" autoHide configured control bars. 
     179 
     180For some reason however, the control bar may occasionally appear over the VPAID ad when the mouse is moved over the control bar area. This is not a consistent bug and seems to happen randomly. 
     181 
     182If you notice this behaviour and wish to size the VPAID ad so that it is not appearing over the control bar area, use the following option in conjunction with the "autoHide": "always" Flowplayer player configuration: 
     183 
     184{{{ 
     185    "ads": { 
     186          "vpaid": { 
     187                "controls": { "hideOnLinearPlayback": "false" } 
     188          } 
     189    } 
     190}}} 
     191 
     192This option can be found in action [http://static.openvideoads.org/qa/rc4-final/ova/ova.flowplayer/examples/vpaid here]. 
     193 
     194=== 4.2 Enabling VPAID for OVA for JW Player 5 === 
     195 
     196VPAID ads will be played by default by OVA for JW Player 5. No specific configuration is required. 
     197 
     198To see an example VPAID linear ad in action (JW5), click [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/vpaid here]. 
     199 
     200The default behaviour for OVA is to hide the control bar during VPAID Linear Ad playback. This behaviour can be overridden (see below). 
     201 
     202=== 4.3 Enabling VPAID for OVA for JW Player 4 === 
     203 
     204For VPAID Linear Ads to work with OVA for JW Player 4, a "holding" clip must be placed in the position of the linear ad within the playlist. A holding clip is a "minimal" image - a single black pixel image file. 
     205 
     206OVA automatically places this "holding" clip when it schedules the ads to play.  
     207 
     208The holding clip must be hosted on a server of your choice. 
     209 
     210The following configuration structure is used to instruct OVA for JW4 as to the location of the holding clip: 
     211 
     212{{{ 
     213{ 
     214    "ads": { 
     215        "vpaid": { 
     216              "holdingClipUrl": "http://static.openvideoads.org/ads/blank/blank-pixel.jpg" 
     217        }, 
     218        "schedule": [ 
     219               ..... 
     220        ] 
     221    } 
     222} 
     223}}} 
     224 
     225To see an example JW4 VPAID linear ad in action, click [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/vpaid here]. 
     226 
     227=== 4.4 Showing the Control Bar during VPAID Linear Playback === 
     228 
     229OVA for JW Player 4/5 hides the control bar by default during VPAID Linear Ad playback. 
     230 
     231OVA can be instructed to show the control bar during playback via the following configuration: 
     232 
     233{{{ 
     234   ... 
     235      "ads": { 
     236           "vpaid": { 
     237                 "controls": { "hideOnLinearPlayback": false } 
     238           }, 
     239           ... 
     240}}} 
     241 
     242An example can be found [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/vpaid/example1.2.html here]. 
     243 
     244=== 4.5 Instructing OVA to pass a Referrer URL to the VPAID Ads === 
     245 
     246Sometimes VPAID ads require a "referrer" URL to be passed to them. 
     247 
     248To enable this information to be passed, configure OVA as follows: 
     249 
     250{{{ 
     251      ... 
     252          "ads": { 
     253             "vpaid": { 
     254                 "supplyReferrer": true 
     255             }, 
     256     .... 
     257}}} 
     258 
     259An example can be found [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/vpaid/example3.1.html here]. 
     260 
     261It is also possible to manually specify the value of the "referrer" string that is passed into a VPAID ad. The following config snippet illustrates how to achieve this: 
     262 
     263{{{ 
     264      ... 
     265          "ads": { 
     266             "vpaid": { 
     267                 "supplyReferrer": true, 
     268                 "referrer": "www.my-domain.com" 
     269             }, 
     270     .... 
     271}}} 
     272 
     273=== 4.6 Setting the Maximum Timeout Option === 
     274 
     275If a VPAID ad has an internal exception that cannot be caught by OVA, a default timer can be set to ensure that OVA will eventually close down the VPAID ad and continue on to the next clip. 
     276 
     277The following configuration sets the default timer to 30 seconds. The timer is disabled by default. 
     278 
     279{{{ 
     280   ... 
     281       "ads": { 
     282            "vpaid": { 
     283                  "enableMaxDurationTimeout": true, 
     284                  "maxDurationTimeout": 30 
     285            }, 
     286   ... 
     287}}} 
     288 
     289An example can be found [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/vpaid/example3.2.html here]. 
     290 
     291=== 4.7 Integrating VPAID Into your Custom Player via OVA for AS3 === 
     292 
     293''The code shown in this section has been taken from the OVA for JW Player 5 implementation. Please use that implementation as a reference implementation when integrating the OVA VPAID functionality into your custom player.'' 
     294 
     295==== 4.7.1 How OVA Treats VPAID Ads ==== 
     296 
     297VPAID ads are delivered to OVA via a VAST response. 
     298 
     299A linear VPAID ad is identified within a VAST response via the "apiFramework" attribute on the <MediaFile> tag. For instance: 
     300 
     301{{{ 
     302<MediaFile delivery="progressive" width="300" height="250" type="application/x-shockwave-flash" apiFramework="VPAID"> 
     303   <![CDATA[http://chibis.adotube.com/vast/UA.swf?mode=vpaid&adLinear=true&omlSource=http%3A%2F%2F 
     304      www.adotube.com%2Fphp%2Fservices%2Fplayer%2FOMLService.php%3Favpid%3D2ChPxDe%26platform_ 
     305      version%3Das3%26vast_cache_get%3D7-cff0cc9320fa4510824a6b7ee3543ab0%26integration%3Dlongtail 
     306      &publisher=__domain__&title=ova test&tags=ova&description=video description&videoURL=]]> 
     307</MediaFile>  
     308}}} 
     309 
     310Non-linear VPAID ads are identified within the VAST response via the "apiFramework" attribute on the <NonLinear> tag. For instance: 
     311 
     312{{{ 
     313<NonLinear width="300" height="250" apiFramework="VPAID" >  
     314   <StaticResource creativeType="application/x-shockwave-flash">  
     315       <![CDATA[http://chibis.adotube.com/vast/UA.swf?mode=vpaid&omlSource=http%3A%2F%2F 
     316       www.adotube.com%2Fphp%2Fservices%2Fplayer%2FOMLService.php%3Favpid%3DOBpMj3k%26 
     317       platform_version%3Das3%26vast_cache_get%3D7-54aac9181937ecb5d8ce2ae3c1cd0053& 
     318       publisher=www.longtailvideo.com&title=The Black Hole&tags=ova,test&description=ova test stream&videoURL=]]>  
     319   </StaticResource>  
     320</NonLinear>  
     321}}} 
     322 
     323OVA expects to play back a VPAID ad via an overlay on the player rather than through the more standard clip playback mechanisms of the player. 
     324 
     325As such, VPAID ads need to be treated differently during playback to the standard linear ad clips. 
     326 
     327In principal, OVA does all the work to playback a VPAID ad. The custom player just has to recognise when an ad to be played is a VPAID ad and trigger the OVA VPAID playback functionality accordingly. 
     328 
     329==== 4.7.2 The Three Steps to Integration ==== 
     330 
     331To implement OVA VPAID functionality within your player, three steps should be taken: 
     332 
     333    1. Register the VPAID event handlers 
     334    2. Implement the VPAID event handlers 
     335    3. Implement the clip control logic to ensure that if the active ad to play is a VPAID ad, play it using the OVA "playVPAID" method rather than loading it as a clip into the player 
     336      
     337==== 4.7.3 The VPAID Events ==== 
     338 
     339Two sets of VPAID events are provided by OVA - those generated by linear VPAID ads, and those generated by non-linear VPAID ads. 
     340 
     341The linear VPAID events are as follows: 
     342 
     343{{{ 
     344VPAIDAdDisplayEvent.LINEAR_START - generated when a VPAID ad starts 
     345VPAIDAdDisplayEvent.LINEAR_COMPLETE - generated when a VPAID ad completes 
     346VPAIDAdDisplayEvent.LINEAR_ERROR - generated when a VPAID ad generates an error event 
     347VPAIDAdDisplayEvent.LINEAR_LINEAR_CHANGE - generated when the VPAID ad changes into and out of a "linear" state 
     348VPAIDAdDisplayEvent.LINEAR_EXPANDED_CHANGE - generated when the VPAID ad is minimised/maximised 
     349VPAIDAdDisplayEvent.LINEAR_TIME_CHANGE - generated by the VPAID ad to indicate that the remaining time left has changed 
     350}}} 
     351 
     352The non-linear VPAID events are as follows: 
     353 
     354{{{ 
     355VPAIDAdDisplayEvent.NON_LINEAR_START - generated when a VPAID ad starts 
     356VPAIDAdDisplayEvent.NON_LINEAR_COMPLETE - generated when a VPAID ad completes 
     357VPAIDAdDisplayEvent.NON_LINEAR_ERROR - generated when a VPAID ad generates an error event 
     358VPAIDAdDisplayEvent.NON_LINEAR_LINEAR_CHANGE  - generated when the VPAID ad changes into and out of a "linear" state 
     359VPAIDAdDisplayEvent.NON_LINEAR_EXPANDED_CHANGE - generated when the VPAID ad is minimised/maximised 
     360VPAIDAdDisplayEvent.NON_LINEAR_TIME_CHANGE - generated by the VPAID ad to indicate that the remaining time left has changed 
     361}}} 
     362 
     363Typically a full set of event handlers implemented for the type  of VPAID ads (linear, non-linear) that you are delivering. 
     364 
     365==== 4.7.4 Implementing The VPAID Event Handlers ==== 
     366 
     367A VPAID Event handler is declared using the "addEventListener" VASTController method. The following code snippet illustrates how to declare event listeners for the full set of linear VPAID events: 
     368 
     369{{{ 
     370_vastController.addEventListener(VPAIDAdDisplayEvent.LINEAR_START, onVPAIDLinearAdStart);  
     371_vastController.addEventListener(VPAIDAdDisplayEvent.LINEAR_COMPLETE, onVPAIDLinearAdComplete);  
     372_vastController.addEventListener(VPAIDAdDisplayEvent.LINEAR_ERROR, onVPAIDLinearAdError);  
     373_vastController.addEventListener(VPAIDAdDisplayEvent.LINEAR_LINEAR_CHANGE, onVPAIDLinearAdLinearChange);  
     374_vastController.addEventListener(VPAIDAdDisplayEvent.LINEAR_EXPANDED_CHANGE, onVPAIDLinearAdExpandedChange);  
     375_vastController.addEventListener(VPAIDAdDisplayEvent.LINEAR_TIME_CHANGE, onVPAIDLinearAdTimeChange);  
     376}}} 
     377 
     378The following code snippet illustrates a typical implementation of an event handler for the VPAID start event: 
     379 
     380{{{ 
     381protected function onVPAIDLinearAdStart(event:VPAIDAdDisplayEvent):void { 
     382   doLog("PLUGIN NOTIFICATION: VPAID Linear Ad started", Debuggable.DEBUG_VPAID); 
     383   if(_vastController.hideControlbarDuringVPAIDLinearPlayback()) { 
     384      hideControlBar(); 
     385   } 
     386   else disableControlBar(); 
     387} 
     388}}} 
     389 
     390Typically the custom player event handler for a VPAID start or complete event manipulates the control bar in some form. 
     391 
     392In the code above, the VPAID start ad event handler checks to see if the OVA configuration specifies that the Control Bar should be hidden or just disabled during VPAID ad playback. 
     393 
     394If the OVA configuration is as follows: 
     395 
     396{{{ 
     397   ... 
     398      "ads": { 
     399           "vpaid": { 
     400                 "controls": { "hideOnLinearPlayback": false } 
     401           }, 
     402           ... 
     403}}} 
     404 
     405vastController.hideControlbarDurationVPAIDLinearPlayback() will return false. The default value is true which means that by default, OVA expects the controlbar to be hidden during playback. 
     406 
     407VPAID event handlers receive a VPAIDAdDisplayEvent. Sometimes that event has "data" in it. 
     408 
     409   * The VPAIDAdDisplayEvent passed to VPAID Error handlers will contain an error message that can be accessed via "event.data.message" 
     410   * The VPAIDAdDisplayEvent passed to VPAID Linear change handlers will contain a boolean data value. If event.data == true, the VPAID ad is playing a Linear stream. If false, the stream has completed. 
     411   * The VPAIDAdDIsplayEvent passed to VPAID Expanded change handlers will contain a boolean data value. If event.data == true, the VPAID ad is in an expanded state. If false, it is minimised. 
     412   * The VPAIDAdDisplayEvent passed to VPAID Time Change handlers will contain an int that represents the time remaining in the playback of the VPAID ad. Note, this "remaining time" notification mechanism does not seem to be reliably implemented across ad providers so it should not be relied upon. 
     413 
     414==== 4.7.5 Triggering the Playback of a VPAID Ad ==== 
     415 
     416OVA AdSlots now have an "isInteractive()" method. This method can be used to query the AdSlot type. If AdSlot.isInteractive() == true, the AdSlot is a VPAID linear or non-linear ad.  
     417 
     418To trigger a VPAID ad to play, the AdSlot containing the VPAID ad should be passed into the VASTController.playVPAID method. For example, the following code results in the playback of a VPAID ad in the first ad slot (typically a pre-roll ad slot): 
     419 
     420{{{ 
     421var preRollAdSlot:AdSlot = _vastController.adSchedule.getSlot(0); 
     422if(preRollAdSlot.isInteractive()) { 
     423   _vastController.playVPAID(preRollAdSlot); 
     424} 
     425}}} 
     426 
     427When the VASTController is instructed to play a VPAID ad, it: 
     428 
     429   * Triggers the load of the VPAID swf into an overlay via the OVA VPAIDWrapper class 
     430   * Once the VPAID SWF resource has been loaded, the OVAWrapper undertakes the VPAID handshake and initialisation process 
     431   * If this is successfully completed, the VPAID ad is started and a VPAIDAdDisplayEvent.LINEAR_START (or NON_LINEAR_START) event will be fired 
     432   * As the VPAID ad plays back, the appropriate events are fired when the ad is minimised, closed, maximised, starts linear playback, generates errors 
     433   * On completion of the VPAID ad, the OVA VASTController takes care of cleaning up the VPAID ad resources and hiding the overlay used to display the VPAID ad 
     434 
     435==== 4.7.6 Getting hold of the active VPAID ad and then manipulate it ==== 
     436 
     437The following code snippet illustrates how to get hold of the active VPAID ad and change the volume on it: 
     438 
     439{{{ 
     440if(_vastController != null) { 
     441    if(_vastController.isVPAIDAdPlaying()) { 
     442        var vpaidAd:org.openvideoads.vpaid.IVPAID = _vastController.getActiveVPAIDAd(); 
     443        if(vpaidAd != null) { 
     444            vpaidAd.adVolume = my_new_player_volume; 
     445        } 
     446    } 
     447    else ; // it's a linear ad stream 
     448} 
     449}}} 
     450 
     451=== 4.8 Known Limitations === 
     452 
     453   * An exception in the VPAID ad that does not throw an Error event will hang the player (unless timeout is defined) 
     454   * OVA for JW4 does not fully support configuration of VPAID ad without a stream also being played (play button does not show unless file= defined) - recommend upgrade to OVA for JW5 
     455   * OVA for JW4 does not support "autostart=true" on VPAID pre-rolls - recommend upgrade to OVA for JW5 
     456   * Updates to the timeline on the control bar are not triggered by VPAID ads 
     457  
     458== 5. Configuring the Skip Ad Button == 
     459 
     460The ability to "skip" on a linear ad has been added along with a set of examples illustrating how to configure OVA to activate the button ([http://static.openvideoads.org/rc/2/ova.flowplayer/examples/skip-button/index.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/skip-button/index.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/skip-button/index.html JW5] examples) 
     461 
     462A "skip" button can be enabled as follows: 
     463 
     464{{{ 
     465{ 
     466     "ads": { 
     467          "controls": { 
     468               "skipAd": { 
     469                   "enabled": true 
     470               } 
     471          }, 
     472          .... 
     473     } 
     474} 
     475}}} 
     476 
     477=== 5.1 The Standard Skip Ad Button === 
     478 
     479By default a button with a pre-defined image is used. 
     480 
     481To see the standard "skip ad" button in action, click here ([http://static.openvideoads.org/rc/2/ova.flowplayer/examples/skip-button/example01.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/skip-button/example01.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/skip-button/example01.html JW5]). 
     482 
     483That image can be overridden. 
     484 
     485=== 5.2 Using a Custom Image for the Skip Ad Button === 
     486 
     487To override the standard skip ad button image, use the "image" property and specify the new image "width" and "height": 
     488{{{ 
     489{ 
     490    "ads": { 
     491         "controls": { 
     492                "skipAd": { 
     493                     "enabled": true, 
     494                     "image": "../../images/my-new-skip-button.jpg", 
     495                     "width": 65, 
     496                     "height": 15 
     497                } 
     498        }, 
     499        .... 
     500    } 
     501} 
     502}}} 
     503 
     504An example of an overridden button image can be found here ([http://static.openvideoads.org/rc/2/ova.flowplayer/examples/skip-button/example02.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/skip-button/example02.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/skip-button/example02.html JW5]). 
     505 
     506=== 5.3 Using Region Attributes with the Skip Ad Button === 
     507 
     508It is also possible to use the region attributions to declare a skip button - background color, margins, borders and html content can be specified to construct the look of the button. 
     509 
     510{{{ 
     511{ 
     512     "ads": { 
     513           "controls": { 
     514                "skipAd": { 
     515                     "enabled": true, 
     516                     "html": "<p>SKIP!</p>", 
     517                     "region": { 
     518                            "id": "my-new-skip-ad-button", 
     519                            "verticalAlign": 3, 
     520                            "horizontalAlign": 3, 
     521                            "backgroundColor": "#FF3300", 
     522                            "opacity": 0.8, 
     523                            "borderRadius": 15, 
     524                            "padding": "0 1 1 13", 
     525                            "width": 60, 
     526                            "height": 20 
     527                     } 
     528                } 
     529           }, 
     530           .... 
     531      } 
     532} 
     533}}} 
     534 
     535An example of a HTML button can be found here ([http://static.openvideoads.org/rc/2/ova.flowplayer/examples/skip-button/example03.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/skip-button/example03.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/skip-button/example03.html JW5])  
     536 
     537=== 5.4 Showing the Skip Button on Ads with a minimim duration === 
     538 
     539It is possible to configure the "skip ad" button so that it only shows on ads that are longer than a specific duration. 
     540 
     541For example, the following configuration configures the "skip ad" button to show only on ads that are 10 seconds or longer in duration. 
     542 
     543{{{ 
     544{ 
     545     "ads": { 
     546          "controls": { 
     547               "skipAd": { 
     548                   "enabled": true, 
     549                   "minimumAdDuration": 10 
     550               } 
     551          }, 
     552          .... 
     553     } 
     554} 
     555}}} 
     556 
     557If you want to see this option in action, view these examples ([http://static.openvideoads.org/rc/2/ova.flowplayer/examples/skip-button/example04.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/skip-button/example04.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/skip-button/example04.html JW5])  
     558 
     559== 6. Simplified Configuration == 
     560 
     561In the case of a straight forward pre-roll setup, the OVA configuration approach has been simplified to the point where only a single "shortcut" variable "ova.tag" is required. 
     562 
     563That variable specifies the static ad tag to be used to obtain the pre-roll media to play. 
     564 
     565=== 6.1. Minimum OVA for JW Setup === 
     566 
     567To declare a pre-roll setup for OVA for JW Player 4/5, use the following flashvars: 
     568 
     569{{{ 
     570flashvars="plugins=ova&ova.tag=put-your-ad-tag-here" 
     571}}} 
     572 
     573If you are using the Javascript Embed code for JW5, you can use the variables as follows: 
     574 
     575{{{ 
     576<script type="text/javascript">jwplayer("container").setup({ 
     577       flashplayer: "player.swf",  
     578       file: "http://streaming.openvideoads.org:81/shows/the-black-hole.mp4", 
     579       plugins: { 
     580           "ova":  
     581                {  
     582                   tag: "your-tag-goes-here" 
     583                } 
     584       }, 
     585       height: 300, 
     586       width: 450 
     587}); 
     588</script> 
     589}}} 
     590 
     591You can find some examples of the minimum OVA for JW setup [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/minimal/index.html here]. 
     592 
     593=== 6.2 Minimum OVA for Flowplayer Setup === 
     594 
     595To declare a pre-roll setup for OVA for Flowplayer, use the following Flowplayer configuration: 
     596 
     597{{{ 
     598   ova: { 
     599        url: "ova.swf", 
     600        tag: "put-your-ad-tag-here" 
     601   } 
     602}}} 
     603 
     604=== 6.2 Other Shortcut Setup Variables === 
     605 
     606To support the "ova.tag" variable, several other "shortcut" variables have been defined. These can be used with the same minimum configuration approach above: 
     607 
     608   * ova.debug - maps to the "levels" debug setting - so "ova.debug": "fatal, config, vast_template" sets the debug levels to "fatal, config, vast_template" 
     609   * ova.autoplay - maps to the "autoPlay" config option 
     610   * ova.delayadrequestuntilplay - maps to the standard "delayAdRequestUntilPlay" config option 
     611   * ova.clearplaylist - OVA for JW5 only - allows OVA to be instructed as to whether or not the playlist should be cleared from the player as it initialises 
     612   * ova.allowplaylistcontrol - OVA for JW5 only - maps to the "allowPlaylistControl" option 
     613 
     614== 7. Deferred Loading == 
     615 
     616Using the "delayAdRequestUntilPlay" configuration option it is possible to defer the ad request to an ad server until the play button has been hit. 
     617 
     618An example of the deferred loading option in action can be found here ([http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/deferred-loading/index.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/deferred-loading/index.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/deferred-loading/index.html JW5])  
     619 
     620== 8. Ad Server Failover == 
     621 
     622It is possible to specify secondary ad servers to "fail-over" too when the preceding ad server call fails to return a result. 
     623 
     624Fail-over server ad tags are specified using the "failoverServers" configuration property. An array of tags may be declared - each will be tried in turn until a result is returned. 
     625 
     626This property can be used at an AdSlot or Server declaration level. 
     627 
     628{{{  
     629"schedule": [ 
     630     { 
     631          "zone": "5", 
     632          "position": "post-roll", 
     633          "server": { 
     634                 "type": "OpenX", 
     635                 "apiAddress": "http://openx.openvideoads.org/openx/www/delivery/fc.php", 
     636                 "oneAdPerRequest": true, 
     637                 "customProperties" : { 
     638                       "target": "category=food"  
     639                 }, 
     640                 "failoverServers": [ 
     641                       { 
     642                            "type": "AdTech", 
     643                            "tag": "http://adserver.adtech.de/?adrawdata/3.0/990.1/2366662/ 
     644                                        0/1725/noperf=1;cc=2;header=yes;cookie=yes;adct=204; 
     645                                        alias=;key=key1+key2;;=;grp=[group];misc=__random-number__" 
     646                      } 
     647                 ] 
     648          } 
     649     } 
     650] 
     651}}} 
     652 
     653An example of the failover option in action can be found here ([http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/ad-servers/example02.html Flowplayer], [http://static.openvideoads.org/rc/2/ova.jwplayer.4x/examples/pages/ad-servers/example02.html JW4], [http://static.openvideoads.org/rc/2/ova.jwplayer.5x/examples/pages/ad-servers/example02.html JW5])  
     654 
     655== 9. Always setting the show stream duration from Metadata == 
     656 
     657The `"setDurationFromMetaData"` configuration option has been implemented for "show" streams in this release. 
     658 
     659{{{ 
     660"shows": { 
     661     "setDurationFromMetaData": true 
     662} 
     663}}} 
     664 
     665When the option is set to `"true"`, OVA will forcibly set the duration will always be set according to the metadata duration for the stream. The option is "false" by default. 
     666 
     667== 10. Excluding Ad Media Files based on Mime Type == 
     668 
     669Two configuration options have been added to the "ads" configuration block to allow media files to be excluded during OVA search to identify relevant linear streams to playback. 
     670 
     671The two options are illustrated below. 
     672 
     673{{{ 
     674"ads": { 
     675      "acceptedLinearAdMimeTypes": [ "video/x-flv" ], 
     676      "filterOnLinearAdMimeTypes": true, 
     677      ... 
     678} 
     679}}} 
     680 
     681In this example, only FLV based ad streams will be selected. 
     682 
     683"acceptedLinearAdMimeTypes" is an Array based configuration property. A set of mime types can be configured as per a normal Array based definition. For instance, to limit the filtering to FLV and MP4, the following declaration should be made: 
     684 
     685{{{ 
     686"acceptedLinearAdMimeTypes": [ "video/x-flv", "video/x-mp4"] 
     687}}} 
     688 
     689By default: 
     690 
     691   * In the AS3 framework "filterOnLinearAdMimeTypes" is false 
     692   * In the OVA JW4, JW5 and Flowplayer plugins, "filterOnLinearAdMimeTypes" is true and "acceptedLinearAdMimeTypes" is set to ["video/x-flv","video/x-mp4","application/x-shockwave-flash"] 
     693 
     694To turn off the default filtering in the OVA plugins just set "filterOnLinearAdMimeTypes" to false - all "media files" elements of the VAST response will then be searched for a match to playback. 
     695 
     696== 11. New Ad Tag Template Variables == 
     697 
     698Support has been added for the following new ad tag template variables: 
     699 
     700   * `media-id` - a manually completed field to be specified via "customProperties" 
     701   * `media-title` - a manually completed field to be specified via "customProperties" 
     702   * `media-description` - a manually completed field to be specified via "customProperties" 
     703   * `media-categories` - a manually completed field to be specified via "customProperties" 
     704   * `media-keywords` - a manually completed field to be specified via "customProperties" 
     705   * `media-url` - a manually completed field to be specified via "customProperties" 
     706   * `page-stream-url` - a manually completed field to be specified via "customProperties" 
     707   * `partner-id` - a manually completed field to be specified via "customProperties" 
     708   * `allow-vpaid` - a manually completed field to be specified via "customProperties" 
     709 
     710As usual these variables can be used in an ad tag URL by pre and post-fixing "__" to the variable name (e.g. __domain__). 
     711 
     712An example of some of these fields in action can be found [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer/examples/ad-servers/adotube/example03.html here]. 
     713 
     714== 12. Fine Grained Control Over Control Bar Enabling/Disabling == 
     715 
     716A control bar configuration group has been added to the "ads" config block to allow fine grained control over the enabling/disabling of elements on the control bar during linear ad playback. 
     717 
     718The config group is used as follows: 
     719 
     720{{{ 
     721{ 
     722    ... 
     723    "ads": { 
     724         "controls": { 
     725              "enableScrubber": false, 
     726              "enableVolume": false, 
     727              "enableMute": false 
     728         }, 
     729         "schedule: { 
     730              ... 
     731         } 
     732         ... 
     733   } 
     734} 
     735}}} 
     736 
     737The full set of control bar enable/disable options are: 
     738 
     739   * `manage` - when set to false, stops OVA manipulating the control bar. True by default 
     740   * `enabled` - sets all individual control settings to this value (e.g. setting this to false will disable all controls in one go unless individually overridden)  
     741   * `enablePlay` - the play button - true by default 
     742   * `enablePause` - the pause button - true by default 
     743   * `enableStop` - the stop button - true by default 
     744   * `enablePlaylist` - the playlist buttons - false by default 
     745   * `enableTime` - the time/scrubber - false by default 
     746   * `enableVolume` - the volume controls - true by default 
     747   * `enableMute` - the mute button - true by default 
     748   * `enableFullscreen` - the fullscreen button - true by default 
     749   * `enableLinearSkipAd` - the skip ad button - false by default 
     750 
     751An example of the control bar configuration group can be found [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/controlbar/example02.html here]. 
     752 
     753For JW5, fine level control of the control bar is only available if a custom skin is used. The standard control bar cannot be enabled/disabled this way. 
     754 
     755== 13. Replaced JSwoof JSON with Adobe JSON Parser == 
     756 
     757To resolve a parsing issue with international characters being used in OVA configuration, the OVA for JW4/5 implementations have replaced the JSON parser used. The Adobe parser is now used instead of JSwoof. While the Adobe parser resolves the international character issue, it is less tolerant to erroneous JSON definitions (e.g. cases where additional commas are left etc.). As a result, when deploying RC4 you may notice that your old configuration doesn't work. If that's the case, check for un-necessary commas etc. in your declaration. 
     758 
     759== 14. Tracking Impressions with Google Analytics == 
     760 
     761A new configuration option "analytics" has been added. The "analytics" configuration block enables various tracking systems to be turned on to support reporting of OVA impression and tracking events. 
     762 
     763The first analytics system integrated with OVA is Google Analytics.  
     764 
     765Today the "analytics" mechanism can only be used to support impression reporting. Over time support for additional analytics systems and metric points will be added. 
     766 
     767Two sets of Google Analytics tracking accounts are supported: 
     768 
     769   * A Master OVA Account (defaults to GA ID "UA-4011032-6") 
     770   * A Custom Account 
     771 
     772The two may be used in parallel, although by default only the Master OVA account is setup. 
     773 
     774A full set of analytics examples can be found here: 
     775 
     776   * [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer/examples/analytics/index.html OVA for Flowplayer examples] 
     777   * [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/analytics/index.html OVA for JW5 examples] 
     778 
     779=== 14.1 Changing the Master OVA Account === 
     780 
     781By default, the "Master OVA GA account" is set to the OVA GA account ID "UA-4011032-6".   
     782 
     783This account ID may be replaced with any account ID of your choosing via the following configuration: 
     784 
     785{{{ 
     786{ 
     787     ... 
     788     "analytics": { 
     789          "google": { 
     790                 "ova": { 
     791                        "accountId": "UA-10158120-1" 
     792                 } 
     793          } 
     794     }, 
     795     "ads": { 
     796           .... 
     797     } 
     798}}} 
     799 
     800In the example above, OVA has been instructed to use the GA account ID "UA-10158120-1" for all impression tracking requests. 
     801 
     802When OVA makes GA calls, different URLs are used for linear, non-linear and companion impression tracking events. 
     803 
     804By default, the following URL structure is applied: 
     805 
     806   * linear - "/ova/impression-counter/ova-test/linear" 
     807   * non-linear - "/ova/impression-counter/ova-test/nonLinear" 
     808   * companion - "/ova/impression-counter/ova-test/companion" 
     809 
     810A different set of tracking URLs can be specified at any time using the following configuration options: 
     811 
     812{{{ 
     813{ 
     814     ... 
     815     "analytics": { 
     816          "google": { 
     817                 "ova": { 
     818                        "accountId": "UA-10158120-1", 
     819                        "impressions": { 
     820                              "linear": "/ova/impression-counter/ova-test/linear", 
     821                              "nonLinear": "/ova/impression-counter/ova-test/nonLinear", 
     822                              "companion": "/ova/impression-counter/ova-test/companion" 
     823                        } 
     824                 } 
     825          } 
     826     }, 
     827     "ads": { 
     828           .... 
     829     } 
     830}}} 
     831 
     832=== 14.2 Enabling Custom Tracking === 
     833 
     834To configure a custom account ID, use the following configuration approach: 
     835 
     836{{{ 
     837{ 
     838     ... 
     839     "analytics": { 
     840          "google": { 
     841                 "custom": { 
     842                        "enable": true, 
     843                        "accountId": "UA-10158120-1", 
     844                        "impressions": { 
     845                              "linear": "put-your-custom-url-here", 
     846                              "nonLinear": "put-your-custom-url-here", 
     847                              "companion": "put-your-custom-url-here" 
     848                        } 
     849                 } 
     850          } 
     851     }, 
     852     "ads": { 
     853           .... 
     854     } 
     855}}} 
     856 
     857When enabled, custom tracking will run in parallel with the standard "ova" tracking account. 
     858 
     859If you wish to disable the standard OVA tracking account and only use the custom account, use the following configuration: 
     860 
     861{{{ 
     862{ 
     863     ... 
     864     "analytics": { 
     865          "google": { 
     866                 "ova": { 
     867                        "enable": false 
     868                 }, 
     869                 "custom": { 
     870                        "enable": true, 
     871                        "accountId": "UA-10158120-1", 
     872                        "impressions": { 
     873                              "linear": "put-your-custom-url-here", 
     874                              "nonLinear": "put-your-custom-url-here", 
     875                              "companion": "put-your-custom-url-here" 
     876                        } 
     877                 } 
     878          } 
     879     }, 
     880     "ads": { 
     881           .... 
     882     } 
     883}}} 
     884 
     885=== 14.1 Disabling Google Analytics === 
     886 
     887To disable Google Analytics impression tracking completely, use the "enable": false option as follows. 
     888 
     889{{{ 
     890{ 
     891     ... 
     892     "analytics": { 
     893           "google": { 
     894                 "enable": false 
     895           } 
     896     }, 
     897     "ads": { 
     898           .... 
     899     } 
     900}}} 
     901 
     902== 15. Direct Injection of a VAST Response into OVA via Config == 
     903 
     904It is now possible to directly inject a VAST response into OVA when configuring the OVA instance. 
     905 
     906You can see a few examples of this mechanism in action here ([http://static.openvideoads.org/rc/3/ova.jwplayer.4x/examples/pages/direct-injection OVA for JW4], [http://static.openvideoads.org/rc/3/ova.jwplayer.5x/examples/pages/direct-injection OVA for JW5], [http://static.openvideoads.org/rc/3/ova.flowplayer/examples/direct-injection OVA for Flowplayer]). 
     907 
     908=== 15.1 OVA for JW4/5 Config File Setup === 
     909 
     910To pass in a pre-fetched VAST response to OVA when configuring the player via an external config file, use an ad server type of "inject" and place the VAST response data into the "tag" field as follows: 
     911 
     912{{{ 
     913<config> 
     914   <ova.json> 
     915      { 
     916          "ads": { 
     917              "schedule": [ 
     918                 { 
     919                    "position": "pre-roll", 
     920                    "server": { 
     921                        "type": "Inject", 
     922                        "tag": "%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22...." 
     923                    } 
     924                 } 
     925              ] 
     926          }, 
     927 
     928          "debug": { 
     929              "levels": "fatal, config, vast_template, vpaid, playlist", 
     930              "debugger": "firebug" 
     931          } 
     932      } 
     933   </ova.json> 
     934</config> 
     935}}} 
     936 
     937The VAST response data must be urlencoded when specified in the OVA config file. 
     938 
     939=== 15.1 OVA for JW4/5 Flashvars Setup === 
     940 
     941To pass in a pre-fetched VAST response to OVA when configuring JW Player, use the "ova.vast" flashvar as follows: 
     942 
     943{{{ 
     944var VAST_RESPONSE='<?xml version="1.0" encoding="UTF-8" ?><VAST version="2.0">....'; 
     945... 
     946... flashvars="&ova.vast=" + escape(escape(VAST_RESPONSE)) + "&file=OVA_HTTP_SHOW_STREAM_1&duration=30&provider=video"  
     947... 
     948}}} 
     949 
     950Notice that the VAST response must be passed into OVA in a double "escaped" (urlencoded) format.  
     951 
     952=== 15.2 OVA for JW5 Javascript Embed Setup === 
     953 
     954The following configuration example illustrates how to configure OVA for JW5 using the Javascript setup method and a pre-fetched VAST response: 
     955 
     956{{{ 
     957<script type="text/javascript">jwplayer("container").setup({ 
     958       flashplayer: "/path/to/the/player.swf",  
     959       file: "http://streaming.openvideoads.org/shows/the-black-hole.mp4", 
     960       plugins: { 
     961           "../../../dist/swf/ova.swf":  
     962                {  
     963                  debug: "fatal, config, vast_template, vpaid, http_calls, tracking_events", 
     964                  vast: escape('<?xml version="1.0" encoding="UTF-8" ?><VAST version="2.0">.....</VAST>')  
     965                } 
     966       }, 
     967       height: 300, 
     968       width: 450 
     969}); 
     970</script> 
     971}}} 
     972 
     973To pass in a pre-fetched VAST response, use the "ova.vast" configuration variable. The VAST response string must always be escaped when being passed into OVA. 
     974 
     975=== 15.3 OVA for Flowplayer === 
     976 
     977A VAST response can be directly inserted into the OVA setup via the "tag" variable for the "inject" ad server type: 
     978 
     979{{{ 
     980var VAST_RESPONSE='<?xml version="1.0" encoding="UTF-8" ?><VAST version="2.0">....'; 
     981 
     982flowplayer("a.example", "../../dist/swf/flowplayer-3.2.3.swf", { 
     983    plugins: { 
     984        controls: { 
     985            autoHide: "always" 
     986        }, 
     987 
     988        ova: { 
     989            url: "../../dist/swf/ova.swf", 
     990 
     991            "ads": { 
     992                "schedule": [ 
     993                    { 
     994                       "position": "pre-roll", 
     995                       "server": { 
     996                           "type": "inject", 
     997                           "tag": escape(VAST_RESPONSE) 
     998                       } 
     999                    } 
     1000                ] 
     1001            } 
     1002        } 
     1003    } 
     1004}); 
     1005}}} 
     1006 
     1007The VAST response must be double escaped when passing into OVA for Flowplayer. 
     1008 
     1009== 16. Adding Parameters to an Ad Tag at Runtime via "tagParams" == 
     1010 
     1011A new configuration option called "tagParams" has been added to allow additional parameters to be added to an Ad Tag URL at runtime. For example, you may want to add "&a=aa&b=bb&c=cc" to an ad tag to dynamically customise it (for example via Javascript) at runtime when OVA is configured. 
     1012 
     1013OVA for JW Player 4 and 5 offer this configuration parameter in the form of a flashvar "ova.tagparams". 
     1014 
     1015The fields to be added to the ad tag are declared using the "ova.tagparams" flashvar as a string that takes the format: 
     1016 
     1017{{{ 
     1018field-name:value,fieldname:value,..... 
     1019}}} 
     1020 
     1021Below is an example setup using the option as a flashvar: 
     1022 
     1023{{{ 
     1024<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"  
     1025  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0"  
     1026  WIDTH="450" HEIGHT="300" id="player"> 
     1027 <PARAM NAME=movie VALUE="../../../dist/swf/5.4.swf"> 
     1028 <PARAM NAME=quality VALUE=high> 
     1029 <PARAM NAME=bgcolor VALUE=#000000> 
     1030 <PARAM NAME=allowfullscreen VALUE="true"> 
     1031 <PARAM NAME=allowscriptaccess VALUE="always"> 
     1032 <PARAM NAME=flashvars VALUE="plugins=../../../dist/swf/ova.swf&config=../../config/ad-servers/ova04.xml"> 
     1033<EMBED 
     1034 id="player" 
     1035 data="../../../dist/swf/5.4.swf" 
     1036 src="../../../dist/swf/5.4.swf" 
     1037 width="450" 
     1038 height="300" 
     1039 allowscriptaccess="always" 
     1040 allowfullscreen="true" 
     1041 flashvars="plugins=../../../dist/swf/ova.swf&config=../../config/ad-servers/ova04.xml&ova.tagparams=a:aa,b:bb,c:cc" 
     1042> 
     1043</EMBED> 
     1044</OBJECT> 
     1045}}} 
     1046 
     1047A JW4 example can be found [http://static.openvideoads.org/rc/3/ova.jwplayer.4x/examples/pages/ad-servers/example04.html here]. 
     1048 
     1049OVA for JW Player 5 also makes this parameter available via the Javascript embed code. The fields to be added to the ad tag are declared as a string that takes the format: 
     1050 
     1051{{{ 
     1052field-name:value,fieldname:value,..... 
     1053}}} 
     1054 
     1055An example follows: 
     1056 
     1057{{{ 
     1058<script type="text/javascript">jwplayer("container").setup({ 
     1059       flashplayer: OVA_PLAYER_2,  
     1060       file: "http://streaming.openvideoads.org/shows/the-black-hole.mp4", 
     1061       config: "../../config/ad-servers/ova03.xml", 
     1062       plugins: { 
     1063           "../../../dist/swf/ova.swf": {  
     1064                debug: "fatal, config, vast_template, vpaid, http_calls, tracking_events", 
     1065                tagparams: "a:aa,b:bb,c:cc" 
     1066           } 
     1067       }, 
     1068       height: 300, 
     1069       width: 450 
     1070}); 
     1071</script> 
     1072}}} 
     1073 
     1074A JW5 example can be found [http://static.openvideoads.org/rc/3/ova.jwplayer.5x/examples/pages/ad-servers/example03.html here]. 
     1075 
     1076This example results in the following parameters being added to the ad tag when it's called: 
     1077 
     1078{{{ 
     1079http://the-ad-tag-is-here&a=aa&b=bb&c=cc 
     1080}}} 
     1081 
     1082OVA for Flowplayer supports it within the Ad Servers JSON configuration block. For example: 
     1083 
     1084{{{ 
     1085... 
     1086    "ads": { 
     1087         "pauseOnClickThrough": true, 
     1088         "servers": [ 
     1089             { 
     1090                 "type": "OpenX", 
     1091                 "apiAddress": "http://openx.openvideoads.org/openx/www/delivery/fc.php", 
     1092                 "tagParams": { 
     1093                      "a": "aa", 
     1094                      "b": "bb" 
     1095                 } 
     1096             } 
     1097         ], 
     1098... 
     1099}}} 
     1100 
     1101A Flowplayer example can be found [http://static.openvideoads.org/rc/3/ova.flowplayer/examples/ad-servers/example03.html here]. 
     1102 
     1103== 17. Javascript Callback API == 
     1104 
     1105A number of Javascript callback methods have changed in this release. 
     1106 
     1107As OVA schedules ads to play, the following callbacks are made: 
     1108 
     1109{{{ 
     1110onAdSchedulingStarted() 
     1111onLinearAdScheduled(ad:Object) 
     1112onNonLinearAdScheduled(ad:Object) 
     1113onCompanionAdScheduled(divSpecification:Object, companionAd:Object, parentAd:Object) 
     1114onAdSchedulingComplete(ads:Array) 
     1115}}} 
     1116 
     1117Ad server Template loads result in the following callbacks: 
     1118 
     1119{{{ 
     1120onTemplateLoadSuccess(template:String) 
     1121onTemplateLoadFailure(error:String) 
     1122onTemplateLoadTimeout(error:String) 
     1123}}} 
     1124 
     1125The following callback methods are now declared for Linear ads: 
     1126 
     1127{{{ 
     1128onLinearAdStart(ad:Object) 
     1129onLinearAdStop(ad:Object) 
     1130onLinearAdPause(ad:Object) 
     1131onLinearAdResume(ad:Object) 
     1132onLinearAdFullscreen(ad:Object) 
     1133onLinearAdFullscreenExit(ad:Object) 
     1134onLinearAdMute(ad:Object) 
     1135onLinearAdUnmute(ad:Object) 
     1136onLinearAdReplay(ad:Object) 
     1137onLinearAdMidPointComplete(ad:Object) 
     1138onLinearAdFirstQuartileComplete(ad:Object) 
     1139onLinearAdThirdQuartileComplete(ad:Object) 
     1140onLinearAdFinish(ad:Object) 
     1141}}} 
     1142 
     1143Dynamically loaded ad slots have the following callback methods: 
     1144 
     1145{{{ 
     1146onAdSlotLoaded(adSlot:Object) 
     1147onAdSlotLoadError(message:String) 
     1148onAdSlotLoadTimeout(message:String) 
     1149onAdSlotLoadDeferred(message:String) 
     1150}}} 
     1151 
     1152Linear Interactive (e.g. "VPAID" linear) ads have the following callbacks declared: 
     1153 
     1154{{{ 
     1155onVPAIDAdLoaded(ad:Object, runtimeState:Object) 
     1156onVPAIDAdImpression(ad:Object, runtimeState:Object) 
     1157onVPAIDAdStart(ad:Object, runtimeState:Object) 
     1158onVPAIDAdComplete(ad:Object, runtimeState:Object) 
     1159onVPAIDAdError(ad:Object, runtimeState:Object) 
     1160onVPAIDAdVideoStart(ad:Object, runtimeState:Object) 
     1161onVPAIDAdVideoFirstQuartile(ad:Object, runtimeState:Object) 
     1162onVPAIDAdVideoMidpoint(ad:Object, runtimeState:Object) 
     1163onVPAIDAdVideoThirdQuartile(ad:Object, runtimeState:Object) 
     1164onVPAIDAdVideoComplete(ad:Object, runtimeState:Object) 
     1165onVPAIDAdClickThru(ad:Object, runtimeState:Object) 
     1166onVPAIDAdUserAcceptInvitation(ad:Object, runtimeState:Object) 
     1167onVPAIDAdUserMinimize(ad:Object, runtimeState:Object) 
     1168onVPAIDAdUserClose(ad:Object, runtimeState:Object) 
     1169onVPAIDAdPaused(ad:Object, runtimeState:Object) 
     1170onVPAIDAdPlaying(ad:Object, runtimeState:Object) 
     1171onVPAIDAdExpandedChange(ad:Object, runtimeState:Object) 
     1172onVPAIDAdLinearChange(ad:Object, runtimeState:Object) 
     1173onVPAIDAdRemainingTimeChange(ad:Object, runtimeState:Object) 
     1174onVPAIDAdLog(ad:Object, event:Object) 
     1175}}} 
     1176 
     1177The "ad" object passed back takes the following form: 
     1178 
     1179{{{ 
     1180{ 
     1181   type:String // "linear", "linear-vpaid", "non-linear", "non-linear-vpaid", 
     1182   id:String,   
     1183   uid:String, 
     1184   inlineAdId:String,   
     1185   adId:String, 
     1186   sequenceId:String, 
     1187   creativeId:String, 
     1188   adSystem:String,  
     1189   adTitle:String, 
     1190   description:String, 
     1191   survey:String, 
     1192   linearAd:Object, 
     1193   nonLinearAds:Array, 
     1194   companionAds:Array 
     1195   extensions:Array 
     1196}; 
     1197}}} 
     1198 
     1199The VPAID "runtimeState" object takes the following form: 
     1200 
     1201{{{ 
     1202{ 
     1203    adExpanded:Boolean. 
     1204    adLinear:Boolean, 
     1205    adRemainingTime:Number, 
     1206    adVolume:int 
     1207} 
     1208}}} 
     1209 
     1210You can find an example of the VPAID callbacks running [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer/examples/vpaid/example3.8.html here]. Inspect the debug output via Chrome Developer Tools or Firefox (with Firebug) and you'll be able to traverse both the Ad and runtimeState objects that are passed in the Javascript callbacks. 
     1211 
     1212The "linearAd" object takes the following form: 
     1213 
     1214{{{ 
     1215   adId:String, 
     1216   id:String, 
     1217   uid:String, 
     1218   scalable:String, 
     1219   maintainAspectRatio:String, 
     1220   duration:String, 
     1221   mediaFiles:Array 
     1222}}} 
     1223 
     1224the "mediaFiles" array is an array of MediaFile objects, each taking the form: 
     1225 
     1226{{{ 
     1227   id:String, 
     1228   bandwidth:String, 
     1229   delivery:String, 
     1230   scale:String, 
     1231   maintainAspectRatio:String, 
     1232   mimeType:String, 
     1233   bitRate:String, 
     1234   width:String, 
     1235   height:String, 
     1236   apiFramework:String, 
     1237   urlId:String, 
     1238   url:String, 
     1239   adParameters:String 
     1240}}} 
     1241 
     1242"nonLinearAds" is an array of non-linear ad objects. Each non-linear ad object has: 
     1243 
     1244{{{ 
     1245{ 
     1246   id:String, 
     1247   adId:String, 
     1248   uid:String, 
     1249   width:int, 
     1250   height:int, 
     1251   expandedWidth:int, 
     1252   expandedHeight:int, 
     1253   resourceType:String, 
     1254   creativeType:String, 
     1255   apiFramework:String, 
     1256   scalable:Boolean, 
     1257   maintainAspectRatio:Boolean, 
     1258   recommendedMinDuration:int, 
     1259   url:String, 
     1260   codeblock:String 
     1261} 
     1262}}} 
     1263 
     1264"companionAds" is an array of companion objects. Each companion object has: 
     1265 
     1266{{{ 
     1267{ 
     1268   id:String, 
     1269   adId:String, 
     1270   uid:String, 
     1271   divId:String, 
     1272   altText:String, 
     1273   width:int, 
     1274   height:int, 
     1275   resourceType:String, 
     1276   creativeType:String 
     1277   markup:String 
     1278} 
     1279}}} 
     1280 
     1281"extensions" are the VAST extensions that have been provided by the ad server. The field is an array of Objects, with each element being the content of the <extension></extension> tagset in the VAST response- two attributes are declared on the objects in the array - "label" and "text". The "label" is the type declared for the extension and the "text" is the content within the extension tagset. 
     1282 
     1283For example, an extension tagset as follows: 
     1284 
     1285{{{ 
     1286<Extensions> 
     1287   <Extension type="LR-Pricing"> 
     1288      <Price model="CPM" currency="USD">6</Price> 
     1289   </Extension> 
     1290   <Extension type="SpotX-Count"> 
     1291      <total_available>9</total_available> 
     1292   </Extension> 
     1293   <Extension type="Location"> 
     1294       London 
     1295   </Extension> 
     1296</Extensions 
     1297}}} 
     1298 
     1299yields: 
     1300 
     1301{{{ 
     1302ad.extensions[0] == { label: "LR-Pricing", text: "<Price model="CPM" currency="USD">6</Price>" } 
     1303ad.extensions[1] == { label: "SpotX-Count", text: "<total_available>9</total_available>" } 
     1304ad.extensions[2] == { label: "Location", text: "London" } 
     1305}}} 
     1306 
     1307== 18. Support Click Throughs with SWF Companions == 
     1308 
     1309If a Companion Ad has either the <AdParameters> and/or a <CompanionClickThrough> declared in the VAST response, the values will be passed through to the SWF as follows: 
     1310 
     1311   * If there is a <CompanionClickThrough> specified, the escaped value (e.g. escape(value)) is passed through as a "clickTAG" flashvar 
     1312   * If there are <AdParameters> specified, the value is passed through directly as flashvars 
     1313   * If both a specified, the <CompanionClickThrough> is specified first as "clickTag=" followed by "&" plus the value of the <AdParameters> 
     1314 
     1315== 19. Setting the "linearScaling" Configuration Option == 
     1316 
     1317A configuration option has been added to allow the "linear scaling" attributes of ad streams to be forcibly set. 
     1318 
     1319The option is used as follows: 
     1320 
     1321{{{ 
     1322   ... 
     1323      "ads": { 
     1324          "linearScaling": "value-goes-in-here", 
     1325          "schedule": [ 
     1326               ... 
     1327          ] 
     1328      } 
     1329   ... 
     1330}}} 
     1331 
     1332"linearScaling" takes a string value. The value is dependant upon the player implementation. 
     1333 
     1334For Flowplayer, the value can be either: 
     1335 
     1336   * "orig" 
     1337   * "fit" 
     1338   * "scale" 
     1339 
     1340For JW Player, the value can be either: 
     1341 
     1342   * "uniform" 
     1343   * "fill" 
     1344   * "exactfit" 
     1345   * "none" 
     1346 
     1347== 20. Improved Support for RTMP Ads == 
     1348 
     1349RC4 includes improved support for RTMP ads. 
     1350 
     1351RTMP ads are more difficult to deliver than HTTP because three critical pieces of information are required to configure an RTMP clip: 
     1352 
     1353   * The Net Connection Address of the RTMP server 
     1354   * The Filename of the stream 
     1355   * Any adornments that are to accompany the filename as required by the RTMP server (e.g. "MP4:") 
     1356 
     1357VAST responses typically deliver RTMP based Media File URLs in either of the following formats: 
     1358 
     1359{{{ 
     1360rtmp://ne7c0nwbit.rtmphost.com/videoplayer/mp4:ads/30secs/country_life_butter.mp4 
     1361rtmp://ne7c0nwbit.rtmphost.com/videoplayer/ads/30secs/country_life_butter.mp4 
     1362}}} 
     1363 
     1364The key difference between both of these RTMP URLs is that the first includes a specific "file marker" that allows OVA to easily determine the "netConnectionAddress" of the RTMP server as well as the filename for the RTMP ad stream. Often in the case of MP4 streams, the "file marker" doubles as an important prefix that the RTMP server expects on the filename address.  
     1365 
     1366The second URL doesn't include any of these distinguishing characteristics. 
     1367 
     1368So the challenge for OVA is to work out how to extract both the Net Connection Address, Filename and File Adornments from a simple URL. 
     1369 
     1370RC4 implements two mechanisms to improve OVA's ability to play RTMP ad streams: 
     1371 
     1372   * A new ad "streamers" configuration block 
     1373   * A default set of rules that govern the splicing of a standard URL into it's Net Connection Address and Filename components 
     1374 
     1375=== 20.1 The Ad "Streamers" Configuration Block === 
     1376 
     1377To help OVA identify the Net Connection Address and Filename components of an RTMP URL, a set of "ad streamers" may now be declared. 
     1378 
     1379Each ad streamer declaration has the following elements: 
     1380 
     1381   * A "netConnectionAddress" pattern 
     1382   * A definition of which types of files to explicitly remove the file extension if one is provided 
     1383   * A definition of which types of files to add a prefix 
     1384 
     1385The following config snippet illustrates how to declare a set of "ad streamers" for RTMP ads: 
     1386 
     1387{{{ 
     1388{ 
     1389    ... 
     1390          "ads": { 
     1391              "streamers": [ 
     1392                  { 
     1393                      "netConnectionAddress": "rtmp://ne7c0nwbit.rtmphost.com/videoplayer", 
     1394                      "removeFilenameExtensions": [ "flv" ], 
     1395                      "addFilenamePrefixes": [ "mp4" ] 
     1396                  }, 
     1397                  { 
     1398                      "netConnectionURL": "rtmp://another-ad-streamer.com/ads" 
     1399                  } 
     1400              ], 
     1401              "schedule": [ 
     1402                  { 
     1403                      "position": "pre-roll", 
     1404                      "tag": "../../../dist/templates/rtmp-ads/vast1-mp4-no-markers.xml" 
     1405                  } 
     1406              ] 
     1407         } 
     1408   ... 
     1409} 
     1410}}} 
     1411 
     1412In this configuration block two ad streamers are declared. The first states: 
     1413 
     1414   * That RTMP ads will be streamed from "rtmp://ne7c0nwbit.rtmphost.com/videoplayer" 
     1415   * If the RTMP ad is an "flv" ad, remove the file extension when configuring 
     1416   * If the RTMP ad is an "mp4" ad, add a prefix ("mp4:") to the filename when configuring it 
     1417 
     1418The first ad streamer configuration will match on an RTMP URL such as: 
     1419 
     1420{{{ 
     1421rtmp://ne7c0nwbit.rtmphost.com/videoplayer/ads/30secs/country_life_butter.mp4 
     1422}}} 
     1423 
     1424and produce the following components: 
     1425 
     1426   * netConnectionAddress: rtmp://ne7c0nwbit.rtmphost.com/videoplayer 
     1427   * filename: mp4:ads/30secs/country_life_butter.mp4 
     1428 
     1429=== 20.2 The Default RTMP URL Splicing Rules === 
     1430 
     1431In the absence of a set of "ad streamers" being declared, OVA will implement a default set of "splicing" rules when configuring RTMP ad streams from URLs that do not have any relevant "file markers". 
     1432 
     1433Consider the following URL: 
     1434 
     1435{{{ 
     1436rtmp://ne7c0nwbit.rtmphost.com/videoplayer/ads/30secs/country_life_butter.mp4 
     1437}}} 
     1438 
     1439The following rules will be applied: 
     1440 
     1441   * The netConnectionAddress will be determined as the domain name part of the URL followed by the first directory name in the URL string 
     1442   * The filename will be determined by removing the part derived as the netConnectionAddress 
     1443   * If the URL has either an ".mp4" file extension or an MP4 mime type set on the VAST Media File tag set, "mp4:" will be prefixed to the filename 
     1444   * If the URL has a ".flv" file extension it will be removed 
     1445 
     1446As a result, the following components will be derived: 
     1447 
     1448   * netConnectionAddress: rtmp://ne7c0nwbit.rtmphost.com/videoplayer 
     1449   * filename: mp4:ads/30secs/country_life_butter.mp4 
     1450 
     1451=== 20.3 Enabling/Disabling "rtmp.subscribe" (OVA for JW5 only) 
     1452 
     1453When "rtmp.subscribe" is set for show clips in JW5, any RTMP ad clips *may* need to have the "rtmp.subscribe" value forcibly set to false. 
     1454 
     1455To support this, the following configuration options have been implemented: 
     1456 
     1457{{{ 
     1458{ 
     1459   ... 
     1460   "ads": { 
     1461        "providers": {  
     1462             "enforceSettingSubscribeRTMP":true,  
     1463             "subscribeRTMP": false  
     1464        }, 
     1465        "schedule": [ 
     1466            .... 
     1467}}} 
     1468 
     1469"enforceSettingSubscribeRTMP" forces OVA for JW5 to set a "rtmp.subscribe" value on the ad clip if it is an RTMP stream. 
     1470 
     1471"subscribeRTMP" is the value that gets set as "rtmp.subscribe" on the ad clip if it is an RTMP ad stream and "enforceSettingSubscribeRTMP" is set to true. 
     1472 
     1473== 21. Configuring OpenX V3 == 
     1474 
     1475Support has been added for OpenX V3. 
     1476 
     1477OpenX V3 ad tags may be configured in two ways: 
     1478 
     1479   * Directly as static ad tags 
     1480   * Dynamically using the new "OpenX3" ad server type 
     1481 
     1482The following code snippet illustrates an example pre-roll setup using a static OpenX V3 ad tag: 
     1483 
     1484{{{ 
     1485{  
     1486   ... 
     1487   "ads": { 
     1488         "companions": [ 
     1489                { "id": "companion-1", "width": 300, "height": 250 } 
     1490         ], 
     1491         "schedule": [ 
     1492               { 
     1493                   "position": "pre-roll", 
     1494                   "tag": "http://oxdemo-d.openxenterprise.com/v/1.0/av?pgid=91__amp__test=true" 
     1495               } 
     1496         ] 
     1497   } 
     1498   ... 
     1499} 
     1500}}} 
     1501 
     1502Where multiple ad calls are to be combined into a single ad call, the new OpenX3 dynamic ad server configuration should be used. The following code snippet illustrates an example setup where a linear and non-linear ad call are combined into a single call: 
     1503 
     1504{{{ 
     1505    .... 
     1506            "ads": { 
     1507                "servers": [ 
     1508                    { 
     1509                      "type": "OpenX3", 
     1510                      "apiAddress": ""http://oxdemo-d.openxenterprise.com/v/1.0/av", 
     1511                      "tagParams": { 
     1512                          "test": "true", 
     1513                          "c.topic": "sports", 
     1514                          "c.gender": "male" 
     1515                      } 
     1516                    } 
     1517                ], 
     1518                "schedule": [ 
     1519                    { 
     1520                       "zone": "auid=9", 
     1521                       "position": "pre-roll" 
     1522                    }, 
     1523                    { 
     1524                       "zone": "pgid=127", 
     1525                       "position": "bottom:auto", 
     1526                       "startTime": "00:00:02" 
     1527                    } 
     1528                ] 
     1529            } 
     1530     .... 
     1531}}} 
     1532 
     1533The "tagParams" configuration option allows additional parameters to be added to the end of the ad tag as it's formed. The ad tag for the case above ends up taking the following form: 
     1534 
     1535{{{ 
     1536http://oxdemo-d.openxenterprise.com/v/1.0/av?auid=9&pgid=127&test=true&test=true&c.gender=male&c.topic=sports 
     1537}}} 
     1538 
     1539== 22. Maintaining the playlist with OVA for JW Player 5 == 
     1540 
     1541By default OVA replaces the JW Player playlist and loads up each clip one clip at a time during playback. 
     1542 
     1543This obviously causes issues with playlist controls that require the entire playlist to be maintained permanently in the player. 
     1544 
     1545Two options have been introduced to allow OVA for JW Player 5 to maintain a full playlist and work with Playlist controls: 
     1546 
     1547   * "allowPlaylistControl" - ensures that OVA maintains the full playlist in the player after ad scheduling (instead of placing 1 clip at a time into the player which is its default behaviour) 
     1548   * "enforceLinearAdsOnPlaylistSelection" - ensures that selections from a playlist enforce checks to determine if pre-roll(s) attached to show clips should be played first 
     1549 
     1550You can find an example running [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/jw-specific/example22.html here]. 
     1551 
     1552This example uses the internal JW 5 playlist control. You will notice that the playlist shows "Open Video Ads Served Ads" in slots in the playlist. These are the scheduled pre-rolls that are to be played. Unless a playlist control explicitly identifies the OVA ads and excludes them from the display, they will appear as playlist items. 
     1553 
     1554"enforceLinearAdsOnPlaylistSelection" is an interesting option. If this option is set to true, a click on a show clip in a playlist control will result in the associated pre-rolls being played before the show clip is played. This option is set to "false" by default. 
     1555 
     1556The following code snippet illustrates a sample setup using these options: 
     1557 
     1558{{{ 
     1559{ 
     1560     "allowPlaylistControl": true, 
     1561     "ads": { 
     1562          "enforceLinearAdsOnPlaylistSelection": true, 
     1563          "schedule": [  
     1564          ], 
     1565          .... 
     1566     } 
     1567} 
     1568}}} 
     1569 
     1570=== 22.1 How to exclude ad clips from showing in a JW5 Playlist Control === 
     1571 
     1572To explicitly exclude OVA linear ads from being displayed within a Playlist Control, the playlist control needs to recognise that the OVA clips are ads and elect to not show them. 
     1573 
     1574To help Playlist controls identify OVA ad clips, a number of properties are set on each OVA scheduled clip: 
     1575 
     1576   * For Ads 
     1577      * 'ova.hidden': true - this is set and is true if the clip is an OVA ad (legacy property) 
     1578      * 'ovaAd': true - this is set and is true if the clip is an OVA ad - preferred property to use in place of 'ova.hidden'  
     1579      * 'ovaZone' - the zone value recorded against the ad slot in the schedule 
     1580      * 'ovaSlotId' - the id given to the ad slot  
     1581      * 'ovaPosition' - the value of the "position" property set against the ad slot in the schedule 
     1582      * 'ovaPlaylistIndex' - the index of this clip in the playlist 
     1583      * 'ovaAssociatedStreamIndex' - the index of the show stream in the stream sequence that is associated with this ad clip 
     1584      * 'ovaAdType' - the type of ad - "pre-roll", "mid-roll", "post-roll" 
     1585      * 'ovaInteractive' - is true if the ad is a VPAID ad 
     1586   * For Show Streams 
     1587      * 'ovaAssociatedPrerollClipIndex' - the playlist index of the first pre-roll clip associated with this show stream 
     1588      * 'ovaPlaylistIndex' - the index of this clip in the playlist 
     1589      * 'ovaAssociatedStreamIndex' - the index of this clip in the show stream sequence 
     1590      * 'ovaIsEndBlock' - true if this clip marks the end of a block of streams 
     1591 
     1592== 23. Supporting Overlays on Live Streams (JW5 and Flowplayer Only) == 
     1593 
     1594Support for running overlays with live streams has been added to OVA for Flowplayer and OVA for JW Player 5. 
     1595 
     1596To support overlays on live streams in JW Player 5, a new option "streamTimer" has been introduced. This option allows a "timer" to be started when the live stream starts to play. The timer generates time events every 10th of a second (by default) - these timing events are critical for OVA to receive so that it knows when to start playing the overlay. JW Player 5 does not generate these timing events on live streams by default. Flowplayer does - as a result this option is not required for the Flowplayer implementation. 
     1597 
     1598An example of the option working can be found [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/live-streaming/example04.html here]: 
     1599 
     1600Here's the code snippet for the OVA config used by that example: 
     1601 
     1602{{{ 
     1603      { 
     1604            "shows": { 
     1605               "streamTimer": { "enabled": true, "tickRate": 100 } 
     1606            }, 
     1607             
     1608            "ads": { 
     1609                "servers": [ 
     1610                    { 
     1611                      "type": "OpenX", 
     1612                      "apiAddress": "http://openx.openvideoads.org/openx/www/delivery/fc.php" 
     1613                    } 
     1614                ], 
     1615 
     1616                "schedule": [ 
     1617                    { 
     1618                      "zone": "30", 
     1619                      "position": "center:auto", 
     1620                      "startTime": "00:00:02", 
     1621                      "duration": 10, 
     1622                      "width": 450, 
     1623                      "height": 50 
     1624                    } 
     1625                ] 
     1626            }, 
     1627        } 
     1628  } 
     1629}}} 
     1630 
     1631The "tickRate" option is not mandatory. By default it is set to 100 which equates to 100 milliseconds (1/10th of a second). If you need to change the timer tick rate, use that option and specify the value in milliseconds. 
     1632 
     1633The "streamTimer" option is disabled by default. 
     1634 
     1635== 24. Hard coding the control bar height == 
     1636 
     1637A new config option has been introduced to allow the control bar height to be hard coded. 
     1638 
     1639{{{ 
     1640{ 
     1641     "controls": { 
     1642          "height": 28 
     1643     }, 
     1644     "ads": { 
     1645          ... 
     1646    } 
     1647} 
     1648}}} 
     1649 
     1650This option is useful when the standard Flowplayer 3.2.6 controls are used as they report 0 in height (for some strange reason). Using this option allows the height to be correctly determined for the control bar and it will override anything that OVA tries to determine using the Flowplayer control bar API. 
     1651 
     1652== 24. How to use "blockUntilOriginalPlaylistLoaded" with OVA for JW Player 5 == 
     1653 
     1654Several JW Player playlist configurations require OVA to block initialisation until the playlist has been loaded. 
     1655 
     1656Once example is when "levels" are used in the JW setup code to specify bit-rated playlist files. 
     1657 
     1658For example: 
     1659 
     1660{{{ 
     1661<script type="text/javascript"> 
     1662        jwplayer("container70").setup({ 
     1663        autostart: false, 
     1664        controlbar: "over", 
     1665        levels: [ 
     1666                { bitrate: 150, file: "http://mystreamer.com/low.mp4", width: 320 }, 
     1667                { bitrate: 400, file: "http://mystreamer.com/medium.mp4", width: 320 } 
     1668        ], 
     1669        duration: 30, 
     1670        provider: "http", 
     1671        plugins: { 
     1672                "/dist/swf/ova.swf": {} 
     1673        },  
     1674        flashplayer: "/dist/swf/5.4.swf", 
     1675        config: "config1.xml", 
     1676        volume: 90, 
     1677        height: 360, 
     1678        width: 480 
     1679        }); 
     1680</script> 
     1681}}} 
     1682 
     1683When this type of setup is specified, it is important to instruct OVA to block initialisation until the original playlist is loaded. 
     1684 
     1685There are two ways to do that: 
     1686 
     1687   * Within the Javascript JW setup code 
     1688   * Within the external config file 
     1689 
     1690=== 24.1 Blocking via the Javascript Embed Code === 
     1691 
     1692The following code snippet illustrates how to instruct OVA via the Javascript setup code to block until the playlist is loaded: 
     1693 
     1694{{{ 
     1695<script type="text/javascript"> 
     1696        jwplayer("container70").setup({ 
     1697        .... 
     1698        plugins: { 
     1699                "/dist/swf/ova.swf": {  
     1700                          blockUntilOriginalPlaylistLoaded: true  
     1701                } 
     1702        },  
     1703        .... 
     1704</script> 
     1705}}} 
     1706 
     1707=== 24.1 Blocking via the external config file === 
     1708 
     1709Alternatively, the blockUntilOriginalPlaylistLoaded option can be specified in the external JW Player config file as follows: 
     1710 
     1711{{{ 
     1712<config> 
     1713   <ova.blockUntilOriginalPlaylistLoaded> 
     1714        true 
     1715   </ova.blockUntilOriginalPlaylistLoaded> 
     1716   <ova.json> 
     1717            .... 
     1718   </ova.json> 
     1719</config> 
     1720}}} 
     1721 
     1722== 25. Clearing the Playlist (OVA for JW Player 5 only) == 
     1723 
     1724When OVA for JW5 initialises, the original playlist is cleared from the player. This ensures that the first clip in the list doesn't start playing while a VPAID pre-roll is loaded. 
     1725 
     1726In the case of a playlist that has a VPAID pre-roll, the player playlist will remain empty until the VPAID pre-roll is played. This may have the undesired effect of stopping a splash image from showing in the player when it loads (e.g. 'image=X' flashvar will stop working). 
     1727 
     1728There may be times when it is not desirable to have OVA clear the original playlist.  
     1729 
     1730OVA can be instructed to not clear the playlist on initialisation with the "clearPlaylist" option.  
     1731 
     1732The following code snippet illustrates how to use this option: 
     1733 
     1734{{{ 
     1735{ 
     1736    "clearPlaylist": false, 
     1737    "ads": { 
     1738         .... 
     1739    } 
     1740} 
     1741}}} 
     1742 
     1743If "delayAdRequestUntilPlay: true" is set and there is a splash image to show, OVA for JW5 will force "clearPlaylist: false" to be set. This ensures that the splash image shows until the user presses play and the ad scheduled playlist is generated and installed. 
     1744 
     1745== 26. Supporting URL Resolvers/Proxies with OVA for Flowplayer == 
     1746 
     1747Support had been added into OVA for Flowplayer to enable URL resolvers/proxies such as the Akamai plugin to be used with RTMP based ad stream URLs. 
     1748 
     1749This allows the final ad stream URLs (e.g. the netConnectionURL etc) to be derived at runtime by supporting plugins such as the Akamai plugin. 
     1750 
     1751To enable this feature, configure OVA with the "enableProxies" option as follows: 
     1752 
     1753{{{ 
     1754"ova": { 
     1755     "ads": { 
     1756           "enableProxies": true, 
     1757           ... 
     1758     } 
     1759} 
     1760}}} 
     1761 
     1762You can find an example running [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer/examples/flowplayer-specific/example19.html here]. 
     1763 
     1764== 27. Timing Out Ad Server Calls == 
     1765 
     1766A configuration option has been added to allow a timeout value to be set on ad calls - this stop an ad server blocking the player if they don't return a value while holding the call open. 
     1767 
     1768The option is "timeoutInSeconds" and should be specified within the "servers" configuration block at a general level, of the "server" config block at an ad slot level. 
     1769 
     1770The maximum length of time to wait for an ad server to respond must be specified in seconds (whole numbers only are supported - e.g. 10 not 10.5). 
     1771 
     1772For instance: 
     1773 
     1774{{{ 
     1775{ 
     1776     ... 
     1777        "ads": { 
     1778             "servers": [ 
     1779                   { 
     1780                       "type": "Direct", 
     1781                       "apiAddress": "http://static.openvideoads.org/tests/delayed-ad-tag-processor.php", 
     1782                       "timeoutInSeconds": 10 
     1783                   } 
     1784             ], 
     1785             "schedule": [ 
     1786                    { 
     1787                       "zone": "5", 
     1788                       "position": "pre-roll" 
     1789                    } 
     1790             ] 
     1791        } 
     1792    ... 
     1793} 
     1794}}} 
     1795 
     1796You can see an example of the timeout in action [http://static.openvideoads.org/qa/rc4-final/ova.flowplayer/examples/ad-servers/example04.html here]. 
     1797 
     1798Finally, when an ad tag times out (and doesn't fail over to another ad request), a Javascript callback event is generated. The Javascript callback API is: 
     1799 
     1800{{{ 
     1801onVASTLoadTimeout(error:String) 
     1802}}} 
     1803 
     1804== 28. Specifying a target window for a click-through == 
     1805 
     1806A "target" option has been added to the "clickSign" config element to allow a target browser window to be specified for a click-through action. The valid options are "_self", "_blank", "_parent" and "_top". The default setting is "_blank". 
     1807 
     1808The option can be used as follows: 
     1809 
     1810{{{ 
     1811{ 
     1812    "ads": { 
     1813          "clickSign": { 
     1814                 "target": "_self" 
     1815                 ... 
     1816          }, 
     1817          ... 
     1818    } 
     1819} 
     1820}}} 
     1821 
     1822== 29. Hard Coding Player Dimensions (JW5 only) == 
     1823 
     1824To get around an issue related to JW5 reporting dimensions of 0x0 when the player is embedded via an iFrame on IE7 running under Windows 7 or Vista, a configuration option has been added to allow the dimensions of the player to be hard-coded. 
     1825 
     1826To set the player dimensions, use the following config: 
     1827 
     1828{{{ 
     1829{ 
     1830    "player": { 
     1831          "width": 450, 
     1832          "height": 250 
     1833    }, 
     1834 
     1835    "ads": { 
     1836         .... 
     1837   } 
     1838} 
     1839}}} 
     1840 
     1841This option has been implemented for OVA for JW5 only. 
     1842 
     1843 == 30. Changing the Default Ad Title and Description == 
     1844 
     1845A config option has been added to allow the default title and description for ads to be changed when shown in playlist selection controls. 
     1846 
     1847By default, OVA sets the clip title and description fields to the following values: 
     1848 
     1849   * Default Title: "Advertisement" 
     1850   * Default Description: The value in the title field of the VAST response for the ad 
     1851 
     1852In all cases, the title and description are set on the clip objects as: 
     1853 
     1854   * title 
     1855   * description 
     1856 
     1857To modify the default values that OVA inserts for the title and description, use the "metaData" config option within the "ads" config group as follows: 
     1858 
     1859{{{ 
     1860{ 
     1861    ... 
     1862    "ads": { 
     1863        "metaData": { 
     1864             "linear": { 
     1865                  "title": "my new title goes here", 
     1866                  "description": "my description goes here" 
     1867             } 
     1868        } 
     1869        ..... 
     1870    } 
     1871} 
     1872}}} 
     1873 
     1874Two variables are available to use in the title and description text: 
     1875  
     1876   * `__duration__` - insert this variable if you want to add the duration to the text 
     1877   * `__index__` - insert this variable if you want to insert the sequence number of the ad 
     1878 
     1879For example, if you specify a line of text such as: 
     1880 
     1881   "My ad is `__duration__` seconds and is ad number `__index__`" 
     1882 
     1883You may end up with: 
     1884 
     1885   "My ad is 30 seconds and is ad number 1" 
     1886 
     1887You can see an example of this config option in action [X here]. 
     1888 
     1889== 31. OVA for JW5 Embedded Javascript Configuration with JW 5.6 == #JW56 
     1890 
     1891JW Player 5.6 permits deep, nested JSON configuration using the Javascript based JW Embedder. 
     1892 
     1893With the RC4 release, OVA for JW5 supports this form of configuration bringing the JW OVA configuration approach in line with OVA for Flowplayer. 
     1894 
     1895Below is an example of the nested JSON configuration approach now supported by JW 5.6 and OVA RC4. 
     1896 
     1897{{{ 
     1898<script type="text/javascript">jwplayer("container").setup({ 
     1899       flashplayer: "../../../dist/swf/jw-5.6.swf",  
     1900       playlist: [ 
     1901           { file: "http://streaming.openvideoads.org:81/shows/the-black-hole.mp4" } 
     1902       ], 
     1903       plugins: { 
     1904           "../../../dist/swf/ova.swf": {  
     1905              "debug": { 
     1906                  "levels": "fatal, config, vast_template, vpaid" 
     1907              }, 
     1908 
     1909              "ads": { 
     1910                 "playOnce": false, 
     1911                 "servers": [ 
     1912                     { 
     1913                        "type": "OpenX", 
     1914                        "apiAddress": "http://openx.openvideoads.org/openx/www/delivery/fc.php" 
     1915                     } 
     1916                 ], 
     1917                 "schedule": [ 
     1918                     { 
     1919                        "zone": "5", 
     1920                        "position": "pre-roll" 
     1921                     } 
     1922                 ] 
     1923              } 
     1924           } 
     1925       }, 
     1926       height: 300, 
     1927       width: 450 
     1928}); 
     1929</script> 
     1930}}} 
     1931 
     1932You can find an example running [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/jw-specific/example27.html here]. 
     1933 
     1934== 32. Specifying additional OBJECT/EMBED params for Companion SWFs == #additionalParamsForSWFCompanions 
     1935 
     1936An additional Ads config group setting `additionalParamsForSWFCompanions` has been added to allow additional parameters to be specified when the companion SWF object/embed tags are generated by OVA. 
     1937 
     1938Below is an example of how to use this new config property: 
     1939 
     1940{{{ 
     1941{ 
     1942     "ads": { 
     1943          "companions": [ 
     1944                { "id":"companion", "width":"300", "height":"250", "index": 1 } 
     1945          ], 
     1946          "additionalParamsForSWFCompanions": [ 
     1947                { "name": "wmode", value: "transparent" } 
     1948          ], 
     1949          "schedule": [ 
     1950              ... 
     1951          ], 
     1952          ... 
     1953     }, 
     1954     ... 
     1955}}} 
     1956 
     1957In this example a single new parameter is to be included in the SWF object/embed tag set - "wmode" with a value of "transparent". 
     1958 
     1959The `additionalParamsForSWFCompanions` property takes an Array of Objects as an argument with each object representing a single param to add to the object/embed tagset - the fields specify a `name` and `value` to use when generating the additional object/embed markup. 
     1960 
     1961An example of this running can be found [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/companions/example11.html here].  
     1962 
     1963== 33. On-demand loading of ad tags == #onDemandLoading 
     1964 
     1965RC4 introduces the notion of "on-demand" loading of ad tags. 
     1966 
     1967Previous versions of OVA pre-fetch all ads at startup time. The pre-fetching can be slightly delayed with the "delayAdRequestsUntilPlay" option, but with the pre-fetch model they still all happen when the user presses the play button. 
     1968 
     1969This is less than ideal for player setups that have long playlists as it results in many unused ad calls. 
     1970 
     1971From an ad provider perspective, this in turn makes the task of inventory management just that little bit more difficult. 
     1972 
     1973OVA provides a solution via the "loadOnDemand" option. 
     1974 
     1975Individual ad slots within a schedule may be declared as "loadOnDemand" - if OVA sees this config option set to "true", then the ad call will only be made just before the ad is to be played. 
     1976 
     1977Detailed below is an example configuration that illustrates how to use this option to ensure that each pre-roll ad is fetched only as required: 
     1978 
     1979{{{ 
     1980{ 
     1981    ... 
     1982    "ads": { 
     1983         "holdingClipUrl": "/path/to/your/holding-clip.mp4", 
     1984         "schedule": [ 
     1985              { 
     1986                   "position": "pre-roll", 
     1987                   "loadOnDemand": true, 
     1988                   "tag": "place-your-ad-tag-here" 
     1989              } 
     1990         ] 
     1991    } 
     1992    ... 
     1993} 
     1994}}} 
     1995 
     1996An example of this option in action can be found [http://static.openvideoads.org/qa/latest/ova.jwplayer.5x/examples/pages/deferred-loading here]. 
     1997 
     1998Linear "On Demand" ad clips use a blank clip termed a "holding clip" as a placeholder in the player playlist while the ad is being fetched and loaded into the player. If the ad call fails, the blank holding clip plays allowing playback to smoothly continue on. 
     1999 
     2000Whenever you configure an "on demand" linear ad slot, you must ensure that an appropriate "holding clip" is specified in the config. 
     2001 
     2002A default holding clip can be downloaded from the OVA static asset server here - [http://static.openvideoads.org/ads/blank/blank.flv http://static.openvideoads.org/ads/blank/blank.flv]. This clip is a 1 second blank FLV clip. 
     2003 
     2004Please note, never run a production config using holding clips served from the OVA asset server. This is a test server and is up and down constantly. Failure to retrieve a holding clip will impact the playback in your player. Always serve the holding clip from a server that you can rely on. 
     2005 
     2006=== 33.2 Blocking the first "on-demand" ad call until the Play button is pressed === 
     2007 
     2008In the case of a pre-roll, although the "loadOnDemand" option is set, the ad call for that pre-roll will still occur when the player is loaded up. 
     2009 
     2010To ensure that this first ad call does not happen until the user hits play, add in the "delayAdRequestUntilPlay" option as follows: 
     2011 
     2012{{{ 
     2013{ 
     2014    ... 
     2015    "delayAdRequestUntilPlay": true, 
     2016 
     2017    "ads": { 
     2018         "schedule": [ 
     2019              { 
     2020                   "position": "pre-roll", 
     2021                   "loadOnDemand": true, 
     2022                   "tag": "place-your-ad-tag-here" 
     2023              } 
     2024         ] 
     2025    } 
     2026    ... 
     2027} 
     2028}}} 
     2029 
     2030An example of this option in action can be found [http://static.openvideoads.org/qa/latest/ova.jwplayer.5x/examples/pages/deferred-loading/example12.html here]. 
     2031 
     2032=== 33.3 "On Demand" Ad Slots and Playlists === 
     2033 
     2034The "loadOnDemand" option can be used with fully loaded playlists. For example, in JW5, you may configure "onDemandAdSlots" as follows: 
     2035 
     2036{{{ 
     2037'plugins': { 
     2038           "../../../dist/swf/ova.swf": {  
     2039               "allowPlaylistControl": true, 
     2040 
     2041               "debug": {  
     2042                   "levels": "fatal, config, vast_template, vpaid, http_calls, tracking_events, playlist, api"  
     2043               }, 
     2044                
     2045               "ads": { 
     2046                   "holdingClipUrl": "http://static.openvideoads.org/ads/blank/blank.flv", 
     2047                   "schedule": [ 
     2048                       { 
     2049                          "position": "pre-roll", 
     2050                          "loadOnDemand": true, 
     2051                          "tag": "http://openx.openvideoads.org/openx/www/delivery/fc.php? 
     2052                                  script=bannerTypeHtml:vastInlineBannerTypeHtml:vastInlineHtml& 
     2053                                  zones=pre-roll0-0%3D5&nz=1&source=&r=R0.8062691302038729& 
     2054                                  block=1&format=vast&charset=UTF-8" 
     2055                       } 
     2056                   ] 
     2057               } 
     2058           } 
     2059       } 
     2060} 
     2061}}} 
     2062 
     2063"allowPlaylistControl" results in a full playlist be loaded into the player. Holding clips will be placed where ads are expected to be played, and then as the player gets to a point in the playlist where an ad is to be played, the ad call will be triggered and the returned ad will be loaded up in place of the holding clip. 
     2064 
     2065An example can be found [http://static.openvideoads.org/qa/latest/ova.jwplayer.5x/examples/pages/deferred-loading/example2.00.01.html here]. 
     2066 
     2067"loadOnDemand" may also be used with the "enforceLinearAdsOnPlaylistSelection" option. 
     2068 
     2069An example can be found running [http://static.openvideoads.org/qa/latest/ova.jwplayer.5x/examples/pages/deferred-loading/example2.00.08.html here]. 
     2070 
     2071== 34. Refreshing ads on replay == 
     2072 
     2073(NOT CHECKED IN YET) 
     2074 
     2075The "refreshOnReplay" option has been introduced to allow OVA to request a new ad each time the ad slot is played. 
     2076 
     2077This option is only available with the "loadOnDemand" model. 
     2078 
     2079The following code snippet illustrates how to ensure that a new ad call for a pre-roll occurs each time the ad slot is played: 
     2080 
     2081{{{ 
     2082{ 
     2083    ... 
     2084    "ads": { 
     2085         "schedule": [ 
     2086              { 
     2087                   "position": "pre-roll", 
     2088                   "loadOnDemand": true, 
     2089                   "refreshOnReplay": true, 
     2090                   "tag": "place-your-ad-tag-here" 
     2091              } 
     2092         ] 
     2093    } 
     2094    ... 
     2095} 
     2096}}} 
     2097 
     2098An example of this option in action can be found [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/deferred-loading/example11.html here]. 
     2099 
     2100== 35. Hiding a Custom Logo during Linear Ad Playback (Licensed JW5 players only) == 
     2101 
     2102If you have a licensed JW5 player you can now instruct OVA to hide a custom logo during linear ad playback. 
     2103 
     2104The new option is "hideLogoOnLinearPlayback" and should be used as follows: 
     2105 
     2106{{{ 
     2107{ 
     2108    ... 
     2109    "ads": { 
     2110           "hideLogoOnLinearPlayback": true, 
     2111           "schedule": [ 
     2112               ... 
     2113    } 
     2114} 
     2115}}} 
     2116 
     2117An example of this option in action can be found [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/jw-specific/logo/example29.html here]. 
     2118 
     2119Minimum version providing this feature is OVA for JW5 0.6.0 RC3 (build 213). 
     2120 
     2121== 36. VAST1 - Splitting multiple ad units within a single "inline" ad element == 
     2122 
     2123Some VAST 1 ad servers return multiple ad units within a single "inline" ad element. 
     2124 
     2125The two units are the "media files" that constitute the linear ad, and a set of non-linear ads that may be related. 
     2126 
     2127OpenX VAST1 responses support the notion of "click-to-play" overlays where the media files may be attached to one of the non-linear ads. As far as we are aware, this is the only ad server that supports that definition of a single "inline" ad element that purposely ties the linear media files to the non-linear ad units. 
     2128 
     2129RC4 has modified it's VAST 1 parsing logic to recognise if a VAST1 response is from an OpenX ad server or not. It uses the adSystem tagset in the VAST response to determine if the ads have originated from an OpenX ad server. 
     2130 
     2131If they have not originated from an OpenX ad server, a VAST1 response that has both the media files and non-linear ads within a single "inline" element will be split into two separate ad units - a linear ad (with the media files allocated) and a set of non-linear ads. 
     2132 
     2133You can override this default behaviour if required and instruct OVA to leave the video ad structure as is. To do so, configure OVA with the "ensureSingleAdUnitRecordedPerInlineAd" option as follows: 
     2134 
     2135{{{ 
     2136... 
     2137       "ads": { 
     2138            "schedule": [ 
     2139                 { 
     2140                     "position": "pre-roll", 
     2141                     "server": { 
     2142                          "type": "Adify", 
     2143                          "ensureSingleAdUnitRecordedPerInlineAd": false, 
     2144                          "tag": "http://ad.afy11.net/ad?enc=4__amp__asId=1000004375407__amp__sf=0__amp__ct=256" 
     2145                     } 
     2146                 } 
     2147            ] 
     2148      } 
     2149}}} 
     2150 
     2151You can find an example of this option in action [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/custom-delivery/example17.html here]. 
     2152 
     2153== 37. Using OVA with HTML Playlists and/or the JW "player.load()" Javascript API == 
     2154 
     2155Support for `jwplayer.load(playlist|clip)` javascript API has been added to OVA for JW5 in build 214. 
     2156 
     2157When the jwplayer.load() javascript API is called on JW Player 5, OVA can now react to that and reschedule the specified ads against the newly loaded playlist/clip. 
     2158 
     2159Amongst other things, this allows HTML playlists to be supported. 
     2160 
     2161=== 37.1 Enabling jwplayer.load() call === 
     2162 
     2163To enable OVA to react when the Javascript `jwplayer.load()` call is made, the `supportExternalPlaylistLoading: true` config option must be used as follows: 
     2164 
     2165{{{ 
     2166... 
     2167       "supportExternalPlaylistLoading": true, 
     2168 
     2169       "ads": { 
     2170            "schedule": [ 
     2171                 { 
     2172                     "position": "pre-roll", 
     2173                     ... 
     2174}}} 
     2175 
     2176You can see an example of this option in action [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/javascript/example2.01.00.html here]. 
     2177 
     2178=== 37.2 Enabling "auto start" === 
     2179 
     2180By default, when `jwplayer.load()` is used to load new clips into the JW Player and trigger OVA to schedule ads against those clips, the resulting playlist will not automatically start to play. 
     2181 
     2182There are three different approaches that can be used to force OVA to auto-play newly loaded playlists: 
     2183 
     21841. Use the standard "autostart" JW flashvar or "autoPlay" OVA configuration option - however this means that the player will also auto start when the page is loaded which may not be ideal. 
     2185 
     2186You can find an example of this in action [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/javascript/example2.04.00.html here]. 
     2187 
     21882. Use a new OVA option called "autoPlayOnExternalLoad". When this option is used, OVA will only auto start playback when the `jwplayer.load()` javascript call is used to trigger rescheduling. The option should be used as follows: 
     2189 
     2190{{{ 
     2191... 
     2192       "supportExternalPlaylistLoading": true, 
     2193       "autoPlayOnExternalLoad": true, 
     2194 
     2195       "ads": { 
     2196            "schedule": [ 
     2197                 { 
     2198                     "position": "pre-roll", 
     2199                     ... 
     2200 
     2201}}} 
     2202 
     2203You can find an example of this option in action [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/javascript/example2.03.00.html here]. 
     2204 
     22053. Use the new OVA Javascript callback `onOVAReadyToPlay(initialisationCounter)` to be notified when OVA has completed ad scheduling as a result of the `jwplayer.load()` trigger. You can then use `jwplayer.play()` to start playback manually via Javascript. The "initialisationCounter" argument passed in the "onOVAReadyToPlay" callback can be used to identify whether OVA has started up as a result of the player being loaded for the first time or as a result of subsequent `jwplayer.load()` calls. When OVA first loads and completes scheduling, the value of "initialisationCounter" will be 0, then on each subsequent rescheduling operation, the value will be incremented by 1. 
     2206 
     2207A typical `onOVAReadyToPlay()` implementation is as follows: 
     2208 
     2209{{{ 
     2210function onOVAReadyToPlay(initialisationCounter) { 
     2211   if(initialisationCount > 0) { 
     2212      jwPlayer("container").play(); 
     2213   } 
     2214} 
     2215}}} 
     2216 
     2217This method can be seen in action [http://static.openvideoads.org/qa/rc4-final/ova.jwplayer.5x/examples/pages/javascript/example2.01.00.html here].