wp/wp-includes/ID3/module.audio.ogg.php
author ymh <ymh.work@gmail.com>
Tue, 15 Dec 2020 13:49:49 +0100
changeset 16 a86126ab1dd4
parent 7 cf61fcea0001
child 19 3d72ae0968f4
permissions -rw-r--r--
update enmi-conf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
     2
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
/// getID3() by James Heinrich <info@getid3.org>               //
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
     5
//  available at https://github.com/JamesHeinrich/getID3       //
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
     6
//            or https://www.getid3.org                        //
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
     7
//            or http://getid3.sourceforge.net                 //
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
     8
//  see readme.txt for more details                            //
0
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
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    17
if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    18
	exit;
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    19
}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
class getid3_ogg extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
{
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    24
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    25
	 * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    26
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    27
	 * @return bool
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    28
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
	public function Analyze() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		$info['fileformat'] = 'ogg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
		// Warn about illegal tags - only vorbiscomments are allowed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		if (isset($info['id3v2'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    36
			$this->warning('Illegal ID3v2 tag present.');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
		if (isset($info['id3v1'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    39
			$this->warning('Illegal ID3v1 tag present.');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
		if (isset($info['ape'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    42
			$this->warning('Illegal APE tag present.');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
		// Page 1 - Stream Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
		$this->fseek($info['avdataoffset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
		if ($this->ftell() >= $this->getid3->fread_buffer_size()) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    54
			$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
    55
			unset($info['fileformat']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
		$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
		if (substr($filedata, 0, 4) == 'fLaC') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
			$info['audio']['dataformat']   = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
			$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
			$info['audio']['lossless']     = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
		} elseif (substr($filedata, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
			$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    73
		} elseif (substr($filedata, 0, 8) == 'OpusHead') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    74
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
    75
			if ($this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) === false) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    76
				return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    77
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    78
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
		} elseif (substr($filedata, 0, 8) == 'Speex   ') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
			// http://www.speex.org/manual/node10.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
			$info['audio']['dataformat']   = 'speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
			$info['mime_type']             = 'audio/speex';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
			$info['audio']['lossless']     = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
			$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
    89
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']          =                              substr($filedata, $filedataoffset, 20);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
			$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
    93
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
			$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
    95
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
			$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
    97
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
			$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
    99
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
			$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
   101
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
			$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
   103
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
			$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
   105
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
			$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
   107
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
			$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
   109
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
			$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
   111
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
			$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
   113
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
			$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
   115
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
			$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
   117
			$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
			$info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
			$info['speex']['sample_rate']   = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
			$info['speex']['channels']      = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			$info['speex']['vbr']           = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
			$info['speex']['band_type']     = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
			$info['audio']['sample_rate']   = $info['speex']['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
			$info['audio']['channels']      = $info['speex']['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
			if ($info['speex']['vbr']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
				$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   131
		} elseif (substr($filedata, 0, 7) == "\x80".'theora') {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   132
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   133
			// http://www.theora.org/doc/Theora.pdf (section 6.2)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   134
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   135
			$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
   136
			$filedataoffset += 7;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   137
			$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
   138
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   139
			$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
   140
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   141
			$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
   142
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   143
			$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
   144
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   145
			$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
   146
			$filedataoffset += 2;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   147
			$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
   148
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   149
			$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
   150
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   151
			$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
   152
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   153
			$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
   154
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   155
			$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
   156
			$filedataoffset += 4;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   157
			$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
   158
			$filedataoffset += 4;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   159
			$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
   160
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   161
			$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
   162
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   163
			$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
   164
			$filedataoffset += 1;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   165
			$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
   166
			$filedataoffset += 3;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   167
			$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
   168
			$filedataoffset += 2;
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['ogg']['pageheader']['theora']['quality']         = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   171
			$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
   172
			$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
   173
			$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
   174
			$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
   175
			$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
   176
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   177
			$info['video']['dataformat']   = 'theora';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   178
			$info['mime_type']             = 'video/ogg';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   179
			//$info['audio']['bitrate_mode'] = 'abr';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   180
			//$info['audio']['lossless']     = false;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   181
			$info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   182
			$info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   183
			if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   184
				$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
   185
			}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   186
			if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   187
				$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
   188
			}
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   189
			$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
   190
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
		} elseif (substr($filedata, 0, 8) == "fishead\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
			// Ogg Skeleton version 3.0 Format Specification
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
			// http://xiph.org/ogg/doc/skeleton.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
			$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
   198
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
			$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
   200
			$filedataoffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
			$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
   202
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
			$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
   204
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
			$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
   206
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
			$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
   208
			$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
			$info['ogg']['skeleton']['fishead']['raw']['utc']                          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
			$filedataoffset += 20;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
			$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
   213
			$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
   214
			$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
   215
			$info['ogg']['skeleton']['fishead']['utc']              = $info['ogg']['skeleton']['fishead']['raw']['utc'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
			$counter = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
			do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
				$filedata = $this->fread($oggpageinfo['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
				$this->fseek($oggpageinfo['page_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
				if (substr($filedata, 0, 8) == "fisbone\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
					$filedataoffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
					$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
   229
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
					$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
   231
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
					$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
   233
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
					$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
   235
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
					$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
   237
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
					$info['ogg']['skeleton']['fisbone']['raw']['basegranule']             = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
					$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
					$info['ogg']['skeleton']['fisbone']['raw']['preroll']                 = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
					$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
					$info['ogg']['skeleton']['fisbone']['raw']['granuleshift']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
					$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
					$info['ogg']['skeleton']['fisbone']['raw']['padding']                 =                              substr($filedata, $filedataoffset,  3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
					$filedataoffset += 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
				} elseif (substr($filedata, 1, 6) == 'theora') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   249
					$info['video']['dataformat'] = 'theora1';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   250
					$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
   251
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
				} elseif (substr($filedata, 1, 6) == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
					$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
				} else {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   258
					$this->error('unexpected');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
					//break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
			//} while ($oggpageinfo['page_seqno'] == 0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
			} while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00"));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
			$this->fseek($oggpageinfo['page_start_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   266
			$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
   267
			//return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   269
		} elseif (substr($filedata, 0, 5) == "\x7F".'FLAC') {
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   270
			// https://xiph.org/flac/ogg_mapping.html
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   271
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   272
			$info['audio']['dataformat']   = 'flac';
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   273
			$info['audio']['bitrate_mode'] = 'vbr';
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   274
			$info['audio']['lossless']     = true;
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   275
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   276
			$info['ogg']['flac']['header']['version_major']  =                         ord(substr($filedata,  5, 1));
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   277
			$info['ogg']['flac']['header']['version_minor']  =                         ord(substr($filedata,  6, 1));
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   278
			$info['ogg']['flac']['header']['header_packets'] =   getid3_lib::BigEndian2Int(substr($filedata,  7, 2)) + 1; // "A two-byte, big-endian binary number signifying the number of header (non-audio) packets, not including this one. This number may be zero (0x0000) to signify 'unknown' but be aware that some decoders may not be able to handle such streams."
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   279
			$info['ogg']['flac']['header']['magic']          =                             substr($filedata,  9, 4);
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   280
			if ($info['ogg']['flac']['header']['magic'] != 'fLaC') {
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   281
				$this->error('Ogg-FLAC expecting "fLaC", found "'.$info['ogg']['flac']['header']['magic'].'" ('.trim(getid3_lib::PrintHexBytes($info['ogg']['flac']['header']['magic'])).')');
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   282
				return false;
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   283
			}
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   284
			$info['ogg']['flac']['header']['STREAMINFO_bytes'] = getid3_lib::BigEndian2Int(substr($filedata, 13, 4));
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   285
			$info['flac']['STREAMINFO'] = getid3_flac::parseSTREAMINFOdata(substr($filedata, 17, 34));
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   286
			if (!empty($info['flac']['STREAMINFO']['sample_rate'])) {
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   287
				$info['audio']['bitrate_mode']    = 'vbr';
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   288
				$info['audio']['sample_rate']     = $info['flac']['STREAMINFO']['sample_rate'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   289
				$info['audio']['channels']        = $info['flac']['STREAMINFO']['channels'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   290
				$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   291
				$info['playtime_seconds']         = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   292
			}
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   293
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   296
			$this->error('Expecting one of "vorbis", "Speex", "OpusHead", "vorbis", "fishhead", "theora", "fLaC" identifier strings, found "'.substr($filedata, 0, 8).'"');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
			unset($info['mime_type']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
		// Page 2 - Comment Header
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
		$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
		$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
				$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
				$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
   311
				$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
   312
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
				$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
				if (!$flac->parseMETAdata()) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   319
					$this->error('Failed to parse FLAC headers');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
				unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
			case 'speex':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
				$this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
				$this->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
				break;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   329
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   330
			case 'opus':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   331
				$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
   332
				$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
   333
				if(substr($filedata, 0, 8)  != 'OpusTags') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   334
					$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
   335
					return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   336
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   337
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   338
				$this->ParseVorbisComments();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   339
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   340
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
		// Last Page - Number of Samples
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
		if (!getid3_lib::intValueSupported($info['avdataend'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   346
			$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
   347
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
			$this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
			$LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size()));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
			if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
				$this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO')));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
				$info['avdataend'] = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
				$info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
				$info['ogg']['samples']   = $info['ogg']['pageheader']['eos']['pcm_abs_position'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
				if ($info['ogg']['samples'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   358
					$this->error('Corrupt Ogg file: eos.number of samples == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
				if (!empty($info['audio']['sample_rate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
					$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
   363
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
		if (!empty($info['ogg']['bitrate_average'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
			$info['audio']['bitrate'] = $info['ogg']['bitrate_average'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
		} elseif (!empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
			$info['audio']['bitrate'] = $info['ogg']['bitrate_nominal'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
		} elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
			$info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
		if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
			if ($info['audio']['bitrate'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   377
				$this->error('Corrupt Ogg file: bitrate_audio == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
			$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
		if (isset($info['ogg']['vendor'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
			$info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
			// Vorbis only
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
			if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
				// Vorbis 1.0 starts with Xiph.Org
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
				if  (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
					if ($info['audio']['bitrate_mode'] == 'abr') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
						// Set -b 128 on abr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
						$info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
					} 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
   398
						// Set -q N on vbr files
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
						$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
   400
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
				if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
					$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
   406
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   413
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   414
	 * @param string $filedata
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   415
	 * @param int    $filedataoffset
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   416
	 * @param array  $oggpageinfo
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   417
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   418
	 * @return bool
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   419
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
	public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
		$info['audio']['dataformat'] = 'vorbis';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
		$info['audio']['lossless']   = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
		$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
   426
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
		$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
   428
		$filedataoffset += 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
		$info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
		$info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
		$info['audio']['channels']       = $info['ogg']['numberofchannels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
		$info['ogg']['samplerate']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
		if ($info['ogg']['samplerate'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   437
			$this->error('Corrupt Ogg file: sample rate == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
		$info['audio']['sample_rate']    = $info['ogg']['samplerate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
		$info['ogg']['samples']          = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
		$info['ogg']['bitrate_average']  = 0; // filled in later
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
		$info['ogg']['bitrate_max']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
		$info['ogg']['bitrate_nominal']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
		$info['ogg']['bitrate_min']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
		$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
   450
		$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
   451
		$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
   452
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
		$info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
		if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
			unset($info['ogg']['bitrate_max']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
		if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
			unset($info['ogg']['bitrate_nominal']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
		if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
			unset($info['ogg']['bitrate_min']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
			$info['audio']['bitrate_mode'] = 'abr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   468
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   469
	 * @link http://tools.ietf.org/html/draft-ietf-codec-oggopus-03
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   470
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   471
	 * @param string $filedata
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   472
	 * @param int    $filedataoffset
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   473
	 * @param array  $oggpageinfo
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   474
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   475
	 * @return bool
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   476
	 */
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   477
	public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   478
		$info = &$this->getid3->info;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   479
		$info['audio']['dataformat']   = 'opus';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   480
		$info['mime_type']             = 'audio/ogg; codecs=opus';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   481
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   482
		/** @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
   483
		$info['audio']['bitrate_mode'] = 'vbr';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   484
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   485
		$info['audio']['lossless']     = false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   486
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   487
		$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
   488
		$filedataoffset += 8;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   489
		$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
   490
		$filedataoffset += 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   491
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   492
		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
   493
			$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
   494
			return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   495
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   496
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   497
		$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
   498
		$filedataoffset += 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   499
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   500
		if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   501
			$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
   502
			return false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   503
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   504
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   505
		$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
   506
		$filedataoffset += 2;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   507
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   508
		$info['ogg']['pageheader']['opus']['input_sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   509
		$filedataoffset += 4;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   510
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   511
		//$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
   512
		//$filedataoffset += 2;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   513
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   514
		//$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
   515
		//$filedataoffset += 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   516
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   517
		$info['opus']['opus_version']       = $info['ogg']['pageheader']['opus']['version'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   518
		$info['opus']['sample_rate_input']  = $info['ogg']['pageheader']['opus']['input_sample_rate'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   519
		$info['opus']['out_channel_count']  = $info['ogg']['pageheader']['opus']['out_channel_count'];
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   520
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   521
		$info['audio']['channels']          = $info['opus']['out_channel_count'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   522
		$info['audio']['sample_rate_input'] = $info['opus']['sample_rate_input'];
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   523
		$info['audio']['sample_rate']       = 48000; // "All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz for playback (unless the target hardware does not support this sampling rate). However, this field may be used to resample the audio back to the original sampling rate, for example, when saving the output to a file." -- https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/structOpusHead.html
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   524
		return true;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   525
	}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   526
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   527
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   528
	 * @return array|false
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   529
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
	public function ParseOggPageHeader() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
		// http://xiph.org/ogg/vorbis/doc/framing.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
		$filedata = $this->fread($this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
		$filedataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
		while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
			if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
				// should be found before here
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
			if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) {
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   542
				if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
					// get some more data, unless eof, in which case fail
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
		$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
		$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
		$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
		$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
		$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
   556
		$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
   557
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
		$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
		$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
		$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
		$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
		$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
		$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
		$oggheader['page_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
		for ($i = 0; $i < $oggheader['page_segments']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
			$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
			$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
			$oggheader['page_length'] += $oggheader['segment_table'][$i];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
		$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
		$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
		$this->fseek($oggheader['header_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
		return $oggheader;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   581
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   582
	 * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   583
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   584
	 * @return bool
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   585
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
	public function ParseVorbisComments() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
		$OriginalOffset = $this->ftell();
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   590
		$commentdata = null;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
		$commentdataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
		$VorbisCommentPage = 1;
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   593
		$CommentStartOffset = 0;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
			case 'speex':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   598
			case 'opus':
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
				$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
   600
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
				$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
				$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
				if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
					$commentdataoffset += (strlen('vorbis') + 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
				}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   607
				else if ($info['audio']['dataformat'] == 'opus') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   608
					$commentdataoffset += strlen('OpusTags');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   609
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   610
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
				$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
				$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
		$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
		$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
		$commentdataoffset += $VendorSize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
		$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
		$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
		$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
		$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
		for ($i = 0; $i < $CommentsCount; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   637
			if ($i >= 10000) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   638
				// https://github.com/owncloud/music/issues/212#issuecomment-43082336
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   639
				$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
   640
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   641
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   642
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
			$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
			if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
					$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
					// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
					// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
					$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
					// 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
   658
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
					// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
					$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
					$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
			$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
			// replace avdataoffset with position just after the last vorbiscomment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
			$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
   673
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
			$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
			while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
				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
   677
					$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
   678
					break 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
				$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
				$oggpageinfo = $this->ParseOggPageHeader();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
				// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
				$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
				// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
				$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
				// 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
   693
				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
				// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
				$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
				if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   701
					$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
				$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
				if ($readlength <= 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   706
					$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
				$commentdata .= $this->fread($readlength);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
				//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
			if (!$commentstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
				// no comment?
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   720
				$this->warning('Blank Ogg comment ['.$i.']');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
			} elseif (strstr($commentstring, '=')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
				$commentexploded = explode('=', $commentstring, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
				$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
				$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
				if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
					// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
					// 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
   732
					// http://flac.sourceforge.net/format.html#metadata_block_picture
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
					$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
					$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
					$flac->parsePICTURE();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
					$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
					unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
				} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
					$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
					$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
   743
					/** @todo use 'coverartmime' where available */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
					$imageinfo = getid3_lib::GetDataImageSize($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
					if ($imageinfo === false || !isset($imageinfo['mime'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
						$this->warning('COVERART vorbiscomment tag contains invalid image');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
						continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
					$ogg = new self($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
					$ogg->setStringMode($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
					$info['ogg']['comments']['picture'][] = array(
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   753
						'image_mime'   => $imageinfo['mime'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   754
						'datalength'   => strlen($data),
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   755
						'picturetype'  => 'cover art',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   756
						'image_height' => $imageinfo['height'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   757
						'image_width'  => $imageinfo['width'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   758
						'data'         => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
					unset($ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
					$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
   765
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
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   770
				$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
   771
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
			unset($ThisFileInfo_ogg_comments_raw[$i]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
		unset($ThisFileInfo_ogg_comments_raw);
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
		// Replay Gain Adjustment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
		// http://privatewww.essex.ac.uk/~djmrob/replaygain/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
		if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
			foreach ($info['ogg']['comments'] as $index => $commentvalue) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
				switch ($index) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
					case 'rg_audiophile':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
					case 'replaygain_album_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
						$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
					case 'rg_radio':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
					case 'replaygain_track_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
						$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
					case 'replaygain_album_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
						$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
					case 'rg_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
					case 'replaygain_track_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
						$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
					case 'replaygain_reference_loudness':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
						$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
					default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
						// do nothing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
		$this->fseek($OriginalOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   823
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   824
	 * @param int $mode
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   825
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   826
	 * @return string|null
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   827
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
	public static function SpeexBandModeLookup($mode) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
		static $SpeexBandModeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
		if (empty($SpeexBandModeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
			$SpeexBandModeLookup[0] = 'narrow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
			$SpeexBandModeLookup[1] = 'wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
			$SpeexBandModeLookup[2] = 'ultra-wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
		return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   838
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   839
	 * @param array $OggInfoArray
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   840
	 * @param int   $SegmentNumber
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   841
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   842
	 * @return int
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   843
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
	public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   845
		$segmentlength = 0;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
		for ($i = 0; $i < $SegmentNumber; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
			$segmentlength = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
			foreach ($OggInfoArray['segment_table'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
				$segmentlength += $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
				if ($value < 255) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
		return $segmentlength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   858
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   859
	 * @param int $nominal_bitrate
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   860
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   861
	 * @return float
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   862
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
	public static function get_quality_from_nominal_bitrate($nominal_bitrate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
		// decrease precision
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
		$nominal_bitrate = $nominal_bitrate / 1000;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
		if ($nominal_bitrate < 128) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
			// q-1 to q4
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
			$qval = ($nominal_bitrate - 64) / 16;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
		} elseif ($nominal_bitrate < 256) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
			// q4 to q8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
			$qval = $nominal_bitrate / 32;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
		} elseif ($nominal_bitrate < 320) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
			// q8 to q9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
			$qval = ($nominal_bitrate + 256) / 64;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
			// q9 to q10
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
			$qval = ($nominal_bitrate + 1300) / 180;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
		//return $qval; // 5.031324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
		//return intval($qval); // 5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
		return round($qval, 1); // 5 or 4.9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   886
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   887
	 * @param int $colorspace_id
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   888
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   889
	 * @return string|null
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   890
	 */
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   891
	public static function TheoraColorSpace($colorspace_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   892
		// http://www.theora.org/doc/Theora.pdf (table 6.3)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   893
		static $TheoraColorSpaceLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   894
		if (empty($TheoraColorSpaceLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   895
			$TheoraColorSpaceLookup[0] = 'Undefined';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   896
			$TheoraColorSpaceLookup[1] = 'Rec. 470M';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   897
			$TheoraColorSpaceLookup[2] = 'Rec. 470BG';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   898
			$TheoraColorSpaceLookup[3] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   899
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   900
		return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   901
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   902
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   903
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   904
	 * @param int $pixelformat_id
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   905
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   906
	 * @return string|null
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   907
	 */
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   908
	public static function TheoraPixelFormat($pixelformat_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   909
		// http://www.theora.org/doc/Theora.pdf (table 6.4)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   910
		static $TheoraPixelFormatLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   911
		if (empty($TheoraPixelFormatLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   912
			$TheoraPixelFormatLookup[0] = '4:2:0';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   913
			$TheoraPixelFormatLookup[1] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   914
			$TheoraPixelFormatLookup[2] = '4:2:2';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   915
			$TheoraPixelFormatLookup[3] = '4:4:4';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   916
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   917
		return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   918
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   919
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   920
}