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:
@@ -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");
|
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
109
src/ASF/Object/AdvancedContentEncryption.php
Normal file
109
src/ASF/Object/AdvancedContentEncryption.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
100
src/ASF/Object/AdvancedMutualExclusion.php
Normal file
100
src/ASF/Object/AdvancedMutualExclusion.php
Normal 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; }
|
||||||
|
}
|
||||||
133
src/ASF/Object/BandwidthSharing.php
Normal file
133
src/ASF/Object/BandwidthSharing.php
Normal 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; }
|
||||||
|
}
|
||||||
88
src/ASF/Object/Compatibility.php
Normal file
88
src/ASF/Object/Compatibility.php
Normal 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; }
|
||||||
|
}
|
||||||
@@ -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
126
src/ASF/Object/Data.php
Normal 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.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
108
src/ASF/Object/GroupMutualExclusion.php
Normal file
108
src/ASF/Object/GroupMutualExclusion.php
Normal 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; }
|
||||||
|
}
|
||||||
@@ -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
185
src/ASF/Object/Index.php
Normal 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; }
|
||||||
|
}
|
||||||
121
src/ASF/Object/IndexParameters.php
Normal file
121
src/ASF/Object/IndexParameters.php
Normal 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; }
|
||||||
|
}
|
||||||
176
src/ASF/Object/MediaObjectIndex.php
Normal file
176
src/ASF/Object/MediaObjectIndex.php
Normal 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; }
|
||||||
|
}
|
||||||
130
src/ASF/Object/MediaObjectIndexParameters.php
Normal file
130
src/ASF/Object/MediaObjectIndexParameters.php
Normal 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; }
|
||||||
|
}
|
||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
99
src/ASF/Object/StreamPrioritization.php
Normal file
99
src/ASF/Object/StreamPrioritization.php
Normal 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; }
|
||||||
|
}
|
||||||
181
src/ASF/Object/TimecodeIndex.php
Normal file
181
src/ASF/Object/TimecodeIndex.php
Normal 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; }
|
||||||
|
}
|
||||||
125
src/ASF/Object/TimecodeIndexParameters.php
Normal file
125
src/ASF/Object/TimecodeIndexParameters.php
Normal 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; }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user