diff --git a/src/Zend/Media/Iso14496/Box/Hdlr.php b/src/Zend/Media/Iso14496/Box/Hdlr.php
new file mode 100644
index 0000000..58fc43e
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Hdlr.php
@@ -0,0 +1,174 @@
+Handler Reference Box is within a
+ * {@link Zend_Media_Iso14496_Box_Mdia Media Box} declares the process by which
+ * the media-data in the track is presented, and thus, the nature of the media
+ * in a track. For example, a video track would be handled by a video handler.
+ *
+ * This box when present within a {@link Zend_Media_Iso14496_Box_Meta Meta Box},
+ * declares the structure or format of the meta box contents.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Hdlr extends Zend_Media_Iso14496_FullBox
+{
+ /** @var string */
+ private $_handlerType;
+
+ /** @var string */
+ private $_name;
+
+ /**
+ * 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 = null, &$options = array())
+ {
+ parent::__construct($reader, $options);
+
+ if ($reader === null) {
+ return;
+ }
+
+ $this->_reader->skip(4);
+ $this->_handlerType = $this->_reader->read(4);
+ $this->_reader->skip(12);
+ $this->_name = $this->_reader->readString8
+ ($this->getOffset() + $this->getSize() -
+ $this->_reader->getOffset());
+ }
+
+ /**
+ * Returns the handler type.
+ *
+ * When present in a media box, the returned value contains one of the
+ * following values, or a value from a derived specification:
+ * o vide Video track
+ * o soun Audio track
+ * o hint Hint track
+ *
+ * When present in a meta box, the returned value contains an appropriate
+ * value to indicate the format of the meta box contents.
+ *
+ * @return integer
+ */
+ public function getHandlerType()
+ {
+ return $this->_handlerType;
+ }
+
+ /**
+ * Sets the handler type.
+ *
+ * When present in a media box, the value must be set to one of the
+ * following values, or a value from a derived specification:
+ * o vide Video track
+ * o soun Audio track
+ * o hint Hint track
+ *
+ * When present in a meta box, the value must be set to an appropriate value
+ * to indicate the format of the meta box contents.
+ *
+ * @param string $handlerType The handler type.
+ */
+ public function setHandlerType($handlerType)
+ {
+ $this->_handlerType = $handlerType;
+ }
+
+ /**
+ * Returns the name string. The name is in UTF-8 characters and gives a
+ * human-readable name for the track type (for debugging and inspection
+ * purposes).
+ *
+ * @return integer
+ */
+ public function getName()
+ {
+ return $this->_name;
+ }
+
+ /**
+ * Sets the name string. The name must be in UTF-8 and give a human-readable
+ * name for the track type (for debugging and inspection purposes).
+ *
+ * @param string $name The human-readable description.
+ */
+ public function setName($name)
+ {
+ $this->_name = $name;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 20 + strlen($this->_name);
+ }
+
+ /**
+ * Writes the box data.
+ *
+ * @param Zend_Io_Writer $writer The writer object.
+ * @return void
+ */
+ protected function _writeData($writer)
+ {
+ parent::_writeData($writer);
+ $writer->write(str_pad('', 4, "\0"))
+ ->write($this->_handlerType)
+ ->writeUInt32BE(0)
+ ->writeUInt32BE(0)
+ ->writeUInt32BE(0)
+ ->writeString8($this->_name);
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Mdhd.php b/src/Zend/Media/Iso14496/Box/Mdhd.php
new file mode 100644
index 0000000..b323417
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Mdhd.php
@@ -0,0 +1,243 @@
+Media Header Box declares overall information that is
+ * media-independent, and relevant to characteristics of the media in a track.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Mdhd extends Zend_Media_Iso14496_FullBox
+{
+ /** @var integer */
+ private $_creationTime;
+
+ /** @var integer */
+ private $_modificationTime;
+
+ /** @var integer */
+ private $_timescale;
+
+ /** @var integer */
+ private $_duration;
+
+ /** @var string */
+ private $_language = 'und';
+
+ /**
+ * 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->_timescale = $this->_reader->readUInt32BE();
+ $this->_duration = $this->_reader->readInt64BE();
+ } else {
+ $this->_creationTime = $this->_reader->readUInt32BE();
+ $this->_modificationTime = $this->_reader->readUInt32BE();
+ $this->_timescale = $this->_reader->readUInt32BE();
+ $this->_duration = $this->_reader->readUInt32BE();
+ }
+ $this->_language = chr
+ (((($tmp = $this->_reader->readUInt16BE()) >> 10) & 0x1f) + 0x60) .
+ chr((($tmp >> 5) & 0x1f) + 0x60) . chr(($tmp & 0x1f) + 0x60);
+ }
+
+ /**
+ * Returns the creation time of the media in 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 the media in this track, in seconds since
+ * midnight, Jan. 1, 1904, in UTC time.
+ *
+ * @param integer $creationTime The creation time.
+ */
+ public function setCreationTime($creationTime)
+ {
+ $this->_creationTime = $creationTime;
+ }
+
+ /**
+ * Returns the most recent time the media in this 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 media in this 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 the time-scale for this media. This is the number of time units
+ * that pass in one second. For example, a time coordinate system that
+ * measures time in sixtieths of a second has a time scale of 60.
+ *
+ * @return integer
+ */
+ public function getTimescale()
+ {
+ return $this->_timescale;
+ }
+
+ /**
+ * Sets the time-scale for this media. This is the number of time units
+ * that pass in one second. For example, a time coordinate system that
+ * measures time in sixtieths of a second has a time scale of 60.
+ *
+ * @param integer $timescale The time-scale.
+ */
+ public function setTimescale($timescale)
+ {
+ $this->_timescale = $timescale;
+ }
+
+ /**
+ * Returns the duration of this media (in the scale of the timescale).
+ *
+ * @return integer
+ */
+ public function getDuration()
+ {
+ return $this->_duration;
+ }
+
+ /**
+ * Sets the duration of this media (in the scale of the timescale).
+ *
+ * @param integer $duration The duration.
+ */
+ public function setDuration($duration)
+ {
+ $this->_duration = $duration;
+ }
+
+ /**
+ * Returns 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}.
+ *
+ * @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 box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() +
+ ($this->getVersion() == 1 ? 28 : 16) + 4;
+ }
+
+ /**
+ * 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->_timescale)
+ ->writeInt64BE($this->_duration);
+ } else {
+ $writer->writeUInt32BE($this->_creationTime)
+ ->writeUInt32BE($this->_modificationTime)
+ ->writeUInt32BE($this->_timescale)
+ ->writeUInt32BE($this->_duration);
+ }
+ $writer->writeUInt16BE((ord($this->_language[0]) - 0x60) << 10 |
+ (ord($this->_language[1])- 0x60) << 5 |
+ (ord($this->_language[2])- 0x60))
+ ->write(str_pad('', 2, "\0"));
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Smhd.php b/src/Zend/Media/Iso14496/Box/Smhd.php
new file mode 100644
index 0000000..82fa2ba
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Smhd.php
@@ -0,0 +1,123 @@
+Sound Media Header Box contains general presentation information,
+ * independent of the coding, for audio media. This header is used for all
+ * tracks containing audio.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Smhd extends Zend_Media_Iso14496_FullBox
+{
+ /** @var integer */
+ private $_balance = 0;
+
+ /**
+ * 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 = null, &$options = array())
+ {
+ parent::__construct($reader, $options);
+
+ if ($reader === null) {
+ return;
+ }
+
+ $this->_balance =
+ ((($tmp = $this->_reader->readUInt16BE()) >> 8) & 0xff) +
+ (float)("0." . ((string)($tmp & 0xff)));
+ $this->_reader->skip(2);
+ }
+
+ /**
+ * Returns the number that places mono audio tracks in a stereo space; 0 is
+ * center (the normal value); full left is -1.0 and full right is 1.0.
+ *
+ * @return integer
+ */
+ public function getBalance()
+ {
+ return $this->_balance;
+ }
+
+ /**
+ * Sets the number that places mono audio tracks in a stereo space; 0 is
+ * center (the normal value); full left is -1.0 and full right is 1.0.
+ *
+ * @param integer $balance The balance.
+ */
+ public function setBalance($balance)
+ {
+ $this->_balance = $balance;
+ }
+
+ /**
+ * 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);
+ @list(, $balanceDecimals) = explode('.', (float)$this->_balance);
+ $writer->writeInt16BE(floor($this->_balance) << 8 | $balanceDecimals)
+ ->writeInt16BE(0);
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stco.php b/src/Zend/Media/Iso14496/Box/Stco.php
new file mode 100644
index 0000000..d1402dc
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stco.php
@@ -0,0 +1,134 @@
+Chunk Offset Box 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 32-bit offsets.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stco 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 = 0; $i < $entryCount; $i++) {
+ $this->_chunkOffsetTable[$i + 1] = $reader->readUInt32BE();
+ }
+ }
+
+ /**
+ * Returns an array of values. Each entry has the entry number as its index
+ * and a 32 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 32 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) * 4;
+ }
+
+ /**
+ * 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->_chunkOffsetTable));
+ for ($i = 1; $i <= $entryCount; $i++) {
+ $writer->writeUInt32BE($this->_chunkOffsetTable[$i]);
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stdp.php b/src/Zend/Media/Iso14496/Box/Stdp.php
new file mode 100644
index 0000000..56bf5ea
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stdp.php
@@ -0,0 +1,122 @@
+Degradation Priority Box contains the degradation priority of each
+ * sample. Specifications derived from this define the exact meaning and
+ * acceptable range of the priority field.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stdp extends Zend_Media_Iso14496_FullBox
+{
+ /** @var Array */
+ private $_values = 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->getOffset() + $this->getSize()) {
+ $this->_values[] = array
+ ('priority' => $this->_reader->readUInt16BE());
+ }
+ }
+
+ /**
+ * Returns an array of values. Each entry is an array containing the
+ * following keys.
+ * o priority: specifies the degradation priority for each sample segment.
+ *
+ * @return Array
+ */
+ public function getValues()
+ {
+ return $this->_values;
+ }
+
+ /**
+ * Sets an array of values. Each entry must have an array containing the
+ * following keys.
+ * o priority: specifies the degradation priority for each sample segment.
+ *
+ * @param Array $values The array of values.
+ */
+ public function setValues($values)
+ {
+ $this->_values = $values;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + count($this->_values) * 2;
+ }
+
+ /**
+ * 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->_values); $i++) {
+ $writer->writeUInt16BE($this->_values[$i]['priority']);
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stsc.php b/src/Zend/Media/Iso14496/Box/Stsc.php
new file mode 100644
index 0000000..77808a9
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stsc.php
@@ -0,0 +1,161 @@
+Sample To Chunk Box table can be used to find the chunk that
+ * contains a sample, its position, and the associated sample description.
+ *
+ * The table is compactly coded. Each entry gives the index of the first chunk
+ * of a run of chunks with the same characteristics. By subtracting one entry
+ * here from the previous one, you can compute how many chunks are in this run.
+ * You can convert this to a sample count by multiplying by the appropriate
+ * samplesPerChunk.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stsc extends Zend_Media_Iso14496_FullBox
+{
+ /** @var Array */
+ private $_sampleToChunkTable = 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->_sampleToChunkTable[$i] = array
+ ('firstChunk' => $this->_reader->readUInt32BE(),
+ 'samplesPerChunk' => $this->_reader->readUInt32BE(),
+ 'sampleDescriptionIndex' => $this->_reader->readUInt32BE());
+ }
+ }
+
+ /**
+ * Returns an array of values. Each entry is an array containing the
+ * following keys.
+ * o firstChunk -- an integer that gives the index of the first chunk in
+ * this run of chunks that share the same samplesPerChunk and
+ * sampleDescriptionIndex; the index of the first chunk in a track has
+ * the value 1 (the firstChunk field in the first record of this box
+ * has the value 1, identifying that the first sample maps to the first
+ * chunk).
+ * o samplesPerChunk is an integer that gives the number of samples in
+ * each of these chunks.
+ * o sampleDescriptionIndex is an integer that gives the index of the
+ * sample entry that describes the samples in this chunk. The index
+ * ranges from 1 to the number of sample entries in the
+ * {@link Zend_Media_Iso14496_Box_Stsd Sample Description Box}.
+ *
+ * @return Array
+ */
+ public function getSampleToChunkTable()
+ {
+ return $this->_sampleToChunkTable;
+ }
+
+ /**
+ * Sets an array of values. Each entry is an array containing the
+ * following keys.
+ * o firstChunk -- an integer that gives the index of the first chunk in
+ * this run of chunks that share the same samplesPerChunk and
+ * sampleDescriptionIndex; the index of the first chunk in a track has
+ * the value 1 (the firstChunk field in the first record of this box
+ * has the value 1, identifying that the first sample maps to the first
+ * chunk).
+ * o samplesPerChunk is an integer that gives the number of samples in
+ * each of these chunks.
+ * o sampleDescriptionIndex is an integer that gives the index of the
+ * sample entry that describes the samples in this chunk. The index
+ * ranges from 1 to the number of sample entries in the
+ * {@link Zend_Media_Iso14496_Box_Stsd Sample Description Box}.
+ *
+ * @param Array $sampleToChunkTable The array of values.
+ */
+ public function setSampleToChunkTable($sampleToChunkTable)
+ {
+ $this->_sampleToChunkTable = $sampleToChunkTable;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 4 +
+ count($this->_sampleToChunkTable) * 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->_sampleToChunkTable));
+ for ($i = 1; $i <= $entryCount; $i++) {
+ $writer->writeUInt32BE
+ ($this->_sampleToChunkTable[$i]['firstChunk'])
+ ->writeUInt32BE
+ ($this->_sampleToChunkTable[$i]['samplesPerChunk'])
+ ->writeUInt32BE
+ ($this->_sampleToChunkTable[$i]
+ ['sampleDescriptionIndex']);
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stsd.php b/src/Zend/Media/Iso14496/Box/Stsd.php
new file mode 100644
index 0000000..6cc847f
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stsd.php
@@ -0,0 +1,91 @@
+Sample Description Box table gives detailed information about the
+ * coding type used, and any initialization information needed for that coding.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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$
+ * @todo Implementation
+ */
+final class Zend_Media_Iso14496_Box_Stsd extends Zend_Media_Iso14496_FullBox
+{
+ private $_data;
+
+ /**
+ * 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->_data = $reader->read($this->getSize() - 12);
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + $this->getSize() - 12;
+ }
+
+ /**
+ * Writes the box data.
+ *
+ * @param Zend_Io_Writer $writer The writer object.
+ * @return void
+ */
+ protected function _writeData($writer)
+ {
+ parent::_writeData($writer);
+ $writer->write($this->_data);
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stsh.php b/src/Zend/Media/Iso14496/Box/Stsh.php
new file mode 100644
index 0000000..a5d964b
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stsh.php
@@ -0,0 +1,158 @@
+Shadow Sync Sample Box table provides an optional set of sync
+ * samples that can be used when seeking or for similar purposes. In normal
+ * forward play they are ignored.
+ *
+ * Each entry in the Shadow Sync Table consists of a pair of sample numbers. The
+ * first entry (shadowedSampleNumber) indicates the number of the sample that a
+ * shadow sync will be defined for. This should always be a non-sync sample
+ * (e.g. a frame difference). The second sample number (syncSampleNumber)
+ * indicates the sample number of the sync sample (i.e. key frame) that can be
+ * used when there is a random access at, or before, the shadowedSampleNumber.
+ *
+ * The shadow sync samples are normally placed in an area of the track that is
+ * not presented during normal play (edited out by means of an edit list),
+ * though this is not a requirement. The shadow sync table can be ignored and
+ * the track will play (and seek) correctly if it is ignored (though perhaps not
+ * optimally).
+ *
+ * The Shadow Sync Sample replaces, not augments, the sample that it shadows
+ * (i.e. the next sample sent is shadowedSampleNumber+1). The shadow sync sample
+ * is treated as if it occurred at the time of the sample it shadows, having the
+ * duration of the sample it shadows.
+ *
+ * Hinting and transmission might become more complex if a shadow sample is used
+ * also as part of normal playback, or is used more than once as a shadow. In
+ * this case the hint track might need separate shadow syncs, all of which can
+ * get their media data from the one shadow sync in the media track, to allow
+ * for the different time-stamps etc. needed in their headers.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stsh extends Zend_Media_Iso14496_FullBox
+{
+ /** @var Array */
+ private $_shadowSyncSampleTable = 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 = 0; $i < $entryCount; $i++) {
+ $this->_shadowSyncSampleTable[$i] = array
+ ('shadowedSampleNumber' => $this->_reader->readUInt32BE(),
+ 'syncSampleNumber' => $this->_reader->readUInt32BE());
+ }
+ }
+
+ /**
+ * Returns an array of values. Each entry is an array containing the
+ * following keys.
+ * o shadowedSampleNumber - gives the number of a sample for which there
+ * is an alternative sync sample.
+ * o syncSampleNumber - gives the number of the alternative sync sample.
+ *
+ * @return Array
+ */
+ public function getShadowSyncSampleTable()
+ {
+ return $this->_shadowSyncSampleTable;
+ }
+
+ /**
+ * Sets an array of values. Each entry must be an array containing the
+ * following keys.
+ * o shadowedSampleNumber - gives the number of a sample for which there
+ * is an alternative sync sample.
+ * o syncSampleNumber - gives the number of the alternative sync sample.
+ *
+ * @param Array $shadowSyncSampleTable The array of values.
+ */
+ public function setShadowSyncSampleTable($shadowSyncSampleTable)
+ {
+ $this->_shadowSyncSampleTable = $shadowSyncSampleTable;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 4 +
+ count($this->_shadowSyncSampleTable) * 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->_shadowSyncSampleTable));
+ for ($i = 1; $i <= $entryCount; $i++) {
+ $writer->writeUInt32BE
+ ($this->_shadowSyncSampleTable[$i]
+ ['shadowedSampleNumber'])
+ ->writeUInt32BE
+ ($this->_shadowSyncSampleTable[$i]['syncSampleNumber']);
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stss.php b/src/Zend/Media/Iso14496/Box/Stss.php
new file mode 100644
index 0000000..7b13ee7
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stss.php
@@ -0,0 +1,123 @@
+Sync Sample Box provides a compact marking of the random access
+ * points within the stream. The table is arranged in strictly increasing order
+ * of sample number. If the sync sample box is not present, every sample is a
+ * random access point.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stss extends Zend_Media_Iso14496_FullBox
+{
+ /** @var Array */
+ private $_syncSampleTable = 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->_syncSampleTable[$i] = $this->_reader->readUInt32BE();
+ }
+ }
+
+ /**
+ * Returns an array of values. Each entry has the entry number as its index
+ * and an integer that gives the numbers of the samples that are random
+ * access points in the stream as its value.
+ *
+ * @return Array
+ */
+ public function getSyncSampleTable()
+ {
+ return $this->_syncSampleTable;
+ }
+
+ /**
+ * Sets an array of values. Each entry has the entry number as its index
+ * and an integer that gives the numbers of the samples that are random
+ * access points in the stream as its value.
+ *
+ * @param Array $syncSampleTable The array of values.
+ */
+ public function setSyncSampleTable($syncSampleTable)
+ {
+ $this->_syncSampleTable = $syncSampleTable;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 4 + count($this->_syncSampleTable) * 4;
+ }
+
+ /**
+ * 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->_syncSampleTable));
+ for ($i = 1; $i <= $entryCount; $i++) {
+ $writer->writeUInt32BE($this->_syncSampleTable[$i]);
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stsz.php b/src/Zend/Media/Iso14496/Box/Stsz.php
new file mode 100644
index 0000000..bfd2e85
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stsz.php
@@ -0,0 +1,164 @@
+Sample Size Box contains the sample count and a table giving the
+ * size in bytes of each sample. This allows the media data itself to be
+ * unframed. The total number of samples in the media is always indicated in the
+ * sample count.
+ *
+ * There are two variants of the sample size box. The first variant has a fixed
+ * size 32-bit field for representing the sample sizes; it permits defining a
+ * constant size for all samples in a track. The second variant permits smaller
+ * size fields, to save space when the sizes are varying but small. One of these
+ * boxes must be present; the first version is preferred for maximum
+ * compatibility.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stsz extends Zend_Media_Iso14496_FullBox
+{
+ /** @var integer */
+ private $_sampleSize;
+
+ /** @var Array */
+ private $_sampleSizeTable = 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->_sampleSize = $this->_reader->readUInt32BE();
+ $sampleCount = $this->_reader->readUInt32BE();
+ if ($this->_sampleSize == 0) {
+ for ($i = 1; $i <= $sampleCount; $i++) {
+ $this->_sampleSizeTable[$i] = $this->_reader->readUInt32BE();
+ }
+ }
+ }
+
+ /**
+ * Returns the default sample size. If all the samples are the same size,
+ * this field contains that size value. If this field is set to 0, then the
+ * samples have different sizes, and those sizes are stored in the sample
+ * size table.
+ *
+ * @return integer
+ */
+ public function getSampleSize()
+ {
+ return $this->_sampleSize;
+ }
+
+ /**
+ * Sets the default sample size. If all the samples are the same size,
+ * this field contains that size value. If this field is set to 0, then the
+ * samples have different sizes, and those sizes are stored in the sample
+ * size table.
+ *
+ * @param integer $sampleSize The default sample size.
+ */
+ public function setSampleSize($sampleSize)
+ {
+ $this->_sampleSize = $sampleSize;
+ }
+
+ /**
+ * Returns an array of sample sizes specifying the size of a sample, indexed
+ * by its number.
+ *
+ * @return Array
+ */
+ public function getSampleSizeTable()
+ {
+ return $this->_sampleSizeTable;
+ }
+
+ /**
+ * Sets an array of sample sizes specifying the size of a sample, indexed
+ * by its number.
+ *
+ * @param Array $sampleSizeTable The array of sample sizes.
+ */
+ public function setSampleSizeTable($sampleSizeTable)
+ {
+ $this->_sampleSizeTable = $sampleSizeTable;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 8 +
+ ($this->_sampleSize == 0 ? count($this->_sampleSizeTable) * 4 : 0);
+ }
+
+ /**
+ * Writes the box data.
+ *
+ * @param Zend_Io_Writer $writer The writer object.
+ * @return void
+ */
+ protected function _writeData($writer)
+ {
+ parent::_writeData($writer);
+ $writer->writeUInt32BE($this->_sampleSize);
+ $writer->writeUInt32BE($entryCount = count($this->_sampleSizeTable));
+ if ($this->_sampleSize == 0) {
+ for ($i = 1; $i <= $entryCount; $i++) {
+ $writer->writeUInt32BE($this->_sampleSizeTable[$i]);
+ }
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Stts.php b/src/Zend/Media/Iso14496/Box/Stts.php
new file mode 100644
index 0000000..e258ae0
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Stts.php
@@ -0,0 +1,148 @@
+Decoding Time to Sample Box contains a compact version of a table
+ * that allows indexing from decoding time to sample number. Other tables give
+ * sample sizes and pointers, from the sample number. Each entry in the table
+ * gives the number of consecutive samples with the same time delta, and the
+ * delta of those samples. By adding the deltas a complete time-to-sample map
+ * may be built.
+ *
+ * The Decoding Time to Sample Box contains decode time delta's: DT(n+1) = DT(n)
+ * + STTS(n) where STTS(n) is the (uncompressed) table entry for sample n.
+ *
+ * The sample entries are ordered by decoding time stamps; therefore the deltas
+ * are all non-negative.
+ *
+ * The DT axis has a zero origin; DT(i) = SUM(for j=0 to i-1 of delta(j)), and
+ * the sum of all deltas gives the length of the media in the track (not mapped
+ * to the overall timescale, and not considering any edit list).
+ *
+ * The {@link Zend_Media_Iso14496_Box_Elst Edit List Box} provides the initial
+ * CT value if it is non-empty (non-zero).
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Stts extends Zend_Media_Iso14496_FullBox
+{
+ /** @var Array */
+ private $_timeToSampleTable = 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->_timeToSampleTable[$i] = array
+ ('sampleCount' => $this->_reader->readUInt32BE(),
+ 'sampleDelta' => $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 duration.
+ * o sampleDelta -- an integer that gives the delta of these samples in
+ * the time-scale of the media.
+ *
+ * @return Array
+ */
+ public function getTimeToSampleTable()
+ {
+ return $this->_timeToSampleTable;
+ }
+
+ /**
+ * Sets an array of values. Each entry must be an array containing the
+ * following keys.
+ * o sampleCount -- an integer that counts the number of consecutive
+ * samples that have the given duration.
+ * o sampleDelta -- an integer that gives the delta of these samples in
+ * the time-scale of the media.
+ *
+ * @param Array $timeToSampleTable The array of values.
+ */
+ public function setTimeToSampleTable($timeToSampleTable)
+ {
+ $this->_timeToSampleTable = $timeToSampleTable;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 4 + count($this->_timeToSampleTable) * 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->_timeToSampleTable));
+ for ($i = 1; $i <= $entryCount; $i++) {
+ $writer->writeUInt32BE($this->_timeToSampleTable[$i]['sampleCount'])
+ ->writeUInt32BE
+ ($this->_timeToSampleTable[$i]['sampleDelta']);
+ }
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Url.php b/src/Zend/Media/Iso14496/Box/Url.php
new file mode 100644
index 0000000..9c2bea0
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Url.php
@@ -0,0 +1,122 @@
+
+ * @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_Url extends Zend_Media_Iso14496_FullBox
+{
+ /** @var string */
+ private $_location;
+
+ /**
+ * Indicates that the media data is in the same file as the Movie Box
+ * containing this data reference.
+ */
+ const SELF_CONTAINED = 1;
+
+ /**
+ * 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 = null, &$options = array())
+ {
+ parent::__construct($reader, $options);
+
+ if ($reader === null) {
+ return;
+ }
+
+ $this->_location = $this->_reader->read
+ ($this->getOffset() + $this->getSize() -
+ $this->_reader->getOffset());
+ }
+
+ /**
+ * Returns the location.
+ *
+ * @return string
+ */
+ public function getLocation()
+ {
+ return $this->_location;
+ }
+
+ /**
+ * Sets the location.
+ *
+ * @param string $location The location string.
+ */
+ public function setLocation($location)
+ {
+ $this->_location = $location;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + strlen($this->_location);
+ }
+
+ /**
+ * Writes the box data.
+ *
+ * @param Zend_Io_Writer $writer The writer object.
+ * @return void
+ */
+ protected function _writeData($writer)
+ {
+ parent::_writeData($writer);
+ $writer->write($this->_location);
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Urn.php b/src/Zend/Media/Iso14496/Box/Urn.php
new file mode 100644
index 0000000..b6b3bac
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Urn.php
@@ -0,0 +1,148 @@
+
+ * @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_Urn extends Zend_Media_Iso14496_FullBox
+{
+ /** @var string */
+ private $_name;
+
+ /** @var string */
+ private $_location;
+
+ /**
+ * Indicates that the media data is in the same file as the Movie Box
+ * containing this data reference.
+ */
+ const SELF_CONTAINED = 1;
+
+ /**
+ * 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 = null, &$options = array())
+ {
+ parent::__construct($reader, $options);
+
+ if ($reader === null) {
+ return;
+ }
+
+ list ($this->_name, $this->_location) = preg_split
+ ("/\\x00/", $this->_reader->read
+ ($this->getOffset() + $this->getSize() -
+ $this->_reader->getOffset()));
+ }
+
+ /**
+ * Returns the name.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->_name;
+ }
+
+ /**
+ * Sets the name.
+ *
+ * @param string $name The name.
+ */
+ public function setName($name)
+ {
+ $this->_name = $name;
+ }
+
+ /**
+ * Returns the location.
+ *
+ * @return string
+ */
+ public function getLocation()
+ {
+ return $this->_location;
+ }
+
+ /**
+ * Sets the location.
+ *
+ * @param string $location The location.
+ */
+ public function setLocation($location)
+ {
+ $this->_location = $location;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() +
+ strlen($this->_name) + 1 + strlen($this->_location);
+ }
+
+ /**
+ * Writes the box data.
+ *
+ * @param Zend_Io_Writer $writer The writer object.
+ * @return void
+ */
+ protected function _writeData($writer)
+ {
+ parent::_writeData($writer);
+ $writer->writeString8($this->_name, 1)
+ ->write($this->_location);
+ }
+}
diff --git a/src/Zend/Media/Iso14496/Box/Vmhd.php b/src/Zend/Media/Iso14496/Box/Vmhd.php
new file mode 100644
index 0000000..0ce7268
--- /dev/null
+++ b/src/Zend/Media/Iso14496/Box/Vmhd.php
@@ -0,0 +1,153 @@
+Video Media Header Box contains general presentation information,
+ * independent of the coding, for video media.
+ *
+ * @category Zend
+ * @package Zend_Media
+ * @subpackage ISO 14496
+ * @author Sven Vollbehr
+ * @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_Vmhd extends Zend_Media_Iso14496_FullBox
+{
+ /** @var integer */
+ private $_graphicsMode = 0;
+
+ /** @var Array */
+ private $_opcolor = array(0, 0, 0);
+
+ /**
+ * 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 = null, &$options = array())
+ {
+ parent::__construct($reader, $options);
+
+ if ($reader === null) {
+ $this->setFlags(1);
+ return;
+ }
+
+ $this->_graphicsMode = $this->_reader->readUInt16BE();
+ $this->_opcolor = array
+ ($this->_reader->readUInt16BE(),
+ $this->_reader->readUInt16BE(),
+ $this->_reader->readUInt16BE());
+ }
+
+ /**
+ * Returns the composition mode for this video track, from the following
+ * enumerated set, which may be extended by derived specifications:
+ *
+ *
+ * - copy = 0 copy over the existing image
+ *
+ *
+ * @return integer
+ */
+ public function getGraphicsMode()
+ {
+ return $this->_graphicsMode;
+ }
+
+ /**
+ * Sets the composition mode for this video track.
+ *
+ * @param integer $graphicsMode The composition mode.
+ */
+ public function setGraphicsMode($graphicsMode)
+ {
+ $this->_graphicsMode = $graphicsMode;
+ }
+
+ /**
+ * Returns an array of 3 colour values (red, green, blue) available for use
+ * by graphics modes.
+ *
+ * @return Array
+ */
+ public function getOpcolor()
+ {
+ return $this->_opcolor;
+ }
+
+ /**
+ * Sets the array of 3 colour values (red, green, blue) available for use
+ * by graphics modes.
+ *
+ * @param Array $opcolor An array of 3 colour values
+ */
+ public function setOpcolor($opcolor)
+ {
+ $this->_opcolor = $opcolor;
+ }
+
+ /**
+ * Returns the box heap size in bytes.
+ *
+ * @return integer
+ */
+ public function getHeapSize()
+ {
+ return parent::getHeapSize() + 8;
+ }
+
+ /**
+ * Writes the box data.
+ *
+ * @param Zend_Io_Writer $writer The writer object.
+ * @return void
+ */
+ protected function _writeData($writer)
+ {
+ parent::_writeData($writer);
+ $writer->writeUInt16BE($this->_graphicsMode)
+ ->writeUInt16BE($this->_opcolor[0])
+ ->writeUInt16BE($this->_opcolor[1])
+ ->writeUInt16BE($this->_opcolor[2]);
+ }
+}