wp/wp-includes/ID3/module.audio.ogg.php
author ymh <ymh.work@gmail.com>
Tue, 09 Jun 2015 03:35:32 +0200
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 7 cf61fcea0001
permissions -rw-r--r--
upgrade wordpress + plugins
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/// getID3() by James Heinrich <info@getid3.org>               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
//  available at http://getid3.sourceforge.net                 //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
//            or http://www.getid3.org                         //
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
     6
//          also https://github.com/JamesHeinrich/getID3       //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
// See readme.txt for more details                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
// module.audio.ogg.php                                        //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// module for analyzing Ogg Vorbis, OggFLAC and Speex files    //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
// dependencies: module.audio.flac.php                         //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
//                                                            ///
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
class getid3_ogg extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
	// http://xiph.org/vorbis/doc/Vorbis_I_spec.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
	public function Analyze() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
		$info['fileformat'] = 'ogg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
		// Warn about illegal tags - only vorbiscomments are allowed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
		if (isset($info['id3v2'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
			$info['warning'][] = 'Illegal ID3v2 tag present.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
		if (isset($info['id3v1'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
			$info['warning'][] = 'Illegal ID3v1 tag present.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
		if (isset($info['ape'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
			$info['warning'][] = 'Illegal APE tag present.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
		// Page 1 - Stream Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
		$this->fseek($info['avdataoffset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
		if ($this->ftell() >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
			$info['error'][] = 'Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
			unset($info['fileformat']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
		$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
		if (substr($filedata, 0, 4) == 'fLaC') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
			$info['audio']['dataformat']   = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
			$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
			$info['audio']['lossless']     = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
		} elseif (substr($filedata, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
			$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
		} elseif (substr($filedata, 0, 8) == 'Speex   ') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
			// http://www.speex.org/manual/node10.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
			$info['audio']['dataformat']   = 'speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
			$info['mime_type']             = 'audio/speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
			$info['audio']['lossless']     = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string']           =                              substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex   '
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']          =                              substr($filedata, $filedataoffset, 20);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']                   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']                   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']                    = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers']          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
			$info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
			$info['speex']['sample_rate']   = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
			$info['speex']['channels']      = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
			$info['speex']['vbr']           = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
			$info['speex']['band_type']     = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
			$info['audio']['sample_rate']   = $info['speex']['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			$info['audio']['channels']      = $info['speex']['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
			if ($info['speex']['vbr']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
				$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   118
		} elseif (substr($filedata, 0, 7) == "\x80".'theora') {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   119
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   120
			// http://www.theora.org/doc/Theora.pdf (section 6.2)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   121
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   122
			$info['ogg']['pageheader']['theora']['theora_magic']             =                           substr($filedata, $filedataoffset,  7); // hard-coded to "\x80.'theora'
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   123
			$filedataoffset += 7;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   124
			$info['ogg']['pageheader']['theora']['version_major']            = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   125
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   126
			$info['ogg']['pageheader']['theora']['version_minor']            = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   127
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   128
			$info['ogg']['pageheader']['theora']['version_revision']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   129
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   130
			$info['ogg']['pageheader']['theora']['frame_width_macroblocks']  = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   131
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   132
			$info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   133
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   134
			$info['ogg']['pageheader']['theora']['resolution_x']             = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   135
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   136
			$info['ogg']['pageheader']['theora']['resolution_y']             = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   137
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   138
			$info['ogg']['pageheader']['theora']['picture_offset_x']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   139
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   140
			$info['ogg']['pageheader']['theora']['picture_offset_y']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   141
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   142
			$info['ogg']['pageheader']['theora']['frame_rate_numerator']     = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  4));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   143
			$filedataoffset += 4;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   144
			$info['ogg']['pageheader']['theora']['frame_rate_denominator']   = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  4));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   145
			$filedataoffset += 4;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   146
			$info['ogg']['pageheader']['theora']['pixel_aspect_numerator']   = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   147
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   148
			$info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   149
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   150
			$info['ogg']['pageheader']['theora']['color_space_id']           = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   151
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   152
			$info['ogg']['pageheader']['theora']['nominal_bitrate']          = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   153
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   154
			$info['ogg']['pageheader']['theora']['flags']                    = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   155
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   156
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   157
			$info['ogg']['pageheader']['theora']['quality']         = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   158
			$info['ogg']['pageheader']['theora']['kfg_shift']       = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >>  5;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   159
			$info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >>  3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   160
			$info['ogg']['pageheader']['theora']['reserved']        = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >>  0; // should be 0
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   161
			$info['ogg']['pageheader']['theora']['color_space']     = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   162
			$info['ogg']['pageheader']['theora']['pixel_format']    = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   163
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   164
			$info['video']['dataformat']   = 'theora';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   165
			$info['mime_type']             = 'video/ogg';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   166
			//$info['audio']['bitrate_mode'] = 'abr';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   167
			//$info['audio']['lossless']     = false;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   168
			$info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   169
			$info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   170
			if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   171
				$info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   172
			}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   173
			if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   174
				$info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   175
			}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   176
$info['warning'][] = 'Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   177
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
		} elseif (substr($filedata, 0, 8) == "fishead\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
			// Ogg Skeleton version 3.0 Format Specification
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
			// http://xiph.org/ogg/doc/skeleton.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
			$info['ogg']['skeleton']['fishead']['raw']['version_major']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
			$info['ogg']['skeleton']['fishead']['raw']['version_minor']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
			$info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
			$info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
			$info['ogg']['skeleton']['fishead']['raw']['basetime_numerator']           = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
			$info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
			$info['ogg']['skeleton']['fishead']['raw']['utc']                          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
			$info['ogg']['skeleton']['fishead']['version']          = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
			$info['ogg']['skeleton']['fishead']['presentationtime'] = $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
			$info['ogg']['skeleton']['fishead']['basetime']         = $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator']         / $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
			$info['ogg']['skeleton']['fishead']['utc']              = $info['ogg']['skeleton']['fishead']['raw']['utc'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
			$counter = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
			do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
				$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
				$this->fseek($oggpageinfo['page_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
				if (substr($filedata, 0, 8) == "fisbone\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
					$filedataoffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
					$info['ogg']['skeleton']['fisbone']['raw']['message_header_offset']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
					$info['ogg']['skeleton']['fisbone']['raw']['serial_number']           = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
					$info['ogg']['skeleton']['fisbone']['raw']['number_header_packets']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
					$info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
					$info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
					$info['ogg']['skeleton']['fisbone']['raw']['basegranule']             = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
					$info['ogg']['skeleton']['fisbone']['raw']['preroll']                 = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
					$info['ogg']['skeleton']['fisbone']['raw']['granuleshift']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
					$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
					$info['ogg']['skeleton']['fisbone']['raw']['padding']                 =                              substr($filedata, $filedataoffset,  3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
					$filedataoffset += 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
				} elseif (substr($filedata, 1, 6) == 'theora') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   236
					$info['video']['dataformat'] = 'theora1';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   237
					$info['error'][] = 'Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']';
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
				} elseif (substr($filedata, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
					$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
					$info['error'][] = 'unexpected';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
			//} while ($oggpageinfo['page_seqno'] == 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
			} while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00"));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
			$this->fseek($oggpageinfo['page_start_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
			$info['error'][] = 'Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
			//return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
			$info['error'][] = 'Expecting either "Speex   " or "vorbis" identifier strings, found "'.substr($filedata, 0, 8).'"';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
			unset($info['mime_type']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
		// Page 2 - Comment Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] =                              substr($filedata, 1, 6); // hard-coded to 'vorbis'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
				$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
				if (!$flac->parseMETAdata()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
					$info['error'][] = 'Failed to parse FLAC headers';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
				unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
			case 'speex':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
				$this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
		// Last Page - Number of Samples
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
		if (!getid3_lib::intValueSupported($info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
			$info['warning'][] = 'Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
			$this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
			$LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size()));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
			if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
				$this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO')));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
				$info['avdataend'] = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
				$info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
				$info['ogg']['samples']   = $info['ogg']['pageheader']['eos']['pcm_abs_position'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
				if ($info['ogg']['samples'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
					$info['error'][] = 'Corrupt Ogg file: eos.number of samples == zero';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
				if (!empty($info['audio']['sample_rate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
					$info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / ($info['ogg']['samples'] / $info['audio']['sample_rate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
		if (!empty($info['ogg']['bitrate_average'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
			$info['audio']['bitrate'] = $info['ogg']['bitrate_average'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
		} elseif (!empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
			$info['audio']['bitrate'] = $info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
		} elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
			$info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
		if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
			if ($info['audio']['bitrate'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
				$info['error'][] = 'Corrupt Ogg file: bitrate_audio == zero';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
			$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
		if (isset($info['ogg']['vendor'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
			$info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
			// Vorbis only
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
			if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
				// Vorbis 1.0 starts with Xiph.Org
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
				if  (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
					if ($info['audio']['bitrate_mode'] == 'abr') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
						// Set -b 128 on abr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
						$info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
					} elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
						// Set -q N on vbr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
						$info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
				if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
					$info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
	public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
		$info['audio']['dataformat'] = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
		$info['audio']['lossless']   = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
		$filedataoffset += 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
		$info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
		$info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
		$info['audio']['channels']       = $info['ogg']['numberofchannels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
		$info['ogg']['samplerate']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
		if ($info['ogg']['samplerate'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
			$info['error'][] = 'Corrupt Ogg file: sample rate == zero';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
		$info['audio']['sample_rate']    = $info['ogg']['samplerate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
		$info['ogg']['samples']          = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
		$info['ogg']['bitrate_average']  = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
		$info['ogg']['bitrate_max']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
		$info['ogg']['bitrate_nominal']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
		$info['ogg']['bitrate_min']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
		$info['ogg']['blocksize_small']  = pow(2,  getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
		$info['ogg']['blocksize_large']  = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
		$info['ogg']['stop_bit']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
		$info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
		if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
			unset($info['ogg']['bitrate_max']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
		if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
			unset($info['ogg']['bitrate_nominal']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
		if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
			unset($info['ogg']['bitrate_min']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
	public function ParseOggPageHeader() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
		// http://xiph.org/ogg/vorbis/doc/framing.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
		$filedata = $this->fread($this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
		while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
			if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
				// should be found before here
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
			if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
				if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
					// get some more data, unless eof, in which case fail
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
		$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
		$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
		$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
		$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
		$oggheader['flags']['bos']      = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
		$oggheader['flags']['eos']      = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
		$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
		$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
		$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
		$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
		$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
		$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
		$oggheader['page_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
		for ($i = 0; $i < $oggheader['page_segments']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
			$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
			$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
			$oggheader['page_length'] += $oggheader['segment_table'][$i];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
		$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
		$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
		$this->fseek($oggheader['header_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
		return $oggheader;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
    // http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
	public function ParseVorbisComments() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
		$OriginalOffset = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
		$commentdataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
		$VorbisCommentPage = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
			case 'speex':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
				$CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset'];  // Second Ogg page, after header block
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
				$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
				$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
				if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
					$commentdataoffset += (strlen('vorbis') + 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
				$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
				$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
		$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
		$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
		$commentdataoffset += $VendorSize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
		$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
		$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
		$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
		$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
		for ($i = 0; $i < $CommentsCount; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
			$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
			if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
					$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
					// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
					// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
					$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
					// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
					// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
					$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
					$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
			$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
			// replace avdataoffset with position just after the last vorbiscomment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
			$info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
			$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
			while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
				if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
					$info['warning'][] = 'Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
					break 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
				$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
				// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
				$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
				// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
				$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
				// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
				// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
				$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
				if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
					$info['warning'][] = 'undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
				$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
				if ($readlength <= 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
					$info['warning'][] = 'invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
				$commentdata .= $this->fread($readlength);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
				//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
			if (!$commentstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
				// no comment?
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
				$info['warning'][] = 'Blank Ogg comment ['.$i.']';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
			} elseif (strstr($commentstring, '=')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
				$commentexploded = explode('=', $commentstring, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
				$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
				$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
				if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
					// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
					// The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
					// http://flac.sourceforge.net/format.html#metadata_block_picture
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
					$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
					$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
					$flac->parsePICTURE();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
					$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
					unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
				} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
					$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
					$this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
					/** @todo use 'coverartmime' where available */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
					$imageinfo = getid3_lib::GetDataImageSize($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
					if ($imageinfo === false || !isset($imageinfo['mime'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
						$this->warning('COVERART vorbiscomment tag contains invalid image');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
						continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
					$ogg = new self($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
					$ogg->setStringMode($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
					$info['ogg']['comments']['picture'][] = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
						'image_mime' => $imageinfo['mime'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
						'data'       => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
					unset($ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
					$info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
				$info['warning'][] = '[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
			unset($ThisFileInfo_ogg_comments_raw[$i]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
		unset($ThisFileInfo_ogg_comments_raw);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
		// Replay Gain Adjustment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
		// http://privatewww.essex.ac.uk/~djmrob/replaygain/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
		if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
			foreach ($info['ogg']['comments'] as $index => $commentvalue) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
				switch ($index) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
					case 'rg_audiophile':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
					case 'replaygain_album_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
						$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
					case 'rg_radio':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
					case 'replaygain_track_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
						$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
					case 'replaygain_album_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
						$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
					case 'rg_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
					case 'replaygain_track_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
						$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
					case 'replaygain_reference_loudness':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
						$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
					default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
						// do nothing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
		$this->fseek($OriginalOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
	public static function SpeexBandModeLookup($mode) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
		static $SpeexBandModeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
		if (empty($SpeexBandModeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
			$SpeexBandModeLookup[0] = 'narrow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
			$SpeexBandModeLookup[1] = 'wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
			$SpeexBandModeLookup[2] = 'ultra-wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
		return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
	public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
		for ($i = 0; $i < $SegmentNumber; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
			$segmentlength = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
			foreach ($OggInfoArray['segment_table'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
				$segmentlength += $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
				if ($value < 255) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
		return $segmentlength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
	public static function get_quality_from_nominal_bitrate($nominal_bitrate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
		// decrease precision
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
		$nominal_bitrate = $nominal_bitrate / 1000;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
		if ($nominal_bitrate < 128) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
			// q-1 to q4
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
			$qval = ($nominal_bitrate - 64) / 16;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
		} elseif ($nominal_bitrate < 256) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
			// q4 to q8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
			$qval = $nominal_bitrate / 32;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
		} elseif ($nominal_bitrate < 320) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
			// q8 to q9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
			$qval = ($nominal_bitrate + 256) / 64;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
			// q9 to q10
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
			$qval = ($nominal_bitrate + 1300) / 180;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
		//return $qval; // 5.031324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
		//return intval($qval); // 5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
		return round($qval, 1); // 5 or 4.9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   732
	public static function TheoraColorSpace($colorspace_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   733
		// http://www.theora.org/doc/Theora.pdf (table 6.3)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   734
		static $TheoraColorSpaceLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   735
		if (empty($TheoraColorSpaceLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   736
			$TheoraColorSpaceLookup[0] = 'Undefined';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   737
			$TheoraColorSpaceLookup[1] = 'Rec. 470M';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   738
			$TheoraColorSpaceLookup[2] = 'Rec. 470BG';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   739
			$TheoraColorSpaceLookup[3] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   740
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   741
		return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   742
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   743
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   744
	public static function TheoraPixelFormat($pixelformat_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   745
		// http://www.theora.org/doc/Theora.pdf (table 6.4)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   746
		static $TheoraPixelFormatLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   747
		if (empty($TheoraPixelFormatLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   748
			$TheoraPixelFormatLookup[0] = '4:2:0';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   749
			$TheoraPixelFormatLookup[1] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   750
			$TheoraPixelFormatLookup[2] = '4:2:2';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   751
			$TheoraPixelFormatLookup[3] = '4:4:4';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   752
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   753
		return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   754
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   755
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   756
}