exiftool_vendored 13.03.0 → 13.06.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 28175 tags, with 17499 unique tag names.
15
+ They contain a total of 28212 tags, with 17509 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
@@ -115,6 +115,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
115
115
  FPXR FlashPix
116
116
  MPF MPF
117
117
  InfiRayVersion InfiRay Version
118
+ UniformResourceName no
118
119
  PreviewImage no
119
120
  'APP3' Meta Kodak Meta
120
121
  Stim Stim
@@ -152,6 +153,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
152
153
  InfiRaySensor InfiRay Sensor
153
154
  SEAL XMP SEAL
154
155
  'APP10' Comment no
156
+ HDRGainCurve no
155
157
  'APP11' JPEG-HDR JPEG HDR
156
158
  JUMBF Jpeg2000
157
159
  'APP12' PictureInfo APP12 PictureInfo
@@ -1370,6 +1372,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
1370
1372
  acdsee XMP acdsee
1371
1373
  acdsee-rs XMP ACDSeeRegions
1372
1374
  album XMP Album
1375
+ apdi XMP apdi
1373
1376
  apple-fi XMP apple_fi
1374
1377
  ast Nikon ast
1375
1378
  aux XMP aux
@@ -1402,6 +1405,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
1402
1405
  GPano XMP GPano
1403
1406
  GSpherical XMP GSpherical
1404
1407
  hdr XMP hdr
1408
+ HDRGainMap XMP HDRGainMap
1405
1409
  hdrgm XMP hdrgm
1406
1410
  ics XMP ics
1407
1411
  iptcCore XMP iptcCore
@@ -1584,6 +1588,18 @@ These tags belong to the ExifTool XMP-album family 1 group.
1584
1588
  -------- --------
1585
1589
  Notes string
1586
1590
 
1591
+ =head3 XMP apdi Tags
1592
+
1593
+ Used in Apple HDR GainMap images.
1594
+
1595
+ These tags belong to the ExifTool XMP-apdi family 1 group.
1596
+
1597
+ Tag Name Writable
1598
+ -------- --------
1599
+ AuxiliaryImageType string
1600
+ NativeFormat string
1601
+ StoredFormat string
1602
+
1587
1603
  =head3 XMP apple_fi Tags
1588
1604
 
1589
1605
  Face information tags written by the Apple iPhone 5 inside the mwg-rs
@@ -5030,6 +5046,16 @@ These tags belong to the ExifTool XMP-hdr family 1 group.
5030
5046
  CCVWhiteXY string
5031
5047
  SceneReferred boolean
5032
5048
 
5049
+ =head3 XMP HDRGainMap Tags
5050
+
5051
+ Used in Apple HDR GainMap images.
5052
+
5053
+ These tags belong to the ExifTool XMP-HDRGainMap family 1 group.
5054
+
5055
+ Tag Name Writable
5056
+ -------- --------
5057
+ HDRGainMapVersion string
5058
+
5033
5059
  =head3 XMP hdrgm Tags
5034
5060
 
5035
5061
  Tags used in Adobe gain map images.
@@ -6168,11 +6194,12 @@ These tags belong to the ExifTool XMP-seal family 1 group.
6168
6194
 
6169
6195
  =head3 XMP SEAL Tags
6170
6196
 
6171
- These tags are used in SEAL content authentification, which is actually XML
6172
- format, not XMP. ExifTool has read/delete support for SEAL information in
6173
- JPG, TIFF, XMP, PNG, WEBP, HEIC, PPM, MOV and MP4 files, and read-only
6174
- support in PDF, MKV and WAV. Use C<-seal:all=> on the command line to
6175
- delete SEAL information in supported formats.
6197
+ These tags are used in SEAL (Secure Evidence Attribution Label) content
6198
+ authentification, which is actually XML format, not XMP. ExifTool has
6199
+ read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
6200
+ PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
6201
+ C<-seal:all=> on the command line to delete SEAL information in supported
6202
+ formats. See L<https://github.com/hackerfactor/SEAL> for the specification.
6176
6203
 
6177
6204
  Tag ID Tag Name Writable
6178
6205
  ------ -------- --------
@@ -6180,12 +6207,15 @@ delete SEAL information in supported formats.
6180
6207
  'copyright' Copyright no
6181
6208
  'd' Domain no
6182
6209
  'da' DigestAlgorithm no
6210
+ 'id' Identifier no
6183
6211
  'info' SEALComment no
6184
6212
  'ka' KeyAlgorithm no
6185
6213
  'kv' KeyVersion no
6186
6214
  's' Signature no
6187
6215
  'seal' SEALVersion no
6188
6216
  'sf' SignatureFormat no
6217
+ 'sl' SignatureLength no
6218
+ 'uid' UniqueIdentifier no
6189
6219
 
6190
6220
  =head3 XMP swf Tags
6191
6221
 
@@ -8873,7 +8903,7 @@ access to this information.
8873
8903
  0x0432 MeasurementScale? no
8874
8904
  0x0433 TimelineInfo? no
8875
8905
  0x0434 SheetDisclosure? no
8876
- 0x0435 DisplayInfo? no
8906
+ 0x0435 ChannelOptions? no
8877
8907
  0x0436 OnionSkins? no
8878
8908
  0x0438 CountInfo? no
8879
8909
  0x043a PrintInfo2? no
@@ -12908,6 +12938,35 @@ Thermal parameters extracted from APP4 of some DJI RJPEG files.
12908
12938
  8 Emissivity no
12909
12939
  10 ReflectedTemperature no
12910
12940
 
12941
+ =head3 DJI Protobuf Tags
12942
+
12943
+ Tags found in protobuf-format DJI meta djmd and dbgi timed metadata. Only a
12944
+ few tags are currently known, but unknown djmd tags may be extracted by
12945
+ setting the Unknown option to 1 (or 2 to also extract unknown dbgi debug
12946
+ tags). Tag ID's are composed of the corresponding .proto file name combined
12947
+ with the hierarchical protobuf field numbers. The "dvtm_AVATA2.proto" file
12948
+ is used by the DJI Avanta 2, and "dvtm_ac203.proto" by the OsmoAction4.
12949
+
12950
+ Tag ID Tag Name Writable
12951
+ ------ -------- --------
12952
+ 'Protocol' Protocol no
12953
+ 'dvtm_AVATA2_1-1-10' Model no
12954
+ 'dvtm_AVATA2_2-2-3-1' SerialNumber no
12955
+ 'dvtm_AVATA2_2-3-1' FrameWidth no
12956
+ 'dvtm_AVATA2_2-3-2' FrameHeight no
12957
+ 'dvtm_AVATA2_2-3-3' FrameRate no
12958
+ 'dvtm_AVATA2_3-1-2' TimeStamp no
12959
+ 'dvtm_AVATA2_3-4-4-1-2' GPSLatitude no
12960
+ 'dvtm_AVATA2_3-4-4-1-3' GPSLongitude no
12961
+ 'dvtm_ac203_1-1-10' Model no
12962
+ 'dvtm_ac203_2-3-1' FrameWidth no
12963
+ 'dvtm_ac203_2-3-2' FrameHeight no
12964
+ 'dvtm_ac203_2-3-3' FrameRate no
12965
+ 'dvtm_ac203_3-4-2-1-2' GPSLatitude no
12966
+ 'dvtm_ac203_3-4-2-1-3' GPSLongitude no
12967
+ 'dvtm_ac203_3-4-2-2' GPSAltitude no
12968
+ 'dvtm_ac203_3-4-2-6-1' GPSDateTime no
12969
+
12911
12970
  =head2 FLIR Tags
12912
12971
 
12913
12972
  Information extracted from the maker notes of JPEG images from thermal
@@ -24715,6 +24774,7 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24715
24774
  'GLPI' GPSPos GoPro GLPI
24716
24775
  'GPRI' GPSRaw? GoPro GPRI
24717
24776
  'GPS5' GPSInfo GoPro GPS5
24777
+ 'GPS9' GPSInfo9 GoPro GPS9
24718
24778
  'GPSA' GPSAltitudeSystem no
24719
24779
  'GPSF' GPSMeasureMode no
24720
24780
  'GPSP' GPSHPositioningError no
@@ -24760,11 +24820,14 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24760
24820
  'TMPC' CameraTemperature no
24761
24821
  'TSMP' TotalSamples? no
24762
24822
  'TYPE' StructureType? no
24823
+ 'TZON' TimeZone no
24763
24824
  'UNIF' InputUniformity no
24764
24825
  'UNIT' Units? no
24765
24826
  'VERS' MetadataVersion no
24766
24827
  'VFOV' FieldOfView no
24828
+ 'VFPS' VideoFrameRate no
24767
24829
  'VFRH' VisualFlightRulesHUD no
24830
+ 'VRES' VideoFrameSize no
24768
24831
  'WBAL' ColorTemperatures no
24769
24832
  'WNDM' WindProcessing no
24770
24833
  'WRGB' WhiteBalanceRGB no
@@ -24804,6 +24867,19 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24804
24867
  3 GPSSpeed no
24805
24868
  4 GPSSpeed3D no
24806
24869
 
24870
+ =head3 GoPro GPS9 Tags
24871
+
24872
+ Index Tag Name Writable
24873
+ ----- -------- --------
24874
+ 0 GPSLatitude no
24875
+ 1 GPSLongitude no
24876
+ 2 GPSAltitude no
24877
+ 3 GPSSpeed no
24878
+ 4 GPSSpeed3D no
24879
+ 6 GPSDateTime no
24880
+ 7 GPSDOP no
24881
+ 8 GPSMeasureMode no
24882
+
24807
24883
  =head3 GoPro KBAT Tags
24808
24884
 
24809
24885
  Battery status information found in GoPro Karma videos.
@@ -29943,7 +30019,7 @@ for the official QuickTime specification.
29943
30019
  The tags below are extracted from timed metadata in QuickTime and other
29944
30020
  formats of video files when the ExtractEmbedded option is used. Although
29945
30021
  most of these tags are combined into the single table below, ExifTool
29946
- currently reads 78 different formats of timed GPS metadata from video files.
30022
+ currently reads 85 different formats of timed GPS metadata from video files.
29947
30023
 
29948
30024
  Tag Name Writable
29949
30025
  -------- --------
@@ -29954,6 +30030,8 @@ currently reads 78 different formats of timed GPS metadata from video files.
29954
30030
  CameraDateTime no
29955
30031
  CameraModel no
29956
30032
  Car no
30033
+ DJIDebug? DJI Protobuf
30034
+ DJIMetadata DJI Protobuf
29957
30035
  DateTimeOriginal no
29958
30036
  DateTimeStamp no
29959
30037
  Distance no
@@ -2194,7 +2194,7 @@ sub SetSystemTags($$)
2194
2194
  } elsif (ref $file) {
2195
2195
  $self->Warn('Writing ZoneIdentifer requires a file name');
2196
2196
  } elsif (defined $self->GetNewValue('ZoneIdentifier', \$zhash)) {
2197
- $self->Warn('ZoneIndentifier may only be delted');
2197
+ $self->Warn('ZoneIndentifier may only be deleted');
2198
2198
  } elsif (not eval { require Win32API::File }) {
2199
2199
  $self->Warn('Install Win32API::File to write ZoneIdentifier');
2200
2200
  } else {
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.69';
53
+ $VERSION = '3.70';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -207,6 +207,8 @@ my %xmpNS = (
207
207
  # Note: Google uses a prefix of 'Container', but this conflicts with the
208
208
  # Device Container namespace, also by Google. So call this one GContainer
209
209
  GContainer=> 'http://ns.google.com/photos/1.0/container/',
210
+ HDRGainMap=> 'http://ns.apple.com/HDRGainMap/1.0/',
211
+ apdi => 'http://ns.apple.com/pixeldatainfo/1.0/',
210
212
  );
211
213
 
212
214
  # build reverse namespace lookup
@@ -934,6 +936,14 @@ my %sRangeMask = (
934
936
  Name => 'xmpDSA',
935
937
  SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::DSA' },
936
938
  },
939
+ HDRGainMap => {
940
+ Name => 'HDRGainMap',
941
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::HDRGainMap' },
942
+ },
943
+ apdi => {
944
+ Name => 'apdi',
945
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::apdi' },
946
+ },
937
947
  seal => {
938
948
  Name => 'seal',
939
949
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::seal' },
@@ -2250,6 +2250,44 @@ my %sACDSeeRegionStruct = (
2250
2250
  Gamma => { Writable => 'real', List => 'Seq', Avoid => 1 },
2251
2251
  );
2252
2252
 
2253
+ %Image::ExifTool::XMP::HDRGainMap = (
2254
+ %xmpTableDefaults,
2255
+ GROUPS => { 1 => 'XMP-HDRGainMap', 2 => 'Unknown' },
2256
+ NAMESPACE => 'HDRGainMap',
2257
+ NOTES => 'Used in Apple HDR GainMap images.',
2258
+ HDRGainMapVersion => {
2259
+ PrintConv => 'IsInt($val) ? join(".",unpack("C*", pack "N", $val)) : $val',
2260
+ PrintConvInv => q{
2261
+ return $val unless $val =~ /^\d+\.\d+\.\d+\.\d+$/;
2262
+ return unpack('N', pack('C*', split /\./, $val));
2263
+ },
2264
+ },
2265
+ );
2266
+
2267
+ %Image::ExifTool::XMP::apdi = (
2268
+ %xmpTableDefaults,
2269
+ GROUPS => { 1 => 'XMP-apdi', 2 => 'Image' },
2270
+ NAMESPACE => 'apdi',
2271
+ NOTES => 'Used in Apple HDR GainMap images.',
2272
+ NativeFormat => {
2273
+ PrintConv => q{
2274
+ return $val unless IsInt($val);
2275
+ my $tmp = pack("N", $val);
2276
+ $tmp =~ /^\w{4}$/ ? $tmp : $val;
2277
+ },
2278
+ PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
2279
+ },
2280
+ AuxiliaryImageType => { },
2281
+ StoredFormat => {
2282
+ PrintConv => q{
2283
+ return $val unless IsInt($val);
2284
+ my $tmp = pack("N", $val);
2285
+ $tmp =~ /^\w{4}$/ ? $tmp : $val;
2286
+ },
2287
+ PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
2288
+ },
2289
+ );
2290
+
2253
2291
  # SVG namespace properties (ref 9)
2254
2292
  %Image::ExifTool::XMP::SVG = (
2255
2293
  GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
@@ -2307,19 +2345,23 @@ my %sACDSeeRegionStruct = (
2307
2345
  GROUPS => { 0 => 'XML', 1 => 'SEAL', 2 => 'Document' },
2308
2346
  PROCESS_PROC => \&ProcessSEAL,
2309
2347
  NOTES => q{
2310
- These tags are used in SEAL content authentification, which is actually XML
2311
- format, not XMP. ExifTool has read/delete support for SEAL information in
2312
- JPG, TIFF, XMP, PNG, WEBP, HEIC, PPM, MOV and MP4 files, and read-only
2313
- support in PDF, MKV and WAV. Use C<-seal:all=> on the command line to
2314
- delete SEAL information in supported formats.
2348
+ These tags are used in SEAL (Secure Evidence Attribution Label) content
2349
+ authentification, which is actually XML format, not XMP. ExifTool has
2350
+ read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
2351
+ PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
2352
+ C<-seal:all=> on the command line to delete SEAL information in supported
2353
+ formats. See L<https://github.com/hackerfactor/SEAL> for the specification.
2315
2354
  },
2316
2355
  seal=> 'SEALVersion',
2317
- kv => 'KeyVersion',
2318
2356
  ka => 'KeyAlgorithm',
2357
+ kv => 'KeyVersion',
2319
2358
  da => 'DigestAlgorithm',
2320
- sf => 'SignatureFormat',
2321
- d => 'Domain',
2322
2359
  b => 'ByteRange',
2360
+ d => 'Domain',
2361
+ uid => 'UniqueIdentifier',
2362
+ id => 'Identifier',
2363
+ sf => 'SignatureFormat',
2364
+ sl => 'SignatureLength',
2323
2365
  's' => 'Signature',
2324
2366
  info=> 'SEALComment',
2325
2367
  copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } },
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars $advFmtSelf);
31
31
 
32
- $VERSION = '13.03';
32
+ $VERSION = '13.06';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -2583,7 +2583,7 @@ sub Options($$;@)
2583
2583
  warn("Can't set $param to undef\n");
2584
2584
  }
2585
2585
  } elsif (lc $param eq 'geodir') {
2586
- $Image::ExifTool::Geolocation::geoDir = $newVal; # (undocumented)
2586
+ $Image::ExifTool::Geolocation::geoDir = $newVal;
2587
2587
  } else {
2588
2588
  if ($param eq 'Escape') {
2589
2589
  # set ESCAPE_PROC
@@ -2763,10 +2763,16 @@ sub ExtractInfo($;@)
2763
2763
  if ($$req{filepath} or
2764
2764
  ($reqAll and not $$self{EXCL_TAG_LOOKUP}{filepath}))
2765
2765
  {
2766
+ my $path;
2766
2767
  local $SIG{'__WARN__'} = \&SetWarning;
2767
- if (eval { require Cwd }) {
2768
- my $path = eval { Cwd::abs_path($filename) };
2769
- $self->FoundTag('FilePath', $path) if defined $path;
2768
+ if ($^O eq 'MSWin32' and $$options{WindowsLongPath}) {
2769
+ $path = $self->WindowsLongPath($filename);
2770
+ } elsif (eval { require Cwd }) {
2771
+ $path = eval { Cwd::abs_path($filename) };
2772
+ }
2773
+ if (defined $path) {
2774
+ $path =~ tr/\\/\// if $^O eq 'MSWin32'; # return forward slashes
2775
+ $self->FoundTag('FilePath', $path);
2770
2776
  } elsif ($$req{filepath}) {
2771
2777
  $self->WarnOnce('The Perl Cwd module must be installed to use FilePath');
2772
2778
  }
@@ -4404,6 +4410,7 @@ sub DoneExtract($)
4404
4410
  local $SIG{'__WARN__'} = \&SetWarning;
4405
4411
  undef $evalWarning;
4406
4412
  $$opts{GeolocMulti} = $$opts{Duplicates};
4413
+ $self->VPrint(0, "Geolocation arguments: '${arg}'\n");
4407
4414
  my ($cities, $dist) = Image::ExifTool::Geolocation::Geolocate($arg, $opts);
4408
4415
  delete $$opts{GeolocMulti};
4409
4416
  if ($cities and (@$cities < 2 or $dist or not $self->Warn('Multiple Geolocation cities are possible',2))) {
@@ -4632,8 +4639,7 @@ sub EncodeFileName($$;$)
4632
4639
  }
4633
4640
  }
4634
4641
  }
4635
- $force = 1 if $$self{OPTIONS}{WindowsWideFile} or $$self{OPTIONS}{WindowsLongPath};
4636
- if ($hasSpecialChars or $force) {
4642
+ if ($hasSpecialChars or $force or $$self{OPTIONS}{WindowsLongPath} or $$self{OPTIONS}{WindowsWideFile}) {
4637
4643
  $enc or $enc = 'UTF8';
4638
4644
  if ($^O eq 'MSWin32') {
4639
4645
  local $SIG{'__WARN__'} = \&SetWarning;
@@ -4654,8 +4660,8 @@ sub EncodeFileName($$;$)
4654
4660
 
4655
4661
  #------------------------------------------------------------------------------
4656
4662
  # Rebuild a path as an absolute long path to be usable in Windows system calls
4657
- # Inputs: 0) ExifTool ref, 1) path string
4658
- # Returns: normalized long path
4663
+ # Inputs: 0) ExifTool ref, 1) path string (CharsetFileName)
4664
+ # Returns: normalized long path (CharsetFileName)
4659
4665
  # Note: this should only be called for Windows systems
4660
4666
  # References:
4661
4667
  # - https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats
@@ -4674,12 +4680,25 @@ sub WindowsLongPath($$)
4674
4680
  my ($self, $path) = @_;
4675
4681
  my $debug = $$self{OPTIONS}{Debug};
4676
4682
  my $out = $$self{OPTIONS}{TextOut};
4683
+ my $suffix = '';
4684
+ my $longPath;
4685
+
4686
+ # remove common suffixes to make cache more effective
4687
+ if ($path =~ s/(_original|_exiftool_tmp|:Zone\.Identifier)$//) {
4688
+ $suffix = $1;
4689
+ if (not length $path or $path =~ m([:./\\]$)) {
4690
+ # don't remove suffix if it could be the whole file name
4691
+ $path .= $suffix;
4692
+ $suffix = '';
4693
+ }
4694
+ }
4695
+ return $$self{LONG_PATH_OUT}.$suffix if defined $$self{LONG_PATH_IN} and $$self{LONG_PATH_IN} eq $path;
4677
4696
 
4678
- $debug and print $out "WindowsLongPath input : $path\n";
4697
+ $debug and print $out "WindowsLongPath input : $path$suffix\n";
4679
4698
 
4680
4699
  for (;;) { # (cheap goto)
4681
- $path =~ tr(/)(\\); # convert slashes to backslashes
4682
- last if $path =~ /^\\\\\?\\/; # already a device path in the format we want
4700
+ ($longPath = $path) =~ tr(/)(\\); # convert slashes to backslashes
4701
+ last if $longPath =~ /^\\\\\?\\/; # already a device path in the format we want
4683
4702
 
4684
4703
  unless ($k32GetFullPathName) { # need to import (once) GetFullPathNameW
4685
4704
  last if defined $k32GetFullPathName;
@@ -4695,23 +4714,27 @@ sub WindowsLongPath($$)
4695
4714
  }
4696
4715
  }
4697
4716
  my $enc = $$self{OPTIONS}{CharsetFileName};
4698
- my $encPath = $self->Encode($path, 'UTF16', 'II', $enc); # need to encode to UTF16
4717
+ my $encPath = $self->Encode($longPath, 'UTF16', 'II', $enc);# need to encode to UTF16
4699
4718
  my $lenReq = $k32GetFullPathName->Call($encPath,0,0,0) + 1; # first pass gets length required, +1 for safety (null?)
4700
4719
  my $fullPath = "\0" x $lenReq x 2; # create buffer to hold full path
4701
4720
  $k32GetFullPathName->Call($encPath, $lenReq, $fullPath, 0); # fullPath is UTF16 now
4702
- $path = $self->Decode($fullPath, 'UTF16', 'II', $enc);
4721
+ $longPath = $self->Decode($fullPath, 'UTF16', 'II', $enc);
4703
4722
 
4704
- last if length($path) <= 247;
4723
+ last if length($longPath) <= 247 - length($suffix);
4705
4724
 
4706
- if ($path =~ /^\\\\/) {
4707
- $path = '\\\\?\\UNC' . substr($path, 1);
4725
+ if ($longPath =~ /^\\\\/) {
4726
+ $longPath = '\\\\?\\UNC' . substr($longPath, 1);
4708
4727
  } else {
4709
- $path = '\\\\?\\' . $path;
4728
+ $longPath = '\\\\?\\' . $longPath;
4710
4729
  }
4711
4730
  last;
4712
4731
  }
4713
- $debug and print $out "WindowsLongPath return: $path\n";
4714
- return $path;
4732
+ # this may be called repeatedly for the same file file (exists, stat, open),
4733
+ # so cache the last return value (without any of the suffixes that we use)
4734
+ $$self{LONG_PATH_IN} = $path;
4735
+ $$self{LONG_PATH_OUT} = $longPath;
4736
+ $debug and print $out "WindowsLongPath return: $longPath$suffix\n";
4737
+ return $longPath . $suffix;
4715
4738
  }
4716
4739
 
4717
4740
  #------------------------------------------------------------------------------
@@ -7432,7 +7455,7 @@ sub ProcessJPEG($$;$)
7432
7455
  }
7433
7456
  # handle all other markers
7434
7457
  my $dumpType = '';
7435
- my ($desc, $tip, $xtra);
7458
+ my ($desc, $tip, $xtra, $useJpegMain);
7436
7459
  $length = length $$segDataPt;
7437
7460
  $appBytes += $length + 4 if ($marker & 0xf0) == 0xe0; # total size of APP segments
7438
7461
  if ($verbose) {
@@ -7652,7 +7675,7 @@ sub ProcessJPEG($$;$)
7652
7675
  $self->Warn("Ignored APP1 segment length $length (unknown header)");
7653
7676
  }
7654
7677
  }
7655
- } elsif ($marker == 0xe2) { # APP2 (ICC Profile, FPXR, MPF, InfiRay, PreviewImage)
7678
+ } elsif ($marker == 0xe2) { # APP2 (ICC Profile, FPXR, MPF, InfiRay, URN, PreviewImage)
7656
7679
  if ($$segDataPt =~ /^ICC_PROFILE\0/ and $length >= 14) {
7657
7680
  $dumpType = 'ICC_Profile';
7658
7681
  # must concatenate profile chunks (note: handle the case where
@@ -7725,6 +7748,9 @@ sub ProcessJPEG($$;$)
7725
7748
  # Digilife DDC-690/Rollei="BGTH"
7726
7749
  $dumpType = 'Preview Image';
7727
7750
  $preview = substr($$segDataPt, length($1));
7751
+ } elsif ($$segDataPt =~ /^urn:/) { # (found in Apple HDR images)
7752
+ $dumpType = 'URN';
7753
+ $useJpegMain = 1;
7728
7754
  } elsif ($preview) {
7729
7755
  $dumpType = 'Preview Image';
7730
7756
  $preview .= $$segDataPt;
@@ -7994,17 +8020,14 @@ sub ProcessJPEG($$;$)
7994
8020
  DirStart(\%dirInfo, 5);
7995
8021
  $self->ProcessDirectory(\%dirInfo, GetTagTable("Image::ExifTool::XMP::SEAL"));
7996
8022
  }
7997
- } elsif ($marker == 0xea) { # APP10 (PhotoStudio Unicode comments)
8023
+ } elsif ($marker == 0xea) { # APP10 (PhotoStudio Unicode comments, HDR gain curve)
7998
8024
  if ($$segDataPt =~ /^UNICODE\0/) {
7999
8025
  $dumpType = 'PhotoStudio';
8000
8026
  my $comment = $self->Decode(substr($$segDataPt,8), 'UCS2', 'MM');
8001
8027
  $self->FoundTag('Comment', $comment);
8002
- } elsif ($$segDataPt =~ /^AROT\0/ and $length > 10) {
8003
- # iPhone "AROT" segment containing integrated intensity per 16 scan lines
8004
- # (with number of elements N = ImageHeight / 16 - 1, ref PH/NealKrawetz)
8005
- # "Absolute ROTational difference between two frames"
8006
- # (see https://www.hackerfactor.com/blog/index.php?/archives/822-Apple-Rot.html)
8007
- $xtra = 'segment (N=' . unpack('x6N', $$segDataPt) . ')';
8028
+ } elsif ($$segDataPt =~ /^AROT\0\0.{4}/s) {
8029
+ $dumpType = 'AROT', # (HDR gain curve? PH guess)
8030
+ $useJpegMain = 1;
8008
8031
  }
8009
8032
  } elsif ($marker == 0xeb) { # APP11 (JPEG-HDR, JUMBF)
8010
8033
  if ($$segDataPt =~ /^HDR_RI /) {
@@ -8171,6 +8194,10 @@ sub ProcessJPEG($$;$)
8171
8194
  $desc = "[JPEG $markerName]"; # (other known JPEG segments)
8172
8195
  }
8173
8196
  if (defined $dumpType) {
8197
+ if ($useJpegMain) {
8198
+ my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main');
8199
+ $self->HandleTag($tagTablePtr, $markerName, $$segDataPt);
8200
+ }
8174
8201
  if (not $dumpType and ($$options{Unknown} or $$options{Validate})) {
8175
8202
  my $str = ($$segDataPt =~ /^([\x20-\x7e]{1,20})\0/) ? " '${1}'" : '';
8176
8203
  $xtra = 'segment' unless $xtra;
@@ -8915,6 +8942,7 @@ sub GetTagInfo($$$;$$$)
8915
8942
  my ($valPt, $format, $count);
8916
8943
 
8917
8944
  my @infoArray = GetTagInfoList($tagTablePtr, $tagID);
8945
+ my $options = $$self{OPTIONS};
8918
8946
  # evaluate condition
8919
8947
  my $tagInfo;
8920
8948
  foreach $tagInfo (@infoArray) {
@@ -8933,9 +8961,9 @@ sub GetTagInfo($$$;$$$)
8933
8961
  }
8934
8962
  }
8935
8963
  # don't return Unknown tags unless that option is set (also see forum13716)
8936
- if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not
8937
- ($$self{OPTIONS}{Verbose} or $$self{HTML_DUMP} or
8938
- ($$self{OPTIONS}{Validate} and not $$tagInfo{AddedUnknown})))
8964
+ if ($$tagInfo{Unknown} and not $$options{Unknown} and not
8965
+ ($$options{Verbose} or $$self{HTML_DUMP} or
8966
+ ($$options{Validate} and not $$tagInfo{AddedUnknown})))
8939
8967
  {
8940
8968
  return undef;
8941
8969
  }
@@ -8943,7 +8971,7 @@ sub GetTagInfo($$$;$$$)
8943
8971
  return $tagInfo;
8944
8972
  }
8945
8973
  # generate information for unknown tags (numerical only) if required
8946
- if (not $tagInfo and ($$self{OPTIONS}{Unknown} or $$self{OPTIONS}{Verbose}) and
8974
+ if (not $tagInfo and ($$options{Unknown} or $$options{Verbose} or $$self{HTML_DUMP}) and
8947
8975
  $tagID =~ /^\d+$/ and not $$self{NO_UNKNOWN})
8948
8976
  {
8949
8977
  my $printConv;
@@ -1197,14 +1197,15 @@ on tag values and JPEG segment data respectively.
1197
1197
  =item WindowsLongPath
1198
1198
 
1199
1199
  Support long path names in Windows. Enabling this option automatically
1200
- enables the WindowsWideFile feature.
1200
+ enables the WindowsWideFile feature. Default is 1.
1201
1201
 
1202
1202
  =item WindowsWideFile
1203
1203
 
1204
1204
  Force the use of wide-character Windows I/O functions. This may be
1205
1205
  necessary when files are on a network drive and the current directory name
1206
- contains Unicode characters. By default, the wide-character functions are
1207
- used only if the specified file path contains Unicode characters.
1206
+ contains Unicode characters. Without this option the wide-character
1207
+ functions are used only if the specified file path contains Unicode
1208
+ characters.
1208
1209
 
1209
1210
  =item WriteMode
1210
1211
 
@@ -2545,9 +2546,9 @@ GoPro, H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG, JSON,
2545
2546
  JUMBF, Jpeg2000, LNK, Leaf, Lytro, M2TS, MIE, MIFF, MISB, MNG, MOI, MPC,
2546
2547
  MPEG, MPF, MXF, MakerNotes, Matroska, Meta, Ogg, OpenEXR, Opus, PDF, PICT,
2547
2548
  PLIST, PNG, PSP, Palm, PanasonicRaw, Parrot, PhotoCD, PhotoMechanic,
2548
- Photoshop, PostScript, PrintIM, QuickTime, RAF, RIFF, RSRC, RTF, Radiance,
2549
- Rawzor, Real, Red, SVG, SigmaRaw, Sony, Stim, Theora, Torrent, Trailer,
2550
- VCard, Vorbis, WTV, XML, XMP, ZIP
2549
+ Photoshop, PostScript, PrintIM, Protobuf, QuickTime, RAF, RIFF, RSRC, RTF,
2550
+ Radiance, Rawzor, Real, Red, SVG, SigmaRaw, Sony, Stim, Theora, Torrent,
2551
+ Trailer, VCard, Vorbis, WTV, XML, XMP, ZIP
2551
2552
 
2552
2553
  =item Family 1 (Specific Location):
2553
2554
 
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 13.03
3
+ Version: 13.06
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('13.03.0')
4
+ VERSION = Gem::Version.new('13.06.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.03.0
4
+ version: 13.06.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-11-17 00:00:00.000000000 Z
12
+ date: 2024-12-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool
@@ -257,6 +257,7 @@ files:
257
257
  - bin/lib/Image/ExifTool/Photoshop.pm
258
258
  - bin/lib/Image/ExifTool/PostScript.pm
259
259
  - bin/lib/Image/ExifTool/PrintIM.pm
260
+ - bin/lib/Image/ExifTool/Protobuf.pm
260
261
  - bin/lib/Image/ExifTool/Qualcomm.pm
261
262
  - bin/lib/Image/ExifTool/QuickTime.pm
262
263
  - bin/lib/Image/ExifTool/QuickTimeStream.pl