function ParseAfrtBox($afrt, $pos) { $fragTable = array(); $version = ReadByte($afrt, $pos); $flags = ReadInt24($afrt, $pos + 1); $timescale = ReadInt32($afrt, $pos + 4); $qualityEntryCount = ReadByte($afrt, $pos + 8); $pos += 9; for ($i = 0; $i < $qualityEntryCount; $i++) { $qualitySegmentUrlModifiers[$i] = ReadString($afrt, $pos); } $fragEntries = ReadInt32($afrt, $pos); $pos += 4; LogDebug(sprintf(" %-12s%-16s%-16s%-16s", "Number", "Timestamp", "Duration", "Discontinuity")); for ($i = 0; $i < $fragEntries; $i++) { $firstFragment = ReadInt32($afrt, $pos); $fragEntry =& $fragTable[$firstFragment]; $fragEntry['firstFragment'] = $firstFragment; $fragEntry['firstFragmentTimestamp'] = ReadInt64($afrt, $pos + 4); $fragEntry['fragmentDuration'] = ReadInt32($afrt, $pos + 12); $fragEntry['discontinuityIndicator'] = ""; $pos += 16; if ($fragEntry['fragmentDuration'] == 0) { $fragEntry['discontinuityIndicator'] = ReadByte($afrt, $pos++); } } unset($fragEntry); foreach ($fragTable as $fragEntry) { LogDebug(sprintf(" %-12s%-16s%-16s%-16s", $fragEntry['firstFragment'], $fragEntry['firstFragmentTimestamp'], $fragEntry['fragmentDuration'], $fragEntry['discontinuityIndicator'])); } LogDebug(""); return $fragTable; }
function ParseAfrtBox($afrt, $pos) { $version = ReadByte($afrt, $pos); $flags = ReadInt24($afrt, $pos + 1); $timescale = ReadInt32($afrt, $pos + 4); $qualityEntryCount = ReadByte($afrt, $pos + 8); $pos += 9; for ($i = 0; $i < $qualityEntryCount; $i++) { $qualitySegmentUrlModifiers[$i] = ReadString($afrt, $pos); } $fragEntries = ReadInt32($afrt, $pos); $pos += 4; LogDebug(sprintf("%s:\n\n %-8s%-16s%-16s%-16s", "Fragment Entries", "Number", "Timestamp", "Duration", "Discontinuity")); for ($i = 0; $i < $fragEntries; $i++) { $firstFragment = ReadInt32($afrt, $pos); $fragEntry =& $this->fragTable[$firstFragment]; $fragEntry['firstFragment'] = $firstFragment; $fragEntry['firstFragmentTimestamp'] = ReadInt64($afrt, $pos + 4); $fragEntry['fragmentDuration'] = ReadInt32($afrt, $pos + 12); $fragEntry['discontinuityIndicator'] = ""; $pos += 16; if ($fragEntry['fragmentDuration'] == 0) { $fragEntry['discontinuityIndicator'] = ReadByte($afrt, $pos++); } } unset($fragEntry); foreach ($this->fragTable as $fragEntry) { LogDebug(sprintf(" %-8s%-16s%-16s%-16s", $fragEntry['firstFragment'], $fragEntry['firstFragmentTimestamp'], $fragEntry['fragmentDuration'], $fragEntry['discontinuityIndicator'])); } LogDebug(""); // Use fragment table in case of single segment if (count($this->segTable) == 1) { $firstFragment = reset($this->fragTable); $lastFragment = end($this->fragTable); if ($this->fragStart === false) { if ($this->live) { $this->fragStart = $lastFragment['firstFragment'] - 2; } else { $this->fragStart = $firstFragment['firstFragment'] - 1; } if ($this->fragStart < 0) { $this->fragStart = 0; } } if ($this->fragCount > 0) { $this->fragCount += $firstFragment['firstFragment'] - 1; } if ($this->fragCount < $lastFragment['firstFragment']) { $this->fragCount = $lastFragment['firstFragment']; } } }