exiftool_vendored 13.08.0 → 13.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53adc02bd5bb808506a883f10c449fd0172d7d82c099a4c5d5a4dbbcb9971d68
4
- data.tar.gz: 76a6795061f0128324568a9907804699dd0635e94bc7042bf5ba1cb3c40c92e2
3
+ metadata.gz: 9bd6e60c5e63b9f1c5c19ec9ecff2c388dbb148125958da2dc032788523a6f1b
4
+ data.tar.gz: 0ca3fe31d4880779349339e560485d5780f9568a100ed3b2e66c1bf0d1d556ea
5
5
  SHA512:
6
- metadata.gz: bd68829340a5e18d410b4485e0789bef799d78d2fb7d6ff49612fa4a596b918c86b3515c2cd0ef0d90a0a04c72403a7a2113b86d882c93d5a4e0495d01573bbd
7
- data.tar.gz: d44cfcbc7dd21d7e74bc26ea46fcdf19f724ccffcb08e7375f21ae58f1544fcc753804348bb61f3dc706b984e5b8bdc43437f296e85a7e8767c1a168be879df9
6
+ metadata.gz: 36c2edb4757ce9a9a1311d4688ceba8da4b9529c1f193cf1e7c70634295e980d93fc68a133d3d5079d9f359dbe2b4efb53a05cf2f5ea5e09b6a4b469ff02a435
7
+ data.tar.gz: 0e977d49e4c994eac82d4e1c2525f30c95112513cc7bc620256f3788d550b4d294681aa36183c49f0bae1ded85b1bce9beba097025d0ecbb88df5774a610a652
data/bin/Changes CHANGED
@@ -4,15 +4,40 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 13.00. (Other versions are
7
+ Note: The most recent production release is Version 13.10. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Dec. 20, 2024 - Version 13.10 (production release)
11
+
12
+ - Added warnings for out-of-order entries in 'iinf' and 'ipma' boxes of HEIC
13
+ images
14
+ - Added support for date/time formatting codes %f and %z in the inverse
15
+ print conversion when writing tags
16
+ - Updated Geolocation databases from current geonames.org files
17
+ - Improved verbose output to show values stored with construction method 1 in
18
+ MP4-based files
19
+ - Enhanced the date/time timezone format specifier %z so that %:z returns the
20
+ time zone with a colon separator (eg. "-05:00")
21
+ - Fixed bug where the existing tag wasn't being removed when writing a new
22
+ value for an Unknown QuickTime UserData or ItemList tag
23
+
24
+ Dec. 17, 2024 - Version 13.09
25
+
26
+ - Added a new QuickTime tag (thanks Matti)
27
+ - Added a missing format check on a few tags when writing
28
+ - Decode a couple of new ICC_Profile tags
29
+ - Patched HEIC writer so newly added XMP or EXIF refers to the 'tmap' item as
30
+ well as the primary item of an HDRGainMap image (since iPhone 15 and 16 do
31
+ it this way)
32
+ - Fixed compatibility issue where Apple Preview would no longer show the gain
33
+ map image after adding new XMP to an HEIC with an HDR gain map
34
+
10
35
  Dec. 14, 2024 - Version 13.08
11
36
 
12
37
  - Decode ShutterCount for Canon EOS R6 Mark II (thanks Agoston Kapitany)
13
38
  - Decode a few new Photoshop tags
14
39
  - Suppress all duplicate Warning tags and add count to end of message
15
- - Changed format of bitmask keys in -list x output
40
+ - Changed format of bitmask keys in -listx output
16
41
  - Internal streamlining of LIGOGPSINFO decoding
17
42
  - Fixed issue where some tags were incorrectly shown as writable in -listx
18
43
  output
data/bin/MANIFEST CHANGED
@@ -937,6 +937,7 @@ t/Writer_58.out
937
937
  t/Writer_59.out
938
938
  t/Writer_6.out
939
939
  t/Writer_60.out
940
+ t/Writer_61.out
940
941
  t/Writer_7.out
941
942
  t/Writer_9.out
942
943
  t/XISF.t
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.08"
53
+ "version" : "13.10"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.08'
34
+ version: '13.10'
data/bin/README CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-13.08.tar.gz | tar -xf -
113
- cd Image-ExifTool-13.08
112
+ gzip -dc Image-ExifTool-13.10.tar.gz | tar -xf -
113
+ cd Image-ExifTool-13.10
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.08';
14
+ my $version = '13.10';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -5644,16 +5644,29 @@ in the delimiter. Default is ','.
5644
5644
 
5645
5645
  Set the format for date/time tag values. The I<FMT> string may contain
5646
5646
  formatting codes beginning with a percent character (C<%>) to represent the
5647
- various components of a date/time value. The specifics of the I<FMT> syntax
5648
- are system dependent -- consult the C<strftime> man page on your system for
5649
- details. The default format is equivalent to "%Y:%m:%d %H:%M:%S". This
5650
- option has no effect on date-only or time-only tags and ignores timezone
5651
- information if present. ExifTool adds a C<%f> format code to represent
5652
- fractional seconds, and supports an optional width to specify the number of
5653
- digits after the decimal point (eg. C<%3f> would give something like
5654
- C<.437>), and a minus sign to drop the decimal point (eg. C<%-3f> would give
5655
- C<437>). Only one B<-d> option may be used per command. Requires
5656
- POSIX::strptime or Time::Piece for the inversion conversion when writing.
5647
+ various components of a date/time value. ExifTool implements 3 format codes
5648
+ internally (see below), but other format codes are system dependent --
5649
+ consult the C<strftime> man page on your system for details. The default
5650
+ format is equivalent to "%Y:%m:%d %H:%M:%S". This option has no effect on
5651
+ date-only or time-only tags. Requires POSIX::strptime or Time::Piece for
5652
+ the inversion conversion when writing. Only one B<-d> option may be used
5653
+ per command.
5654
+
5655
+ Additional format codes implemented internally by ExifTool:
5656
+
5657
+ 1) C<%z> represents the time zone in "+/-HHMM" format. Adding a colon (ie.
5658
+ C<%:z>) adds a colon separator (eg. "-05:00"). If the date/time value
5659
+ doesn't contain a time zone then C<%z> gives the system time zone for the
5660
+ specified date/time value.
5661
+
5662
+ 2) C<%f> represents fractional seconds, and supports an optional width to
5663
+ specify the number of digits after the decimal point (eg. C<%3f> would give
5664
+ something like ".437"). Adding a minus sign drops the decimal point (eg.
5665
+ C<%-3f> would give "437").
5666
+
5667
+ 3) C<%s> represents the number of seconds since 00:00 UTC Jan 1, 1970,
5668
+ taking into account the specified time zone (or system time zone if not
5669
+ specified).
5657
5670
 
5658
5671
  =item B<-D> (B<-decimal>)
5659
5672
 
@@ -5913,7 +5926,7 @@ with this command:
5913
5926
 
5914
5927
  produces output like this:
5915
5928
 
5916
- -- Generated by ExifTool 13.08 --
5929
+ -- Generated by ExifTool 13.10 --
5917
5930
  File: a.jpg - 2003:10:31 15:44:19
5918
5931
  (f/5.6, 1/60s, ISO 100)
5919
5932
  File: b.jpg - 2006:05:23 11:57:38
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool::Exif;
17
17
  use Image::ExifTool::PLIST;
18
18
 
19
- $VERSION = '1.13';
19
+ $VERSION = '1.14';
20
20
 
21
21
  sub ConvertPLIST($$);
22
22
 
@@ -291,12 +291,12 @@ sub ConvertPLIST($$);
291
291
  # 0x0047 - (LeaderFollowerAutoFocusLeaderDepth, ref 2)
292
292
  # 0x0048 - (LeaderFollowerAutoFocusLeaderFocusMethod, ref 2)
293
293
  # 0x0049 - (LeaderFollowerAutoFocusLeaderConfidence, ref 2)
294
- # 0x004A - (LeaderFollowerAutoFocusLeaderROIType, ref 2)
294
+ # 0x004a - (LeaderFollowerAutoFocusLeaderROIType, ref 2)
295
295
  # 0x004a - 2=back normal, 4=back wide angle, 5=front (ref PH)
296
- # 0x004B - (ZeroShutterLagFailureReason, ref 2)
297
- # 0x004C - (TimeOfFlightAssistedAutoFocusEstimatorMSPMeasuredDepth, ref 2)
298
- # 0x004D - (TimeOfFlightAssistedAutoFocusEstimatorMSPSensorConfidence, ref 2)
299
- # 0x004E - (Camera, ref 2)
296
+ # 0x004b - (ZeroShutterLagFailureReason, ref 2)
297
+ # 0x004c - (TimeOfFlightAssistedAutoFocusEstimatorMSPMeasuredDepth, ref 2)
298
+ # 0x004d - (TimeOfFlightAssistedAutoFocusEstimatorMSPSensorConfidence, ref 2)
299
+ # 0x004e - (Camera, ref 2)
300
300
  0x004e => {
301
301
  Name => 'Apple_0x004e',
302
302
  Unknown => 1,
@@ -358,7 +358,8 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::Apple');
358
358
  sub ConvertPLIST($$)
359
359
  {
360
360
  my ($val, $et) = @_;
361
- my $dirInfo = { DataPt => \$val };
361
+ my $dirInfo = { DataPt => \$val, NoVerboseDir => 1 };
362
+ my $oldOrder = $et->GetByteOrder();
362
363
  require Image::ExifTool::PLIST;
363
364
  Image::ExifTool::PLIST::ProcessBinaryPLIST($et, $dirInfo);
364
365
  $val = $$dirInfo{Value};
@@ -366,6 +367,7 @@ sub ConvertPLIST($$)
366
367
  require 'Image/ExifTool/XMPStruct.pl';
367
368
  $val = Image::ExifTool::XMP::SerializeStruct($et, $val);
368
369
  }
370
+ $et->SetByteOrder($oldOrder);
369
371
  return $val;
370
372
  }
371
373
 
@@ -866,6 +866,11 @@ sub new
866
866
  }
867
867
  $noID = 1 if $isXMP or $short =~ /^(Shortcuts|ASF.*)$/ or $$vars{NO_ID};
868
868
  $hexID = $$vars{HEX_ID};
869
+ if ($$table{WRITE_PROC} and $$table{WRITE_PROC} eq \&Image::ExifTool::WriteBinaryData
870
+ and not $$table{CHECK_PROC})
871
+ {
872
+ warn("Binary table $tableName doesn't have a CHECK_PROC\n");
873
+ }
869
874
  my $processBinaryData = ($$table{PROCESS_PROC} and (
870
875
  $$table{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData or
871
876
  $$table{PROCESS_PROC} eq \&Image::ExifTool::Nikon::ProcessNikonEncrypted or
@@ -1004,6 +1009,9 @@ TagID: foreach $tagID (@keys) {
1004
1009
  if ($writable and not ($$table{WRITE_PROC} or $tableName =~ /Shortcuts/ or $writable eq '2')) {
1005
1010
  undef $writable;
1006
1011
  }
1012
+ #if ($writable and $$tagInfo{Unknown} and $$table{GROUPS}{0} ne 'MakerNotes') {
1013
+ # warn "Warning: Writable Unknown tag - $short $name\n",
1014
+ #}
1007
1015
  # validate some characteristics of obvious date/time tags
1008
1016
  my @g = $et->GetGroup($tagInfo);
1009
1017
  if ($$tagInfo{List} and $g[2] eq 'Time' and $writable and not $$tagInfo{Protected} and
Binary file
@@ -12,6 +12,7 @@
12
12
  # 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
13
13
  # 6) Eef Vreeland private communication
14
14
  # 7) https://color.org/specification/ICC.2-2019.pdf
15
+ # 8) https://www.color.org/specification/ICC.1-2022-05.pdf
15
16
  #
16
17
  # Notes: The ICC profile information is different: the format of each
17
18
  # tag is embedded in the information instead of in the directory
@@ -25,7 +26,7 @@ use strict;
25
26
  use vars qw($VERSION);
26
27
  use Image::ExifTool qw(:DataAccess :Utils);
27
28
 
28
- $VERSION = '1.40';
29
+ $VERSION = '1.41';
29
30
 
30
31
  sub ProcessICC($$);
31
32
  sub ProcessICC_Profile($$$);
@@ -367,6 +368,7 @@ my %manuSig = ( #6
367
368
  Groups => { 2 => 'Time' },
368
369
  PrintConv => '$self->ConvertDateTime($val)',
369
370
  },
371
+
370
372
  targ => {
371
373
  Name => 'CharTarget',
372
374
  ValueConv => '$val=~s/\0.*//; length $val > 128 ? \$val : $val',
@@ -493,6 +495,10 @@ my %manuSig = ( #6
493
495
  },
494
496
  },
495
497
  ciis => 'ColorimetricIntentImageState', #5
498
+ cicp => { #8 (Coding-independent Code Points)
499
+ Name => 'ColorRepresentation',
500
+ SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::ColorRep' },
501
+ },
496
502
  scoe => 'SceneColorimetryEstimates', #5
497
503
  sape => 'SceneAppearanceEstimates', #5
498
504
  fpce => 'FocalPlaneColorimetryEstimates', #5
@@ -628,6 +634,7 @@ my %manuSig = ( #6
628
634
  s2cp => 'StandardToCustomPcc',
629
635
  smap => 'SurfaceMap',
630
636
  # smwp ? (seen in some v5 samples [was a mistake in sample production])
637
+ hdgm => { Name => 'HDGainMapInfo', Binary => 1 }, #PH
631
638
 
632
639
  # the following entry represents the ICC profile header, and doesn't
633
640
  # exist as a tag in the directory. It is only in this table to provide
@@ -747,6 +754,78 @@ my %manuSig = ( #6
747
754
  },
748
755
  );
749
756
 
757
+ # Coding-independent code points (cicp) definition
758
+ # (NOTE: conversions are the same as Image::ExifTool::QuickTime::ColorRep tags)
759
+ %Image::ExifTool::ICC_Profile::ColorRep = (
760
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
761
+ GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-cicp', 2 => 'Image' },
762
+ 8 => {
763
+ Name => 'ColorPrimaries',
764
+ PrintConv => {
765
+ 1 => 'BT.709',
766
+ 2 => 'Unspecified',
767
+ 4 => 'BT.470 System M (historical)',
768
+ 5 => 'BT.470 System B, G (historical)',
769
+ 6 => 'BT.601',
770
+ 7 => 'SMPTE 240',
771
+ 8 => 'Generic film (color filters using illuminant C)',
772
+ 9 => 'BT.2020, BT.2100',
773
+ 10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
774
+ 11 => 'SMPTE RP 431-2',
775
+ 12 => 'SMPTE EG 432-1',
776
+ 22 => 'EBU Tech. 3213-E',
777
+ },
778
+ },
779
+ 9 => {
780
+ Name => 'TransferCharacteristics',
781
+ PrintConv => {
782
+ 0 => 'For future use (0)',
783
+ 1 => 'BT.709',
784
+ 2 => 'Unspecified',
785
+ 3 => 'For future use (3)',
786
+ 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
787
+ 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
788
+ 6 => 'BT.601',
789
+ 7 => 'SMPTE 240 M',
790
+ 8 => 'Linear',
791
+ 9 => 'Logarithmic (100 : 1 range)',
792
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
793
+ 11 => 'IEC 61966-2-4',
794
+ 12 => 'BT.1361',
795
+ 13 => 'sRGB or sYCC',
796
+ 14 => 'BT.2020 10-bit systems',
797
+ 15 => 'BT.2020 12-bit systems',
798
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
799
+ 17 => 'SMPTE ST 428',
800
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
801
+ },
802
+ },
803
+ 10 => {
804
+ Name => 'MatrixCoefficients',
805
+ PrintConv => {
806
+ 0 => 'Identity matrix',
807
+ 1 => 'BT.709',
808
+ 2 => 'Unspecified',
809
+ 3 => 'For future use (3)',
810
+ 4 => 'US FCC 73.628',
811
+ 5 => 'BT.470 System B, G (historical)',
812
+ 6 => 'BT.601',
813
+ 7 => 'SMPTE 240 M',
814
+ 8 => 'YCgCo',
815
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
816
+ 10 => 'BT.2020 constant luminance',
817
+ 11 => 'SMPTE ST 2085 YDzDx',
818
+ 12 => 'Chromaticity-derived non-constant luminance',
819
+ 13 => 'Chromaticity-derived constant luminance',
820
+ 14 => 'BT.2100 ICtCp',
821
+ },
822
+ },
823
+ 11 => {
824
+ Name => 'VideoFullRangeFlag',
825
+ PrintConv => { 0 => 'Limited', 1 => 'Full' },
826
+ },
827
+ );
828
+
750
829
  # viewingConditionsType (view) definition
751
830
  %Image::ExifTool::ICC_Profile::ViewingConditions = (
752
831
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -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.42';
19
+ $VERSION = '1.43';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -631,6 +631,7 @@ my %j2cMarker = (
631
631
  %Image::ExifTool::Jpeg2000::ColorSpec = (
632
632
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
633
633
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this)
634
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
634
635
  GROUPS => { 2 => 'Image' },
635
636
  FORMAT => 'int8s',
636
637
  WRITABLE => 1,
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::XMP;
22
22
  use Image::ExifTool::GPS;
23
23
 
24
- $VERSION = '1.12';
24
+ $VERSION = '1.13';
25
25
 
26
26
  sub ExtractObject($$;$);
27
27
  sub Get24u($$);
@@ -344,7 +344,7 @@ sub ProcessBinaryPLIST($$;$)
344
344
  my ($i, $buff, @table);
345
345
  my $dataPt = $$dirInfo{DataPt};
346
346
 
347
- $et->VerboseDir('Binary PLIST');
347
+ $et->VerboseDir('Binary PLIST') unless $$dirInfo{NoVerboseDir};
348
348
  SetByteOrder('MM');
349
349
 
350
350
  if ($dataPt) {
@@ -36,7 +36,7 @@ use strict;
36
36
  use vars qw($VERSION $AUTOLOAD %stdCase);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
 
39
- $VERSION = '1.69';
39
+ $VERSION = '1.70';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -435,6 +435,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
435
435
  %Image::ExifTool::PNG::PhysicalPixel = (
436
436
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
437
437
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
438
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
438
439
  WRITABLE => 1,
439
440
  GROUPS => { 1 => 'PNG-pHYs', 2 => 'Image' },
440
441
  WRITE_GROUP => 'PNG-pHYs',
@@ -362,6 +362,7 @@ my %unicodeString = (
362
362
  PROCESS_PROC => \&ProcessChannelOptions,
363
363
  VARS => { IS_BINARY => 1 },
364
364
  GROUPS => { 2 => 'Image' },
365
+ NOTES => 'These tags relate only to the appearance of a channel.',
365
366
  0 => {
366
367
  Name => 'ChannelColorSpace',
367
368
  Format => 'int16u',
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '3.05';
51
+ $VERSION = '3.07';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -2222,8 +2222,8 @@ my %userDefined = (
2222
2222
  _cx_ => { Name => 'CX', Format => 'rational64s', Unknown => 1 },
2223
2223
  _cy_ => { Name => 'CY', Format => 'rational64s', Unknown => 1 },
2224
2224
  rads => { Name => 'Rads', Format => 'rational64s', Unknown => 1 },
2225
- lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess)
2226
- Lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess)
2225
+ lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess, Kodak proprietary)
2226
+ Lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess, Kodak proprietary)
2227
2227
  pose => { Name => 'pose', SubDirectory => { TagTable => 'Image::ExifTool::Kodak::pose' } },
2228
2228
  # AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam)
2229
2229
  # tmlp - 1 byte: 0 (PixPro SP360/4KVR360)
@@ -2822,7 +2822,7 @@ my %userDefined = (
2822
2822
  },
2823
2823
  iinf => [{
2824
2824
  Name => 'ItemInformation',
2825
- Condition => '$$valPt =~ /^\0/', # (check for version 0)
2825
+ Condition => '$$self{LastItemID} = -1; $$valPt =~ /^\0/', # (check for version 0)
2826
2826
  SubDirectory => {
2827
2827
  TagTable => 'Image::ExifTool::QuickTime::ItemInfo',
2828
2828
  Start => 6, # (4-byte version/flags + 2-byte count)
@@ -2894,6 +2894,17 @@ my %userDefined = (
2894
2894
  %unknownInfo,
2895
2895
  },
2896
2896
  ],
2897
+ grpl => {
2898
+ Name => 'Unknown_grpl',
2899
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::grpl' },
2900
+ },
2901
+ );
2902
+
2903
+ # unknown grpl container
2904
+ %Image::ExifTool::QuickTime::grpl = (
2905
+ PROCESS_PROC => \&ProcessMOV,
2906
+ GROUPS => { 2 => 'Video' },
2907
+ # altr - seen "00 00 00 00 00 00 00 41 00 00 00 02 00 00 00 42 00 00 00 2e"
2897
2908
  );
2898
2909
 
2899
2910
  # additional metadata container (ref ISO14496-12:2015)
@@ -3038,6 +3049,7 @@ my %userDefined = (
3038
3049
  );
3039
3050
 
3040
3051
  # ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
3052
+ # (NOTE: conversions are the same as Image::ExifTool::ICC_Profile::ColorRep tags)
3041
3053
  %Image::ExifTool::QuickTime::ColorRep = (
3042
3054
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3043
3055
  GROUPS => { 2 => 'Video' },
@@ -3321,7 +3333,13 @@ my %userDefined = (
3321
3333
  the associations between items in the file. This information is used by
3322
3334
  ExifTool, but these entries are not extracted as tags.
3323
3335
  },
3324
- dimg => { Name => 'DerivedImageRef', RawConv => 'undef' },
3336
+ dimg => {
3337
+ Name => 'DerivedImageRef',
3338
+ # also parse these for the ID of the primary 'tmap' item
3339
+ # (tone-mapped image in HDRGainMap HEIC by iPhone 15 and 16)
3340
+ RawConv => \&ParseContentDescribes,
3341
+ WriteHook => \&ParseContentDescribes,
3342
+ },
3325
3343
  thmb => { Name => 'ThumbnailRef', RawConv => 'undef' },
3326
3344
  auxl => { Name => 'AuxiliaryImageRef', RawConv => 'undef' },
3327
3345
  cdsc => {
@@ -3339,7 +3357,8 @@ my %userDefined = (
3339
3357
  # hvc1 - HEVC image
3340
3358
  # lhv1 - L-HEVC image
3341
3359
  # infe - ItemInformationEntry
3342
- # infe types: avc1,hvc1,lhv1,Exif,xml1,iovl(overlay image),grid,mime,hvt1(tile image)
3360
+ # infe types: avc1,hvc1,lhv1,Exif,xml1,iovl(overlay image),grid,mime,tmap,hvt1(tile image)
3361
+ # ('tmap' has something to do with the new gainmap written by iPhone 15 and 16)
3343
3362
  infe => {
3344
3363
  Name => 'ItemInfoEntry',
3345
3364
  RawConv => \&ParseItemInfoEntry,
@@ -6569,7 +6588,7 @@ my %userDefined = (
6569
6588
  PROCESS_PROC => \&ProcessKeys,
6570
6589
  WRITE_PROC => \&WriteKeys,
6571
6590
  CHECK_PROC => \&CheckQTValue,
6572
- VARS => { LONG_TAGS => 8 },
6591
+ VARS => { LONG_TAGS => 9 },
6573
6592
  WRITABLE => 1,
6574
6593
  # (not PREFERRED when writing)
6575
6594
  GROUPS => { 1 => 'Keys' },
@@ -6767,6 +6786,7 @@ my %userDefined = (
6767
6786
  ValueConv => 'unpack("N", $val)',
6768
6787
  Writable => 0, # (don't make this writable because it is found in timed metadata)
6769
6788
  },
6789
+ 'full-frame-rate-playback-intent' => 'FullFrameRatePlaybackIntent', #forum16824
6770
6790
  #
6771
6791
  # seen in Apple ProRes RAW file
6772
6792
  #
@@ -8787,6 +8807,7 @@ sub PrintableTagID($;$)
8787
8807
  # ContentType - mime type of item
8788
8808
  # ContentEncoding - item encoding
8789
8809
  # URI - URI of a 'uri '-type item
8810
+ # infe - raw data for 'infe' box (when writing only) [retracted]
8790
8811
  # ipma:
8791
8812
  # Association - list of associated properties in the ipco container
8792
8813
  # Essential - list of "essential" flags for the associated properties
@@ -8937,10 +8958,18 @@ sub ParseItemInfoEntry($$)
8937
8958
  $$items{$id}{URI} = GetString(\$val, $pos);
8938
8959
  }
8939
8960
  }
8961
+ #[retracted] # save raw infe box when writing in case we need to sort items later
8962
+ #[retracted] $$items{$id}{infe} = pack('N', length($val)+8) . 'infe' . $val if $$et{IsWriting};
8940
8963
  $et->VPrint(1, "$$et{INDENT} Item $id: Type=", $$items{$id}{Type} || '',
8941
8964
  ' Name=', $$items{$id}{Name} || '',
8942
8965
  ' ContentType=', $$items{$id}{ContentType} || '',
8966
+ ($$et{PrimaryItem} and $$et{PrimaryItem} == $id) ? ' (PrimaryItem)' : '',
8943
8967
  "\n") if $verbose > 1;
8968
+ unless ($id > $$et{LastItemID}) {
8969
+ $et->Warn('Item info entries are out of order'); #[retracted] unless $$et{IsWriting};
8970
+ #[retracted] $$et{ItemsNotSorted} = 1; # set flag indicating the items weren't sorted
8971
+ }
8972
+ $$et{LastItemID} = $id;
8944
8973
  return undef;
8945
8974
  }
8946
8975
 
@@ -8961,6 +8990,7 @@ sub ParseItemPropAssoc($$)
8961
8990
  my $flg = Get32u(\$val, 0);
8962
8991
  my $num = Get32u(\$val, 4);
8963
8992
  my $pos = 8;
8993
+ my $lastID = -1;
8964
8994
  for ($i=0; $i<$num; ++$i) {
8965
8995
  if ($ver == 0) {
8966
8996
  return undef if $pos + 3 > $len;
@@ -8993,6 +9023,9 @@ sub ParseItemPropAssoc($$)
8993
9023
  $$items{$id}{Association} = \@association;
8994
9024
  $$items{$id}{Essential} = \@essential;
8995
9025
  $et->VPrint(1, "$$et{INDENT} Item $id properties: @association\n") if $verbose > 1;
9026
+ # (according to ISO/IEC 23008-12, these entries must be sorted by item ID)
9027
+ $et->Warn('Item property association entries are out of order') unless $id > $lastID;
9028
+ $lastID = $id;
8996
9029
  }
8997
9030
  return undef;
8998
9031
  }
@@ -9039,7 +9072,10 @@ sub HandleItemInfo($)
9039
9072
  }
9040
9073
  }
9041
9074
  $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
9042
- $warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod};
9075
+ # Note: In HEIC's, these seem to indicate data in 'idat' instead of 'mdat'
9076
+ my $constMeth = $$item{ConstructionMethod} || 0;
9077
+ $warn = "Can't currently extract $type with construction method $constMeth" if $constMeth > 1;
9078
+ $warn = "No 'idat' for $type object with construction method 1" if $constMeth == 1 and not $$et{MediaDataInfo};
9043
9079
  $et->Warn($warn) if $warn and $name;
9044
9080
  $warn = 'Not this file' if $$item{DataReferenceIndex}; # (can only extract from "this file")
9045
9081
  unless (($$item{Extents} and @{$$item{Extents}}) or $warn) {
@@ -9050,7 +9086,7 @@ sub HandleItemInfo($)
9050
9086
  $et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2;
9051
9087
  next;
9052
9088
  }
9053
- my $base = $$item{BaseOffset} || 0;
9089
+ my $base = ($$item{BaseOffset} || 0) + ($constMeth ? $$et{MediaDataInfo}[0] : 0);
9054
9090
  if ($verbose > 2) {
9055
9091
  # do verbose hex dump
9056
9092
  my $len = 0;
@@ -9189,6 +9225,7 @@ sub HandleItemInfo($)
9189
9225
  delete $$et{DOC_NUM};
9190
9226
  }
9191
9227
  delete $$et{ItemInfo};
9228
+ delete $$et{MediaDataInfo};
9192
9229
  }
9193
9230
 
9194
9231
  #------------------------------------------------------------------------------
@@ -9771,8 +9808,10 @@ sub ProcessMOV($$;$)
9771
9808
  # save required tag sizes
9772
9809
  if ($$tagTablePtr{"$tag-size"}) {
9773
9810
  $et->HandleTag($tagTablePtr, "$tag-size", $size);
9774
- $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
9811
+ $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()+$dirBase) if $$tagTablePtr{"$tag-offset"};
9775
9812
  }
9813
+ # save position/size of 'idat'
9814
+ $$et{MediaDataInfo} = [ $raf->Tell() + $dirBase, $size ] if $tag eq 'idat';
9776
9815
  # stop processing at mdat/idat if -fast2 is used
9777
9816
  last if $fast > 1 and ($tag eq 'mdat' or ($tag eq 'idat' and $$et{FileType} ne 'HEIC'));
9778
9817
  # load values only if associated with a tag (or verbose) and not too big
@@ -3261,6 +3261,7 @@ my %tagLookup = (
3261
3261
  'fujiflashmode' => { 133 => 0x1010 },
3262
3262
  'fujimodel' => { 133 => 0x1447 },
3263
3263
  'fujimodel2' => { 133 => 0x1448 },
3264
+ 'fullframerateplaybackintent' => { 409 => 'full-frame-rate-playback-intent' },
3264
3265
  'fullhdhighspeedrec' => { 133 => 0x3824 },
3265
3266
  'fullimagesize' => { 456 => 0xb02b },
3266
3267
  'fullpanoheightpixels' => { 507 => 'FullPanoHeightPixels', 508 => 'FullPanoHeightPixels' },
@@ -9862,6 +9863,7 @@ my %tagExists = (
9862
9863
  'hasxfa' => 1,
9863
9864
  'hcusage' => 1,
9864
9865
  'hdcontent' => 1,
9866
+ 'hdgainmapinfo' => 1,
9865
9867
  'hdmibitdepth' => 1,
9866
9868
  'hdmiexternalrecorder' => 1,
9867
9869
  'hdmioutputhdr' => 1,
@@ -12813,6 +12815,7 @@ my %tagExists = (
12813
12815
  'unknown02' => 1,
12814
12816
  'unknown03' => 1,
12815
12817
  'unknown_cndb' => 1,
12818
+ 'unknown_grpl' => 1,
12816
12819
  'unknown_h' => 1,
12817
12820
  'unknown_m' => 1,
12818
12821
  'unknown_slmt' => 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 28218 tags, with 17514 unique tag names.
15
+ They contain a total of 28224 tags, with 17515 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
@@ -8643,6 +8643,7 @@ specification.
8643
8643
  'cept' ColorEncodingParams no
8644
8644
  'chad' ChromaticAdaptation no
8645
8645
  'chrm' Chromaticity ICC_Profile Chromaticity
8646
+ 'cicp' ColorRepresentation ICC_Profile ColorRep
8646
8647
  'ciis' ColorimetricIntentImageState no
8647
8648
  'clio' ColorantInfoOut no
8648
8649
  'cloo' ColorantOrderOut no
@@ -8681,6 +8682,7 @@ specification.
8681
8682
  'gdb1' GamutBoundaryDescription1 no
8682
8683
  'gdb2' GamutBoundaryDescription2 no
8683
8684
  'gdb3' GamutBoundaryDescription3 no
8685
+ 'hdgm' HDGainMapInfo no
8684
8686
  'kTRC' GrayTRC no
8685
8687
  'lumi' Luminance no
8686
8688
  'mcta' MultiplexTypeArray no
@@ -8762,6 +8764,15 @@ specification.
8762
8764
  28 ChromaticityChannel3 no
8763
8765
  36 ChromaticityChannel4 no
8764
8766
 
8767
+ =head3 ICC_Profile ColorRep Tags
8768
+
8769
+ Index1 Tag Name Writable
8770
+ ------ -------- --------
8771
+ 8 ColorPrimaries no
8772
+ 9 TransferCharacteristics no
8773
+ 10 MatrixCoefficients no
8774
+ 11 VideoFullRangeFlag no
8775
+
8765
8776
  =head3 ICC_Profile ColorantTable Tags
8766
8777
 
8767
8778
  Index1 Tag Name Writable
@@ -8968,6 +8979,8 @@ access to this information.
8968
8979
 
8969
8980
  =head3 Photoshop ChannelOptions Tags
8970
8981
 
8982
+ These tags relate only to the appearance of a channel.
8983
+
8971
8984
  Index1 Tag Name Writable
8972
8985
  ------ -------- --------
8973
8986
  0 ChannelColorSpace no
@@ -30273,6 +30286,8 @@ changed via the config file.
30273
30286
  'director' Director yes
30274
30287
  'displayname' DisplayName yes
30275
30288
  'encoder' Encoder yes
30289
+ 'full-frame-rate-playback-intent'
30290
+ FullFrameRatePlaybackIntent yes
30276
30291
  'genre' Genre yes
30277
30292
  'information' Information yes
30278
30293
  'keywords' Keywords yes
@@ -30405,6 +30420,7 @@ Tags found in Pittasoft Blackvue dashcam "free" data.
30405
30420
  'bxml' BinaryXML? no
30406
30421
  'dinf' DataInfo QuickTime DataInfo
30407
30422
  'free' Free? no
30423
+ 'grpl' Unknown_grpl QuickTime grpl
30408
30424
  'hdlr' Handler QuickTime Handler
30409
30425
  'idat' MetaImageSize no
30410
30426
  'iinf' ItemInformation QuickTime ItemInfo
@@ -30439,6 +30455,12 @@ MP4 data reference box.
30439
30455
  'url ' URL no
30440
30456
  'urn ' URN no
30441
30457
 
30458
+ =head3 QuickTime grpl Tags
30459
+
30460
+ Tag ID Tag Name Writable
30461
+ ------ -------- --------
30462
+ [no tags known]
30463
+
30442
30464
  =head3 QuickTime Handler Tags
30443
30465
 
30444
30466
  Index1 Tag Name Writable
@@ -482,23 +482,26 @@ sub WriteKeys($$$)
482
482
  sub WriteItemInfo($$$)
483
483
  {
484
484
  my ($et, $dirInfo, $outfile) = @_;
485
- my $boxPos = $$dirInfo{BoxPos}; # hash of [length,position] for each box
485
+ my $boxPos = $$dirInfo{BoxPos}; # hash of [position,length,irefVer(iref only)] for box in $outfile
486
486
  my $raf = $$et{RAF};
487
487
  my $items = $$et{ItemInfo};
488
- my (%did, @mdatEdit, $name);
488
+ my (%did, @mdatEdit, $name, $tmap);
489
489
 
490
490
  return () unless $items and $raf;
491
491
 
492
492
  # extract information from EXIF/XMP metadata items
493
493
  my $primary = $$et{PrimaryItem};
494
494
  my $curPos = $raf->Tell();
495
+ my $lastID = 0;
495
496
  my $id;
496
497
  foreach $id (sort { $a <=> $b } keys %$items) {
498
+ $lastID = $id;
497
499
  $primary = $id unless defined $primary; # assume primary is lowest-number item if pitm missing
498
500
  my $item = $$items{$id};
499
501
  # only edit primary EXIF/XMP metadata
500
502
  next unless $$item{RefersTo} and $$item{RefersTo}{$primary};
501
503
  my $type = $$item{ContentType} || $$item{Type} || next;
504
+ $tmap = $id if $type eq 'tmap'; # save ID of primary 'tmap' item (tone-mapped image)
502
505
  # get ExifTool name for this item
503
506
  $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type};
504
507
  next unless $name; # only care about EXIF and XMP
@@ -700,8 +703,10 @@ sub WriteItemInfo($$$)
700
703
  $type = "Exif\0";
701
704
  $mime = '';
702
705
  }
703
- my $id = 1;
704
- ++$id while $$items{$id} or $usedID{$id}; # find next unused item ID
706
+ my $id = ++$lastID; # use next highest available ID (so ID's in iinf are in order)
707
+ #[retracted] # create new item information hash to save infe box in case we need it for sorting
708
+ #[retracted] my $item = $$items{$id} = { };
709
+ # add new infe entry to iinf box
705
710
  my $n = length($type) + length($mime) + length($enc) + 16;
706
711
  if ($id < 0x10000) {
707
712
  $add{iinf} .= pack('Na4CCCCnn', $n, 'infe', 2, 0, 0, 1, $id, 0) . $type . $mime . $enc;
@@ -709,11 +714,14 @@ sub WriteItemInfo($$$)
709
714
  $n += 2;
710
715
  $add{iinf} .= pack('Na4CCCCNn', $n, 'infe', 3, 0, 0, 1, $id, 0) . $type . $mime . $enc;
711
716
  }
712
- # add new cdsc to iref
717
+ #[retracted] $add{iinf} .= $$item{infe};
718
+ # add new cdsc to iref (also refer to primary 'tmap' if it exists)
713
719
  if ($irefVer) {
714
- $add{iref} .= pack('Na4NnN', 18, 'cdsc', $id, 1, $primary);
720
+ my ($fmt, $siz, $num) = defined $tmap ? ('N', 22, 2) : ('', 18, 1);
721
+ $add{iref} .= pack('Na4NnN'.$fmt, $siz, 'cdsc', $id, $num, $primary, $tmap);
715
722
  } else {
716
- $add{iref} .= pack('Na4nnn', 14, 'cdsc', $id, 1, $primary);
723
+ my ($fmt, $siz, $num) = defined $tmap ? ('n', 16, 2) : ('', 14, 1);
724
+ $add{iref} .= pack('Na4nnn'.$fmt, $siz, 'cdsc', $id, $num, $primary, $tmap);
717
725
  }
718
726
  # add new entry to iloc table (see ISO14496-12:2015 pg.79)
719
727
  my $ilocVer = Get8u($outfile, $$boxPos{iloc}[0] + 8);
@@ -778,8 +786,9 @@ sub WriteItemInfo($$$)
778
786
  my $added = 0;
779
787
  my $tag;
780
788
  foreach $tag (sort { $$boxPos{$a}[0] <=> $$boxPos{$b}[0] } keys %$boxPos) {
789
+ $$boxPos{$tag}[0] += $added;
781
790
  next unless $add{$tag};
782
- my $pos = $$boxPos{$tag}[0] + $added;
791
+ my $pos = $$boxPos{$tag}[0];
783
792
  unless ($$boxPos{$tag}[1]) {
784
793
  $tag eq 'iref' or $et->Error('Internal error adding iref box'), last;
785
794
  # create new iref box
@@ -826,9 +835,34 @@ sub WriteItemInfo($$$)
826
835
  }
827
836
  # add new entries to this box (or add pitm after hdlr)
828
837
  substr($$outfile, $pos + $$boxPos{$tag}[1], 0) = $add{$tag};
838
+ $$boxPos{$tag}[1] += length $add{$tag};
829
839
  $added += length $add{$tag}; # positions are shifted by length of new entries
830
840
  }
831
841
  }
842
+ #[This sorting idea was retracted because just sorting 'iinf' wasn't sufficient to
843
+ # repair the problem where an out-of-order ID was added -- Apple Preview still
844
+ # ignores the gain-map image. It looks like either or both 'iref' and 'iloc' must
845
+ # also be sorted by ID, although the spec doesn't mention this]
846
+ #[retracted] # sort infe entries in iinf box if necessary
847
+ #[retracted] if ($$et{ItemsNotSorted}) {
848
+ #[retracted] if ($$boxPos{iinf}) {
849
+ #[retracted] my $iinfVer = Get8u($outfile, $$boxPos{iinf}[0] + 8);
850
+ #[retracted] my $off = $iinfVer == 0 ? 14 : 16; # offset to first infe item
851
+ #[retracted] my $sorted = ''; # sorted iinf payload
852
+ #[retracted] $sorted .= $$items{$_}{infe} || '' foreach sort { $a <=> $b } keys %$items;
853
+ #[retracted] if (length $sorted == $$boxPos{iinf}[1]-$off) {
854
+ #[retracted] # replace with sorted infe entries
855
+ #[retracted] substr($$outfile, $$boxPos{iinf}[0] + $off, length $sorted) = $sorted;
856
+ #[retracted] $et->Warn('Item info entries are out of order. Fixed.');
857
+ #[retracted] ++$$et{CHANGED};
858
+ #[retracted] } else {
859
+ #[retracted] $et->Warn('Error sorting item info entries');
860
+ #[retracted] }
861
+ #[retracted] } else {
862
+ #[retracted] $et->Warn('Item info entries are out of order');
863
+ #[retracted] }
864
+ #[retracted] delete $$et{ItemsNotSorted};
865
+ #[retracted] }
832
866
  delete $$et{ItemInfo};
833
867
  return @mdatEdit ? \@mdatEdit : undef;
834
868
  }
@@ -1129,7 +1163,7 @@ sub WriteQuickTime($$$)
1129
1163
  next;
1130
1164
  }
1131
1165
  }
1132
- undef $tagInfo if $tagInfo and $$tagInfo{Unknown};
1166
+ undef $tagInfo if $tagInfo and $$tagInfo{AddedUnknown};
1133
1167
 
1134
1168
  if ($tagInfo and (not defined $$tagInfo{Writable} or $$tagInfo{Writable})) {
1135
1169
  my $subdir = $$tagInfo{SubDirectory};
@@ -4993,7 +4993,7 @@ my $strptimeLib; # strptime library name if available
4993
4993
  sub InverseDateTime($$;$$)
4994
4994
  {
4995
4995
  my ($self, $val, $tzFlag, $dateOnly) = @_;
4996
- my ($rtnVal, $tz);
4996
+ my ($rtnVal, $tz, $fs);
4997
4997
  my $fmt = $$self{OPTIONS}{DateFormat};
4998
4998
  # strip off timezone first if it exists
4999
4999
  if (not $fmt and $val =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) {
@@ -5019,8 +5019,17 @@ sub InverseDateTime($$;$$)
5019
5019
  $strptimeLib = '';
5020
5020
  }
5021
5021
  }
5022
- # handle factional seconds (%f), but only at the end of the string
5023
- my $fs = ($fmt =~ s/%f$// and $val =~ s/(\.\d+)\s*$//) ? $1 : '';
5022
+ # handle fractional seconds (%f) and time zone (%z)
5023
+ ($fs, $tz) = ('', '');
5024
+ if ($fmt =~ /%(f|:?z)/) {
5025
+ if ($fmt =~ s/(.*[^%])%f/$1/) {
5026
+ $fs = $2 if $val =~ s/(.*)(\.\d+)/$1/; # (take last .### as fractional seconds)
5027
+ }
5028
+ if ($fmt =~ s/(.*[^%])%(:?)z/$1/) {
5029
+ my $colon = $2;
5030
+ $tz = "$2:$3" if $val =~ s/(.*)([-+]\d{2})$colon(\d{2})/$1/;
5031
+ }
5032
+ }
5024
5033
  my ($lib, $wrn, @a);
5025
5034
  TryLib: for ($lib=$strptimeLib; ; $lib='') {
5026
5035
  # handle %s format ourself (not supported in Fedora, see forum15032)
@@ -5065,7 +5074,7 @@ TryLib: for ($lib=$strptimeLib; ; $lib='') {
5065
5074
  $a[$i] = "0$a[$i]"; # pad to 2 digits if necessary
5066
5075
  }
5067
5076
  }
5068
- $val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]) . $fs;
5077
+ $val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]) . $fs . $tz;
5069
5078
  last;
5070
5079
  }
5071
5080
  }
@@ -5077,7 +5086,9 @@ TryLib: for ($lib=$strptimeLib; ; $lib='') {
5077
5086
  my $ss = $a[4]; # get SS
5078
5087
  push @a, '00' while @a < 5; # add MM, SS if not given
5079
5088
  # get sub-seconds if they exist (must be after SS, and have leading ".")
5080
- my $fs = (@a > 5 and $val =~ /(\.\d+)\s*$/) ? $1 : '';
5089
+ unless ($fmt) {
5090
+ $fs = (@a > 5 and $val =~ /(\.\d+)\s*$/) ? $1 : '';
5091
+ }
5081
5092
  # add/remove timezone if necessary
5082
5093
  if ($tzFlag) {
5083
5094
  if (not $tz) {
@@ -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.08';
32
+ $VERSION = '13.10';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -6551,11 +6551,13 @@ sub ConvertDateTime($$)
6551
6551
  $fmt =~ s/(^|[^%])((%%)*)%-?\.?\d*f/$1$2$frac/g;
6552
6552
  }
6553
6553
  # parse %z and %s ourself (to handle time zones properly)
6554
- if ($fmt =~ /%[sz]/) {
6554
+ if ($fmt =~ /%:?[sz]/) {
6555
6555
  # use system time zone unless otherwise specified
6556
6556
  $tz = TimeZoneString(\@a, TimeLocal(@a)) if not $tz and eval { require Time::Local };
6557
6557
  # remove colon, setting to UTC if time zone is not numeric
6558
- $tz = ($tz and $tz=~/^([-+]\d{2}):(\d{2})$/) ? "$1$2" : '+0000';
6558
+ $tz = '+00:00' unless $tz and $tz=~/^[-+]\d{2}:\d{2}$/;
6559
+ $fmt =~ s/(^|[^%])((%%)*)%:z/$1$2$tz/g; # convert '%:z' format codes
6560
+ $tz =~ s/://;
6559
6561
  $fmt =~ s/(^|[^%])((%%)*)%z/$1$2$tz/g; # convert '%z' format codes
6560
6562
  if ($fmt =~ /%s/ and eval { require Time::Local }) {
6561
6563
  # calculate seconds since the Epoch, UTC
@@ -8961,8 +8963,9 @@ sub GetTagInfo($$$;$$$)
8961
8963
  next;
8962
8964
  }
8963
8965
  }
8964
- # don't return Unknown tags unless that option is set (also see forum13716)
8965
- if ($$tagInfo{Unknown} and not $$options{Unknown} and not
8966
+ # don't return Unknown tags unless that option is set or we are writing (also see forum13716)
8967
+ if ($$tagInfo{Unknown} and not $$options{Unknown} and
8968
+ (not $$self{IsWriting} or $$tagInfo{AddedUnknown}) and not
8966
8969
  ($$options{Verbose} or $$self{HTML_DUMP} or
8967
8970
  ($$options{Validate} and not $$tagInfo{AddedUnknown})))
8968
8971
  {
@@ -613,8 +613,10 @@ different when copying tags with L</SetNewValuesFromFile>.
613
613
  Format for printing date/time values. See C<strftime> in the L<POSIX>
614
614
  package and L<https://exiftool.org/filename.html#codes> for details about
615
615
  the format string. If the date can not be converted, the value is left
616
- unchanged unless the StrictDate option is set. Timezones are ignored. The
617
- inverse conversion (ie. when calling L</SetNewValue>) is performed only if
616
+ unchanged unless the StrictDate option is set. ExifTool adds a few
617
+ additional format specifiers (C<%f>, C<%s> and C<%z>), see
618
+ L<https://exiftool.org/filename.html#codes> for more details. The inverse
619
+ conversion (ie. when calling L</SetNewValue>) is performed only if
618
620
  POSIX::strptime or Time::Piece is installed. The default setting of undef
619
621
  causes date/time values to remain in standard EXIF format (similar to a
620
622
  DateFormat of "%Y:%m:%d %H:%M:%S").
@@ -2559,39 +2561,39 @@ Ducky, EPPIM, EXE, EXIF, ExifIFD, ExifTool, FITS, FLAC, FLIR, File, Flash,
2559
2561
  FlashPix, Font, FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP, GM, GPS,
2560
2562
  GSpherical, Garmin, GeoTiff, GlobParamIFD, GoPro, GraphConv, H264, HP, HTC,
2561
2563
  HTML, HTML-dc, HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv,
2562
- ICC-chrm, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile,
2563
- ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1,
2564
- IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList, JFIF, JFXX,
2565
- JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys, Kodak,
2566
- KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LIGO, LNK, Leaf,
2567
- LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC, MIE-Audio, MIE-Camera,
2568
- MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo, MIE-Image,
2569
- MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview,
2570
- MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB, MNG, MOBI, MOI,
2571
- MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes, MakerUnknown,
2572
- Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta, MinoltaRaw,
2573
- Motorola, NITF, Nextbase, Nikon, NikonCapture, NikonCustom, NikonScan,
2574
- NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF,
2575
- PICT, PNG, PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Parrot,
2576
- Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo,
2577
- PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2,
2578
- RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR,
2579
- Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh,
2580
- SEAL, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado,
2581
- Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent,
2582
- Track#, UserData, VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP,
2583
- XMP-DICOM, XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GContainer,
2584
- XMP-GCreations, XMP-GDepth, XMP-GFocus, XMP-GImage, XMP-GPano,
2585
- XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas,
2586
- XMP-acdsee, XMP-acdsee-rs, XMP-album, XMP-apple-fi, XMP-ast, XMP-aux,
2587
- XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs, XMP-dc, XMP-dex,
2588
- XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif, XMP-exifEX,
2589
- XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr, XMP-hdrgm,
2590
- XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
2591
- XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama, XMP-pdf,
2592
- XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism,
2593
- XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff, XMP-x,
2594
- XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
2564
+ ICC-chrm, ICC-cicp, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view,
2565
+ ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4,
2566
+ IFD0, IFD1, IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList,
2567
+ JFIF, JFXX, JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys,
2568
+ Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LIGO, LNK,
2569
+ Leaf, LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC, MIE-Audio,
2570
+ MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo,
2571
+ MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient,
2572
+ MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB,
2573
+ MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes,
2574
+ MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta,
2575
+ MinoltaRaw, Motorola, NITF, Nextbase, Nikon, NikonCapture, NikonCustom,
2576
+ NikonScan, NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR,
2577
+ Opus, PDF, PICT, PNG, PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic,
2578
+ PanasonicRaw, Parrot, Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop,
2579
+ PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm,
2580
+ QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real,
2581
+ Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD,
2582
+ Reconyx, Red, Ricoh, SEAL, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG,
2583
+ Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD,
2584
+ System, Theora, Torrent, Track#, UserData, VCalendar, VCard, VNote,
2585
+ Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, XMP-Device, XMP-GAudio,
2586
+ XMP-GCamera, XMP-GContainer, XMP-GCreations, XMP-GDepth, XMP-GFocus,
2587
+ XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1,
2588
+ XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-acdsee-rs, XMP-album, XMP-apple-fi,
2589
+ XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs,
2590
+ XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
2591
+ XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
2592
+ XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
2593
+ XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
2594
+ XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
2595
+ XMP-prism, XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
2596
+ XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
2595
2597
  XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
2596
2598
 
2597
2599
  =item Family 2 (Category):
@@ -2832,6 +2834,10 @@ for the system. In Windows this also has the effect of activating Unicode
2832
2834
  filename support via the special Windows wide-character i/o routines if
2833
2835
  Win32API::File is available.
2834
2836
 
2837
+ Note that setting the L</WindowsWideFile> or L</WindowsLongPath> option
2838
+ causes L</CharsetFileName> to default to 'UTF8' in Windows if not defined,
2839
+ and L</WindowsLongPath> is set by default in ExifTool 13.07 and later.
2840
+
2835
2841
  =item Internal Character Sets:
2836
2842
 
2837
2843
  The encodings used to store strings in the various metadata formats. These
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 13.08
3
+ Version: 13.10
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.08.0')
4
+ VERSION = Gem::Version.new('13.10.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.08.0
4
+ version: 13.10.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-12-16 00:00:00.000000000 Z
12
+ date: 2024-12-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool