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