Add ISO 14496 boxes
git-svn-id: http://php-reader.googlecode.com/svn/branches/zend@163 51a70ab9-7547-0410-9469-37e369ee0574
This commit is contained in:
119
src/Zend/Media/Iso14496/Box/Cdsc.php
Normal file
119
src/Zend/Media/Iso14496/Box/Cdsc.php
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/Box.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This box provides a reference from the containing track to another track in
|
||||||
|
* the presentation. This track describes the referenced track.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Cdsc extends Zend_Media_Iso14496_Box
|
||||||
|
{
|
||||||
|
/** @var Array */
|
||||||
|
private $_trackId = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
while ($this->_reader->getOffset <= $this->getSize()) {
|
||||||
|
$this->_trackId[] = $this->_reader->readUInt32BE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of integer references from the containing track to
|
||||||
|
* another track in the presentation. Track IDs are never re-used and cannot
|
||||||
|
* be equal to zero.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getTrackId()
|
||||||
|
{
|
||||||
|
return $this->_trackId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an array of integer references from the containing track to
|
||||||
|
* another track in the presentation. Track IDs are never re-used and cannot
|
||||||
|
* be equal to zero.
|
||||||
|
*
|
||||||
|
* @param Array $trackId The array of values.
|
||||||
|
*/
|
||||||
|
public function setTrackId($trackId)
|
||||||
|
{
|
||||||
|
$this->_trackId = $trackId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + count($this->_trackId) * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
for ($i = 0; $i < count($this->_trackId); $i++) {
|
||||||
|
$writer->writeUInt32BE($this->_trackId[$i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
133
src/Zend/Media/Iso14496/Box/Co64.php
Normal file
133
src/Zend/Media/Iso14496/Box/Co64.php
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/FullBox.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Chunk Offset Box</i> table gives the index of each chunk into the
|
||||||
|
* containing file. There are two variants, permitting the use of 32-bit or
|
||||||
|
* 64-bit offsets. The latter is useful when managing very large presentations.
|
||||||
|
* At most one of these variants will occur in any single instance of a sample
|
||||||
|
* table.
|
||||||
|
*
|
||||||
|
* Offsets are file offsets, not the offset into any box within the file (e.g.
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mdat Media Data Box}). This permits referring
|
||||||
|
* to media data in files without any box structure. It does also mean that care
|
||||||
|
* must be taken when constructing a self-contained ISO file with its metadata
|
||||||
|
* ({@link Zend_Media_Iso14496_Box_Moov Movie Box}) at the front, as the size of
|
||||||
|
* the {@link Zend_Media_Iso14496_Box_Moov Movie Box} will affect the chunk
|
||||||
|
* offsets to the media data.
|
||||||
|
*
|
||||||
|
* This box variant contains 64-bit offsets.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Co64 extends Zend_Media_Iso14496_FullBox
|
||||||
|
{
|
||||||
|
/** @var Array */
|
||||||
|
private $_chunkOffsetTable = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$entryCount = $this->_reader->readUInt32BE();
|
||||||
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
|
$this->_chunkOffsetTable[$i] = $this->_reader->readInt64BE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of values. Each entry has the entry number as its index
|
||||||
|
* and a 64 bit integer that gives the offset of the start of a chunk into
|
||||||
|
* its containing media file as its value.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function getChunkOffsetTable()
|
||||||
|
{
|
||||||
|
return $this->_chunkOffsetTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an array of chunk offsets. Each entry must have the entry number as
|
||||||
|
* its index and a 64 bit integer that gives the offset of the start of a
|
||||||
|
* chunk into its containing media file as its value.
|
||||||
|
*
|
||||||
|
* @param Array $chunkOffsetTable The chunk offset array.
|
||||||
|
*/
|
||||||
|
public function setChunkOffsetTable($chunkOffsetTable)
|
||||||
|
{
|
||||||
|
$this->_chunkOffsetTable = $chunkOffsetTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 4 + count($this->_chunkOffsetTable) * 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
$writer->writeUInt32BE($entryCount = count($this->_chunkOffsetTable));
|
||||||
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
|
$writer->writeInt64BE($this->_chunkOffsetTable[$i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
150
src/Zend/Media/Iso14496/Box/Cprt.php
Normal file
150
src/Zend/Media/Iso14496/Box/Cprt.php
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/FullBox.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Copyright Box</i> contains a copyright declaration which applies to
|
||||||
|
* the entire presentation, when contained within the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Moov Movie Box}, or, when contained in a
|
||||||
|
* track, to that entire track. There may be multiple copyright boxes using
|
||||||
|
* different language codes.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Cprt extends Zend_Media_Iso14496_FullBox
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
private $_language;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
private $_notice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
* @todo Distinguish UTF-16?
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$this->_language = chr
|
||||||
|
(((($tmp = $this->_reader->readUInt16BE()) >> 10) & 0x1f) + 0x60) .
|
||||||
|
chr((($tmp >> 5) & 0x1f) + 0x60) . chr(($tmp & 0x1f) + 0x60);
|
||||||
|
$this->_notice = $this->_reader->readString8
|
||||||
|
($this->getOffset() + $this->getSize() -
|
||||||
|
$this->_reader->getOffset());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the three byte language code to describe the language of the
|
||||||
|
* notice, according to {@link http://www.loc.gov/standards/iso639-2/
|
||||||
|
* ISO 639-2/T}.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLanguage()
|
||||||
|
{
|
||||||
|
return $this->_language;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the three byte language code to describe the language of this
|
||||||
|
* media, according to {@link http://www.loc.gov/standards/iso639-2/
|
||||||
|
* ISO 639-2/T}.
|
||||||
|
*
|
||||||
|
* @param string $language The language code.
|
||||||
|
*/
|
||||||
|
public function setLanguage($language)
|
||||||
|
{
|
||||||
|
$this->_language = $language;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the copyright notice.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getNotice()
|
||||||
|
{
|
||||||
|
return $this->_notice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the copyright notice.
|
||||||
|
*
|
||||||
|
* @param string $notice The copyright notice.
|
||||||
|
*/
|
||||||
|
public function setNotice($notice)
|
||||||
|
{
|
||||||
|
$this->_notice = $notice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 3 + strlen($this->_notice);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
$writer->writeUInt16BE((ord($this->_language[0]) - 0x60) << 10 |
|
||||||
|
(ord($this->_language[1])- 0x60) << 5 |
|
||||||
|
(ord($this->_language[2])- 0x60))
|
||||||
|
->writeString8($this->_notice, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
139
src/Zend/Media/Iso14496/Box/Ctts.php
Normal file
139
src/Zend/Media/Iso14496/Box/Ctts.php
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/FullBox.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Composition Time to Sample Box</i> provides the offset between
|
||||||
|
* decoding time and composition time. Since decoding time must be less than the
|
||||||
|
* composition time, the offsets are expressed as unsigned numbers such that
|
||||||
|
* CT(n) = DT(n) + CTTS(n) where CTTS(n) is the (uncompressed) table entry for
|
||||||
|
* sample n.
|
||||||
|
*
|
||||||
|
* The composition time to sample table is optional and must only be present if
|
||||||
|
* DT and CT differ for any samples. Hint tracks do not use this box.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Ctts extends Zend_Media_Iso14496_FullBox
|
||||||
|
{
|
||||||
|
/** @var Array */
|
||||||
|
private $_compositionOffsetTable = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$entryCount = $this->_reader->readUInt32BE();
|
||||||
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
|
$this->_compositionOffsetTable[$i] = array
|
||||||
|
('sampleCount' => $this->_reader->readUInt32BE(),
|
||||||
|
'sampleOffset' => $this->_reader->readUInt32BE());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of values. Each entry is an array containing the
|
||||||
|
* following keys.
|
||||||
|
* o sampleCount -- an integer that counts the number of consecutive
|
||||||
|
* samples that have the given offset.
|
||||||
|
* o sampleOffset -- a non-negative integer that gives the offset between
|
||||||
|
* CT and DT, such that CT(n) = DT(n) + CTTS(n).
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function getCompositionOffsetTable()
|
||||||
|
{
|
||||||
|
return $this->_compositionOffsetTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an array of values. Each entry must have an array containing the
|
||||||
|
* following keys.
|
||||||
|
* o sampleCount -- an integer that counts the number of consecutive
|
||||||
|
* samples that have the given offset.
|
||||||
|
* o sampleOffset -- a non-negative integer that gives the offset between
|
||||||
|
* CT and DT, such that CT(n) = DT(n) + CTTS(n).
|
||||||
|
*
|
||||||
|
* @param Array $compositionOffsetTable The array of values.
|
||||||
|
*/
|
||||||
|
public function setCompositionOffsetTable($compositionOffsetTable)
|
||||||
|
{
|
||||||
|
$this->_compositionOffsetTable = $compositionOffsetTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 4 +
|
||||||
|
count($this->_compositionOffsetTable) * 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
$writer->writeUInt32BE($entryCount = count($this->_compositionOffsetTable));
|
||||||
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
|
$writer->writeUInt32BE
|
||||||
|
($this->_compositionOffsetTable[$i]['sampleCount'])
|
||||||
|
->writeUInt32BE
|
||||||
|
($this->_compositionOffsetTable[$i]['sampleOffset']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
170
src/Zend/Media/Iso14496/Box/Elst.php
Normal file
170
src/Zend/Media/Iso14496/Box/Elst.php
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/FullBox.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Edit List Box</i> contains an explicit timeline map. Each entry
|
||||||
|
* defines part of the track time-line: by mapping part of the media time-line,
|
||||||
|
* or by indicating empty time, or by defining a dwell, where a single
|
||||||
|
* time-point in the media is held for a period.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Elst extends Zend_Media_Iso14496_FullBox
|
||||||
|
{
|
||||||
|
/** @var Array */
|
||||||
|
private $_entries = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$entryCount = $this->_reader->readUInt32BE();
|
||||||
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
|
$entry = array();
|
||||||
|
if ($this->getVersion() == 1) {
|
||||||
|
$entry['segmentDuration'] = $this->_reader->readInt64BE();
|
||||||
|
$entry['mediaTime'] = $this->_reader->readInt64BE();
|
||||||
|
} else {
|
||||||
|
$entry['segmentDuration'] = $this->_reader->readUInt32BE();
|
||||||
|
$entry['mediaTime'] = $this->_reader->readInt32BE();
|
||||||
|
}
|
||||||
|
$entry['mediaRate'] =
|
||||||
|
((($tmp = $this->_reader->readUInt32BE()) >> 16) & 0xffff) +
|
||||||
|
(float)("0." . ((string)($tmp & 0xffff)));
|
||||||
|
$this->_entries[] = $entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of entries. Each entry is an array containing the
|
||||||
|
* following keys.
|
||||||
|
* o segmentDuration: specifies the duration of this edit segment in units
|
||||||
|
* of the timescale in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mvhd Movie Header Box}.
|
||||||
|
* o mediaTime: the starting time within the media of this edit segment
|
||||||
|
* (in media time scale units, in composition time). If this field is
|
||||||
|
* set to –1, it is an empty edit. The last edit in a track shall never
|
||||||
|
* be an empty edit. Any difference between the duration in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_MVHD Movie Header Box}, and the
|
||||||
|
* track's duration is expressed as an implicit empty edit at the end.
|
||||||
|
* o mediaRate: the relative rate at which to play the media corresponding
|
||||||
|
* to this edit segment. If this value is 0, then the edit is specifying
|
||||||
|
* a dwell: the media at media-time is presented for the
|
||||||
|
* segment-duration. Otherwise this field shall contain the value 1.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function getEntries()
|
||||||
|
{
|
||||||
|
return $this->_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the array of entries. Each entry must be an array containing the
|
||||||
|
* following keys.
|
||||||
|
* o segmentDuration: specifies the duration of this edit segment in units
|
||||||
|
* of the timescale in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mvhd Movie Header Box}.
|
||||||
|
* o mediaTime: the starting time within the media of this edit segment
|
||||||
|
* (in media time scale units, in composition time). If this field is
|
||||||
|
* set to –1, it is an empty edit. The last edit in a track shall never
|
||||||
|
* be an empty edit. Any difference between the duration in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_MVHD Movie Header Box}, and the
|
||||||
|
* track's duration is expressed as an implicit empty edit at the end.
|
||||||
|
* o mediaRate: the relative rate at which to play the media corresponding
|
||||||
|
* to this edit segment. If this value is 0, then the edit is specifying
|
||||||
|
* a dwell: the media at media-time is presented for the
|
||||||
|
* segment-duration. Otherwise this field shall contain the value 1.
|
||||||
|
*
|
||||||
|
* @param Array $entries The array of entries;
|
||||||
|
*/
|
||||||
|
public function setEntries($entries)
|
||||||
|
{
|
||||||
|
$this->_entries = $entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 4 + count($this->_entries) *
|
||||||
|
($this->getVersion() == 1 ? 20 : 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
$writer->writeUInt32BE($entryCount = count($this->_entries));
|
||||||
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
|
if ($this->getVersion() == 1) {
|
||||||
|
$writer->writeInt64BE($this->_entries[$i]['segmentDuration'])
|
||||||
|
->writeInt64BE($this->_entries[$i]['mediaTime']);
|
||||||
|
} else {
|
||||||
|
$writer->writeUInt32BE($this->_entries[$i]['segmentDuration'])
|
||||||
|
->writeUInt32BE($this->_entries[$i]['mediaTime']);
|
||||||
|
}
|
||||||
|
@list(, $mediaRateDecimals) = explode
|
||||||
|
('.', (float)$this->_entries[$i]['mediaRate']);
|
||||||
|
$writer->writeUInt32BE
|
||||||
|
(floor($this->_entries[$i]['mediaRate']) << 16 |
|
||||||
|
$mediaRateDecimals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
87
src/Zend/Media/Iso14496/Box/Free.php
Normal file
87
src/Zend/Media/Iso14496/Box/Free.php
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/Box.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The contents of a <i>Free Space Box</i> are irrelevant and may be ignored, or
|
||||||
|
* the object deleted, without affecting the presentation. (Care should be
|
||||||
|
* exercised when deleting the object, as this may invalidate the offsets used
|
||||||
|
* in the sample table, unless this object is after all the media data).
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Free extends Zend_Media_Iso14496_Box
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader = null, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + $this->getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
$writer->write(str_repeat("\0", $this->getSize()));
|
||||||
|
}
|
||||||
|
}
|
||||||
116
src/Zend/Media/Iso14496/Box/Frma.php
Normal file
116
src/Zend/Media/Iso14496/Box/Frma.php
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/Box.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Original Format Box</i> contains the four-character-code of the
|
||||||
|
* original un-transformed sample description.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Frma extends Zend_Media_Iso14496_Box
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
private $_dataFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$this->_dataFormat = $this->_reader->read(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the four-character-code of the original un-transformed sample
|
||||||
|
* entry (e.g. <i>mp4v</i> if the stream contains protected MPEG-4 visual
|
||||||
|
* material).
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getDataFormat()
|
||||||
|
{
|
||||||
|
return $this->_dataFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the four-character-code of the original un-transformed sample
|
||||||
|
* entry (e.g. <i>mp4v</i> if the stream contains protected MPEG-4 visual
|
||||||
|
* material).
|
||||||
|
*
|
||||||
|
* @param string $dataFormat The data format.
|
||||||
|
*/
|
||||||
|
public function setDataFormat($dataFormat)
|
||||||
|
{
|
||||||
|
$this->_dataFormat = $dataFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
|
||||||
|
$writer->write(substr($this->_dataFormat, 0, 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
210
src/Zend/Media/Iso14496/Box/Ftyp.php
Normal file
210
src/Zend/Media/Iso14496/Box/Ftyp.php
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/Box.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>File Type Box</i> is placed as early as possible in the file (e.g.
|
||||||
|
* after any obligatory signature, but before any significant variable-size
|
||||||
|
* boxes such as a {@link Zend_Media_Iso14496_Box_Moov Movie Box},
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mdat Media Data Box}, or
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Free Free Space}). It identifies which
|
||||||
|
* specification is the <i>best use</i> of the file, and a minor version of
|
||||||
|
* that specification; and also a set of others specifications to which the
|
||||||
|
* file complies.
|
||||||
|
*
|
||||||
|
* The minor version is informative only. It does not appear for
|
||||||
|
* compatible-brands, and must not be used to determine the conformance of a
|
||||||
|
* file to a standard. It may allow more precise identification of the major
|
||||||
|
* specification, for inspection, debugging, or improved decoding.
|
||||||
|
*
|
||||||
|
* The type <i>isom</i> (ISO Base Media file) is defined as identifying files
|
||||||
|
* that conform to the first version of the ISO Base Media File Format. More
|
||||||
|
* specific identifiers can be used to identify precise versions of
|
||||||
|
* specifications providing more detail. This brand is not be used as the major
|
||||||
|
* brand; this base file format should be derived into another specification to
|
||||||
|
* be used. There is therefore no defined normal file extension, or mime type
|
||||||
|
* assigned to this brand, nor definition of the minor version when <i>isom</i>
|
||||||
|
* is the major brand.
|
||||||
|
*
|
||||||
|
* Files would normally be externally identified (e.g. with a file extension or
|
||||||
|
* mime type) that identifies the <i>best use</i> (major brand), or the brand
|
||||||
|
* that the author believes will provide the greatest compatibility.
|
||||||
|
*
|
||||||
|
* The brand <i>iso2</i> shall be used to indicate compatibility with the
|
||||||
|
* amended version of the ISO Base Media File Format; it may be used in addition
|
||||||
|
* to or instead of the <i>isom</i> brand and the same usage rules apply. If
|
||||||
|
* used without the brand <i>isom</i> identifying the first version of the
|
||||||
|
* specification, it indicates that support for some or all of the technology
|
||||||
|
* introduced by the amended version of the ISO Base Media File Format is
|
||||||
|
* required.
|
||||||
|
*
|
||||||
|
* The brand <i>avc1</i> shall be used to indicate that the file is conformant
|
||||||
|
* with the <i>AVC Extensions</i>. If used without other brands, this implies
|
||||||
|
* that support for those extensions is required. The use of <i>avc1</i> as a
|
||||||
|
* major-brand may be permitted by specifications; in that case, that
|
||||||
|
* specification defines the file extension and required behavior.
|
||||||
|
*
|
||||||
|
* If a Meta-box with an MPEG-7 handler type is used at the file level, then the
|
||||||
|
* brand <i>mp71</i> is a member of the compatible-brands list in the file-type
|
||||||
|
* box.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Ftyp extends Zend_Media_Iso14496_Box
|
||||||
|
{
|
||||||
|
/** @var integer */
|
||||||
|
private $_majorBrand;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_minorVersion;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_compatibleBrands = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$this->_majorBrand = $this->_reader->readString8(4);
|
||||||
|
$this->_minorVersion = $this->_reader->readUInt32BE();
|
||||||
|
while ($this->_reader->getOffset() < $this->getSize()) {
|
||||||
|
if (($brand = $this->_reader->readString8(4)) != '') {
|
||||||
|
$this->_compatibleBrands[] = $brand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the major version brand.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getMajorBrand()
|
||||||
|
{
|
||||||
|
return $this->_majorBrand;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the major version brand.
|
||||||
|
*
|
||||||
|
* @param string $majorBrand The major version brand.
|
||||||
|
*/
|
||||||
|
public function setMajorBrand($majorBrand)
|
||||||
|
{
|
||||||
|
$this->_majorBrand = $majorBrand;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the minor version number.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getMinorVersion()
|
||||||
|
{
|
||||||
|
return $this->_minorVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the minor version number.
|
||||||
|
*
|
||||||
|
* @param integer $minorVersion The minor version number.
|
||||||
|
*/
|
||||||
|
public function setMinorVersion($minorVersion)
|
||||||
|
{
|
||||||
|
$this->_minorVersion = $minorVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the array of compatible version brands.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function getCompatibleBrands()
|
||||||
|
{
|
||||||
|
return $this->_compatibleBrands;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the array of compatible version brands.
|
||||||
|
*
|
||||||
|
* @param Array $compatibleBrands The array of compatible version brands.
|
||||||
|
*/
|
||||||
|
public function setCompatibleBrands($compatibleBrands)
|
||||||
|
{
|
||||||
|
$this->_compatibleBrands = $compatibleBrands;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 8 + 4 * count($this->_compatibleBrands);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
|
||||||
|
$writer->writeString8(substr($this->_majorBrand, 0, 4))
|
||||||
|
->writeUInt32BE($this->_minorVersion);
|
||||||
|
for ($i = 0; $i < count($this->_compatibleBrands); $i++) {
|
||||||
|
$writer->writeString8(substr($this->_compatibleBrands[$i], 0, 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -152,7 +152,7 @@ final class Zend_Media_Iso14496_Box_Hdlr extends Zend_Media_Iso14496_FullBox
|
|||||||
*/
|
*/
|
||||||
public function getHeapSize()
|
public function getHeapSize()
|
||||||
{
|
{
|
||||||
return parent::getHeapSize() + 20 + strlen($this->_name);
|
return parent::getHeapSize() + 21 + strlen($this->_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -169,6 +169,6 @@ final class Zend_Media_Iso14496_Box_Hdlr extends Zend_Media_Iso14496_FullBox
|
|||||||
->writeUInt32BE(0)
|
->writeUInt32BE(0)
|
||||||
->writeUInt32BE(0)
|
->writeUInt32BE(0)
|
||||||
->writeUInt32BE(0)
|
->writeUInt32BE(0)
|
||||||
->writeString8($this->_name);
|
->writeString8($this->_name, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
120
src/Zend/Media/Iso14496/Box/Hint.php
Normal file
120
src/Zend/Media/Iso14496/Box/Hint.php
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/Box.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This box provides a reference from the containing track to another track in
|
||||||
|
* the presentation. The referenced track(s) contain the original media for this
|
||||||
|
* hint track.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Hint extends Zend_Media_Iso14496_Box
|
||||||
|
{
|
||||||
|
/** @var Array */
|
||||||
|
private $_trackId = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
while ($this->_reader->getOffset <= $this->getSize()) {
|
||||||
|
$this->_trackId[] = $this->_reader->readUInt32BE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of integer references from the containing track to
|
||||||
|
* another track in the presentation. Track IDs are never re-used and cannot
|
||||||
|
* be equal to zero.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function getTrackId()
|
||||||
|
{
|
||||||
|
return $this->_trackId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an array of integer references from the containing track to
|
||||||
|
* another track in the presentation. Track IDs are never re-used and cannot
|
||||||
|
* be equal to zero.
|
||||||
|
*
|
||||||
|
* @param Array $trackId The array of values.
|
||||||
|
*/
|
||||||
|
public function setTrackId($trackId)
|
||||||
|
{
|
||||||
|
$this->_trackId = $trackId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + count($this->_trackId) * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
for ($i = 0; $i < count($this->_trackId); $i++) {
|
||||||
|
$writer->writeUInt32BE($this->_trackId[$i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
187
src/Zend/Media/Iso14496/Box/Hmhd.php
Normal file
187
src/Zend/Media/Iso14496/Box/Hmhd.php
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/FullBox.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Hint Media Header Box</i> header contains general information,
|
||||||
|
* independent of the protocol, for hint tracks.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Hmhd extends Zend_Media_Iso14496_FullBox
|
||||||
|
{
|
||||||
|
/** @var integer */
|
||||||
|
private $_maxPDUSize;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_avgPDUSize;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_maxBitrate;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_avgBitrate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$this->_maxPDUSize = $this->_reader->readUInt16BE();
|
||||||
|
$this->_avgPDUSize = $this->_reader->readUInt16BE();
|
||||||
|
$this->_maxBitrate = $this->_reader->readUInt32BE();
|
||||||
|
$this->_avgBitrate = $this->_reader->readUInt32BE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the size in bytes of the largest PDU in this (hint) stream.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getMaxPDUSize()
|
||||||
|
{
|
||||||
|
return $this->_maxPDUSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the size in bytes of the largest PDU in this (hint) stream.
|
||||||
|
*
|
||||||
|
* @param integer $maxPDUSize The maximum size.
|
||||||
|
*/
|
||||||
|
public function setMaxPDUSize($maxPDUSize)
|
||||||
|
{
|
||||||
|
$this->_maxPDUSize = $maxPDUSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the average size of a PDU over the entire presentation.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getAvgPDUSize()
|
||||||
|
{
|
||||||
|
return $this->_avgPDUSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the average size of a PDU over the entire presentation.
|
||||||
|
*
|
||||||
|
* @param integer $avgPDUSize The average size.
|
||||||
|
*/
|
||||||
|
public function setAvgPDUSize()
|
||||||
|
{
|
||||||
|
$this->_avgPDUSize = $avgPDUSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the maximum rate in bits/second over any window of one second.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getMaxBitrate()
|
||||||
|
{
|
||||||
|
return $this->_maxBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the maximum rate in bits/second over any window of one second.
|
||||||
|
*
|
||||||
|
* @param integer $maxBitrate The maximum bitrate.
|
||||||
|
*/
|
||||||
|
public function setMaxBitrate($maxBitrate)
|
||||||
|
{
|
||||||
|
$this->_maxBitrate = $maxBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the average rate in bits/second over the entire presentation.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getAvgBitrate()
|
||||||
|
{
|
||||||
|
return $this->_avgBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the average rate in bits/second over the entire presentation.
|
||||||
|
*
|
||||||
|
* @param integer $maxbitrate The agerage bitrate.
|
||||||
|
*/
|
||||||
|
public function setAvgBitrate($avgBitrate)
|
||||||
|
{
|
||||||
|
$this->_avgBitrate = $avgBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
|
||||||
|
$writer->writeUInt16BE($this->_maxPDUSize)
|
||||||
|
->writeUInt16BE($this->_avgPDUSize)
|
||||||
|
->writeUInt16BE($this->_maxBitrate)
|
||||||
|
->writeUInt16BE($this->_avgBitrate);
|
||||||
|
}
|
||||||
|
}
|
||||||
245
src/Zend/Media/Iso14496/Box/Iloc.php
Normal file
245
src/Zend/Media/Iso14496/Box/Iloc.php
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/Box.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>The Item Location Box</i> provides a directory of resources in this or
|
||||||
|
* other files, by locating their containing file, their offset within that
|
||||||
|
* file, and their length. Placing this in binary format enables common handling
|
||||||
|
* of this data, even by systems which do not understand the particular metadata
|
||||||
|
* system (handler) used. For example, a system might integrate all the
|
||||||
|
* externally referenced metadata resources into one file, re-adjusting file
|
||||||
|
* offsets and file references accordingly.
|
||||||
|
*
|
||||||
|
* Items may be stored fragmented into extents, e.g. to enable interleaving. An
|
||||||
|
* extent is a contiguous subset of the bytes of the resource; the resource is
|
||||||
|
* formed by concatenating the extents. If only one extent is used then either
|
||||||
|
* or both of the offset and length may be implied:
|
||||||
|
*
|
||||||
|
* o If the offset is not identified (the field has a length of zero), then
|
||||||
|
* the beginning of the file (offset 0) is implied.
|
||||||
|
* o If the length is not specified, or specified as zero, then the entire
|
||||||
|
* file length is implied. References into the same file as this metadata,
|
||||||
|
* or items divided into more than one extent, should have an explicit
|
||||||
|
* offset and length, or use a MIME type requiring a different
|
||||||
|
* interpretation of the file, to avoid infinite recursion.
|
||||||
|
*
|
||||||
|
* The size of the item is the sum of the extentLengths. Note: extents may be
|
||||||
|
* interleaved with the chunks defined by the sample tables of tracks.
|
||||||
|
*
|
||||||
|
* The dataReferenceIndex may take the value 0, indicating a reference into the
|
||||||
|
* same file as this metadata, or an index into the dataReference table.
|
||||||
|
*
|
||||||
|
* Some referenced data may itself use offset/length techniques to address
|
||||||
|
* resources within it (e.g. an MP4 file might be included in this way).
|
||||||
|
* Normally such offsets are relative to the beginning of the containing file.
|
||||||
|
* The field base offset provides an additional offset for offset calculations
|
||||||
|
* within that contained data. For example, if an MP4 file is included within a
|
||||||
|
* file formatted to this specification, then normally data-offsets within that
|
||||||
|
* MP4 section are relative to the beginning of file; baseOffset adds to those
|
||||||
|
* offsets.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Iloc extends Zend_Media_Iso14496_Box
|
||||||
|
{
|
||||||
|
/** @var Array */
|
||||||
|
private $_items = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
$offsetSize = (($tmp = $this->_reader->readUInt16BE()) >> 12) & 0xf;
|
||||||
|
$lengthSize = ($tmp >> 8) & 0xf;
|
||||||
|
$baseOffsetSize = ($tmp >> 4) & 0xf;
|
||||||
|
$itemCount = $this->_reader->readUInt16BE();
|
||||||
|
for ($i = 0; $i < $itemCount; $i++) {
|
||||||
|
$item = array();
|
||||||
|
$item['itemId'] = $this->_reader->readUInt16BE();
|
||||||
|
$item['dataReferenceIndex'] = $this->_reader->readUInt16BE();
|
||||||
|
$item['baseOffset'] =
|
||||||
|
($baseOffsetSize == 4 ? $this->_reader->readUInt32BE() :
|
||||||
|
($baseOffsetSize == 8 ? $this->_reader->readInt64BE() : 0));
|
||||||
|
$extentCount = $this->_reader->readUInt16BE();
|
||||||
|
$item['extents'] = array();
|
||||||
|
for ($j = 0; $j < $extentCount; $j++) {
|
||||||
|
$extent = array();
|
||||||
|
$extent['offset'] =
|
||||||
|
($offsetSize == 4 ? $this->_reader->readUInt32BE() :
|
||||||
|
($offsetSize == 8 ? $this->_reader->readInt64BE() : 0));
|
||||||
|
$extent['length'] =
|
||||||
|
($lengthSize == 4 ? $this->_reader->readUInt32BE() :
|
||||||
|
($lengthSize == 8 ? $this->_reader->readInt64BE() : 0));
|
||||||
|
$item['extents'][] = $extent;
|
||||||
|
}
|
||||||
|
$this->_items[] = $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the array of items. Each entry has the following keys set:
|
||||||
|
* itemId, dataReferenceIndex, baseOffset, and extents.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function getItems()
|
||||||
|
{
|
||||||
|
return $this->_items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the array of items. Each entry must have the following keys set:
|
||||||
|
* itemId, dataReferenceIndex, baseOffset, and extents.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
|
*/
|
||||||
|
public function setItems($items)
|
||||||
|
{
|
||||||
|
$this->_items = $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
$totalSize = 4;
|
||||||
|
for ($i = 0; $i < count($this->_itemId); $i++) {
|
||||||
|
$totalSize += 6;
|
||||||
|
if ($this->_itemId[$i]['baseOffset'] > 0xffffffff) {
|
||||||
|
$totalSize += 8;
|
||||||
|
} else {
|
||||||
|
$totalSize += 4;
|
||||||
|
}
|
||||||
|
$extentCount = count($this->_itemId[$i]['extents']);
|
||||||
|
for ($j = 0; $j < $extentCount; $j++) {
|
||||||
|
if ($this->_itemId[$i]['extents'][$j]['offset'] > 0xffffffff) {
|
||||||
|
$totalSize += 8 * $extentCount;
|
||||||
|
} else {
|
||||||
|
$totalSize += 4 * $extentCount;
|
||||||
|
}
|
||||||
|
if ($this->_itemId[$i]['extents'][$j]['length'] > 0xffffffff) {
|
||||||
|
$totalSize += 8 * $extentCount;
|
||||||
|
} else {
|
||||||
|
$totalSize += 4 * $extentCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parent::getHeapSize() + $totalSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
|
||||||
|
$offsetSize = 4;
|
||||||
|
$lengthSize = 4;
|
||||||
|
$baseOffsetSize = 4;
|
||||||
|
|
||||||
|
$itemCount = count($this->_itemId);
|
||||||
|
for ($i = 0; $i < $itemCount; $i++) {
|
||||||
|
if ($this->_itemId[$i]['baseOffset'] > 0xffffffff) {
|
||||||
|
$baseOffsetSize = 8;
|
||||||
|
}
|
||||||
|
for ($j = 0; $j < count($this->_itemId[$i]['extents']); $j++) {
|
||||||
|
if ($this->_itemId[$i]['extents'][$j]['offset'] > 0xffffffff) {
|
||||||
|
$offsetSize = 8;
|
||||||
|
}
|
||||||
|
if ($this->_itemId[$i]['extents'][$j]['length'] > 0xffffffff) {
|
||||||
|
$lengthSize = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$writer->writeUInt16BE
|
||||||
|
((($offsetSize & 0xf) << 12) | (($lengthSize & 0xf) << 8) |
|
||||||
|
(($baseOffsetSize & 0xf) << 4))
|
||||||
|
->writeUInt16BE($itemCount);
|
||||||
|
for ($i = 0; $i < $itemCount; $i++) {
|
||||||
|
$writer->writeUInt16BE($this->_itemId[$i]['itemId'])
|
||||||
|
->writeUInt16BE($this->_itemId[$i]['dataReferenceIndex']);
|
||||||
|
if ($baseOffsetSize == 4) {
|
||||||
|
$writer->writeUInt32BE($this->_itemId[$i]['baseOffset']);
|
||||||
|
}
|
||||||
|
if ($baseOffsetSize == 8) {
|
||||||
|
$writer->writeInt64BE($this->_itemId[$i]['baseOffset']);
|
||||||
|
}
|
||||||
|
$writer->writeUInt16BE
|
||||||
|
($extentCount = count($this->_itemId[$i]['extents']));
|
||||||
|
for ($j = 0; $j < $extentCount; $j++) {
|
||||||
|
if ($offsetSize == 4) {
|
||||||
|
$writer->writeUInt32BE
|
||||||
|
($this->_itemId[$i]['extents'][$j]['offset']);
|
||||||
|
}
|
||||||
|
if ($offsetSize == 8) {
|
||||||
|
$writer->writeInt64BE
|
||||||
|
($this->_itemId[$i]['extents'][$j]['offset']);
|
||||||
|
}
|
||||||
|
if ($offsetSize == 4) {
|
||||||
|
$writer->writeUInt32BE
|
||||||
|
($this->_itemId[$i]['extents'][$j]['length']);
|
||||||
|
}
|
||||||
|
if ($offsetSize == 8) {
|
||||||
|
$writer->writeInt64BE
|
||||||
|
($this->_itemId[$i]['extents'][$j]['length']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -133,7 +133,7 @@ final class Zend_Media_Iso14496_Box_Pdin extends Zend_Media_Iso14496_FullBox
|
|||||||
protected function _writeData($writer)
|
protected function _writeData($writer)
|
||||||
{
|
{
|
||||||
parent::_writeData($writer);
|
parent::_writeData($writer);
|
||||||
for ($i = 1; $i <= count($this->_timeToSampleTable); $i++) {
|
for ($i = 0; $i < count($this->_timeToSampleTable); $i++) {
|
||||||
$writer->writeUInt32BE
|
$writer->writeUInt32BE
|
||||||
($this->_progressiveDownloadInfo[$i]['rate'])
|
($this->_progressiveDownloadInfo[$i]['rate'])
|
||||||
->writeUInt32BE
|
->writeUInt32BE
|
||||||
|
|||||||
@@ -78,8 +78,8 @@ final class Zend_Media_Iso14496_Box_Stco extends Zend_Media_Iso14496_FullBox
|
|||||||
parent::__construct($reader, $options);
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
$entryCount = $this->_reader->readUInt32BE();
|
$entryCount = $this->_reader->readUInt32BE();
|
||||||
for ($i = 0; $i < $entryCount; $i++) {
|
for ($i = 1; $i <= $entryCount; $i++) {
|
||||||
$this->_chunkOffsetTable[$i + 1] = $reader->readUInt32BE();
|
$this->_chunkOffsetTable[$i] = $reader->readUInt32BE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
432
src/Zend/Media/Iso14496/Box/Tkhd.php
Normal file
432
src/Zend/Media/Iso14496/Box/Tkhd.php
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Zend Framework
|
||||||
|
*
|
||||||
|
* LICENSE
|
||||||
|
*
|
||||||
|
* This source file is subject to the new BSD license that is bundled
|
||||||
|
* with this package in the file LICENSE.txt.
|
||||||
|
* It is also available through the world-wide-web at this URL:
|
||||||
|
* http://framework.zend.com/license/new-bsd
|
||||||
|
* If you did not receive a copy of the license and are unable to
|
||||||
|
* obtain it through the world-wide-web, please send an email
|
||||||
|
* to license@zend.com so we can send you a copy immediately.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**#@+ @ignore */
|
||||||
|
require_once 'Zend/Media/Iso14496/FullBox.php';
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <i>Track Header Box</i> specifies the characteristics of a single track.
|
||||||
|
* Exactly one Track Header Box is contained in a track.
|
||||||
|
*
|
||||||
|
* In the absence of an edit list, the presentation of a track starts at the
|
||||||
|
* beginning of the overall presentation. An empty edit is used to offset the
|
||||||
|
* start time of a track.
|
||||||
|
*
|
||||||
|
* @category Zend
|
||||||
|
* @package Zend_Media
|
||||||
|
* @subpackage ISO 14496
|
||||||
|
* @author Sven Vollbehr <sven@vollbehr.eu>
|
||||||
|
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
|
||||||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
final class Zend_Media_Iso14496_Box_Tkhd extends Zend_Media_Iso14496_FullBox
|
||||||
|
{
|
||||||
|
/** @var integer */
|
||||||
|
private $_creationTime;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_modificationTime;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_trackId;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_duration;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_layer = 0;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_alternateGroup = 0;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_volume = 0;
|
||||||
|
|
||||||
|
/** @var Array */
|
||||||
|
private $_matrix = array
|
||||||
|
(0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000);
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_width;
|
||||||
|
|
||||||
|
/** @var integer */
|
||||||
|
private $_height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the track is enabled. A disabled track is treated as if it
|
||||||
|
* were not present.
|
||||||
|
*/
|
||||||
|
const TRACK_ENABLED = 1;
|
||||||
|
|
||||||
|
/** Indicates that the track is used in the presentation. */
|
||||||
|
const TRACK_IN_MOVIE = 2;
|
||||||
|
|
||||||
|
/** Indicates that the track is used when previewing the presentation. */
|
||||||
|
const TRACK_IN_PREVIEW = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the class with given parameters and reads box related data
|
||||||
|
* from the ISO Base Media file.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Reader $reader The reader object.
|
||||||
|
* @param Array $options The options array.
|
||||||
|
*/
|
||||||
|
public function __construct($reader, &$options = array())
|
||||||
|
{
|
||||||
|
parent::__construct($reader, $options);
|
||||||
|
|
||||||
|
if ($this->getVersion() == 1) {
|
||||||
|
$this->_creationTime = $this->_reader->readInt64BE();
|
||||||
|
$this->_modificationTime = $this->_reader->readInt64BE();
|
||||||
|
$this->_trackId = $this->_reader->readUInt32BE();
|
||||||
|
$this->_reader->skip(4);
|
||||||
|
$this->_duration = $this->_reader->readInt64BE();
|
||||||
|
} else {
|
||||||
|
$this->_creationTime = $this->_reader->readUInt32BE();
|
||||||
|
$this->_modificationTime = $this->_reader->readUInt32BE();
|
||||||
|
$this->_trackId = $this->_reader->readUInt32BE();
|
||||||
|
$this->_reader->skip(4);
|
||||||
|
$this->_duration = $this->_reader->readUInt32BE();
|
||||||
|
}
|
||||||
|
$this->_reader->skip(8);
|
||||||
|
$this->_layer = $this->_reader->readInt16BE();
|
||||||
|
$this->_alternateGroup = $this->_reader->readInt16BE();
|
||||||
|
$this->_volume =
|
||||||
|
((($tmp = $this->_reader->readUInt16BE()) >> 8) & 0xff) +
|
||||||
|
(float)("0." . ((string)($tmp & 0xff)));
|
||||||
|
$this->_reader->skip(2);
|
||||||
|
for ($i = 0; $i < 9; $i++) {
|
||||||
|
$this->_matrix[$i] = $this->_reader->readUInt32BE();
|
||||||
|
}
|
||||||
|
$this->_width =
|
||||||
|
((($tmp = $this->_reader->readUInt32BE()) >> 16) & 0xffff) +
|
||||||
|
(float)("0." . ((string)($tmp & 0xffff)));
|
||||||
|
$this->_height =
|
||||||
|
((($tmp = $this->_reader->readUInt32BE()) >> 16) & 0xffff) +
|
||||||
|
(float)("0." . ((string)($tmp & 0xffff)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the creation time of this track in seconds since midnight, Jan. 1,
|
||||||
|
* 1904, in UTC time.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getCreationTime()
|
||||||
|
{
|
||||||
|
return $this->_creationTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the creation time of this track in seconds since midnight, Jan. 1,
|
||||||
|
* 1904, in UTC time.
|
||||||
|
*
|
||||||
|
* @param integer $creationTime The creation time.
|
||||||
|
*/
|
||||||
|
public function setCreationTime()
|
||||||
|
{
|
||||||
|
$this->_creationTime = $creationTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the most recent time the track was modified in seconds since
|
||||||
|
* midnight, Jan. 1, 1904, in UTC time.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getModificationTime()
|
||||||
|
{
|
||||||
|
return $this->_modificationTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the most recent time the track was modified in seconds since
|
||||||
|
* midnight, Jan. 1, 1904, in UTC time.
|
||||||
|
*
|
||||||
|
* @param integer $modificationTime The modification time.
|
||||||
|
*/
|
||||||
|
public function setModificationTime($modificationTime)
|
||||||
|
{
|
||||||
|
$this->_modificationTime = $modificationTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a number that uniquely identifies this track over the entire
|
||||||
|
* life-time of this presentation. Track IDs are never re-used and cannot be
|
||||||
|
* zero.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getTrackId()
|
||||||
|
{
|
||||||
|
return $this->_trackId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a number that uniquely identifies this track over the entire
|
||||||
|
* life-time of this presentation. Track IDs are never re-used and cannot be
|
||||||
|
* zero.
|
||||||
|
*
|
||||||
|
* @param integer $trackId The track identification.
|
||||||
|
*/
|
||||||
|
public function setTrackId($trackId)
|
||||||
|
{
|
||||||
|
$this->_trackId = $trackId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the duration of this track (in the timescale indicated in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mvhd Movie Header Box}). The value of this
|
||||||
|
* field is equal to the sum of the durations of all of the track's edits.
|
||||||
|
* If there is no edit list, then the duration is the sum of the sample
|
||||||
|
* durations, converted into the timescale in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mvhd Movie Header Box}. If the duration
|
||||||
|
* of this track cannot be determined then duration is set to all 32-bit
|
||||||
|
* maxint.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getDuration()
|
||||||
|
{
|
||||||
|
return $this->_duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the duration of this track (in the timescale indicated in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mvhd Movie Header Box}). The value of this
|
||||||
|
* field must be equal to the sum of the durations of all of the track's
|
||||||
|
* edits. If there is no edit list, then the duration must be the sum of the
|
||||||
|
* sample durations, converted into the timescale in the
|
||||||
|
* {@link Zend_Media_Iso14496_Box_Mvhd Movie Header Box}. If the duration
|
||||||
|
* of this track cannot be determined then duration is set to all 32-bit
|
||||||
|
* maxint.
|
||||||
|
*
|
||||||
|
* @param integer $duration The duration of this track.
|
||||||
|
*/
|
||||||
|
public function setDuration($duration)
|
||||||
|
{
|
||||||
|
$this->_duration = $duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the front-to-back ordering of video tracks; tracks with lower
|
||||||
|
* numbers are closer to the viewer. 0 is the normal value, and -1 would be
|
||||||
|
* in front of track 0, and so on.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getLayer()
|
||||||
|
{
|
||||||
|
return $this->_layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the front-to-back ordering of video tracks; tracks with lower
|
||||||
|
* numbers are closer to the viewer. 0 is the normal value, and -1 would be
|
||||||
|
* in front of track 0, and so on.
|
||||||
|
*
|
||||||
|
* @param integer $layer The layer.
|
||||||
|
*/
|
||||||
|
public function setLayer($layer)
|
||||||
|
{
|
||||||
|
$this->_layer = $layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an integer that specifies a group or collection of tracks. If
|
||||||
|
* this field is 0 there is no information on possible relations to other
|
||||||
|
* tracks. If this field is not 0, it should be the same for tracks that
|
||||||
|
* contain alternate data for one another and different for tracks belonging
|
||||||
|
* to different such groups. Only one track within an alternate group
|
||||||
|
* should be played or streamed at any one time, and must be distinguishable
|
||||||
|
* from other tracks in the group via attributes such as bitrate, codec,
|
||||||
|
* language, packet size etc. A group may have only one member.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getAlternateGroup()
|
||||||
|
{
|
||||||
|
return $this->_alternateGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an integer that specifies a group or collection of tracks. If
|
||||||
|
* this field is 0 there is no information on possible relations to other
|
||||||
|
* tracks. If this field is not 0, it should be the same for tracks that
|
||||||
|
* contain alternate data for one another and different for tracks belonging
|
||||||
|
* to different such groups. Only one track within an alternate group
|
||||||
|
* should be played or streamed at any one time, and must be distinguishable
|
||||||
|
* from other tracks in the group via attributes such as bitrate, codec,
|
||||||
|
* language, packet size etc. A group may have only one member.
|
||||||
|
*
|
||||||
|
* @param integer $alternateGroup The alternate group.
|
||||||
|
*/
|
||||||
|
public function setAlternateGroup($alternateGroup)
|
||||||
|
{
|
||||||
|
$this->_alternateGroup = $alternateGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns track's relative audio volume. Full volume is 1.0 (0x0100) and
|
||||||
|
* is the normal value. Its value is irrelevant for a purely visual track.
|
||||||
|
* Tracks may be composed by combining them according to their volume, and
|
||||||
|
* then using the overall Movie Header Box volume setting; or more complex
|
||||||
|
* audio composition (e.g. MPEG-4 BIFS) may be used.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getVolume()
|
||||||
|
{
|
||||||
|
return $this->_volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets track's relative audio volume. Full volume is 1.0 (0x0100) and
|
||||||
|
* is the normal value. Its value is irrelevant for a purely visual track.
|
||||||
|
* Tracks may be composed by combining them according to their volume, and
|
||||||
|
* then using the overall Movie Header Box volume setting; or more complex
|
||||||
|
* audio composition (e.g. MPEG-4 BIFS) may be used.
|
||||||
|
*
|
||||||
|
* @param integer $volume The volume.
|
||||||
|
*/
|
||||||
|
public function setVolume($volume)
|
||||||
|
{
|
||||||
|
$this->_volume = $volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the track's visual presentation width. This needs not be the same
|
||||||
|
* as the pixel width of the images; all images in the sequence are scaled
|
||||||
|
* to this width, before any overall transformation of the track represented
|
||||||
|
* by the matrix. The pixel width of the images is the default value.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getWidth()
|
||||||
|
{
|
||||||
|
return $this->_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the track's visual presentation width. This needs not be the same
|
||||||
|
* as the pixel width of the images; all images in the sequence are scaled
|
||||||
|
* to this width, before any overall transformation of the track represented
|
||||||
|
* by the matrix. The pixel width of the images should be the default value.
|
||||||
|
*
|
||||||
|
* @param integer $width The width.
|
||||||
|
*/
|
||||||
|
public function setWidth($width)
|
||||||
|
{
|
||||||
|
$this->_width = $width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the track's visual presentation height. This needs not be the
|
||||||
|
* same as the pixel height of the images; all images in the sequence are
|
||||||
|
* scaled to this height, before any overall transformation of the track
|
||||||
|
* represented by the matrix. The pixel height of the images is the default
|
||||||
|
* value.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeight()
|
||||||
|
{
|
||||||
|
return $this->_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the track's visual presentation height. This needs not be the
|
||||||
|
* same as the pixel height of the images; all images in the sequence are
|
||||||
|
* scaled to this height, before any overall transformation of the track
|
||||||
|
* represented by the matrix. The pixel height of the images should be the
|
||||||
|
* default value.
|
||||||
|
*
|
||||||
|
* @param integer $height The height.
|
||||||
|
*/
|
||||||
|
public function setHeight($height)
|
||||||
|
{
|
||||||
|
$this->_height = $height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the box heap size in bytes.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function getHeapSize()
|
||||||
|
{
|
||||||
|
return parent::getHeapSize() +
|
||||||
|
($this->getVersion() == 1 ? 32 : 20) + 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the box data.
|
||||||
|
*
|
||||||
|
* @param Zend_Io_Writer $writer The writer object.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _writeData($writer)
|
||||||
|
{
|
||||||
|
parent::_writeData($writer);
|
||||||
|
if ($this->getVersion() == 1) {
|
||||||
|
$writer->writeInt64BE($this->_creationTime)
|
||||||
|
->writeInt64BE($this->_modificationTime)
|
||||||
|
->writeUInt32BE($this->_trackId)
|
||||||
|
->writeUInt32BE(0)
|
||||||
|
->writeInt64BE($this->_duration);
|
||||||
|
} else {
|
||||||
|
$writer->writeUInt32BE($this->_creationTime)
|
||||||
|
->writeUInt32BE($this->_modificationTime)
|
||||||
|
->writeUInt32BE($this->_trackId)
|
||||||
|
->writeUInt32BE(0)
|
||||||
|
->writeUInt32BE($this->_duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@list(, $volumeDecimals) = explode('.', (float)$this->_volume);
|
||||||
|
$writer->write(str_pad('', 8, "\0"))
|
||||||
|
->writeInt16BE($this->_layer)
|
||||||
|
->writeInt16BE($this->_alternateGroup)
|
||||||
|
->writeUInt16BE(floor($this->_volume) << 8 | $volumeDecimals)
|
||||||
|
->write(str_pad('', 2, "\0"));
|
||||||
|
for ($i = 0; $i < 9; $i++) {
|
||||||
|
$writer->writeUInt32BE($this->_matrix[$i]);
|
||||||
|
}
|
||||||
|
@list(, $widthDecimals) = explode('.', (float)$this->_width);
|
||||||
|
@list(, $heightDecimals) = explode('.', (float)$this->_height);
|
||||||
|
$writer->writeUInt32BE(floor($this->_width) << 16 | $widthDecimals)
|
||||||
|
->writeUInt32BE(floor($this->_height) << 16 | $heightDecimals);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user