wp/wp-includes/ID3/module.audio.ogg.php
changeset 19 3d72ae0968f4
parent 16 a86126ab1dd4
child 21 48c4eec2b7e6
equal deleted inserted replaced
18:be944660c56a 19:3d72ae0968f4
   527 	/**
   527 	/**
   528 	 * @return array|false
   528 	 * @return array|false
   529 	 */
   529 	 */
   530 	public function ParseOggPageHeader() {
   530 	public function ParseOggPageHeader() {
   531 		// http://xiph.org/ogg/vorbis/doc/framing.html
   531 		// http://xiph.org/ogg/vorbis/doc/framing.html
       
   532 		$oggheader = array();
   532 		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
   533 		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
   533 
   534 
   534 		$filedata = $this->fread($this->getid3->fread_buffer_size());
   535 		$filedata = $this->fread($this->getid3->fread_buffer_size());
   535 		$filedataoffset = 0;
   536 		$filedataoffset = 0;
   536 		while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
   537 		while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
   678 					break 2;
   679 					break 2;
   679 				}
   680 				}
   680 
   681 
   681 				$VorbisCommentPage++;
   682 				$VorbisCommentPage++;
   682 
   683 
   683 				$oggpageinfo = $this->ParseOggPageHeader();
   684 				if ($oggpageinfo = $this->ParseOggPageHeader()) {
   684 				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
   685 					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
   685 
   686 
   686 				// First, save what we haven't read yet
   687 					// First, save what we haven't read yet
   687 				$AsYetUnusedData = substr($commentdata, $commentdataoffset);
   688 					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
   688 
   689 
   689 				// Then take that data off the end
   690 					// Then take that data off the end
   690 				$commentdata     = substr($commentdata, 0, $commentdataoffset);
   691 					$commentdata     = substr($commentdata, 0, $commentdataoffset);
   691 
   692 
   692 				// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
   693 					// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
   693 				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
   694 					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
   694 				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
   695 					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
   695 
   696 
   696 				// Finally, stick the unused data back on the end
   697 					// Finally, stick the unused data back on the end
   697 				$commentdata .= $AsYetUnusedData;
   698 					$commentdata .= $AsYetUnusedData;
   698 
   699 
   699 				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
   700 					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
   700 				if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
   701 					if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
   701 					$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
   702 						$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
       
   703 						break;
       
   704 					}
       
   705 					$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
       
   706 					if ($readlength <= 0) {
       
   707 						$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
       
   708 						break;
       
   709 					}
       
   710 					$commentdata .= $this->fread($readlength);
       
   711 
       
   712 					//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
       
   713 				} else {
       
   714 					$this->warning('failed to ParseOggPageHeader() at offset '.$this->ftell());
   702 					break;
   715 					break;
   703 				}
   716 				}
   704 				$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
       
   705 				if ($readlength <= 0) {
       
   706 					$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
       
   707 					break;
       
   708 				}
       
   709 				$commentdata .= $this->fread($readlength);
       
   710 
       
   711 				//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
       
   712 			}
   717 			}
   713 			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
   718 			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
   714 			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
   719 			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
   715 			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
   720 			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
   716 
   721