/*****************************************************
*
* Copyright 2009 Adobe Systems Incorporated. All Rights Reserved.
*
*****************************************************
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
*
* The Initial Developer of the Original Code is Adobe Systems Incorporated.
* Portions created by Adobe Systems Incorporated are Copyright (C) 2009 Adobe Systems
* Incorporated. All Rights Reserved.
*
*****************************************************/
package org.osmf.net
{
import org.osmf.media.MediaResourceBase;
import org.osmf.media.URLResource;
import org.osmf.utils.URL;
CONFIG::FLASH_10_1
{
import org.osmf.metadata.MetadataNamespaces;
}
[ExcludeClass]
/**
* @private
*/
public class NetStreamUtils
{
/**
* Returns the stream name to be passed to NetStream for a given URL,
* the empty string if no such stream name can be extracted.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public static function getStreamNameFromURL(url:String, urlIncludesFMSApplicationInstance:Boolean=false):String
{
var streamName:String = "";
// The stream name varies based on RTMP vs. progressive.
if (url != null)
{
if (isRTMPStream(url))
{
var fmsURL:FMSURL = new FMSURL(url, urlIncludesFMSApplicationInstance);
streamName = fmsURL.streamName;
// Add optional query parameters to the stream name.
if (fmsURL.query != null && fmsURL.query != "")
{
streamName += "?" + fmsURL.query;
}
}
else
{
streamName = url;
}
}
return streamName;
}
/**
* Returns true if the given resource represents a streaming resource, false otherwise.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public static function isStreamingResource(resource:MediaResourceBase):Boolean
{
var result:Boolean = false;
if (resource != null)
{
var urlResource:URLResource = resource as URLResource;
if (urlResource != null)
{
result = NetStreamUtils.isRTMPStream(urlResource.url);
CONFIG::FLASH_10_1
{
if (result == false)
{
result = urlResource.getMetadataValue(MetadataNamespaces.HTTP_STREAMING_METADATA) != null;
}
}
}
}
return result;
}
/**
* Returns true if the given URL represents an RTMP stream, false otherwise.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public static function isRTMPStream(url:String):Boolean
{
var result:Boolean = false;
if (url != null)
{
var theURL:URL = new URL(url);
var protocol:String = theURL.protocol;
if (protocol != null && protocol.length > 0)
{
result = (protocol.search(/^rtmp$|rtmp[tse]$|rtmpte$/i) != -1);
}
}
return result;
}
/**
* Returns the stream type of the given resource.
*
* @returns One of the stream types defined in org.osmf.net.StreamType
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public static function getStreamType(resource:MediaResourceBase):String
{
// Default to RECORDED.
var streamType:String = StreamType.RECORDED;
var streamingURLResource:StreamingURLResource = resource as StreamingURLResource;
if (streamingURLResource != null)
{
streamType = streamingURLResource.streamType;
}
return streamType;
}
/**
* Returns the value of the "start" and "len" arguments for
* NetStream.play, based on the specified resource. Checks for
* live vs. recorded, subclips, etc. The results are returned
* in an untyped Object where the start value maps to "start"
* and the len value maps to "len".
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public static function getPlayArgsForResource(resource:MediaResourceBase):Object
{
var startArg:Number = PLAY_START_ARG_ANY;
var lenArg:Number = PLAY_LEN_ARG_ALL;
// Check for live vs. recorded.
switch (getStreamType(resource))
{
case StreamType.LIVE_OR_RECORDED:
startArg = PLAY_START_ARG_ANY;
break;
case StreamType.LIVE:
startArg = PLAY_START_ARG_LIVE;
break;
case StreamType.RECORDED:
startArg = PLAY_START_ARG_RECORDED;
break;
}
// Check for subclip metadata (which is ignored for live).
if ( startArg != PLAY_START_ARG_LIVE
&& resource != null
)
{
var streamingResource:StreamingURLResource = resource as StreamingURLResource;
if (streamingResource != null && isStreamingResource(streamingResource))
{
if (!isNaN(streamingResource.clipStartTime))
{
startArg = streamingResource.clipStartTime;
}
if (!isNaN(streamingResource.clipEndTime))
{
// The presence of any subclip info means that our startArg
// should be non-negative.
startArg = Math.max(0, startArg);
// Disallow negative durations.
lenArg = Math.max(0, streamingResource.clipEndTime - startArg);
}
}
}
return {start:startArg, len:lenArg};
}
// Consts for the NetStream.play() method
public static const PLAY_START_ARG_ANY:int = -2;
public static const PLAY_START_ARG_LIVE:int = -1;
public static const PLAY_START_ARG_RECORDED:int = 0;
public static const PLAY_LEN_ARG_ALL:int = -1;
}
}