Add enhanced support for ASF files

git-svn-id: http://php-reader.googlecode.com/svn/trunk@108 51a70ab9-7547-0410-9469-37e369ee0574
This commit is contained in:
svollbehr
2008-09-05 17:00:05 +00:00
parent 741de5a2ab
commit 5ab1bb40f6
29 changed files with 3370 additions and 1652 deletions

View File

@@ -39,8 +39,6 @@
/**#@+ @ignore */ /**#@+ @ignore */
require_once("Reader.php"); require_once("Reader.php");
require_once("ASF/Object/Container.php"); require_once("ASF/Object/Container.php");
//require_once("ASF/Object/Header.php");
//require_once("ASF/Object/Data.php");
/**#@-*/ /**#@-*/
/** /**

View File

@@ -0,0 +1,109 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Advanced Content Encryption Object</i> lets authors protect content by
* using Next Generation Windows Media Digital Rights Management for Network
* Devices.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_AdvancedContentEncryption extends ASF_Object
{
const WINDOWS_MEDIA_DRM_NETWORK_DEVICES =
"7a079bb6-daa4-4e12-a5ca-91d3 8dc11a8d";
/** @var Array */
private $_contentEncryptionRecords = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$contentEncryptionRecordsCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $contentEncryptionRecordsCount; $i++) {
$entry = array("systemId" => $this->_reader->readGUID(),
"systemVersion" => $this->_reader->readUInt32LE(),
"streamNumbers" => array());
$encryptedObjectRecordCount = $this->_reader->readUInt16LE();
for ($j = 0; $j < $encryptedObjectRecordCount; $j++) {
$this->_reader->skip(4);
$entry["streamNumbers"][] = $this->_reader->readUInt16LE();
}
$dataCount = $this->_reader->readUInt32LE();
$entry["data"] = $this->_reader->read($dataCount);
$this->_contentEncryptionRecords[] = $entry;
}
}
/**
* Returns an array of content encryption records. Each record consists of the
* following keys.
*
* o systemId -- Specifies the unique identifier for the content encryption
* system.
*
* o systemVersion -- Specifies the version of the content encryption
* system.
*
* o streamNumbers -- An array of stream numbers a particular Content
* Encryption Record is associated with.
*
* o data -- The content protection data for this Content Encryption Record.
*
* @return Array
*/
public function getContentEncryptionRecords()
{
return $this->_contentEncryptionRecords;
}
}

View File

@@ -0,0 +1,100 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Advanced Mutual Exclusion Object</i> identifies streams that have a
* mutual exclusion relationship to each other (in other words, only one of the
* streams within such a relationship can be streamed—the rest are ignored).
* There should be one instance of this object for each set of objects that
* contain a mutual exclusion relationship. The exclusion type is used so that
* implementations can allow user selection of common choices, such as language.
* This object must be used if any of the streams in the mutual exclusion
* relationship are hidden.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_AdvancedMutualExclusion extends ASF_Object
{
const MUTEX_LANGUAGE = "d6e22a00-35da-11d1-9034-00a0c90349be";
const MUTEX_BITRATE = "d6e22a01-35da-11d1-9034-00a0c90349be";
const MUTEX_UNKNOWN = "d6e22a02-35da-11d1-9034-00a0c90349be";
/** @var string */
private $_exclusionType;
/** @var Array */
private $_streamNumbers = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_exclusionType = $this->_reader->readGUID();
$streamNumbersCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $streamNumbersCount; $i++)
$this->_streamNumbers[] = $this->_reader->readUInt16LE();
}
/**
* Returns the nature of the mutual exclusion relationship.
*
* @return string
*/
public function getExclusionType() { return $this->_exclusionType; }
/**
* Returns an array of stream numbers.
*
* @return Array
*/
public function getStreamNumbers() { return $this->_streamNumbers; }
}

View File

@@ -0,0 +1,133 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Bandwidth Sharing Object</i> indicates streams that share bandwidth in
* such a way that the maximum bandwidth of the set of streams is less than the
* sum of the maximum bandwidths of the individual streams. There should be one
* instance of this object for each set of objects that share bandwidth. Whether
* or not this object can be used meaningfully is content-dependent.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_BandwidthSharing extends ASF_Object
{
const SHARING_EXCLUSIVE = "af6060aa-5197-11d2-b6af-00c04fd908e9";
const SHARING_PARTIAL = "af6060ab-5197-11d2-b6af-00c04fd908e9";
/** @var string */
private $_sharingType;
/** @var integer */
private $_dataBitrate;
/** @var integer */
private $_bufferSize;
/** @var Array */
private $_streamNumbers = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_sharingType = $this->_reader->readGUID();
$this->_dataBitrate = $this->_reader->readUInt32LE();
$this->_bufferSize = $this->_reader->readUInt32LE();
$streamNumbersCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $streamNumbersCount; $i++)
$this->_streamNumbers[] = $this->_reader->readUInt16LE();
}
/**
* Returns the type of sharing relationship for this object. Two types are
* predefined: SHARING_PARTIAL, in which any number of the streams in the
* relationship may be streaming data at any given time; and
* SHARING_EXCLUSIVE, in which only one of the streams in the relationship
* may be streaming data at any given time.
*
* @return string
*/
public function getSharingType() { return $this->_sharingType; }
/**
* Returns the leak rate R, in bits per second, of a leaky bucket that
* contains the data portion of all of the streams, excluding all ASF Data
* Packet overhead, without overflowing. The size of the leaky bucket is
* specified by the value of the Buffer Size field. This value can be less
* than the sum of all of the data bit rates in the
* {@link ASF_Object_ExtendedStreamProperties Extended Stream Properties}
* Objects for the streams contained in this bandwidth-sharing relationship.
*
* @return integer
*/
public function getDataBitrate() { return $this->_dataBitrate; }
/**
* Specifies the size B, in bits, of the leaky bucket used in the Data Bitrate
* definition. This value can be less than the sum of all of the buffer sizes
* in the {@link ASF_Object_ExtendedStreamProperties Extended Stream
* Properties} Objects for the streams contained in this bandwidth-sharing
* relationship.
*
* @return integer
*/
public function getBufferSize() { return $this->_bufferSize; }
/**
* Returns an array of stream numbers.
*
* @return Array
*/
public function getStreamNumbers() { return $this->_streamNumbers; }
}

View File

@@ -0,0 +1,88 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Compatibility Object</i> is reserved for future use.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_Compatibility extends ASF_Object
{
/** @var integer */
private $_profile;
/** @var integer */
private $_mode;
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_profile = $this->_reader->readUInt8();
$this->_mode = $this->_reader->readUInt8();
}
/**
* Returns the profile field. This field is reserved and is set to 2.
*
* @return integer
*/
public function getProfile() { return $this->_profile; }
/**
* Returns the mode field. This field is reserved and is set to 1.
*
* @return integer
*/
public function getMode() { return $this->_mode; }
}

View File

@@ -174,4 +174,22 @@ abstract class ASF_Object_Container extends ASF_Object
} }
throw new ASF_Exception("Unknown field/object: " . $name); throw new ASF_Exception("Unknown field/object: " . $name);
} }
/**
* Magic function so that isset($obj->value) will work. This method checks
* whether the object by given identifier is contained by this container.
*
* @param string $name The object name.
* @return boolean
*/
public function __isset($name)
{
if (defined($constname = get_class($this) . "::" . strtoupper
(preg_replace("/[A-Z]/", "_$0", $name)))) {
$objects = $this->getObjectsByIdentifier(constant($constname));
return isset($objects[0]);
}
else
return isset($this->_objects[$name]);
}
} }

126
src/ASF/Object/Data.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
require_once("ASF/Object/Data/Packet.php");
/**#@-*/
/**
* The <i>Data Object</i> contains all of the <i>Data Packet</i>s for a file.
* These Data Packets are organized in terms of increasing send times. A <i>Data
* Packet</i> can contain interleaved data from several digital media streams.
* This data can consist of entire objects from one or more streams.
* Alternatively, it can consist of partial objects (fragmentation).
*
* Capabilities provided within the interleave packet definition include:
* o Single or multiple payload types per Data Packet
* o Fixed-size Data Packets
* o Error correction information (optional)
* o Clock information (optional)
* o Redundant sample information, such as presentation time stamp (optional)
*
* @todo Implement optional support for ASF Data Packet parsing
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_Data extends ASF_Object
{
/** @var string */
private $_fileId;
/** @var integer */
private $_totalDataPackets;
/** @var Array */
private $_dataPackets;
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_fileId = $this->_reader->readGUID();
$this->_totalDataPackets = $this->_reader->readInt64LE();
$this->_reader->skip(2);
/* Data packets are not supported
* for ($i = 0; $i < $this->_totalDataPackets; $i++) {
* $this->_dataPackets[] = new ASF_Object_Data_Packet($reader);
* }
*/
}
/**
* Returns the unique identifier for this ASF file. The value of this field
* is changed every time the file is modified in any way. The value of this
* field is identical to the value of the <i>File ID</i> field of the
* <i>Header Object</i>.
*
* @return string
*/
public function getFileId() { return $this->_fileId; }
/**
* Returns the number of ASF Data Packet entries that exist within the <i>Data
* Object</i>. It must be equal to the <i>Data Packet Count</i> field in the
* <i>File Properties Object</i>. The value of this field is invalid if the
* broadcast flag field of the <i>File Properties Object</i> is set to 1.
*
* @return integer
*/
public function getTotalDataPackets() { return $this->_endTime; }
/**
* Returns an array of Data Packets.
*
* @return Array
*/
public function getDataPackets()
{
throw new ASF_Exception("Data packets are not parsed due to optimization.");
}
}

View File

@@ -111,4 +111,12 @@ final class ASF_Object_ExtendedContentDescription extends ASF_Object
return $this->_contentDescriptors[$name]; return $this->_contentDescriptors[$name];
return false; return false;
} }
/**
* Returns an associate array of all the descriptors defined having the names
* of the descriptors as the keys.
*
* @return Array
*/
public function getDescriptors() { return $this->_contentDescriptors; }
} }

View File

@@ -113,6 +113,19 @@ final class ASF_Object_ExtendedStreamProperties extends ASF_Object
const NO_ERROR_CORRECTION = "20fb5700-5b55-11cf-a8fd-00805f5c442b"; const NO_ERROR_CORRECTION = "20fb5700-5b55-11cf-a8fd-00805f5c442b";
const AUDIO_SPREAD = "bfc3cd50-618f-11cf-8bb2-00aa00b4e220"; const AUDIO_SPREAD = "bfc3cd50-618f-11cf-8bb2-00aa00b4e220";
const PAYLOAD_EXTENSION_SYSTEM_TIMECODE =
"399595ec-8667-4e2d-8fdb-98814ce76c1e";
const PAYLOAD_EXTENSION_SYSTEM_FILE_NAME =
"e165ec0e-19ed-45d7-b4a7-25cbd1e28e9b";
const PAYLOAD_EXTENSION_SYSTEM_CONTENT_TYPE =
"d590dc20-07bc-436c-9cf7-f3bbfbf1a4dc";
const PAYLOAD_EXTENSION_SYSTEM_PIXEL_ASPECT_RATIO =
"1b1ee554-f9ea-4bc8-821a-376b74e4c4b8";
const PAYLOAD_EXTENSION_SYSTEM_SAMPLE_DURATION =
"c6bd9450-867f-4907-83a3-c77921b733ad";
const PAYLOAD_EXTENSION_SYSTEM_ENCRYPTION_SAMPLE_ID =
"6698b84e-0afa-4330-aeb2-1c0a98d7a44d";
/** @var integer */ /** @var integer */
private $_startTime; private $_startTime;

View File

@@ -0,0 +1,108 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Group Mutual Exclusion Object</i> is used to describe mutual exclusion
* relationships between groups of streams. This object is organized in terms of
* records, each containing one or more streams, where a stream in record N
* cannot coexist with a stream in record M for N != M (however, streams in the
* same record can coexist). This mutual exclusion object would be used
* typically for the purpose of language mutual exclusion, and a record would
* consist of all streams for a particular language.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_GroupMutualExclusion extends ASF_Object
{
const MUTEX_LANGUAGE = "d6e22a00-35da-11d1-9034-00a0c90349be";
const MUTEX_BITRATE = "d6e22a01-35da-11d1-9034-00a0c90349be";
const MUTEX_UNKNOWN = "d6e22a02-35da-11d1-9034-00a0c90349be";
/** @var string */
private $_exclusionType;
/** @var Array */
private $_records = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_exclusionType = $this->_reader->readGUID();
$recordCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $recordCount; $i++) {
$streamNumbersCount = $this->_reader->readUInt16LE();
$streamNumbers = array();
for ($j = 0; $j < $streamNumbersCount; $j++)
$streamNumbers[] = array
("streamNumbers" => $this->_reader->readUInt16LE());
$this->_records[] = $streamNumbers;
}
}
/**
* Returns the nature of the mutual exclusion relationship.
*
* @return string
*/
public function getExclusionType() { return $this->_exclusionType; }
/**
* Returns an array of records. Each record consists of the following keys.
*
* o streamNumbers -- Specifies the stream numbers for this record. Valid
* values are between 1 and 127.
*
* @return Array
*/
public function getRecords() { return $this->_records; }
}

View File

@@ -40,10 +40,10 @@ require_once("ASF/Object/Container.php");
/**#@-*/ /**#@-*/
/** /**
* The <i>Header Extension Object<i> allows additional functionality to be added * The <i>Header Extension Object</i> allows additional functionality to be
* to an ASF file while maintaining backward compatibility. The Header Extension * added to an ASF file while maintaining backward compatibility. The Header
* Object is a container containing 0 or more additional extended header * Extension Object is a container containing zero or more additional extended
* objects. * header objects.
* *
* @package php-reader * @package php-reader
* @subpackage ASF * @subpackage ASF

185
src/ASF/Object/Index.php Normal file
View File

@@ -0,0 +1,185 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* This top-level ASF object supplies the necessary indexing information for an
* ASF file that contains more than just a plain script-audio-video combination.
* It includes stream-specific indexing information based on an adjustable index
* entry time interval. The index is designed to be broken into blocks to
* facilitate storage that is more space-efficient by using 32-bit offsets
* relative to a 64-bit base. That is, each index block has a full 64-bit offset
* in the block header that is added to the 32-bit offsets found in each index
* entry. If a file is larger than 2^32 bytes, then multiple index blocks can be
* used to fully index the entire large file while still keeping index entry
* offsets at 32 bits.
*
* Indices into the <i>Index Object</i> are in terms of presentation times. The
* corresponding <i>Offset</i> field values of the <i>Index Entry</i> byte
* offsets that, when combined with the <i>Block Position</i> value of the
* <i>Index Block</i>, indicate the starting location in bytes of an ASF Data
* Packet relative to the start of the first ASF Data Packet in the file.
*
* An offset value of 0xFFFFFFFF is used to indicate an invalid offset value.
* Invalid offsets signify that this particular index entry does not identify a
* valid indexible point. Invalid offsets may occur for the initial index
* entries of a digital media stream whose first ASF Data Packet has a non-zero
* send time. Invalid offsets may also occur in the case where a digital media
* stream has a large gap in the presentation time of successive objects.
*
* The <i>Index Object</i> is not recommended for use with files where the
* <i>Send Time</i> of the first <i>Data Packet</i> within the <i>Data
* Object</i> has a <i>Send Time</i> value significantly greater than zero
* (otherwise the index itself will be sparse and inefficient).
*
* Any ASF file containing an <i>Index Object</i> does also contain an <i>Index
* Parameters Object</i> in its {@link ASF_Object_Header ASF Header}.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_Index extends ASF_Object
{
/**
* Indicates that the index type is Nearest Past Data Packet. The Nearest
* Past Data Packet indexes point to the data packet whose presentation time
* is closest to the index entry time.
*/
const NEAREST_PAST_DATA_PACKET = 1;
/**
* Indicates that the index type is Nearest Past Media. The Nearest Past
* Object indexes point to the closest data packet containing an entire object
* or first fragment of an object.
*/
const NEAREST_PAST_MEDIA = 2;
/**
* Indicates that the index type is Nearest Past Cleanpoint. The Nearest Past
* Cleanpoint indexes point to the closest data packet containing an entire
* object (or first fragment of an object) that has the Cleanpoint Flag set.
*
* Nearest Past Cleanpoint is the most common type of index.
*/
const NEAREST_PAST_CLEANPOINT = 3;
/** @var integer */
private $_indexEntryTimeInterval;
/** @var Array */
private $_indexSpecifiers = array();
/** @var Array */
private $_indexBlocks = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_indexEntryTimeInterval = $this->_reader->readUInt32LE();
$indexSpecifiersCount = $this->_reader->readUInt16LE();
$indexBlocksCount = $this->_reader->readUInt32LE();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$this->_indexSpecifiers[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"indexType" => $this->_reader->readUInt16LE());
for ($i = 0; $i < $indexBlocksCount; $i++) {
$indexEntryCount = $this->_reader->readUInt32LE();
$blockPositions = array();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$blockPositions[] = $this->_reader->readInt64LE();
$offsets = array();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$offsets[] = $this->_reader->readUInt32LE();
$this->_indexBlocks[] = array
("blockPositions" => $blockPositions,
"indexEntryOffsets" => $offsets);
}
}
/**
* Returns the time interval between each index entry in ms.
*
* @return integer
*/
public function getIndexEntryTimeInterval()
{
return $this->_indexEntryTimeInterval;
}
/**
* Returns an array of index specifiers. Each entry consists of the following
* keys.
*
* o streamNumber -- Specifies the stream number that the <i>Index
* Specifiers</i> refer to. Valid values are between 1 and 127.
*
* o indexType -- Specifies the type of index.
*
* @return Array
*/
public function getIndexSpecifiers() { return $this->_indexSpecifiers; }
/**
* Returns an array of index entries. Each entry consists of the following
* keys.
*
* o blockPositions -- Specifies a list of byte offsets of the beginnings of
* the blocks relative to the beginning of the first Data Packet (for
* example, the beginning of the Data Object + 50 bytes).
*
* o indexEntryOffsets -- Specifies the offset. An offset value of
* 0xffffffff indicates an invalid offset value.
*
* @return Array
*/
public function getIndexBlocks() { return $this->_indexBlocks; }
}

View File

@@ -0,0 +1,121 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Index Parameters Object</i> supplies information about those streams
* that are actually indexed (there must be at least one stream in an index) by
* the {@link ASF_Object_Index Index Object} and how they are being indexed.
* This object shall be present in the {@link ASF_Object_Header Header Object}
* if there is an {@link ASF_Object_Index Index Object} present in the file.
*
* An Index Specifier is required for each stream that will be indexed by the
* {@link ASF_Object_Index Index Object}. These specifiers must exactly match
* those in the {@link ASF_Object_Index Index Object}.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_IndexParameters extends ASF_Object
{
/** @var string */
private $_indexEntryTimeInterval;
/** @var Array */
private $_indexSpecifiers = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_indexEntryTimeInterval = $this->_reader->readUInt32LE();
$indexSpecifiersCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $indexSpecifiersCount; $i++) {
$this->_indexSpecifiers[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"indexType" => $this->_reader->readUInt16LE());
}
}
/**
* Returns the time interval between index entries in milliseconds. This value
* cannot be 0.
*
* @return integer
*/
public function getIndexEntryTimeInterval()
{
return $this->_indexEntryTimeInterval;
}
/**
* Returns an array of index entries. Each entry consists of the following
* keys.
*
* o streamNumber -- Specifies the stream number that the Index Specifiers
* refer to. Valid values are between 1 and 127.
*
* o indexType -- Specifies the type of index. Values are as follows:
* 1 = Nearest Past Data Packet,
* 2 = Nearest Past Media Object, and
* 3 = Nearest Past Cleanpoint.
* The Nearest Past Data Packet indexes point to the data packet whose
* presentation time is closest to the index entry time. The Nearest Past
* Object indexes point to the closest data packet containing an entire
* object or first fragment of an object. The Nearest Past Cleanpoint
* indexes point to the closest data packet containing an entire object
* (or first fragment of an object) that has the Cleanpoint Flag set.
* Nearest Past Cleanpoint is the most common type of index.
*
* @return Array
*/
public function getIndexSpecifiers() { return $this->_indexSpecifiers; }
}

View File

@@ -0,0 +1,176 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* This top-level ASF object supplies media object indexing information for the
* streams of an ASF file. It includes stream-specific indexing information
* based on an adjustable index entry media object count interval. This object
* can be used to index all the video frames or key frames in a video stream.
* The index is designed to be broken into blocks to facilitate storage that is
* more space-efficient by using 32-bit offsets relative to a 64-bit base. That
* is, each index block has a full 64-bit offset in the block header that is
* added to the 32-bit offset found in each index entry. If a file is larger
* than 2^32 bytes, then multiple index blocks can be used to fully index the
* entire large file while still keeping index entry offsets at 32 bits.
*
* Indices into the <i>Media Object Index Object</i> are in terms of media
* object numbers, with the first frame for a given stream in the ASF file
* corresponding to entry 0 in the <i>Media Object Index Object</i>. The
* corresponding <i>Offset</i> field values of the <i>Index Entry</i> are byte
* offsets that, when combined with the <i>Block Position</i> value of the
* Index Block, indicate the starting location in bytes of an ASF Data Packet
* relative to the start of the first ASF Data Packet in the file.
*
* Any ASF file containing a <i>Media Object Index Object</i> shall also contain
* a <i>Media Object Index Parameters Object</i> in its
* {@link ASF_Object_Header ASF Header}.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_MediaObjectIndex extends ASF_Object
{
/**
* Indicates that the index type is Nearest Past Data Packet. The Nearest
* Past Data Packet indexes point to the data packet whose presentation time
* is closest to the index entry time.
*/
const NEAREST_PAST_DATA_PACKET = 1;
/**
* Indicates that the index type is Nearest Past Media. The Nearest Past
* Object indexes point to the closest data packet containing an entire object
* or first fragment of an object.
*/
const NEAREST_PAST_MEDIA = 2;
/**
* Indicates that the index type is Nearest Past Cleanpoint. The Nearest Past
* Cleanpoint indexes point to the closest data packet containing an entire
* object (or first fragment of an object) that has the Cleanpoint Flag set.
*
* Nearest Past Cleanpoint is the most common type of index.
*/
const NEAREST_PAST_CLEANPOINT = 3;
/** @var integer */
private $_indexEntryCountInterval;
/** @var Array */
private $_indexSpecifiers = array();
/** @var Array */
private $_indexBlocks = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_indexEntryCountInterval = $this->_reader->readUInt32LE();
$indexSpecifiersCount = $this->_reader->readUInt16LE();
$indexBlocksCount = $this->_reader->readUInt32LE();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$this->_indexSpecifiers[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"indexType" => $this->_reader->readUInt16LE());
for ($i = 0; $i < $indexBlocksCount; $i++) {
$indexEntryCount = $this->_reader->readUInt32LE();
$blockPositions = array();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$blockPositions[] = $this->_reader->readInt64LE();
$offsets = array();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$offsets[] = $this->_reader->readUInt32LE();
$this->_indexBlocks[] = array
("blockPositions" => $blockPositions,
"indexEntryOffsets" => $offsets);
}
}
/**
* Returns the interval between each index entry in number of media objects.
*
* @return integer
*/
public function getIndexEntryCountInterval()
{
return $this->_indexEntryCountInterval;
}
/**
* Returns an array of index specifiers. Each entry consists of the following
* keys.
*
* o streamNumber -- Specifies the stream number that the <i>Index
* Specifiers</i> refer to. Valid values are between 1 and 127.
*
* o indexType -- Specifies the type of index.
*
* @return Array
*/
public function getIndexSpecifiers() { return $this->_indexSpecifiers; }
/**
* Returns an array of index entries. Each entry consists of the following
* keys.
*
* o blockPositions -- Specifies a list of byte offsets of the beginnings of
* the blocks relative to the beginning of the first Data Packet (for
* example, the beginning of the Data Object + 50 bytes).
*
* o indexEntryOffsets -- Specifies the offset. An offset value of
* 0xffffffff indicates an invalid offset value.
*
* @return Array
*/
public function getIndexBlocks() { return $this->_indexBlocks; }
}

View File

@@ -0,0 +1,130 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Media Object Index Parameters Object</i> supplies information about
* those streams that actually indexed (there must be at least one stream in an
* index) by media objects. This object shall be present in the
* {@link ASF_Object_Header Header Object} if there is a
* {@link ASF_Object_MediaObjectIndex Media Object Index Object} present in the
* file.
*
* An Index Specifier is required for each stream that will be indexed by the
* {@link ASF_Object_MediaObjectIndex Media Object Index Object}. These
* specifiers must exactly match those in the
* {@link ASF_Object_MediaObjectIndex Media Object Index Object}.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_MediaObjectIndexParameters extends ASF_Object
{
/** @var string */
private $_indexEntryCountInterval;
/** @var Array */
private $_indexSpecifiers = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_indexEntryCountInterval = $this->_reader->readUInt32LE();
$indexSpecifiersCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $indexSpecifiersCount; $i++) {
$this->_indexSpecifiers[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"indexType" => $this->_reader->readUInt16LE());
}
}
/**
* Returns the interval between each index entry by the number of media
* objects. This value cannot be 0.
*
* @return integer
*/
public function getIndexEntryCountInterval()
{
return $this->_indexEntryCountInterval;
}
/**
* Returns an array of index entries. Each entry consists of the following
* keys.
*
* o streamNumber -- Specifies the stream number that the Index Specifiers
* refer to. Valid values are between 1 and 127.
*
* o indexType -- Specifies the type of index. Values are defined as
* follows:
* 1 = Nearest Past Data Packet,
* 2 = Nearest Past Media Object,
* 3 = Nearest Past Cleanpoint,
* 0xff = Frame Number Offset.
* For a video stream, the Nearest Past Media Object and Nearest Past Data
* Packet indexes point to the closest data packet containing an entire
* video frame or first fragment of a video frame; Nearest Past Cleanpoint
* indexes point to the closest data packet containing an entire video
* frame (or first fragment of a video frame) that is a key frame; and
* Frame Number Offset indicates how many more frames need to be read for
* the given stream, starting with the first frame in the packet pointed
* to by the index entry, in order to get to the requested frame. Nearest
* Past Media Object is the most common value. Because ASF payloads do not
* contain the full frame number, there is often a Frame Number Offset
* index alongside one of the other types of indexes to allow the user to
* identify the exact frame being seeked to.
*
* @return Array
*/
public function getIndexSpecifiers() { return $this->_indexSpecifiers; }
}

View File

@@ -87,7 +87,7 @@ final class ASF_Object_SimpleIndex extends ASF_Object
$this->_indexEntryTimeInterval = $this->_reader->readInt64LE(); $this->_indexEntryTimeInterval = $this->_reader->readInt64LE();
$this->_maximumPacketCount = $this->_reader->readUInt32LE(); $this->_maximumPacketCount = $this->_reader->readUInt32LE();
$indexEntriesCount = $this->_reader->readUInt32LE(); $indexEntriesCount = $this->_reader->readUInt32LE();
for ($i = 1; $i < $indexEntriesCount; $i++) { for ($i = 0; $i < $indexEntriesCount; $i++) {
$this->_indexEntries[] = array $this->_indexEntries[] = array
("packetNumber" => $this->_reader->readUInt32LE(), ("packetNumber" => $this->_reader->readUInt32LE(),
"packetCount" => $this->_reader->readUInt16LE()); "packetCount" => $this->_reader->readUInt16LE());
@@ -133,9 +133,9 @@ final class ASF_Object_SimpleIndex extends ASF_Object
* key frames and non-key frames, this field will always point to the * key frames and non-key frames, this field will always point to the
* closest key frame prior to the time interval. * closest key frame prior to the time interval.
* *
* o packetCount -- Specifies the number of Data Packets to send at this * o packetCount -- Specifies the number of <i>Data Packets</i> to send at
* index entry. If a video key frame has been fragmented into two <i>Data * this index entry. If a video key frame has been fragmented into two
* Packets</i>, the value of this field will be equal to 2. * Data Packets, the value of this field will be equal to 2.
* *
* @return Array * @return Array
*/ */

View File

@@ -0,0 +1,99 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Stream Prioritization Object</i> indicates the author's intentions as
* to which streams should or should not be dropped in response to varying
* network congestion situations. There may be special cases where this
* preferential order may be ignored (for example, the user hits the "mute"
* button). Generally it is expected that implementations will try to honor the
* author's preference.
*
* The priority of each stream is indicated by how early in the list that
* stream's stream number is listed (in other words, the list is ordered in
* terms of decreasing priority).
*
* The Mandatory flag field shall be set if the author wants that stream kept
* "regardless". If this flag is not set, then that indicates that the stream
* should be dropped in response to network congestion situations. Non-mandatory
* streams must never be assigned a higher priority than mandatory streams.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_StreamPrioritization extends ASF_Object
{
/** @var Array */
private $_priorityRecords = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$priorityRecordCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $priorityRecordCount; $i++)
$this->_priorityRecords[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"flags" => $this->_reader->readUInt16LE());
}
/**
* Returns an array of records. Each record consists of the following keys.
*
* o streamNumber -- Specifies the stream number. Valid values are between
* 1 and 127.
*
* o flags -- Specifies the flags. The mandatory flag is the bit 1 (LSB).
*
* @return Array
*/
public function getPriorityRecords() { return $this->_priorityRecords; }
}

View File

@@ -0,0 +1,181 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* This top-level ASF object supplies timecode indexing information for the
* streams of an ASF file. It includes stream-specific indexing information
* based on the timecodes found in the file. If the <i>Timecode Index Object</i>
* is used, it is recommended that timecodes be stored as a <i>Payload Extension
* System</i> on the appropriate stream. It is also recommended that every
* timecode appearing in the ASF file have a corresponging index entry.
*
* The index is designed to be broken into blocks to facilitate storage that is
* more space-efficient by using 32-bit offsets relative to a 64-bit base. That
* is, each index block has a full 64-bit offset in the block header that is
* added to the 32-bit offsets found in each index entry. If a file is larger
* than 2^32 bytes, then multiple index blocks can be used to fully index the
* entire large file while still keeping index entry offsets at 32 bits.
*
* To locate an object with a particular timecode in an ASF file, one would
* typically look through the <i>Timecode Index Object</i> in blocks of the
* appropriate range and try to locate the nearest possible timecode. The
* corresponding <i>Offset</i> field values of the <i>Index Entry</i> are byte
* offsets that, when combined with the <i>Block Position</i> value of the Index
* Block, indicate the starting location in bytes of an ASF Data Packet relative
* to the start of the first ASF Data Packet in the file.
*
* Any ASF file containing a <i>Timecode Index Object</i> shall also contain a
* <i>Timecode Index Parameters Object</i> in its
* {@link ASF_Object_Header ASF Header}.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_TimecodeIndex extends ASF_Object
{
/**
* Indicates that the index type is Nearest Past Data Packet. The Nearest
* Past Data Packet indexes point to the data packet whose presentation time
* is closest to the index entry time.
*/
const NEAREST_PAST_DATA_PACKET = 1;
/**
* Indicates that the index type is Nearest Past Media. The Nearest Past
* Object indexes point to the closest data packet containing an entire object
* or first fragment of an object.
*/
const NEAREST_PAST_MEDIA = 2;
/**
* Indicates that the index type is Nearest Past Cleanpoint. The Nearest Past
* Cleanpoint indexes point to the closest data packet containing an entire
* object (or first fragment of an object) that has the Cleanpoint Flag set.
*
* Nearest Past Cleanpoint is the most common type of index.
*/
const NEAREST_PAST_CLEANPOINT = 3;
/** @var Array */
private $_indexSpecifiers = array();
/** @var Array */
private $_indexBlocks = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_reader->skip(4);
$indexSpecifiersCount = $this->_reader->readUInt16LE();
$indexBlocksCount = $this->_reader->readUInt32LE();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$this->_indexSpecifiers[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"indexType" => $this->_reader->readUInt16LE());
for ($i = 0; $i < $indexBlocksCount; $i++) {
$indexEntryCount = $this->_reader->readUInt32LE();
$timecodeRange = $this->_reader->readUInt16LE();
$blockPositions = array();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$blockPositions[] = $this->_reader->readInt64LE();
$indexEntries = array();
for ($i = 0; $i < $indexEntryCount; $i++) {
$timecode = $this->_reader->readUInt32LE();
$offsets = array();
for ($i = 0; $i < $indexSpecifiersCount; $i++)
$offsets[] = $this->_reader->readUInt32LE();
$indexEntries[] = array
("timecode" => $timecode,
"offsets" => $offsets);
}
$this->_indexBlocks[] = array
("timecodeRange" => $timecodeRange,
"blockPositions" => $blockPositions,
"indexEntries" => $indexEntries);
}
}
/**
* Returns an array of index specifiers. Each entry consists of the following
* keys.
*
* o streamNumber -- Specifies the stream number that the <i>Index
* Specifiers</i> refer to. Valid values are between 1 and 127.
*
* o indexType -- Specifies the type of index.
*
* @return Array
*/
public function getIndexSpecifiers() { return $this->_indexSpecifiers; }
/**
* Returns an array of index entries. Each entry consists of the following
* keys.
*
* o timecodeRange -- Specifies the timecode range for this block.
* Subsequent blocks must contain range numbers greater than or equal to
* this one.
*
* o blockPositions -- Specifies a list of byte offsets of the beginnings of
* the blocks relative to the beginning of the first Data Packet (for
* example, the beginning of the Data Object + 50 bytes).
*
* o indexEntries -- An array that consists of the following keys
* o timecode -- This is the 4-byte timecode for these entries.
* o offsets -- Specifies the offset. An offset value of 0xffffffff
* indicates an invalid offset value.
*
* @return Array
*/
public function getIndexBlocks() { return $this->_indexBlocks; }
}

View File

@@ -0,0 +1,125 @@
<?php
/**
* PHP Reader Library
*
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the project workgroup nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package php-reader
* @subpackage ASF
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Id$
*/
/**#@+ @ignore */
require_once("ASF/Object.php");
/**#@-*/
/**
* The <i>Timecode Index Parameters Object</i> supplies information about those
* streams that are actually indexed (there must be at least one stream in an
* index) by timecodes. All streams referred to in the
* {@link ASF_Object_TimecodeIndexParameters Timecode Index Parameters Object}
* must have timecode Payload Extension Systems associated with them in the
* {@link ASF_Object_ExtendedStreamProperties Extended Stream Properties
* Object}. This object shall be present in the {@link ASF_Object_Header Header
* Object} if there is a {@link ASF_Object_TimecodeIndex Timecode Index Object}
* present in the file.
*
* An Index Specifier is required for each stream that will be indexed by the
* {@link ASF_Object_TimecodeIndex Timecode Index Object}. These specifiers must
* exactly match those in the {@link ASF_Object_TimecodeIndex Timecode Index
* Object}.
*
* @package php-reader
* @subpackage ASF
* @author Sven Vollbehr <svollbehr@gmail.com>
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
* @version $Rev$
*/
final class ASF_Object_TimecodeIndexParameters extends ASF_Object
{
/** @var string */
private $_indexEntryCountInterval;
/** @var Array */
private $_indexSpecifiers = array();
/**
* Constructs the class with given parameters and reads object related data
* from the ASF file.
*
* @param Reader $reader The reader object.
* @param Array $options The options array.
*/
public function __construct($reader, &$options = array())
{
parent::__construct($reader, $options);
$this->_indexEntryCountInterval = $this->_reader->readUInt32LE();
$indexSpecifiersCount = $this->_reader->readUInt16LE();
for ($i = 0; $i < $indexSpecifiersCount; $i++) {
$this->_indexSpecifiers[] = array
("streamNumber" => $this->_reader->readUInt16LE(),
"indexType" => $this->_reader->readUInt16LE());
}
}
/**
* Returns the interval between each index entry by the number of media
* objects. This value cannot be 0.
*
* @return integer
*/
public function getIndexEntryCountInterval()
{
return $this->_indexEntryCountInterval;
}
/**
* Returns an array of index entries. Each entry consists of the following
* keys.
*
* o streamNumber -- Specifies the stream number that the Index Specifiers
* refer to. Valid values are between 1 and 127.
*
* o indexType -- Specifies the type of index. Values are defined as
* follows:
* 2 = Nearest Past Media Object,
* 3 = Nearest Past Cleanpoint (1 is not a valid value).
* For a video stream, The Nearest Past Media Object indexes point to the
* closest data packet containing an entire video frame or the first
* fragment of a video frame, and the Nearest Past Cleanpoint indexes
* point to the closest data packet containing an entire video frame (or
* first fragment of a video frame) that is a key frame. Nearest Past
* Media Object is the most common value.
*
* @return Array
*/
public function getIndexSpecifiers() { return $this->_indexSpecifiers; }
}