exiftool_vendored 12.41.0 → 12.50.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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +209 -6
  3. data/bin/MANIFEST +12 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -44
  7. data/bin/config_files/acdsee.config +2 -1
  8. data/bin/config_files/frameCount.config +56 -0
  9. data/bin/config_files/tiff_version.config +1 -1
  10. data/bin/exiftool +115 -96
  11. data/bin/fmt_files/gpx.fmt +3 -0
  12. data/bin/fmt_files/gpx_wpt.fmt +3 -0
  13. data/bin/lib/Image/ExifTool/Apple.pm +16 -3
  14. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
  15. data/bin/lib/Image/ExifTool/Canon.pm +71 -33
  16. data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  17. data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  18. data/bin/lib/Image/ExifTool/DJI.pm +60 -1
  19. data/bin/lib/Image/ExifTool/DNG.pm +8 -2
  20. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  21. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  22. data/bin/lib/Image/ExifTool/Exif.pm +26 -12
  23. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  24. data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  25. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  26. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  27. data/bin/lib/Image/ExifTool/GPS.pm +21 -1
  28. data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
  29. data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
  30. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  31. data/bin/lib/Image/ExifTool/ID3.pm +11 -11
  32. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  33. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  34. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  35. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  36. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  37. data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
  38. data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  39. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  40. data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
  41. data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  42. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  43. data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
  44. data/bin/lib/Image/ExifTool/PDF.pm +2 -1
  45. data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
  46. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  47. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  48. data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
  49. data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
  50. data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
  51. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
  52. data/bin/lib/Image/ExifTool/README +13 -3
  53. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  54. data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
  55. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  56. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  57. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  58. data/bin/lib/Image/ExifTool/Sony.pm +71 -43
  59. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  60. data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
  61. data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
  62. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  63. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  64. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  65. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  66. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  67. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  68. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  69. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  70. data/bin/lib/Image/ExifTool/Writer.pl +14 -6
  71. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  72. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  73. data/bin/lib/Image/ExifTool.pm +120 -33
  74. data/bin/lib/Image/ExifTool.pod +83 -69
  75. data/bin/perl-Image-ExifTool.spec +43 -43
  76. data/lib/exiftool_vendored/version.rb +1 -1
  77. metadata +9 -4
@@ -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
 
@@ -89,6 +89,11 @@ my $debug; # set to 1 to enable debugging code
89
89
  FixBase => 1, # necessary for AVI and MOV videos
90
90
  },
91
91
  },
92
+ {
93
+ Name => 'MakerNoteDJIInfo',
94
+ Condition => '$$valPt =~ /^\[ae_dbg_info:/',
95
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
96
+ },
92
97
  {
93
98
  Name => 'MakerNoteDJI',
94
99
  Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s',
@@ -1604,6 +1609,8 @@ IFD_TRY: for ($offset=$firstTry; $offset<=$lastTry; $offset+=2) {
1604
1609
  }
1605
1610
  # patch for Sony cameras like the DSC-P10 that have invalid MakerNote entries
1606
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';
1607
1614
  # (would like to verify tag ID, but some manufactures don't
1608
1615
  # sort entries in order of tag ID so we don't have much of
1609
1616
  # a handle to verify this field)
@@ -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.11';
17
+ $VERSION = '1.12';
18
18
 
19
19
  my %noYes = ( 0 => 'No', 1 => 'Yes' );
20
20
 
@@ -27,8 +27,10 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
27
27
  NOTES => q{
28
28
  The following tags are extracted from Matroska multimedia container files.
29
29
  This container format is used by file types such as MKA, MKV, MKS and WEBM.
30
- For speed, ExifTool extracts tags only up to the first Cluster unless the
31
- L<Verbose|../ExifTool.html#Verbose> (-v) or L<Unknown|../ExifTool.html#Unknown> = 2 (-U) option is used. See
30
+ For speed, by default ExifTool extracts tags only up to the first Cluster.
31
+ However, the L<Verbose|../ExifTool.html#Verbose> (-v) and L<Unknown|../ExifTool.html#Unknown> = 2 (-U) options force processing of
32
+ Cluster data, and the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option skips over Clusters to
33
+ read subsequent tags. See
32
34
  L<http://www.matroska.org/technical/specs/index.html> for the official
33
35
  Matroska specification.
34
36
  },
@@ -269,10 +271,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
269
271
  }
270
272
  ],
271
273
  0x3314f => { Name => 'TrackTimecodeScale',Format => 'float' },
272
- 0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 },
274
+ 0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 },
273
275
  0x15ee => { Name => 'MaxBlockAdditionID',Format => 'unsigned', Unknown => 1 },
274
- 0x136e => { Name => 'TrackName', Format => 'utf8' },
275
- 0x2b59c => { Name => 'TrackLanguage', Format => 'string' },
276
+ 0x136e => { Name => 'TrackName', Format => 'utf8' },
277
+ 0x2b59c => { Name => 'TrackLanguage', Format => 'string' },
278
+ 0x2b59d => { Name => 'TrackLanguageIETF', Format => 'string' },
276
279
  0x06 => [
277
280
  {
278
281
  Name => 'VideoCodecID',
@@ -743,7 +746,8 @@ sub ProcessMKV($$)
743
746
 
744
747
  # set flag to process entire file (otherwise we stop at the first Cluster)
745
748
  my $verbose = $et->Options('Verbose');
746
- my $processAll = ($verbose or $et->Options('Unknown') > 1);
749
+ my $processAll = ($verbose or $et->Options('Unknown') > 1) ? 2 : 0;
750
+ ++$processAll if $et->Options('ExtractEmbedded');
747
751
  $$et{TrackTypes} = \%trackTypes; # store Track types reference
748
752
  my $oldIndent = $$et{INDENT};
749
753
  my $chapterNum = 0;
@@ -786,16 +790,20 @@ sub ProcessMKV($$)
786
790
  my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
787
791
  # just fall through into the contained EBML elements
788
792
  if ($tagInfo and $$tagInfo{SubDirectory}) {
789
- # stop processing at first cluster unless we are in verbose mode
790
- last if $$tagInfo{Name} eq 'Cluster' and not $processAll;
791
- $$et{INDENT} .= '| ';
792
- $et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
793
- push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
794
- if ($$tagInfo{Name} eq 'ChapterAtom') {
795
- $$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
796
- $trackIndent = $$et{INDENT};
793
+ # stop processing at first cluster unless we are using -v -U or -ee
794
+ if ($$tagInfo{Name} eq 'Cluster' and $processAll < 2) {
795
+ last unless $processAll;
796
+ undef $tagInfo; # just skip the Cluster when -ee is used
797
+ } else {
798
+ $$et{INDENT} .= '| ';
799
+ $et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
800
+ push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
801
+ if ($$tagInfo{Name} eq 'ChapterAtom') {
802
+ $$et{SET_GROUP1} = 'Chapter' . (++$chapterNum);
803
+ $trackIndent = $$et{INDENT};
804
+ }
805
+ next;
797
806
  }
798
- next;
799
807
  }
800
808
  last if $unknownSize;
801
809
  if ($pos + $size > $dataLen) {
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool::Exif;
16
16
 
17
- $VERSION = '1.01';
17
+ $VERSION = '1.02';
18
18
 
19
19
  # Motorola makernotes tags (ref PH)
20
20
  %Image::ExifTool::Motorola::Main = (
@@ -54,7 +54,12 @@ $VERSION = '1.01';
54
54
  # 0x6400 - string: 'AUTO','ON','OFF'
55
55
  # 0x6401 - string: 'HDR'
56
56
  # 0x6410 - string: 'NO','YES'
57
- # 0x6420 - int32s: 0 (only exists in HDR images?)
57
+ # 0x6420 - int32s for some models: 0 (only exists in HDR images?)
58
+ 0x6420 => { #forum13731
59
+ Condition => '$format eq "string"',
60
+ Name => 'CustomRendered',
61
+ Writable => 'string',
62
+ },
58
63
  # 0x6430 - float
59
64
  # 0x6431 - int8u: 0,1
60
65
  # 0x6432 - int8u: 0,79,100
@@ -89,6 +94,7 @@ $VERSION = '1.01';
89
94
  # 0x64c2,0x64c3 - int32s
90
95
  # 0x64c4 - int32s
91
96
  # 0x64c5 - int32u
97
+ 0x64d0 => { Name => 'DriveMode', Writable => 'string' }, #forum13731
92
98
  # 0x6500 - int8u: 1
93
99
  # 0x6501 - string: 'Luma-Chroma Plane','Chroma only' or int8u: 0
94
100
  # 0x6502 - string: 'Luma-Chroma Plane','Chroma only','' or int8u: 1,255