Track Fragment Run Boxes. If the durationIsEmpty flag is set, * there are no track runs. * * @package php-reader * @subpackage ISO 14496 * @author Sven Vollbehr * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup * @license http://code.google.com/p/php-reader/wiki/License New BSD License * @version $Rev: 92 $ */ final class ISO14496_Box_TRUN extends ISO14496_Box_Full { /** @var integer */ private $_dataOffset; /** @var Array */ private $_samples = array(); /** Indicates the precense of the dataOffset field. */ const DATA_OFFSET = 0x1; /** * Indicates the precense of the firstSampleFlags field; this over-rides the * default flags for the first sample only. This makes it possible to record * a group of frames where the first is a key and the rest are difference * frames, without supplying explicit flags for every sample. If this flag and * field are used, sampleFlags field shall not be present. */ const FIRST_SAMPLE_FLAGS = 0x4; /** * Indicates that each sample has its own duration, otherwise the default is * used. */ const SAMPLE_DURATION = 0x100; /** * Indicates that each sample has its own size, otherwise the default is used. */ const SAMPLE_SIZE = 0x200; /** * Indicates that each sample has its own flags, otherwise the default is * used. */ const SAMPLE_FLAGS = 0x400; /** * Indicates that each sample has a composition time offset (e.g. as used for * I/P/B video in MPEG). */ const SAMPLE_COMPOSITION_TIME_OFFSETS = 0x800; /** * Constructs the class with given parameters and reads box related data from * the ISO Base Media file. * * @param Reader $reader The reader object. */ public function __construct($reader, &$options = array()) { parent::__construct($reader, $options); $flags = $this->_flags; $sampleCount = $this->_reader->readUInt32BE(); if ($this->hasFlag(self::DATA_OFFSET)) $this->_dataOffset = $this->_reader->readInt32BE(); if ($this->hasFlag(self::FIRST_SAMPLE_FLAGS)) $this->_flags = $this->_reader->readUInt32BE(); for ($i = 0; $i < $sampleCount; $i++) { $sample = array(); if ($this->hasFlag(self::SAMPLE_DURATION)) $sample["duration"] = $this->_reader->readUInt32BE(); if ($this->hasFlag(self::SAMPLE_SIZE)) $sample["size"] = $this->_reader->readUInt32BE(); if ($this->hasFlag(self::SAMPLE_FLAGS)) $sample["flags"] = $this->_reader->readUInt32BE(); if ($this->hasFlag(self::SAMPLE_COMPOSITION_TIME_OFFSET)) $sample["compositionTimeOffset"] = $this->_reader->readUInt32BE(); $this->_samples[] = $sample; $this->_flags = $flags; } } /** * Returns the data offset. * * @return integer */ public function getDataOffset() { return $this->_trackId; } /** * Returns the array of samples. * * @return Array */ public function getSamples() { return $this->_samples; } }