/* * PAPER ON ERVIS NPAPER ISION PE IS ON PERVI IO APER SI PA * AP VI ONPA RV IO PA SI PA ER SI NP PE ON AP VI ION AP * PERVI ON PE VISIO APER IONPA RV IO PA RVIS NP PE IS ONPAPE * ER NPAPER IS PE ON PE ISIO AP IO PA ER SI NP PER * RV PA RV SI ERVISI NP ER IO PE VISIO AP VISI PA RV3D * ______________________________________________________________________ * papervision3d.org • blog.papervision3d.org • osflash.org/papervision3d */ /* * Copyright 2006 (c) Carlos Ulloa Matesanz, noventaynueve.com. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /** * @author Patrick Pietens * @author John Grden * @author Carlos Ulloa * * @note Special thanks to Patrick Pietens for putting this together and flushing it out! */ // __________________________________________________________________________ VIDEO MATERIAL package org.papervision3d.materials { import flash.display.BitmapData; import flash.events.NetStatusEvent; import flash.geom.Matrix; import flash.media.Video; import flash.net.NetStream; /* * The VideoMaterial class creates a texture from an existing Video instance and is for use with a Video and NetStream objects with an RTMP stream. *

* The texture can be animated and/or transparent. *

* Materials collects data about how objects appear when rendered. */ public class VideoStreamMaterial extends MovieMaterial { // ______________________________________________________________________ PUBLIC /** * The NetStream and Vdeo that are used as a texture. */ public var stream:NetStream; public var video:Video; // ______________________________________________________________________ NEW /** * The MovieMaterial class creates a texture from an existing Video instance. * * @param video A video object that display the FLV file * @param stream Stream that is used to play the FLV file * @param initObject [optional] - An object that contains additional properties with which to populate the newly created material. */ public function VideoStreamMaterial ( video:Video=null, stream:NetStream=null, initObject:Object=null ) { // store the values this.stream = stream; this.video = video; // init the material with a listener for the NS object initMaterial ( video, stream ); super ( video, initObject ); } // ______________________________________________________________________ INITIALISE /** * Executes when the VideoMaterial is instantiated */ private function initMaterial ( video:Video, stream:NetStream ):void { stream.addEventListener ( NetStatusEvent.NET_STATUS, onStreamStatus ); } // ______________________________________________________________________ CREATE BITMAP /** * Creates the bitmap that is used as a texture * * @param The asset that is used as a texture. */ protected override function createBitmap( asset:* ):BitmapData { // Dispose of previous bitmap if( this.bitmap ) this.bitmap.dispose(); // Create new bitmap this.bitmap = correctBitmap( new BitmapData( asset.width, asset.height, this.movieTransparent ), true ); // Draw bitmap this.updateBitmap(); return this.bitmap; } // ______________________________________________________________________ UPDATE /** * Updates Video Bitmap * * Draws the current Video frame onto bitmap. */ public override function updateBitmap ():void { // copies the scale properties of the video var myMatrix:Matrix = new Matrix(); myMatrix.scale( this.video.scaleX, this.video.scaleY ); // Fills the rectangle with a background color this.bitmap.fillRect ( this.bitmap.rect, this.fillColor ); // Due to security reasons the BitmapData cannot access RTMP content like a NetStream using a FMS server. // The next three lines are a simple but effective workaround to get pass Flash its security sandbox. this.video.attachNetStream ( null ); this.bitmap.draw( this.video, myMatrix, this.video.transform.colorTransform ); this.video.attachNetStream ( this.stream ); } // ______________________________________________________________________ STREAM STATUS /** * Executes when the status of the NetStream object changes * * @param Event that invoked the handler */ private function onStreamStatus ( event:NetStatusEvent ):void { switch ( event.info.code ) { case "NetStream.Play.Start": animated = true; break; case "NetStream.Unpause.Notify": animated = true; break; case "NetStream.Play.Failed": animated = false; break; case "NetStream.Play.Stop": animated = false; break; case "NetStream.Play.StreamNotFound": animated = false; break; case "NetStream.Pause.Notify": animated = false; break; } } // ______________________________________________________________________ TO STRING /** * Returns a string value representing the material properties in the specified VideoMaterial object. * * @return A string. */ public override function toString():String { return 'Texture:' + this.texture; } } }