exiftool_vendored 12.99.0 → 13.02.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,7 +22,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
22
22
  use Image::ExifTool::Exif;
23
23
  use Image::ExifTool::ASF; # for GetGUID()
24
24
 
25
- $VERSION = '1.48';
25
+ $VERSION = '1.49';
26
26
 
27
27
  sub ProcessFPX($$);
28
28
  sub ProcessFPXR($$$);
@@ -1717,16 +1717,14 @@ sub ProcessDocumentTable($)
1717
1717
  my $offsets = $$value{$key};
1718
1718
  last unless defined $offsets;
1719
1719
  my $doc;
1720
- $doc = $$extra{$key}{G3} if $$extra{$key};
1721
- $doc = '' unless $doc;
1720
+ $doc = $$extra{$key}{G3} || '';
1722
1721
  # get DocFlags for this sub-document
1723
1722
  my ($docFlags, $docTable);
1724
1723
  for ($j=0; ; ++$j) {
1725
1724
  my $key = 'DocFlags' . ($j ? " ($j)" : '');
1726
1725
  last unless defined $$value{$key};
1727
1726
  my $tmp;
1728
- $tmp = $$extra{$key}{G3} if $$extra{$key};
1729
- $tmp = '' unless $tmp;
1727
+ $tmp = $$extra{$key}{G3} || '';
1730
1728
  if ($tmp eq $doc) {
1731
1729
  $docFlags = $$value{$key};
1732
1730
  last;
@@ -1739,8 +1737,7 @@ sub ProcessDocumentTable($)
1739
1737
  my $key = $tag . ($j ? " ($j)" : '');
1740
1738
  last unless defined $$value{$key};
1741
1739
  my $tmp;
1742
- $tmp = $$extra{$key}{G3} if $$extra{$key};
1743
- $tmp = '' unless $tmp;
1740
+ $tmp = $$extra{$key}{G3} || '';
1744
1741
  if ($tmp eq $doc) {
1745
1742
  $docTable = \$$value{$key};
1746
1743
  last;
@@ -2505,8 +2502,7 @@ sub ProcessFPX($$)
2505
2502
  for ($copy=1; ;++$copy) {
2506
2503
  my $key = "$tag ($copy)";
2507
2504
  last unless defined $$et{VALUE}{$key};
2508
- my $extra = $$et{TAG_EXTRA}{$key};
2509
- next if $extra and $$extra{G3}; # not Main if family 3 group is set
2505
+ next if $$et{TAG_EXTRA}{$key}{G3}; # not Main if family 3 group is set
2510
2506
  foreach $member ('PRIORITY','VALUE','FILE_ORDER','TAG_INFO','TAG_EXTRA') {
2511
2507
  my $pHash = $$et{$member};
2512
2508
  my $t = $$pHash{$tag};
Binary file
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:Public);
32
32
  use Image::ExifTool::GPS;
33
33
 
34
- $VERSION = '1.78';
34
+ $VERSION = '1.80';
35
35
 
36
36
  sub JITTER() { return 2 } # maximum time jitter
37
37
 
@@ -562,8 +562,8 @@ DoneFix: $isDate = 1;
562
562
  next;
563
563
  } elsif ($format eq 'JSON') {
564
564
  # Google Takeout JSON format
565
- if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
566
- if ($1 eq 'timestamp') {
565
+ if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime|time)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
566
+ if ($1 eq 'timestamp' or $1 eq 'time') {
567
567
  $time = GetTime($2);
568
568
  goto DoneFix if $time and $$fix{lat} and $$fix{lon};
569
569
  } elsif ($1 eq 'startTime') { # (new format)
@@ -1127,8 +1127,9 @@ sub SetGeoValues($$;$)
1127
1127
  $iExt = $i1;
1128
1128
  }
1129
1129
  if (abs($time - $tn) > $geoMaxExtSecs) {
1130
- $err or $err = 'Time is too far from nearest GPS fix'.' '.abs($time-$tn).' > '.$geoMaxExtSecs;
1131
- $et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), "\n") if $verbose > 2;
1130
+ $err or $err = 'Time is too far from nearest GPS fix';
1131
+ $et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), ' (',
1132
+ int(abs $time-$tn), " sec away)\n") if $verbose > 2;
1132
1133
  $fix = { } if $$geotag{DateTimeOnly};
1133
1134
  } else {
1134
1135
  $fix = $$points{$tn};
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::QuickTime;
18
18
 
19
- $VERSION = '1.08';
19
+ $VERSION = '1.09';
20
20
 
21
21
  sub ProcessGoPro($$$);
22
22
  sub ProcessString($$$);
@@ -604,7 +604,7 @@ sub ScaleValues($$)
604
604
  sub AddUnits($$$)
605
605
  {
606
606
  my ($et, $val, $tag) = @_;
607
- if ($et and $$et{TAG_EXTRA}{$tag} and $$et{TAG_EXTRA}{$tag}{Units}) {
607
+ if ($et and $$et{TAG_EXTRA}{$tag}{Units}) {
608
608
  my $u = $$et{TAG_EXTRA}{$tag}{Units};
609
609
  $u = [ $u ] unless ref $u eq 'ARRAY';
610
610
  my @a = split ' ', $val;
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.41';
19
+ $VERSION = '1.42';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -1338,7 +1338,7 @@ sub ProcessJpeg2000Box($$$)
1338
1338
  if (defined $val) {
1339
1339
  my $key = $et->FoundTag($tagInfo, $val);
1340
1340
  # save Rational value
1341
- $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key;
1341
+ $$et{TAG_EXTRA}{$key}{Rational} = $rational if defined $rational and defined $key;
1342
1342
  }
1343
1343
  } elsif ($outfile) {
1344
1344
  my $boxhdr = pack('N', $boxLen + 8) . $boxID;
@@ -650,7 +650,7 @@ sub ProcessLNK($$)
650
650
  my $mask = 0x04 << $i;
651
651
  next unless $flags & $mask;
652
652
  $raf->Read($buff, 2) or return 1;
653
- $len = unpack('v', $buff);
653
+ $len = unpack('v', $buff) or next;
654
654
  $len *= 2 if $flags & 0x80; # characters are 2 bytes if Unicode flag is set
655
655
  $raf->Read($buff, $len) or return 1;
656
656
  my $val;
@@ -32,7 +32,7 @@ use strict;
32
32
  use vars qw($VERSION);
33
33
  use Image::ExifTool qw(:DataAccess :Utils);
34
34
 
35
- $VERSION = '1.25';
35
+ $VERSION = '1.26';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -82,7 +82,7 @@ my %streamType = (
82
82
  0x86 => 'DTS-HD Audio',
83
83
  0x87 => 'E-AC-3 Audio',
84
84
  0x8a => 'DTS Audio',
85
- 0x90 => 'PGS Audio', #https://www.avsforum.com/threads/bass-eq-for-filtered-movies.2995212/page-399
85
+ 0x90 => 'Presentation Graphic Stream (subtitle)', #https://en.wikipedia.org/wiki/Program-specific_information
86
86
  0x91 => 'A52b/AC-3 Audio',
87
87
  0x92 => 'DVD_SPU vls Subtitle',
88
88
  0x94 => 'SDDS Audio',
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::GPS;
16
16
 
17
- $VERSION = '1.54';
17
+ $VERSION = '1.55';
18
18
 
19
19
  sub ProcessMIE($$);
20
20
  sub ProcessMIEGroup($$$);
@@ -1596,9 +1596,10 @@ sub ProcessMIEGroup($$$)
1596
1596
  } else {
1597
1597
  # process MIE data format types
1598
1598
  if ($tagInfo) {
1599
- my $rational;
1599
+ my ($rational, $binVal);
1600
1600
  # extract tag value
1601
1601
  my $val = ReadMIEValue(\$value, 0, $formatStr, undef, $valLen, \$rational);
1602
+ $binVal = substr($value, 0, $valLen) if $$et{OPTIONS}{SaveBin};
1602
1603
  unless (defined $val) {
1603
1604
  $et->Warn("Error reading $tag value");
1604
1605
  $val = '<err>';
@@ -1661,7 +1662,12 @@ sub ProcessMIEGroup($$$)
1661
1662
  $val .= "($units)" if defined $units;
1662
1663
  }
1663
1664
  my $key = $et->FoundTag($tagInfo, $val);
1664
- $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key;
1665
+ if (defined $key) {
1666
+ my $ex = $$et{TAG_EXTRA}{$key};
1667
+ $$ex{Rational} = $rational if defined $rational;
1668
+ $$ex{BinVal} = $binVal if defined $binVal;
1669
+ $$ex{G6} = $formatStr if $$et{OPTIONS}{SaveFormat};
1670
+ }
1665
1671
  }
1666
1672
  } else {
1667
1673
  # skip over unknown information or free bytes
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool qw(:DataAccess :Utils);
14
14
 
15
- $VERSION = '1.13';
15
+ $VERSION = '1.14';
16
16
 
17
17
  sub MDItemLocalTime($);
18
18
  sub ProcessATTR($$$);
@@ -394,6 +394,7 @@ sub SetMacOSTags($$$)
394
394
  if ($val =~ /[-+Z]/) {
395
395
  my $time = Image::ExifTool::GetUnixTime($val, 1);
396
396
  $val = Image::ExifTool::ConvertUnixTime($time, 1) if $time;
397
+ $val =~ s/[-+].*//; # remove time zone
397
398
  }
398
399
  $val =~ s{(\d{4}):(\d{2}):(\d{2})}{$2/$3/$1}; # reformat for setfile
399
400
  $cmd = "/usr/bin/setfile -d '${val}' '${f}'";
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
65
65
  use Image::ExifTool::GPS;
66
66
  use Image::ExifTool::XMP;
67
67
 
68
- $VERSION = '4.38';
68
+ $VERSION = '4.39';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -13609,7 +13609,10 @@ sub ProcessNikonMOV($$$)
13609
13609
  Size => $size,
13610
13610
  Base => $$dirInfo{Base},
13611
13611
  );
13612
- $$et{RATIONAL}{$key} = $rational if $rational and $key;
13612
+ if ($key) {
13613
+ $$et{TAG_EXTRA}{$key}{Rational} = $rational if $rational;
13614
+ $$et{TAG_EXTRA}{$key}{BinVal} = substr($$dataPt, $pos, $size) if $$et{OPTIONS}{SaveBin};
13615
+ }
13613
13616
  } elsif (exists $needTags{$tag}) {
13614
13617
  $needTags{$tag} = ReadValue($dataPt, $pos, $fmtStr, $count, $size);
13615
13618
  $$et{NikonSerialKey} = SerialKey($et, $needTags{0x110a431});
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  require Exporter;
23
23
 
24
- $VERSION = '1.58';
24
+ $VERSION = '1.59';
25
25
 
26
26
  sub FetchObject($$$$);
27
27
  sub ExtractObject($$;$$);
@@ -1595,9 +1595,13 @@ sub DecryptInit($$$)
1595
1595
  $password = $et->Options('Password');
1596
1596
  return 'Document is password protected (use Password option)' unless defined $password;
1597
1597
  # make sure there is no UTF-8 flag on the password
1598
- if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($password) } or $@)) {
1598
+ if ($] >= 5.006 and ($$et{OPTIONS}{EncodeHangs} or
1599
+ eval { require Encode; Encode::is_utf8($password) } or $@))
1600
+ {
1601
+ local $SIG{'__WARN__'} = sub { };
1599
1602
  # repack by hand if Encode isn't available
1600
- $password = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$password)) : Encode::encode('utf8',$password);
1603
+ $password = ($$et{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
1604
+ 'U0C*' : 'C0C*', $password)) : Encode::encode('utf8', $password);
1601
1605
  }
1602
1606
  } else {
1603
1607
  return 'Incorrect password';
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
  use Image::ExifTool::Exif;
17
17
 
18
- $VERSION = '1.10';
18
+ $VERSION = '1.11';
19
19
 
20
20
  sub WritePhaseOne($$$);
21
21
  sub ProcessPhaseOne($$$);
@@ -71,6 +71,7 @@ my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' );
71
71
  # >2 = compressed
72
72
  # 5 = non-linear
73
73
  PrintConv => { #PH
74
+ 0 => 'Uncompressed', #https://github.com/darktable-org/darktable/issues/7308
74
75
  1 => 'RAW 1', #? (encrypted)
75
76
  2 => 'RAW 2', #? (encrypted)
76
77
  3 => 'IIQ L', # (now "L14", ref IB)
@@ -591,8 +591,8 @@ my %insvLimit = (
591
591
  GROUPS => { 2 => 'Location' },
592
592
  FIRST_ENTRY => 0,
593
593
  NOTES => q{
594
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
595
- subtitle text in some other videos.
594
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
595
+ and subtitle text in some other videos.
596
596
  },
597
597
  Lat => {
598
598
  Name => 'GPSLatitude',
@@ -619,6 +619,32 @@ my %insvLimit = (
619
619
  PrintConv => '$self->ConvertDateTime($val)',
620
620
  },
621
621
  Text => { Groups => { 2 => 'Other' } },
622
+ # the following tags are extracted from Autel Evo II drone videos
623
+ GPSDateTime => {
624
+ Groups => { 2 => 'Time' },
625
+ Description => 'GPS Date/Time',
626
+ PrintConv => '$self->ConvertDateTime($val)',
627
+ },
628
+ HomeLat => {
629
+ Name => 'GPSHomeLatitude',
630
+ RawConv => '$$self{FoundGPSLatitude} = 1; $val',
631
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
632
+ },
633
+ HomeLon => {
634
+ Name => 'GPSHomeLongitude',
635
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
636
+ },
637
+ ISO => { },
638
+ SHUTTER => {
639
+ Name => 'ExposureTime',
640
+ ValueConv => '1 / $val',
641
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
642
+ },
643
+ 'F-NUM' => {
644
+ Name => 'FNumber',
645
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
646
+ },
647
+ EV => 'ExposureCompensation',
622
648
  );
623
649
 
624
650
  %Image::ExifTool::QuickTime::INSV_MakerNotes = (
@@ -2361,7 +2387,7 @@ sub ParseTag($$$)
2361
2387
  }
2362
2388
 
2363
2389
  #------------------------------------------------------------------------------
2364
- # Process Yuneec 'tx3g' sbtl metadata (ref PH)
2390
+ # Process Yuneec 'tx3g' and Autel sbtl metadata (ref PH)
2365
2391
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2366
2392
  # Returns: 1 on success
2367
2393
  sub Process_tx3g($$$)
@@ -2369,13 +2395,49 @@ sub Process_tx3g($$$)
2369
2395
  my ($et, $dirInfo, $tagTablePtr) = @_;
2370
2396
  my $dataPt = $$dirInfo{DataPt};
2371
2397
  return 0 if length $$dataPt < 2;
2372
- pos($$dataPt) = 2; # skip 2-byte length word
2373
2398
  $et->VerboseDir('tx3g', undef, length($$dataPt)-2);
2374
- $et->HandleTag($tagTablePtr, 'Text', substr($$dataPt, 2));
2375
- if ($$dataPt =~ /^..\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
2399
+ my $text = substr($$dataPt, 2); # remove 2-byte length word
2400
+ $et->HandleTag($tagTablePtr, 'Text', $text);
2401
+ if ($text =~ /^HOME\(/) {
2402
+ # --- sample text from Autel Evo II drone ---
2403
+ # HOME(W: 109.318642, N: 40.769371) 2023-09-12 10:28:07
2404
+ # GPS(W: 109.339287, N: 40.768574, 2371.76m)
2405
+ # HDR ISO:100 SHUTTER:1000 EV:-0.7 F-NUM:1.8
2406
+ # F.PRY (1.0\xc2\xb0, -3.7\xc2\xb0, -59.0\xc2\xb0), G.PRY (-51.1\xc2\xb0, 0.0\xc2\xb0, -58.9\xc2\xb0)
2407
+ my $line;
2408
+ foreach $line (split /\x0a/, $text) {
2409
+ if ($line =~ /^HOME\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+)\)\s*(.*)/) {
2410
+ my ($lon, $lat, $time) = ($2, $4, $5);
2411
+ $lon = -$lon if $1 eq 'W';
2412
+ $lat = -$lat if $3 eq 'S';
2413
+ $time =~ tr/-/:/; # (likely local time zone, but not confirmed)
2414
+ $et->HandleTag($tagTablePtr, GPSDateTime => $time);
2415
+ $et->HandleTag($tagTablePtr, HomeLat => $lat);
2416
+ $et->HandleTag($tagTablePtr, HomeLon => $lon);
2417
+ } elsif ($line =~ /^GPS\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+),\s*(.*)m/) {
2418
+ my ($lon, $lat, $alt) = ($2, $4, $5);
2419
+ $lon = -$lon if $1 eq 'W';
2420
+ $lat = -$lat if $3 eq 'S';
2421
+ $et->HandleTag($tagTablePtr, Lat => $lat);
2422
+ $et->HandleTag($tagTablePtr, Lon => $lon);
2423
+ $et->HandleTag($tagTablePtr, Alt => $alt);
2424
+ } elsif ($line =~ /^F\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
2425
+ $et->HandleTag($tagTablePtr, Yaw => $1);
2426
+ $et->HandleTag($tagTablePtr, Pitch => $2);
2427
+ $et->HandleTag($tagTablePtr, Roll => $3);
2428
+ if ($line =~ /G\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
2429
+ $et->HandleTag($tagTablePtr, GimYaw => $1);
2430
+ $et->HandleTag($tagTablePtr, GimPitch => $2);
2431
+ $et->HandleTag($tagTablePtr, GimRoll => $3);
2432
+ }
2433
+ } else {
2434
+ $et->HandleTag($tagTablePtr, $1, $2) while $line =~ /([-\w]+):([^:]*[^:\s])(\s|$)/sg;
2435
+ }
2436
+ }
2437
+ } elsif ($text =~ /^\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
2376
2438
  $et->HandleTag($tagTablePtr, 'DateTime', "$1:$2:$3 $4$5$6:$7");
2377
2439
  } else {
2378
- $et->HandleTag($tagTablePtr, $1, $2) while $$dataPt =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
2440
+ $et->HandleTag($tagTablePtr, $1, $2) while $text =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
2379
2441
  }
2380
2442
  return 1;
2381
2443
  }
@@ -1349,7 +1349,7 @@ my %tagLookup = (
1349
1349
  'camerae-mountversion' => { 490 => 0xb },
1350
1350
  'cameraelevationangle' => { 124 => 0x9405, 524 => 'CameraElevationAngle' },
1351
1351
  'camerafilename' => { 507 => 'CameraFilename' },
1352
- 'camerafirmware' => { 124 => 0xa439 },
1352
+ 'camerafirmware' => { 124 => 0xa439, 524 => 'CameraFirmware' },
1353
1353
  'cameraid' => { 333 => 0x209, 413 => 'cmid', 429 => 0x209 },
1354
1354
  'cameraidentifier' => { 407 => 'camera.identifier' },
1355
1355
  'cameraimage' => { 495 => [\'Cameras','CamerasCameraImage'] },
@@ -3728,8 +3728,8 @@ my %tagLookup = (
3728
3728
  'imagedustoff' => { 300 => 0xfe443a45 },
3729
3729
  'imageeditcount' => { 388 => 0x41 },
3730
3730
  'imageediting' => { 388 => 0x32 },
3731
- 'imageeditingsoftware' => { 124 => 0xa43b },
3732
- 'imageeditor' => { 124 => 0xa438 },
3731
+ 'imageeditingsoftware' => { 124 => 0xa43b, 524 => 'ImageEditingSoftware' },
3732
+ 'imageeditor' => { 124 => 0xa438, 524 => 'ImageEditor' },
3733
3733
  'imageeffects' => { 420 => 0x1010 },
3734
3734
  'imagefileconstraints' => { 338 => 'ImageFileConstraints' },
3735
3735
  'imagefileformatasdelivered' => { 338 => 'ImageFileFormatAsDelivered' },
@@ -3805,9 +3805,10 @@ my %tagLookup = (
3805
3805
  'imagesuppliername' => { 338 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
3806
3806
  'imagetemperaturemax' => { 126 => 0x1 },
3807
3807
  'imagetemperaturemin' => { 126 => 0x2 },
3808
+ 'imagetitle' => { 124 => 0xa436, 524 => 'ImageTitle' },
3808
3809
  'imagetone' => { 388 => 0x4f },
3809
3810
  'imagetype' => { 136 => 0x82, 338 => 'ImageType' },
3810
- 'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID' },
3811
+ 'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID', 524 => 'ImageUniqueID' },
3811
3812
  'imagewidth' => { 124 => 0x100, 193 => 0xe, 397 => 0x10c, 502 => 'ImageWidth', 542 => 'ImageWidth' },
3812
3813
  'inclinationangle' => { 491 => 0x900f },
3813
3814
  'inclinationcorrection' => { 491 => 0x900e },
@@ -4796,7 +4797,7 @@ my %tagLookup = (
4796
4797
  'metadataauthorityidentifier' => { 531 => [\'metadataAuthority','metadataAuthorityIdentifier'] },
4797
4798
  'metadataauthorityname' => { 531 => [\'metadataAuthority','metadataAuthorityName'] },
4798
4799
  'metadatadate' => { 544 => 'MetadataDate' },
4799
- 'metadataeditingsoftware' => { 124 => 0xa43c },
4800
+ 'metadataeditingsoftware' => { 124 => 0xa43c, 524 => 'MetadataEditingSoftware' },
4800
4801
  'metadatalastedited' => { 531 => 'metadataLastEdited' },
4801
4802
  'metadatalasteditor' => { 531 => 'metadataLastEditor' },
4802
4803
  'metadatalasteditoridentifier' => { 531 => [\'metadataLastEditor','metadataLastEditorIdentifier'] },
@@ -5599,7 +5600,7 @@ my %tagLookup = (
5599
5600
  'photoeffectsgreen' => { 302 => 0x6 },
5600
5601
  'photoeffectsred' => { 302 => 0x4 },
5601
5602
  'photoeffectstype' => { 302 => 0x0 },
5602
- 'photographer' => { 124 => 0xa437 },
5603
+ 'photographer' => { 124 => 0xa437, 524 => 'Photographer' },
5603
5604
  'photographicsensitivity' => { 524 => 'PhotographicSensitivity' },
5604
5605
  'photoidentifier' => { 1 => 0x2b },
5605
5606
  'photoinfoplayback' => { 307 => '17.6', 316 => '33.6' },
@@ -5946,7 +5947,7 @@ my %tagLookup = (
5946
5947
  'rawdevcolorspace' => { 334 => 0x108, 335 => 0x109 },
5947
5948
  'rawdevcontrastvalue' => { 334 => 0x106, 335 => 0x105 },
5948
5949
  'rawdeveditstatus' => { 334 => 0x10b },
5949
- 'rawdevelopingsoftware' => { 124 => 0xa43a },
5950
+ 'rawdevelopingsoftware' => { 124 => 0xa43a, 524 => 'RAWDevelopingSoftware' },
5950
5951
  'rawdevelopmentprocess' => { 388 => 0x62 },
5951
5952
  'rawdevengine' => { 334 => 0x109, 335 => 0x10b },
5952
5953
  'rawdevexposurebiasvalue' => { 334 => 0x100, 335 => 0x100 },
@@ -6940,7 +6941,7 @@ my %tagLookup = (
6940
6941
  'timezoneinfo' => { 105 => 0x2 },
6941
6942
  'timezoneoffset' => { 124 => 0x882a },
6942
6943
  'tint' => { 407 => 'player.movie.visual.tint', 517 => 'Tint', 519 => 'Tint' },
6943
- 'title' => { 124 => 0xa436, 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
6944
+ 'title' => { 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
6944
6945
  'togglestyleamount' => { 517 => 'ToggleStyleAmount', 519 => 'ToggleStyleAmount' },
6945
6946
  'togglestyledigest' => { 517 => 'ToggleStyleDigest', 519 => 'ToggleStyleDigest' },
6946
6947
  'tonecomp' => { 241 => 0x81 },
@@ -9742,6 +9743,8 @@ my %tagExists = (
9742
9743
  'gpsframingaltitude' => 1,
9743
9744
  'gpsframinglatitude' => 1,
9744
9745
  'gpsframinglongitude' => 1,
9746
+ 'gpshomelatitude' => 1,
9747
+ 'gpshomelongitude' => 1,
9745
9748
  'gpshorizontalaccuracy' => 1,
9746
9749
  'gpsinfo' => 1,
9747
9750
  'gpslatitude2' => 1,
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 28150 tags, with 17488 unique tag names.
15
+ They contain a total of 28165 tags, with 17491 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -871,7 +871,7 @@ for the official EXIF 2.32 specification.
871
871
  0xa433 LensMake ExifIFD string
872
872
  0xa434 LensModel ExifIFD string
873
873
  0xa435 LensSerialNumber ExifIFD string
874
- 0xa436 Title ExifIFD string/
874
+ 0xa436 ImageTitle ExifIFD string
875
875
  0xa437 Photographer ExifIFD string
876
876
  0xa438 ImageEditor ExifIFD string
877
877
  0xa439 CameraFirmware ExifIFD string
@@ -4605,7 +4605,7 @@ These tags belong to the ExifTool XMP-exif family 1 group.
4605
4605
  GPSTrack rational
4606
4606
  GPSTrackRef string
4607
4607
  GPSVersionID string
4608
- ImageUniqueID string
4608
+ ImageUniqueID string/
4609
4609
  ISO integer+
4610
4610
  LightSource string
4611
4611
  MakerNote string
@@ -4686,6 +4686,7 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4686
4686
  Acceleration rational
4687
4687
  SerialNumber string
4688
4688
  CameraElevationAngle rational
4689
+ CameraFirmware string
4689
4690
  OwnerName string
4690
4691
  CompositeImage integer
4691
4692
  CompositeImageCount integer+
@@ -4702,6 +4703,10 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4702
4703
  CompImageValues rational_+
4703
4704
  Gamma rational
4704
4705
  Humidity rational
4706
+ ImageEditingSoftware string
4707
+ ImageEditor string
4708
+ ImageTitle string
4709
+ ImageUniqueID string
4705
4710
  InteropIndex string
4706
4711
  ISOSpeed integer
4707
4712
  ISOSpeedLatitudeyyy integer
@@ -4710,8 +4715,11 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4710
4715
  LensModel string
4711
4716
  LensSerialNumber string
4712
4717
  LensInfo rational+
4718
+ MetadataEditingSoftware string
4719
+ Photographer string
4713
4720
  PhotographicSensitivity integer
4714
4721
  Pressure rational
4722
+ RAWDevelopingSoftware string
4715
4723
  RecommendedExposureIndex integer
4716
4724
  SensitivityType integer
4717
4725
  StandardOutputSensitivity integer
@@ -30187,22 +30195,29 @@ changed via the config file.
30187
30195
 
30188
30196
  =head3 QuickTime tx3g Tags
30189
30197
 
30190
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
30191
- subtitle text in some other videos.
30198
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
30199
+ and subtitle text in some other videos.
30192
30200
 
30193
- Tag ID Tag Name Writable
30194
- ------ -------- --------
30195
- 'Alt' GPSAltitude no
30196
- 'DateTime' DateTime no
30197
- 'GimPitch' GimbalPitch no
30198
- 'GimRoll' GimbalRoll no
30199
- 'GimYaw' GimbalYaw no
30200
- 'Lat' GPSLatitude no
30201
- 'Lon' GPSLongitude no
30202
- 'Pitch' Pitch no
30203
- 'Roll' Roll no
30204
- 'Text' Text no
30205
- 'Yaw' Yaw no
30201
+ Tag ID Tag Name Writable
30202
+ ------ -------- --------
30203
+ 'Alt' GPSAltitude no
30204
+ 'DateTime' DateTime no
30205
+ 'EV' ExposureCompensation no
30206
+ 'F-NUM' FNumber no
30207
+ 'GPSDateTime' GPSDateTime no
30208
+ 'GimPitch' GimbalPitch no
30209
+ 'GimRoll' GimbalRoll no
30210
+ 'GimYaw' GimbalYaw no
30211
+ 'HomeLat' GPSHomeLatitude no
30212
+ 'HomeLon' GPSHomeLongitude no
30213
+ 'ISO' ISO no
30214
+ 'Lat' GPSLatitude no
30215
+ 'Lon' GPSLongitude no
30216
+ 'Pitch' Pitch no
30217
+ 'Roll' Roll no
30218
+ 'SHUTTER' ExposureTime no
30219
+ 'Text' Text no
30220
+ 'Yaw' Yaw no
30206
30221
 
30207
30222
  =head3 QuickTime HTCInfo Tags
30208
30223
 
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.04';
18
+ $VERSION = '1.05';
19
19
 
20
20
  # Text tags
21
21
  %Image::ExifTool::Text::Main = (
@@ -191,7 +191,8 @@ sub ProcessTXT($$)
191
191
  $enc = 'unknown-8bit';
192
192
  }
193
193
  }
194
- if ($$et{VALUE}{MIMEEncoding} ne $enc) {
194
+ # ($$et{VALUE}{MIMEEncoding} may be undef if it was ignored)
195
+ if (defined $$et{VALUE}{MIMEEncoding} and $$et{VALUE}{MIMEEncoding} ne $enc) {
195
196
  $$et{VALUE}{MIMEEncoding} = $enc;
196
197
  $et->VPrint(0," MIMEEncoding [override] = $enc\n");
197
198
  }
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
17
17
  use strict;
18
18
  use vars qw($VERSION %exifSpec);
19
19
 
20
- $VERSION = '1.23';
20
+ $VERSION = '1.24';
21
21
 
22
22
  use Image::ExifTool qw(:Utils);
23
23
  use Image::ExifTool::Exif;
@@ -575,7 +575,7 @@ sub FinishValidate($$)
575
575
  # get all tags in this group
576
576
  foreach $key (sort keys %{$$et{VALUE}}) {
577
577
  next unless $et->GetGroup($key, 1) eq $grp;
578
- next if $$et{TAG_EXTRA}{$key} and $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
578
+ next if $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
579
579
  # fill in %val lookup with values based on tag ID
580
580
  my $tag = $$et{TAG_INFO}{$key}{TagID};
581
581
  $val{$tag} = $$et{VALUE}{$key};