- Timestamp:
- 04/20/2020 11:11:48 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/ID3/module.audio-video.quicktime.php
r46586 r47601 113 113 // https://en.wikipedia.org/wiki/ISO_6709 114 114 foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) { 115 $latitude = false; 116 $longitude = false; 117 $altitude = false; 115 $ISO6709parsed = array('latitude'=>false, 'longitude'=>false, 'altitude'=>false); 118 116 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)) { 119 117 @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; 120 118 121 119 if (strlen($lat_deg) == 2) { // [+-]DD.D 122 $ latitude =floatval(ltrim($lat_deg, '0').$lat_deg_dec);120 $ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim($lat_deg, '0').$lat_deg_dec); 123 121 } elseif (strlen($lat_deg) == 4) { // [+-]DDMM.M 124 $ latitude =floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60);122 $ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60); 125 123 } elseif (strlen($lat_deg) == 6) { // [+-]DDMMSS.S 126 $ 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);124 $ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * 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); 127 125 } 128 126 129 127 if (strlen($lon_deg) == 3) { // [+-]DDD.D 130 $ longitude =floatval(ltrim($lon_deg, '0').$lon_deg_dec);128 $ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim($lon_deg, '0').$lon_deg_dec); 131 129 } elseif (strlen($lon_deg) == 5) { // [+-]DDDMM.M 132 $ longitude =floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60);130 $ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60); 133 131 } elseif (strlen($lon_deg) == 7) { // [+-]DDDMMSS.S 134 $ 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);132 $ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * 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); 135 133 } 136 134 137 135 if (strlen($alt_deg) == 3) { // [+-]DDD.D 138 $ altitude =floatval(ltrim($alt_deg, '0').$alt_deg_dec);136 $ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim($alt_deg, '0').$alt_deg_dec); 139 137 } elseif (strlen($alt_deg) == 5) { // [+-]DDDMM.M 140 $ altitude =floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60);138 $ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60); 141 139 } elseif (strlen($alt_deg) == 7) { // [+-]DDDMMSS.S 142 $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); 143 } 144 145 if ($latitude !== false) { 146 $info['quicktime']['comments']['gps_latitude'][] = (($lat_sign == '-') ? -1 : 1) * floatval($latitude); 147 } 148 if ($longitude !== false) { 149 $info['quicktime']['comments']['gps_longitude'][] = (($lon_sign == '-') ? -1 : 1) * floatval($longitude); 150 } 151 if ($altitude !== false) { 152 $info['quicktime']['comments']['gps_altitude'][] = (($alt_sign == '-') ? -1 : 1) * floatval($altitude); 140 $ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * 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); 141 } 142 143 foreach (array('latitude', 'longitude', 'altitude') as $key) { 144 if ($ISO6709parsed[$key] !== false) { 145 $value = (($lat_sign == '-') ? -1 : 1) * floatval($ISO6709parsed[$key]); 146 if (!in_array($value, $info['quicktime']['comments']['gps_'.$key])) { 147 $info['quicktime']['comments']['gps_'.$key][] = (($lat_sign == '-') ? -1 : 1) * floatval($ISO6709parsed[$key]); 148 } 149 } 153 150 } 154 151 } 155 if ($ latitude=== false) {152 if ($ISO6709parsed['latitude'] === false) { 156 153 $this->warning('location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug'); 157 154 } … … 225 222 $atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see https://www.getid3.org/phpBB3/viewtopic.php?t=1717 226 223 array_push($atomHierarchy, $atomname); 224 $atom_structure = array(); 227 225 $atom_structure['hierarchy'] = implode(' ', $atomHierarchy); 228 226 $atom_structure['name'] = $atomname; … … 245 243 case 'minf': // Media INFormation container atom 246 244 case 'dinf': // Data INFormation container atom 245 case 'nmhd': // Null Media HeaDer container atom 247 246 case 'udta': // User DaTA container atom 248 247 case 'cmov': // Compressed MOVie container atom … … 1045 1044 1046 1045 case 'stco': // Sample Table Chunk Offset atom 1046 // if (true) { 1047 1047 if ($ParseAllPossibleAtoms) { 1048 1048 $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); … … 1640 1640 break; 1641 1641 1642 case 'uuid': // Atom holding 360fly spatial data?? 1643 /* code in this block by Paul Lewis 2019-Oct-31 */ 1644 /* Sensor Timestamps need to be calculated using the recordings base time at ['quicktime']['moov']['subatoms'][0]['creation_time_unix']. */ 1645 $atom_structure['title'] = '360Fly Sensor Data'; 1646 1647 //Get the UUID ID in first 16 bytes 1648 $uuid_bytes_read = unpack('H8time_low/H4time_mid/H4time_hi/H4clock_seq_hi/H12clock_seq_low', substr($atom_data, 0, 16)); 1649 $atom_structure['uuid_field_id'] = print_r(implode('-', $uuid_bytes_read), true); 1650 1651 //Get the UUID HEADER data 1652 $uuid_bytes_read = unpack('Sheader_size/Sheader_version/Stimescale/Shardware_version/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/', substr($atom_data, 16, 32)); 1653 $atom_structure['uuid_header'] = json_encode($uuid_bytes_read, true); 1654 1655 $start_byte = 48; 1656 $atom_SENSOR_data = substr($atom_data, $start_byte); 1657 $atom_structure['sensor_data']['data_type'] = array( 1658 'fusion_count' => 0, // ID 250 1659 'fusion_data' => array(), 1660 'accel_count' => 0, // ID 1 1661 'accel_data' => array(), 1662 'gyro_count' => 0, // ID 2 1663 'gyro_data' => array(), 1664 'magno_count' => 0, // ID 3 1665 'magno_data' => array(), 1666 'gps_count' => 0, // ID 5 1667 'gps_data' => array(), 1668 'rotation_count' => 0, // ID 6 1669 'rotation_data' => array(), 1670 'unknown_count' => 0, // ID ?? 1671 'unknown_data' => array(), 1672 'debug_list' => '', // Used to debug variables stored as comma delimited strings 1673 ); 1674 $debug_structure['debug_items'] = array(); 1675 // Can start loop here to decode all sensor data in 32 Byte chunks: 1676 foreach (str_split($atom_SENSOR_data, 32) as $sensor_key => $sensor_data) { 1677 // This gets me a data_type code to work out what data is in the next 31 bytes. 1678 $sensor_data_type = substr($sensor_data, 0, 1); 1679 $sensor_data_content = substr($sensor_data, 1); 1680 $uuid_bytes_read = unpack('C*', $sensor_data_type); 1681 $sensor_data_array = array(); 1682 switch ($uuid_bytes_read[1]) { 1683 case 250: 1684 $atom_structure['sensor_data']['data_type']['fusion_count']++; 1685 $uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content); 1686 $sensor_data_array['mode'] = $uuid_bytes_read['mode']; 1687 $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; 1688 $sensor_data_array['yaw'] = $uuid_bytes_read['yaw']; 1689 $sensor_data_array['pitch'] = $uuid_bytes_read['pitch']; 1690 $sensor_data_array['roll'] = $uuid_bytes_read['roll']; 1691 array_push($atom_structure['sensor_data']['data_type']['fusion_data'], $sensor_data_array); 1692 break; 1693 case 1: 1694 $atom_structure['sensor_data']['data_type']['accel_count']++; 1695 $uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content); 1696 $sensor_data_array['mode'] = $uuid_bytes_read['mode']; 1697 $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; 1698 $sensor_data_array['yaw'] = $uuid_bytes_read['yaw']; 1699 $sensor_data_array['pitch'] = $uuid_bytes_read['pitch']; 1700 $sensor_data_array['roll'] = $uuid_bytes_read['roll']; 1701 array_push($atom_structure['sensor_data']['data_type']['accel_data'], $sensor_data_array); 1702 break; 1703 case 2: 1704 $atom_structure['sensor_data']['data_type']['gyro_count']++; 1705 $uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content); 1706 $sensor_data_array['mode'] = $uuid_bytes_read['mode']; 1707 $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; 1708 $sensor_data_array['yaw'] = $uuid_bytes_read['yaw']; 1709 $sensor_data_array['pitch'] = $uuid_bytes_read['pitch']; 1710 $sensor_data_array['roll'] = $uuid_bytes_read['roll']; 1711 array_push($atom_structure['sensor_data']['data_type']['gyro_data'], $sensor_data_array); 1712 break; 1713 case 3: 1714 $atom_structure['sensor_data']['data_type']['magno_count']++; 1715 $uuid_bytes_read = unpack('cmode/Jtimestamp/Gmagx/Gmagy/Gmagz/x*', $sensor_data_content); 1716 $sensor_data_array['mode'] = $uuid_bytes_read['mode']; 1717 $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; 1718 $sensor_data_array['magx'] = $uuid_bytes_read['magx']; 1719 $sensor_data_array['magy'] = $uuid_bytes_read['magy']; 1720 $sensor_data_array['magz'] = $uuid_bytes_read['magz']; 1721 array_push($atom_structure['sensor_data']['data_type']['magno_data'], $sensor_data_array); 1722 break; 1723 case 5: 1724 $atom_structure['sensor_data']['data_type']['gps_count']++; 1725 $uuid_bytes_read = unpack('cmode/Jtimestamp/Glat/Glon/Galt/Gspeed/nbearing/nacc/x*', $sensor_data_content); 1726 $sensor_data_array['mode'] = $uuid_bytes_read['mode']; 1727 $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; 1728 $sensor_data_array['lat'] = $uuid_bytes_read['lat']; 1729 $sensor_data_array['lon'] = $uuid_bytes_read['lon']; 1730 $sensor_data_array['alt'] = $uuid_bytes_read['alt']; 1731 $sensor_data_array['speed'] = $uuid_bytes_read['speed']; 1732 $sensor_data_array['bearing'] = $uuid_bytes_read['bearing']; 1733 $sensor_data_array['acc'] = $uuid_bytes_read['acc']; 1734 //$sensor_data_array = print_r($uuid_bytes_read, true); 1735 array_push($atom_structure['sensor_data']['data_type']['gps_data'], $sensor_data_array); 1736 //array_push($debug_structure['debug_items'], $uuid_bytes_read['timestamp']); 1737 break; 1738 case 6: 1739 $atom_structure['sensor_data']['data_type']['rotation_count']++; 1740 $uuid_bytes_read = unpack('cmode/Jtimestamp/Grotx/Groty/Grotz/x*', $sensor_data_content); 1741 $sensor_data_array['mode'] = $uuid_bytes_read['mode']; 1742 $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; 1743 $sensor_data_array['rotx'] = $uuid_bytes_read['rotx']; 1744 $sensor_data_array['roty'] = $uuid_bytes_read['roty']; 1745 $sensor_data_array['rotz'] = $uuid_bytes_read['rotz']; 1746 array_push($atom_structure['sensor_data']['data_type']['rotation_data'], $sensor_data_array); 1747 break; 1748 default: 1749 $atom_structure['sensor_data']['data_type']['unknown_count']++; 1750 break; 1751 } 1752 } 1753 // if (isset($debug_structure['debug_items']) && count($debug_structure['debug_items']) > 0) { 1754 // $atom_structure['sensor_data']['data_type']['debug_list'] = implode(',', $debug_structure['debug_items']); 1755 // } else { 1756 $atom_structure['sensor_data']['data_type']['debug_list'] = 'No debug items in list!'; 1757 // } 1758 break; 1759 1642 1760 case 'gps ': 1643 1761 // https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730 … … 1684 1802 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)) { 1685 1803 $GPS_this_GPRMC = array(); 1804 $GPS_this_GPRMC_raw = array(); 1686 1805 list( 1687 $GPS_this_GPRMC ['raw']['gprmc'],1688 $GPS_this_GPRMC ['raw']['timestamp'],1689 $GPS_this_GPRMC ['raw']['status'],1690 $GPS_this_GPRMC ['raw']['latitude'],1691 $GPS_this_GPRMC ['raw']['latitude_direction'],1692 $GPS_this_GPRMC ['raw']['longitude'],1693 $GPS_this_GPRMC ['raw']['longitude_direction'],1694 $GPS_this_GPRMC ['raw']['knots'],1695 $GPS_this_GPRMC ['raw']['angle'],1696 $GPS_this_GPRMC ['raw']['datestamp'],1697 $GPS_this_GPRMC ['raw']['variation'],1698 $GPS_this_GPRMC ['raw']['variation_direction'],1806 $GPS_this_GPRMC_raw['gprmc'], 1807 $GPS_this_GPRMC_raw['timestamp'], 1808 $GPS_this_GPRMC_raw['status'], 1809 $GPS_this_GPRMC_raw['latitude'], 1810 $GPS_this_GPRMC_raw['latitude_direction'], 1811 $GPS_this_GPRMC_raw['longitude'], 1812 $GPS_this_GPRMC_raw['longitude_direction'], 1813 $GPS_this_GPRMC_raw['knots'], 1814 $GPS_this_GPRMC_raw['angle'], 1815 $GPS_this_GPRMC_raw['datestamp'], 1816 $GPS_this_GPRMC_raw['variation'], 1817 $GPS_this_GPRMC_raw['variation_direction'], 1699 1818 $dummy, 1700 $GPS_this_GPRMC ['raw']['checksum'],1819 $GPS_this_GPRMC_raw['checksum'], 1701 1820 ) = $matches; 1821 $GPS_this_GPRMC['raw'] = $GPS_this_GPRMC_raw; 1702 1822 1703 1823 $hour = substr($GPS_this_GPRMC['raw']['timestamp'], 0, 2); … … 1707 1827 $day = substr($GPS_this_GPRMC['raw']['datestamp'], 0, 2); 1708 1828 $month = substr($GPS_this_GPRMC['raw']['datestamp'], 2, 2); 1709 $year = substr($GPS_this_GPRMC['raw']['datestamp'], 4, 2);1829 $year = (int) substr($GPS_this_GPRMC['raw']['datestamp'], 4, 2); 1710 1830 $year += (($year > 90) ? 1900 : 2000); // complete lack of foresight: datestamps are stored with 2-digit years, take best guess 1711 1831 $GPS_this_GPRMC['timestamp'] = $year.'-'.$month.'-'.$day.' '.$hour.':'.$minute.':'.$second.$ms; … … 2741 2861 } 2742 2862 foreach ($gooddata as $data) { 2863 if (is_array($data) || (!empty($info['quicktime']['comments'][$comment_key]) && in_array($data, $info['quicktime']['comments'][$comment_key]))) { 2864 // avoid duplicate copies of identical data 2865 continue; 2866 } 2743 2867 $info['quicktime']['comments'][$comment_key][] = $data; 2744 2868 }
Note: See TracChangeset
for help on using the changeset viewer.