wp/wp-includes/ID3/module.audio-video.quicktime.php
author ymh <ymh.work@gmail.com>
Tue, 22 Oct 2019 16:11:46 +0200
changeset 15 3d4e9c994f10
parent 7 cf61fcea0001
child 16 a86126ab1dd4
permissions -rw-r--r--
Upgrade jquery-ui in in-motion theme version from 1.8.14 to 1.8.22 to avoid 'a.curCSS is not a function' errors in console that caused problems with circles and navigation.
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-video.quicktime.php                            //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// module for analyzing Quicktime and MP3-in-MP4 files         //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
// dependencies: module.audio.mp3.php                          //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
// dependencies: module.tag.id3v2.php                          //
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.mp3.php', __FILE__, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); // needed for ISO 639-2 language code lookup
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
class getid3_quicktime extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
	public $ReturnAtomData        = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
	public $ParseAllPossibleAtoms = false;
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
		$info['fileformat'] = 'quicktime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
		$info['quicktime']['hinting']    = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		$info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    34
		$this->fseek($info['avdataoffset']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
		$offset      = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
		$atomcounter = 0;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    38
		$atom_data_read_buffer_size = max($this->getid3->option_fread_buffer_size * 1024, ($info['php_memory_limit'] ? round($info['php_memory_limit'] / 4) : 1024)); // set read buffer to 25% of PHP memory limit (if one is specified), otherwise use option_fread_buffer_size [default: 32MB]
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
		while ($offset < $info['avdataend']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
			if (!getid3_lib::intValueSupported($offset)) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    41
				$this->error('Unable to parse atom at offset '.$offset.' because beyond '.round(PHP_INT_MAX / 1073741824).'GB limit of PHP filesystem functions');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
			}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    44
			$this->fseek($offset);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    45
			$AtomHeader = $this->fread(8);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
			$atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
			$atomname = substr($AtomHeader, 4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
			// 64-bit MOV patch by jlegateØktnc*com
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
			if ($atomsize == 1) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    52
				$atomsize = getid3_lib::BigEndian2Int($this->fread(8));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
			$info['quicktime'][$atomname]['name']   = $atomname;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
			$info['quicktime'][$atomname]['size']   = $atomsize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
			$info['quicktime'][$atomname]['offset'] = $offset;
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 (($offset + $atomsize) > $info['avdataend']) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    60
				$this->error('Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
				return false;
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
			if ($atomsize == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
				// Furthermore, for historical reasons the list of atoms is optionally
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
				// terminated by a 32-bit integer set to 0. If you are writing a program
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
				// to read user data atoms, you should allow for the terminating 0.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
			}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    70
			$atomHierarchy = array();
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    71
			$info['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
			$offset += $atomsize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			$atomcounter++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
		if (!empty($info['avdataend_tmp'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
			// this value is assigned to a temp value and then erased because
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
			// otherwise any atoms beyond the 'mdat' atom would not get parsed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
			$info['avdataend'] = $info['avdataend_tmp'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
			unset($info['avdataend_tmp']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    84
		if (!empty($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    85
			$durations = $this->quicktime_time_to_sample_table($info);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    86
			for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    87
				$bookmark = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    88
				$bookmark['title'] = $info['quicktime']['comments']['chapters'][$i];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    89
				if (isset($durations[$i])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    90
					$bookmark['duration_sample'] = $durations[$i]['sample_duration'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    91
					if ($i > 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    92
						$bookmark['start_sample'] = $info['quicktime']['bookmarks'][($i - 1)]['start_sample'] + $info['quicktime']['bookmarks'][($i - 1)]['duration_sample'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    93
					} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    94
						$bookmark['start_sample'] = 0;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    95
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    96
					if ($time_scale = $this->quicktime_bookmark_time_scale($info)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    97
						$bookmark['duration_seconds'] = $bookmark['duration_sample'] / $time_scale;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    98
						$bookmark['start_seconds']    = $bookmark['start_sample']    / $time_scale;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
    99
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   100
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   101
				$info['quicktime']['bookmarks'][] = $bookmark;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   102
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   103
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   104
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   105
		if (isset($info['quicktime']['temp_meta_key_names'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   106
			unset($info['quicktime']['temp_meta_key_names']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   107
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   108
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   109
		if (!empty($info['quicktime']['comments']['location.ISO6709'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   110
			// https://en.wikipedia.org/wiki/ISO_6709
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   111
			foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   112
				$latitude  = false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   113
				$longitude = false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   114
				$altitude  = false;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   115
				if (preg_match('#^([\\+\\-])([0-9]{2}|[0-9]{4}|[0-9]{6})(\\.[0-9]+)?([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?(([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?)?/$#', $ISO6709string, $matches)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   116
					@list($dummy, $lat_sign, $lat_deg, $lat_deg_dec, $lon_sign, $lon_deg, $lon_deg_dec, $dummy, $alt_sign, $alt_deg, $alt_deg_dec) = $matches;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   117
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   118
					if (strlen($lat_deg) == 2) {        // [+-]DD.D
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   119
						$latitude = floatval(ltrim($lat_deg, '0').$lat_deg_dec);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   120
					} elseif (strlen($lat_deg) == 4) {  // [+-]DDMM.M
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   121
						$latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   122
					} elseif (strlen($lat_deg) == 6) {  // [+-]DDMMSS.S
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   123
						$latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   124
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   125
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   126
					if (strlen($lon_deg) == 3) {        // [+-]DDD.D
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   127
						$longitude = floatval(ltrim($lon_deg, '0').$lon_deg_dec);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   128
					} elseif (strlen($lon_deg) == 5) {  // [+-]DDDMM.M
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   129
						$longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   130
					} elseif (strlen($lon_deg) == 7) {  // [+-]DDDMMSS.S
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   131
						$longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   132
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   133
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   134
					if (strlen($alt_deg) == 3) {        // [+-]DDD.D
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   135
						$altitude = floatval(ltrim($alt_deg, '0').$alt_deg_dec);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   136
					} elseif (strlen($alt_deg) == 5) {  // [+-]DDDMM.M
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   137
						$altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   138
					} elseif (strlen($alt_deg) == 7) {  // [+-]DDDMMSS.S
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   139
						$altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600);
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
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   142
					if ($latitude !== false) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   143
						$info['quicktime']['comments']['gps_latitude'][]  = (($lat_sign == '-') ? -1 : 1) * floatval($latitude);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   144
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   145
					if ($longitude !== false) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   146
						$info['quicktime']['comments']['gps_longitude'][] = (($lon_sign == '-') ? -1 : 1) * floatval($longitude);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   147
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   148
					if ($altitude !== false) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   149
						$info['quicktime']['comments']['gps_altitude'][]  = (($alt_sign == '-') ? -1 : 1) * floatval($altitude);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   150
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   151
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   152
				if ($latitude === false) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   153
					$this->warning('location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   154
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   155
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   156
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   157
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   158
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
		if (!isset($info['bitrate']) && isset($info['playtime_seconds'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
		if (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
			$info['audio']['bitrate'] = $info['bitrate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
		if (!empty($info['playtime_seconds']) && !isset($info['video']['frame_rate']) && !empty($info['quicktime']['stts_framecount'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
			foreach ($info['quicktime']['stts_framecount'] as $key => $samples_count) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
				$samples_per_second = $samples_count / $info['playtime_seconds'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
				if ($samples_per_second > 240) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
					// has to be audio samples
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
					$info['video']['frame_rate'] = $samples_per_second;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
		}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   176
		if ($info['audio']['dataformat'] == 'mp4') {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
			$info['fileformat'] = 'mp4';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   178
			if (empty($info['video']['resolution_x'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   179
				$info['mime_type']  = 'audio/mp4';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   180
				unset($info['video']['dataformat']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   181
			} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   182
				$info['mime_type']  = 'video/mp4';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   183
			}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
		if (!$this->ReturnAtomData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
			unset($info['quicktime']['moov']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
		if (empty($info['audio']['dataformat']) && !empty($info['quicktime']['audio'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
			$info['audio']['dataformat'] = 'quicktime';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
		if (empty($info['video']['dataformat']) && !empty($info['quicktime']['video'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
			$info['video']['dataformat'] = 'quicktime';
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
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
	public function QuicktimeParseAtom($atomname, $atomsize, $atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
		// http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   202
		// https://code.google.com/p/mp4v2/wiki/iTunesMetadata
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   206
		$atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see http://www.getid3.org/phpBB3/viewtopic.php?t=1717
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
		array_push($atomHierarchy, $atomname);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
		$atom_structure['hierarchy'] = implode(' ', $atomHierarchy);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
		$atom_structure['name']      = $atomname;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
		$atom_structure['size']      = $atomsize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
		$atom_structure['offset']    = $baseoffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
		switch ($atomname) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
			case 'moov': // MOVie container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
			case 'trak': // TRAcK container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
			case 'clip': // CLIPping container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
			case 'matt': // track MATTe container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
			case 'edts': // EDiTS container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
			case 'tref': // Track REFerence container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
			case 'mdia': // MeDIA container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
			case 'minf': // Media INFormation container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
			case 'dinf': // Data INFormation container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
			case 'udta': // User DaTA container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
			case 'cmov': // Compressed MOVie container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
			case 'rmra': // Reference Movie Record Atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
			case 'rmda': // Reference Movie Descriptor Atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
			case 'gmhd': // Generic Media info HeaDer atom (seen on QTVR)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
				$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
			case 'ilst': // Item LiST container atom
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   231
				if ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   232
					// some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   233
					$allnumericnames = true;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
					foreach ($atom_structure['subatoms'] as $subatomarray) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   235
						if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   236
							$allnumericnames = false;
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
					}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   240
					if ($allnumericnames) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   241
						$newData = array();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   242
						foreach ($atom_structure['subatoms'] as $subatomarray) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   243
							foreach ($subatomarray['subatoms'] as $newData_subatomarray) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   244
								unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   245
								$newData[$subatomarray['name']] = $newData_subatomarray;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   246
								break;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   247
							}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   248
						}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   249
						$atom_structure['data'] = $newData;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   250
						unset($atom_structure['subatoms']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   251
					}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
			case "\x00\x00\x00\x01":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
			case "\x00\x00\x00\x02":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
			case "\x00\x00\x00\x03":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
			case "\x00\x00\x00\x04":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
			case "\x00\x00\x00\x05":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
				$atomname = getid3_lib::BigEndian2Int($atomname);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
				$atom_structure['name'] = $atomname;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
				$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
			case 'stbl': // Sample TaBLe container atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
				$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
				$isVideo = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
				$framerate  = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
				$framecount = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
				foreach ($atom_structure['subatoms'] as $key => $value_array) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
					if (isset($value_array['sample_description_table'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
						foreach ($value_array['sample_description_table'] as $key2 => $value_array2) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
							if (isset($value_array2['data_format'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
								switch ($value_array2['data_format']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
									case 'avc1':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
									case 'mp4v':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
										// video data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
										$isVideo = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
										break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
									case 'mp4a':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
										// audio data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
										break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
								}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
					} elseif (isset($value_array['time_to_sample_table'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
						foreach ($value_array['time_to_sample_table'] as $key2 => $value_array2) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
							if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
								$framerate  = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
								$framecount = $value_array2['sample_count'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
				if ($isVideo && $framerate) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
					$info['quicktime']['video']['frame_rate'] = $framerate;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
					$info['video']['frame_rate'] = $info['quicktime']['video']['frame_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
				if ($isVideo && $framecount) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
					$info['quicktime']['video']['frame_count'] = $framecount;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   305
			case "\xA9".'alb': // ALBum
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   306
			case "\xA9".'ART': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   307
			case "\xA9".'art': // ARTist
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   308
			case "\xA9".'aut': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   309
			case "\xA9".'cmt': // CoMmenT
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   310
			case "\xA9".'com': // COMposer
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   311
			case "\xA9".'cpy': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   312
			case "\xA9".'day': // content created year
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   313
			case "\xA9".'dir': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   314
			case "\xA9".'ed1': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   315
			case "\xA9".'ed2': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   316
			case "\xA9".'ed3': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   317
			case "\xA9".'ed4': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   318
			case "\xA9".'ed5': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   319
			case "\xA9".'ed6': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   320
			case "\xA9".'ed7': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   321
			case "\xA9".'ed8': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   322
			case "\xA9".'ed9': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   323
			case "\xA9".'enc': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   324
			case "\xA9".'fmt': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   325
			case "\xA9".'gen': // GENre
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   326
			case "\xA9".'grp': // GRouPing
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   327
			case "\xA9".'hst': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   328
			case "\xA9".'inf': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   329
			case "\xA9".'lyr': // LYRics
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   330
			case "\xA9".'mak': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   331
			case "\xA9".'mod': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   332
			case "\xA9".'nam': // full NAMe
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   333
			case "\xA9".'ope': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   334
			case "\xA9".'PRD': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   335
			case "\xA9".'prf': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   336
			case "\xA9".'req': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   337
			case "\xA9".'src': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   338
			case "\xA9".'swr': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   339
			case "\xA9".'too': // encoder
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   340
			case "\xA9".'trk': // TRacK
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   341
			case "\xA9".'url': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   342
			case "\xA9".'wrn': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   343
			case "\xA9".'wrt': // WRiTer
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   344
			case '----': // itunes specific
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
			case 'aART': // Album ARTist
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   346
			case 'akID': // iTunes store account type
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   347
			case 'apID': // Purchase Account
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   348
			case 'atID': //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
			case 'catg': // CaTeGory
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   350
			case 'cmID': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   351
			case 'cnID': //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
			case 'covr': // COVeR artwork
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
			case 'cpil': // ComPILation
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
			case 'cprt': // CoPyRighT
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
			case 'desc': // DESCription
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
			case 'disk': // DISK number
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
			case 'egid': // Episode Global ID
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   358
			case 'geID': //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
			case 'gnre': // GeNRE
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   360
			case 'hdvd': // HD ViDeo
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
			case 'keyw': // KEYWord
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   362
			case 'ldes': // Long DEScription
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
			case 'pcst': // PodCaST
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
			case 'pgap': // GAPless Playback
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   365
			case 'plID': //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
			case 'purd': // PURchase Date
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
			case 'purl': // Podcast URL
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   368
			case 'rati': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   369
			case 'rndu': //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   370
			case 'rpdu': //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
			case 'rtng': // RaTiNG
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   372
			case 'sfID': // iTunes store country
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   373
			case 'soaa': // SOrt Album Artist
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   374
			case 'soal': // SOrt ALbum
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   375
			case 'soar': // SOrt ARtist
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   376
			case 'soco': // SOrt COmposer
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   377
			case 'sonm': // SOrt NaMe
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   378
			case 'sosn': // SOrt Show Name
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   379
			case 'stik': //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
			case 'tmpo': // TeMPO (BPM)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
			case 'trkn': // TRacK Number
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   382
			case 'tven': // tvEpisodeID
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
			case 'tves': // TV EpiSode
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
			case 'tvnn': // TV Network Name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
			case 'tvsh': // TV SHow Name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
			case 'tvsn': // TV SeasoN
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
				if ($atom_parent == 'udta') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
					// User data atom handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
					$atom_structure['data_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
					$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
					$atom_structure['data']        =                           substr($atom_data, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
					$atom_structure['language']    = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
					if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
						$info['comments']['language'][] = $atom_structure['language'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
					// Apple item list box atom handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
					$atomoffset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
					if (substr($atom_data, 2, 2) == "\x10\xB5") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
						// not sure what it means, but observed on iPhone4 data.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
						// Each $atom_data has 2 bytes of datasize, plus 0x10B5, then data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
						while ($atomoffset < strlen($atom_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
							$boxsmallsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset,     2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
							$boxsmalltype =                           substr($atom_data, $atomoffset + 2, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
							$boxsmalldata =                           substr($atom_data, $atomoffset + 4, $boxsmallsize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
							if ($boxsmallsize <= 1) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   408
								$this->warning('Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
								$atom_structure['data'] = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
								$atomoffset = strlen($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
							switch ($boxsmalltype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
								case "\x10\xB5":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
									$atom_structure['data'] = $boxsmalldata;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
								default:
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   418
									$this->warning('Unknown QuickTime smallbox type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxsmalltype).'" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
									$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
							$atomoffset += (4 + $boxsmallsize);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
					} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
						while ($atomoffset < strlen($atom_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
							$boxsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
							$boxtype =                           substr($atom_data, $atomoffset + 4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
							$boxdata =                           substr($atom_data, $atomoffset + 8, $boxsize - 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
							if ($boxsize <= 1) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   430
								$this->warning('Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
								$atom_structure['data'] = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
								$atomoffset = strlen($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
								break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
							$atomoffset += $boxsize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
							switch ($boxtype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
								case 'mean':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
								case 'name':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
									$atom_structure[$boxtype] = substr($boxdata, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
								case 'data':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
									$atom_structure['version']   = getid3_lib::BigEndian2Int(substr($boxdata,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
									$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata,  1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
									switch ($atom_structure['flags_raw']) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   447
										case  0: // data flag
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
										case 21: // tmpo/cpil flag
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
											switch ($atomname) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
												case 'cpil':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   451
												case 'hdvd':
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
												case 'pcst':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
												case 'pgap':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   454
													// 8-bit integer (boolean)
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
													$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
												case 'tmpo':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   459
													// 16-bit integer
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
													$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
												case 'disk':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
												case 'trkn':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   465
													// binary
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
													$num       = getid3_lib::BigEndian2Int(substr($boxdata, 10, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
													$num_total = getid3_lib::BigEndian2Int(substr($boxdata, 12, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
													$atom_structure['data']  = empty($num) ? '' : $num;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
													$atom_structure['data'] .= empty($num_total) ? '' : '/'.$num_total;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
												case 'gnre':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   473
													// enum
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
													$GenreID = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
													$atom_structure['data']    = getid3_id3v1::LookupGenreName($GenreID - 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
												case 'rtng':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   479
													// 8-bit integer
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
													$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
													$atom_structure['data']    = $this->QuicktimeContentRatingLookup($atom_structure[$atomname]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
												case 'stik':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   485
													// 8-bit integer (enum)
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
													$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
													$atom_structure['data']    = $this->QuicktimeSTIKLookup($atom_structure[$atomname]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
												case 'sfID':
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   491
													// 32-bit integer
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
													$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
													$atom_structure['data']    = $this->QuicktimeStoreFrontCodeLookup($atom_structure[$atomname]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
												case 'egid':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
												case 'purl':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
													$atom_structure['data'] = substr($boxdata, 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
													break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   501
												case 'plID':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   502
													// 64-bit integer
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   503
													$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 8));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   504
													break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   505
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   506
												case 'covr':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   507
													$atom_structure['data'] = substr($boxdata, 8);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   508
													// not a foolproof check, but better than nothing
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   509
													if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   510
														$atom_structure['image_mime'] = 'image/jpeg';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   511
													} elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   512
														$atom_structure['image_mime'] = 'image/png';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   513
													} elseif (preg_match('#^GIF#', $atom_structure['data'])) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   514
														$atom_structure['image_mime'] = 'image/gif';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   515
													}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   516
													break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   517
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   518
												case 'atID':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   519
												case 'cnID':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   520
												case 'geID':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   521
												case 'tves':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   522
												case 'tvsn':
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
												default:
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   524
													// 32-bit integer
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
													$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
											}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   529
										case  1: // text flag
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
										case 13: // image flag
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
											$atom_structure['data'] = substr($boxdata, 8);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   533
											if ($atomname == 'covr') {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   534
												// not a foolproof check, but better than nothing
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   535
												if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   536
													$atom_structure['image_mime'] = 'image/jpeg';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   537
												} elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   538
													$atom_structure['image_mime'] = 'image/png';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   539
												} elseif (preg_match('#^GIF#', $atom_structure['data'])) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   540
													$atom_structure['image_mime'] = 'image/gif';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   541
												}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   542
											}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
								default:
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   549
									$this->warning('Unknown QuickTime box type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxtype).'" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
									$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
				$this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
			case 'play': // auto-PLAY atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
				$atom_structure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
				$info['quicktime']['autoplay'] = $atom_structure['autoplay'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
			case 'WLOC': // Window LOCation atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
				$atom_structure['location_x']  = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
				$atom_structure['location_y']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
			case 'LOOP': // LOOPing atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
			case 'SelO': // play SELection Only atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
			case 'AllF': // play ALL Frames atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
				$atom_structure['data'] = getid3_lib::BigEndian2Int($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
			case 'name': //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
			case 'MCPS': // Media Cleaner PRo
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
			case '@PRM': // adobe PReMiere version
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
			case '@PRQ': // adobe PRemiere Quicktime version
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
				$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
			case 'cmvd': // Compressed MooV Data atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
				// Code by ubergeekØubergeek*tv based on information from
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
				// http://developer.apple.com/quicktime/icefloe/dispatch012.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
				$atom_structure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
				$CompressedFileData = substr($atom_data, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
				if ($UncompressedHeader = @gzuncompress($CompressedFileData)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
					$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, 0, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
				} else {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   597
					$this->warning('Error decompressing compressed MOV atom at offset '.$atom_structure['offset']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
			case 'dcom': // Data COMpression atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
				$atom_structure['compression_id']   = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
				$atom_structure['compression_text'] = $this->QuicktimeDCOMLookup($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
			case 'rdrf': // Reference movie Data ReFerence atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
				$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
				$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
				$atom_structure['flags']['internal_data'] = (bool) ($atom_structure['flags_raw'] & 0x000001);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
				$atom_structure['reference_type_name']    =                           substr($atom_data,  4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
				$atom_structure['reference_length']       = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
				switch ($atom_structure['reference_type_name']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
					case 'url ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
						$atom_structure['url']            =       $this->NoNullString(substr($atom_data, 12));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
					case 'alis':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
						$atom_structure['file_alias']     =                           substr($atom_data, 12);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
					case 'rsrc':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
						$atom_structure['resource_alias'] =                           substr($atom_data, 12);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
					default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
						$atom_structure['data']           =                           substr($atom_data, 12);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
			case 'rmqu': // Reference Movie QUality atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
				$atom_structure['movie_quality'] = getid3_lib::BigEndian2Int($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
			case 'rmcs': // Reference Movie Cpu Speed atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
				$atom_structure['version']          = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
				$atom_structure['flags_raw']        = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
				$atom_structure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
			case 'rmvc': // Reference Movie Version Check atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
				$atom_structure['version']            = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
				$atom_structure['flags_raw']          = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
				$atom_structure['gestalt_selector']   =                           substr($atom_data,  4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
				$atom_structure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
				$atom_structure['gestalt_value']      = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
				$atom_structure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
			case 'rmcd': // Reference Movie Component check atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
				$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
				$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
				$atom_structure['component_type']         =                           substr($atom_data,  4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
				$atom_structure['component_subtype']      =                           substr($atom_data,  8, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
				$atom_structure['component_manufacturer'] =                           substr($atom_data, 12, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
				$atom_structure['component_flags_raw']    = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
				$atom_structure['component_flags_mask']   = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
				$atom_structure['component_min_version']  = getid3_lib::BigEndian2Int(substr($atom_data, 24, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
			case 'rmdr': // Reference Movie Data Rate atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
				$atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
				$atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
				$atom_structure['data_rate']     = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
				$atom_structure['data_rate_bps'] = $atom_structure['data_rate'] * 10;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
			case 'rmla': // Reference Movie Language Atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
				$atom_structure['version']     = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
				$atom_structure['flags_raw']   = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
				$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
				$atom_structure['language']    = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
				if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
					$info['comments']['language'][] = $atom_structure['language'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
			case 'rmla': // Reference Movie Language Atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
				$atom_structure['version']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
				$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
				$atom_structure['track_id']  = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
			case 'ptv ': // Print To Video - defines a movie's full screen mode
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
				// http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
				$atom_structure['display_size_raw']  = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
				$atom_structure['reserved_1']        = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
				$atom_structure['reserved_2']        = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
				$atom_structure['slide_show_flag']   = getid3_lib::BigEndian2Int(substr($atom_data, 6, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
				$atom_structure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 7, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
				$atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
				$atom_structure['flags']['slide_show']   = (bool) $atom_structure['slide_show_flag'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
				$ptv_lookup[0] = 'normal';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
				$ptv_lookup[1] = 'double';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
				$ptv_lookup[2] = 'half';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
				$ptv_lookup[3] = 'full';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
				$ptv_lookup[4] = 'current';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
				if (isset($ptv_lookup[$atom_structure['display_size_raw']])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
					$atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
				} else {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   716
					$this->warning('unknown "ptv " display constant ('.$atom_structure['display_size_raw'].')');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
			case 'stsd': // Sample Table Sample Description atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
				$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
				$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
				$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   725
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   726
				// see: https://github.com/JamesHeinrich/getID3/issues/111
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   727
				// Some corrupt files have been known to have high bits set in the number_entries field
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   728
				// This field shouldn't really need to be 32-bits, values stores are likely in the range 1-100000
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   729
				// Workaround: mask off the upper byte and throw a warning if it's nonzero
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   730
				if ($atom_structure['number_entries'] > 0x000FFFFF) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   731
					if ($atom_structure['number_entries'] > 0x00FFFFFF) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   732
						$this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Ignoring upper byte and interpreting this as 0x'.getid3_lib::PrintHexBytes(substr($atom_data, 5, 3), true, false).' = '.($atom_structure['number_entries'] & 0x00FFFFFF));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   733
						$atom_structure['number_entries'] = ($atom_structure['number_entries'] & 0x00FFFFFF);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   734
					} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   735
						$this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Please report this to info@getid3.org referencing bug report #111');
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   736
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   737
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   738
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
				$stsdEntriesDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
				for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
					$atom_structure['sample_description_table'][$i]['size']             = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
					$stsdEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
					$atom_structure['sample_description_table'][$i]['data_format']      =                           substr($atom_data, $stsdEntriesDataOffset, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
					$stsdEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
					$atom_structure['sample_description_table'][$i]['reserved']         = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 6));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
					$stsdEntriesDataOffset += 6;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
					$atom_structure['sample_description_table'][$i]['reference_index']  = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
					$stsdEntriesDataOffset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
					$atom_structure['sample_description_table'][$i]['data']             =                           substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
					$stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
					$atom_structure['sample_description_table'][$i]['encoder_version']  = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
					$atom_structure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
					$atom_structure['sample_description_table'][$i]['encoder_vendor']   =                           substr($atom_structure['sample_description_table'][$i]['data'],  4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
					switch ($atom_structure['sample_description_table'][$i]['encoder_vendor']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
						case "\x00\x00\x00\x00":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
							// audio tracks
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
							$atom_structure['sample_description_table'][$i]['audio_channels']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
							$atom_structure['sample_description_table'][$i]['audio_bit_depth']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 10,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
							$atom_structure['sample_description_table'][$i]['audio_compression_id'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
							$atom_structure['sample_description_table'][$i]['audio_packet_size']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 14,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
							$atom_structure['sample_description_table'][$i]['audio_sample_rate']    = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 16,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
							// video tracks
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
							// http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
							$atom_structure['sample_description_table'][$i]['temporal_quality'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
							$atom_structure['sample_description_table'][$i]['spatial_quality']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
							$atom_structure['sample_description_table'][$i]['width']            =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
							$atom_structure['sample_description_table'][$i]['height']           =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
							$atom_structure['sample_description_table'][$i]['resolution_x']     = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
							$atom_structure['sample_description_table'][$i]['resolution_y']     = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 28,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
							$atom_structure['sample_description_table'][$i]['data_size']        =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
							$atom_structure['sample_description_table'][$i]['frame_count']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 36,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
							$atom_structure['sample_description_table'][$i]['compressor_name']  =                             substr($atom_structure['sample_description_table'][$i]['data'], 38,  4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
							$atom_structure['sample_description_table'][$i]['pixel_depth']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 42,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
							$atom_structure['sample_description_table'][$i]['color_table_id']   =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 44,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
							switch ($atom_structure['sample_description_table'][$i]['data_format']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
								case '2vuY':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
								case 'avc1':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
								case 'cvid':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
								case 'dvc ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
								case 'dvcp':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
								case 'gif ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
								case 'h263':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
								case 'jpeg':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
								case 'kpcd':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
								case 'mjpa':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
								case 'mjpb':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
								case 'mp4v':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
								case 'png ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
								case 'raw ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
								case 'rle ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
								case 'rpza':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
								case 'smc ':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
								case 'SVQ1':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
								case 'SVQ3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
								case 'tiff':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
								case 'v210':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
								case 'v216':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
								case 'v308':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
								case 'v408':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
								case 'v410':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
								case 'yuv2':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
									$info['fileformat'] = 'mp4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
									$info['video']['fourcc'] = $atom_structure['sample_description_table'][$i]['data_format'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
// http://www.getid3.org/phpBB3/viewtopic.php?t=1550
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
//if ((!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['width'])) && (empty($info['video']['resolution_x']) || empty($info['video']['resolution_y']) || (number_format($info['video']['resolution_x'], 6) != number_format(round($info['video']['resolution_x']), 6)) || (number_format($info['video']['resolution_y'], 6) != number_format(round($info['video']['resolution_y']), 6)))) { // ugly check for floating point numbers
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
if (!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['height'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
	// assume that values stored here are more important than values stored in [tkhd] atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
	$info['video']['resolution_x'] = $atom_structure['sample_description_table'][$i]['width'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
	$info['video']['resolution_y'] = $atom_structure['sample_description_table'][$i]['height'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
	$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
	$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
								case 'qtvr':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
									$info['video']['dataformat'] = 'quicktimevr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
								case 'mp4a':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
								default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
									$info['quicktime']['audio']['codec']       = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
									$info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
									$info['quicktime']['audio']['channels']    = $atom_structure['sample_description_table'][$i]['audio_channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
									$info['quicktime']['audio']['bit_depth']   = $atom_structure['sample_description_table'][$i]['audio_bit_depth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
									$info['audio']['codec']                    = $info['quicktime']['audio']['codec'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
									$info['audio']['sample_rate']              = $info['quicktime']['audio']['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
									$info['audio']['channels']                 = $info['quicktime']['audio']['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
									$info['audio']['bits_per_sample']          = $info['quicktime']['audio']['bit_depth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
									switch ($atom_structure['sample_description_table'][$i]['data_format']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
										case 'raw ': // PCM
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
										case 'alac': // Apple Lossless Audio Codec
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
											$info['audio']['lossless'] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
										default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
											$info['audio']['lossless'] = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
											break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
							switch ($atom_structure['sample_description_table'][$i]['data_format']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
								case 'mp4s':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
									$info['fileformat'] = 'mp4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
								default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
									// video atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
									$atom_structure['sample_description_table'][$i]['video_temporal_quality']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
									$atom_structure['sample_description_table'][$i]['video_spatial_quality']   =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
									$atom_structure['sample_description_table'][$i]['video_frame_width']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
									$atom_structure['sample_description_table'][$i]['video_frame_height']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
									$atom_structure['sample_description_table'][$i]['video_resolution_x']      = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 20,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
									$atom_structure['sample_description_table'][$i]['video_resolution_y']      = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
									$atom_structure['sample_description_table'][$i]['video_data_size']         =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 28,  4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
									$atom_structure['sample_description_table'][$i]['video_frame_count']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
									$atom_structure['sample_description_table'][$i]['video_encoder_name_len']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 34,  1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
									$atom_structure['sample_description_table'][$i]['video_encoder_name']      =                             substr($atom_structure['sample_description_table'][$i]['data'], 35, $atom_structure['sample_description_table'][$i]['video_encoder_name_len']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
									$atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
									$atom_structure['sample_description_table'][$i]['video_color_table_id']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68,  2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
									$atom_structure['sample_description_table'][$i]['video_pixel_color_type']  = (($atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
									$atom_structure['sample_description_table'][$i]['video_pixel_color_name']  = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
									if ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
										$info['quicktime']['video']['codec_fourcc']        = $atom_structure['sample_description_table'][$i]['data_format'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
										$info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
										$info['quicktime']['video']['codec']               = (($atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
										$info['quicktime']['video']['color_depth']         = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
										$info['quicktime']['video']['color_depth_name']    = $atom_structure['sample_description_table'][$i]['video_pixel_color_name'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
										$info['video']['codec']           = $info['quicktime']['video']['codec'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
										$info['video']['bits_per_sample'] = $info['quicktime']['video']['color_depth'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
									}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
									$info['video']['lossless']           = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
									$info['video']['pixel_aspect_ratio'] = (float) 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
									break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
							}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
					switch (strtolower($atom_structure['sample_description_table'][$i]['data_format'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
						case 'mp4a':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
							$info['audio']['dataformat']         = 'mp4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
							$info['quicktime']['audio']['codec'] = 'mp4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
						case '3ivx':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
						case '3iv1':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
						case '3iv2':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
							$info['video']['dataformat'] = '3ivx';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
						case 'xvid':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
							$info['video']['dataformat'] = 'xvid';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
						case 'mp4v':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
							$info['video']['dataformat'] = 'mpeg4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
						case 'divx':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
						case 'div1':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
						case 'div2':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
						case 'div3':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
						case 'div4':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
						case 'div5':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
						case 'div6':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
							$info['video']['dataformat'] = 'divx';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
							// do nothing
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
					unset($atom_structure['sample_description_table'][$i]['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
			case 'stts': // Sample Table Time-to-Sample atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
				$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
				$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
				$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
				$sttsEntriesDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
				//$FrameRateCalculatorArray = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
				$frames_count = 0;
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   933
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   934
				$max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   935
				if ($max_stts_entries_to_scan < $atom_structure['number_entries']) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
   936
					$this->warning('QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($atom_structure['number_entries'] / 1048576).'MB).');
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   937
				}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   938
				for ($i = 0; $i < $max_stts_entries_to_scan; $i++) {
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
					$atom_structure['time_to_sample_table'][$i]['sample_count']    = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
					$sttsEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
					$atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
					$sttsEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
					$frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
					// THIS SECTION REPLACED WITH CODE IN "stbl" ATOM
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
					//if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
					//	$stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
					//	if ($stts_new_framerate <= 60) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
					//		// some atoms have durations of "1" giving a very large framerate, which probably is not right
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
					//		$info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
					//	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
					//}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
					//
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
					//$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
				$info['quicktime']['stts_framecount'][] = $frames_count;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
				//$sttsFramesTotal  = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
				//$sttsSecondsTotal = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
				//foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
				//	if (($frames_per_second > 60) || ($frames_per_second < 1)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
				//		// not video FPS information, probably audio information
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
				//		$sttsFramesTotal  = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
				//		$sttsSecondsTotal = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
				//		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
				//	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
				//	$sttsFramesTotal  += $frame_count;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
				//	$sttsSecondsTotal += $frame_count / $frames_per_second;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
				//}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
				//if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
				//	if (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
				//		$info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
				//	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
				//}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
			case 'stss': // Sample Table Sync Sample (key frames) atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
				if ($ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
					$stssEntriesDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
					for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
						$atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
						$stssEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
			case 'stsc': // Sample Table Sample-to-Chunk atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
				if ($ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
					$stscEntriesDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
					for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
						$atom_structure['sample_to_chunk_table'][$i]['first_chunk']        = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
						$stscEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
						$atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk']  = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
						$stscEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
						$atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
						$stscEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
			case 'stsz': // Sample Table SiZe atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
				if ($ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
					$atom_structure['sample_size']    = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
					$stszEntriesDataOffset = 12;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
					if ($atom_structure['sample_size'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
						for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
							$atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
							$stszEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
			case 'stco': // Sample Table Chunk Offset atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
				if ($ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
					$stcoEntriesDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
					for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
						$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
						$stcoEntriesDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
			case 'co64': // Chunk Offset 64-bit (version of "stco" that supports > 2GB files)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
				if ($ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
					$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
					$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
					$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
					$stcoEntriesDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
					for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
						$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
						$stcoEntriesDataOffset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
			case 'dref': // Data REFerence atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
				$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
				$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
				$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
				$drefDataOffset = 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
				for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
					$atom_structure['data_references'][$i]['size']                    = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
					$drefDataOffset += 4;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1063
					$atom_structure['data_references'][$i]['type']                    =                           substr($atom_data, $drefDataOffset, 4);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
					$drefDataOffset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
					$atom_structure['data_references'][$i]['version']                 = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
					$drefDataOffset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
					$atom_structure['data_references'][$i]['flags_raw']               = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
					$drefDataOffset += 3;
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1069
					$atom_structure['data_references'][$i]['data']                    =                           substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
					$drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
					$atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
			case 'gmin': // base Media INformation atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
				$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
				$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
				$atom_structure['graphics_mode']          = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
				$atom_structure['opcolor_red']            = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
				$atom_structure['opcolor_green']          = getid3_lib::BigEndian2Int(substr($atom_data,  8, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
				$atom_structure['opcolor_blue']           = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
				$atom_structure['balance']                = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
				$atom_structure['reserved']               = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
			case 'smhd': // Sound Media information HeaDer atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
				$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
				$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
				$atom_structure['balance']                = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
				$atom_structure['reserved']               = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
			case 'vmhd': // Video Media information HeaDer atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
				$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
				$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
				$atom_structure['graphics_mode']          = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
				$atom_structure['opcolor_red']            = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
				$atom_structure['opcolor_green']          = getid3_lib::BigEndian2Int(substr($atom_data,  8, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
				$atom_structure['opcolor_blue']           = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
				$atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
			case 'hdlr': // HanDLeR reference atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
				$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
				$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
				$atom_structure['component_type']         =                           substr($atom_data,  4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
				$atom_structure['component_subtype']      =                           substr($atom_data,  8, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
				$atom_structure['component_manufacturer'] =                           substr($atom_data, 12, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
				$atom_structure['component_flags_raw']    = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
				$atom_structure['component_flags_mask']   = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
				$atom_structure['component_name']         =      $this->Pascal2String(substr($atom_data, 24));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
				if (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
					$info['video']['dataformat'] = 'quicktimevr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
			case 'mdhd': // MeDia HeaDer atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
				$atom_structure['version']               = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
				$atom_structure['flags_raw']             = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
				$atom_structure['creation_time']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
				$atom_structure['modify_time']           = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
				$atom_structure['time_scale']            = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
				$atom_structure['duration']              = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
				$atom_structure['language_id']           = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
				$atom_structure['quality']               = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
				if ($atom_structure['time_scale'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1136
					$this->error('Corrupt Quicktime file: mdhd.time_scale == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
				}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1139
				$info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
				$atom_structure['creation_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
				$atom_structure['modify_time_unix']      = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
				$atom_structure['playtime_seconds']      = $atom_structure['duration'] / $atom_structure['time_scale'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
				$atom_structure['language']              = $this->QuicktimeLanguageLookup($atom_structure['language_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
				if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
					$info['comments']['language'][] = $atom_structure['language'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
			case 'pnot': // Preview atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
				$atom_structure['modification_date']      = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // "standard Macintosh format"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
				$atom_structure['version_number']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x00
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1154
				$atom_structure['atom_type']              =                           substr($atom_data,  6, 4);        // usually: 'PICT'
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
				$atom_structure['atom_index']             = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
				$atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
			case 'crgn': // Clipping ReGioN atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
				$atom_structure['region_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2)); // The Region size, Region boundary box,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
				$atom_structure['boundary_box']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 8)); // and Clipping region data fields
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1164
				$atom_structure['clipping_data'] =                           substr($atom_data, 10);           // constitute a QuickDraw region.
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
			case 'load': // track LOAD settings atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
				$atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
				$atom_structure['preload_duration']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
				$atom_structure['preload_flags_raw']  = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
				$atom_structure['default_hints_raw']  = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
				$atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
				$atom_structure['default_hints']['high_quality']  = (bool) ($atom_structure['default_hints_raw'] & 0x0100);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
			case 'tmcd': // TiMe CoDe atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
			case 'chap': // CHAPter list atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
			case 'sync': // SYNChronization atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
			case 'scpt': // tranSCriPT atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
			case 'ssrc': // non-primary SouRCe atom
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1184
				for ($i = 0; $i < strlen($atom_data); $i += 4) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1185
					@$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
			case 'elst': // Edit LiST atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
				$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
				$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
				$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
				for ($i = 0; $i < $atom_structure['number_entries']; $i++ ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
					$atom_structure['edit_list'][$i]['track_duration'] =   getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
					$atom_structure['edit_list'][$i]['media_time']     =   getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
					$atom_structure['edit_list'][$i]['media_rate']     = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
			case 'kmat': // compressed MATte atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
				$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
				$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
				$atom_structure['matte_data_raw'] =               substr($atom_data,  4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
			case 'ctab': // Color TABle atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
				$atom_structure['color_table_seed']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // hardcoded: 0x00000000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
				$atom_structure['color_table_flags']  = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x8000
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
				$atom_structure['color_table_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2)) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
				for ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
					$atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
					$atom_structure['color_table'][$colortableentry]['red']   = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
					$atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
					$atom_structure['color_table'][$colortableentry]['blue']  = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
			case 'mvhd': // MoVie HeaDer atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
				$atom_structure['version']            =   getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
				$atom_structure['flags_raw']          =   getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
				$atom_structure['creation_time']      =   getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
				$atom_structure['modify_time']        =   getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
				$atom_structure['time_scale']         =   getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
				$atom_structure['duration']           =   getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
				$atom_structure['preferred_rate']     = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
				$atom_structure['preferred_volume']   =   getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
				$atom_structure['reserved']           =                             substr($atom_data, 26, 10);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
				$atom_structure['matrix_a']           = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
				$atom_structure['matrix_b']           = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
				$atom_structure['matrix_u']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
				$atom_structure['matrix_c']           = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
				$atom_structure['matrix_d']           = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
				$atom_structure['matrix_v']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
				$atom_structure['matrix_x']           = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
				$atom_structure['matrix_y']           = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
				$atom_structure['matrix_w']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
				$atom_structure['preview_time']       =   getid3_lib::BigEndian2Int(substr($atom_data, 72, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
				$atom_structure['preview_duration']   =   getid3_lib::BigEndian2Int(substr($atom_data, 76, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
				$atom_structure['poster_time']        =   getid3_lib::BigEndian2Int(substr($atom_data, 80, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
				$atom_structure['selection_time']     =   getid3_lib::BigEndian2Int(substr($atom_data, 84, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
				$atom_structure['selection_duration'] =   getid3_lib::BigEndian2Int(substr($atom_data, 88, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
				$atom_structure['current_time']       =   getid3_lib::BigEndian2Int(substr($atom_data, 92, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
				$atom_structure['next_track_id']      =   getid3_lib::BigEndian2Int(substr($atom_data, 96, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
				if ($atom_structure['time_scale'] == 0) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1250
					$this->error('Corrupt Quicktime file: mvhd.time_scale == zero');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
				$atom_structure['creation_time_unix']        = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
				$atom_structure['modify_time_unix']          = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1255
				$info['quicktime']['time_scale']    = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
				$info['quicktime']['display_scale'] = $atom_structure['matrix_a'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
				$info['playtime_seconds']           = $atom_structure['duration'] / $atom_structure['time_scale'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
			case 'tkhd': // TracK HeaDer atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
				$atom_structure['version']             =   getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
				$atom_structure['flags_raw']           =   getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
				$atom_structure['creation_time']       =   getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
				$atom_structure['modify_time']         =   getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
				$atom_structure['trackid']             =   getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
				$atom_structure['reserved1']           =   getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
				$atom_structure['duration']            =   getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
				$atom_structure['reserved2']           =   getid3_lib::BigEndian2Int(substr($atom_data, 24, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
				$atom_structure['layer']               =   getid3_lib::BigEndian2Int(substr($atom_data, 32, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
				$atom_structure['alternate_group']     =   getid3_lib::BigEndian2Int(substr($atom_data, 34, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
				$atom_structure['volume']              =   getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
				$atom_structure['reserved3']           =   getid3_lib::BigEndian2Int(substr($atom_data, 38, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
// http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
// http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
				$atom_structure['matrix_a']            = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
				$atom_structure['matrix_b']            = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
				$atom_structure['matrix_u']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
				$atom_structure['matrix_c']            = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
				$atom_structure['matrix_d']            = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
				$atom_structure['matrix_v']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
				$atom_structure['matrix_x']            = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
				$atom_structure['matrix_y']            = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
				$atom_structure['matrix_w']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
				$atom_structure['width']               = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
				$atom_structure['height']              = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
				$atom_structure['flags']['enabled']    = (bool) ($atom_structure['flags_raw'] & 0x0001);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
				$atom_structure['flags']['in_movie']   = (bool) ($atom_structure['flags_raw'] & 0x0002);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
				$atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
				$atom_structure['flags']['in_poster']  = (bool) ($atom_structure['flags_raw'] & 0x0008);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
				$atom_structure['creation_time_unix']  = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
				$atom_structure['modify_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
				if ($atom_structure['flags']['enabled'] == 1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
					if (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
						$info['video']['resolution_x'] = $atom_structure['width'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
						$info['video']['resolution_y'] = $atom_structure['height'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
					$info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
					$info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
					$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
					$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
				} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
					// see: http://www.getid3.org/phpBB3/viewtopic.php?t=1295
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
					//if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
					//if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
					//if (isset($info['quicktime']['video']))    { unset($info['quicktime']['video']);    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
			case 'iods': // Initial Object DeScriptor atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
				// http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
				// http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
				$offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
				$atom_structure['version']                =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
				$atom_structure['flags_raw']              =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
				$offset += 3;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
				$atom_structure['mp4_iod_tag']            =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
				$atom_structure['length']                 = $this->quicktime_read_mp4_descr_length($atom_data, $offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
				//$offset already adjusted by quicktime_read_mp4_descr_length()
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
				$atom_structure['object_descriptor_id']   =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
				$offset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
				$atom_structure['od_profile_level']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
				$atom_structure['scene_profile_level']    =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
				$atom_structure['audio_profile_id']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
				$atom_structure['video_profile_id']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
				$atom_structure['graphics_profile_level'] =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
				$atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
				for ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
					$atom_structure['track'][$i]['ES_ID_IncTag'] =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
					$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
					$atom_structure['track'][$i]['length']       = $this->quicktime_read_mp4_descr_length($atom_data, $offset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
					//$offset already adjusted by quicktime_read_mp4_descr_length()
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
					$atom_structure['track'][$i]['track_id']     =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
					$offset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
				$atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
				$atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
			case 'ftyp': // FileTYPe (?) atom (for MP4 it seems)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
				$atom_structure['signature'] =                           substr($atom_data,  0, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
				$atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
				$atom_structure['fourcc']    =                           substr($atom_data,  8, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
			case 'mdat': // Media DATa atom
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1358
				// 'mdat' contains the actual data for the audio/video, possibly also subtitles
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1359
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1360
/* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1361
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1362
				// first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1363
				$mdat_offset = 0;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1364
				while (true) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1365
					if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1366
						$mdat_offset += 8;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1367
					} elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1368
						$mdat_offset += 8;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1369
					} else {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1370
						break;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1371
					}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1372
				}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1373
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1374
				// check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1375
				while (($mdat_offset < (strlen($atom_data) - 8))
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1376
					&& ($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1377
					&& ($chapter_string_length < 1000)
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1378
					&& ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2))
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1379
					&& preg_match('#^([\x00-\xFF]{2})([\x20-\xFF]+)$#', substr($atom_data, $mdat_offset, $chapter_string_length + 2), $chapter_matches)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1380
						list($dummy, $chapter_string_length_hex, $chapter_string) = $chapter_matches;
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1381
						$mdat_offset += (2 + $chapter_string_length);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1382
						@$info['quicktime']['comments']['chapters'][] = $chapter_string;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1383
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1384
						// "encd" atom specifies encoding. In theory could be anything, almost always UTF-8, but may be UTF-16 with BOM (not currently handled)
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1385
						if (substr($atom_data, $mdat_offset, 12) == "\x00\x00\x00\x0C\x65\x6E\x63\x64\x00\x00\x01\x00") { // UTF-8
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1386
							$mdat_offset += 12;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1387
						}
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1388
				}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1389
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1390
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1391
				if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1392
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1393
					$info['avdataoffset'] = $atom_structure['offset'] + 8;                       // $info['quicktime'][$atomname]['offset'] + 8;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1394
					$OldAVDataEnd         = $info['avdataend'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1395
					$info['avdataend']    = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1396
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1397
					$getid3_temp = new getID3();
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1398
					$getid3_temp->openfile($this->getid3->filename);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1399
					$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1400
					$getid3_temp->info['avdataend']    = $info['avdataend'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1401
					$getid3_mp3 = new getid3_mp3($getid3_temp);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1402
					if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1403
						$getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1404
						if (!empty($getid3_temp->info['warning'])) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1405
							foreach ($getid3_temp->info['warning'] as $value) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1406
								$this->warning($value);
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1407
							}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1408
						}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1409
						if (!empty($getid3_temp->info['mpeg'])) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1410
							$info['mpeg'] = $getid3_temp->info['mpeg'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1411
							if (isset($info['mpeg']['audio'])) {
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1412
								$info['audio']['dataformat']   = 'mp3';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1413
								$info['audio']['codec']        = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3')));
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1414
								$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1415
								$info['audio']['channels']     = $info['mpeg']['audio']['channels'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1416
								$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1417
								$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1418
								$info['bitrate']               = $info['audio']['bitrate'];
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1419
							}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1420
						}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1421
					}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1422
					unset($getid3_mp3, $getid3_temp);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1423
					$info['avdataend'] = $OldAVDataEnd;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1424
					unset($OldAVDataEnd);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1425
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1426
				}
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1427
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1428
				unset($mdat_offset, $chapter_string_length, $chapter_matches);
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1429
				break;
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1430
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
			case 'free': // FREE space atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
			case 'skip': // SKIP atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
			case 'wide': // 64-bit expansion placeholder atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
				// 'free', 'skip' and 'wide' are just padding, contains no useful data at all
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
				// When writing QuickTime files, it is sometimes necessary to update an atom's size.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
				// It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
				// is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
				// puts an 8-byte placeholder atom before any atoms it may have to update the size of.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
				// In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
				// placeholder atom can be overwritten to obtain the necessary 8 extra bytes.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
				// The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
			case 'nsav': // NoSAVe atom
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
				// http://developer.apple.com/technotes/tn/tn2038.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
				$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
			case 'ctyp': // Controller TYPe atom (seen on QTVR)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
				// http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
				// some controller names are:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
				//   0x00 + 'std' for linear movie
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
				//   'none' for no controls
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
				$atom_structure['ctyp'] = substr($atom_data, 0, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
				$info['quicktime']['controller'] = $atom_structure['ctyp'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
				switch ($atom_structure['ctyp']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
					case 'qtvr':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
						$info['video']['dataformat'] = 'quicktimevr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
						break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
			case 'pano': // PANOrama track (seen on QTVR)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
				$atom_structure['pano'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1468
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
			case 'hint': // HINT track
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
			case 'hinf': //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
			case 'hinv': //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
			case 'hnti': //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
				$info['quicktime']['hinting'] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
			case 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
				for ($i = 0; $i < ($atom_structure['size'] - 8); $i += 4) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
					$atom_structure['imgt'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
			// Observed-but-not-handled atom types are just listed here to prevent warnings being generated
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
			case 'FXTC': // Something to do with Adobe After Effects (?)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
			case 'PrmA':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
			case 'code':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
			case 'FIEL': // this is NOT "fiel" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
			case 'tapt': // TrackApertureModeDimensionsAID - http://developer.apple.com/documentation/QuickTime/Reference/QT7-1_Update_Reference/Constants/Constants.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
						// tapt seems to be used to compute the video size [http://www.getid3.org/phpBB3/viewtopic.php?t=838]
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
						// * http://lists.apple.com/archives/quicktime-api/2006/Aug/msg00014.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
						// * http://handbrake.fr/irclogs/handbrake-dev/handbrake-dev20080128_pg2.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
			case 'ctts'://  STCompositionOffsetAID             - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
			case 'cslg'://  STCompositionShiftLeastGreatestAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
			case 'sdtp'://  STSampleDependencyAID              - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
			case 'stps'://  STPartialSyncSampleAID             - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
				//$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1499
			case "\xA9".'xyz':  // GPS latitude+longitude+altitude
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
				$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
				if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
					@list($all, $latitude, $longitude, $altitude) = $matches;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
					$info['quicktime']['comments']['gps_latitude'][]  = floatval($latitude);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
					$info['quicktime']['comments']['gps_longitude'][] = floatval($longitude);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
					if (!empty($altitude)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
						$info['quicktime']['comments']['gps_altitude'][] = floatval($altitude);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
				} else {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1509
					$this->warning('QuickTime atom "©xyz" data does not match expected data pattern at offset '.$baseoffset.'. Please report as getID3() bug.');
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
			case 'NCDT':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
				// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
				// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
				$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
			case 'NCTH': // Nikon Camera THumbnail image
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
			case 'NCVW': // Nikon Camera preVieW image
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
				// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
				if (preg_match('/^\xFF\xD8\xFF/', $atom_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
					$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
					$atom_structure['image_mime'] = 'image/jpeg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
					$atom_structure['description'] = (($atomname == 'NCTH') ? 'Nikon Camera Thumbnail Image' : (($atomname == 'NCVW') ? 'Nikon Camera Preview Image' : 'Nikon preview image'));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
					$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_data, 'description'=>$atom_structure['description']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
				break;
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1528
			case 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
				$atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
				break;
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1531
			case 'NCHD': // Nikon:MakerNoteVersion  - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1532
			case 'NCDB': // Nikon                   - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  1533
			case 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
				$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
			case "\x00\x00\x00\x00":
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
				// some kind of metacontainer, may contain a big data dump such as:
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1539
				// mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
				// http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1542
				$atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1543
				$atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1544
				$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
				//$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1548
			case 'meta': // METAdata atom
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1549
				// https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1550
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1551
				$atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1552
				$atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1553
				$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1554
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1555
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
			case 'data': // metaDATA atom
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1557
				static $metaDATAkey = 1; // real ugly, but so is the QuickTime structure that stores keys and values in different multinested locations that are hard to relate to each other
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
				// seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
				$atom_structure['language'] =                           substr($atom_data, 4 + 0, 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
				$atom_structure['unknown']  = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
				$atom_structure['data']     =                           substr($atom_data, 4 + 4);
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1562
				$atom_structure['key_name'] = @$info['quicktime']['temp_meta_key_names'][$metaDATAkey++];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1563
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1564
				if ($atom_structure['key_name'] && $atom_structure['data']) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1565
					@$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1566
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1567
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1568
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1569
			case 'keys': // KEYS that may be present in the metadata atom.
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1570
				// https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW21
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1571
				// The metadata item keys atom holds a list of the metadata keys that may be present in the metadata atom.
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1572
				// This list is indexed starting with 1; 0 is a reserved index value. The metadata item keys atom is a full atom with an atom type of "keys".
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1573
				$atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1574
				$atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1575
				$atom_structure['entry_count']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1576
				$keys_atom_offset = 8;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1577
				for ($i = 1; $i <= $atom_structure['entry_count']; $i++) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1578
					$atom_structure['keys'][$i]['key_size']      = getid3_lib::BigEndian2Int(substr($atom_data, $keys_atom_offset + 0, 4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1579
					$atom_structure['keys'][$i]['key_namespace'] =                           substr($atom_data, $keys_atom_offset + 4, 4);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1580
					$atom_structure['keys'][$i]['key_value']     =                           substr($atom_data, $keys_atom_offset + 8, $atom_structure['keys'][$i]['key_size'] - 8);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1581
					$keys_atom_offset += $atom_structure['keys'][$i]['key_size']; // key_size includes the 4+4 bytes for key_size and key_namespace
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1582
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1583
					$info['quicktime']['temp_meta_key_names'][$i] = $atom_structure['keys'][$i]['key_value'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1584
				}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1587
			case 'gps ':
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1588
				// https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1589
				// The 'gps ' contains simple look up table made up of 8byte rows, that point to the 'free' atoms that contains the actual GPS data.
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1590
				// The first row is version/metadata/notsure, I skip that.
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1591
				// The following rows consist of 4byte address (absolute) and 4byte size (0x1000), these point to the GPS data in the file.
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1592
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1593
				$GPS_rowsize = 8; // 4 bytes for offset, 4 bytes for size
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1594
				if (strlen($atom_data) > 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1595
					if ((strlen($atom_data) % $GPS_rowsize) == 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1596
						$atom_structure['gps_toc'] = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1597
						foreach (str_split($atom_data, $GPS_rowsize) as $counter => $datapair) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1598
							$atom_structure['gps_toc'][] = unpack('Noffset/Nsize', substr($atom_data, $counter * $GPS_rowsize, $GPS_rowsize));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1599
						}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1600
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1601
						$atom_structure['gps_entries'] = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1602
						$previous_offset = $this->ftell();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1603
						foreach ($atom_structure['gps_toc'] as $key => $gps_pointer) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1604
							if ($key == 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1605
								// "The first row is version/metadata/notsure, I skip that."
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1606
								continue;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1607
							}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1608
							$this->fseek($gps_pointer['offset']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1609
							$GPS_free_data = $this->fread($gps_pointer['size']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1610
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1611
							/*
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1612
							// 2017-05-10: I see some of the data, notably the Hour-Minute-Second, but cannot reconcile the rest of the data. However, the NMEA "GPRMC" line is there and relatively easy to parse, so I'm using that instead
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1613
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1614
							// https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1615
							// The structure of the GPS data atom (the 'free' atoms mentioned above) is following:
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1616
							// hour,minute,second,year,month,day,active,latitude_b,longitude_b,unknown2,latitude,longitude,speed = struct.unpack_from('<IIIIIIssssfff',data, 48)
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1617
							// For those unfamiliar with python struct:
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1618
							// I = int
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1619
							// s = is string (size 1, in this case)
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1620
							// f = float
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1621
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1622
							//$atom_structure['gps_entries'][$key] = unpack('Vhour/Vminute/Vsecond/Vyear/Vmonth/Vday/Vactive/Vlatitude_b/Vlongitude_b/Vunknown2/flatitude/flongitude/fspeed', substr($GPS_free_data, 48));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1623
							*/
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1624
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1625
							// $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1626
							// $GPRMC,183731,A,3907.482,N,12102.436,W,000.0,360.0,080301,015.5,E*67
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1627
							// $GPRMC,002454,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3F
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1628
							// $GPRMC,094347.000,A,5342.0061,N,00737.9908,W,0.01,156.75,140217,,,A*7D
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1629
							if (preg_match('#\\$GPRMC,([0-9\\.]*),([AV]),([0-9\\.]*),([NS]),([0-9\\.]*),([EW]),([0-9\\.]*),([0-9\\.]*),([0-9]*),([0-9\\.]*),([EW]?)(,[A])?(\\*[0-9A-F]{2})#', $GPS_free_data, $matches)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1630
								$GPS_this_GPRMC = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1631
								list(
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1632
									$GPS_this_GPRMC['raw']['gprmc'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1633
									$GPS_this_GPRMC['raw']['timestamp'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1634
									$GPS_this_GPRMC['raw']['status'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1635
									$GPS_this_GPRMC['raw']['latitude'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1636
									$GPS_this_GPRMC['raw']['latitude_direction'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1637
									$GPS_this_GPRMC['raw']['longitude'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1638
									$GPS_this_GPRMC['raw']['longitude_direction'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1639
									$GPS_this_GPRMC['raw']['knots'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1640
									$GPS_this_GPRMC['raw']['angle'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1641
									$GPS_this_GPRMC['raw']['datestamp'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1642
									$GPS_this_GPRMC['raw']['variation'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1643
									$GPS_this_GPRMC['raw']['variation_direction'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1644
									$dummy,
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1645
									$GPS_this_GPRMC['raw']['checksum'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1646
								) = $matches;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1647
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1648
								$hour   = substr($GPS_this_GPRMC['raw']['timestamp'], 0, 2);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1649
								$minute = substr($GPS_this_GPRMC['raw']['timestamp'], 2, 2);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1650
								$second = substr($GPS_this_GPRMC['raw']['timestamp'], 4, 2);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1651
								$ms     = substr($GPS_this_GPRMC['raw']['timestamp'], 6);    // may contain decimal seconds
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1652
								$day   = substr($GPS_this_GPRMC['raw']['datestamp'], 0, 2);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1653
								$month = substr($GPS_this_GPRMC['raw']['datestamp'], 2, 2);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1654
								$year  = substr($GPS_this_GPRMC['raw']['datestamp'], 4, 2);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1655
								$year += (($year > 90) ? 1900 : 2000); // complete lack of foresight: datestamps are stored with 2-digit years, take best guess
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1656
								$GPS_this_GPRMC['timestamp'] = $year.'-'.$month.'-'.$day.' '.$hour.':'.$minute.':'.$second.$ms;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1657
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1658
								$GPS_this_GPRMC['active'] = ($GPS_this_GPRMC['raw']['status'] == 'A'); // A=Active,V=Void
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1659
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1660
								foreach (array('latitude','longitude') as $latlon) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1661
									preg_match('#^([0-9]{1,3})([0-9]{2}\\.[0-9]+)$#', $GPS_this_GPRMC['raw'][$latlon], $matches);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1662
									list($dummy, $deg, $min) = $matches;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1663
									$GPS_this_GPRMC[$latlon] = $deg + ($min / 60);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1664
								}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1665
								$GPS_this_GPRMC['latitude']  *= (($GPS_this_GPRMC['raw']['latitude_direction']  == 'S') ? -1 : 1);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1666
								$GPS_this_GPRMC['longitude'] *= (($GPS_this_GPRMC['raw']['longitude_direction'] == 'W') ? -1 : 1);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1667
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1668
								$GPS_this_GPRMC['heading']    = $GPS_this_GPRMC['raw']['angle'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1669
								$GPS_this_GPRMC['speed_knot'] = $GPS_this_GPRMC['raw']['knots'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1670
								$GPS_this_GPRMC['speed_kmh']  = $GPS_this_GPRMC['raw']['knots'] * 1.852;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1671
								if ($GPS_this_GPRMC['raw']['variation']) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1672
									$GPS_this_GPRMC['variation']  = $GPS_this_GPRMC['raw']['variation'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1673
									$GPS_this_GPRMC['variation'] *= (($GPS_this_GPRMC['raw']['variation_direction'] == 'W') ? -1 : 1);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1674
								}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1675
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1676
								$atom_structure['gps_entries'][$key] = $GPS_this_GPRMC;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1677
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1678
								@$info['quicktime']['gps_track'][$GPS_this_GPRMC['timestamp']] = array(
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1679
									'latitude'  => $GPS_this_GPRMC['latitude'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1680
									'longitude' => $GPS_this_GPRMC['longitude'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1681
									'speed_kmh' => $GPS_this_GPRMC['speed_kmh'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1682
									'heading'   => $GPS_this_GPRMC['heading'],
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1683
								);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1684
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1685
							} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1686
								$this->warning('Unhandled GPS format in "free" atom at offset '.$gps_pointer['offset']);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1687
							}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1688
						}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1689
						$this->fseek($previous_offset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1690
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1691
					} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1692
						$this->warning('QuickTime atom "'.$atomname.'" is not mod-8 bytes long ('.$atomsize.' bytes) at offset '.$baseoffset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1693
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1694
				} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1695
					$this->warning('QuickTime atom "'.$atomname.'" is zero bytes long at offset '.$baseoffset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1696
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1697
				break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1698
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1699
			case 'loci':// 3GP location (El Loco)
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1700
                                $info['quicktime']['comments']['gps_flags'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1701
                                $info['quicktime']['comments']['gps_lang'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1702
                                $loffset = 0;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1703
                                $info['quicktime']['comments']['gps_location'] = $this->LociString(substr($atom_data, 6), $loffset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1704
                                $loci_data=substr($atom_data, 6 + $loffset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1705
                                $info['quicktime']['comments']['gps_role'] = getid3_lib::BigEndian2Int(substr($loci_data, 0, 1));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1706
                                $info['quicktime']['comments']['gps_longitude'] = getid3_lib::FixedPoint16_16(substr($loci_data, 1, 4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1707
                                $info['quicktime']['comments']['gps_latitude'] = getid3_lib::FixedPoint16_16(substr($loci_data, 5, 4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1708
                                $info['quicktime']['comments']['gps_altitude'] = getid3_lib::FixedPoint16_16(substr($loci_data, 9, 4));
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1709
                                $info['quicktime']['comments']['gps_body'] = $this->LociString(substr($loci_data, 13), $loffset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1710
                                $info['quicktime']['comments']['gps_notes'] = $this->LociString(substr($loci_data, 13 + $loffset), $loffset);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1711
                                break;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1712
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
			default:
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1714
				$this->warning('Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).') at offset '.$baseoffset);
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
				$atom_structure['data'] = $atom_data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
		array_pop($atomHierarchy);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
		return $atom_structure;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
	public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
//echo 'QuicktimeParseContainerAtom('.substr($atom_data, 4, 4).') @ '.$baseoffset.'<br><br>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
		$atom_structure  = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
		$subatomoffset  = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
		$subatomcounter = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
		if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1728
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1729
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
		while ($subatomoffset < strlen($atom_data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
			$subatomsize = getid3_lib::BigEndian2Int(substr($atom_data, $subatomoffset + 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
			$subatomname =                           substr($atom_data, $subatomoffset + 4, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
			$subatomdata =                           substr($atom_data, $subatomoffset + 8, $subatomsize - 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
			if ($subatomsize == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
				// Furthermore, for historical reasons the list of atoms is optionally
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
				// terminated by a 32-bit integer set to 0. If you are writing a program
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
				// to read user data atoms, you should allow for the terminating 0.
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1738
				if (strlen($atom_data) > 12) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1739
					$subatomoffset += 4;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1740
					continue;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  1741
				}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1742
				return $atom_structure;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
			$atom_structure[$subatomcounter] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
			$subatomoffset += $subatomsize;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
			$subatomcounter++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
		return $atom_structure;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
	public function quicktime_read_mp4_descr_length($data, &$offset) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
		// http://libquicktime.sourcearchive.com/documentation/2:1.0.2plus-pdebian-2build1/esds_8c-source.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1756
		$num_bytes = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1757
		$length    = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
		do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
			$b = ord(substr($data, $offset++, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
			$length = ($length << 7) | ($b & 0x7F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
		} while (($b & 0x80) && ($num_bytes++ < 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
		return $length;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1766
	public function QuicktimeLanguageLookup($languageid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1767
		// http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-34353
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1768
		static $QuicktimeLanguageLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1769
		if (empty($QuicktimeLanguageLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1770
			$QuicktimeLanguageLookup[0]     = 'English';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1771
			$QuicktimeLanguageLookup[1]     = 'French';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1772
			$QuicktimeLanguageLookup[2]     = 'German';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1773
			$QuicktimeLanguageLookup[3]     = 'Italian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1774
			$QuicktimeLanguageLookup[4]     = 'Dutch';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1775
			$QuicktimeLanguageLookup[5]     = 'Swedish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1776
			$QuicktimeLanguageLookup[6]     = 'Spanish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1777
			$QuicktimeLanguageLookup[7]     = 'Danish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1778
			$QuicktimeLanguageLookup[8]     = 'Portuguese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1779
			$QuicktimeLanguageLookup[9]     = 'Norwegian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1780
			$QuicktimeLanguageLookup[10]    = 'Hebrew';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1781
			$QuicktimeLanguageLookup[11]    = 'Japanese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1782
			$QuicktimeLanguageLookup[12]    = 'Arabic';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1783
			$QuicktimeLanguageLookup[13]    = 'Finnish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1784
			$QuicktimeLanguageLookup[14]    = 'Greek';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1785
			$QuicktimeLanguageLookup[15]    = 'Icelandic';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1786
			$QuicktimeLanguageLookup[16]    = 'Maltese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1787
			$QuicktimeLanguageLookup[17]    = 'Turkish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1788
			$QuicktimeLanguageLookup[18]    = 'Croatian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1789
			$QuicktimeLanguageLookup[19]    = 'Chinese (Traditional)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1790
			$QuicktimeLanguageLookup[20]    = 'Urdu';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1791
			$QuicktimeLanguageLookup[21]    = 'Hindi';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1792
			$QuicktimeLanguageLookup[22]    = 'Thai';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1793
			$QuicktimeLanguageLookup[23]    = 'Korean';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1794
			$QuicktimeLanguageLookup[24]    = 'Lithuanian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1795
			$QuicktimeLanguageLookup[25]    = 'Polish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1796
			$QuicktimeLanguageLookup[26]    = 'Hungarian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1797
			$QuicktimeLanguageLookup[27]    = 'Estonian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1798
			$QuicktimeLanguageLookup[28]    = 'Lettish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1799
			$QuicktimeLanguageLookup[28]    = 'Latvian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1800
			$QuicktimeLanguageLookup[29]    = 'Saamisk';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1801
			$QuicktimeLanguageLookup[29]    = 'Lappish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1802
			$QuicktimeLanguageLookup[30]    = 'Faeroese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1803
			$QuicktimeLanguageLookup[31]    = 'Farsi';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1804
			$QuicktimeLanguageLookup[31]    = 'Persian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1805
			$QuicktimeLanguageLookup[32]    = 'Russian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1806
			$QuicktimeLanguageLookup[33]    = 'Chinese (Simplified)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1807
			$QuicktimeLanguageLookup[34]    = 'Flemish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1808
			$QuicktimeLanguageLookup[35]    = 'Irish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1809
			$QuicktimeLanguageLookup[36]    = 'Albanian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1810
			$QuicktimeLanguageLookup[37]    = 'Romanian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1811
			$QuicktimeLanguageLookup[38]    = 'Czech';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1812
			$QuicktimeLanguageLookup[39]    = 'Slovak';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1813
			$QuicktimeLanguageLookup[40]    = 'Slovenian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1814
			$QuicktimeLanguageLookup[41]    = 'Yiddish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1815
			$QuicktimeLanguageLookup[42]    = 'Serbian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1816
			$QuicktimeLanguageLookup[43]    = 'Macedonian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1817
			$QuicktimeLanguageLookup[44]    = 'Bulgarian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1818
			$QuicktimeLanguageLookup[45]    = 'Ukrainian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1819
			$QuicktimeLanguageLookup[46]    = 'Byelorussian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1820
			$QuicktimeLanguageLookup[47]    = 'Uzbek';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1821
			$QuicktimeLanguageLookup[48]    = 'Kazakh';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1822
			$QuicktimeLanguageLookup[49]    = 'Azerbaijani';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1823
			$QuicktimeLanguageLookup[50]    = 'AzerbaijanAr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1824
			$QuicktimeLanguageLookup[51]    = 'Armenian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1825
			$QuicktimeLanguageLookup[52]    = 'Georgian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1826
			$QuicktimeLanguageLookup[53]    = 'Moldavian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1827
			$QuicktimeLanguageLookup[54]    = 'Kirghiz';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1828
			$QuicktimeLanguageLookup[55]    = 'Tajiki';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1829
			$QuicktimeLanguageLookup[56]    = 'Turkmen';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1830
			$QuicktimeLanguageLookup[57]    = 'Mongolian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1831
			$QuicktimeLanguageLookup[58]    = 'MongolianCyr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1832
			$QuicktimeLanguageLookup[59]    = 'Pashto';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1833
			$QuicktimeLanguageLookup[60]    = 'Kurdish';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1834
			$QuicktimeLanguageLookup[61]    = 'Kashmiri';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1835
			$QuicktimeLanguageLookup[62]    = 'Sindhi';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1836
			$QuicktimeLanguageLookup[63]    = 'Tibetan';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1837
			$QuicktimeLanguageLookup[64]    = 'Nepali';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1838
			$QuicktimeLanguageLookup[65]    = 'Sanskrit';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1839
			$QuicktimeLanguageLookup[66]    = 'Marathi';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1840
			$QuicktimeLanguageLookup[67]    = 'Bengali';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1841
			$QuicktimeLanguageLookup[68]    = 'Assamese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1842
			$QuicktimeLanguageLookup[69]    = 'Gujarati';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1843
			$QuicktimeLanguageLookup[70]    = 'Punjabi';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1844
			$QuicktimeLanguageLookup[71]    = 'Oriya';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1845
			$QuicktimeLanguageLookup[72]    = 'Malayalam';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1846
			$QuicktimeLanguageLookup[73]    = 'Kannada';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1847
			$QuicktimeLanguageLookup[74]    = 'Tamil';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1848
			$QuicktimeLanguageLookup[75]    = 'Telugu';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1849
			$QuicktimeLanguageLookup[76]    = 'Sinhalese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1850
			$QuicktimeLanguageLookup[77]    = 'Burmese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1851
			$QuicktimeLanguageLookup[78]    = 'Khmer';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1852
			$QuicktimeLanguageLookup[79]    = 'Lao';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1853
			$QuicktimeLanguageLookup[80]    = 'Vietnamese';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1854
			$QuicktimeLanguageLookup[81]    = 'Indonesian';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1855
			$QuicktimeLanguageLookup[82]    = 'Tagalog';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1856
			$QuicktimeLanguageLookup[83]    = 'MalayRoman';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1857
			$QuicktimeLanguageLookup[84]    = 'MalayArabic';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1858
			$QuicktimeLanguageLookup[85]    = 'Amharic';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1859
			$QuicktimeLanguageLookup[86]    = 'Tigrinya';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1860
			$QuicktimeLanguageLookup[87]    = 'Galla';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1861
			$QuicktimeLanguageLookup[87]    = 'Oromo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1862
			$QuicktimeLanguageLookup[88]    = 'Somali';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1863
			$QuicktimeLanguageLookup[89]    = 'Swahili';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1864
			$QuicktimeLanguageLookup[90]    = 'Ruanda';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1865
			$QuicktimeLanguageLookup[91]    = 'Rundi';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1866
			$QuicktimeLanguageLookup[92]    = 'Chewa';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1867
			$QuicktimeLanguageLookup[93]    = 'Malagasy';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1868
			$QuicktimeLanguageLookup[94]    = 'Esperanto';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1869
			$QuicktimeLanguageLookup[128]   = 'Welsh';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1870
			$QuicktimeLanguageLookup[129]   = 'Basque';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1871
			$QuicktimeLanguageLookup[130]   = 'Catalan';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1872
			$QuicktimeLanguageLookup[131]   = 'Latin';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1873
			$QuicktimeLanguageLookup[132]   = 'Quechua';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1874
			$QuicktimeLanguageLookup[133]   = 'Guarani';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1875
			$QuicktimeLanguageLookup[134]   = 'Aymara';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1876
			$QuicktimeLanguageLookup[135]   = 'Tatar';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1877
			$QuicktimeLanguageLookup[136]   = 'Uighur';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1878
			$QuicktimeLanguageLookup[137]   = 'Dzongkha';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1879
			$QuicktimeLanguageLookup[138]   = 'JavaneseRom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1880
			$QuicktimeLanguageLookup[32767] = 'Unspecified';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1881
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1882
		if (($languageid > 138) && ($languageid < 32767)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1883
			/*
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1884
			ISO Language Codes - http://www.loc.gov/standards/iso639-2/php/code_list.php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1885
			Because the language codes specified by ISO 639-2/T are three characters long, they must be packed to fit into a 16-bit field.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1886
			The packing algorithm must map each of the three characters, which are always lowercase, into a 5-bit integer and then concatenate
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1887
			these integers into the least significant 15 bits of a 16-bit integer, leaving the 16-bit integer's most significant bit set to zero.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1888
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1889
			One algorithm for performing this packing is to treat each ISO character as a 16-bit integer. Subtract 0x60 from the first character
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1890
			and multiply by 2^10 (0x400), subtract 0x60 from the second character and multiply by 2^5 (0x20), subtract 0x60 from the third character,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1891
			and add the three 16-bit values. This will result in a single 16-bit value with the three codes correctly packed into the 15 least
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1892
			significant bits and the most significant bit set to zero.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1893
			*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1894
			$iso_language_id  = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1895
			$iso_language_id .= chr((($languageid & 0x7C00) >> 10) + 0x60);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1896
			$iso_language_id .= chr((($languageid & 0x03E0) >>  5) + 0x60);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1897
			$iso_language_id .= chr((($languageid & 0x001F) >>  0) + 0x60);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1898
			$QuicktimeLanguageLookup[$languageid] = getid3_id3v2::LanguageLookup($iso_language_id);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1899
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1900
		return (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1901
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1902
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1903
	public function QuicktimeVideoCodecLookup($codecid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1904
		static $QuicktimeVideoCodecLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1905
		if (empty($QuicktimeVideoCodecLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1906
			$QuicktimeVideoCodecLookup['.SGI'] = 'SGI';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1907
			$QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1908
			$QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1909
			$QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1910
			$QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1911
			$QuicktimeVideoCodecLookup['avc1'] = 'H.264/MPEG-4 AVC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1912
			$QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1913
			$QuicktimeVideoCodecLookup['b16g'] = '16Gray';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1914
			$QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1915
			$QuicktimeVideoCodecLookup['b48r'] = '48RGB';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1916
			$QuicktimeVideoCodecLookup['b64a'] = '64ARGB';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1917
			$QuicktimeVideoCodecLookup['base'] = 'Base';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1918
			$QuicktimeVideoCodecLookup['clou'] = 'Cloud';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1919
			$QuicktimeVideoCodecLookup['cmyk'] = 'CMYK';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1920
			$QuicktimeVideoCodecLookup['cvid'] = 'Cinepak';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1921
			$QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1922
			$QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1923
			$QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1924
			$QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1925
			$QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1926
			$QuicktimeVideoCodecLookup['fire'] = 'Fire';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1927
			$QuicktimeVideoCodecLookup['flic'] = 'FLC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1928
			$QuicktimeVideoCodecLookup['gif '] = 'GIF';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1929
			$QuicktimeVideoCodecLookup['h261'] = 'H261';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1930
			$QuicktimeVideoCodecLookup['h263'] = 'H263';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1931
			$QuicktimeVideoCodecLookup['IV41'] = 'Indeo4';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1932
			$QuicktimeVideoCodecLookup['jpeg'] = 'JPEG';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1933
			$QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1934
			$QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1935
			$QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1936
			$QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1937
			$QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1938
			$QuicktimeVideoCodecLookup['path'] = 'Vector';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1939
			$QuicktimeVideoCodecLookup['png '] = 'PNG';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1940
			$QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1941
			$QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1942
			$QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1943
			$QuicktimeVideoCodecLookup['raw '] = 'RAW';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1944
			$QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1945
			$QuicktimeVideoCodecLookup['rpza'] = 'Video';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1946
			$QuicktimeVideoCodecLookup['smc '] = 'Graphics';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1947
			$QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1948
			$QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1949
			$QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1950
			$QuicktimeVideoCodecLookup['tga '] = 'Targa';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1951
			$QuicktimeVideoCodecLookup['tiff'] = 'TIFF';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1952
			$QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1953
			$QuicktimeVideoCodecLookup['WRLE'] = 'BMP';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1954
			$QuicktimeVideoCodecLookup['y420'] = 'YUV420';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1955
			$QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1956
			$QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1957
			$QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1958
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1959
		return (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1960
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1961
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1962
	public function QuicktimeAudioCodecLookup($codecid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1963
		static $QuicktimeAudioCodecLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1964
		if (empty($QuicktimeAudioCodecLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1965
			$QuicktimeAudioCodecLookup['.mp3']          = 'Fraunhofer MPEG Layer-III alias';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1966
			$QuicktimeAudioCodecLookup['aac ']          = 'ISO/IEC 14496-3 AAC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1967
			$QuicktimeAudioCodecLookup['agsm']          = 'Apple GSM 10:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1968
			$QuicktimeAudioCodecLookup['alac']          = 'Apple Lossless Audio Codec';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1969
			$QuicktimeAudioCodecLookup['alaw']          = 'A-law 2:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1970
			$QuicktimeAudioCodecLookup['conv']          = 'Sample Format';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1971
			$QuicktimeAudioCodecLookup['dvca']          = 'DV';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1972
			$QuicktimeAudioCodecLookup['dvi ']          = 'DV 4:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1973
			$QuicktimeAudioCodecLookup['eqal']          = 'Frequency Equalizer';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1974
			$QuicktimeAudioCodecLookup['fl32']          = '32-bit Floating Point';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1975
			$QuicktimeAudioCodecLookup['fl64']          = '64-bit Floating Point';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1976
			$QuicktimeAudioCodecLookup['ima4']          = 'Interactive Multimedia Association 4:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1977
			$QuicktimeAudioCodecLookup['in24']          = '24-bit Integer';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1978
			$QuicktimeAudioCodecLookup['in32']          = '32-bit Integer';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1979
			$QuicktimeAudioCodecLookup['lpc ']          = 'LPC 23:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1980
			$QuicktimeAudioCodecLookup['MAC3']          = 'Macintosh Audio Compression/Expansion (MACE) 3:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1981
			$QuicktimeAudioCodecLookup['MAC6']          = 'Macintosh Audio Compression/Expansion (MACE) 6:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1982
			$QuicktimeAudioCodecLookup['mixb']          = '8-bit Mixer';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1983
			$QuicktimeAudioCodecLookup['mixw']          = '16-bit Mixer';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1984
			$QuicktimeAudioCodecLookup['mp4a']          = 'ISO/IEC 14496-3 AAC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1985
			$QuicktimeAudioCodecLookup['MS'."\x00\x02"] = 'Microsoft ADPCM';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1986
			$QuicktimeAudioCodecLookup['MS'."\x00\x11"] = 'DV IMA';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1987
			$QuicktimeAudioCodecLookup['MS'."\x00\x55"] = 'Fraunhofer MPEG Layer III';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1988
			$QuicktimeAudioCodecLookup['NONE']          = 'No Encoding';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1989
			$QuicktimeAudioCodecLookup['Qclp']          = 'Qualcomm PureVoice';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1990
			$QuicktimeAudioCodecLookup['QDM2']          = 'QDesign Music 2';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1991
			$QuicktimeAudioCodecLookup['QDMC']          = 'QDesign Music 1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1992
			$QuicktimeAudioCodecLookup['ratb']          = '8-bit Rate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1993
			$QuicktimeAudioCodecLookup['ratw']          = '16-bit Rate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1994
			$QuicktimeAudioCodecLookup['raw ']          = 'raw PCM';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1995
			$QuicktimeAudioCodecLookup['sour']          = 'Sound Source';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1996
			$QuicktimeAudioCodecLookup['sowt']          = 'signed/two\'s complement (Little Endian)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1997
			$QuicktimeAudioCodecLookup['str1']          = 'Iomega MPEG layer II';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1998
			$QuicktimeAudioCodecLookup['str2']          = 'Iomega MPEG *layer II';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1999
			$QuicktimeAudioCodecLookup['str3']          = 'Iomega MPEG **layer II';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2000
			$QuicktimeAudioCodecLookup['str4']          = 'Iomega MPEG ***layer II';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2001
			$QuicktimeAudioCodecLookup['twos']          = 'signed/two\'s complement (Big Endian)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2002
			$QuicktimeAudioCodecLookup['ulaw']          = 'mu-law 2:1';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2003
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2004
		return (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2005
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2006
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2007
	public function QuicktimeDCOMLookup($compressionid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2008
		static $QuicktimeDCOMLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2009
		if (empty($QuicktimeDCOMLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2010
			$QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2011
			$QuicktimeDCOMLookup['adec'] = 'Apple Compression';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2012
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2013
		return (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : '');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2014
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2015
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2016
	public function QuicktimeColorNameLookup($colordepthid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2017
		static $QuicktimeColorNameLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2018
		if (empty($QuicktimeColorNameLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2019
			$QuicktimeColorNameLookup[1]  = '2-color (monochrome)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2020
			$QuicktimeColorNameLookup[2]  = '4-color';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2021
			$QuicktimeColorNameLookup[4]  = '16-color';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2022
			$QuicktimeColorNameLookup[8]  = '256-color';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2023
			$QuicktimeColorNameLookup[16] = 'thousands (16-bit color)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2024
			$QuicktimeColorNameLookup[24] = 'millions (24-bit color)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2025
			$QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2026
			$QuicktimeColorNameLookup[33] = 'black & white';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2027
			$QuicktimeColorNameLookup[34] = '4-gray';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2028
			$QuicktimeColorNameLookup[36] = '16-gray';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2029
			$QuicktimeColorNameLookup[40] = '256-gray';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2030
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2031
		return (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2032
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2033
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2034
	public function QuicktimeSTIKLookup($stik) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2035
		static $QuicktimeSTIKLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2036
		if (empty($QuicktimeSTIKLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2037
			$QuicktimeSTIKLookup[0]  = 'Movie';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2038
			$QuicktimeSTIKLookup[1]  = 'Normal';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2039
			$QuicktimeSTIKLookup[2]  = 'Audiobook';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2040
			$QuicktimeSTIKLookup[5]  = 'Whacked Bookmark';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2041
			$QuicktimeSTIKLookup[6]  = 'Music Video';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2042
			$QuicktimeSTIKLookup[9]  = 'Short Film';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2043
			$QuicktimeSTIKLookup[10] = 'TV Show';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2044
			$QuicktimeSTIKLookup[11] = 'Booklet';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2045
			$QuicktimeSTIKLookup[14] = 'Ringtone';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2046
			$QuicktimeSTIKLookup[21] = 'Podcast';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2047
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2048
		return (isset($QuicktimeSTIKLookup[$stik]) ? $QuicktimeSTIKLookup[$stik] : 'invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2049
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2050
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2051
	public function QuicktimeIODSaudioProfileName($audio_profile_id) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2052
		static $QuicktimeIODSaudioProfileNameLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2053
		if (empty($QuicktimeIODSaudioProfileNameLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2054
			$QuicktimeIODSaudioProfileNameLookup = array(
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2055
				0x00 => 'ISO Reserved (0x00)',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2056
				0x01 => 'Main Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2057
				0x02 => 'Main Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2058
				0x03 => 'Main Audio Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2059
				0x04 => 'Main Audio Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2060
				0x05 => 'Scalable Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2061
				0x06 => 'Scalable Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2062
				0x07 => 'Scalable Audio Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2063
				0x08 => 'Scalable Audio Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2064
				0x09 => 'Speech Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2065
				0x0A => 'Speech Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2066
				0x0B => 'Synthetic Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2067
				0x0C => 'Synthetic Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2068
				0x0D => 'Synthetic Audio Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2069
				0x0E => 'High Quality Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2070
				0x0F => 'High Quality Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2071
				0x10 => 'High Quality Audio Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2072
				0x11 => 'High Quality Audio Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2073
				0x12 => 'High Quality Audio Profile @ Level 5',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2074
				0x13 => 'High Quality Audio Profile @ Level 6',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2075
				0x14 => 'High Quality Audio Profile @ Level 7',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2076
				0x15 => 'High Quality Audio Profile @ Level 8',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2077
				0x16 => 'Low Delay Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2078
				0x17 => 'Low Delay Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2079
				0x18 => 'Low Delay Audio Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2080
				0x19 => 'Low Delay Audio Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2081
				0x1A => 'Low Delay Audio Profile @ Level 5',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2082
				0x1B => 'Low Delay Audio Profile @ Level 6',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2083
				0x1C => 'Low Delay Audio Profile @ Level 7',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2084
				0x1D => 'Low Delay Audio Profile @ Level 8',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2085
				0x1E => 'Natural Audio Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2086
				0x1F => 'Natural Audio Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2087
				0x20 => 'Natural Audio Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2088
				0x21 => 'Natural Audio Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2089
				0x22 => 'Mobile Audio Internetworking Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2090
				0x23 => 'Mobile Audio Internetworking Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2091
				0x24 => 'Mobile Audio Internetworking Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2092
				0x25 => 'Mobile Audio Internetworking Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2093
				0x26 => 'Mobile Audio Internetworking Profile @ Level 5',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2094
				0x27 => 'Mobile Audio Internetworking Profile @ Level 6',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2095
				0x28 => 'AAC Profile @ Level 1',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2096
				0x29 => 'AAC Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2097
				0x2A => 'AAC Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2098
				0x2B => 'AAC Profile @ Level 5',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2099
				0x2C => 'High Efficiency AAC Profile @ Level 2',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2100
				0x2D => 'High Efficiency AAC Profile @ Level 3',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2101
				0x2E => 'High Efficiency AAC Profile @ Level 4',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2102
				0x2F => 'High Efficiency AAC Profile @ Level 5',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2103
				0xFE => 'Not part of MPEG-4 audio profiles',
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2104
				0xFF => 'No audio capability required',
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2105
			);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2106
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2107
		return (isset($QuicktimeIODSaudioProfileNameLookup[$audio_profile_id]) ? $QuicktimeIODSaudioProfileNameLookup[$audio_profile_id] : 'ISO Reserved / User Private');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2108
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2109
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2110
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2111
	public function QuicktimeIODSvideoProfileName($video_profile_id) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2112
		static $QuicktimeIODSvideoProfileNameLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2113
		if (empty($QuicktimeIODSvideoProfileNameLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2114
			$QuicktimeIODSvideoProfileNameLookup = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2115
				0x00 => 'Reserved (0x00) Profile',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2116
				0x01 => 'Simple Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2117
				0x02 => 'Simple Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2118
				0x03 => 'Simple Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2119
				0x08 => 'Simple Profile @ Level 0',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2120
				0x10 => 'Simple Scalable Profile @ Level 0',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2121
				0x11 => 'Simple Scalable Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2122
				0x12 => 'Simple Scalable Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2123
				0x15 => 'AVC/H264 Profile',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2124
				0x21 => 'Core Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2125
				0x22 => 'Core Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2126
				0x32 => 'Main Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2127
				0x33 => 'Main Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2128
				0x34 => 'Main Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2129
				0x42 => 'N-bit Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2130
				0x51 => 'Scalable Texture Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2131
				0x61 => 'Simple Face Animation Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2132
				0x62 => 'Simple Face Animation Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2133
				0x63 => 'Simple FBA Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2134
				0x64 => 'Simple FBA Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2135
				0x71 => 'Basic Animated Texture Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2136
				0x72 => 'Basic Animated Texture Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2137
				0x81 => 'Hybrid Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2138
				0x82 => 'Hybrid Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2139
				0x91 => 'Advanced Real Time Simple Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2140
				0x92 => 'Advanced Real Time Simple Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2141
				0x93 => 'Advanced Real Time Simple Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2142
				0x94 => 'Advanced Real Time Simple Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2143
				0xA1 => 'Core Scalable Profile @ Level1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2144
				0xA2 => 'Core Scalable Profile @ Level2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2145
				0xA3 => 'Core Scalable Profile @ Level3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2146
				0xB1 => 'Advanced Coding Efficiency Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2147
				0xB2 => 'Advanced Coding Efficiency Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2148
				0xB3 => 'Advanced Coding Efficiency Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2149
				0xB4 => 'Advanced Coding Efficiency Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2150
				0xC1 => 'Advanced Core Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2151
				0xC2 => 'Advanced Core Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2152
				0xD1 => 'Advanced Scalable Texture @ Level1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2153
				0xD2 => 'Advanced Scalable Texture @ Level2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2154
				0xE1 => 'Simple Studio Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2155
				0xE2 => 'Simple Studio Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2156
				0xE3 => 'Simple Studio Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2157
				0xE4 => 'Simple Studio Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2158
				0xE5 => 'Core Studio Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2159
				0xE6 => 'Core Studio Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2160
				0xE7 => 'Core Studio Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2161
				0xE8 => 'Core Studio Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2162
				0xF0 => 'Advanced Simple Profile @ Level 0',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2163
				0xF1 => 'Advanced Simple Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2164
				0xF2 => 'Advanced Simple Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2165
				0xF3 => 'Advanced Simple Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2166
				0xF4 => 'Advanced Simple Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2167
				0xF5 => 'Advanced Simple Profile @ Level 5',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2168
				0xF7 => 'Advanced Simple Profile @ Level 3b',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2169
				0xF8 => 'Fine Granularity Scalable Profile @ Level 0',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2170
				0xF9 => 'Fine Granularity Scalable Profile @ Level 1',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2171
				0xFA => 'Fine Granularity Scalable Profile @ Level 2',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2172
				0xFB => 'Fine Granularity Scalable Profile @ Level 3',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2173
				0xFC => 'Fine Granularity Scalable Profile @ Level 4',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2174
				0xFD => 'Fine Granularity Scalable Profile @ Level 5',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2175
				0xFE => 'Not part of MPEG-4 Visual profiles',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2176
				0xFF => 'No visual capability required',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2177
			);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2178
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2179
		return (isset($QuicktimeIODSvideoProfileNameLookup[$video_profile_id]) ? $QuicktimeIODSvideoProfileNameLookup[$video_profile_id] : 'ISO Reserved Profile');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2180
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2181
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2182
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2183
	public function QuicktimeContentRatingLookup($rtng) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2184
		static $QuicktimeContentRatingLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2185
		if (empty($QuicktimeContentRatingLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2186
			$QuicktimeContentRatingLookup[0]  = 'None';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2187
			$QuicktimeContentRatingLookup[2]  = 'Clean';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2188
			$QuicktimeContentRatingLookup[4]  = 'Explicit';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2189
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2190
		return (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2191
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2192
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2193
	public function QuicktimeStoreAccountTypeLookup($akid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2194
		static $QuicktimeStoreAccountTypeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2195
		if (empty($QuicktimeStoreAccountTypeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2196
			$QuicktimeStoreAccountTypeLookup[0] = 'iTunes';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2197
			$QuicktimeStoreAccountTypeLookup[1] = 'AOL';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2198
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2199
		return (isset($QuicktimeStoreAccountTypeLookup[$akid]) ? $QuicktimeStoreAccountTypeLookup[$akid] : 'invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2200
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2201
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2202
	public function QuicktimeStoreFrontCodeLookup($sfid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2203
		static $QuicktimeStoreFrontCodeLookup = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2204
		if (empty($QuicktimeStoreFrontCodeLookup)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2205
			$QuicktimeStoreFrontCodeLookup[143460] = 'Australia';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2206
			$QuicktimeStoreFrontCodeLookup[143445] = 'Austria';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2207
			$QuicktimeStoreFrontCodeLookup[143446] = 'Belgium';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2208
			$QuicktimeStoreFrontCodeLookup[143455] = 'Canada';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2209
			$QuicktimeStoreFrontCodeLookup[143458] = 'Denmark';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2210
			$QuicktimeStoreFrontCodeLookup[143447] = 'Finland';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2211
			$QuicktimeStoreFrontCodeLookup[143442] = 'France';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2212
			$QuicktimeStoreFrontCodeLookup[143443] = 'Germany';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2213
			$QuicktimeStoreFrontCodeLookup[143448] = 'Greece';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2214
			$QuicktimeStoreFrontCodeLookup[143449] = 'Ireland';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2215
			$QuicktimeStoreFrontCodeLookup[143450] = 'Italy';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2216
			$QuicktimeStoreFrontCodeLookup[143462] = 'Japan';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2217
			$QuicktimeStoreFrontCodeLookup[143451] = 'Luxembourg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2218
			$QuicktimeStoreFrontCodeLookup[143452] = 'Netherlands';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2219
			$QuicktimeStoreFrontCodeLookup[143461] = 'New Zealand';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2220
			$QuicktimeStoreFrontCodeLookup[143457] = 'Norway';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2221
			$QuicktimeStoreFrontCodeLookup[143453] = 'Portugal';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2222
			$QuicktimeStoreFrontCodeLookup[143454] = 'Spain';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2223
			$QuicktimeStoreFrontCodeLookup[143456] = 'Sweden';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2224
			$QuicktimeStoreFrontCodeLookup[143459] = 'Switzerland';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2225
			$QuicktimeStoreFrontCodeLookup[143444] = 'United Kingdom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2226
			$QuicktimeStoreFrontCodeLookup[143441] = 'United States';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2227
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2228
		return (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2229
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2230
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2231
	public function QuicktimeParseNikonNCTG($atom_data) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2232
		// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2233
		// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2234
		// Data is stored as records of:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2235
		// * 4 bytes record type
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2236
		// * 2 bytes size of data field type:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2237
		//     0x0001 = flag   (size field *= 1-byte)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2238
		//     0x0002 = char   (size field *= 1-byte)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2239
		//     0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2240
		//     0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2241
		//     0x0005 = float  (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2242
		//     0x0007 = bytes  (size field *= 1-byte), values are stored as ??????
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2243
		//     0x0008 = ?????  (size field *= 2-byte), values are stored as ??????
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2244
		// * 2 bytes data size field
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2245
		// * ? bytes data (string data may be null-padded; datestamp fields are in the format "2011:05:25 20:24:15")
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2246
		// all integers are stored BigEndian
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2247
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2248
		$NCTGtagName = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2249
			0x00000001 => 'Make',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2250
			0x00000002 => 'Model',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2251
			0x00000003 => 'Software',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2252
			0x00000011 => 'CreateDate',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2253
			0x00000012 => 'DateTimeOriginal',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2254
			0x00000013 => 'FrameCount',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2255
			0x00000016 => 'FrameRate',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2256
			0x00000022 => 'FrameWidth',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2257
			0x00000023 => 'FrameHeight',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2258
			0x00000032 => 'AudioChannels',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2259
			0x00000033 => 'AudioBitsPerSample',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2260
			0x00000034 => 'AudioSampleRate',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2261
			0x02000001 => 'MakerNoteVersion',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2262
			0x02000005 => 'WhiteBalance',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2263
			0x0200000b => 'WhiteBalanceFineTune',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2264
			0x0200001e => 'ColorSpace',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2265
			0x02000023 => 'PictureControlData',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2266
			0x02000024 => 'WorldTime',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2267
			0x02000032 => 'UnknownInfo',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2268
			0x02000083 => 'LensType',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2269
			0x02000084 => 'Lens',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2270
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2271
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2272
		$offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2273
		$datalength = strlen($atom_data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2274
		$parsed = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2275
		while ($offset < $datalength) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2276
//echo getid3_lib::PrintHexBytes(substr($atom_data, $offset, 4)).'<br>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2277
			$record_type       = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));  $offset += 4;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2278
			$data_size_type    = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));  $offset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2279
			$data_size         = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));  $offset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2280
			switch ($data_size_type) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2281
				case 0x0001: // 0x0001 = flag   (size field *= 1-byte)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2282
					$data = getid3_lib::BigEndian2Int(substr($atom_data, $offset, $data_size * 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2283
					$offset += ($data_size * 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2284
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2285
				case 0x0002: // 0x0002 = char   (size field *= 1-byte)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2286
					$data = substr($atom_data, $offset, $data_size * 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2287
					$offset += ($data_size * 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2288
					$data = rtrim($data, "\x00");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2289
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2290
				case 0x0003: // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2291
					$data = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2292
					for ($i = $data_size - 1; $i >= 0; $i--) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2293
						$data .= substr($atom_data, $offset + ($i * 2), 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2294
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2295
					$data = getid3_lib::BigEndian2Int($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2296
					$offset += ($data_size * 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2297
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2298
				case 0x0004: // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2299
					$data = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2300
					for ($i = $data_size - 1; $i >= 0; $i--) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2301
						$data .= substr($atom_data, $offset + ($i * 4), 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2302
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2303
					$data = getid3_lib::BigEndian2Int($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2304
					$offset += ($data_size * 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2305
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2306
				case 0x0005: // 0x0005 = float  (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2307
					$data = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2308
					for ($i = 0; $i < $data_size; $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2309
						$numerator    = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2310
						$denomninator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 4, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2311
						if ($denomninator == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2312
							$data[$i] = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2313
						} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2314
							$data[$i] = (double) $numerator / $denomninator;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2315
						}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2316
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2317
					$offset += (8 * $data_size);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2318
					if (count($data) == 1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2319
						$data = $data[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2320
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2321
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2322
				case 0x0007: // 0x0007 = bytes  (size field *= 1-byte), values are stored as ??????
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2323
					$data = substr($atom_data, $offset, $data_size * 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2324
					$offset += ($data_size * 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2325
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2326
				case 0x0008: // 0x0008 = ?????  (size field *= 2-byte), values are stored as ??????
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2327
					$data = substr($atom_data, $offset, $data_size * 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2328
					$offset += ($data_size * 2);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2329
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2330
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2331
echo 'QuicktimeParseNikonNCTG()::unknown $data_size_type: '.$data_size_type.'<br>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2332
					break 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2333
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2334
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2335
			switch ($record_type) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2336
				case 0x00000011: // CreateDate
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2337
				case 0x00000012: // DateTimeOriginal
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2338
					$data = strtotime($data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2339
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2340
				case 0x0200001e: // ColorSpace
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2341
					switch ($data) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2342
						case 1:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2343
							$data = 'sRGB';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2344
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2345
						case 2:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2346
							$data = 'Adobe RGB';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2347
							break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2348
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2349
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2350
				case 0x02000023: // PictureControlData
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2351
					$PictureControlAdjust = array(0=>'default', 1=>'quick', 2=>'full');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2352
					$FilterEffect = array(0x80=>'off', 0x81=>'yellow', 0x82=>'orange',    0x83=>'red', 0x84=>'green',  0xff=>'n/a');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2353
					$ToningEffect = array(0x80=>'b&w', 0x81=>'sepia',  0x82=>'cyanotype', 0x83=>'red', 0x84=>'yellow', 0x85=>'green', 0x86=>'blue-green', 0x87=>'blue', 0x88=>'purple-blue', 0x89=>'red-purple', 0xff=>'n/a');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2354
					$data = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2355
						'PictureControlVersion'     =>                           substr($data,  0,  4),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2356
						'PictureControlName'        =>                     rtrim(substr($data,  4, 20), "\x00"),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2357
						'PictureControlBase'        =>                     rtrim(substr($data, 24, 20), "\x00"),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2358
						//'?'                       =>                           substr($data, 44,  4),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2359
						'PictureControlAdjust'      => $PictureControlAdjust[ord(substr($data, 48,  1))],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2360
						'PictureControlQuickAdjust' =>                       ord(substr($data, 49,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2361
						'Sharpness'                 =>                       ord(substr($data, 50,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2362
						'Contrast'                  =>                       ord(substr($data, 51,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2363
						'Brightness'                =>                       ord(substr($data, 52,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2364
						'Saturation'                =>                       ord(substr($data, 53,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2365
						'HueAdjustment'             =>                       ord(substr($data, 54,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2366
						'FilterEffect'              =>         $FilterEffect[ord(substr($data, 55,  1))],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2367
						'ToningEffect'              =>         $ToningEffect[ord(substr($data, 56,  1))],
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2368
						'ToningSaturation'          =>                       ord(substr($data, 57,  1)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2369
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2370
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2371
				case 0x02000024: // WorldTime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2372
					// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#WorldTime
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2373
					// timezone is stored as offset from GMT in minutes
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2374
					$timezone = getid3_lib::BigEndian2Int(substr($data, 0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2375
					if ($timezone & 0x8000) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2376
						$timezone = 0 - (0x10000 - $timezone);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2377
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2378
					$timezone /= 60;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2379
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2380
					$dst = (bool) getid3_lib::BigEndian2Int(substr($data, 2, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2381
					switch (getid3_lib::BigEndian2Int(substr($data, 3, 1))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2382
						case 2:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2383
							$datedisplayformat = 'D/M/Y'; break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2384
						case 1:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2385
							$datedisplayformat = 'M/D/Y'; break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2386
						case 0:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2387
						default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2388
							$datedisplayformat = 'Y/M/D'; break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2389
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2390
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2391
					$data = array('timezone'=>floatval($timezone), 'dst'=>$dst, 'display'=>$datedisplayformat);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2392
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2393
				case 0x02000083: // LensType
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2394
					$data = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2395
						//'_'  => $data,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2396
						'mf' => (bool) ($data & 0x01),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2397
						'd'  => (bool) ($data & 0x02),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2398
						'g'  => (bool) ($data & 0x04),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2399
						'vr' => (bool) ($data & 0x08),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2400
					);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2401
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2402
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2403
			$tag_name = (isset($NCTGtagName[$record_type]) ? $NCTGtagName[$record_type] : '0x'.str_pad(dechex($record_type), 8, '0', STR_PAD_LEFT));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2404
			$parsed[$tag_name] = $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2405
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2406
		return $parsed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2407
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2408
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2409
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2410
	public function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2411
		static $handyatomtranslatorarray = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2412
		if (empty($handyatomtranslatorarray)) {
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2413
			// http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2414
			// http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2415
			// http://atomicparsley.sourceforge.net/mpeg-4files.html
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2416
			// https://code.google.com/p/mp4v2/wiki/iTunesMetadata
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2417
			$handyatomtranslatorarray["\xA9".'alb'] = 'album';               // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2418
			$handyatomtranslatorarray["\xA9".'ART'] = 'artist';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2419
			$handyatomtranslatorarray["\xA9".'art'] = 'artist';              // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2420
			$handyatomtranslatorarray["\xA9".'aut'] = 'author';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2421
			$handyatomtranslatorarray["\xA9".'cmt'] = 'comment';             // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2422
			$handyatomtranslatorarray["\xA9".'com'] = 'comment';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2423
			$handyatomtranslatorarray["\xA9".'cpy'] = 'copyright';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2424
			$handyatomtranslatorarray["\xA9".'day'] = 'creation_date';       // iTunes 4.0
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2425
			$handyatomtranslatorarray["\xA9".'dir'] = 'director';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2426
			$handyatomtranslatorarray["\xA9".'ed1'] = 'edit1';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2427
			$handyatomtranslatorarray["\xA9".'ed2'] = 'edit2';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2428
			$handyatomtranslatorarray["\xA9".'ed3'] = 'edit3';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2429
			$handyatomtranslatorarray["\xA9".'ed4'] = 'edit4';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2430
			$handyatomtranslatorarray["\xA9".'ed5'] = 'edit5';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2431
			$handyatomtranslatorarray["\xA9".'ed6'] = 'edit6';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2432
			$handyatomtranslatorarray["\xA9".'ed7'] = 'edit7';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2433
			$handyatomtranslatorarray["\xA9".'ed8'] = 'edit8';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2434
			$handyatomtranslatorarray["\xA9".'ed9'] = 'edit9';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2435
			$handyatomtranslatorarray["\xA9".'enc'] = 'encoded_by';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2436
			$handyatomtranslatorarray["\xA9".'fmt'] = 'format';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2437
			$handyatomtranslatorarray["\xA9".'gen'] = 'genre';               // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2438
			$handyatomtranslatorarray["\xA9".'grp'] = 'grouping';            // iTunes 4.2
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2439
			$handyatomtranslatorarray["\xA9".'hst'] = 'host_computer';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2440
			$handyatomtranslatorarray["\xA9".'inf'] = 'information';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2441
			$handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics';              // iTunes 5.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2442
			$handyatomtranslatorarray["\xA9".'mak'] = 'make';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2443
			$handyatomtranslatorarray["\xA9".'mod'] = 'model';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2444
			$handyatomtranslatorarray["\xA9".'nam'] = 'title';               // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2445
			$handyatomtranslatorarray["\xA9".'ope'] = 'composer';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2446
			$handyatomtranslatorarray["\xA9".'prd'] = 'producer';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2447
			$handyatomtranslatorarray["\xA9".'PRD'] = 'product';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2448
			$handyatomtranslatorarray["\xA9".'prf'] = 'performers';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2449
			$handyatomtranslatorarray["\xA9".'req'] = 'system_requirements';
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2450
			$handyatomtranslatorarray["\xA9".'src'] = 'source_credit';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2451
			$handyatomtranslatorarray["\xA9".'swr'] = 'software';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2452
			$handyatomtranslatorarray["\xA9".'too'] = 'encoding_tool';       // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2453
			$handyatomtranslatorarray["\xA9".'trk'] = 'track';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2454
			$handyatomtranslatorarray["\xA9".'url'] = 'url';
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
  2455
			$handyatomtranslatorarray["\xA9".'wrn'] = 'warning';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2456
			$handyatomtranslatorarray["\xA9".'wrt'] = 'composer';
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2457
			$handyatomtranslatorarray['aART'] = 'album_artist';
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2458
			$handyatomtranslatorarray['apID'] = 'purchase_account';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2459
			$handyatomtranslatorarray['catg'] = 'category';            // iTunes 4.9
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2460
			$handyatomtranslatorarray['covr'] = 'picture';             // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2461
			$handyatomtranslatorarray['cpil'] = 'compilation';         // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2462
			$handyatomtranslatorarray['cprt'] = 'copyright';           // iTunes 4.0?
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2463
			$handyatomtranslatorarray['desc'] = 'description';         // iTunes 5.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2464
			$handyatomtranslatorarray['disk'] = 'disc_number';         // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2465
			$handyatomtranslatorarray['egid'] = 'episode_guid';        // iTunes 4.9
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2466
			$handyatomtranslatorarray['gnre'] = 'genre';               // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2467
			$handyatomtranslatorarray['hdvd'] = 'hd_video';            // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2468
			$handyatomtranslatorarray['ldes'] = 'description_long';    //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2469
			$handyatomtranslatorarray['keyw'] = 'keyword';             // iTunes 4.9
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2470
			$handyatomtranslatorarray['pcst'] = 'podcast';             // iTunes 4.9
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2471
			$handyatomtranslatorarray['pgap'] = 'gapless_playback';    // iTunes 7.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2472
			$handyatomtranslatorarray['purd'] = 'purchase_date';       // iTunes 6.0.2
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2473
			$handyatomtranslatorarray['purl'] = 'podcast_url';         // iTunes 4.9
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2474
			$handyatomtranslatorarray['rtng'] = 'rating';              // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2475
			$handyatomtranslatorarray['soaa'] = 'sort_album_artist';   //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2476
			$handyatomtranslatorarray['soal'] = 'sort_album';          //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2477
			$handyatomtranslatorarray['soar'] = 'sort_artist';         //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2478
			$handyatomtranslatorarray['soco'] = 'sort_composer';       //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2479
			$handyatomtranslatorarray['sonm'] = 'sort_title';          //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2480
			$handyatomtranslatorarray['sosn'] = 'sort_show';           //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2481
			$handyatomtranslatorarray['stik'] = 'stik';                // iTunes 4.9
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2482
			$handyatomtranslatorarray['tmpo'] = 'bpm';                 // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2483
			$handyatomtranslatorarray['trkn'] = 'track_number';        // iTunes 4.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2484
			$handyatomtranslatorarray['tven'] = 'tv_episode_id';       //
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2485
			$handyatomtranslatorarray['tves'] = 'tv_episode';          // iTunes 6.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2486
			$handyatomtranslatorarray['tvnn'] = 'tv_network_name';     // iTunes 6.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2487
			$handyatomtranslatorarray['tvsh'] = 'tv_show_name';        // iTunes 6.0
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2488
			$handyatomtranslatorarray['tvsn'] = 'tv_season';           // iTunes 6.0
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2489
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2490
			// boxnames:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2491
			/*
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2492
			$handyatomtranslatorarray['iTunSMPB']                    = 'iTunSMPB';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2493
			$handyatomtranslatorarray['iTunNORM']                    = 'iTunNORM';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2494
			$handyatomtranslatorarray['Encoding Params']             = 'Encoding Params';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2495
			$handyatomtranslatorarray['replaygain_track_gain']       = 'replaygain_track_gain';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2496
			$handyatomtranslatorarray['replaygain_track_peak']       = 'replaygain_track_peak';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2497
			$handyatomtranslatorarray['replaygain_track_minmax']     = 'replaygain_track_minmax';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2498
			$handyatomtranslatorarray['MusicIP PUID']                = 'MusicIP PUID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2499
			$handyatomtranslatorarray['MusicBrainz Artist Id']       = 'MusicBrainz Artist Id';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2500
			$handyatomtranslatorarray['MusicBrainz Album Id']        = 'MusicBrainz Album Id';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2501
			$handyatomtranslatorarray['MusicBrainz Album Artist Id'] = 'MusicBrainz Album Artist Id';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2502
			$handyatomtranslatorarray['MusicBrainz Track Id']        = 'MusicBrainz Track Id';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2503
			$handyatomtranslatorarray['MusicBrainz Disc Id']         = 'MusicBrainz Disc Id';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2504
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2505
			// http://age.hobba.nl/audio/tag_frame_reference.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2506
			$handyatomtranslatorarray['PLAY_COUNTER']                = 'play_counter'; // Foobar2000 - http://www.getid3.org/phpBB3/viewtopic.php?t=1355
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2507
			$handyatomtranslatorarray['MEDIATYPE']                   = 'mediatype';    // Foobar2000 - http://www.getid3.org/phpBB3/viewtopic.php?t=1355
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2508
			*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2509
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2510
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2511
		$comment_key = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2512
		if ($boxname && ($boxname != $keyname)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2513
			$comment_key = (isset($handyatomtranslatorarray[$boxname]) ? $handyatomtranslatorarray[$boxname] : $boxname);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2514
		} elseif (isset($handyatomtranslatorarray[$keyname])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2515
			$comment_key = $handyatomtranslatorarray[$keyname];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2516
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2517
		if ($comment_key) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2518
			if ($comment_key == 'picture') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2519
				if (!is_array($data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2520
					$image_mime = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2521
					if (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2522
						$image_mime = 'image/png';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2523
					} elseif (preg_match('#^\xFF\xD8\xFF#', $data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2524
						$image_mime = 'image/jpeg';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2525
					} elseif (preg_match('#^GIF#', $data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2526
						$image_mime = 'image/gif';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2527
					} elseif (preg_match('#^BM#', $data)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2528
						$image_mime = 'image/bmp';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2529
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2530
					$data = array('data'=>$data, 'image_mime'=>$image_mime);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2531
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2532
			}
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2533
			$gooddata = array($data);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2534
			if ($comment_key == 'genre') {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2535
				// some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2536
				$gooddata = explode(';', $data);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2537
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2538
			foreach ($gooddata as $data) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2539
				$info['quicktime']['comments'][$comment_key][] = $data;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2540
			}
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2541
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2542
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2543
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2544
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2545
    public function LociString($lstring, &$count) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2546
            // Loci strings are UTF-8 or UTF-16 and null (x00/x0000) terminated. UTF-16 has a BOM
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2547
            // Also need to return the number of bytes the string occupied so additional fields can be extracted
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2548
            $len = strlen($lstring);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2549
            if ($len == 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2550
                $count = 0;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2551
                return '';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2552
            }
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2553
            if ($lstring[0] == "\x00") {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2554
                $count = 1;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2555
                return '';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2556
            }
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2557
            //check for BOM
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2558
            if ($len > 2 && (($lstring[0] == "\xFE" && $lstring[1] == "\xFF") || ($lstring[0] == "\xFF" && $lstring[1] == "\xFE"))) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2559
                //UTF-16
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2560
                if (preg_match('/(.*)\x00/', $lstring, $lmatches)){
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2561
                     $count = strlen($lmatches[1]) * 2 + 2; //account for 2 byte characters and trailing \x0000
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2562
                    return getid3_lib::iconv_fallback_utf16_utf8($lmatches[1]);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2563
                } else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2564
                    return '';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2565
                }
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2566
            } else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2567
                //UTF-8
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2568
                if (preg_match('/(.*)\x00/', $lstring, $lmatches)){
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2569
                    $count = strlen($lmatches[1]) + 1; //account for trailing \x00
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2570
                    return $lmatches[1];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2571
                }else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2572
                    return '';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2573
                }
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2574
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2575
            }
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2576
        }
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2577
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2578
	public function NoNullString($nullterminatedstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2579
		// remove the single null terminator on null terminated strings
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2580
		if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === "\x00") {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2581
			return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2582
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2583
		return $nullterminatedstring;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2584
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2585
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2586
	public function Pascal2String($pascalstring) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2587
		// Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2588
		return substr($pascalstring, 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2589
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2590
7
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2591
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2592
	/*
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2593
	// helper functions for m4b audiobook chapters
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2594
	// code by Steffen Hartmann 2015-Nov-08
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2595
	*/
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2596
	public function search_tag_by_key($info, $tag, $history, &$result) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2597
		foreach ($info as $key => $value) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2598
			$key_history = $history.'/'.$key;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2599
			if ($key === $tag) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2600
				$result[] = array($key_history, $info);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2601
			} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2602
				if (is_array($value)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2603
					$this->search_tag_by_key($value, $tag, $key_history, $result);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2604
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2605
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2606
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2607
	}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2608
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2609
	public function search_tag_by_pair($info, $k, $v, $history, &$result) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2610
		foreach ($info as $key => $value) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2611
			$key_history = $history.'/'.$key;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2612
			if (($key === $k) && ($value === $v)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2613
				$result[] = array($key_history, $info);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2614
			} else {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2615
				if (is_array($value)) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2616
					$this->search_tag_by_pair($value, $k, $v, $key_history, $result);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2617
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2618
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2619
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2620
	}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2621
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2622
	public function quicktime_time_to_sample_table($info) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2623
		$res = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2624
		$this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2625
		foreach ($res as $value) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2626
			$stbl_res = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2627
			$this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2628
			if (count($stbl_res) > 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2629
				$stts_res = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2630
				$this->search_tag_by_key($value[1], 'time_to_sample_table', $value[0], $stts_res);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2631
				if (count($stts_res) > 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2632
					return $stts_res[0][1]['time_to_sample_table'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2633
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2634
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2635
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2636
		return array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2637
	}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2638
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2639
	function quicktime_bookmark_time_scale($info) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2640
		$time_scale = '';
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2641
		$ts_prefix_len = 0;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2642
		$res = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2643
		$this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2644
		foreach ($res as $value) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2645
			$stbl_res = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2646
			$this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2647
			if (count($stbl_res) > 0) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2648
				$ts_res = array();
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2649
				$this->search_tag_by_key($info['quicktime']['moov'], 'time_scale', 'quicktime/moov', $ts_res);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2650
				foreach ($ts_res as $value) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2651
					$prefix = substr($value[0], 0, -12);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2652
					if ((substr($stbl_res[0][0], 0, strlen($prefix)) === $prefix) && ($ts_prefix_len < strlen($prefix))) {
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2653
						$time_scale = $value[1]['time_scale'];
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2654
						$ts_prefix_len = strlen($prefix);
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2655
					}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2656
				}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2657
			}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2658
		}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2659
		return $time_scale;
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2660
	}
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2661
	/*
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2662
	// END helper functions for m4b audiobook chapters
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2663
	*/
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2664
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2665
cf61fcea0001 resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents: 5
diff changeset
  2666
}