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.
@@ -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.09';
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
- # the following ref forum12825
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 => 'GPSSpeed', # (unit='m/s')
439
- 4 => 'GPSSpeed3D', # (unit='m/s')
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.36';
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.16';
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.08';
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 => \$buff,
364
- DirLen => length $buff,
365
- DataLen => length $buff,
366
- XMPParseOpts => {
367
- FoundProc => \&FoundTag,
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.59';
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+)*%%EOF/s or return -4;
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.68';
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
- return 1 if $outBuff and not $$subTable{WRITE_PROC};
984
- my $dirName = $$subdir{DirName} || $tagName;
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.10';
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.70';
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 => 'DisplayInfo' }, #7
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.04';
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 78 different formats of timed GPS metadata from video files.
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.68';
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) == $len2 or $err=1, next;
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");