wp/wp-includes/ID3/module.audio.ogg.php
author ymh <ymh.work@gmail.com>
Mon, 14 Oct 2019 17:39:30 +0200
changeset 7 cf61fcea0001
parent 5 5e2f62d02dcd
child 16 a86126ab1dd4
permissions -rw-r--r--
resynchronize code repo with production
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'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    29
			$this->warning('Illegal ID3v2 tag present.');
0
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'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    32
			$this->warning('Illegal ID3v1 tag present.');
0
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'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    35
			$this->warning('Illegal APE tag present.');
0
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()) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    47
			$this->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?)');
0
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
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    66
		} elseif (substr($filedata, 0, 8) == 'OpusHead') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    67
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    68
			if( $this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) == false ) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    69
				return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    70
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    71
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
		} elseif (substr($filedata, 0, 8) == 'Speex   ') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			// http://www.speex.org/manual/node10.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
			$info['audio']['dataformat']   = 'speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
			$info['mime_type']             = 'audio/speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
			$info['audio']['lossless']     = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
			$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
    82
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']          =                              substr($filedata, $filedataoffset, 20);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
			$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
    86
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
			$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
    88
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
			$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
    90
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
			$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
    92
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
			$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
    94
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
			$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
    96
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
			$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
    98
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
			$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
   100
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
			$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
   102
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
			$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
   104
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
			$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
   106
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
			$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
   108
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
			$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
   110
			$filedataoffset += 4;
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['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			$info['speex']['sample_rate']   = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
			$info['speex']['channels']      = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
			$info['speex']['vbr']           = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
			$info['speex']['band_type']     = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
			$info['audio']['sample_rate']   = $info['speex']['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
			$info['audio']['channels']      = $info['speex']['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
			if ($info['speex']['vbr']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
				$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   124
		} elseif (substr($filedata, 0, 7) == "\x80".'theora') {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   125
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   126
			// http://www.theora.org/doc/Theora.pdf (section 6.2)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   127
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   128
			$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
   129
			$filedataoffset += 7;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   130
			$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
   131
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   132
			$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
   133
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   134
			$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
   135
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   136
			$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
   137
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   138
			$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
   139
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   140
			$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
   141
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   142
			$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
   143
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   144
			$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
   145
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   146
			$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
   147
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   148
			$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
   149
			$filedataoffset += 4;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   150
			$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
   151
			$filedataoffset += 4;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   152
			$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
   153
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   154
			$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
   155
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   156
			$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
   157
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   158
			$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
   159
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   160
			$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
   161
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   162
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   163
			$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
   164
			$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
   165
			$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
   166
			$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
   167
			$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
   168
			$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
   169
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   170
			$info['video']['dataformat']   = 'theora';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   171
			$info['mime_type']             = 'video/ogg';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   172
			//$info['audio']['bitrate_mode'] = 'abr';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   173
			//$info['audio']['lossless']     = false;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   174
			$info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   175
			$info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   176
			if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   177
				$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
   178
			}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   179
			if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   180
				$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
   181
			}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   182
$this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable');
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   183
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
		} elseif (substr($filedata, 0, 8) == "fishead\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
			// Ogg Skeleton version 3.0 Format Specification
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
			// http://xiph.org/ogg/doc/skeleton.html
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']['version_major']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
			$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
   193
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
			$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
   195
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
			$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
   197
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
			$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
   199
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
			$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
   201
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
			$info['ogg']['skeleton']['fishead']['raw']['utc']                          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
			$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
   206
			$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
   207
			$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
   208
			$info['ogg']['skeleton']['fishead']['utc']              = $info['ogg']['skeleton']['fishead']['raw']['utc'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
			$counter = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
			do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
				$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
				$this->fseek($oggpageinfo['page_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
				if (substr($filedata, 0, 8) == "fisbone\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
					$filedataoffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
					$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
   222
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
					$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
   224
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
					$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
   226
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
					$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
   228
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
					$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
   230
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
					$info['ogg']['skeleton']['fisbone']['raw']['basegranule']             = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
					$info['ogg']['skeleton']['fisbone']['raw']['preroll']                 = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
					$info['ogg']['skeleton']['fisbone']['raw']['granuleshift']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
					$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
					$info['ogg']['skeleton']['fisbone']['raw']['padding']                 =                              substr($filedata, $filedataoffset,  3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
					$filedataoffset += 3;
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) == 'theora') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   242
					$info['video']['dataformat'] = 'theora1';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   243
					$this->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
   244
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
				} elseif (substr($filedata, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
					$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
				} else {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   251
					$this->error('unexpected');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
			//} while ($oggpageinfo['page_seqno'] == 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
			} while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00"));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
			$this->fseek($oggpageinfo['page_start_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   259
			$this->error('Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
			//return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   264
			$this->error('Expecting either "Speex   ", "OpusHead" or "vorbis" identifier strings, found "'.substr($filedata, 0, 8).'"');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
			unset($info['mime_type']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
		// Page 2 - Comment Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
				$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
   279
				$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
   280
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
				$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
				if (!$flac->parseMETAdata()) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   287
					$this->error('Failed to parse FLAC headers');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
				unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
			case 'speex':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
				$this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
				break;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   297
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   298
			case 'opus':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   299
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   300
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags'
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   301
				if(substr($filedata, 0, 8)  != 'OpusTags') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   302
					$this->error('Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   303
					return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   304
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   305
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   306
				$this->ParseVorbisComments();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   307
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   308
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
		// Last Page - Number of Samples
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
		if (!getid3_lib::intValueSupported($info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   314
			$this->warning('Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
			$this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
			$LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size()));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
			if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
				$this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO')));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
				$info['avdataend'] = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
				$info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
				$info['ogg']['samples']   = $info['ogg']['pageheader']['eos']['pcm_abs_position'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
				if ($info['ogg']['samples'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   326
					$this->error('Corrupt Ogg file: eos.number of samples == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
				if (!empty($info['audio']['sample_rate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
					$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
   331
				}
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
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
		if (!empty($info['ogg']['bitrate_average'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
			$info['audio']['bitrate'] = $info['ogg']['bitrate_average'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
		} elseif (!empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
			$info['audio']['bitrate'] = $info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
		} elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
			$info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2;
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 (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
			if ($info['audio']['bitrate'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   345
				$this->error('Corrupt Ogg file: bitrate_audio == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
			$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']);
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
		if (isset($info['ogg']['vendor'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
			$info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
			// Vorbis only
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
			if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
				// Vorbis 1.0 starts with Xiph.Org
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
				if  (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
					if ($info['audio']['bitrate_mode'] == 'abr') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
						// Set -b 128 on abr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
						$info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
					} 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
   366
						// Set -q N on vbr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
						$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
   368
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
				if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
					$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
   374
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
	public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
		$info['audio']['dataformat'] = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
		$info['audio']['lossless']   = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
		$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
   387
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
		$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
   389
		$filedataoffset += 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
		$info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
		$info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
		$info['audio']['channels']       = $info['ogg']['numberofchannels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
		$info['ogg']['samplerate']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
		if ($info['ogg']['samplerate'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   398
			$this->error('Corrupt Ogg file: sample rate == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
		$info['audio']['sample_rate']    = $info['ogg']['samplerate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
		$info['ogg']['samples']          = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
		$info['ogg']['bitrate_average']  = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
		$info['ogg']['bitrate_max']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
		$info['ogg']['bitrate_nominal']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
		$info['ogg']['bitrate_min']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
		$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
   411
		$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
   412
		$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
   413
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
		$info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
		if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
			unset($info['ogg']['bitrate_max']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
		if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
			unset($info['ogg']['bitrate_nominal']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
		if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
			unset($info['ogg']['bitrate_min']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   429
	// http://tools.ietf.org/html/draft-ietf-codec-oggopus-03
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   430
	public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   431
		$info = &$this->getid3->info;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   432
		$info['audio']['dataformat']   = 'opus';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   433
		$info['mime_type']             = 'audio/ogg; codecs=opus';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   434
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   435
		/** @todo find a usable way to detect abr (vbr that is padded to be abr) */
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   436
		$info['audio']['bitrate_mode'] = 'vbr';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   437
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   438
		$info['audio']['lossless']     = false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   439
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   440
		$info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead'
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   441
		$filedataoffset += 8;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   442
		$info['ogg']['pageheader']['opus']['version']    = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   443
		$filedataoffset += 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   444
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   445
		if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   446
			$this->error('Unknown opus version number (only accepting 1-15)');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   447
			return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   448
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   449
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   450
		$info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   451
		$filedataoffset += 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   452
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   453
		if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   454
			$this->error('Invalid channel count in opus header (must not be zero)');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   455
			return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   456
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   457
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   458
		$info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   459
		$filedataoffset += 2;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   460
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   461
		$info['ogg']['pageheader']['opus']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   462
		$filedataoffset += 4;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   463
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   464
		//$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   465
		//$filedataoffset += 2;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   466
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   467
		//$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   468
		//$filedataoffset += 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   469
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   470
		$info['opus']['opus_version']      = $info['ogg']['pageheader']['opus']['version'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   471
		$info['opus']['sample_rate']       = $info['ogg']['pageheader']['opus']['sample_rate'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   472
		$info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   473
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   474
		$info['audio']['channels']      = $info['opus']['out_channel_count'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   475
		$info['audio']['sample_rate']   = $info['opus']['sample_rate'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   476
		return true;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   477
	}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   478
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   479
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
	public function ParseOggPageHeader() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
		// http://xiph.org/ogg/vorbis/doc/framing.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
		$filedata = $this->fread($this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
		while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
			if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
				// should be found before here
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
			if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
				if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === false)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
					// get some more data, unless eof, in which case fail
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
		$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
		$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
		$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
		$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
		$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
   506
		$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
   507
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
		$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
		$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
		$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
		$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
		$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
		$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
		$oggheader['page_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
		for ($i = 0; $i < $oggheader['page_segments']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
			$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
			$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
			$oggheader['page_length'] += $oggheader['segment_table'][$i];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
		$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
		$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
		$this->fseek($oggheader['header_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
		return $oggheader;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
    // http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
	public function ParseVorbisComments() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
		$OriginalOffset = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
		$commentdataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
		$VorbisCommentPage = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
			case 'speex':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   542
			case 'opus':
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
				$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
   544
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
				$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
				$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
				if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
					$commentdataoffset += (strlen('vorbis') + 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
				}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   551
				else if ($info['audio']['dataformat'] == 'opus') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   552
					$commentdataoffset += strlen('OpusTags');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   553
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   554
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
				$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
				$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
				return false;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   565
				break;
0
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
		$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
		$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
		$commentdataoffset += $VendorSize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
		$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
		$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
		$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
		$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
		for ($i = 0; $i < $CommentsCount; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   582
			if ($i >= 10000) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   583
				// https://github.com/owncloud/music/issues/212#issuecomment-43082336
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   584
				$this->warning('Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   585
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   586
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   587
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
			$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
			if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
					$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
					// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
					// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
					$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
					// 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
   603
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
					// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
					$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
					$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
			$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
			// replace avdataoffset with position just after the last vorbiscomment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
			$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
   618
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
			$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
			while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
				if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   622
					$this->warning('Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
					break 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
				$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
				// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
				$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
				// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
				$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
				// 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
   638
				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
				// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
				$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
				if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   646
					$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
				$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
				if ($readlength <= 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   651
					$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
				$commentdata .= $this->fread($readlength);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
				//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
			if (!$commentstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
				// no comment?
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   665
				$this->warning('Blank Ogg comment ['.$i.']');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
			} elseif (strstr($commentstring, '=')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
				$commentexploded = explode('=', $commentstring, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
				$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
				$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
				if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
					// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
					// 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
   677
					// http://flac.sourceforge.net/format.html#metadata_block_picture
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
					$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
					$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
					$flac->parsePICTURE();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
					$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
					unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
				} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
					$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
					$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
   688
					/** @todo use 'coverartmime' where available */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
					$imageinfo = getid3_lib::GetDataImageSize($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
					if ($imageinfo === false || !isset($imageinfo['mime'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
						$this->warning('COVERART vorbiscomment tag contains invalid image');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
						continue;
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
					$ogg = new self($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
					$ogg->setStringMode($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
					$info['ogg']['comments']['picture'][] = array(
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   698
						'image_mime'   => $imageinfo['mime'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   699
						'datalength'   => strlen($data),
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   700
						'picturetype'  => 'cover art',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   701
						'image_height' => $imageinfo['height'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   702
						'image_width'  => $imageinfo['width'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   703
						'data'         => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
					unset($ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
					$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
   710
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   715
				$this->warning('[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
			unset($ThisFileInfo_ogg_comments_raw[$i]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
		unset($ThisFileInfo_ogg_comments_raw);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
		// Replay Gain Adjustment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
		// http://privatewww.essex.ac.uk/~djmrob/replaygain/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
		if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
			foreach ($info['ogg']['comments'] as $index => $commentvalue) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
				switch ($index) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
					case 'rg_audiophile':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
					case 'replaygain_album_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
						$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
					case 'rg_radio':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
					case 'replaygain_track_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
						$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
					case 'replaygain_album_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
						$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
					case 'rg_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
					case 'replaygain_track_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
						$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
					case 'replaygain_reference_loudness':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
						$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
					default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
						// do nothing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
		$this->fseek($OriginalOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
	public static function SpeexBandModeLookup($mode) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
		static $SpeexBandModeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
		if (empty($SpeexBandModeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
			$SpeexBandModeLookup[0] = 'narrow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
			$SpeexBandModeLookup[1] = 'wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
			$SpeexBandModeLookup[2] = 'ultra-wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
		return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
	public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
		for ($i = 0; $i < $SegmentNumber; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
			$segmentlength = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
			foreach ($OggInfoArray['segment_table'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
				$segmentlength += $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
				if ($value < 255) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
		return $segmentlength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
	public static function get_quality_from_nominal_bitrate($nominal_bitrate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
		// decrease precision
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
		$nominal_bitrate = $nominal_bitrate / 1000;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
		if ($nominal_bitrate < 128) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
			// q-1 to q4
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
			$qval = ($nominal_bitrate - 64) / 16;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
		} elseif ($nominal_bitrate < 256) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
			// q4 to q8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
			$qval = $nominal_bitrate / 32;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
		} elseif ($nominal_bitrate < 320) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
			// q8 to q9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
			$qval = ($nominal_bitrate + 256) / 64;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
			// q9 to q10
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
			$qval = ($nominal_bitrate + 1300) / 180;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
		//return $qval; // 5.031324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
		//return intval($qval); // 5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
		return round($qval, 1); // 5 or 4.9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   816
	public static function TheoraColorSpace($colorspace_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   817
		// http://www.theora.org/doc/Theora.pdf (table 6.3)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   818
		static $TheoraColorSpaceLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   819
		if (empty($TheoraColorSpaceLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   820
			$TheoraColorSpaceLookup[0] = 'Undefined';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   821
			$TheoraColorSpaceLookup[1] = 'Rec. 470M';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   822
			$TheoraColorSpaceLookup[2] = 'Rec. 470BG';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   823
			$TheoraColorSpaceLookup[3] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   824
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   825
		return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   826
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   827
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   828
	public static function TheoraPixelFormat($pixelformat_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   829
		// http://www.theora.org/doc/Theora.pdf (table 6.4)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   830
		static $TheoraPixelFormatLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   831
		if (empty($TheoraPixelFormatLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   832
			$TheoraPixelFormatLookup[0] = '4:2:0';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   833
			$TheoraPixelFormatLookup[1] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   834
			$TheoraPixelFormatLookup[2] = '4:2:2';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   835
			$TheoraPixelFormatLookup[3] = '4:4:4';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   836
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   837
		return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   838
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   839
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   840
}