wp/wp-includes/ID3/module.audio.ogg.php
author ymh <ymh.work@gmail.com>
Wed, 06 Nov 2013 03:21:17 +0000
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
permissions -rw-r--r--
first import
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                         //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
// See readme.txt for more details                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
// module.audio.ogg.php                                        //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
// module for analyzing Ogg Vorbis, OggFLAC and Speex files    //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// dependencies: module.audio.flac.php                         //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
//                                                            ///
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
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class getid3_ogg extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
	// http://xiph.org/vorbis/doc/Vorbis_I_spec.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
	public function Analyze() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
		$info['fileformat'] = 'ogg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
		// Warn about illegal tags - only vorbiscomments are allowed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
		if (isset($info['id3v2'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
			$info['warning'][] = 'Illegal ID3v2 tag present.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		if (isset($info['id3v1'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
			$info['warning'][] = 'Illegal ID3v1 tag present.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
		if (isset($info['ape'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
			$info['warning'][] = 'Illegal APE tag present.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		}
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
		// Page 1 - Stream Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
		$this->fseek($info['avdataoffset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
		if ($this->ftell() >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
			$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
    47
			unset($info['fileformat']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
		$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
		if (substr($filedata, 0, 4) == 'fLaC') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
			$info['audio']['dataformat']   = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
			$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
			$info['audio']['lossless']     = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
		} elseif (substr($filedata, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
			$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
		} elseif (substr($filedata, 0, 8) == 'Speex   ') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
			// http://www.speex.org/manual/node10.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
			$info['audio']['dataformat']   = 'speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
			$info['mime_type']             = 'audio/speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
			$info['audio']['lossless']     = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			$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
    75
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']          =                              substr($filedata, $filedataoffset, 20);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
			$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
    79
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
			$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
    81
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
			$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
    83
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
			$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
    85
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
			$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
    87
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
			$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
    89
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
			$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
    91
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
			$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
    93
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
			$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
    95
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
			$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
    97
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
			$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
    99
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
			$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
   101
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
			$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
   103
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
			$info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
			$info['speex']['sample_rate']   = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
			$info['speex']['channels']      = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
			$info['speex']['vbr']           = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
			$info['speex']['band_type']     = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
			$info['audio']['sample_rate']   = $info['speex']['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
			$info['audio']['channels']      = $info['speex']['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			if ($info['speex']['vbr']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
				$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
		} elseif (substr($filedata, 0, 8) == "fishead\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
			// Ogg Skeleton version 3.0 Format Specification
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
			// http://xiph.org/ogg/doc/skeleton.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
			$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
   124
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
			$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
   126
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
			$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
   128
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
			$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
   130
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
			$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
   132
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
			$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
   134
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
			$info['ogg']['skeleton']['fishead']['raw']['utc']                          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
			$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
   139
			$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
   140
			$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
   141
			$info['ogg']['skeleton']['fishead']['utc']              = $info['ogg']['skeleton']['fishead']['raw']['utc'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
			$counter = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
			do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
				$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
				$this->fseek($oggpageinfo['page_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
				if (substr($filedata, 0, 8) == "fisbone\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
					$filedataoffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
					$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
   155
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
					$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
   157
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
					$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
   159
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
					$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
   161
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
					$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
   163
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
					$info['ogg']['skeleton']['fisbone']['raw']['basegranule']             = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
					$info['ogg']['skeleton']['fisbone']['raw']['preroll']                 = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
					$info['ogg']['skeleton']['fisbone']['raw']['granuleshift']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
					$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
					$info['ogg']['skeleton']['fisbone']['raw']['padding']                 =                              substr($filedata, $filedataoffset,  3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
					$filedataoffset += 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
				} elseif (substr($filedata, 1, 6) == 'theora') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
					$info['video']['dataformat'] = 'theora';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
					$info['error'][] = 'Ogg Theora not correctly handled in this version of getID3 ['.$this->getid3->version().']';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
					//break;
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, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
					$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
					$info['error'][] = 'unexpected';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
			//} while ($oggpageinfo['page_seqno'] == 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
			} while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00"));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
			$this->fseek($oggpageinfo['page_start_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
			$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
   193
			//return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
			$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
   198
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
			unset($info['mime_type']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
		// Page 2 - Comment Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
				$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
   212
				$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
   213
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
				$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
				if (!$flac->parseMETAdata()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
					$info['error'][] = 'Failed to parse FLAC headers';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
				unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
			case 'speex':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
				$this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
		// Last Page - Number of Samples
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		if (!getid3_lib::intValueSupported($info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
			$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
   237
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
			$this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
			$LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size()));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
			if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
				$this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO')));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
				$info['avdataend'] = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
				$info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
				$info['ogg']['samples']   = $info['ogg']['pageheader']['eos']['pcm_abs_position'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
				if ($info['ogg']['samples'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
					$info['error'][] = 'Corrupt Ogg file: eos.number of samples == zero';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
				if (!empty($info['audio']['sample_rate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
					$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
   253
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
		if (!empty($info['ogg']['bitrate_average'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
			$info['audio']['bitrate'] = $info['ogg']['bitrate_average'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
		} elseif (!empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
			$info['audio']['bitrate'] = $info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
		} elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
			$info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
		if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
			if ($info['audio']['bitrate'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
				$info['error'][] = 'Corrupt Ogg file: bitrate_audio == zero';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
			$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
		if (isset($info['ogg']['vendor'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
			$info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
			// Vorbis only
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
			if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
				// Vorbis 1.0 starts with Xiph.Org
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
				if  (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
					if ($info['audio']['bitrate_mode'] == 'abr') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
						// Set -b 128 on abr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
						$info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
					} 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
   288
						// Set -q N on vbr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
						$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
   290
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
				if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
					$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
   296
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
	public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
		$info['audio']['dataformat'] = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
		$info['audio']['lossless']   = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
		$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
   309
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
		$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
   311
		$filedataoffset += 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
		$info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
		$info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
		$info['audio']['channels']       = $info['ogg']['numberofchannels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
		$info['ogg']['samplerate']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
		if ($info['ogg']['samplerate'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
			$info['error'][] = 'Corrupt Ogg file: sample rate == zero';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
		$info['audio']['sample_rate']    = $info['ogg']['samplerate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
		$info['ogg']['samples']          = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
		$info['ogg']['bitrate_average']  = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
		$info['ogg']['bitrate_max']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
		$info['ogg']['bitrate_nominal']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
		$info['ogg']['bitrate_min']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
		$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
   333
		$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
   334
		$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
   335
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
		$info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
		if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
			unset($info['ogg']['bitrate_max']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
		if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
			unset($info['ogg']['bitrate_nominal']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
		if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
			unset($info['ogg']['bitrate_min']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
	public function ParseOggPageHeader() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
		// http://xiph.org/ogg/vorbis/doc/framing.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
		$filedata = $this->fread($this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
		while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
			if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
				// should be found before here
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
			if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
				if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
					// get some more data, unless eof, in which case fail
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
		$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
		$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
		$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
		$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
		$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
   377
		$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
   378
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
		$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
		$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
		$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
		$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
		$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
		$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
		$oggheader['page_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
		for ($i = 0; $i < $oggheader['page_segments']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
			$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
			$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
			$oggheader['page_length'] += $oggheader['segment_table'][$i];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
		$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
		$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
		$this->fseek($oggheader['header_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
		return $oggheader;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
    // http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
	public function ParseVorbisComments() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
		$OriginalOffset = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
		$commentdataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
		$VorbisCommentPage = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
			case 'speex':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
				$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
   414
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
				$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
				$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
				if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
					$commentdataoffset += (strlen('vorbis') + 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
				$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
				$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
		$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
		$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
		$commentdataoffset += $VendorSize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
		$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
		$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
		$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
		$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
		for ($i = 0; $i < $CommentsCount; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
			$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
			if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
					$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
					// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
					// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
					$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
					// 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
   462
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
					// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
					$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
					$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$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
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
			$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
			// replace avdataoffset with position just after the last vorbiscomment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
			$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
   477
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
			$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
			while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
				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
   481
					$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
   482
					break 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
				$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
				// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
				$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
				// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
				$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
				// 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
   497
				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
				// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
				$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
				if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
					$info['warning'][] = 'undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
				$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
				if ($readlength <= 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
					$info['warning'][] = 'invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
				$commentdata .= $this->fread($readlength);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
				//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
			if (!$commentstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
				// no comment?
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
				$info['warning'][] = 'Blank Ogg comment ['.$i.']';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
			} elseif (strstr($commentstring, '=')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
				$commentexploded = explode('=', $commentstring, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
				$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
				$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[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
				if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
					// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
					// 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
   536
					// http://flac.sourceforge.net/format.html#metadata_block_picture
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
					$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
					$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
					$flac->parsePICTURE();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
					$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
					unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
				} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
					$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
					$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
   547
					/** @todo use 'coverartmime' where available */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
					$imageinfo = getid3_lib::GetDataImageSize($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
					if ($imageinfo === false || !isset($imageinfo['mime'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
						$this->warning('COVERART vorbiscomment tag contains invalid image');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
						continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
					$ogg = new self($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
					$ogg->setStringMode($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
					$info['ogg']['comments']['picture'][] = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
						'image_mime' => $imageinfo['mime'],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
						'data'       => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
					unset($ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
					$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
   565
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
				$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
   571
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
			unset($ThisFileInfo_ogg_comments_raw[$i]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
		unset($ThisFileInfo_ogg_comments_raw);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
		// Replay Gain Adjustment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
		// http://privatewww.essex.ac.uk/~djmrob/replaygain/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
		if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
			foreach ($info['ogg']['comments'] as $index => $commentvalue) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
				switch ($index) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
					case 'rg_audiophile':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
					case 'replaygain_album_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
						$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
					case 'rg_radio':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
					case 'replaygain_track_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
						$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
					case 'replaygain_album_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
						$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
					case 'rg_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
					case 'replaygain_track_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
						$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
					case 'replaygain_reference_loudness':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
						$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
					default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
						// do nothing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
		$this->fseek($OriginalOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
	public static function SpeexBandModeLookup($mode) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
		static $SpeexBandModeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
		if (empty($SpeexBandModeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
			$SpeexBandModeLookup[0] = 'narrow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
			$SpeexBandModeLookup[1] = 'wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
			$SpeexBandModeLookup[2] = 'ultra-wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
		return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
	}
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
	public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
		for ($i = 0; $i < $SegmentNumber; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
			$segmentlength = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
			foreach ($OggInfoArray['segment_table'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
				$segmentlength += $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
				if ($value < 255) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
		return $segmentlength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
	public static function get_quality_from_nominal_bitrate($nominal_bitrate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
		// decrease precision
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
		$nominal_bitrate = $nominal_bitrate / 1000;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
		if ($nominal_bitrate < 128) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
			// q-1 to q4
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
			$qval = ($nominal_bitrate - 64) / 16;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
		} elseif ($nominal_bitrate < 256) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
			// q4 to q8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
			$qval = $nominal_bitrate / 32;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
		} elseif ($nominal_bitrate < 320) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
			// q8 to q9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
			$qval = ($nominal_bitrate + 256) / 64;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
			// q9 to q10
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
			$qval = ($nominal_bitrate + 1300) / 180;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
		//return $qval; // 5.031324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
		//return intval($qval); // 5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
		return round($qval, 1); // 5 or 4.9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
}