exiftool_vendored 12.76.1 → 12.81.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +105 -4
  3. data/bin/MANIFEST +29 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +4 -3
  7. data/bin/config_files/acdsee.config +37 -57
  8. data/bin/config_files/example.config +16 -2
  9. data/bin/exiftool +102 -31
  10. data/bin/lib/Image/ExifTool/Canon.pm +12 -9
  11. data/bin/lib/Image/ExifTool/CanonVRD.pm +8 -2
  12. data/bin/lib/Image/ExifTool/Exif.pm +52 -4
  13. data/bin/lib/Image/ExifTool/FujiFilm.pm +14 -5
  14. data/bin/lib/Image/ExifTool/GPS.pm +5 -3
  15. data/bin/lib/Image/ExifTool/GeoLang/cs.pm +978 -0
  16. data/bin/lib/Image/ExifTool/GeoLang/de.pm +1975 -0
  17. data/bin/lib/Image/ExifTool/GeoLang/en_ca.pm +44 -0
  18. data/bin/lib/Image/ExifTool/GeoLang/en_gb.pm +124 -0
  19. data/bin/lib/Image/ExifTool/GeoLang/es.pm +2921 -0
  20. data/bin/lib/Image/ExifTool/GeoLang/fi.pm +1116 -0
  21. data/bin/lib/Image/ExifTool/GeoLang/fr.pm +3171 -0
  22. data/bin/lib/Image/ExifTool/GeoLang/it.pm +2750 -0
  23. data/bin/lib/Image/ExifTool/GeoLang/ja.pm +10256 -0
  24. data/bin/lib/Image/ExifTool/GeoLang/ko.pm +4499 -0
  25. data/bin/lib/Image/ExifTool/GeoLang/nl.pm +1270 -0
  26. data/bin/lib/Image/ExifTool/GeoLang/pl.pm +3019 -0
  27. data/bin/lib/Image/ExifTool/GeoLang/ru.pm +18220 -0
  28. data/bin/lib/Image/ExifTool/GeoLang/sk.pm +441 -0
  29. data/bin/lib/Image/ExifTool/GeoLang/sv.pm +714 -0
  30. data/bin/lib/Image/ExifTool/GeoLang/tr.pm +452 -0
  31. data/bin/lib/Image/ExifTool/GeoLang/zh_cn.pm +2225 -0
  32. data/bin/lib/Image/ExifTool/GeoLang/zh_tw.pm +72 -0
  33. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  34. data/bin/lib/Image/ExifTool/Geolocation.pm +935 -0
  35. data/bin/lib/Image/ExifTool/Geotag.pm +14 -2
  36. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -1
  37. data/bin/lib/Image/ExifTool/Import.pm +5 -2
  38. data/bin/lib/Image/ExifTool/JSON.pm +15 -10
  39. data/bin/lib/Image/ExifTool/M2TS.pm +32 -4
  40. data/bin/lib/Image/ExifTool/MWG.pm +1 -0
  41. data/bin/lib/Image/ExifTool/MacOS.pm +19 -4
  42. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  43. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Nikon.pm +331 -23
  45. data/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
  46. data/bin/lib/Image/ExifTool/Ogg.pm +3 -2
  47. data/bin/lib/Image/ExifTool/Olympus.pm +4 -1
  48. data/bin/lib/Image/ExifTool/OpenEXR.pm +37 -19
  49. data/bin/lib/Image/ExifTool/PDF.pm +5 -5
  50. data/bin/lib/Image/ExifTool/PNG.pm +3 -3
  51. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  52. data/bin/lib/Image/ExifTool/QuickTime.pm +195 -12
  53. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
  54. data/bin/lib/Image/ExifTool/README +6 -5
  55. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  56. data/bin/lib/Image/ExifTool/TagLookup.pm +4871 -4752
  57. data/bin/lib/Image/ExifTool/TagNames.pod +722 -383
  58. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +43 -9
  59. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  60. data/bin/lib/Image/ExifTool/Writer.pl +65 -8
  61. data/bin/lib/Image/ExifTool/XMP.pm +18 -2
  62. data/bin/lib/Image/ExifTool/XMP2.pl +64 -0
  63. data/bin/lib/Image/ExifTool.pm +265 -49
  64. data/bin/lib/Image/ExifTool.pod +63 -25
  65. data/bin/perl-Image-ExifTool.spec +2 -2
  66. data/lib/exiftool_vendored/version.rb +1 -1
  67. metadata +22 -2
@@ -148,6 +148,7 @@ sub PrintInvGPSCoordinates($)
148
148
  $v[2] = Image::ExifTool::ToFloat($v[2]) * ($below ? -1 : 1) if @v == 3;
149
149
  return "@v";
150
150
  }
151
+ return $val if $val =~ /^([-+]?\d+(\.\d*)?)\s+([-+]?\d+(\.\d*)?)$/; # already 2 floats?
151
152
  return $val if $val =~ /^([-+]\d+(\.\d*)?){2,3}(CRS.*)?\/?$/; # already in ISO6709 format?
152
153
  return undef;
153
154
  }
@@ -356,6 +357,18 @@ sub SetVarInt($$)
356
357
  return '';
357
358
  }
358
359
 
360
+ #------------------------------------------------------------------------------
361
+ # Write Nextbase infi atom (ref PH)
362
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
363
+ # Returns: updated infi data
364
+ sub WriteNextbase($$$)
365
+ {
366
+ my ($et, $dirInfo, $tagTablePtr) = @_;
367
+ $et or return 1;
368
+ $$et{DEL_GROUP}{Nextbase} and ++$$et{CHANGED}, return '';
369
+ return ${$$dirInfo{DataPt}};
370
+ }
371
+
359
372
  #------------------------------------------------------------------------------
360
373
  # Write Meta Keys to add/delete entries as necessary ('mdta' handler) (ref PH)
361
374
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -772,6 +785,7 @@ sub WriteQuickTime($$$)
772
785
  $et or return 1; # allow dummy access to autoload this package
773
786
  my ($mdat, @mdat, @mdatEdit, $edit, $track, $outBuff, $co, $term, $delCount);
774
787
  my (%langTags, $canCreate, $delGrp, %boxPos, %didDir, $writeLast, $err, $atomCount);
788
+ my ($tag, $lastTag, $errStr);
775
789
  my $outfile = $$dirInfo{OutFile} || return 0;
776
790
  my $raf = $$dirInfo{RAF}; # (will be null for lower-level atoms)
777
791
  my $dataPt = $$dirInfo{DataPt}; # (will be null for top-level atoms)
@@ -844,7 +858,10 @@ sub WriteQuickTime($$$)
844
858
  }
845
859
  $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT} if $$tagTablePtr{VARS};
846
860
 
861
+ $tag = $lastTag = '';
862
+
847
863
  for (;;) { # loop through all atoms at this level
864
+ $lastTag = $tag if $$tagTablePtr{$tag}; # keep track of last known tag
848
865
  if (defined $atomCount and --$atomCount < 0 and $dataPt) {
849
866
  # stop processing now and just copy the rest of the atom
850
867
  Write($outfile, substr($$dataPt, $raf->Tell())) or $rtnVal=$rtnErr, $err=1;
@@ -863,15 +880,15 @@ sub WriteQuickTime($$$)
863
880
  last;
864
881
  }
865
882
  my $size = Get32u(\$hdr, 0) - 8; # (atom size without 8-byte header)
866
- my $tag = substr($hdr, 4, 4);
883
+ $tag = substr($hdr, 4, 4);
867
884
  if ($size == -7) {
868
885
  # read the extended size
869
- $raf->Read($buff, 8) == 8 or $et->Error('Truncated extended atom'), last;
886
+ $raf->Read($buff, 8) == 8 or $errStr = 'Truncated extended atom', last;
870
887
  $hdr .= $buff;
871
888
  my ($hi, $lo) = unpack('NN', $buff);
872
889
  if ($hi or $lo > 0x7fffffff) {
873
890
  if ($hi > 0x7fffffff) {
874
- $et->Error('Invalid atom size');
891
+ $errStr = 'Invalid atom size';
875
892
  last;
876
893
  } elsif (not $et->Options('LargeFileSupport')) {
877
894
  $et->Error('End of processing at large atom (LargeFileSupport not enabled)');
@@ -879,7 +896,7 @@ sub WriteQuickTime($$$)
879
896
  }
880
897
  }
881
898
  $size = $hi * 4294967296 + $lo - 16;
882
- $size < 0 and $et->Error('Invalid extended atom size'), last;
899
+ $size < 0 and $errStr = 'Invalid extended atom size', last;
883
900
  } elsif ($size == -8) {
884
901
  if ($dataPt) {
885
902
  last if $$dirInfo{DirName} eq 'CanonCNTH'; # (this is normal for Canon CNTH atom)
@@ -895,7 +912,7 @@ sub WriteQuickTime($$$)
895
912
  }
896
913
  last;
897
914
  } elsif ($size < 0) {
898
- $et->Error('Invalid atom size');
915
+ $errStr = 'Invalid atom size';
899
916
  last;
900
917
  }
901
918
 
@@ -939,11 +956,11 @@ sub WriteQuickTime($$$)
939
956
  $tag = PrintableTagID($tag,3);
940
957
  if ($size > $maxReadLen and $got == 0x10000) {
941
958
  my $mb = int($size / 0x100000 + 0.5);
942
- $et->Error("'${tag}' atom is too large for rewriting ($mb MB)");
959
+ $errStr = "'${tag}' atom is too large for rewriting ($mb MB)";
943
960
  } else {
944
- $et->Error("Truncated '${tag}' atom");
961
+ $errStr = "Truncated '${tag}' atom";
945
962
  }
946
- return $rtnVal;
963
+ last;
947
964
  }
948
965
  }
949
966
  # save the handler type for this track
@@ -1433,6 +1450,22 @@ sub WriteQuickTime($$$)
1433
1450
  Write($outfile, $hdr, $buff) or $rtnVal=$rtnErr, $err=1, last;
1434
1451
  }
1435
1452
  }
1453
+ # ($errStr is set if there was an error that could possibly be due to an unknown trailer)
1454
+ if ($errStr) {
1455
+ if ($lastTag eq 'mdat' and not $dataPt and not $$tagTablePtr{$tag}) {
1456
+ my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
1457
+ if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
1458
+ $errStr =~ s/ is too large.*//;
1459
+ $et->Warn('Deleted unknown trailer with ' . lcfirst($errStr));
1460
+ } else {
1461
+ $et->Warn('Unknown trailer with ' . lcfirst($errStr));
1462
+ $et->Error('Use "-trailer=" to delete unknown trailer');
1463
+ }
1464
+ } else {
1465
+ $et->Error($errStr);
1466
+ return $dataPt ? undef : 1;
1467
+ }
1468
+ }
1436
1469
  $et->VPrint(0, " [deleting $delCount $dirName tag".($delCount==1 ? '' : 's')."]\n") if $delCount;
1437
1470
 
1438
1471
  $createKeys &= ~0x01 unless $$addDirs{Keys}; # (Keys may have been written)
@@ -1619,7 +1652,8 @@ sub WriteQuickTime($$$)
1619
1652
  if ($isEmpty) {
1620
1653
  $et->VPrint(0,' Deleting ' . join('+', sort map { $emptyMeta{$_} } keys %boxPos)) if %boxPos;
1621
1654
  $$outfile = '';
1622
- ++$$et{CHANGED};
1655
+ # (could report a file if editing nothing when it contained an empty Meta atom)
1656
+ # ++$$et{CHANGED};
1623
1657
  }
1624
1658
  if ($curPath eq 'MOV-Movie-Meta') {
1625
1659
  delete $$addDirs{Keys}; # prevent creation of another Meta for Keys tags
@@ -236,7 +236,7 @@ sub CheckXMP($$$;$)
236
236
  return 'Not a floating point number';
237
237
  }
238
238
  if ($format eq 'rational') {
239
- $$valPtr = join('/', Image::ExifTool::Rationalize($$valPtr));
239
+ $$valPtr = join('/', Image::ExifTool::Rationalize($$valPtr,0xffffffff));
240
240
  }
241
241
  } elsif ($format eq 'integer') {
242
242
  # make sure the value is integer
@@ -137,12 +137,12 @@ my %rawType = (
137
137
  # 1) these names must either exist in %dirMap, or be translated in InitWriteDirs())
138
138
  # 2) any dependencies must be added to %excludeGroups
139
139
  my @delGroups = qw(
140
- Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11
141
- APP12 APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
142
- FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC
143
- ItemList JFIF Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF
144
- NikonApp NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs
145
- PrintIM QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
140
+ Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 APP12
141
+ APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix FotoStation
142
+ GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC ItemList JFIF
143
+ Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF Nextbase NikonApp
144
+ NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs PrintIM
145
+ QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
146
146
  );
147
147
  # family 2 group names that we can delete
148
148
  my @delGroup2 = qw(
@@ -227,7 +227,7 @@ my %allFam0 = (
227
227
 
228
228
  my @writableMacOSTags = qw(
229
229
  FileCreateDate MDItemFinderComment MDItemFSCreationDate MDItemFSLabel MDItemUserTags
230
- XAttrQuarantine
230
+ XAttrQuarantine XAttrMDItemWhereFroms
231
231
  );
232
232
 
233
233
  # min/max values for integer formats
@@ -1296,6 +1296,11 @@ sub SetNewValuesFromFile($$;@)
1296
1296
  FastScan => $$options{FastScan},
1297
1297
  Filter => $$options{Filter},
1298
1298
  FixBase => $$options{FixBase},
1299
+ Geolocation => $$options{Geolocation},
1300
+ GeolocAltNames => $$options{GeolocAltNames},
1301
+ GeolocFeature => $$options{GeolocFeature},
1302
+ GeolocMinPop => $$options{GeolocMinPop},
1303
+ GeolocMaxDist => $$options{GeolocMaxDist},
1299
1304
  GlobalTimeShift => $$options{GlobalTimeShift},
1300
1305
  HexTagIDs => $$options{HexTagIDs},
1301
1306
  IgnoreMinorErrors=>$$options{IgnoreMinorErrors},
@@ -1332,6 +1337,11 @@ sub SetNewValuesFromFile($$;@)
1332
1337
  XAttrTags => $$options{XAttrTags},
1333
1338
  XMPAutoConv => $$options{XMPAutoConv},
1334
1339
  );
1340
+ # reset Geolocation option if we aren't copying any geolocation tags
1341
+ if ($$options{Geolocation} and not grep /\bGeolocation/i, @setTags) {
1342
+ $self->VPrint(0, '(resetting unnecessary Geolocation option)');
1343
+ $$srcExifTool{OPTIONS}{Geolocation} = undef;
1344
+ }
1335
1345
  $$srcExifTool{GLOBAL_TIME_OFFSET} = $$self{GLOBAL_TIME_OFFSET};
1336
1346
  $$srcExifTool{ALT_EXIFTOOL} = $$self{ALT_EXIFTOOL};
1337
1347
  foreach $tag (@setTags) {
@@ -2181,7 +2191,7 @@ sub SetSystemTags($$)
2181
2191
  $result = $res if $res == 1 or not $result;
2182
2192
  last;
2183
2193
  } elsif ($tag ne 'FileCreateDate') {
2184
- $self->WarnOnce('Can only set MDItem tags on OS X');
2194
+ $self->WarnOnce('Can only set MDItem tags on MacOS');
2185
2195
  last;
2186
2196
  }
2187
2197
  }
@@ -3783,6 +3793,53 @@ sub GetWriteGroup1($$)
3783
3793
  return $self->GetGroup($tagInfo, 1);
3784
3794
  }
3785
3795
 
3796
+ #------------------------------------------------------------------------------
3797
+ # Get list of tags to write for Geolocate feature
3798
+ # Inputs: 0) ExifTool ref, 1) group name(s),
3799
+ # 2) 0=prefer writing City, 1=prefer writing GPS, undef=deleting tags
3800
+ # Returns: list of tags to write/delete
3801
+ sub GetGeolocateTags($$;$)
3802
+ {
3803
+ my ($self, $wantGroup, $writeGPS) = @_;
3804
+ my @grps = $wantGroup ? map lc, split(/:/, $wantGroup) : ();
3805
+ my %grps = map { $_ => $_ } @grps; # lookup for specified groups
3806
+ $grps{exif} and not $grps{gps} and $grps{gps} = 'gps', push(@grps, 'gps');
3807
+ my %tagGroups = (
3808
+ 'xmp-iptcext' => [ qw(LocationShownCity LocationShownProvinceState LocationShownCountryCode
3809
+ LocationShownCountryName LocationShownGPSLatitude LocationShownGPSLongitude) ],
3810
+ 'xmp-photoshop' => [ qw(City State Country) ],
3811
+ 'xmp-iptccore' => [ 'CountryCode' ],
3812
+ 'iptc' => [ qw(City Province-State Country-PrimaryLocationCode Country-PrimaryLocationName) ],
3813
+ 'gps' => [ qw(GPSLatitude GPSLongitude GPSLatitudeRef GPSLongitudeRef) ],
3814
+ 'xmp-exif' => [ qw(GPSLatitude GPSLongitude) ],
3815
+ 'keys' => [ 'GPSCoordinates', 'LocationName' ],
3816
+ 'itemlist' => [ 'GPSCoordinates' ],
3817
+ 'userdata' => [ 'GPSCoordinates' ],
3818
+ # more general groups not in this lookup: XMP and QuickTime
3819
+ );
3820
+ my (@tags, $grp);
3821
+ # set specific City and GPS tags
3822
+ foreach $grp (@grps) {
3823
+ $tagGroups{$grp} and push @tags, map("$grp:$_", @{$tagGroups{$grp}});
3824
+ }
3825
+ # set default XMP City tags if necessary
3826
+ if (not $writeGPS and ($grps{xmp} or (not @tags and not $grps{quicktime}))) {
3827
+ push @tags, qw(XMP:City XMP:State XMP:CountryCode XMP:Country Keys:LocationName);
3828
+ }
3829
+ $writeGPS = 1 unless defined $writeGPS; # (delete both City and GPS)
3830
+ # set default QuickTime tag if necessary
3831
+ my $didQT = grep /Coordinates$/, @tags;
3832
+ if (($grps{quicktime} and not $didQT) or ($writeGPS and not @tags and not $grps{xmp})) {
3833
+ push @tags, 'QuickTime:GPSCoordinates';
3834
+ }
3835
+ # set default GPS tags if necessary
3836
+ if ($writeGPS) {
3837
+ push @tags, qw(XMP:GPSLatitude XMP:GPSLongitude) if $grps{xmp} and not $grps{'xmp-exif'};
3838
+ push @tags, qw(GPSLatitude GPSLongitude GPSLatitudeRef GPSLongitudeRef) if not $wantGroup;
3839
+ }
3840
+ return @tags;
3841
+ }
3842
+
3786
3843
  #------------------------------------------------------------------------------
3787
3844
  # Get new value hash for specified tagInfo/writeGroup
3788
3845
  # Inputs: 0) ExifTool object reference, 1) reference to tag info hash
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.63';
53
+ $VERSION = '3.64';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -171,6 +171,7 @@ my %xmpNS = (
171
171
  pmi => 'http://prismstandard.org/namespaces/pmi/2.2/',
172
172
  prm => 'http://prismstandard.org/namespaces/prm/3.0/',
173
173
  acdsee => 'http://ns.acdsee.com/iptc/1.0/',
174
+ 'acdsee-rs'=> 'http://ns.acdsee.com/regions/',
174
175
  digiKam => 'http://www.digikam.org/ns/1.0/',
175
176
  swf => 'http://ns.adobe.com/swf/1.0/',
176
177
  cell => 'http://developer.sonyericsson.com/cell/1.0/',
@@ -802,6 +803,10 @@ my %sRangeMask = (
802
803
  Name => 'acdsee',
803
804
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::acdsee' },
804
805
  },
806
+ 'acdsee-rs' => {
807
+ Name => 'acdsee-rs',
808
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::ACDSeeRegions' },
809
+ },
805
810
  digiKam => {
806
811
  Name => 'digiKam',
807
812
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::digiKam' },
@@ -2554,7 +2559,17 @@ my %sPantryItem = (
2554
2559
  return $val;
2555
2560
  },
2556
2561
  },
2557
- ApproximateFocusDistance => { Writable => 'rational' }, #PH (LR3)
2562
+ ApproximateFocusDistance => {
2563
+ Writable => 'rational',
2564
+ PrintConv => {
2565
+ 4294967295 => 'infinity',
2566
+ OTHER => sub {
2567
+ my ($val, $inv) = @_;
2568
+ return $val eq 'infinity' ? 4294967295 : $val if $inv;
2569
+ return $val eq 4294967295 ? 'infinity' : $val;
2570
+ },
2571
+ },
2572
+ }, #PH (LR3)
2558
2573
  # the following new in LR6 (ref forum6497)
2559
2574
  IsMergedPanorama => { Writable => 'boolean' },
2560
2575
  IsMergedHDR => { Writable => 'boolean' },
@@ -2572,6 +2587,7 @@ my %sPantryItem = (
2572
2587
  EnhanceDenoiseAlreadyApplied => { Writable => 'boolean' }, #forum14760
2573
2588
  EnhanceDenoiseVersion => { }, #forum14760 integer?
2574
2589
  EnhanceDenoiseLumaAmount => { }, #forum14760 integer?
2590
+ # FujiRatingAlreadyApplied - boolean written by LR classic 13.2 (forum15815)
2575
2591
  );
2576
2592
 
2577
2593
  # IPTC Core namespace properties (Iptc4xmpCore) (ref 4)
@@ -224,6 +224,7 @@ my %sAppInfo = (
224
224
  fileDataRate => { Writable => 'rational' },
225
225
  genre => { },
226
226
  good => { Writable => 'boolean' },
227
+ pick => { Writable => 'integer' }, #forum15815
227
228
  instrument => { },
228
229
  introTime => { Struct => \%sTime },
229
230
  key => {
@@ -403,6 +404,18 @@ my %sLocationDetails = (
403
404
  PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"',
404
405
  PrintConvInv => '$val=~s/\s*m$//;$val',
405
406
  },
407
+ GPSAltitudeRef => {
408
+ Writable => 'integer',
409
+ PrintConv => {
410
+ OTHER => sub {
411
+ my ($val, $inv) = @_;
412
+ return undef unless $inv and $val =~ /^([-+0-9])/;
413
+ return($1 eq '-' ? 1 : 0);
414
+ },
415
+ 0 => 'Above Sea Level',
416
+ 1 => 'Below Sea Level',
417
+ },
418
+ },
406
419
  );
407
420
  my %sCVTermDetails = (
408
421
  STRUCT_NAME => 'CVTermDetails',
@@ -1373,6 +1386,57 @@ my %sSubVersion = (
1373
1386
  Snapshots => { List => 'Bag', Binary => 1 },
1374
1387
  );
1375
1388
 
1389
+ # ACDSee region tags (ref BKW)
1390
+ my %sACDSeeDimensions = (
1391
+ STRUCT_NAME => 'ACDSeeDimensions',
1392
+ NAMESPACE => {'acdsee-stDim' => 'http://ns.acdsee.com/sType/Dimensions#'},
1393
+ 'w' => { Writable => 'real' },
1394
+ 'h' => { Writable => 'real' },
1395
+ 'unit' => { },
1396
+ );
1397
+ my %sACDSeeArea = (
1398
+ STRUCT_NAME => 'ACDSeeArea',
1399
+ NAMESPACE => { 'acdsee-stArea' => 'http://ns.acdsee.com/sType/Area#' },
1400
+ 'x' => { Writable => 'real' },
1401
+ 'y' => { Writable => 'real' },
1402
+ w => { Writable => 'real' },
1403
+ h => { Writable => 'real' },
1404
+ );
1405
+ my %sACDSeeRegionStruct = (
1406
+ STRUCT_NAME => 'ACDSeeRegion',
1407
+ NAMESPACE => 'acdsee-rs',
1408
+ ALGArea => { Struct => \%sACDSeeArea },
1409
+ DLYArea => { Struct => \%sACDSeeArea },
1410
+ Name => { },
1411
+ NameAssignType => { },
1412
+ Type => { },
1413
+ );
1414
+ %Image::ExifTool::XMP::ACDSeeRegions = (
1415
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee-rs', 2 => 'Image' },
1416
+ NAMESPACE => 'acdsee-rs',
1417
+ WRITABLE => 'string',
1418
+ AVOID => 1,
1419
+ Regions => {
1420
+ Name => 'RegionInfoACDSee',
1421
+ FlatName => 'ACDSee',
1422
+ # the "Struct" entry defines the structure fields
1423
+ Struct => {
1424
+ # optional structure name (used for warning messages only)
1425
+ STRUCT_NAME => 'ACDSeeRegionInfo',
1426
+ NAMESPACE => 'acdsee-rs',
1427
+ RegionList => {
1428
+ FlatName => 'Region',
1429
+ Struct => \%sACDSeeRegionStruct,
1430
+ List => 'Bag',
1431
+ },
1432
+ AppliedToDimensions => {
1433
+ FlatName => 'RegionAppliedToDimensions',
1434
+ Struct => \%sACDSeeDimensions,
1435
+ },
1436
+ },
1437
+ },
1438
+ );
1439
+
1376
1440
  # Picture Licensing Universal System namespace properties (xmpPLUS)
1377
1441
  %Image::ExifTool::XMP::xmpPLUS = (
1378
1442
  %xmpTableDefaults,