exiftool-vendored.exe 12.67.0 → 12.70.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.
Files changed (42) hide show
  1. package/bin/exiftool_files/Changes +79 -10
  2. package/bin/exiftool_files/README +7 -7
  3. package/bin/exiftool_files/exiftool.pl +37 -31
  4. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +18 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +87 -16
  6. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +3 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +25 -2
  8. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +54 -6
  9. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +175 -14
  10. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +158 -20
  11. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +16 -11
  13. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +70 -7
  14. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  17. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +2 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +82 -22
  19. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +7 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +3 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +22 -9
  22. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +6 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +2 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +92 -55
  25. package/bin/exiftool_files/lib/Image/ExifTool/README +14 -5
  26. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +60 -10
  27. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +152 -46
  28. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6955 -6713
  29. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +878 -334
  30. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +4 -5
  31. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +23 -20
  32. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
  33. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +14 -4
  34. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +3 -0
  35. package/bin/exiftool_files/lib/Image/ExifTool/WriteRIFF.pl +31 -6
  36. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +40 -14
  37. package/bin/exiftool_files/lib/Image/ExifTool/XISF.pm +185 -0
  38. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +67 -2
  39. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +35 -0
  40. package/bin/exiftool_files/lib/Image/ExifTool.pm +92 -45
  41. package/bin/exiftool_files/lib/Image/ExifTool.pod +14 -8
  42. package/package.json +3 -3
@@ -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.64';
39
+ $VERSION = '1.65';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -80,6 +80,7 @@ my %pngMap = (
80
80
  ICC_Profile => 'PNG',
81
81
  Photoshop => 'PNG',
82
82
  'PNG-pHYs' => 'PNG',
83
+ JUMBF => 'PNG',
83
84
  IPTC => 'Photoshop',
84
85
  MakerNotes => 'ExifIFD',
85
86
  );
@@ -341,6 +342,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
341
342
  },
342
343
  caBX => { # C2PA metadata
343
344
  Name => 'JUMBF',
345
+ Deletable => 1,
344
346
  SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
345
347
  },
346
348
  cICP => {
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
  use Image::ExifTool::Exif;
39
39
 
40
- $VERSION = '2.18';
40
+ $VERSION = '2.21';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -1070,18 +1070,18 @@ my %shootingMode = (
1070
1070
  },
1071
1071
  },
1072
1072
  # 0x71 - undef[128] (maybe text stamp text?)
1073
+ # 0x72,0x73,0x74,0x75,0x77,0x78: 0
1074
+ # 0x76: 0, (3 for G6 with HDR on, ref 18)
1075
+ 0x76 => { #18/21/forum15298
1076
+ Name => 'MergedImages',
1077
+ Writable => 'int16u',
1078
+ Notes => 'number of images in HDR or Live View Composite picture',
1079
+ },
1073
1080
  0x77 => { #18
1074
1081
  Name => 'BurstSpeed',
1075
1082
  Writable => 'int16u',
1076
1083
  Notes => 'images per second',
1077
1084
  },
1078
- # 0x72,0x73,0x74,0x75,0x77,0x78: 0
1079
- # 0x76: 0, (3 for G6 with HDR on, ref 18)
1080
- 0x76 => { #18/21
1081
- Name => 'HDRShot',
1082
- Writable => 'int16u',
1083
- PrintConv => { 0 => 'Off', 3 => 'On' },
1084
- },
1085
1085
  0x79 => { #PH (GH2)
1086
1086
  Name => 'IntelligentD-Range',
1087
1087
  Writable => 'int16u',
@@ -1991,6 +1991,15 @@ my %shootingMode = (
1991
1991
  },
1992
1992
  PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_',
1993
1993
  },
1994
+ 0x05ff => {
1995
+ Name => 'CameraIFD', # (Leica Q3)
1996
+ Condition => '$$valPt =~ /^(II\x2a\0\x08\0\0\0|MM\0\x2a\0\0\0\x08)/',
1997
+ SubDirectory => {
1998
+ TagTable => 'Image::ExifTool::PanasonicRaw::CameraIFD',
1999
+ Base => '$start',
2000
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
2001
+ },
2002
+ },
1994
2003
  );
1995
2004
 
1996
2005
  # Leica type5 ShotInfo (ref PH) (X2)
@@ -2834,10 +2843,14 @@ sub ProcessLeicaTrailer($;$)
2834
2843
  my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, \%dirInfo, $tagTablePtr);
2835
2844
  unless (defined $val) {
2836
2845
  $et->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4;
2837
- $val = $buff,
2846
+ $val = $buff;
2838
2847
  }
2839
2848
  my $key = $et->FoundTag($tagInfo, $val);
2840
2849
  $et->SetGroup($key, 'ExifIFD');
2850
+ if ($$et{MAKER_NOTE_FIXUP}) {
2851
+ $$et{TAG_EXTRA}{$key}{Fixup} = $$et{MAKER_NOTE_FIXUP};
2852
+ delete $$et{MAKER_NOTE_FIXUP};
2853
+ }
2841
2854
  }
2842
2855
  }
2843
2856
  SetByteOrder($oldOrder);
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
58
58
  use Image::ExifTool::GPS;
59
59
  use Image::ExifTool::HP;
60
60
 
61
- $VERSION = '3.43';
61
+ $VERSION = '3.44';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -556,6 +556,8 @@ my %pentaxModelID = (
556
556
  0x13240 => 'K-1 Mark II', # (Ricoh)
557
557
  0x13254 => 'K-3 Mark III', #IB (Ricoh)
558
558
  0x13290 => 'WG-70', # (Ricoh)
559
+ 0x1329a => 'GR IIIx', # (Ricoh)
560
+ 0x132d6 => 'K-3 Mark III Monochrome', #github226 (Ricoh)
559
561
  );
560
562
 
561
563
  # Pentax city codes - (PH, Optio WP)
@@ -971,6 +973,7 @@ my %binaryDataAttrs = (
971
973
  5 => 'Premium', #PH (K20D)
972
974
  7 => 'RAW (pixel shift enabled)', #forum6536 (K-3 II)
973
975
  8 => 'Dynamic Pixel Shift', #IB
976
+ 9 => 'Monochrome', #github226
974
977
  65535 => 'n/a', #PH (Q MOV video)
975
978
  },
976
979
  },
@@ -2144,6 +2147,7 @@ my %binaryDataAttrs = (
2144
2147
  11 => 'Flat', #31 (K-70)
2145
2148
  # 256 - seen for GR III
2146
2149
  # 262 - seen for GR III
2150
+ 32768 => 'n/a',
2147
2151
  },
2148
2152
  },
2149
2153
  0x0050 => { #PH
@@ -2230,6 +2234,7 @@ my %binaryDataAttrs = (
2230
2234
  18 => '18 (KP)', #PH
2231
2235
  19 => '19 (GR III)', #PH
2232
2236
  20 => '20 (K-3III)', #PH
2237
+ 21 => '21 (K-3IIIMonochrome)', #github226
2233
2238
  },
2234
2239
  },
2235
2240
  0x0067 => { #PH (K-5)
@@ -15,7 +15,7 @@ use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::IPTC;
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.06';
18
+ $VERSION = '1.08';
19
19
 
20
20
  sub ProcessPhotoMechanic($$);
21
21
 
@@ -138,6 +138,7 @@ my %rawCropConv = (
138
138
  ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
139
139
  ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
140
140
  },
141
+ CreatorIdentity => { List => 'Seq' },
141
142
  );
142
143
 
143
144
  #------------------------------------------------------------------------------
@@ -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 = '2.87';
51
+ $VERSION = '2.89';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -638,6 +638,33 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
638
638
  Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}',
639
639
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' },
640
640
  },
641
+ { #https://c2pa.org/specifications/
642
+ Name => 'JUMBF',
643
+ Condition => '$$valPt=~/^\xd8\xfe\xc3\xd6\x1b\x0e\x48\x3c\x92\x97\x58\x28\x87\x7e\xc4\x81.{4}manifest\0/s',
644
+ Deletable => 1,
645
+ SubDirectory => {
646
+ TagTable => 'Image::ExifTool::Jpeg2000::Main',
647
+ # 16 bytes uuid
648
+ # +4 bytes 0
649
+ # +9 bytes "manifest\0"
650
+ # +8 bytes absolute(!!!) offset to C2PA uuid "merkle\0" box
651
+ # =37 bytes total
652
+ Start => 37,
653
+ },
654
+ },
655
+ { #https://c2pa.org/specifications/ (NC)
656
+ Name => 'CBOR',
657
+ Condition => '$$valPt=~/^\xd8\xfe\xc3\xd6\x1b\x0e\x48\x3c\x92\x97\x58\x28\x87\x7e\xc4\x81.{4}merkle\0/s',
658
+ Deletable => 1, # (NC)
659
+ SubDirectory => {
660
+ TagTable => 'Image::ExifTool::CBOR::Main',
661
+ # 16 bytes uuid
662
+ # +4 bytes 0
663
+ # +7 bytes "merkle\0"
664
+ # =27 bytes total
665
+ Start => 27,
666
+ },
667
+ },
641
668
  {
642
669
  Name => 'SensorData',
643
670
  Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
@@ -2393,6 +2420,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2393
2420
  Name => 'Audible_tags',
2394
2421
  SubDirectory => { TagTable => 'Image::ExifTool::Audible::tags' },
2395
2422
  },
2423
+ # ludt - directory containing 'tlou' tag
2396
2424
  );
2397
2425
 
2398
2426
  # Unknown information stored in HTC One (M8) videos - PH
@@ -2903,65 +2931,69 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2903
2931
  Name => 'ColorPrimaries',
2904
2932
  Format => 'int16u',
2905
2933
  PrintConv => {
2906
- 1 => 'BT.709',
2907
- 2 => 'Unspecified',
2908
- 4 => 'BT.470 System M (historical)',
2909
- 5 => 'BT.470 System B, G (historical)',
2910
- 6 => 'BT.601',
2911
- 7 => 'SMPTE 240',
2912
- 8 => 'Generic film (color filters using illuminant C)',
2913
- 9 => 'BT.2020, BT.2100',
2914
- 10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
2915
- 11 => 'SMPTE RP 431-2',
2916
- 12 => 'SMPTE EG 432-1',
2917
- 22 => 'EBU Tech. 3213-E',
2918
- },
2934
+ 1 => 'BT.709',
2935
+ 2 => 'Unspecified',
2936
+ 4 => 'BT.470 System M (historical)',
2937
+ 5 => 'BT.470 System B, G (historical)',
2938
+ 6 => 'BT.601',
2939
+ 7 => 'SMPTE 240',
2940
+ 8 => 'Generic film (color filters using illuminant C)',
2941
+ 9 => 'BT.2020, BT.2100',
2942
+ 10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
2943
+ 11 => 'SMPTE RP 431-2',
2944
+ 12 => 'SMPTE EG 432-1',
2945
+ 22 => 'EBU Tech. 3213-E',
2946
+ },
2919
2947
  },
2920
2948
  6 => {
2921
2949
  Name => 'TransferCharacteristics',
2922
2950
  Format => 'int16u',
2923
2951
  PrintConv => {
2924
- 0 => 'For future use (0)',
2925
- 1 => 'BT.709',
2926
- 2 => 'Unspecified',
2927
- 3 => 'For future use (3)',
2928
- 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
2929
- 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
2930
- 6 => 'BT.601',
2931
- 7 => 'SMPTE 240 M',
2932
- 8 => 'Linear',
2933
- 9 => 'Logarithmic (100 : 1 range)',
2934
- 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
2935
- 11 => 'IEC 61966-2-4',
2936
- 12 => 'BT.1361',
2937
- 13 => 'sRGB or sYCC',
2938
- 14 => 'BT.2020 10-bit systems',
2939
- 15 => 'BT.2020 12-bit systems',
2940
- 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
2941
- 17 => 'SMPTE ST 428',
2942
- 18 => 'BT.2100 HLG, ARIB STD-B67',
2943
- },
2952
+ 0 => 'For future use (0)',
2953
+ 1 => 'BT.709',
2954
+ 2 => 'Unspecified',
2955
+ 3 => 'For future use (3)',
2956
+ 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
2957
+ 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
2958
+ 6 => 'BT.601',
2959
+ 7 => 'SMPTE 240 M',
2960
+ 8 => 'Linear',
2961
+ 9 => 'Logarithmic (100 : 1 range)',
2962
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
2963
+ 11 => 'IEC 61966-2-4',
2964
+ 12 => 'BT.1361',
2965
+ 13 => 'sRGB or sYCC',
2966
+ 14 => 'BT.2020 10-bit systems',
2967
+ 15 => 'BT.2020 12-bit systems',
2968
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
2969
+ 17 => 'SMPTE ST 428',
2970
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
2971
+ },
2944
2972
  },
2945
2973
  8 => {
2946
2974
  Name => 'MatrixCoefficients',
2947
2975
  Format => 'int16u',
2948
2976
  PrintConv => {
2949
- 0 => 'Identity matrix',
2950
- 1 => 'BT.709',
2951
- 2 => 'Unspecified',
2952
- 3 => 'For future use (3)',
2953
- 4 => 'US FCC 73.628',
2954
- 5 => 'BT.470 System B, G (historical)',
2955
- 6 => 'BT.601',
2956
- 7 => 'SMPTE 240 M',
2957
- 8 => 'YCgCo',
2958
- 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
2959
- 10 => 'BT.2020 constant luminance',
2960
- 11 => 'SMPTE ST 2085 YDzDx',
2961
- 12 => 'Chromaticity-derived non-constant luminance',
2962
- 13 => 'Chromaticity-derived constant luminance',
2963
- 14 => 'BT.2100 ICtCp',
2964
- },
2977
+ 0 => 'Identity matrix',
2978
+ 1 => 'BT.709',
2979
+ 2 => 'Unspecified',
2980
+ 3 => 'For future use (3)',
2981
+ 4 => 'US FCC 73.628',
2982
+ 5 => 'BT.470 System B, G (historical)',
2983
+ 6 => 'BT.601',
2984
+ 7 => 'SMPTE 240 M',
2985
+ 8 => 'YCgCo',
2986
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
2987
+ 10 => 'BT.2020 constant luminance',
2988
+ 11 => 'SMPTE ST 2085 YDzDx',
2989
+ 12 => 'Chromaticity-derived non-constant luminance',
2990
+ 13 => 'Chromaticity-derived constant luminance',
2991
+ 14 => 'BT.2100 ICtCp',
2992
+ },
2993
+ },
2994
+ 10 => {
2995
+ Name => 'VideoFullRangeFlag',
2996
+ Mask => 0x80,
2965
2997
  },
2966
2998
  );
2967
2999
 
@@ -6399,6 +6431,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6399
6431
  Writable => 'int8s', #27
6400
6432
  PrintConv => { 0 => 'No', 1 => 'Yes' },
6401
6433
  },
6434
+ ownr => 'Owner', #PH (obscure) (ref ChrisAdan private communication)
6435
+ 'xid ' => 'ISRC', #PH
6402
6436
  );
6403
6437
 
6404
6438
  # tag decoded from timed face records
@@ -7663,7 +7697,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7663
7697
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Rights' },
7664
7698
  },
7665
7699
  name => { Name => 'UserName', Groups => { 2 => 'Author' } },
7666
- # chtb
7700
+ # chtb - seen 632 bytes of random data
7667
7701
  # priv - private data
7668
7702
  # sign
7669
7703
  # adkm - Adobe DRM key management system (ref http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf)
@@ -7686,6 +7720,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7686
7720
  },
7687
7721
  medi => 'MediaFlags', #PH (?)
7688
7722
  mode => 'ModeFlags', #PH (?) 0x04 is HD flag (https://compilr.com/heksesang/requiem-mac/UnDrm.java)
7723
+ # sing - seen 4 zeros
7724
+ # hi32 - seen "00 00 00 04"
7725
+
7689
7726
  );
7690
7727
 
7691
7728
  # MP4 hint sample description box (ref 5)
@@ -9492,9 +9529,9 @@ sub ProcessMOV($$;$)
9492
9529
  $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
9493
9530
  }
9494
9531
  # stop processing at mdat/idat if -fast2 is used
9495
- last if $fast > 1 and ($tag eq 'mdat' or $tag eq 'idat');
9532
+ last if $fast > 1 and ($tag eq 'mdat' or ($tag eq 'idat' and $$et{FileType} ne 'HEIC'));
9496
9533
  # load values only if associated with a tag (or verbose) and not too big
9497
- if ($size > 0x2000000) { # start to get worried above 32 MB
9534
+ if ($size > 0x2000000) { # start to get worried above 32 MiB
9498
9535
  # check for RIFF trailer (written by Auto-Vox dashcam)
9499
9536
  if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record)
9500
9537
  $et->VPrint(0, "Found RIFF trailer");
@@ -9511,9 +9548,9 @@ sub ProcessMOV($$;$)
9511
9548
  if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) {
9512
9549
  my $t = PrintableTagID($tag,2);
9513
9550
  if ($size > 0x8000000) {
9514
- $et->Warn("Skipping '${t}' atom > 128 MB", 1);
9551
+ $et->Warn("Skipping '${t}' atom > 128 MiB", 1);
9515
9552
  } else {
9516
- $et->Warn("Skipping '${t}' atom > 32 MB", 2) or $ignore = 0;
9553
+ $et->Warn("Skipping '${t}' atom > 32 MiB", 2) or $ignore = 0;
9517
9554
  }
9518
9555
  }
9519
9556
  }
@@ -343,9 +343,10 @@ numerical, and generated automatically otherwise.
343
343
  but applied automatically to individual tags. Value specifies
344
344
  pattern for split, or 1 for default pattern ',?\\s+'.
345
345
 
346
- 'Avoid' - avoid creating this tag if possible. This is only
347
- effective if another tag exists with the same name. Setting
348
- this flag also sets the default Priority to 0 for this tag.
346
+ 'Avoid' - avoid creating this tag when writing if possible.
347
+ This is only effective if another tag exists with the same
348
+ name. Setting this flag also sets the default Priority to 0
349
+ for this tag.
349
350
 
350
351
  'Binary' - set to 1 for binary data. This has the same effect
351
352
  as setting ValueConv to '\$val', but it it a bit cleaner and
@@ -615,9 +616,9 @@ numerical, and generated automatically otherwise.
615
616
  arguments: the value, a flag which is set for the inverse
616
617
  conversion, and a reference to the PrintConv hash, and returns
617
618
  the converted value or undef on error -- it may call warn() to
618
- return an error message. The lookup hash may also contain a
619
+ return an error message. The lookup hash may also contain a
619
620
  'Notes' entry which is used for documentation if the
620
- SeparateTable flag is set). In an expression, $self is a
621
+ SeparateTable flag is set). In an expression, $self is a
621
622
  reference to the current ExifTool object, $val is the Raw
622
623
  value, and $tag is the tag key. The subroutine takes 2
623
624
  arguments: the Raw value and a reference to the current
@@ -893,6 +894,11 @@ numerical, and generated automatically otherwise.
893
894
  writing this tag. Only needed if tag can be written to
894
895
  groups other than the normal groups for this tag (very rare).
895
896
 
897
+ Deletable : [Writable SubDirectory's only] Overrides internal test for
898
+ metadata types with permanent directories (currently QuickTime
899
+ and Jpeg2000), allowing the tag containing these directories
900
+ to be deleted
901
+
896
902
  OffsetPair : Used in EXIF table to specify the tagID for the corresponding
897
903
  offset or length tag.
898
904
 
@@ -917,6 +923,9 @@ numerical, and generated automatically otherwise.
917
923
  FixedSize : [EXIF only] Hack to ignore value size and use this instead.
918
924
  Only valid if Format is also defined.
919
925
 
926
+ TruncateOK : [EXIF only] Hack to demote a truncated value in an IFD to a
927
+ minor error.
928
+
920
929
  Struct : [XMP tags only] Reference to structure hash for structured XMP
921
930
  tags. See "STRUCTURES" section below for more details. (For
922
931
  backward compatibility, this may be a name to an entry in
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.65';
33
+ $VERSION = '1.67';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -500,6 +500,11 @@ my %code2charset = (
500
500
  Name => 'OldXMP',
501
501
  Binary => 1,
502
502
  },
503
+ C2PA => { #https://c2pa.org/specifications/
504
+ Name => 'JUMBF',
505
+ Deletable => 1,
506
+ SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
507
+ },
503
508
  olym => {
504
509
  Name => 'Olym',
505
510
  SubDirectory => { TagTable => 'Image::ExifTool::Olympus::WAV' },
@@ -555,7 +560,7 @@ my %code2charset = (
555
560
  },
556
561
  },{ # (WebP) - have also seen with "Exif\0\0" header - PH
557
562
  Name => 'EXIF',
558
- Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/ and $self->Warn("Improper EXIF header",1)',
563
+ Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/ and ($self->Warn("Improper EXIF header",1) or 1)',
559
564
  SubDirectory => {
560
565
  TagTable => 'Image::ExifTool::Exif::Main',
561
566
  ProcessProc => \&Image::ExifTool::ProcessTIFF,
@@ -570,6 +575,12 @@ my %code2charset = (
570
575
  Notes => 'WebP files',
571
576
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
572
577
  },
578
+ "XMP\0" => {
579
+ Name => 'XMP',
580
+ Notes => 'incorrectly written WebP files',
581
+ Condition => '$self->Warn("Incorrect XMP tag ID", 1) or 1',
582
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
583
+ },
573
584
  ICCP => { #14 (WebP)
574
585
  Name => 'ICC_Profile',
575
586
  Notes => 'WebP files',
@@ -1063,7 +1074,16 @@ my %code2charset = (
1063
1074
  },
1064
1075
  1 => {
1065
1076
  Name => 'MaxDataRate',
1066
- PrintConv => 'sprintf("%.4g kB/s",$val / 1024)',
1077
+ Notes => q{
1078
+ converted using SI byte prefixes unles the API ByteUnit option is set to
1079
+ "Binary"
1080
+ },
1081
+ PrintConv => q{
1082
+ my ($unit, $div) = $self->Options('ByteUnit') eq 'Binary' ? ('KiB/s',1024) : ('kB/s',1000);
1083
+ my $tmp = $val / $div;
1084
+ $tmp > 9999 and $tmp /= $div, $unit =~ s/^./M/;
1085
+ sprintf('%.4g %s', $tmp, $unit);
1086
+ },
1067
1087
  },
1068
1088
  # 2 => 'PaddingGranularity',
1069
1089
  # 3 => 'Flags',
@@ -1983,7 +2003,7 @@ sub ProcessRIFF($$)
1983
2003
  {
1984
2004
  my ($et, $dirInfo) = @_;
1985
2005
  my $raf = $$dirInfo{RAF};
1986
- my ($buff, $buf2, $type, $mime, $err, $rf64);
2006
+ my ($buff, $buf2, $type, $mime, $err, $rf64, $moviEnd);
1987
2007
  my $verbose = $et->Options('Verbose');
1988
2008
  my $unknown = $et->Options('Unknown');
1989
2009
  my $validate = $et->Options('Validate');
@@ -2017,8 +2037,34 @@ sub ProcessRIFF($$)
2017
2037
  # Read chunks in RIFF image
2018
2038
  #
2019
2039
  for (;;) {
2040
+ if ($err) {
2041
+ last unless $moviEnd;
2042
+ # we arrived here because there was a problem parsing the movie data
2043
+ # so seek to the end to continue processing
2044
+ if ($moviEnd > 0x7fffffff and not $et->Options('LargeFileSupport')) {
2045
+ $et->Warn('Possibly corrupt LIST_movi data');
2046
+ $et->Warn('Stopped parsing at large LIST_movi chunk (LargeFileSupport not set)');
2047
+ undef $err;
2048
+ last;
2049
+ }
2050
+ if ($validate) {
2051
+ # (must actually try to read something after seeking to detect error)
2052
+ $raf->Seek($moviEnd-1, 0) and $raf->Read($buff, 1) == 1 or last;
2053
+ } else {
2054
+ $raf->Seek($moviEnd, 0) or last;
2055
+ }
2056
+ $pos = $moviEnd;
2057
+ $et->Warn('Possibly corrupt LIST_movi data');
2058
+ undef $err;
2059
+ undef $moviEnd;
2060
+ }
2061
+ if ($moviEnd) {
2062
+ $pos > $moviEnd and $err = 1, next; # error if we parsed past the end of the movie data
2063
+ undef $moviEnd if $pos == $moviEnd; # parsed all movie data?
2064
+ }
2020
2065
  my $num = $raf->Read($buff, 8);
2021
2066
  if ($num < 8) {
2067
+ $moviEnd and $err = 1, next;
2022
2068
  $err = 1 if $num;
2023
2069
  $et->Warn('Incorrect RIFF chunk size' . " $pos vs. $riffEnd") if $validate and $pos != $riffEnd;
2024
2070
  last;
@@ -2029,7 +2075,7 @@ sub ProcessRIFF($$)
2029
2075
  $et->OverrideFileType('Extended WEBP',undef,'webp') if $tag eq 'VP8X' and $type eq 'WEBP';
2030
2076
  # special case: construct new tag name from specific LIST type
2031
2077
  if ($tag eq 'LIST') {
2032
- $raf->Read($buff, 4) == 4 or $err=1, last;
2078
+ $raf->Read($buff, 4) == 4 or $err=1, next;
2033
2079
  $pos += 4;
2034
2080
  $tag .= "_$buff";
2035
2081
  $len -= 4; # already read 4 bytes (the LIST type)
@@ -2038,6 +2084,7 @@ sub ProcessRIFF($$)
2038
2084
  }
2039
2085
  $et->VPrint(0, "RIFF '${tag}' chunk ($len bytes of data):\n");
2040
2086
  if ($len <= 0) {
2087
+ $moviEnd and $err = 1, next;
2041
2088
  if ($len < 0) {
2042
2089
  $et->Warn('Invalid chunk length');
2043
2090
  } elsif ($tag eq "\0\0\0\0") {
@@ -2068,7 +2115,7 @@ sub ProcessRIFF($$)
2068
2115
  my $tagInfo = $$tagTbl{$tag};
2069
2116
  # (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
2070
2117
  if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
2071
- $raf->Read($buff, $len2) == $len2 or $err=1, last;
2118
+ $raf->Read($buff, $len2) == $len2 or $err=1, next;
2072
2119
  if ($hash and $isImageData{$tag}) {
2073
2120
  $hash->add($buff);
2074
2121
  $et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
@@ -2094,7 +2141,7 @@ sub ProcessRIFF($$)
2094
2141
  $et->Warn('Incorrect RIFF chunk size') if $validate and $pos - 8 != $riffEnd;
2095
2142
  $riffEnd += $len2 + 8;
2096
2143
  # don't read into RIFF chunk (eg. concatenated video file)
2097
- $raf->Read($buff, 4) == 4 or $err=1, last; # (skip RIFF type word)
2144
+ $raf->Read($buff, 4) == 4 or $err=1, next; # (skip RIFF type word)
2098
2145
  $pos += 4;
2099
2146
  # extract information from remaining file as an embedded file
2100
2147
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
@@ -2107,18 +2154,21 @@ sub ProcessRIFF($$)
2107
2154
  $et->ImageDataHash($raf, $len2, "'${tag}' chunk");
2108
2155
  }
2109
2156
  if ($tag eq 'LIST_movi' and $ee) {
2110
- $raf->Seek($rewind, 0) or $err = 1, last if $rewind;
2157
+ $raf->Seek($rewind, 0) or $err = 1, next if $rewind;
2158
+ # save end-of-movie offset so we can seek there if we get errors parsing the movie data
2159
+ $moviEnd = $raf->Tell() + $len2;
2111
2160
  next; # parse into movi chunk
2112
2161
  } elsif (not $rewind) {
2113
2162
  if ($len > 0x7fffffff and not $et->Options('LargeFileSupport')) {
2163
+ $tag =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
2114
2164
  $et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)");
2115
2165
  last;
2116
2166
  }
2117
2167
  if ($validate and $len2) {
2118
2168
  # (must actually try to read something after seeking to detect error)
2119
- $raf->Seek($len2-1, 1) and $raf->Read($buff, 1) == 1 or $err = 1, last;
2169
+ $raf->Seek($len2-1, 1) and $raf->Read($buff, 1) == 1 or $err = 1, next;
2120
2170
  } else {
2121
- $raf->Seek($len2, 1) or $err=1, last;
2171
+ $raf->Seek($len2, 1) or $err=1, next;
2122
2172
  }
2123
2173
  }
2124
2174
  }