wp/wp-includes/ID3/module.audio.ogg.php
author ymh <ymh.work@gmail.com>
Mon, 08 Sep 2025 19:44:41 +0200
changeset 23 417f20492bf7
parent 21 48c4eec2b7e6
permissions -rw-r--r--
Update Docker configuration and plugin versions - Upgrade MariaDB from 10.6 to 11 with auto-upgrade support - Add WordPress debug environment variable to FPM container - Update PHP-FPM Dockerfile base image - Update Include Mastodon Feed plugin with bug fixes and improvements - Update Portfolio plugin (v2.58) with latest translations and demo data enhancements - Remove old README.md from Mastodon Feed plugin 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
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
			}
21
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
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'];
21
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
   213
			$info['ogg']['skeleton']['fishead']['presentationtime'] = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'], $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']);
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
   214
			$info['ogg']['skeleton']['fishead']['basetime']         = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'],         $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']);
0
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'];
21
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
   291
				$info['playtime_seconds']         = getid3_lib::SafeDiv($info['flac']['STREAMINFO']['samples_stream'], $info['flac']['STREAMINFO']['sample_rate']);
16
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'])) {
21
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
   362
					$info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) * $info['audio']['sample_rate'] / $info['ogg']['samples'];
0
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
19
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   532
		$oggheader = array();
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
		$filedata = $this->fread($this->getid3->fread_buffer_size());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
		$filedataoffset = 0;
21
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
   537
		while (substr($filedata, $filedataoffset++, 4) != 'OggS') {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
			if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
				// should be found before here
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
			}
21
48c4eec2b7e6 Add CLAUDE.md documentation and sync WordPress core files
ymh <ymh.work@gmail.com>
parents: 19
diff changeset
   542
			if (($filedataoffset + 28) > strlen($filedata)) {
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   543
				if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
					// get some more data, unless eof, in which case fail
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
					return false;
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
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
		$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
		$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
		$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
		$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
		$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
   557
		$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
   558
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
		$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
		$filedataoffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
		$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
		$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
		$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
		$filedataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
		$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
		$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
		$oggheader['page_length'] = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
		for ($i = 0; $i < $oggheader['page_segments']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
			$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
			$filedataoffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
			$oggheader['page_length'] += $oggheader['segment_table'][$i];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
		$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
		$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
		$this->fseek($oggheader['header_end_offset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
		return $oggheader;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   582
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   583
	 * @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
   584
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   585
	 * @return bool
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   586
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
	public function ParseVorbisComments() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
		$OriginalOffset = $this->ftell();
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   591
		$commentdata = null;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
		$commentdataoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
		$VorbisCommentPage = 1;
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   594
		$CommentStartOffset = 0;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
		switch ($info['audio']['dataformat']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
			case 'vorbis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
			case 'speex':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   599
			case 'opus':
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
				$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
   601
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
				$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
				$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
				if ($info['audio']['dataformat'] == 'vorbis') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
					$commentdataoffset += (strlen('vorbis') + 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
				}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   608
				else if ($info['audio']['dataformat'] == 'opus') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   609
					$commentdataoffset += strlen('OpusTags');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   610
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   611
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
			case 'flac':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
				$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
				$this->fseek($CommentStartOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
				$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
		$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
		$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
		$commentdataoffset += $VendorSize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
		$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
		$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
		$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
		$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
		$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
		for ($i = 0; $i < $CommentsCount; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   638
			if ($i >= 10000) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   639
				// https://github.com/owncloud/music/issues/212#issuecomment-43082336
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   640
				$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
   641
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   642
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   643
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
			$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
			if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
					$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
					// First, save what we haven't read yet
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
					// Then take that data off the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
					$commentdata     = substr($commentdata, 0, $commentdataoffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
					// 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
   659
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
					// Finally, stick the unused data back on the end
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
					$commentdata .= $AsYetUnusedData;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
					$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));
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
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
			$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
			// replace avdataoffset with position just after the last vorbiscomment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
			$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
   674
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
			$commentdataoffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
			while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
				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
   678
					$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
   679
					break 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
				$VorbisCommentPage++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
19
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   684
				if ($oggpageinfo = $this->ParseOggPageHeader()) {
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   685
					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   686
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   687
					// First, save what we haven't read yet
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   688
					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
19
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   690
					// Then take that data off the end
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   691
					$commentdata     = substr($commentdata, 0, $commentdataoffset);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
19
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   693
					// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   694
					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   695
					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   696
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   697
					// Finally, stick the unused data back on the end
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   698
					$commentdata .= $AsYetUnusedData;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
19
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   700
					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   701
					if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   702
						$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   703
						break;
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   704
					}
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   705
					$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   706
					if ($readlength <= 0) {
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   707
						$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   708
						break;
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   709
					}
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   710
					$commentdata .= $this->fread($readlength);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
19
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   712
					//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   713
				} else {
3d72ae0968f4 upgrade wordpress to 6.0.2
ymh <ymh.work@gmail.com>
parents: 16
diff changeset
   714
					$this->warning('failed to ParseOggPageHeader() at offset '.$this->ftell());
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
			$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
			if (!$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
				// no comment?
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   725
				$this->warning('Blank Ogg comment ['.$i.']');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
			} elseif (strstr($commentstring, '=')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
				$commentexploded = explode('=', $commentstring, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
				$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
				$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
				if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
					// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
					// 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
   737
					// http://flac.sourceforge.net/format.html#metadata_block_picture
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
					$flac = new getid3_flac($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
					$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
					$flac->parsePICTURE();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
					$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
					unset($flac);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
				} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
					$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
					$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
   748
					/** @todo use 'coverartmime' where available */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
					$imageinfo = getid3_lib::GetDataImageSize($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
					if ($imageinfo === false || !isset($imageinfo['mime'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
						$this->warning('COVERART vorbiscomment tag contains invalid image');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
						continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
					$ogg = new self($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
					$ogg->setStringMode($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
					$info['ogg']['comments']['picture'][] = array(
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   758
						'image_mime'   => $imageinfo['mime'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   759
						'datalength'   => strlen($data),
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   760
						'picturetype'  => 'cover art',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   761
						'image_height' => $imageinfo['height'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   762
						'image_width'  => $imageinfo['width'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   763
						'data'         => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
					unset($ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
					$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
   770
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
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   775
				$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
   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
			unset($ThisFileInfo_ogg_comments_raw[$i]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
		unset($ThisFileInfo_ogg_comments_raw);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
		// Replay Gain Adjustment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
		// http://privatewww.essex.ac.uk/~djmrob/replaygain/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
		if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
			foreach ($info['ogg']['comments'] as $index => $commentvalue) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
				switch ($index) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
					case 'rg_audiophile':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
					case 'replaygain_album_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
						$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
					case 'rg_radio':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
					case 'replaygain_track_gain':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
						$info['replay_gain']['track']['adjustment'] = (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 'replaygain_album_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
						$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
					case 'rg_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
					case 'replaygain_track_peak':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
						$info['replay_gain']['track']['peak'] = (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
					case 'replaygain_reference_loudness':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
						$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
						unset($info['ogg']['comments'][$index]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
					default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
						// do nothing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
		$this->fseek($OriginalOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   828
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   829
	 * @param int $mode
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   830
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   831
	 * @return string|null
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   832
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
	public static function SpeexBandModeLookup($mode) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
		static $SpeexBandModeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
		if (empty($SpeexBandModeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
			$SpeexBandModeLookup[0] = 'narrow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
			$SpeexBandModeLookup[1] = 'wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
			$SpeexBandModeLookup[2] = 'ultra-wide';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
		return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   843
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   844
	 * @param array $OggInfoArray
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   845
	 * @param int   $SegmentNumber
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   846
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   847
	 * @return int
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   848
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
	public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   850
		$segmentlength = 0;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
		for ($i = 0; $i < $SegmentNumber; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
			$segmentlength = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
			foreach ($OggInfoArray['segment_table'] as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
				$segmentlength += $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
				if ($value < 255) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
		return $segmentlength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   863
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   864
	 * @param int $nominal_bitrate
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   865
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   866
	 * @return float
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   867
	 */
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
	public static function get_quality_from_nominal_bitrate($nominal_bitrate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
		// decrease precision
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
		$nominal_bitrate = $nominal_bitrate / 1000;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
		if ($nominal_bitrate < 128) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
			// q-1 to q4
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
			$qval = ($nominal_bitrate - 64) / 16;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
		} elseif ($nominal_bitrate < 256) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
			// q4 to q8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
			$qval = $nominal_bitrate / 32;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
		} elseif ($nominal_bitrate < 320) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
			// q8 to q9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
			$qval = ($nominal_bitrate + 256) / 64;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
			// q9 to q10
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
			$qval = ($nominal_bitrate + 1300) / 180;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
		//return $qval; // 5.031324
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
		//return intval($qval); // 5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
		return round($qval, 1); // 5 or 4.9
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   891
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   892
	 * @param int $colorspace_id
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   893
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   894
	 * @return string|null
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   895
	 */
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   896
	public static function TheoraColorSpace($colorspace_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   897
		// http://www.theora.org/doc/Theora.pdf (table 6.3)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   898
		static $TheoraColorSpaceLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   899
		if (empty($TheoraColorSpaceLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   900
			$TheoraColorSpaceLookup[0] = 'Undefined';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   901
			$TheoraColorSpaceLookup[1] = 'Rec. 470M';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   902
			$TheoraColorSpaceLookup[2] = 'Rec. 470BG';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   903
			$TheoraColorSpaceLookup[3] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   904
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   905
		return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   906
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   907
16
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   908
	/**
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   909
	 * @param int $pixelformat_id
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   910
	 *
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   911
	 * @return string|null
a86126ab1dd4 update enmi-conf
ymh <ymh.work@gmail.com>
parents: 7
diff changeset
   912
	 */
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   913
	public static function TheoraPixelFormat($pixelformat_id) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   914
		// http://www.theora.org/doc/Theora.pdf (table 6.4)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   915
		static $TheoraPixelFormatLookup = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   916
		if (empty($TheoraPixelFormatLookup)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   917
			$TheoraPixelFormatLookup[0] = '4:2:0';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   918
			$TheoraPixelFormatLookup[1] = 'Reserved';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   919
			$TheoraPixelFormatLookup[2] = '4:2:2';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   920
			$TheoraPixelFormatLookup[3] = '4:4:4';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   921
		}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   922
		return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   923
	}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   924
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   925
}