exiftool_vendored 13.18.0 → 13.19.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ed6242287b3fc53d1781c76868bb76b2ae54d5a43dcd48a52ff5678ecf6984d
4
- data.tar.gz: 8b0446136fa4d3b248742abc3c961ddd60d1b849ce0e8505af39b65c6662b32f
3
+ metadata.gz: 19b270f0ce5b43c0bc65a0cf0f71fdea7426079ce467cb9e79a42ae9a5909c12
4
+ data.tar.gz: d989e4609455211361660c40fdec7c81ac3809d35030fd08ee0406fcf220be1e
5
5
  SHA512:
6
- metadata.gz: a1863a2767968d76be14ffee77fb966c7d643a501c5dffed80291ccabf73b58775ecf5ffb6a2d54a1fd3cec10e07f7c28a32cb8567f6a6a6948ce4eb06728914
7
- data.tar.gz: a2bde276ca6e28bc212c82751848fdc9a8c27a41b7abd522d27ddc8490be0b2d67f8a537c52f14cbfb4fc4b3424efe6dcc1ed2c67909cbc270fb5521c8a889bc
6
+ metadata.gz: c4f5c17319320481c245bf7009a86055da882a2374fb4e5c4f59b5ac31b82dba1f094e54adc442759fe3758ceeeab2e1d8f75b73efbdff57e1214ef871b8d12e
7
+ data.tar.gz: c657963e15956834d70bde5bf04c64446e1361a5e170eaef59a1d42b54acaeef54428654dd96c2d18ffef7548752fcd757e345d6a130076684f70ec1095eb033
data/bin/Changes CHANGED
@@ -7,6 +7,20 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 13.10. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Feb. 10, 2025 - Version 13.19
11
+
12
+ - Added read/write support for PDF and XMP-pdfx SourceModified
13
+ - Decode GPS from two more DJI protobuf formats (Matrice 30 and Mini 4 Pro)
14
+ - Decode timed GPS from Rexing V1-4k dashcam
15
+ - Decode more information from AAE files
16
+ - Made a new icon for the Windows EXE application
17
+ - Changed family 3 groups for ICO files so the first icon is in the Doc1
18
+ instead of the Main group
19
+ - Improved handling of ICC_Profile in HEIC images:
20
+ - Profiles for sub-images are extracted as sub-documents
21
+ - Allow only the profile of the main image to be written
22
+ - Updated Sony decoding for ILCE-1M2 (thanks Jos Roost)
23
+
10
24
  Feb. 3, 2025 - Version 13.18
11
25
 
12
26
  - Decode a number of new GoPro tags
@@ -72,7 +86,7 @@ Jan. 20, 2025 - Version 13.13
72
86
 
73
87
  - Added ability to write tags to the audio/video tracks of MOV/MP4 videos
74
88
  using the new AudioKeys and VideoKeys group names
75
- - Added support for another DJI protobuf format (Mavic 3)
89
+ - Decode GPS from another DJI protobuf format (Mavic 3)
76
90
  - Decode yet another type of LIGOGPSINFO timed GPS from a dashcam video
77
91
  - Extract some proprietary information from JPEG images of Vivo phones
78
92
  - Enhanced Geolocation feature to allow the nearest cities to a specified city
@@ -410,8 +424,8 @@ July 11, 2024 - Version 12.88 - "New Windows/MacOS packages"
410
424
  - Tweaked API Geolocation option recognized space-separated lat/lon even when
411
425
  there is no decimal point in the numbers
412
426
  - API Changes:
413
- - Changed LargeFileSupport default to 2 and added a warning if a large
414
- chunk is encountered. Set to 1 to avoid the warning.
427
+ - Changed LargeFileSupport default to 1 and added a setting of 2 to warn
428
+ if a large chunk is encountered
415
429
 
416
430
  June 13, 2024 - Version 12.87
417
431
 
data/bin/MANIFEST CHANGED
@@ -40,6 +40,7 @@ fmt_files/gpx.fmt
40
40
  fmt_files/gpx_wpt.fmt
41
41
  fmt_files/kml.fmt
42
42
  fmt_files/kml_track.fmt
43
+ html/ET-256.png
43
44
  html/ExifTool.html
44
45
  html/MIE1.1-20070121.pdf
45
46
  html/Shift.html
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.18"
53
+ "version" : "13.19"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.18'
34
+ version: '13.19'
data/bin/README CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-13.18.tar.gz | tar -xf -
113
- cd Image-ExifTool-13.18
112
+ gzip -dc Image-ExifTool-13.19.tar.gz | tar -xf -
113
+ cd Image-ExifTool-13.19
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.18';
14
+ my $version = '13.19';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -5986,7 +5986,7 @@ with this command:
5986
5986
 
5987
5987
  produces output like this:
5988
5988
 
5989
- -- Generated by ExifTool 13.18 --
5989
+ -- Generated by ExifTool 13.19 --
5990
5990
  File: a.jpg - 2003:10:31 15:44:19
5991
5991
  (f/5.6, 1/60s, ISO 100)
5992
5992
  File: b.jpg - 2006:05:23 11:57:38
@@ -18,7 +18,7 @@ use Image::ExifTool::XMP;
18
18
  use Image::ExifTool::GPS;
19
19
  use Image::ExifTool::Protobuf;
20
20
 
21
- $VERSION = '1.12';
21
+ $VERSION = '1.13';
22
22
 
23
23
  sub ProcessDJIInfo($$$);
24
24
 
@@ -27,6 +27,8 @@ sub ProcessDJIInfo($$$);
27
27
  'dvtm_ac204.proto' => 1, # Osmo Action 5
28
28
  'dvtm_AVATA2.proto' => 1, # Avanta 2
29
29
  'dvtm_wm265e.proto' => 1, # Mavic 3
30
+ 'dvtm_pm320.proto' => 1, # Matrice 30
31
+ 'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
30
32
  );
31
33
 
32
34
  my %convFloat2 = (
@@ -209,8 +211,9 @@ my %convFloat2 = (
209
211
 
210
212
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
211
213
  which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
212
- dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
213
- dvtm_wm265e.proto (Mavic 3).
214
+ dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
215
+ dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
216
+ dvtm_pm320.proto (Mini 4 Pro).
214
217
 
215
218
  Note that with the protobuf format, numerical tags missing from the output
216
219
  for a given protocol should be considered to have the default value of 0.
@@ -326,7 +329,6 @@ my %convFloat2 = (
326
329
  'dvtm_wm265e_3-2-3-1' => {
327
330
  Name => 'ShutterSpeed',
328
331
  Format => 'rational',
329
- ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
330
332
  PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
331
333
  },
332
334
  # dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
@@ -335,14 +337,100 @@ my %convFloat2 = (
335
337
  Name => 'GPSInfo',
336
338
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
337
339
  },
338
- 'dvtm_wm265e_3-3-3-1' => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val/10' },
339
- 'dvtm_wm265e_3-3-3-2' => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val/10' },
340
- 'dvtm_wm265e_3-3-3-3' => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val/10' },
341
- 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', ValueConv => '$val / 1000' },
340
+ 'dvtm_wm265e_3-3-3' => {
341
+ Name => 'DroneInfo',
342
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
343
+ },
344
+ 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
342
345
  'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
343
- 'dvtm_wm265e_3-4-3-1' => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
344
- 'dvtm_wm265e_3-4-3-2' => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
345
- 'dvtm_wm265e_3-4-3-3' => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
346
+ 'dvtm_wm265e_3-4-3' => {
347
+ Name => 'GimbalInfo',
348
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
349
+ },
350
+ #
351
+ # Matrice 30
352
+ #
353
+ 'dvtm_pm320_1-1-5' => 'SerialNumber',
354
+ 'dvtm_pm320_1-1-10' => 'Model',
355
+ 'dvtm_pm320_2-2' => {
356
+ Name => 'FrameInfo',
357
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
358
+ },
359
+ 'dvtm_pm320_3-2-2-1' => { Name => 'ISO', Format => 'float' },
360
+ 'dvtm_pm320_3-2-3-1' => {
361
+ Name => 'ShutterSpeed',
362
+ Format => 'rational',
363
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
364
+ },
365
+ 'dvtm_pm320_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
366
+ 'dvtm_pm320_3-3-4-1' => {
367
+ Name => 'GPSInfo',
368
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
369
+ },
370
+ 'dvtm_pm320_3-3-3' => {
371
+ Name => 'DroneInfo',
372
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
373
+ },
374
+ 'dvtm_pm320_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
375
+ 'dvtm_pm320_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
376
+ 'dvtm_pm320_3-4-3' => {
377
+ Name => 'GimbalInfo',
378
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
379
+ },
380
+ #
381
+ # Mini 4 Pro
382
+ #
383
+ 'dvtm_Mini4_Pro_1-1-5' => 'SerialNumber',
384
+ 'dvtm_Mini4_Pro_1-1-10' => 'Model',
385
+ 'dvtm_Mini4_Pro_2-3' => {
386
+ Name => 'FrameInfo',
387
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
388
+ },
389
+ 'dvtm_Mini4_Pro_3-2-7-1' => { Name => 'ISO', Format => 'float' },
390
+ 'dvtm_Mini4_Pro_3-2-10-1' => {
391
+ Name => 'ShutterSpeed',
392
+ Format => 'rational',
393
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
394
+ },
395
+ 'dvtm_Mini4_Pro_3-2-11-1' => {
396
+ Name => 'FNumber',
397
+ Format => 'rational',
398
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
399
+ },
400
+ 'dvtm_Mini4_Pro_3-2-32-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
401
+ # dvtm_Mini4_Pro_3-2-37-1 - something to do with battery level or time remaining?
402
+ 'dvtm_Mini4_Pro_3-3-4-1' => {
403
+ Name => 'GPSInfo',
404
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
405
+ },
406
+ 'dvtm_Mini4_Pro_3-3-3' => {
407
+ Name => 'DroneInfo',
408
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
409
+ },
410
+ 'dvtm_Mini4_Pro_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
411
+ 'dvtm_Mini4_Pro_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
412
+ 'dvtm_Mini4_Pro_3-4-3' => {
413
+ Name => 'GimbalInfo',
414
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
415
+ },
416
+ );
417
+
418
+ %Image::ExifTool::DJI::DroneInfo = (
419
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
420
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
421
+ VARS => { HEX_ID => 0 },
422
+ 1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
423
+ 2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
424
+ 3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
425
+ );
426
+
427
+ %Image::ExifTool::DJI::GimbalInfo = (
428
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
429
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
430
+ VARS => { HEX_ID => 0 },
431
+ 1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
432
+ 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
433
+ 3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
346
434
  );
347
435
 
348
436
  %Image::ExifTool::DJI::FrameInfo = (
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.00';
17
+ $VERSION = '1.01';
18
18
 
19
19
  %Image::ExifTool::ICO::Main = (
20
20
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -95,7 +95,7 @@ sub ProcessICO($$$)
95
95
  $et->HandleTag($tagTbl, 4, $num);
96
96
  for ($i=0; $i<$num; ++$i) {
97
97
  $raf->Read($buff, 16) == 16 or $et->Warn('Truncated file'), last;
98
- $$et{DOC_NUM} = ++$$et{DOC_COUNT} if $i;
98
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
99
99
  $et->HandleTag($tagTbl, 6, $buff);
100
100
  }
101
101
  delete $$et{DOC_NUM};
@@ -25,7 +25,7 @@ use vars qw($VERSION);
25
25
  use Image::ExifTool qw(:DataAccess :Utils);
26
26
  use Image::ExifTool::Exif;
27
27
 
28
- $VERSION = '1.47';
28
+ $VERSION = '1.48';
29
29
 
30
30
  sub ProcessKodakIFD($$$);
31
31
  sub ProcessKodakText($$$);
@@ -2983,7 +2983,8 @@ my %sceneModeUsed = (
2983
2983
  Priority => 0, # (only integer seconds)
2984
2984
  PrintConv => 'ConvertDuration($val)',
2985
2985
  },
2986
- 'ver '=> { Name => 'KodakVersion' },
2986
+ # (save KodakVersion to recognize Rexing Dashcam video for GPS scaling)
2987
+ 'ver '=> { Name => 'KodakVersion', RawConv => '$$self{KodakVersion} = $val' },
2987
2988
  thma => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' }, Binary => 1 },
2988
2989
  scra => { Name => 'PreviewImage', Groups => { 2 => 'Preview' }, Binary => 1 },
2989
2990
  );
@@ -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.60';
24
+ $VERSION = '1.61';
25
25
 
26
26
  sub FetchObject($$$$);
27
27
  sub ExtractObject($$;$$);
@@ -141,6 +141,15 @@ my %supportedFilter = (
141
141
  PrintConv => '$self->ConvertDateTime($val)',
142
142
  PrintConvInv => '$self->InverseDateTime($val)',
143
143
  },
144
+ SourceModified => {
145
+ Name => 'SourceModified',
146
+ Writable => 'date',
147
+ PDF2 => 1,
148
+ Groups => { 2 => 'Time' },
149
+ Shift => 'Time',
150
+ PrintConv => '$self->ConvertDateTime($val)',
151
+ PrintConvInv => '$self->InverseDateTime($val)',
152
+ },
144
153
  Trapped => {
145
154
  Protected => 1,
146
155
  # remove leading '/' from '/True' or '/False'
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::XMP;
22
22
  use Image::ExifTool::GPS;
23
23
 
24
- $VERSION = '1.13';
24
+ $VERSION = '1.14';
25
25
 
26
26
  sub ExtractObject($$;$);
27
27
  sub Get24u($$);
@@ -46,7 +46,7 @@ my %plistType = (
46
46
  %Image::ExifTool::PLIST::Main = (
47
47
  PROCESS_PROC => \&ProcessPLIST,
48
48
  GROUPS => { 0 => 'PLIST', 1 => 'XML', 2 => 'Document' },
49
- VARS => { LONG_TAGS => 4 },
49
+ VARS => { LONG_TAGS => 12 },
50
50
  NOTES => q{
51
51
  Apple Property List tags. ExifTool reads both XML and binary-format PLIST
52
52
  files, and will extract any existing tags even if they aren't listed below.
@@ -92,6 +92,35 @@ my %plistType = (
92
92
  Name => 'GPSMapDatum',
93
93
  Groups => { 2 => 'Location' },
94
94
  },
95
+ # slow motion stuff found in AAE files
96
+ 'slowMotion/regions/timeRange/start/flags' => {
97
+ Name => 'SlowMotionRegionsStartTimeFlags',
98
+ PrintConv => { BITMASK => {
99
+ 0 => 'Valid',
100
+ 1 => 'Has been rounded',
101
+ 2 => 'Positive infinity',
102
+ 3 => 'Negative infinity',
103
+ 4 => 'Indefinite',
104
+ }},
105
+ },
106
+ 'slowMotion/regions/timeRange/start/value' => 'SlowMotionRegionsStartTimeValue',
107
+ 'slowMotion/regions/timeRange/start/timescale' => 'SlowMotionRegionsStartTimeScale',
108
+ 'slowMotion/regions/timeRange/start/epoch' => 'SlowMotionRegionsStartTimeEpoch',
109
+ 'slowMotion/regions/timeRange/duration/flags' => {
110
+ Name => 'SlowMotionRegionsDurationFlags',
111
+ PrintConv => { BITMASK => {
112
+ 0 => 'Valid',
113
+ 1 => 'Has been rounded',
114
+ 2 => 'Positive infinity',
115
+ 3 => 'Negative infinity',
116
+ 4 => 'Indefinite',
117
+ }},
118
+ },
119
+ 'slowMotion/regions/timeRange/duration/value' => 'SlowMotionRegionsDurationValue',
120
+ 'slowMotion/regions/timeRange/duration/timescale' => 'SlowMotionRegionsDurationTimeScale',
121
+ 'slowMotion/regions/timeRange/duration/epoch' => 'SlowMotionRegionsDurationEpoch',
122
+ 'slowMotion/regions' => 'SlowMotionRegions',
123
+ 'slowMotion/rate' => 'SlowMotionRate',
95
124
  XMLFileType => {
96
125
  # recognize MODD files by their content
97
126
  RawConv => q{
@@ -101,6 +130,10 @@ my %plistType = (
101
130
  return $val;
102
131
  },
103
132
  },
133
+ adjustmentData => { # AAE file
134
+ Name => 'AdjustmentData',
135
+ SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' },
136
+ },
104
137
  );
105
138
 
106
139
  #------------------------------------------------------------------------------
@@ -404,8 +437,13 @@ sub ProcessPLIST($$;$)
404
437
 
405
438
  unless ($result) {
406
439
  my $buff;
407
- my $raf = $$dirInfo{RAF} or return 0;
408
- $raf->Seek(0,0) and $raf->Read($buff, 64) or return 0;
440
+ my $raf = $$dirInfo{RAF};
441
+ if ($raf) {
442
+ $raf->Seek(0,0) and $raf->Read($buff, 64) or return 0;
443
+ } else {
444
+ return 0 unless $$dirInfo{DataPt};
445
+ $buff = ${$$dirInfo{DataPt}};
446
+ }
409
447
  if ($buff =~ /^bplist0/) {
410
448
  # binary PLIST file
411
449
  my $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main');
@@ -174,7 +174,7 @@ sub ProcessProtobuf($$$;$)
174
174
  my $dir = { DataPt => \$buff, Pos => 0 };
175
175
  my $num = VarInt($dir);
176
176
  my $den = VarInt($dir);
177
- $val = (defined $num and $den) ? "$num/$den" : 'err';
177
+ $val = (defined $num and $den) ? $num/$den : 'err';
178
178
  } else {
179
179
  $val = ReadValue(\$buff, 0, $$tagInfo{Format}, undef, length($buff));
180
180
  }
@@ -43,7 +43,7 @@
43
43
  package Image::ExifTool::QuickTime;
44
44
 
45
45
  use strict;
46
- use vars qw($VERSION $AUTOLOAD %stringEncoding %avType);
46
+ use vars qw($VERSION $AUTOLOAD %stringEncoding %avType %dontInherit);
47
47
  use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
@@ -487,9 +487,13 @@ my %qtFlags = ( #12
487
487
  );
488
488
 
489
489
  # properties which don't get inherited from the parent
490
- my %dontInherit = (
491
- ispe => 1, # size of parent may be different
492
- hvcC => 1, # (likely redundant)
490
+ # 1 = parent doesn't inherit this property
491
+ # 2 = parent doesn't inherit, but child does
492
+ %dontInherit = (
493
+ ispe => 1, # primary item must have an ispe and pixi, so no need to inherit these
494
+ pixi => 1,
495
+ hvcC => 2, # (hvcC is a property of hvc1 referred to by primary grid)
496
+ colr => 2, # (colr is a property of primary grid or hvc1 referred to by primary)
493
497
  );
494
498
 
495
499
  # tags that may be duplicated and directories that may contain duplicate tags
@@ -2835,7 +2839,8 @@ my %userDefined = (
2835
2839
  ipma => {
2836
2840
  Name => 'ItemPropertyAssociation',
2837
2841
  RawConv => \&ParseItemPropAssoc,
2838
- WriteHook => \&ParseItemPropAssoc,
2842
+ # (comment out because we do this manually _before_ ipco when writing)
2843
+ # WriteHook => \&ParseItemPropAssoc,
2839
2844
  Notes => 'parsed, but not extracted as a tag',
2840
2845
  },
2841
2846
  );
@@ -9982,17 +9987,19 @@ sub ProcessMOV($$;$)
9982
9987
  my $items = $$et{ItemInfo};
9983
9988
  my ($id, $prop, $docNum, $lowest);
9984
9989
  my $primary = $$et{PrimaryItem} || 0;
9990
+ my $pitem = $$items{$primary} || { };
9991
+ $$pitem{RefersTo} or $$pitem{RefersTo} = { };
9985
9992
  ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
9986
9993
  next unless $$items{$id}{Association};
9987
9994
  my $item = $$items{$id};
9988
9995
  foreach $prop (@{$$item{Association}}) {
9989
9996
  next unless $prop == $index;
9990
- if ($id == $primary or (not $dontInherit{$tag} and
9991
- (($$item{RefersTo} and $$item{RefersTo}{$primary}) or
9992
- # hack: assume Item 1 is from the main image (eg. hvc1 data)
9993
- # to hack the case where the primary item (ie. main image)
9994
- # doesn't directly reference this property
9995
- (not $$item{RefersTo} and $id == 1))))
9997
+ my $dont = $dontInherit{$tag} || 0;
9998
+ if ($id == $primary or (not $dont and
9999
+ ($$item{RefersTo} and $$item{RefersTo}{$primary})) or
10000
+ # special case to assume this property belongs to the primary
10001
+ # image if it belongs to an item referred to by the primary
10002
+ ($dont != 1 and $$pitem{RefersTo}{$id}))
9996
10003
  {
9997
10004
  # this is associated with the primary item or an item describing
9998
10005
  # the primary item, so consider this part of the main document
@@ -111,7 +111,7 @@ my %insvLimit = (
111
111
  The tags below are extracted from timed metadata in QuickTime and other
112
112
  formats of video files when the ExtractEmbedded option is used. Although
113
113
  most of these tags are combined into the single table below, ExifTool
114
- currently reads 100 different types of timed GPS metadata from video files.
114
+ currently reads 103 different types of timed GPS metadata from video files.
115
115
  },
116
116
  VARS => { NO_ID => 1 },
117
117
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -2208,7 +2208,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2208
2208
  unpack('x48V6a1a1a1x1V4', $$dataPt);
2209
2209
  if (substr($$dataPt, 16, 3) eq 'IQS') {
2210
2210
  $debug and $et->FoundTag(GPSType => 16);
2211
- # Type 3b (ref PH)
2211
+ # IQS variant (ref PH)
2212
2212
  # header looks like this in my sample:
2213
2213
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
2214
2214
  # 0010: 49 51 53 5f 41 37 5f 32 30 31 35 30 34 31 37 00 [IQS_A7_20150417.]
@@ -2219,12 +2219,26 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2219
2219
  $spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
2220
2220
  $alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
2221
2221
  } else {
2222
- $debug and $et->FoundTag(GPSType => 17);
2223
2222
  $lat = GetFloat($dataPt, 0x4c);
2224
2223
  $lon = GetFloat($dataPt, 0x50);
2225
2224
  $spd = GetFloat($dataPt, 0x54) * $knotsToKph;
2226
- $trk = GetFloat($dataPt, 0x58);
2227
- # ($trk is not confirmed; may be GPSImageDirection, ref PH)
2225
+ $trk = GetFloat($dataPt, 0x58); # (NC, may be GPSImageDirection)
2226
+ # Rexing V1-4k dashcam scales the lat/lon
2227
+ # (recognize this dashcam by the KodakVersion, "3.01.054" for my sample)
2228
+ # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
2229
+ # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
2230
+ # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
2231
+ # 0030: 0e 00 00 00 22 00 00 00 28 00 00 00 14 00 00 00 [...."...(.......]
2232
+ # 0040: 02 00 00 00 16 00 00 00 41 4e 57 00 e9 7e 90 43 [........ANW..~.C]
2233
+ # 0050: 48 76 17 45 0c 02 48 42 14 6e 85 43 00 00 00 00 [Hv.E..HB.n.C....]
2234
+ if ($$et{KodakVersion} and $$et{KodakVersion} eq '3.01.054') {
2235
+ $debug and $et->FoundTag(GPSType => '17b');
2236
+ $lat = ($lat - 187.982162849635) / 3;
2237
+ $lon = ($lon - 2199.19873715495) / 2;
2238
+ $ddd = 1;
2239
+ } else {
2240
+ $debug and $et->FoundTag(GPSType => 17);
2241
+ }
2228
2242
  }
2229
2243
  if ($dirLen >= 0xb0) {
2230
2244
  # lat/lon also stored as doubles by Transcend Driver Pro 230 (ref PH)
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.71';
37
+ $VERSION = '3.72';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -171,6 +171,7 @@ sub PrintInvLensSpec($;$$);
171
171
  32886 => 'Sony FE 300mm F2.8 GM OSS', #JR
172
172
  32887 => 'Sony E PZ 16-50mm F3.5-5.6 OSS II', #JR
173
173
  32888 => 'Sony FE 85mm F1.4 GM II', #JR
174
+ 32889 => 'Sony FE 28-70mm F2 GM',
174
175
 
175
176
  # (comment this out so LensID will report the LensModel, which is more useful)
176
177
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -1226,6 +1227,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1226
1227
  9 => 'Center (LA-EA4)', # seen for ILCE-7RM2 with LA-EA4
1227
1228
  11 => 'Zone',
1228
1229
  12 => 'Expanded Flexible Spot',
1230
+ 13 => 'Custom AF Area', # NC, new AFArea option for ILCE-9M3, ILCE-1M2
1229
1231
  },
1230
1232
  },{
1231
1233
  Name => 'AFAreaModeSetting',
@@ -1726,7 +1728,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1726
1728
  },
1727
1729
  },{
1728
1730
  Name => 'Tag9050d',
1729
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-(E1|E10M2))\b/',
1731
+ Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-(E1|E10M2))\b/ or ($$self{Model} =~ /^(ILCE-1M2)/ and $$valPt =~ /^\x00/)',
1730
1732
  SubDirectory => {
1731
1733
  TagTable => 'Image::ExifTool::Sony::Tag9050d',
1732
1734
  ByteOrder => 'LittleEndian',
@@ -8208,14 +8210,17 @@ my %isoSetting2010 = (
8208
8210
  WRITE_PROC => \&WriteEnciphered,
8209
8211
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
8210
8212
  FORMAT => 'int8u',
8211
- NOTES => 'Valid for ILCE-6700/7CM2/7CR/ZV-E1.',
8213
+ NOTES => q{
8214
+ Valid for ILCE-6700/7CM2/7CR/ZV-E1. Also for ILCE-1M2 when using mechanical
8215
+ shutter.
8216
+ },
8212
8217
  WRITABLE => 1,
8213
8218
  FIRST_ENTRY => 0,
8214
8219
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8215
8220
  0x000a => {
8216
8221
  Name => 'ShutterCount',
8217
8222
  # number of mechanical shutter actuations, does not increase during electronic shutter / Silent Shooting
8218
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR))/',
8223
+ Condition => '$$self{Model} =~ /^(ILCE-(1M2|6700|7CM2|7CR))/',
8219
8224
  Format => 'int32u',
8220
8225
  Notes => 'total number of mechanical shutter actuations',
8221
8226
  RawConv => '$val & 0x00ffffff',
@@ -8451,7 +8456,7 @@ my %isoSetting2010 = (
8451
8456
  200 => 'Continuous - Sweep Panorama',
8452
8457
  },
8453
8458
  },
8454
- 0x001a => { %sequenceFileNumber },
8459
+ 0x001a => { %sequenceFileNumber }, # ILCE-9M3/1M2 have sometimes deviating values.
8455
8460
  0x001e => {
8456
8461
  Name => 'SequenceLength',
8457
8462
  PrintConv => {
@@ -8476,7 +8481,7 @@ my %isoSetting2010 = (
8476
8481
  },
8477
8482
  0x002a => [{
8478
8483
  Name => 'Quality2',
8479
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
8484
+ Condition => '$$self{Model} !~ /^(ILCE-(1|1M2|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
8480
8485
  PrintConv => {
8481
8486
  0 => 'JPEG',
8482
8487
  1 => 'RAW',
@@ -8544,7 +8549,7 @@ my %isoSetting2010 = (
8544
8549
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8545
8550
 
8546
8551
  0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8547
- 0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 185', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8552
+ 0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(185|186)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8548
8553
  0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8549
8554
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8550
8555
  0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167 and $$self{Software} !~ /^ILCE-7M4 (v2|v3)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8619,6 +8624,7 @@ my %isoSetting2010 = (
8619
8624
  10 => 'Selective (for Miniature effect)', # seen for DSC-HX30V,TX30,WX60,WX100
8620
8625
  11 => 'Zone', #JR (ILCE-7 series)
8621
8626
  12 => 'Expanded Flexible Spot', #JR (HX90V, ILCE-7 series)
8627
+ 13 => 'Custom AF Area', # NC, new AFArea option for ILCE-9M3, ILCE-1M2
8622
8628
  14 => 'Tracking',
8623
8629
  15 => 'Face Tracking',
8624
8630
  20 => 'Animal Eye Tracking',
@@ -10034,7 +10040,7 @@ my %isoSetting2010 = (
10034
10040
  },
10035
10041
  0x089d => { # Note: 32 values for these newer models, and 32 non-zero values present for new lenses like SEL2470GM2 and SEL2070G
10036
10042
  Name => 'VignettingCorrParams',
10037
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
10043
+ Condition => '$$self{Model} =~ /^(ILCE-(1M2|6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
10038
10044
  Format => 'int16s[32]',
10039
10045
  },
10040
10046
  0x08b5 => {
@@ -10055,7 +10061,7 @@ my %isoSetting2010 = (
10055
10061
  },
10056
10062
  0x08e5 => {
10057
10063
  Name => 'APS-CSizeCapture',
10058
- Condition => '$$self{Model} =~ /^(ILCE-(7CM2|7CR|7RM5)|ZV-E1)\b/',
10064
+ Condition => '$$self{Model} =~ /^(ILCE-(1M2|7CM2|7CR|7RM5)|ZV-E1)\b/',
10059
10065
  PrintConv => {
10060
10066
  0 => 'Off',
10061
10067
  1 => 'On',
@@ -10073,7 +10079,7 @@ my %isoSetting2010 = (
10073
10079
  },
10074
10080
  0x0945 => {
10075
10081
  Name => 'ChromaticAberrationCorrParams',
10076
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
10082
+ Condition => '$$self{Model} =~ /^(ILCE-(1M2|6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
10077
10083
  Format => 'int16s[32]',
10078
10084
  },
10079
10085
  );