exiftool_vendored 13.02.0 → 13.04.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 +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");
|