Make WordPress Core


Ignore:
Timestamp:
04/20/2020 11:11:48 AM (6 years ago)
Author:
SergeyBiryukov
Message:

External Libraries: Update getID3() to 1.9.19.

Changelog: https://github.com/JamesHeinrich/getID3/compare/v1.9.18...v1.9.19

Props ayeshrajans, schlessera.
See #49945.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/ID3/module.audio-video.quicktime.php

    r46586 r47601  
    113113                        // https://en.wikipedia.org/wiki/ISO_6709
    114114                        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);
    118116                                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)) {
    119117                                        @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;
    120118
    121119                                        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);
    123121                                        } 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);
    125123                                        } 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);
    127125                                        }
    128126
    129127                                        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);
    131129                                        } 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);
    133131                                        } 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);
    135133                                        }
    136134
    137135                                        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);
    139137                                        } 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);
    141139                                        } 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                                                }
    153150                                        }
    154151                                }
    155                                 if ($latitude === false) {
     152                                if ($ISO6709parsed['latitude'] === false) {
    156153                                        $this->warning('location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug');
    157154                                }
     
    225222                $atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see https://www.getid3.org/phpBB3/viewtopic.php?t=1717
    226223                array_push($atomHierarchy, $atomname);
     224                $atom_structure              = array();
    227225                $atom_structure['hierarchy'] = implode(' ', $atomHierarchy);
    228226                $atom_structure['name']      = $atomname;
     
    245243                                case 'minf': // Media INFormation container atom
    246244                                case 'dinf': // Data INFormation container atom
     245                                case 'nmhd': // Null Media HeaDer container atom
    247246                                case 'udta': // User DaTA container atom
    248247                                case 'cmov': // Compressed MOVie container atom
     
    10451044
    10461045                                case 'stco': // Sample Table Chunk Offset atom
     1046//                                      if (true) {
    10471047                                        if ($ParseAllPossibleAtoms) {
    10481048                                                $atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
     
    16401640                                        break;
    16411641
     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
    16421760                                case 'gps ':
    16431761                                        // https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730
     
    16841802                                                                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)) {
    16851803                                                                        $GPS_this_GPRMC = array();
     1804                                                                        $GPS_this_GPRMC_raw = array();
    16861805                                                                        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'],
    16991818                                                                                $dummy,
    1700                                                                                 $GPS_this_GPRMC['raw']['checksum'],
     1819                                                                                $GPS_this_GPRMC_raw['checksum'],
    17011820                                                                        ) = $matches;
     1821                                                                        $GPS_this_GPRMC['raw'] = $GPS_this_GPRMC_raw;
    17021822
    17031823                                                                        $hour   = substr($GPS_this_GPRMC['raw']['timestamp'], 0, 2);
     
    17071827                                                                        $day    = substr($GPS_this_GPRMC['raw']['datestamp'], 0, 2);
    17081828                                                                        $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);
    17101830                                                                        $year += (($year > 90) ? 1900 : 2000); // complete lack of foresight: datestamps are stored with 2-digit years, take best guess
    17111831                                                                        $GPS_this_GPRMC['timestamp'] = $year.'-'.$month.'-'.$day.' '.$hour.':'.$minute.':'.$second.$ms;
     
    27412861                        }
    27422862                        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                                }
    27432867                                $info['quicktime']['comments'][$comment_key][] = $data;
    27442868                        }
Note: See TracChangeset for help on using the changeset viewer.