From ae666f57f46c27106f67fbee6364efa5b840192a Mon Sep 17 00:00:00 2001 From: svollbehr Date: Tue, 28 Dec 2010 13:48:09 +0000 Subject: [PATCH] Fix issue 44 git-svn-id: http://php-reader.googlecode.com/svn/trunk@208 51a70ab9-7547-0410-9469-37e369ee0574 --- src/Zend/Media/Mpeg/Abs.php | 34 +++++++++++++++++++++++++++++-- src/Zend/Media/Mpeg/Abs/Frame.php | 5 +++++ src/Zend/Media/Mpeg/Ps.php | 4 +++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/Zend/Media/Mpeg/Abs.php b/src/Zend/Media/Mpeg/Abs.php index 2dbb0a7..31e1d70 100644 --- a/src/Zend/Media/Mpeg/Abs.php +++ b/src/Zend/Media/Mpeg/Abs.php @@ -139,13 +139,43 @@ final class Zend_Media_Mpeg_Abs extends Zend_Media_Mpeg_Abs_Object } $this->_reader->setOffset($offset); - /* Skip ID3v2 tag */ - if ($this->_reader->readString8(3) == 'ID3') { + /* Skip ID3v2 tags (some files errorneusly contain multiple tags) */ + while ($this->_reader->readString8(3) == 'ID3') { require_once 'Zend/Media/Id3/Header.php'; $header = new Zend_Media_Id3_Header($this->_reader); $this->_reader->skip ($header->getSize() + ($header->hasFlag(Zend_Media_Id3_Header::FOOTER) ? 10 : 0)); + $offset = $this->_reader->getOffset(); + } + $this->_reader->setOffset($offset); + + /* Check whether the ABS is contained within a RIFF chunk */ + $offset = $this->_reader->getOffset(); + + if ($this->_reader->readString8(4) == 'RIFF') { + $riffSize = $this->_reader->readUInt32LE(); + $riffType = $this->_reader->read(4); // WAVE + + while ($this->_reader->getOffset() < $offset + 8 + $riffSize - 1) { + $chunkId = $this->_reader->read(4); + $chunkSize = $this->_reader->readUInt32LE(); + + if ($chunkId == 'fmt ') { + if ($this->_reader->readInt16LE() != 85) { // 85: MPEG-1 Layer 3 Codec + require_once 'Zend/Media/Mpeg/Exception.php'; + throw new Zend_Media_Mpeg_Exception + ('File does not contain a valid MPEG Audio Bit Stream (Contains RIFF with no MPEG ABS)'); + } else { + $this->_reader->skip($chunkSize - 2); + } + } else if ($chunkId == 'data') { + $offset = $this->_reader->getOffset(); + break; + } else { + $this->_reader->skip($chunkSize); + } + } } else { $this->_reader->setOffset($offset); } diff --git a/src/Zend/Media/Mpeg/Abs/Frame.php b/src/Zend/Media/Mpeg/Abs/Frame.php index ea1d2fa..bb05552 100644 --- a/src/Zend/Media/Mpeg/Abs/Frame.php +++ b/src/Zend/Media/Mpeg/Abs/Frame.php @@ -230,6 +230,11 @@ final class Zend_Media_Mpeg_Abs_Frame extends Zend_Media_Mpeg_Abs_Object $this->_offset = $this->_reader->getOffset(); $header = $this->_reader->readUInt32BE(); + if (!Zend_Bit_Twiddling::testAllBits(Zend_Bit_Twiddling::getValue($header, 21, 32), 0xffe)) { + require_once 'Zend/Media/Mpeg/Exception.php'; + throw new Zend_Media_Mpeg_Exception + ('File does not contain a valid MPEG Audio Bit Stream (Invalid frame sync)'); + } $this->_version = Zend_Bit_Twiddling::getValue($header, 19, 20); $this->_frequencyType = Zend_Bit_Twiddling::testBit($header, 19); $this->_layer = Zend_Bit_Twiddling::getValue($header, 17, 18); diff --git a/src/Zend/Media/Mpeg/Ps.php b/src/Zend/Media/Mpeg/Ps.php index ed8c4e8..576abaf 100644 --- a/src/Zend/Media/Mpeg/Ps.php +++ b/src/Zend/Media/Mpeg/Ps.php @@ -92,7 +92,9 @@ final class Zend_Media_Mpeg_Ps extends Zend_Media_Mpeg_Object $i1 = $this->_reader->readUInt32BE(); $i2 = $this->_reader->readUInt32BE(); if (!Zend_Bit_Twiddling::testAllBits($i2, 0x2000)) { - throw new RuntimeException('Invalid mark'); + require_once 'Zend/Media/Mpeg/Exception.php'; + throw new Zend_Media_Mpeg_Exception + ('File does not contain a valid MPEG Program Stream (Invalid mark)'); } $pictureRate = $rates[Zend_Bit_Twiddling::getValue($i1, 4, 8)]; $foundSeqHdr = true;