exiftool_vendored 13.08.0 → 13.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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