Add support for Vorbis setup header

git-svn-id: http://php-reader.googlecode.com/svn/trunk@239 51a70ab9-7547-0410-9469-37e369ee0574
This commit is contained in:
svollbehr
2011-06-04 09:35:48 +00:00
parent 85cee10135
commit 9e17c99318
5 changed files with 133 additions and 20 deletions

View File

@@ -47,7 +47,7 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
private $_pages = array();
/** @var integer */
private $_currentPage = 0;
private $_currentPageNumber = 0;
/** @var integer */
private $_currentPagePosition = 0;
@@ -65,13 +65,15 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
$fileSize = $reader->getSize();
while ($reader->getOffset() < $fileSize) {
$this->_pages[] = array(
'page' => $page = new Zend_Media_Ogg_Page($reader),
'offset' => $reader->getOffset()
'offset' => $reader->getOffset(),
'page' => $page = new Zend_Media_Ogg_Page($reader)
);
$this->_size += $page->getPageSize();
$reader->skip($page->getPageSize());
}
$reader->setOffset($this->_pages[$this->_currentPage]['offset']);
$reader->setOffset
($this->_pages[$this->_currentPageNumber]['offset'] +
$this->_pages[$this->_currentPageNumber]['page']->getHeaderSize());
$this->_fd = $reader->getFileDescriptor();
}
@@ -84,7 +86,7 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
public function getOffset()
{
$offset = 0;
for ($i = 0; $i < $this->_currentPage; $i++) {
for ($i = 0; $i < $this->_currentPageNumber; $i++) {
$offset += $this->_pages[$i]['page']->getPageSize();
}
return $offset += $this->_currentPagePosition;
@@ -102,9 +104,11 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
$streamSize = 0;
for ($i = 0, $pageCount = count($this->_pages); $i < $pageCount; $i++) {
if (($streamSize + $this->_pages[$i]['page']->getPageSize()) >= $offset) {
$this->_currentPage = $i;
$this->_currentPageNumber = $i;
$this->_currentPagePosition = $offset - $streamSize;
parent::setOffset($this->_pages[$i]['offset'] + $this->_currentPagePosition);
parent::setOffset
($this->_pages[$i]['offset'] + $this->_pages[$i]['page']->getHeaderSize() +
$this->_currentPagePosition);
break;
}
$streamSize += $this->_pages[$i]['page']->getPageSize();
@@ -120,12 +124,12 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
*/
public function skip($size)
{
$currentPageSize = $this->_pages[$this->_currentPage]['page']->getPageSize();
$currentPageSize = $this->_pages[$this->_currentPageNumber]['page']->getPageSize();
if (($this->_currentPagePosition + $size) >= $currentPageSize) {
parent::skip
(($currentPageSize - $this->_currentPagePosition) +
$this->_pages[++$this->_currentPage]['page']->getHeaderSize() +
($this->_currentPagePosition = ($size - $currentPageSize - $this->_currentPagePosition)));
$this->_pages[++$this->_currentPageNumber]['page']->getHeaderSize() +
($this->_currentPagePosition = ($size - ($currentPageSize - $this->_currentPagePosition))));
} else {
$this->_currentPagePosition += $size;
parent::skip($size);
@@ -141,10 +145,10 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
*/
public function read($length)
{
$currentPageSize = $this->_pages[$this->_currentPage]['page']->getPageSize();
$currentPageSize = $this->_pages[$this->_currentPageNumber]['page']->getPageSize();
if (($this->_currentPagePosition + $length) >= $currentPageSize) {
$buffer = parent::read($currentPageSize - $this->_currentPagePosition);
parent::skip($this->_pages[++$this->_currentPage]['page']->getHeaderSize());
parent::skip($this->_pages[++$this->_currentPageNumber]['page']->getHeaderSize());
return $buffer . parent::read
($this->_currentPagePosition = ($length - ($currentPageSize - $this->_currentPagePosition)));
} else {
@@ -153,4 +157,35 @@ final class Zend_Media_Ogg_Reader extends Zend_Io_Reader
return $buffer;
}
}
/**
* Returns the underlying Ogg page at given number.
*
* @param integer $pageNumber The number of the page to return.
* @return Zend_Media_Ogg_Page
*/
public function getPage($pageNumber)
{
return $this->_pages[$pageNumber]['page'];
}
/**
* Returns the underlying Ogg page number.
*
* @return integer
*/
public function getCurrentPageNumber()
{
return $this->_currentPageNumber;
}
/**
* Returns the underlying Ogg page position, in bytes.
*
* @return integer
*/
public function getCurrentPagePosition()
{
return $this->_currentPagePosition;
}
}