exiftool-vendored.pl 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.
- package/bin/Changes +79 -10
- package/bin/MANIFEST +5 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +7 -7
- package/bin/exiftool +32 -27
- package/bin/lib/Image/ExifTool/CBOR.pm +18 -2
- package/bin/lib/Image/ExifTool/Canon.pm +87 -16
- package/bin/lib/Image/ExifTool/DJI.pm +3 -2
- package/bin/lib/Image/ExifTool/DNG.pm +25 -2
- package/bin/lib/Image/ExifTool/EXE.pm +54 -6
- package/bin/lib/Image/ExifTool/Exif.pm +175 -14
- package/bin/lib/Image/ExifTool/FujiFilm.pm +158 -20
- package/bin/lib/Image/ExifTool/GIF.pm +5 -1
- package/bin/lib/Image/ExifTool/Geotag.pm +16 -11
- package/bin/lib/Image/ExifTool/ID3.pm +70 -7
- package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- package/bin/lib/Image/ExifTool/JPEG.pm +1 -1
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
- package/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- package/bin/lib/Image/ExifTool/Nikon.pm +82 -22
- package/bin/lib/Image/ExifTool/Olympus.pm +7 -1
- package/bin/lib/Image/ExifTool/PNG.pm +3 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +22 -9
- package/bin/lib/Image/ExifTool/Pentax.pm +6 -1
- package/bin/lib/Image/ExifTool/PhotoMechanic.pm +2 -1
- package/bin/lib/Image/ExifTool/QuickTime.pm +92 -55
- package/bin/lib/Image/ExifTool/README +14 -5
- package/bin/lib/Image/ExifTool/RIFF.pm +60 -10
- package/bin/lib/Image/ExifTool/Sony.pm +152 -46
- package/bin/lib/Image/ExifTool/TagLookup.pm +6955 -6713
- package/bin/lib/Image/ExifTool/TagNames.pod +878 -334
- package/bin/lib/Image/ExifTool/Text.pm +4 -5
- package/bin/lib/Image/ExifTool/Validate.pm +23 -20
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
- package/bin/lib/Image/ExifTool/WriteExif.pl +14 -4
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +3 -0
- package/bin/lib/Image/ExifTool/WriteRIFF.pl +31 -6
- package/bin/lib/Image/ExifTool/Writer.pl +40 -14
- package/bin/lib/Image/ExifTool/XISF.pm +185 -0
- package/bin/lib/Image/ExifTool/XMP.pm +67 -2
- package/bin/lib/Image/ExifTool/XMP2.pl +35 -0
- package/bin/lib/Image/ExifTool.pm +92 -45
- package/bin/lib/Image/ExifTool.pod +14 -8
- package/bin/perl-Image-ExifTool.spec +6 -6
- package/bin/pp_build_exe.args +5 -4
- package/package.json +2 -2
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
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
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
|
|
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
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
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
|
|
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
|
|
9551
|
+
$et->Warn("Skipping '${t}' atom > 128 MiB", 1);
|
|
9515
9552
|
} else {
|
|
9516
|
-
$et->Warn("Skipping '${t}' atom > 32
|
|
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.
|
|
347
|
-
effective if another tag exists with the same
|
|
348
|
-
this flag also sets the default Priority to 0
|
|
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.
|
|
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).
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
2171
|
+
$raf->Seek($len2, 1) or $err=1, next;
|
|
2122
2172
|
}
|
|
2123
2173
|
}
|
|
2124
2174
|
}
|