exiftool_vendored 13.02.0 → 13.04.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +40 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +76 -43
- data/bin/lib/Image/ExifTool/Apple.pm +2 -2
- data/bin/lib/Image/ExifTool/Canon.pm +7 -1
- data/bin/lib/Image/ExifTool/Exif.pm +15 -4
- data/bin/lib/Image/ExifTool/GIF.pm +143 -92
- data/bin/lib/Image/ExifTool/GPS.pm +33 -29
- data/bin/lib/Image/ExifTool/Geotag.pm +43 -9
- data/bin/lib/Image/ExifTool/GoPro.pm +118 -6
- data/bin/lib/Image/ExifTool/JPEG.pm +9 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +10 -2
- data/bin/lib/Image/ExifTool/OOXML.pm +7 -7
- data/bin/lib/Image/ExifTool/PDF.pm +29 -2
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +11 -2
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +6 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5598 -5583
- data/bin/lib/Image/ExifTool/TagNames.pod +64 -6
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +13 -4
- data/bin/lib/Image/ExifTool/Writer.pl +16 -11
- data/bin/lib/Image/ExifTool/XMP.pm +7 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +64 -0
- data/bin/lib/Image/ExifTool.pm +101 -72
- data/bin/lib/Image/ExifTool.pod +16 -3
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::QuickTime;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.10';
|
20
20
|
|
21
21
|
sub ProcessGoPro($$$);
|
22
22
|
sub ProcessString($$$);
|
@@ -72,6 +72,7 @@ my %addUnits = (
|
|
72
72
|
let me know if you discover the meaning of any of these unknown tags. See
|
73
73
|
L<https://github.com/gopro/gpmf-parser> for details about this format.
|
74
74
|
},
|
75
|
+
# ABSC (GPMF) - seen: 0 (fmt f)
|
75
76
|
ACCL => { #2 (gpmd)
|
76
77
|
Name => 'Accelerometer',
|
77
78
|
Notes => 'accelerator readings in m/s2',
|
@@ -81,7 +82,9 @@ my %addUnits = (
|
|
81
82
|
# ANGY (GPMF-GEOC) - seen 179.9 (fmt d, Max)
|
82
83
|
# ANGZ (GPMF-GEOC) - seen 0.152 (fmt d, Max)
|
83
84
|
ALLD => 'AutoLowLightDuration', #1 (gpmd) (untested)
|
84
|
-
# APTO (GPMF) - seen: 'RAW', 'DYNM' (fmt c)
|
85
|
+
# APTO (GPMF) - seen: 'OFF', 'RAW', 'DYNM' (fmt c)
|
86
|
+
# ARUW (GPMF) - seen: 1.14285719394684 (fmt f)
|
87
|
+
# ARWA (GPMF) - seen: 1.14285719394684 (fmt f)
|
85
88
|
ATTD => { #PH (Karma)
|
86
89
|
Name => 'Attitude',
|
87
90
|
# UNIT=s,rad,rad,rad,rad/s,rad/s,rad/s,
|
@@ -96,8 +99,10 @@ my %addUnits = (
|
|
96
99
|
# SCAL=1000 1 1 1 1
|
97
100
|
Binary => 1,
|
98
101
|
},
|
102
|
+
# AUBT (GPMF) - seen: ''N' (type c)
|
99
103
|
AUDO => 'AudioSetting', #PH (GPMF - seen: 'WIND', fmt c)
|
100
104
|
# AUPT (GPMF) - seen: 'N','Y' (fmt c)
|
105
|
+
# BITR (GPMF) - seen: 'STANDARD' (fmt c)
|
101
106
|
BPOS => { #PH (Karma)
|
102
107
|
Name => 'Controller',
|
103
108
|
Unknown => 1,
|
@@ -111,9 +116,16 @@ my %addUnits = (
|
|
111
116
|
# CALH (GPMF-GEOC) - seen 3040 (fmt L, Max)
|
112
117
|
# CALW (GPMF-GEOC) - seen 4056 (fmt L, Max)
|
113
118
|
CASN => 'CameraSerialNumber', #PH (GPMF - seen: 'C3221324545448', fmt c)
|
119
|
+
# CDAT (GPMF) - seen: 1732152823 (fmt J)
|
120
|
+
# CDTM (GPMF) - seen: 0 (fmt L)
|
114
121
|
# CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618, 0xe230988539b30cf5f016627ae8fc5395,
|
115
122
|
# 0x8bcbe424acc5b37d7d77001635198b3b (fmt B) (Camera INFormation?)
|
123
|
+
# CLDP (GPMF) - seen: 'Y' (fmt c)
|
124
|
+
# CLKC (GPMF) - seen: 0 (fmt L)
|
125
|
+
# CLKS (GPMF) - seen: 2 (fmt B)
|
116
126
|
# CMOD (GPMF) - seen: 12,13,17 [12 360 video, 13 time-laps video, 17 JPEG] (fmt B)
|
127
|
+
# CPID (GPMF) - seen: '1194885996 3387225026 733916448 2433577768' (fmt L)
|
128
|
+
# CPIN (GPMF) - seen: 1
|
117
129
|
# CRTX (GPMF-BACK/FRNT) - double[1]
|
118
130
|
# CRTY (GPMF-BACK/FRNT) - double[1]
|
119
131
|
CSEN => { #PH (Karma)
|
@@ -123,6 +135,7 @@ my %addUnits = (
|
|
123
135
|
# SCAL=1000 1 1 1 1 1 1 1 1 1 1
|
124
136
|
Binary => 1,
|
125
137
|
},
|
138
|
+
# CTRL (GPMF) - seen: 'Pro' (fmt c)
|
126
139
|
CYTS => { #PH (Karma)
|
127
140
|
Name => 'CoyoteStatus',
|
128
141
|
# UNIT=s,,,,,rad,rad,rad,,
|
@@ -141,6 +154,8 @@ my %addUnits = (
|
|
141
154
|
# (Max) DVID='FRNT',DVNM='Front Lens',KLNS,CTRX,CTRY,MFOV,SFTR
|
142
155
|
# (Max) DVID='HLMT',DVNM='Highlights'
|
143
156
|
},
|
157
|
+
# DNSC (GPMF) - seen: 'HIGH' (fmt c)
|
158
|
+
# DUST (GPMF) - seen: 'NO_LIMIT' (fmt c)
|
144
159
|
# DVID (GPMF) - DeviceID; seen: 1 (fmt L), HLMT (fmt F), GEOC (fmt F), 'BACK' (fmt F, Max)
|
145
160
|
DVID => { Name => 'DeviceID', Unknown => 1 }, #2 (gpmd)
|
146
161
|
# DVNM (GPMF) seen: 'Video Global Settings' (fmt c), 'Highlights' (fmt c), 'Geometry Calibrations' (Max)
|
@@ -150,6 +165,7 @@ my %addUnits = (
|
|
150
165
|
Name => 'DigitalZoom',
|
151
166
|
PrintConv => { N => 'No', Y => 'Yes' },
|
152
167
|
},
|
168
|
+
# DZMX (GPMF) - seen: 1.39999997615814 (fmt f)
|
153
169
|
# DZST (GPMF) - seen: 0 (fmt L) (something to do with digital zoom maybe?)
|
154
170
|
EISA => { #PH (GPMF) - seen: 'Y','N','HS EIS','N/A' (fmt c) [N was for a time-lapse video]
|
155
171
|
Name => 'ElectronicImageStabilization',
|
@@ -188,10 +204,20 @@ my %addUnits = (
|
|
188
204
|
},
|
189
205
|
GPS5 => { #2 (gpmd)
|
190
206
|
Name => 'GPSInfo',
|
207
|
+
# UNIT=deg,deg,m,m/s,m/s
|
208
|
+
# TYPE=l
|
191
209
|
# SCAL=10000000,10000000,1000,1000,100
|
192
210
|
RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
|
193
211
|
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS5' },
|
194
212
|
},
|
213
|
+
GPS9 => { #PH (gpmd, Hero 13)
|
214
|
+
Name => 'GPSInfo9',
|
215
|
+
# UNIT=deg,deg,m,m/s,m/s,,s,,
|
216
|
+
# TYPE=lllllllSS
|
217
|
+
# SCAL=10000000 10000000 1000 1000 100 1 1000 100 1
|
218
|
+
RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
|
219
|
+
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS9' },
|
220
|
+
},
|
195
221
|
GPSF => { #2 (gpmd)
|
196
222
|
Name => 'GPSMeasureMode',
|
197
223
|
PrintConv => {
|
@@ -216,7 +242,10 @@ my %addUnits = (
|
|
216
242
|
Notes => 'gyroscope readings in rad/s',
|
217
243
|
Binary => 1,
|
218
244
|
},
|
245
|
+
# HCTL (GPMF) - seen: "Off" (fmt c)
|
246
|
+
# HDRV (GPMF) - seen: "N" (fmt c)
|
219
247
|
# HFLG (APP6) - seen: 0
|
248
|
+
# HSGT (GPMF) - seen: 'OFF' (fmt c)
|
220
249
|
ISOE => 'ISOSpeeds', #PH (gpmd)
|
221
250
|
ISOG => { #2 (gpmd)
|
222
251
|
Name => 'ImageSensorGain',
|
@@ -232,6 +261,7 @@ my %addUnits = (
|
|
232
261
|
},
|
233
262
|
# KLNS (GPMF-BACK/FRNT) - double[5] (fmt d, Max)
|
234
263
|
# LINF (GPMF) - seen: LAJ7061916601668,C3341326002180,C33632245450981 (fmt c) (Lens INFormation?)
|
264
|
+
# LMOD (GPMF) - seen: 'NONE' (fmt F)
|
235
265
|
LNED => { #PH (Karma)
|
236
266
|
Name => 'LocalPositionNED',
|
237
267
|
# UNIT=s,m,m,m,m/s,m/s,m/s
|
@@ -240,14 +270,20 @@ my %addUnits = (
|
|
240
270
|
Binary => 1,
|
241
271
|
},
|
242
272
|
MAGN => 'Magnetometer', #1 (gpmd) (units of uT)
|
273
|
+
# MAPX (GPMF) - seen: 1 (fmt f)
|
274
|
+
# MAPY (GPMF) - seen: 1 (fmt f)
|
243
275
|
# MFOV (GPMF-BACK/FRNT) - seen: 100 (fmt d, Max)
|
244
276
|
MINF => { #PH (GPMF - seen: HERO6 Black, fmt c)
|
245
277
|
Name => 'Model',
|
246
278
|
Groups => { 2 => 'Camera' },
|
247
279
|
Description => 'Camera Model Name',
|
248
280
|
},
|
281
|
+
# MMOD (GPMF) - seen: 'STEREO' (fmt c)
|
249
282
|
# MTYP (GPMF) - seen: 0,1,5,11 [1 for time-lapse video, 5 for 360 video, 11 for JPEG] (fmt B)
|
250
283
|
# MUID (GPMF) - seen: 3882563431 2278071152 967805802 411471936 0 0 0 0 (fmt L)
|
284
|
+
# MXCF (GPMF) - seen: 'x1' (fmt c)
|
285
|
+
# MYCF (GPMF) - seen: 'y1' (fmt c)
|
286
|
+
# ORDP (GPMF) - seen: 'Y' (fmt c)
|
251
287
|
OREN => { #PH (GPMF - seen: 'U', fmt c)
|
252
288
|
Name => 'AutoRotation',
|
253
289
|
PrintConv => {
|
@@ -258,11 +294,16 @@ my %addUnits = (
|
|
258
294
|
},
|
259
295
|
# (most of the "P" tags are ProTune settings - PH)
|
260
296
|
PHDR => 'HDRSetting', #PH (APP6 - seen: 0)
|
297
|
+
# PIMD (GPMF) - seen: 'AUTO' (fmt c)
|
261
298
|
PIMN => 'AutoISOMin', #PH (GPMF - seen: 100, fmt L)
|
262
299
|
PIMX => 'AutoISOMax', #PH (GPMF - seen: 1600, fmt L)
|
300
|
+
# POLY (GPMF) - seen: '0 2.11120247840881 0.14325800538063 -1.030...' (fmt f)
|
263
301
|
# PRAW (APP6) - seen: 0, 'N', 'Y' (fmt c)
|
302
|
+
# PRCN (GPMF) - seen: 65 zeros (fmt B)
|
264
303
|
PRES => 'PhotoResolution', #PH (APP6 - seen: '12MP_W')
|
265
304
|
# PRJT (APP6) - seen: 'GPRO','EACO' (fmt F, Hero8, Max)
|
305
|
+
# PRNA (GPMF) - seen 10 (fmt B)
|
306
|
+
# PRNU (GPMF) - seen 0 (fmt B)
|
266
307
|
PRTN => { #PH (GPMF - seen: 'N', fmt c)
|
267
308
|
Name => 'ProTune',
|
268
309
|
PrintConv => {
|
@@ -275,6 +316,9 @@ my %addUnits = (
|
|
275
316
|
PTSH => 'Sharpness', #PH (GPMF - seen: 'HIGH', fmt c)
|
276
317
|
PTWB => 'WhiteBalance', #PH (GPMF - seen: 'AUTO', fmt c)
|
277
318
|
# PVUL (APP6) - seen: 'F' (fmt c, Hero8, Max)
|
319
|
+
# PWPR (GPMF) - seen: 'PERFORMANCE' (fmt c)
|
320
|
+
# PYCF (GPMF) - seen: '[r0,r1,r2,r3,r4,r5,r6]' (fmt c)
|
321
|
+
# RAMP (GPMF) - seen: empty string (fmt c)
|
278
322
|
RATE => 'Rate', #PH (GPMF - seen: '0_5SEC', fmt c; APP6 - seen: '4_1SEC')
|
279
323
|
RMRK => { #2 (gpmd)
|
280
324
|
Name => 'Comments',
|
@@ -284,6 +328,7 @@ my %addUnits = (
|
|
284
328
|
Name => 'ScaleFactor',
|
285
329
|
Unknown => 1,
|
286
330
|
},
|
331
|
+
# SCAP (GPMF) - seen: 'N' (fmt c)
|
287
332
|
SCPR => { #PH (Karma) [stream was empty]
|
288
333
|
Name => 'ScaledPressure',
|
289
334
|
# UNIT=s,Pa,Pa,degC
|
@@ -291,6 +336,7 @@ my %addUnits = (
|
|
291
336
|
# SCAL=1000 0.00999999977648258 0.00999999977648258 100
|
292
337
|
%addUnits,
|
293
338
|
},
|
339
|
+
# SCTM (GPMF) - seen 0 (fmt L)
|
294
340
|
# SFTR (GPMF-BACK/FRNT) - seen 0.999,1.00004 (fmt d, Max)
|
295
341
|
# SHFX (GPMF-GEOC) - seen 22.92 (fmt d, Max)
|
296
342
|
# SHFY (GPMF-GEOC) - seen 0.123 (fmt d, Max)
|
@@ -355,6 +401,10 @@ my %addUnits = (
|
|
355
401
|
# TOCK => { Name => 'OutTime', Unknown => 1, ValueConv => '$val/1000' }, #1 (gpmd)
|
356
402
|
TSMP => { Name => 'TotalSamples', Unknown => 1 }, #2 (gpmd)
|
357
403
|
TYPE => { Name => 'StructureType', Unknown => 1 }, #2 (gpmd,GPMF - eg 'LLLllfFff', fmt c)
|
404
|
+
TZON => { # (GPMF) - seen: 60 (fmt s)
|
405
|
+
Name => 'TimeZone',
|
406
|
+
PrintConv => 'Image::ExifTool::TimeZoneString($val)',
|
407
|
+
},
|
358
408
|
UNIT => { #2 (gpmd) alternative units
|
359
409
|
Name => 'Units',
|
360
410
|
Unknown => 1,
|
@@ -373,6 +423,7 @@ my %addUnits = (
|
|
373
423
|
},
|
374
424
|
},
|
375
425
|
# VLTA (GPMF) - seen: 78 ('N') (fmt B -- wrong format?)
|
426
|
+
# VFPS (GPMF) - seen: '24000 1001' (fmt L)
|
376
427
|
VFRH => { #PH (Karma)
|
377
428
|
Name => 'VisualFlightRulesHUD',
|
378
429
|
BinaryData => 1,
|
@@ -380,13 +431,17 @@ my %addUnits = (
|
|
380
431
|
# TYPE=ffffsS
|
381
432
|
},
|
382
433
|
# VLTE (GPMF) - seen: 'Y','N' (fmt c)
|
434
|
+
# VRES (GPMF) - seen: '3840 3660' (fmt L)
|
383
435
|
WBAL => 'ColorTemperatures', #PH (gpmd)
|
384
436
|
WRGB => { #PH (gpmd)
|
385
437
|
Name => 'WhiteBalanceRGB',
|
386
438
|
Binary => 1,
|
387
439
|
},
|
388
440
|
# ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
|
389
|
-
#
|
441
|
+
# ZMPL (GPMF) - seen: 0.652929663658142 (fmt f)
|
442
|
+
#
|
443
|
+
# the following ref forum12825
|
444
|
+
#
|
390
445
|
MUID => {
|
391
446
|
Name => 'MediaUniqueID',
|
392
447
|
PrintConv => q{
|
@@ -418,7 +473,7 @@ my %addUnits = (
|
|
418
473
|
YAVG => 'LumaAverage',
|
419
474
|
);
|
420
475
|
|
421
|
-
# GoPro GPS5 tags (ref 2) (Hero5,Hero6)
|
476
|
+
# GoPro GPS5 tags (ref 2) (Hero5,Hero6,Hero9)
|
422
477
|
%Image::ExifTool::GoPro::GPS5 = (
|
423
478
|
PROCESS_PROC => \&ProcessString,
|
424
479
|
GROUPS => { 1 => 'GoPro', 2 => 'Location' },
|
@@ -435,8 +490,65 @@ my %addUnits = (
|
|
435
490
|
Name => 'GPSAltitude',
|
436
491
|
PrintConv => '"$val m"',
|
437
492
|
},
|
438
|
-
3 =>
|
439
|
-
|
493
|
+
3 => {
|
494
|
+
Name => 'GPSSpeed',
|
495
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
496
|
+
ValueConv => '$val * 3.6',
|
497
|
+
},
|
498
|
+
4 => {
|
499
|
+
Name => 'GPSSpeed3D',
|
500
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
501
|
+
ValueConv => '$val * 3.6',
|
502
|
+
},
|
503
|
+
);
|
504
|
+
|
505
|
+
# GoPro GPS9 tags (Hero13)
|
506
|
+
%Image::ExifTool::GoPro::GPS9 = (
|
507
|
+
PROCESS_PROC => \&ProcessString,
|
508
|
+
GROUPS => { 1 => 'GoPro', 2 => 'Location' },
|
509
|
+
VARS => { HEX_ID => 0, ID_LABEL => 'Index' },
|
510
|
+
0 => { # (unit='deg')
|
511
|
+
Name => 'GPSLatitude',
|
512
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
513
|
+
},
|
514
|
+
1 => { # (unit='deg')
|
515
|
+
Name => 'GPSLongitude',
|
516
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
517
|
+
},
|
518
|
+
2 => { # (unit='m')
|
519
|
+
Name => 'GPSAltitude',
|
520
|
+
PrintConv => '"$val m"',
|
521
|
+
},
|
522
|
+
3 => {
|
523
|
+
Name => 'GPSSpeed',
|
524
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
525
|
+
ValueConv => '$val * 3.6',
|
526
|
+
},
|
527
|
+
4 => {
|
528
|
+
Name => 'GPSSpeed3D',
|
529
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
530
|
+
ValueConv => '$val * 3.6',
|
531
|
+
},
|
532
|
+
5 => { # days since 2000
|
533
|
+
Name => 'GPSDays',
|
534
|
+
RawConv => '$$self{GPSDays} = $val; undef',
|
535
|
+
Hidden => 1,
|
536
|
+
},
|
537
|
+
6 => { # seconds of date/time
|
538
|
+
Name => 'GPSDateTime',
|
539
|
+
Groups => { 2 => 'Time' },
|
540
|
+
# (10957 days from Jan 1 1970 to Jan 1 2000)
|
541
|
+
RawConv => 'ConvertUnixTime(($$self{GPSDays} + 10957) * 24 * 3600 + $val, undef, 3)',
|
542
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
543
|
+
},
|
544
|
+
7 => 'GPSDOP',
|
545
|
+
8 => {
|
546
|
+
Name => 'GPSMeasureMode', #PH (NC)
|
547
|
+
PrintConv => {
|
548
|
+
2 => '2-Dimensional Measurement',
|
549
|
+
3 => '3-Dimensional Measurement',
|
550
|
+
},
|
551
|
+
},
|
440
552
|
);
|
441
553
|
|
442
554
|
# GoPro GPRI tags (ref PH) (Karma)
|
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use vars qw($VERSION);
|
12
12
|
use Image::ExifTool qw(:DataAccess :Utils);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.37';
|
15
15
|
|
16
16
|
sub ProcessOcad($$$);
|
17
17
|
sub ProcessJPEG_HDR($$$);
|
@@ -228,6 +228,10 @@ sub ProcessJPEG_HDR($$$);
|
|
228
228
|
Name => 'InfiRayIsothermal',
|
229
229
|
Condition => '$$self{HasIJPEG}',
|
230
230
|
SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Isothermal' },
|
231
|
+
}, {
|
232
|
+
Name => 'SEAL',
|
233
|
+
Condition => '$$valPt =~ /^SEAL\0/',
|
234
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
231
235
|
}],
|
232
236
|
APP9 => [{
|
233
237
|
Name => 'MediaJukebox',
|
@@ -237,6 +241,10 @@ sub ProcessJPEG_HDR($$$);
|
|
237
241
|
Name => 'InfiRaySensor',
|
238
242
|
Condition => '$$self{HasIJPEG}',
|
239
243
|
SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Sensor' },
|
244
|
+
}, {
|
245
|
+
Name => 'SEAL',
|
246
|
+
Condition => '$$valPt =~ /^SEAL\0/',
|
247
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
240
248
|
}],
|
241
249
|
APP10 => {
|
242
250
|
Name => 'Comment',
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION);
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.17';
|
19
19
|
|
20
20
|
sub HandleStruct($$;$$$$);
|
21
21
|
|
@@ -685,6 +685,14 @@ my %uidInfo = (
|
|
685
685
|
Name => 'Projection',
|
686
686
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Projection' },
|
687
687
|
},
|
688
|
+
#
|
689
|
+
# other
|
690
|
+
#
|
691
|
+
0x5345414c => { # ('SEAL' in hex)
|
692
|
+
Name => 'SEAL',
|
693
|
+
NotEBML => 1, # don't process SubDirectory as EBML elements
|
694
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
695
|
+
},
|
688
696
|
);
|
689
697
|
|
690
698
|
# Spherical video v2 projection tags (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md)
|
@@ -1047,7 +1055,7 @@ sub ProcessMKV($$)
|
|
1047
1055
|
$seekInfoOnly = 1;
|
1048
1056
|
}
|
1049
1057
|
if ($tagInfo) {
|
1050
|
-
if ($$tagInfo{SubDirectory}) {
|
1058
|
+
if ($$tagInfo{SubDirectory} and not $$tagInfo{NotEBML}) {
|
1051
1059
|
# stop processing at first cluster unless we are using -v -U or -ee
|
1052
1060
|
# or there are Tags after this
|
1053
1061
|
if ($$tagInfo{Name} eq 'Cluster' and $processAll < 2) {
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::XMP;
|
15
15
|
use Image::ExifTool::ZIP;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.09';
|
18
18
|
|
19
19
|
# test for recognized OOXML document extensions
|
20
20
|
my %isOOXML = (
|
@@ -360,12 +360,12 @@ sub ProcessDOCX($$)
|
|
360
360
|
}
|
361
361
|
# process XML files (docProps/app.xml, docProps/core.xml, docProps/custom.xml)
|
362
362
|
my %dirInfo = (
|
363
|
-
DataPt
|
364
|
-
DirLen
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
},
|
363
|
+
DataPt => \$buff,
|
364
|
+
DirLen => length $buff,
|
365
|
+
# (skip over XML header if it exists)
|
366
|
+
DirStart => ($buff =~ /<\?xml\s+.*?\?>/g ? pos($buff) : 0),
|
367
|
+
DataLen => length $buff,
|
368
|
+
XMPParseOpts => { FoundProc => \&FoundTag },
|
369
369
|
);
|
370
370
|
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
371
371
|
undef $buff; # (free memory now)
|
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
22
22
|
require Exporter;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.60';
|
25
25
|
|
26
26
|
sub FetchObject($$$$);
|
27
27
|
sub ExtractObject($$;$$);
|
@@ -349,6 +349,7 @@ my %supportedFilter = (
|
|
349
349
|
# tags in PDF ICCBased, Cs1 and CS0 dictionaries
|
350
350
|
%Image::ExifTool::PDF::ICCBased = (
|
351
351
|
_stream => {
|
352
|
+
Name => 'ICC_Profile',
|
352
353
|
SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
|
353
354
|
},
|
354
355
|
);
|
@@ -470,6 +471,7 @@ my %supportedFilter = (
|
|
470
471
|
# tags in PDF AIMetaData dictionary
|
471
472
|
%Image::ExifTool::PDF::AIMetaData = (
|
472
473
|
_stream => {
|
474
|
+
Name => 'AIStream',
|
473
475
|
SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
|
474
476
|
},
|
475
477
|
);
|
@@ -477,6 +479,7 @@ my %supportedFilter = (
|
|
477
479
|
# tags in PDF ImageResources dictionary
|
478
480
|
%Image::ExifTool::PDF::ImageResources = (
|
479
481
|
_stream => {
|
482
|
+
Name => 'PhotoshopStream',
|
480
483
|
SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
|
481
484
|
},
|
482
485
|
);
|
@@ -2161,6 +2164,20 @@ sub ProcessDict($$$$;$$)
|
|
2161
2164
|
last;
|
2162
2165
|
}
|
2163
2166
|
# decode stream if necessary
|
2167
|
+
if ($cryptInfo and ($$cryptInfo{_aesv2} or $$cryptInfo{_aesv3} and
|
2168
|
+
$$dict{Length} and $$dict{Length} > 10000) and not $$dict{_decrypted} and
|
2169
|
+
not $$et{PDF_CAPTURE}) # (capturing PDF for writing?)
|
2170
|
+
{
|
2171
|
+
my $type = $$dict{Type} || '';
|
2172
|
+
if ($type ne '/Metadata' or $$dict{Length} > 100000) {
|
2173
|
+
if ($$et{OPTIONS}{IgnoreMinorErrors}) {
|
2174
|
+
$et->WarnOnce("Decrypting large $$tagInfo{Name} (will be slow)");
|
2175
|
+
} else {
|
2176
|
+
$et->WarnOnce("Skipping large AES-encrypted $$tagInfo{Name}", 2);
|
2177
|
+
last;
|
2178
|
+
}
|
2179
|
+
}
|
2180
|
+
}
|
2164
2181
|
DecodeStream($et, $dict) or last;
|
2165
2182
|
if ($verbose > 2) {
|
2166
2183
|
$et->VPrint(2,"$$et{INDENT}$$et{DIR_NAME} stream data\n");
|
@@ -2237,7 +2254,17 @@ sub ReadPDF($$)
|
|
2237
2254
|
$raf->Read($buff, $len) == $len or return -3;
|
2238
2255
|
# find the LAST xref table in the file (may be multiple %%EOF marks,
|
2239
2256
|
# and comments between "startxref" and "%%EOF")
|
2240
|
-
$buff =~ /^.*startxref(\s+)(\d+)(\s+)(%[^\x0d\x0a]*\s+)
|
2257
|
+
$buff =~ /^.*startxref(\s+)(\d+)(\s+)((%[^\x0d\x0a]*\s+)*)%%EOF/s or return -4;
|
2258
|
+
# parse comments to read SEAL information
|
2259
|
+
if ($4) {
|
2260
|
+
my @com = split /[\x0d\x0d]+/, $4;
|
2261
|
+
foreach (@com) {
|
2262
|
+
/^(%+\s*)<seal seal=/ or next;
|
2263
|
+
my $dat = substr $_, length($1);
|
2264
|
+
my $tbl = GetTagTable('Image::ExifTool::XMP::SEAL');
|
2265
|
+
$et->ProcessDirectory({ DataPt => \$dat }, $tbl);
|
2266
|
+
}
|
2267
|
+
}
|
2241
2268
|
my $ws = $1 . $3;
|
2242
2269
|
my $xr = $2;
|
2243
2270
|
push @xrefOffsets, $xr, 'Main';
|
@@ -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.69';
|
40
40
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
@@ -371,6 +371,10 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
|
|
371
371
|
IgnoreProp => { meta => 1 }, # ignore 'meta' container
|
372
372
|
},
|
373
373
|
},
|
374
|
+
seAl => {
|
375
|
+
Name => 'SEAL',
|
376
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
377
|
+
},
|
374
378
|
# mkBF,mkTS,mkBS,mkBT ? - written by Adobe FireWorks
|
375
379
|
);
|
376
380
|
|
@@ -980,8 +984,15 @@ sub FoundPNG($$$$;$$$$)
|
|
980
984
|
my $processProc = $$subdir{ProcessProc};
|
981
985
|
# nothing more to do if writing and subdirectory is not writable
|
982
986
|
my $subTable = GetTagTable($$subdir{TagTable});
|
983
|
-
|
984
|
-
|
987
|
+
if ($outBuff and not $$subTable{WRITE_PROC}) {
|
988
|
+
if ($$et{DEL_GROUP}{$dirName}) {
|
989
|
+
# non-writable directories may be deleted as a group (eg. SEAL)
|
990
|
+
$et->VPrint(0, " Deleting $dirName\n");
|
991
|
+
$$outBuff = '';
|
992
|
+
++$$et{CHANGED};
|
993
|
+
}
|
994
|
+
return 1;
|
995
|
+
}
|
985
996
|
my %subdirInfo = (
|
986
997
|
DataPt => \$val,
|
987
998
|
DirStart => 0,
|
@@ -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.
|
19
|
+
$VERSION = '1.11';
|
20
20
|
|
21
21
|
#------------------------------------------------------------------------------
|
22
22
|
# Read or write information in a PPM/PGM/PBM image
|
@@ -29,7 +29,7 @@ sub ProcessPPM($$)
|
|
29
29
|
my $outfile = $$dirInfo{OutFile};
|
30
30
|
my $verbose = $et->Options('Verbose');
|
31
31
|
my $out = $et->Options('TextOut');
|
32
|
-
my ($buff, $num, $type, %info);
|
32
|
+
my ($buff, $num, $type, %info, $seal);
|
33
33
|
#
|
34
34
|
# read as much of the image as necessary to extract the header and comments
|
35
35
|
#
|
@@ -77,6 +77,7 @@ sub ProcessPPM($$)
|
|
77
77
|
if (defined $info{Comment}) {
|
78
78
|
$info{Comment} =~ s/^# ?//mg; # remove "# " at the start of each line
|
79
79
|
$info{Comment} =~ s/[\n\r]+$//; # remove trailing newline
|
80
|
+
$seal = 1 if $info{Comment} =~ /^<seal seal=/;
|
80
81
|
}
|
81
82
|
$et->SetFileType($type);
|
82
83
|
my $len = pos($buff);
|
@@ -91,6 +92,10 @@ sub ProcessPPM($$)
|
|
91
92
|
++$$et{CHANGED};
|
92
93
|
$et->VerboseValue('- Comment', $oldComment) if defined $oldComment;
|
93
94
|
$et->VerboseValue('+ Comment', $newComment) if defined $newComment;
|
95
|
+
} elsif ($seal and $$et{DEL_GROUP}{SEAL}) {
|
96
|
+
# delete SEAL comment
|
97
|
+
$et->VerboseValue('- Comment', $oldComment);
|
98
|
+
++$$et{CHANGED};
|
94
99
|
} else {
|
95
100
|
$newComment = $oldComment; # use existing comment
|
96
101
|
}
|
@@ -116,6 +121,10 @@ sub ProcessPPM($$)
|
|
116
121
|
print $out "$type header ($len bytes):\n";
|
117
122
|
$et->VerboseDump(\$buff, Len => $len);
|
118
123
|
}
|
124
|
+
if ($seal) {
|
125
|
+
$et->ProcessDirectory({ DataPt => \$info{Comment} }, GetTagTable('Image::ExifTool::XMP::SEAL'));
|
126
|
+
delete $info{Comment};
|
127
|
+
}
|
119
128
|
my $tag;
|
120
129
|
foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) {
|
121
130
|
$et->FoundTag($tag, $info{$tag}) if defined $info{$tag};
|
@@ -28,7 +28,7 @@ use strict;
|
|
28
28
|
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
|
29
29
|
use Image::ExifTool qw(:DataAccess :Utils);
|
30
30
|
|
31
|
-
$VERSION = '1.
|
31
|
+
$VERSION = '1.71';
|
32
32
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
34
34
|
sub WritePhotoshop($$$);
|
@@ -322,7 +322,7 @@ my %unicodeString = (
|
|
322
322
|
0x0432 => { Unknown => 1, Name => 'MeasurementScale' }, #7
|
323
323
|
0x0433 => { Unknown => 1, Name => 'TimelineInfo' }, #7
|
324
324
|
0x0434 => { Unknown => 1, Name => 'SheetDisclosure' }, #7
|
325
|
-
0x0435 => { Unknown => 1, Name => '
|
325
|
+
0x0435 => { Unknown => 1, Name => 'ChannelOptions' }, #7/forum16762
|
326
326
|
0x0436 => { Unknown => 1, Name => 'OnionSkins' }, #7
|
327
327
|
0x0438 => { Unknown => 1, Name => 'CountInfo' }, #7
|
328
328
|
0x043a => { Unknown => 1, Name => 'PrintInfo2' }, #7
|
@@ -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.
|
51
|
+
$VERSION = '3.05';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -902,6 +902,10 @@ my %userDefined = (
|
|
902
902
|
},
|
903
903
|
# '35AX'? - seen "AT" (Yada RoadCam Pro 4K dashcam)
|
904
904
|
cust => 'CustomInfo', # 70mai A810
|
905
|
+
SEAL => {
|
906
|
+
Name => 'SEAL',
|
907
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
908
|
+
},
|
905
909
|
);
|
906
910
|
|
907
911
|
# stuff seen in 'skip' atom (70mai Pro Plus+ MP4 videos)
|
@@ -3097,6 +3101,7 @@ my %userDefined = (
|
|
3097
3101
|
10 => {
|
3098
3102
|
Name => 'VideoFullRangeFlag',
|
3099
3103
|
Mask => 0x80,
|
3104
|
+
PrintConv => { 0 => 'Limited', 1 => 'Full' },
|
3100
3105
|
},
|
3101
3106
|
);
|
3102
3107
|
|
@@ -109,7 +109,7 @@ my %insvLimit = (
|
|
109
109
|
The tags below are extracted from timed metadata in QuickTime and other
|
110
110
|
formats of video files when the ExtractEmbedded option is used. Although
|
111
111
|
most of these tags are combined into the single table below, ExifTool
|
112
|
-
currently reads
|
112
|
+
currently reads 82 different formats of timed GPS metadata from video files.
|
113
113
|
},
|
114
114
|
VARS => { NO_ID => 1 },
|
115
115
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -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.69';
|
34
34
|
|
35
35
|
sub ConvertTimecode($);
|
36
36
|
sub ProcessSGLT($$$);
|
@@ -664,6 +664,10 @@ my %code2charset = (
|
|
664
664
|
SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Acidizer' },
|
665
665
|
},
|
666
666
|
guan => 'Guano', #forum14831
|
667
|
+
SEAL => {
|
668
|
+
Name => 'SEAL',
|
669
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
670
|
+
},
|
667
671
|
);
|
668
672
|
|
669
673
|
# the maker notes used by some digital cameras
|
@@ -2120,7 +2124,8 @@ sub ProcessRIFF($$)
|
|
2120
2124
|
my $tagInfo = $$tagTbl{$tag};
|
2121
2125
|
# (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
|
2122
2126
|
if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
|
2123
|
-
$raf->Read($buff, $len2)
|
2127
|
+
$raf->Read($buff, $len2) >= $len or $err=1, next;
|
2128
|
+
length($buff) == $len2 or $et->Warn("No padding on odd-sized $tag chunk");
|
2124
2129
|
if ($hash and $isImageData{$tag}) {
|
2125
2130
|
$hash->add($buff);
|
2126
2131
|
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
|