Make WordPress Core


Ignore:
Timestamp:
04/20/2020 11:11:48 AM (5 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.