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 |