exiftool-vendored.pl 12.45.0 → 12.49.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.
Files changed (51) hide show
  1. package/bin/Changes +84 -3
  2. package/bin/MANIFEST +9 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +45 -44
  6. package/bin/config_files/acdsee.config +2 -1
  7. package/bin/config_files/frameCount.config +56 -0
  8. package/bin/config_files/tiff_version.config +1 -1
  9. package/bin/exiftool +62 -54
  10. package/bin/lib/Image/ExifTool/Apple.pm +6 -2
  11. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -6
  12. package/bin/lib/Image/ExifTool/Canon.pm +20 -8
  13. package/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  14. package/bin/lib/Image/ExifTool/Exif.pm +7 -3
  15. package/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  16. package/bin/lib/Image/ExifTool/FlashPix.pm +4 -2
  17. package/bin/lib/Image/ExifTool/FujiFilm.pm +31 -5
  18. package/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  19. package/bin/lib/Image/ExifTool/ICO.pm +141 -0
  20. package/bin/lib/Image/ExifTool/ID3.pm +5 -5
  21. package/bin/lib/Image/ExifTool/M2TS.pm +55 -8
  22. package/bin/lib/Image/ExifTool/MIE.pm +9 -3
  23. package/bin/lib/Image/ExifTool/MISB.pm +494 -0
  24. package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
  25. package/bin/lib/Image/ExifTool/Nikon.pm +34 -31
  26. package/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  27. package/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
  28. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +12 -5
  29. package/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
  30. package/bin/lib/Image/ExifTool/QuickTime.pm +34 -5
  31. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +42 -4
  32. package/bin/lib/Image/ExifTool/README +1 -1
  33. package/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  34. package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  35. package/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  36. package/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  37. package/bin/lib/Image/ExifTool/Sony.pm +7 -3
  38. package/bin/lib/Image/ExifTool/TagLookup.pm +176 -6
  39. package/bin/lib/Image/ExifTool/TagNames.pod +4782 -4486
  40. package/bin/lib/Image/ExifTool/Text.pm +3 -4
  41. package/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  42. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  43. package/bin/lib/Image/ExifTool/WriteExif.pl +19 -1
  44. package/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  45. package/bin/lib/Image/ExifTool/Writer.pl +6 -2
  46. package/bin/lib/Image/ExifTool/XMP.pm +70 -56
  47. package/bin/lib/Image/ExifTool.pm +75 -15
  48. package/bin/lib/Image/ExifTool.pod +55 -52
  49. package/bin/perl-Image-ExifTool.spec +43 -43
  50. package/bin/pp_build_exe.args +7 -4
  51. package/package.json +2 -2
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::GPS;
16
16
 
17
- $VERSION = '1.49';
17
+ $VERSION = '1.50';
18
18
 
19
19
  sub ProcessMIE($$);
20
20
  sub ProcessMIEGroup($$$);
@@ -448,6 +448,13 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
448
448
  Notes => 'string composed of R, G, B, Y, Cb and Cr',
449
449
  },
450
450
  Compression => { Name => 'CompressionRatio', Writable => 'rational32u' },
451
+ OriginalImageSize => { # PH added 2022-09-28
452
+ Writable => 'int16u',
453
+ Count => -1,
454
+ Notes => 'size of original image before cropping',
455
+ PrintConv => '$val=~tr/ /x/;$val',
456
+ PrintConvInv => '$val=~tr/x/ /;$val',
457
+ },
451
458
  ImageSize => {
452
459
  Writable => 'int16u',
453
460
  Count => -1,
@@ -1253,8 +1260,7 @@ sub WriteMIEGroup($$$)
1253
1260
  # join multiple values into a single string
1254
1261
  $newVal = join "\0", @newVals;
1255
1262
  # write string as UTF-8,16 or 32 if value contains valid UTF-8 codes
1256
- require Image::ExifTool::XMP;
1257
- my $isUTF8 = Image::ExifTool::XMP::IsUTF8(\$newVal);
1263
+ my $isUTF8 = Image::ExifTool::IsUTF8(\$newVal);
1258
1264
  if ($isUTF8 > 0) {
1259
1265
  $writable = 'utf8';
1260
1266
  # write UTF-16 or UTF-32 if it is more compact
@@ -0,0 +1,494 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: MISB.pm
3
+ #
4
+ # Description: Read Motion Industry Standards Board metadata
5
+ #
6
+ # Revisions: 2022/10/08 - P. Harvey Created
7
+ #
8
+ # References: 1) https://dokumen.tips/documents/nato-standardization-agreement-stanag-4609-ed-3.html
9
+ # 2) https://upload.wikimedia.org/wikipedia/commons/1/19/MISB_Standard_0601.pdf
10
+ # 3) https://dokumen.tips/documents/misb-st-010211-standard-security-metadata-universal-standard-describes-the-use.html
11
+ #------------------------------------------------------------------------------
12
+
13
+ package Image::ExifTool::MISB;
14
+
15
+ use strict;
16
+ use vars qw($VERSION);
17
+ use Image::ExifTool qw(:DataAccess :Utils);
18
+
19
+ $VERSION = '1.00';
20
+
21
+ sub ProcessKLV($$$);
22
+
23
+ my %timeInfo = (
24
+ Groups => { 2 => 'Time' },
25
+ Format => 'int64u',
26
+ ValueConv => 'ConvertUnixTime($val/1e6, 0, 6) . "Z"',
27
+ PrintConv => '$self->ConvertDateTime($val)',
28
+ );
29
+ my %latInfo = (
30
+ Format => 'int32s',
31
+ ValueConv => '$val * 90 / 0x7fffffff',
32
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
33
+ );
34
+ my %lonInfo = (
35
+ Format => 'int32s',
36
+ ValueConv => '$val * 180 / 0x7fffffff',
37
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
38
+ );
39
+ my %altInfo = (
40
+ Format => 'int16u',
41
+ ValueConv => '$val * 19900 / 0xffff - 900',
42
+ PrintConv => 'sprintf("%.2f m", $val)',
43
+ );
44
+
45
+ # default format based on size of unknown KLV information
46
+ my %defaultFormat = (
47
+ 1 => 'int8u',
48
+ 2 => 'int16u',
49
+ 4 => 'int32u',
50
+ 8 => 'int64u',
51
+ );
52
+
53
+ %Image::ExifTool::MISB::Main = (
54
+ GROUPS => { 0 => 'MISB', 1 => 'MISB', 2 => 'Other' },
55
+ VARS => { LONG_TAGS => 2 },
56
+ NOTES => q{
57
+ These tags are extracted from STANAG-4609 MISB (Motion Industry Standards
58
+ Board) KLV-format metadata in M2TS videos.
59
+ },
60
+ '060e2b34020b01010e01030101000000' => {
61
+ Name => 'UASDataLink',
62
+ SubDirectory => { TagTable => 'Image::ExifTool::MISB::UASDatalink' },
63
+ },
64
+ '060e2b3402030101434e415644494147' => { # "CNAVDIAG" written by ChurchillNavigation ION
65
+ Name => 'ChurchillNav',
66
+ SubDirectory => {
67
+ TagTable => 'Image::ExifTool::MISB::ChurchillNav',
68
+ ByteOrder => 'LittleEndian', # !!
69
+ },
70
+ },
71
+ '060E2B34030101010E01030302000000' => { # (NC)
72
+ Name => 'Security',
73
+ SubDirectory => { TagTable => 'Image::ExifTool::MISB::Security' },
74
+ },
75
+ '<other>' => {
76
+ Name => 'Unknown',
77
+ SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' },
78
+ },
79
+ );
80
+
81
+ # UAS datalink local set tags (ref 2, MISB ST 0601.11)
82
+ %Image::ExifTool::MISB::UASDatalink = (
83
+ GROUPS => { 0 => 'MISB', 1 => 'MISB', 2 => 'Location' },
84
+ PROCESS_PROC => \&ProcessKLV,
85
+ NOTES => 'Tags extracted from the MISB ST 0601.11 UAS Datalink local set.',
86
+ 1 => { Name => 'Checksum', Format => 'int16u' },
87
+ 2 => { Name => 'GPSDateTime', %timeInfo },
88
+ 3 => { Name => 'MissionID', Format => 'string' },
89
+ 4 => { Name => 'TailNumber', Format => 'string' },
90
+ 5 => { Name => 'GPSTrack', Format => 'int16u', ValueConv => '$val * 360 / 0xffff' },
91
+ 6 => { Name => 'PitchAngle', Format => 'int16s', ValueConv => '$val * 20 / 0x7fff' },
92
+ 7 => { Name => 'RollAngle', Format => 'int16s', ValueConv => '$val * 50 / 0x7fff' },
93
+ 8 => { Name => 'TrueAirspeed', Format => 'int8u', PrintConv => '"$val m/s"' },
94
+ 9 => { Name => 'IndicatedAirspeed', Format => 'int8u', PrintConv => '"$val m/s"' },
95
+ 10 => { Name => 'ProjectIDCode', Format => 'string' },
96
+ 11 => { Name => 'SensorName', Format => 'string' },
97
+ 12 => { Name => 'ImageCoordinateSystem', Format => 'string' },
98
+ 13 => { Name => 'GPSLatitude', %latInfo },
99
+ 14 => { Name => 'GPSLongitude', %lonInfo },
100
+ 15 => { Name => 'GPSAltitude', %altInfo },
101
+ 16 => { Name => 'HorizontalFieldOfView', Format => 'int16u', ValueConv => '$val * 180 / 0xffff' },
102
+ 17 => { Name => 'VerticalFieldOfView', Format => 'int16u', ValueConv => '$val * 180 / 0xffff' },
103
+ 18 => { Name => 'SensorRelativeAzimuthAngle',Format=> 'int32u', ValueConv => '$val * 360 / 0xffffffff' },
104
+ 19 => { Name => 'SensorRelativeElevationAngle',Format=>'int32s',ValueConv => '$val * 180 / 0x7fffffff' },
105
+ 20 => { Name => 'SensorRelativeRollAngle', Format => 'int32u', ValueConv => '$val * 360 / 0xffffffff' },
106
+ 21 => { Name => 'SlantRange', Format => 'int32u', ValueConv => '$val * 5000000 / 0xffffffff' },
107
+ 22 => { Name => 'TargetWidth', Format => 'int16u', ValueConv => '$val * 10000 / 0xffff' },
108
+ 23 => { Name => 'FrameCenterLatitude', %latInfo },
109
+ 24 => { Name => 'FrameCenterLongitude', %lonInfo },
110
+ 25 => { Name => 'FrameCenterElevation', %altInfo },
111
+ 26 => { Name => 'OffsetCornerLatitude1', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
112
+ 27 => { Name => 'OffsetCornerLongitude1', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
113
+ 28 => { Name => 'OffsetCornerLatitude2', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
114
+ 29 => { Name => 'OffsetCornerLongitude2', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
115
+ 30 => { Name => 'OffsetCornerLatitude3', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
116
+ 31 => { Name => 'OffsetCornerLongitude3', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
117
+ 32 => { Name => 'OffsetCornerLatitude4', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
118
+ 33 => { Name => 'OffsetCornerLongitude4', Format => 'int16s', ValueConv => '$val * .075 / 0x7fff' },
119
+ 34 => { Name => 'IcingDetected', Format => 'int8u', PrintConv => { 0 => 'n/a', 1 => 'No', 2 => 'Yes' } },
120
+ 35 => { Name => 'WindDirection', Format => 'int16u', ValueConv => '$val * 360 / 0xffff' },
121
+ 36 => { Name => 'WindSpeed', Format => 'int8u', ValueConv => '$val * 100 / 0xff', Notes => 'm/s' },
122
+ 37 => { Name => 'StaticPressure', Format => 'int16u', ValueConv => '$val * 5000 / 0xffff', Notes => 'mbar' },
123
+ 38 => { Name => 'DensityAltitude', Format => 'int16u', ValueConv => '$val * 19900 / 0xffff - 900' },
124
+ 39 => { Name => 'AirTemperature', Format => 'int8s' },
125
+ 40 => { Name => 'TargetLocationLatitude', %latInfo },
126
+ 41 => { Name => 'TargetLocationLongitude', %lonInfo },
127
+ 42 => { Name => 'TargetLocationElevation', %altInfo },
128
+ 43 => { Name => 'TargetTrackGateWidth', Format => 'int8u' },
129
+ 44 => { Name => 'TargetTrackGateHeight', Format => 'int8u' },
130
+ 45 => { Name => 'TargetErrorEstimateCE90', Format => 'int16u' },
131
+ 46 => { Name => 'TargetErrorEstimateLE90', Format => 'int16u' },
132
+ 47 => { Name => 'GenericFlagData01',
133
+ Format => 'int8u',
134
+ PrintConv => { BITMASK => {
135
+ 0 => 'Laser range',
136
+ 1 => 'Auto-track',
137
+ 2 => 'IR polarity black',
138
+ 3 => 'Icing detected',
139
+ 4 => 'Slant range measured',
140
+ 5 => 'Image invalid',
141
+ }},
142
+ },
143
+ 48 => { Name => 'SecurityLocalMetadataSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Security' } },
144
+ 49 => { Name => 'DifferentialPressure', Format => 'int16u', ValueConv => '$val * 5000 / 0xffff' },
145
+ 50 => { Name => 'AngleOfAttack', Format => 'int16s', ValueConv => '$val * 20 / 0x7fff' },
146
+ 51 => { Name => 'VerticalSpeed', Format => 'int16s', ValueConv => '$val * 180 / 0x7fff', Notes => 'm/s' },
147
+ 52 => { Name => 'SideslipAngle', Format => 'int16s', ValueConv => '$val * 20 / 0x7fff' },
148
+ 53 => { Name => 'AirfieldBarometricPressure',Format=> 'int16u', ValueConv => '$val * 5000 / 0xffff' },
149
+ 54 => { Name => 'AirfieldElevation', %altInfo },
150
+ 55 => { Name => 'RelativeHumidity', Format => 'int8u', ValueConv => '$val * 100 / 0xff' },
151
+ 56 => { Name => 'GPSSpeed', Format => 'int8u', Notes => 'm/s' },
152
+ 57 => { Name => 'GroundRange', Format => 'int32u', ValueConv => '$val * 5000000 / 0xffffffff' },
153
+ 58 => { Name => 'FuelRemaining', Format => 'int16u', ValueConv => '$val * 10000 / 0xffff', Notes => 'kg' },
154
+ 59 => { Name => 'CallSign', Format => 'string' },
155
+ 60 => { Name => 'WeaponLoad', Format => 'int16u', PrintConv => 'sprintf("0x%.4x",$val)' },
156
+ 61 => { Name => 'WeaponFired', Format => 'int8u', PrintConv => 'sprintf("0x%.2x",$val)' },
157
+ 62 => { Name => 'LaserPRFCode', Format => 'int16u' },
158
+ 63 => { Name => 'SensorFieldOfViewName', Format => 'int8u',
159
+ PrintConv => {
160
+ 0 => 'Ultranarrow',
161
+ 1 => 'Narrow',
162
+ 2 => 'Medium',
163
+ 3 => 'Wide',
164
+ 4 => 'Ultrawide',
165
+ 5 => 'Narrow Medium',
166
+ 6 => '2x Ultranarrow',
167
+ 7 => '4x Ultranarrow',
168
+ },
169
+ },
170
+ 64 => { Name => 'MagneticHeading', Format => 'int16u', ValueConv => '$val * 360 / 0xffff' },
171
+ 65 => { Name => 'UAS_LSVersionNumber', Format => 'int8u' },
172
+ 66 => { Name => 'TargetLocationCovarianceMatrix', Format => 'undef', ValueConv => '\$val' },
173
+ 67 => { Name => 'AlternateLatitude', %latInfo },
174
+ 68 => { Name => 'AlternateLongitude', %lonInfo },
175
+ 69 => { Name => 'AlternateAltitude', %altInfo },
176
+ 70 => { Name => 'AlternateName', Format => 'string' },
177
+ 71 => { Name => 'AlternateHeading', Format => 'int16u', ValueConv => '$val * 360 / 0xffff' },
178
+ 72 => { Name => 'EventStartTime', %timeInfo },
179
+ 73 => { Name => 'RVTLocalSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
180
+ 74 => { Name => 'VMTIDataSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
181
+ 75 => { Name => 'SensorEllipsoidHeight', %altInfo },
182
+ 76 => { Name => 'AlternateEllipsoidHeight', %altInfo },
183
+ 77 => { Name => 'OperationalMode', Format => 'int8u',
184
+ PrintConv => {
185
+ 0 => 'Other',
186
+ 1 => 'Operational',
187
+ 2 => 'Training',
188
+ 3 => 'Exercise',
189
+ 4 => 'Maintenance',
190
+ },
191
+ },
192
+ 78 => { Name => 'FrameCenterHeightAboveEllipsoid', %altInfo },
193
+ 79 => { Name => 'SensorVelocityNorth', Format => 'int16s', ValueConv => '$val * 327 / 0x7fff' },
194
+ 80 => { Name => 'SensorVelocityEast', Format => 'int16s', ValueConv => '$val * 327 / 0x7fff' },
195
+ 81 => { Name => 'ImageHorizonPixelPack', Format => 'undef', ValueConv => '\$val' },
196
+ 82 => { Name => 'CornerLatitude1', %latInfo },
197
+ 83 => { Name => 'CornerLongitude1', %lonInfo },
198
+ 84 => { Name => 'CornerLatitude2', %latInfo },
199
+ 85 => { Name => 'CornerLongitude2', %lonInfo },
200
+ 86 => { Name => 'CornerLatitude3', %latInfo },
201
+ 87 => { Name => 'CornerLongitude3', %lonInfo },
202
+ 88 => { Name => 'CornerLatitude4', %latInfo },
203
+ 89 => { Name => 'CornerLongitude4', %lonInfo },
204
+ 90 => { Name => 'FullPitchAngle', Format => 'int32s', ValueConv => '$val * 90 / 0x7fffffff' },
205
+ 91 => { Name => 'FullRollAngle', Format => 'int32s', ValueConv => '$val * 90 / 0x7fffffff' },
206
+ 92 => { Name => 'FullAngleOfAttack', Format => 'int32s', ValueConv => '$val * 90 / 0x7fffffff' },
207
+ 93 => { Name => 'FullSideslipAngle', Format => 'int32s', ValueConv => '$val * 90 / 0x7fffffff' },
208
+ 94 => { Name => 'MIISCoreIdentifier', Format => 'undef', ValueConv => '\$val' },
209
+ 95 => { Name => 'SARMotionImageryData', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
210
+ 96 => { Name => 'TargetWidthExtended', Format => 'undef', ValueConv => '\$val' }, # IMAPB format
211
+ 97 => { Name => 'RangeImageLocalSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
212
+ 98 => { Name => 'GeoregistrationLocalSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
213
+ 99 => { Name => 'CompositeImagingLocalSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
214
+ 100=> { Name => 'SegmentLocalSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
215
+ 101=> { Name => 'AmendLocalSet', SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } },
216
+ 102=> { Name => 'SDCC-FLP', Format => 'undef', ValueConv => '\$val' }, # IMAPB format
217
+ 103=> { Name => 'DensityAltitudeExtended', Format => 'undef', ValueConv => '\$val' }, # IMAPB format
218
+ 104=> { Name => 'SensorEllipsoidHeightExtended', Format => 'undef', ValueConv => '\$val' }, # IMAPB format
219
+ 105=> { Name => 'AlternateEllipsoidHeightExtended', Format => 'undef', ValueConv => '\$val' }, # IMAPB format
220
+ );
221
+
222
+ # tags from MISB ST 0102.11 local set
223
+ %Image::ExifTool::MISB::Security = (
224
+ GROUPS => { 0 => 'MISB', 1 => 'MISB', 2 => 'Document' },
225
+ PROCESS_PROC => \&ProcessKLV,
226
+ NOTES => 'Tags extracted from the MISB ST 0102.11 Security Metadata local set.',
227
+ 1 => { Name => 'SecurityClassification', PrintConv => {
228
+ 1 => 'Unclassified',
229
+ 2 => 'Restricted',
230
+ 3 => 'Confidential',
231
+ 4 => 'Secret',
232
+ 5 => 'Top Secret',
233
+ }},
234
+ 2 => { Name => 'ClassifyingCountryCodeMethod', PrintConv => {
235
+ 0x01 => 'ISO-3166 Two Letter',
236
+ 0x02 => 'ISO-3166 Three Letter',
237
+ 0x03 => 'FIPS 10-4 Two Letter',
238
+ 0x04 => 'FIPS 10-4 Four Letter',
239
+ 0x05 => 'ISO-3166 Numeric',
240
+ 0x06 => '1059 Two Letter',
241
+ 0x07 => '1059 Three Letter',
242
+ 0x0a => 'FIPS 10-4 Mixed',
243
+ 0x0b => 'ISO 3166 Mixed',
244
+ 0x0c => 'STANAG 1059 Mixed',
245
+ 0x0d => 'GENC Two Letter',
246
+ 0x0e => 'GENC Three Letter',
247
+ 0x0f => 'GENC Numeric',
248
+ 0x10 => 'GENC Mixed',
249
+ }},
250
+ 3 => { Name => 'ClassifyingCountry', Format => 'string', PrintConv => '$val =~ s(^//)(); $val' },
251
+ 4 => 'SecuritySCI-SHIInformation',
252
+ 5 => { Name => 'Caveats', Format => 'string' },
253
+ 6 => { Name => 'ReleasingInstructions',Format => 'string' },
254
+ 7 => { Name => 'ClassifiedBy', Format => 'string' },
255
+ 8 => { Name => 'DerivedFrom', Format => 'string' },
256
+ 9 => { Name => 'ClassificationReason', Format => 'string' },
257
+ 10 => {
258
+ Name => 'DeclassificationDate',
259
+ Format => 'string',
260
+ Groups => { 2 => 'Time' },
261
+ ValueConv => '$val =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$3/; $val',
262
+ },
263
+ 11 => 'ClassificationAndMarkingSystem',
264
+ 12 => { Name => 'ObjectCountryCodingMethod', PrintConv => {
265
+ 0x01 => 'ISO-3166 Two Letter',
266
+ 0x02 => 'ISO-3166 Three Letter',
267
+ 0x03 => 'ISO-3166 Numeric',
268
+ 0x04 => 'FIPS 10-4 Two Letter',
269
+ 0x05 => 'FIPS 10-4 Four Letter',
270
+ 0x06 => '1059 Two Letter',
271
+ 0x07 => '1059 Three Letter',
272
+ 0x0d => 'GENC Two Letter',
273
+ 0x0e => 'GENC Three Letter',
274
+ 0x0f => 'GENC Numeric',
275
+ 0x40 => 'GENC AdminSub',
276
+ }},
277
+ 13 => { Name => 'ObjectCountryCodes', Format => 'string', PrintConv => '$val =~ s(^//)(); $val' },
278
+ 14 => { Name => 'ClassificationComments', Format => 'string' },
279
+ 15 => 'UMID',
280
+ 16 => 'StreamID',
281
+ 17 => 'TransportStreamID',
282
+ 21 => 'ItemDesignatorID',
283
+ 22 => { Name => 'SecurityVersion', Format => 'int16u', PrintConv => '"0102.$val"' },
284
+ 23 => {
285
+ Name => 'ClassifyingCountryCodingMethodDate',
286
+ Groups => { 2 => 'Time' },
287
+ Format => 'string',
288
+ ValueConv => '$val=~tr/-/:/; $val',
289
+ },
290
+ 24 => {
291
+ Name => 'ObjectCountryCodingMethodDate',
292
+ Groups => { 2 => 'Time' },
293
+ Format => 'string',
294
+ ValueConv => '$val=~tr/-/:/; $val',
295
+ },
296
+ );
297
+
298
+ # I have seen these, but don't know what they are for - PH
299
+ # (they look interesting, but remain static through my sample video)
300
+ %Image::ExifTool::MISB::ChurchillNav = (
301
+ GROUPS => { 0 => 'MISB', 1 => 'MISB', 2 => 'Other' },
302
+ PROCESS_PROC => \&ProcessKLV,
303
+ TAG_PREFIX => 'ChurchillNav',
304
+ NOTES => q{
305
+ Proprietary tags used by Churchill Navigation units. These tags are all
306
+ currently unknown, but extracted with the Unknown option.
307
+ },
308
+ # Note: tag ID's are decimal (because the MISB specification uses decimal ID's)
309
+ 1 => { Name => 'ChurchillNav_0x0001', Format => 'double', Unknown => 1, Hidden => 1 },
310
+ 2 => { Name => 'ChurchillNav_0x0002', Format => 'double', Unknown => 1, Hidden => 1 },
311
+ 3 => { Name => 'ChurchillNav_0x0003', Format => 'double', Unknown => 1, Hidden => 1 },
312
+ 4 => { Name => 'ChurchillNav_0x0004', Format => 'double', Unknown => 1, Hidden => 1 },
313
+ 5 => { Name => 'ChurchillNav_0x0005', Format => 'double', Unknown => 1, Hidden => 1 },
314
+ 6 => { Name => 'ChurchillNav_0x0006', Format => 'double', Unknown => 1, Hidden => 1 },
315
+ 9 => { Name => 'ChurchillNav_0x0009', Format => 'double', Unknown => 1, Hidden => 1 },
316
+ 10 => { Name => 'ChurchillNav_0x000a', Format => 'double', Unknown => 1, Hidden => 1 },
317
+ 11 => { Name => 'ChurchillNav_0x000b', Format => 'string', Unknown => 1, Hidden => 1 },
318
+ 12 => { Name => 'ChurchillNav_0x000c', Format => 'double', Unknown => 1, Hidden => 1 },
319
+ 13 => { Name => 'ChurchillNav_0x000d', Format => 'double', Unknown => 1, Hidden => 1 },
320
+ 14 => { Name => 'ChurchillNav_0x000e', Format => 'double', Unknown => 1, Hidden => 1 },
321
+ 16 => { Name => 'ChurchillNav_0x0010', Format => 'double', Unknown => 1, Hidden => 1 },
322
+ 17 => { Name => 'ChurchillNav_0x0011', Format => 'double', Unknown => 1, Hidden => 1 },
323
+ 18 => { Name => 'ChurchillNav_0x0012', Format => 'double', Unknown => 1, Hidden => 1 },
324
+ 20 => { Name => 'ChurchillNav_0x0014', Format => 'double', Unknown => 1, Hidden => 1 },
325
+ );
326
+
327
+ %Image::ExifTool::MISB::Unknown = (
328
+ GROUPS => { 0 => 'MISB', 1 => 'MISB', 2 => 'Other' },
329
+ PROCESS_PROC => \&ProcessKLV,
330
+ NOTES => 'Other tags are extracted with the Unknown option.',
331
+ );
332
+
333
+ #------------------------------------------------------------------------------
334
+ # Process KLV (Key-Length-Value) metadata
335
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
336
+ # Returns: 1 if anything was extracted
337
+ sub ProcessKLV($$$)
338
+ {
339
+ my ($et, $dirInfo, $tagTablePtr) = @_;
340
+ my $dataPt = $$dirInfo{DataPt};
341
+ my $dirStart = $$dirInfo{DirStart};
342
+ my $dirEnd = $dirStart + $$dirInfo{DirLen};
343
+ my $rtnVal = 0;
344
+ my $pos;
345
+
346
+ $et->VerboseDir($$dirInfo{DirName}, undef, $$dirInfo{DirLen});
347
+
348
+ # loop through KLV packets
349
+ for ($pos=$dirStart; $pos<$dirEnd-1; ) {
350
+ my $tag = Get8u($dataPt, $pos++);
351
+ my $len = Get8u($dataPt, $pos++);
352
+ if ($len & 0x80) {
353
+ my $n = $len & 0x7f;
354
+ last if $pos + $n > $dirEnd;
355
+ $len = 0;
356
+ $len = $len * 256 + Get8u($dataPt, $pos++) foreach 1..$n;
357
+ }
358
+ last if $pos + $len > $dirEnd;
359
+ # best guess at decoding the value
360
+ my $val;
361
+ my $tagInfo = $$tagTablePtr{$tag} || { };
362
+ my $format = $$tagInfo{Format} || $defaultFormat{$len};
363
+ if ($format) {
364
+ $val = ReadValue($dataPt, $pos, $format, undef, $len);
365
+ } else {
366
+ # treat as string or binary data
367
+ $val = substr($$dataPt, $pos, $len);
368
+ if ($val !~ /^[\t\n\r\x20-\x7e]*$/) {
369
+ my $dat = $val;
370
+ $val = \$val;
371
+ }
372
+ }
373
+ $et->HandleTag($tagTablePtr, $tag, $val,
374
+ DataPt => $dataPt,
375
+ Start => $pos,
376
+ Size => $len,
377
+ );
378
+ $rtnVal = 1;
379
+ $pos += $len;
380
+ }
381
+ return $rtnVal;
382
+ }
383
+
384
+ #------------------------------------------------------------------------------
385
+ # Parse MISB metadata
386
+ # Inputs: 0) ExifTool ref, 1) data ref, 2) tag table ref
387
+ # Returns: 1 if something was extracted, 0 otherwise
388
+ sub ParseMISB($$)
389
+ {
390
+ my ($et, $dataPt, $tagTablePtr) = @_;
391
+ my $end = length $$dataPt;
392
+ my $rtnVal = 0;
393
+ my $unknown = $$et{OPTIONS}{Unknown};
394
+ my $verbose = $$et{OPTIONS}{Verbose};
395
+ my $pos;
396
+
397
+ # increment document number in case we find any tags
398
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
399
+ $$et{INDENT} .= '| ';
400
+
401
+ # skip the 5-byte header (ref 1 pg. 68)
402
+ # 0 - int8u: metadata service ID (0x00)
403
+ # 1 - int8u: sequence number (increments each packet)
404
+ # 2 - int8u: 0x0f (bits: cell fragmentation 00, decoder config 0, random access 0, reserved 1111)
405
+ # 3-4 - int16u: data length (ie. packet length - 5)
406
+ for ($pos = 5; $pos + 16 < $end; ) {
407
+ my $key = unpack('H*', substr($$dataPt, $pos, 16));
408
+ $pos += 16;
409
+ my $len = Get8u($dataPt, $pos);
410
+ ++$pos;
411
+ if ($len & 0x80) { # is this a BER long form integer? (Basic Encoding Rules)
412
+ my $n = $len & 0x7f;
413
+ $len = 0;
414
+ return $rtnVal if $pos + $n > $end;
415
+ $len = $len * 256 + Get8u($dataPt, $pos++) foreach 1..$n;
416
+ }
417
+ my $tagInfo = $$tagTablePtr{$key};
418
+ unless ($tagInfo) {
419
+ if ($verbose or $unknown) {
420
+ # (assume this is a data set, but it maybe be a simple tag)
421
+ $tagInfo = { Name => "MISB_$key", SubDirectory => { TagTable => 'Image::ExifTool::MISB::Unknown' } };
422
+ $et->VPrint(0," [adding $$tagInfo{Name}]\n");
423
+ AddTagToTable($tagTablePtr, $key, $tagInfo);
424
+ } else {
425
+ # skip this record
426
+ $pos += $len;
427
+ next;
428
+ }
429
+ }
430
+ if ($pos + $len > $end) {
431
+ $len = $end - $pos;
432
+ $et->VPrint(0, "$$et{INDENT}(truncated record, only $len bytes available)\n");
433
+ }
434
+ my $dir = $$tagInfo{SubDirectory};
435
+ SetByteOrder($$dir{ByteOrder}) if $$dir{ByteOrder};
436
+ my %dirInfo = (
437
+ DataPt => $dataPt,
438
+ DirStart => $pos,
439
+ DirLen => $len,
440
+ DirName => $$tagInfo{Name},
441
+ );
442
+ ProcessKLV($et, \%dirInfo, GetTagTable($$dir{TagTable})) and $rtnVal = 1;
443
+ SetByteOrder('MM');
444
+ $pos += $len;
445
+ }
446
+ $$et{INDENT} = substr($$et{INDENT},0,-2);
447
+ delete $$et{DOC_NUM};
448
+ --$$et{DOC_COUNT} unless $rtnVal;
449
+ return $rtnVal;
450
+ }
451
+
452
+ 1; # end
453
+
454
+ __END__
455
+
456
+ =head1 NAME
457
+
458
+ Image::ExifTool::MISB - Read Motion Industry Standards Board metadata
459
+
460
+ =head1 SYNOPSIS
461
+
462
+ This module is used by Image::ExifTool
463
+
464
+ =head1 DESCRIPTION
465
+
466
+ This module contains code to extract STANAG-4609 Motion Industry Standards
467
+ Board (MISB) KLV-format metadata from M2TS videos.
468
+
469
+ =head1 AUTHOR
470
+
471
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
472
+
473
+ This library is free software; you can redistribute it and/or modify it
474
+ under the same terms as Perl itself.
475
+
476
+ =head1 REFERENCES
477
+
478
+ =over 4
479
+
480
+ =item L<https://dokumen.tips/documents/nato-standardization-agreement-stanag-4609-ed-3.html>
481
+
482
+ =item L<https://upload.wikimedia.org/wikipedia/commons/1/19/MISB_Standard_0601.pdf>
483
+
484
+ =item L<https://dokumen.tips/documents/misb-st-010211-standard-security-metadata-universal-standard-describes-the-use.html>
485
+
486
+ =back
487
+
488
+ =head1 SEE ALSO
489
+
490
+ L<Image::ExifTool::TagNames/MISB Tags>,
491
+ L<Image::ExifTool(3pm)|Image::ExifTool>
492
+
493
+ =cut
494
+
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
21
21
  sub WriteUnknownOrPreview($$$);
22
22
  sub FixLeicaBase($$;$);
23
23
 
24
- $VERSION = '2.11';
24
+ $VERSION = '2.12';
25
25
 
26
26
  my $debug; # set to 1 to enable debugging code
27
27
 
@@ -1609,6 +1609,8 @@ IFD_TRY: for ($offset=$firstTry; $offset<=$lastTry; $offset+=2) {
1609
1609
  }
1610
1610
  # patch for Sony cameras like the DSC-P10 that have invalid MakerNote entries
1611
1611
  next if $num == 12 and $$et{Make} eq 'SONY' and $index >= 8;
1612
+ # patch for Apple ProRaw DNG which uses format 16 in the maker notes
1613
+ next if $format == 16 and $$et{Make} eq 'Apple';
1612
1614
  # (would like to verify tag ID, but some manufactures don't
1613
1615
  # sort entries in order of tag ID so we don't have much of
1614
1616
  # a handle to verify this field)