wp/wp-includes/ID3/module.audio.flac.php
author ymh <ymh.work@gmail.com>
Mon, 14 Oct 2019 17:39:30 +0200
changeset 7 cf61fcea0001
parent 5 5e2f62d02dcd
child 16 a86126ab1dd4
permissions -rw-r--r--
resynchronize code repo with production
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/// getID3() by James Heinrich <info@getid3.org>               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
//  available at http://getid3.sourceforge.net                 //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
//            or http://www.getid3.org                         //
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
     6
//          also https://github.com/JamesHeinrich/getID3       //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
// See readme.txt for more details                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
// module.audio.flac.php                                       //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// module for analyzing FLAC and OggFLAC audio files           //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
// dependencies: module.audio.ogg.php                          //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
//                                                            ///
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
* @tutorial http://flac.sourceforge.net/format.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
class getid3_flac extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
	const syncword = 'fLaC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
	public function Analyze() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		$this->fseek($info['avdataoffset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
		$StreamMarker = $this->fread(4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		if ($StreamMarker != self::syncword) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
			return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($StreamMarker).'"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		$info['fileformat']            = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
		$info['audio']['dataformat']   = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
		$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
		$info['audio']['lossless']     = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
		// parse flac container
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
		return $this->parseMETAdata();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
	public function parseMETAdata() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
		do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
			$BlockOffset   = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
			$BlockHeader   = $this->fread(4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
			$LBFBT         = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
			$LastBlockFlag = (bool) ($LBFBT & 0x80);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
			$BlockType     =        ($LBFBT & 0x7F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
			$BlockLength   = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
			$BlockTypeText = self::metaBlockTypeLookup($BlockType);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
			if (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
				$this->error('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
			if ($BlockLength < 1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
				$this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
			$info['flac'][$BlockTypeText]['raw'] = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
			$BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
			$BlockTypeText_raw['offset']          = $BlockOffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
			$BlockTypeText_raw['last_meta_block'] = $LastBlockFlag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
			$BlockTypeText_raw['block_type']      = $BlockType;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
			$BlockTypeText_raw['block_type_text'] = $BlockTypeText;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
			$BlockTypeText_raw['block_length']    = $BlockLength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
			if ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
				$BlockTypeText_raw['block_data']  = $this->fread($BlockLength);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
			switch ($BlockTypeText) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
				case 'STREAMINFO':     // 0x00
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
					if (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
				case 'PADDING':        // 0x01
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
					unset($info['flac']['PADDING']); // ignore
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
				case 'APPLICATION':    // 0x02
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
					if (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
				case 'SEEKTABLE':      // 0x03
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
					if (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
				case 'VORBIS_COMMENT': // 0x04
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
					if (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
				case 'CUESHEET':       // 0x05
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
					if (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
				case 'PICTURE':        // 0x06
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
					if (!$this->parsePICTURE()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
					$this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
			unset($info['flac'][$BlockTypeText]['raw']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			$info['avdataoffset'] = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
		while ($LastBlockFlag === false);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
		// handle tags
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
		if (!empty($info['flac']['VORBIS_COMMENT']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
			$info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
		if (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
			$info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
		// copy attachments to 'comments' array if nesesary
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
		if (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
			foreach ($info['flac']['PICTURE'] as $entry) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
				if (!empty($entry['data'])) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   138
					if (!isset($info['flac']['comments']['picture'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   139
						$info['flac']['comments']['picture'] = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   140
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   141
					$comments_picture_data = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   142
					foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   143
						if (isset($entry[$picture_key])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   144
							$comments_picture_data[$picture_key] = $entry[$picture_key];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   145
						}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   146
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   147
					$info['flac']['comments']['picture'][] = $comments_picture_data;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   148
					unset($comments_picture_data);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
		if (isset($info['flac']['STREAMINFO'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
			if (!$this->isDependencyFor('matroska')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
				$info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
			$info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
			if ($info['flac']['uncompressed_audio_bytes'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
				return $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
			if (!empty($info['flac']['compressed_audio_bytes'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
				$info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
		// set md5_data_source - built into flac 0.5+
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
		if (isset($info['flac']['STREAMINFO']['audio_signature'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
			if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
                $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
			else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
				$info['md5_data_source'] = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
				$md5 = $info['flac']['STREAMINFO']['audio_signature'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
				for ($i = 0; $i < strlen($md5); $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
					$info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
				if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
					unset($info['md5_data_source']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
		if (isset($info['flac']['STREAMINFO']['bits_per_sample'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
			$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
			if ($info['audio']['bits_per_sample'] == 8) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
				// special case
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
				// must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
				// MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
				$this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
	private function parseSTREAMINFO($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
		$info['flac']['STREAMINFO'] = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
		$streaminfo = &$info['flac']['STREAMINFO'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
		$streaminfo['min_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
		$streaminfo['max_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
		$streaminfo['min_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
		$streaminfo['max_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
		$SRCSBSS                       = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
		$streaminfo['sample_rate']     = getid3_lib::Bin2Dec(substr($SRCSBSS,  0, 20));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
		$streaminfo['channels']        = getid3_lib::Bin2Dec(substr($SRCSBSS, 20,  3)) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
		$streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23,  5)) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
		$streaminfo['samples_stream']  = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
		$streaminfo['audio_signature'] = substr($BlockData, 18, 16);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
		if (!empty($streaminfo['sample_rate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
			$info['audio']['bitrate_mode']    = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
			$info['audio']['sample_rate']     = $streaminfo['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
			$info['audio']['channels']        = $streaminfo['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
			$info['audio']['bits_per_sample'] = $streaminfo['bits_per_sample'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
			$info['playtime_seconds']         = $streaminfo['samples_stream'] / $streaminfo['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
			if ($info['playtime_seconds'] > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
				if (!$this->isDependencyFor('matroska')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
					$info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
				else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
					$this->warning('Cannot determine audio bitrate because total stream size is unknown');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
			return $this->error('Corrupt METAdata block: STREAMINFO');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
	private function parseAPPLICATION($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
		$ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
		$info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
		$info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
	private function parseSEEKTABLE($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
		$offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
		$BlockLength = strlen($BlockData);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
		$placeholderpattern = str_repeat("\xFF", 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
		while ($offset < $BlockLength) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
			$SampleNumberString = substr($BlockData, $offset, 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
			$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
			if ($SampleNumberString == $placeholderpattern) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
				// placeholder point
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
				getid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
				$offset += 10;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
				$SampleNumber                                        = getid3_lib::BigEndian2Int($SampleNumberString);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
				$info['flac']['SEEKTABLE'][$SampleNumber]['offset']  = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
				$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
				$info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
				$offset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
	private function parseVORBIS_COMMENT($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
		$getid3_ogg = new getid3_ogg($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
		if ($this->isDependencyFor('matroska')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
			$getid3_ogg->setStringMode($this->data_string);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
		$getid3_ogg->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
		if (isset($info['ogg'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
			unset($info['ogg']['comments_raw']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
			$info['flac']['VORBIS_COMMENT'] = $info['ogg'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
		unset($getid3_ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
	private function parseCUESHEET($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
		$offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
		$info['flac']['CUESHEET']['media_catalog_number'] =                              trim(substr($BlockData, $offset, 128), "\0");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
		$offset += 128;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
		$info['flac']['CUESHEET']['lead_in_samples']      =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
		$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
		$info['flac']['CUESHEET']['flags']['is_cd']       = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
		$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
		$offset += 258; // reserved
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
		$info['flac']['CUESHEET']['number_tracks']        =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
		$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
		for ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
			$TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
			$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
			$TrackNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
			$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset']         = $TrackSampleOffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc']                  =                           substr($BlockData, $offset, 12);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
			$offset += 12;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
			$TrackFlagsRaw                                                             = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
			$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio']     = (bool) ($TrackFlagsRaw & 0x80);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
			$offset += 13; // reserved
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']          = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
			$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
			for ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
				$IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
				$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
				$IndexNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
				$offset += 3; // reserved
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
				$info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
	* Parse METADATA_BLOCK_PICTURE flac structure and extract attachment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
	* External usage: audio.ogg
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
	*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
	public function parsePICTURE() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
		$picture['typeid']         = getid3_lib::BigEndian2Int($this->fread(4));
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   356
		$picture['picturetype']    = self::pictureTypeLookup($picture['typeid']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
		$picture['image_mime']     = $this->fread(getid3_lib::BigEndian2Int($this->fread(4)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
		$descr_length              = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
		if ($descr_length) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
			$picture['description'] = $this->fread($descr_length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
		}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   362
		$picture['image_width']    = getid3_lib::BigEndian2Int($this->fread(4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   363
		$picture['image_height']   = getid3_lib::BigEndian2Int($this->fread(4));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
		$picture['color_depth']    = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
		$picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4));
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   366
		$picture['datalength']     = getid3_lib::BigEndian2Int($this->fread(4));
0
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 ($picture['image_mime'] == '-->') {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   369
			$picture['data'] = $this->fread($picture['datalength']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
			$picture['data'] = $this->saveAttachment(
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   372
				str_replace('/', '_', $picture['picturetype']).'_'.$this->ftell(),
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
				$this->ftell(),
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   374
				$picture['datalength'],
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
				$picture['image_mime']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
		$info['flac']['PICTURE'][] = $picture;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
		return true;
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
	public static function metaBlockTypeLookup($blocktype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
		static $lookup = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
			0 => 'STREAMINFO',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
			1 => 'PADDING',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
			2 => 'APPLICATION',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
			3 => 'SEEKTABLE',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
			4 => 'VORBIS_COMMENT',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
			5 => 'CUESHEET',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
			6 => 'PICTURE',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
		return (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
	public static function applicationIDLookup($applicationid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
		// http://flac.sourceforge.net/id.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
		static $lookup = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
			0x41544348 => 'FlacFile',                                                                           // "ATCH"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
			0x42534F4C => 'beSolo',                                                                             // "BSOL"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
			0x42554753 => 'Bugs Player',                                                                        // "BUGS"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
			0x43756573 => 'GoldWave cue points (specification)',                                                // "Cues"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
			0x46696361 => 'CUE Splitter',                                                                       // "Fica"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
			0x46746F6C => 'flac-tools',                                                                         // "Ftol"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
			0x4D4F5442 => 'MOTB MetaCzar',                                                                      // "MOTB"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
			0x4D505345 => 'MP3 Stream Editor',                                                                  // "MPSE"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
			0x4D754D4C => 'MusicML: Music Metadata Language',                                                   // "MuML"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
			0x52494646 => 'Sound Devices RIFF chunk storage',                                                   // "RIFF"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
			0x5346464C => 'Sound Font FLAC',                                                                    // "SFFL"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
			0x534F4E59 => 'Sony Creative Software',                                                             // "SONY"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
			0x5351455A => 'flacsqueeze',                                                                        // "SQEZ"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
			0x54745776 => 'TwistedWave',                                                                        // "TtWv"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
			0x55495453 => 'UITS Embedding tools',                                                               // "UITS"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
			0x61696666 => 'FLAC AIFF chunk storage',                                                            // "aiff"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
			0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks',  // "imag"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
			0x7065656D => 'Parseable Embedded Extensible Metadata (specification)',                             // "peem"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
			0x71667374 => 'QFLAC Studio',                                                                       // "qfst"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
			0x72696666 => 'FLAC RIFF chunk storage',                                                            // "riff"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
			0x74756E65 => 'TagTuner',                                                                           // "tune"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
			0x78626174 => 'XBAT',                                                                               // "xbat"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
			0x786D6364 => 'xmcd',                                                                               // "xmcd"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
		return (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
	public static function pictureTypeLookup($type_id) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
		static $lookup = array (
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
			 0 => 'Other',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
			 1 => '32x32 pixels \'file icon\' (PNG only)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
			 2 => 'Other file icon',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
			 3 => 'Cover (front)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
			 4 => 'Cover (back)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
			 5 => 'Leaflet page',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
			 6 => 'Media (e.g. label side of CD)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
			 7 => 'Lead artist/lead performer/soloist',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
			 8 => 'Artist/performer',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
			 9 => 'Conductor',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
			10 => 'Band/Orchestra',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
			11 => 'Composer',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
			12 => 'Lyricist/text writer',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
			13 => 'Recording Location',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
			14 => 'During recording',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
			15 => 'During performance',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
			16 => 'Movie/video screen capture',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
			17 => 'A bright coloured fish',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
			18 => 'Illustration',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
			19 => 'Band/artist logotype',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
			20 => 'Publisher/Studio logotype',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
		return (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   453
}