source: main/trunk/greenstone2/perllib/cpan/Image/ExifTool/Microsoft.pm@ 34921

Last change on this file since 34921 was 34921, checked in by anupama, 3 years ago

Committing the improvements to EmbeddedMetaPlugin's processing of Keywords vs other metadata fields. Keywords were literally stored as arrays of words rather than phrases in PDFs (at least in Diego's sample PDF), whereas other meta fields like Subjects and Creators stored them as arrays of phrases. To get both to work, Kathy updated EXIF to a newer version, to retrieve the actual EXIF values stored in the PDF. And Kathy and Dr Bainbridge came up with a new option that I added called apply_join_before_split_to_metafields that's a regex which can list the metadata fields to apply the join_before_split to and whcih previously always got applied to all metadata fields. Now it's applied to any *Keywords metafields by default, as that's the metafield we have experience of that behaves differently to the others, as it stores by word instead of phrases. Tested on Diego's sample PDF. Diego has double-checked it to works on his sample PDF too, setting the split char to ; and turning on the join_before_split and leaving apply_join_before_split_to_metafields at its default of .*Keywords. File changes are strings.properties for the tooltip, the plugin introducing the option and working with it and Kathy's EXIF updates affecting cpan/File and cpan/Image.

  • Property svn:executable set to *
File size: 43.1 KB
Line 
1#------------------------------------------------------------------------------
2# File: Microsoft.pm
3#
4# Description: Definitions for custom Microsoft tags
5#
6# Revisions: 2010/10/01 - P. Harvey Created
7# 2011/10/05 - PH Added ProcessXtra()
8#
9# References: 1) http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm
10#------------------------------------------------------------------------------
11
12package Image::ExifTool::Microsoft;
13
14use strict;
15use vars qw($VERSION);
16use Image::ExifTool qw(:DataAccess :Utils);
17use Image::ExifTool::XMP;
18
19$VERSION = '1.20';
20
21sub ProcessXtra($$$);
22
23# tags written by Microsoft HDView (ref 1)
24%Image::ExifTool::Microsoft::Stitch = (
25 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
26 WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
27 CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
28 WRITABLE => 1,
29 FORMAT => 'float',
30 FIRST_ENTRY => 0,
31 GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
32 NOTES => q{
33 Information found in the Microsoft custom EXIF tag 0x4748, as written by
34 Windows Live Photo Gallery.
35 },
36 0 => {
37 Name => 'PanoramicStitchVersion',
38 Format => 'int32u',
39 },
40 1 => {
41 Name => 'PanoramicStitchCameraMotion',
42 Format => 'int32u',
43 PrintConv => {
44 2 => 'Rigid Scale',
45 3 => 'Affine',
46 4 => '3D Rotation',
47 5 => 'Homography',
48 },
49 },
50 2 => {
51 Name => 'PanoramicStitchMapType',
52 Format => 'int32u',
53 PrintConv => {
54 0 => 'Perspective',
55 1 => 'Horizontal Cylindrical',
56 2 => 'Horizontal Spherical',
57 257 => 'Vertical Cylindrical',
58 258 => 'Vertical Spherical',
59 },
60 },
61 3 => 'PanoramicStitchTheta0',
62 4 => 'PanoramicStitchTheta1',
63 5 => 'PanoramicStitchPhi0',
64 6 => 'PanoramicStitchPhi1',
65);
66
67# Microsoft Photo schema properties (MicrosoftPhoto) (ref PH)
68%Image::ExifTool::Microsoft::XMP = (
69 %Image::ExifTool::XMP::xmpTableDefaults,
70 GROUPS => { 0 => 'XMP', 1 => 'XMP-microsoft', 2 => 'Image' },
71 NAMESPACE => 'MicrosoftPhoto',
72 TABLE_DESC => 'XMP Microsoft',
73 VARS => { NO_ID => 1 },
74 NOTES => q{
75 Microsoft Photo 1.0 schema XMP tags. This is likely not a complete list,
76 but represents tags which have been observed in sample images. The actual
77 namespace prefix is "MicrosoftPhoto", but ExifTool shortens this in the
78 family 1 group name.
79 },
80 CameraSerialNumber => { },
81 DateAcquired => { Groups => { 2 => 'Time' }, %Image::ExifTool::XMP::dateTimeInfo },
82 FlashManufacturer => { },
83 FlashModel => { },
84 LastKeywordIPTC => { List => 'Bag' },
85 LastKeywordXMP => { List => 'Bag' },
86 LensManufacturer => { },
87 LensModel => { Avoid => 1 },
88 Rating => {
89 Name => 'RatingPercent',
90 Notes => q{
91 XMP-xmp:Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent
92 values of 1,25,50,75 and 99 respectively
93 },
94 },
95 CreatorAppId => { Name => 'CreatorAppID' },
96 CreatorOpenWithUIOptions => { },
97 ItemSubType => { },
98);
99
100# Microsoft Photo 1.1 schema properties (MP1 - written as 'prefix0' by MSPhoto) (ref PH)
101%Image::ExifTool::Microsoft::MP1 = (
102 %Image::ExifTool::XMP::xmpTableDefaults,
103 GROUPS => { 0 => 'XMP', 1 => 'XMP-MP1', 2 => 'Image' },
104 NAMESPACE => 'MP1',
105 TABLE_DESC => 'XMP Microsoft Photo',
106 VARS => { NO_ID => 1 },
107 NOTES => q{
108 Microsoft Photo 1.1 schema XMP tags which have been observed.
109 },
110 PanoramicStitchCameraMotion => {
111 PrintConv => {
112 'RigidScale' => 'Rigid Scale',
113 'Affine' => 'Affine',
114 '3DRotation' => '3D Rotation',
115 'Homography' => 'Homography',
116 },
117 },
118 PanoramicStitchMapType => {
119 PrintConv => {
120 'Perspective' => 'Perspective',
121 'Horizontal-Cylindrical' => 'Horizontal Cylindrical',
122 'Horizontal-Spherical' => 'Horizontal Spherical',
123 'Vertical-Cylindrical' => 'Vertical Cylindrical',
124 'Vertical-Spherical' => 'Vertical Spherical',
125 },
126 },
127 PanoramicStitchPhi0 => { Writable => 'real' },
128 PanoramicStitchPhi1 => { Writable => 'real' },
129 PanoramicStitchTheta0 => { Writable => 'real' },
130 PanoramicStitchTheta1 => { Writable => 'real' },
131 WhiteBalance0 => { Writable => 'real' },
132 WhiteBalance1 => { Writable => 'real' },
133 WhiteBalance2 => { Writable => 'real' },
134 Brightness => { Avoid => 1 },
135 Contrast => { Avoid => 1 },
136 CameraModelID => { Avoid => 1 },
137 ExposureCompensation => { Avoid => 1 },
138 PipelineVersion => { },
139 StreamType => { },
140);
141
142# Microsoft Photo 1.2 schema properties (MP) (ref PH)
143# (also ref http://msdn.microsoft.com/en-us/library/windows/desktop/ee719905(v=vs.85).aspx)
144my %sRegions = (
145 STRUCT_NAME => 'Microsoft Regions',
146 NAMESPACE => 'MPReg',
147 NOTES => q{
148 Note that PersonLiveIdCID element is called PersonLiveCID according to the
149 Microsoft specification, but in practice their software actually writes
150 PersonLiveIdCID, so ExifTool uses this too.
151 },
152 Rectangle => { },
153 PersonDisplayName => { },
154 PersonEmailDigest => { },
155 PersonLiveIdCID => { }, # (see https://exiftool.org/forum/index.php?topic=4274.msg20368#msg20368)
156 PersonSourceID => { },
157);
158%Image::ExifTool::Microsoft::MP = (
159 %Image::ExifTool::XMP::xmpTableDefaults,
160 GROUPS => { 0 => 'XMP', 1 => 'XMP-MP', 2 => 'Image' },
161 NAMESPACE => 'MP',
162 TABLE_DESC => 'XMP Microsoft Photo',
163 VARS => { NO_ID => 1 },
164 NOTES => q{
165 Microsoft Photo 1.2 schema XMP tags which have been observed.
166 },
167 RegionInfo => {
168 Name => 'RegionInfoMP',
169 Struct => {
170 STRUCT_NAME => 'Microsoft RegionInfo',
171 NAMESPACE => 'MPRI',
172 Regions => { Struct => \%sRegions, List => 'Bag' },
173 DateRegionsValid => {
174 Writable => 'date',
175 Shift => 'Time',
176 Groups => { 2 => 'Time'},
177 PrintConv => '$self->ConvertDateTime($val)',
178 PrintConvInv => '$self->InverseDateTime($val,undef,1)',
179 },
180 },
181 },
182 # remove "MP" from tag name (was added only to avoid conflict with XMP-mwg-rs:RegionInfo)
183 RegionInfoRegions => { Flat => 1, Name => 'RegionInfoRegions' },
184 RegionInfoDateRegionsValid => { Flat => 1, Name => 'RegionInfoDateRegionsValid' },
185 # shorten flattened Regions tag names to make them easier to use
186 RegionInfoRegionsRectangle => { Flat => 1, Name => 'RegionRectangle' },
187 RegionInfoRegionsPersonDisplayName => { Flat => 1, Name => 'RegionPersonDisplayName' },
188 RegionInfoRegionsPersonEmailDigest => { Flat => 1, Name => 'RegionPersonEmailDigest' },
189 RegionInfoRegionsPersonLiveIdCID => { Flat => 1, Name => 'RegionPersonLiveIdCID' },
190 RegionInfoRegionsPersonSourceID => { Flat => 1, Name => 'RegionPersonSourceID' },
191);
192
193# Xtra tags written in MP4 files written by Microsoft Windows Media Player
194# (ref http://msdn.microsoft.com/en-us/library/windows/desktop/dd562330(v=VS.85).aspx)
195# Note: These tags are closely related to tags in Image::ExifTool::ASF::ExtendedDescr
196# and Image::ExifTool::WTV::Metadata
197%Image::ExifTool::Microsoft::Xtra = (
198 PROCESS_PROC => \&ProcessXtra,
199 GROUPS => { 0 => 'QuickTime', 2 => 'Video' },
200 VARS => { NO_ID => 1 },
201 NOTES => q{
202 Tags extracted from the Microsoft "Xtra" atom of QuickTime videos. Tag ID's
203 are not shown because some are unruly GUID's.
204 },
205 Abstract => { },
206 AcquisitionTime => { Groups => { 2 => 'Time' } },
207 AcquisitionTimeDay => { Groups => { 2 => 'Time' } },
208 AcquisitionTimeMonth => { Groups => { 2 => 'Time' } },
209 AcquisitionTimeYear => { Groups => { 2 => 'Time' } },
210 AcquisitionTimeYearMonth => { Groups => { 2 => 'Time' } },
211 AcquisitionTimeYearMonthDay => { Groups => { 2 => 'Time' } },
212 AlbumArtistSortOrder => { },
213 AlbumID => { },
214 AlbumIDAlbumArtist => { },
215 AlbumTitleSortOrder => { },
216 AlternateSourceURL => { },
217 AudioBitrate => { },
218 AudioFormat => { },
219 Author => { Groups => { 2 => 'Author' } },
220 AuthorSortOrder => { },
221 AverageLevel => { },
222 Bitrate => { },
223 BuyNow => { },
224 BuyTickets => { },
225 CallLetters => { },
226 CameraManufacturer => { },
227 CameraModel => { },
228 CDTrackEnabled => { },
229 Channels => { },
230 chapterNum => { },
231 Comment => { },
232 ContentDistributorDuration => { },
233 Copyright => { Groups => { 2 => 'Author' } },
234 Count => { },
235 CurrentBitrate => { },
236 Description => { },
237 DisplayArtist => { },
238 DLNAServerUDN => { },
239 DLNASourceURI => { },
240 DRMKeyID => { },
241 DRMIndividualizedVersion => { },
242 DTCPIPHost => { },
243 DTCPIPPort => { },
244 Duration => { },
245 DVDID => { },
246 Event => { },
247 FileSize => { },
248 FileType => { },
249 FourCC => { },
250 FormatTag => { },
251 FrameRate => { },
252 Frequency => { },
253 IsNetworkFeed => { },
254 Is_Protected => 'IsProtected',
255 IsVBR => { },
256 LeadPerformer => { },
257 LibraryID => { },
258 LibraryName => { },
259 Location => { },
260 MediaContentTypes => { },
261 MediaType => { },
262 ModifiedBy => { },
263 MoreInfo => { },
264 PartOfSet => { },
265 PeakValue => { },
266 PixelAspectRatioX => { },
267 PixelAspectRatioY => { },
268 PlaylistIndex => { },
269 Provider => { },
270 ProviderLogoURL => { },
271 ProviderURL => { },
272 RadioBand => { },
273 RadioFormat => { },
274 RatingOrg => { },
275 RecordingTime => { Groups => { 2 => 'Time' } },
276 RecordingTimeDay => { Groups => { 2 => 'Time' } },
277 RecordingTimeMonth => { Groups => { 2 => 'Time' } },
278 RecordingTimeYear => { Groups => { 2 => 'Time' } },
279 RecordingTimeYearMonth => { Groups => { 2 => 'Time' } },
280 RecordingTimeYearMonthDay => { Groups => { 2 => 'Time' } },
281 ReleaseDate => { Groups => { 2 => 'Time' } },
282 ReleaseDateDay => { Groups => { 2 => 'Time' } },
283 ReleaseDateMonth => { Groups => { 2 => 'Time' } },
284 ReleaseDateYear => { Groups => { 2 => 'Time' } },
285 ReleaseDateYearMonth => { Groups => { 2 => 'Time' } },
286 ReleaseDateYearMonthDay => { Groups => { 2 => 'Time' } },
287 RequestState => { },
288 ShadowFilePath => { },
289 SourceURL => { },
290 Subject => { },
291 SyncState => { },
292 Sync01 => { },
293 Sync02 => { },
294 Sync03 => { },
295 Sync04 => { },
296 Sync05 => { },
297 Sync06 => { },
298 Sync07 => { },
299 Sync08 => { },
300 Sync09 => { },
301 Sync10 => { },
302 Sync11 => { },
303 Sync12 => { },
304 Sync13 => { },
305 Sync14 => { },
306 Sync15 => { },
307 Sync16 => { },
308 SyncOnly => { },
309 Temporary => { },
310 Title => { },
311 titleNum => { },
312 TitleSortOrder => { },
313 TotalDuration => { },
314 TrackingID => { },
315 UserCustom1 => { },
316 UserCustom2 => { },
317 UserEffectiveRating => { },
318 UserLastPlayedTime => { },
319 UserPlayCount => { },
320 UserPlaycountAfternoon => { },
321 UserPlaycountEvening => { },
322 UserPlaycountMorning => { },
323 UserPlaycountNight => { },
324 UserPlaycountWeekday => { },
325 UserPlaycountWeekend => { },
326 UserRating => { },
327 UserServiceRating => { },
328 VideoBitrate => { },
329 VideoFormat => { },
330 'WM/AlbumArtist' => 'AlbumArtist',
331 'WM/AlbumCoverURL' => 'AlbumCoverURL',
332 'WM/AlbumTitle' => 'AlbumTitle',
333 'WM/BeatsPerMinute' => 'BeatsPerMinute',
334 'WM/Category' => 'Category',
335 'WM/Composer' => 'Composer',
336 'WM/Conductor' => 'Conductor',
337 'WM/ContentDistributor' => 'ContentDistributor',
338 'WM/ContentDistributorType' => 'ContentDistributorType',
339 'WM/ContentGroupDescription'=> 'ContentGroupDescription',
340 'WM/Director' => 'Director',
341 'WM/EncodingTime' => {
342 Name => 'EncodingTime',
343 Groups => { 2 => 'Time' },
344 PrintConv => '$self->ConvertDateTime($val)',
345 },
346 'WM/Genre' => 'Genre',
347 'WM/GenreID' => 'GenreID',
348 'WM/InitialKey' => 'InitialKey',
349 'WM/Language' => 'Language',
350 'WM/Lyrics' => 'Lyrics',
351 'WM/MCDI' => 'MCDI',
352 'WM/MediaClassPrimaryID' => {
353 Name => 'MediaClassPrimaryID',
354 PrintConv => { #http://msdn.microsoft.com/en-us/library/windows/desktop/dd757960(v=vs.85).aspx
355 'D1607DBC-E323-4BE2-86A1-48A42A28441E' => 'Music',
356 'DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B' => 'Video',
357 '01CD0F29-DA4E-4157-897B-6275D50C4F11' => 'Audio (not music)',
358 'FCF24A76-9A57-4036-990D-E35DD8B244E1' => 'Other (not audio or video)',
359 },
360 },
361 'WM/MediaClassSecondaryID' => {
362 Name => 'MediaClassSecondaryID',
363 PrintConv => { #http://msdn.microsoft.com/en-us/library/windows/desktop/dd757960(v=vs.85).aspx
364 'E0236BEB-C281-4EDE-A36D-7AF76A3D45B5' => 'Audio Book',
365 '3A172A13-2BD9-4831-835B-114F6A95943F' => 'Spoken Word',
366 '6677DB9B-E5A0-4063-A1AD-ACEB52840CF1' => 'Audio News',
367 '1B824A67-3F80-4E3E-9CDE-F7361B0F5F1B' => 'Talk Show',
368 '1FE2E091-4E1E-40CE-B22D-348C732E0B10' => 'Video News',
369 'D6DE1D88-C77C-4593-BFBC-9C61E8C373E3' => 'Web-based Video',
370 '00033368-5009-4AC3-A820-5D2D09A4E7C1' => 'Sound Clip from Game',
371 'F24FF731-96FC-4D0F-A2F5-5A3483682B1A' => 'Song from Game',
372 'E3E689E2-BA8C-4330-96DF-A0EEEFFA6876' => 'Music Video',
373 'B76628F4-300D-443D-9CB5-01C285109DAF' => 'Home Movie',
374 'A9B87FC9-BD47-4BF0-AC4F-655B89F7D868' => 'Feature Film',
375 'BA7F258A-62F7-47A9-B21F-4651C42A000E' => 'TV Show',
376 '44051B5B-B103-4B5C-92AB-93060A9463F0' => 'Corporate Video',
377 '0B710218-8C0C-475E-AF73-4C41C0C8F8CE' => 'Home Video from Pictures',
378 '00000000-0000-0000-0000-000000000000' => 'Unknown Content', #PH
379 },
380 },
381 'WM/MediaOriginalBroadcastDateTime' => {
382 Name => 'MediaOriginalBroadcastDateTime',
383 Groups => { 2 => 'Time' },
384 PrintConv => '$self->ConvertDateTime($val)',
385 },
386 'WM/MediaOriginalChannel' => 'MediaOriginalChannel',
387 'WM/MediaStationName' => 'MediaStationName',
388 'WM/Mood' => 'Mood',
389 'WM/OriginalAlbumTitle' => 'OriginalAlbumTitle',
390 'WM/OriginalArtist' => 'OriginalArtist',
391 'WM/OriginalLyricist' => 'OriginalLyricist',
392 'WM/ParentalRating' => 'ParentalRating',
393 'WM/PartOfSet' => 'PartOfSet',
394 'WM/Period' => 'Period',
395 'WM/Producer' => 'Producer',
396 'WM/ProtectionType' => 'ProtectionType',
397 'WM/Provider' => 'Provider',
398 'WM/ProviderRating' => 'ProviderRating',
399 'WM/ProviderStyle' => 'ProviderStyle',
400 'WM/Publisher' => 'Publisher',
401 'WM/SharedUserRating' => 'SharedUserRating',
402 'WM/SubscriptionContentID' => 'SubscriptionContentID',
403 'WM/SubTitle' => 'Subtitle',
404 'WM/SubTitleDescription' => 'SubtitleDescription',
405 'WM/TrackNumber' => 'TrackNumber',
406 'WM/UniqueFileIdentifier' => 'UniqueFileIdentifier',
407 'WM/VideoFrameRate' => 'VideoFrameRate',
408 'WM/VideoHeight' => 'VideoHeight',
409 'WM/VideoWidth' => 'VideoWidth',
410 'WM/WMCollectionGroupID' => 'WMCollectionGroupID',
411 'WM/WMCollectionID' => 'WMCollectionID',
412 'WM/WMContentID' => 'WMContentID',
413 'WM/WMShadowFileSourceDRMType' => 'WMShadowFileSourceDRMType',
414 'WM/WMShadowFileSourceFileType' => 'WMShadowFileSourceFileType',
415 'WM/Writer' => 'Writer',
416 'WM/Year' => { Name => 'Year', Groups => { 2 => 'Time' } },
417
418 # I can't find documentation for the following tags in videos,
419 # but the tag ID's correspond to Microsoft property GUID+ID's
420 # References:
421 # http://msdn.microsoft.com/en-us/library/cc251929%28v=prot.10%29.aspx
422 # http://multi-rename-script.googlecode.com/svn-history/r4/trunk/plugins/ShellDetails/ShellDetails.ini
423 # I have observed only 1 so far:
424 '{2CBAA8F5-D81F-47CA-B17A-F8D822300131} 100' => {
425 Name => 'DateAcquired',
426 Groups => { 2 => 'Time' },
427 PrintConv => '$self->ConvertDateTime($val)',
428 },
429 # the following have not yet been observed...
430 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 10' => 'Name',
431 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 12' => 'Size',
432 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 4' => 'Type',
433 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 14' => {
434 Name => 'DateModified',
435 Groups => { 2 => 'Time' },
436 PrintConv => '$self->ConvertDateTime($val)',
437 },
438 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 15' => {
439 Name => 'DateCreated',
440 Groups => { 2 => 'Time' },
441 PrintConv => '$self->ConvertDateTime($val)',
442 },
443 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 16' => {
444 Name => 'DateAccessed',
445 Groups => { 2 => 'Time' },
446 PrintConv => '$self->ConvertDateTime($val)',
447 },
448 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 13' => 'Attributes',
449 '{D8C3986F-813B-449C-845D-87B95D674ADE} 2' => 'Status',
450 '{9B174B34-40FF-11D2-A27E-00C04FC30871} 4' => 'Owner',
451 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 4' => {
452 Name => 'Author',
453 Groups => { 2 => 'Author' },
454 },
455 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 2' => 'Title',
456 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 3' => 'Subject',
457 '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 2' => 'Category',
458 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 14' => 'Pages',
459 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 6' => 'Comments',
460 '{64440492-4C8B-11D1-8B70-080036B11A03} 11' => {
461 Name => 'Copyright',
462 Groups => { 2 => 'Author' },
463 },
464 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 2' => 'Artist',
465 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 4' => 'AlbumTitle',
466 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 5' => {
467 Name => 'Year',
468 Groups => { 2 => 'Time' },
469 },
470 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 7' => 'TrackNumber',
471 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 11' => 'Genre',
472 '{64440490-4C8B-11D1-8B70-080036B11A03} 3' => 'Duration',
473 '{64440490-4C8B-11D1-8B70-080036B11A03} 4' => 'Bitrate',
474 '{AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED} 2' => 'Protected',
475 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 272' => 'CameraModel',
476 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 36867' => {
477 Name => 'DatePictureTaken',
478 Groups => { 2 => 'Time' },
479 PrintConv => '$self->ConvertDateTime($val)',
480 },
481 '{6444048F-4C8B-11D1-8B70-080036B11A03} 13' => 'Dimensions',
482 '{6444048F-4C8B-11D1-8B70-080036B11A03} 3' => 'Untitled0',
483 '{6444048F-4C8B-11D1-8B70-080036B11A03} 4' => 'Untitled1',
484 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 2' => 'EpisodeName',
485 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 3' => 'ProgramDescription',
486 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 12' => 'Untitled2',
487 '{64440490-4C8B-11D1-8B70-080036B11A03} 6' => 'AudioSampleSize',
488 '{64440490-4C8B-11D1-8B70-080036B11A03} 5' => 'AudioSampleRate',
489 '{64440490-4C8B-11D1-8B70-080036B11A03} 7' => 'Channels',
490 '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 15' => 'Company',
491 '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 3' => 'Description',
492 '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4' => 'FileVersion',
493 '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 7' => 'ProductName',
494 '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8' => 'ProductVersion',
495 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 5' => 'Keywords',
496 '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 11' => 'Type',
497 '{6D24888F-4718-4BDA-AFED-EA0FB4386CD8} 100' => 'OfflineStatus',
498 '{A94688B6-7D9F-4570-A648-E3DFC0AB2B3F} 100' => 'OfflineAvailability',
499 '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 9' => 'PerceivedType',
500 '{1E3EE840-BC2B-476C-8237-2ACD1A839B22} 3' => 'Kinds',
501 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 36' => 'Conductors',
502 '{64440492-4C8B-11D1-8B70-080036B11A03} 9' => 'Rating',
503 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 271' => 'CameraMaker',
504 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 18' => 'ProgramName',
505 '{293CA35A-09AA-4DD2-B180-1FE245728A52} 100' => 'Duration',
506 '{BFEE9149-E3E2-49A7-A862-C05988145CEC} 100' => 'IsOnline',
507 '{315B9C8D-80A9-4EF9-AE16-8E746DA51D70} 100' => 'IsRecurring',
508 '{F6272D18-CECC-40B1-B26A-3911717AA7BD} 100' => 'Location',
509 '{D55BAE5A-3892-417A-A649-C6AC5AAAEAB3} 100' => 'OptionalAttendeeAddresses',
510 '{09429607-582D-437F-84C3-DE93A2B24C3C} 100' => 'OptionalAttendees',
511 '{744C8242-4DF5-456C-AB9E-014EFB9021E3} 100' => 'OrganizerAddress',
512 '{AAA660F9-9865-458E-B484-01BC7FE3973E} 100' => 'OrganizerName',
513 '{72FC5BA4-24F9-4011-9F3F-ADD27AFAD818} 100' => 'ReminderTime',
514 '{0BA7D6C3-568D-4159-AB91-781A91FB71E5} 100' => 'RequiredAttendeeAddresses',
515 '{B33AF30B-F552-4584-936C-CB93E5CDA29F} 100' => 'RequiredAttendees',
516 '{00F58A38-C54B-4C40-8696-97235980EAE1} 100' => 'Resources',
517 '{5BF396D4-5EB2-466F-BDE9-2FB3F2361D6E} 100' => 'Free-busyStatus',
518 '{9B174B35-40FF-11D2-A27E-00C04FC30871} 3' => 'TotalSize',
519 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 9' => 'AccountName',
520 '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 5' => 'Computer',
521 '{9AD5BADB-CEA7-4470-A03D-B84E51B9949E} 100' => 'Anniversary',
522 '{CD102C9C-5540-4A88-A6F6-64E4981C8CD1} 100' => 'AssistantsName',
523 '{9A93244D-A7AD-4FF8-9B99-45EE4CC09AF6} 100' => 'AssistantsPhone',
524 '{176DC63C-2688-4E89-8143-A347800F25E9} 47' => 'Birthday',
525 '{730FB6DD-CF7C-426B-A03F-BD166CC9EE24} 100' => 'BusinessAddress',
526 '{402B5934-EC5A-48C3-93E6-85E86A2D934E} 100' => 'BusinessCity',
527 '{B0B87314-FCF6-4FEB-8DFF-A50DA6AF561C} 100' => 'BusinessCountry-Region',
528 '{BC4E71CE-17F9-48D5-BEE9-021DF0EA5409} 100' => 'BusinessPOBox',
529 '{E1D4A09E-D758-4CD1-B6EC-34A8B5A73F80} 100' => 'BusinessPostalCode',
530 '{446F787F-10C4-41CB-A6C4-4D0343551597} 100' => 'BusinessStateOrProvince',
531 '{DDD1460F-C0BF-4553-8CE4-10433C908FB0} 100' => 'BusinessStreet',
532 '{91EFF6F3-2E27-42CA-933E-7C999FBE310B} 100' => 'BusinessFax',
533 '{56310920-2491-4919-99CE-EADB06FAFDB2} 100' => 'BusinessHomePage',
534 '{6A15E5A0-0A1E-4CD7-BB8C-D2F1B0C929BC} 100' => 'BusinessPhone',
535 '{BF53D1C3-49E0-4F7F-8567-5A821D8AC542} 100' => 'CallbackNumber',
536 '{8FDC6DEA-B929-412B-BA90-397A257465FE} 100' => 'CarPhone',
537 '{D4729704-8EF1-43EF-9024-2BD381187FD5} 100' => 'Children',
538 '{8589E481-6040-473D-B171-7FA89C2708ED} 100' => 'CompanyMainPhone',
539 '{FC9F7306-FF8F-4D49-9FB6-3FFE5C0951EC} 100' => 'Department',
540 '{F8FA7FA3-D12B-4785-8A4E-691A94F7A3E7} 100' => 'E-mailAddress',
541 '{38965063-EDC8-4268-8491-B7723172CF29} 100' => 'E-mail2',
542 '{644D37B4-E1B3-4BAD-B099-7E7C04966ACA} 100' => 'E-mail3',
543 '{84D8F337-981D-44B3-9615-C7596DBA17E3} 100' => 'E-mailList',
544 '{CC6F4F24-6083-4BD4-8754-674D0DE87AB8} 100' => 'E-mailDisplayName',
545 '{F1A24AA7-9CA7-40F6-89EC-97DEF9FFE8DB} 100' => 'FileAs',
546 '{14977844-6B49-4AAD-A714-A4513BF60460} 100' => 'FirstName',
547 '{635E9051-50A5-4BA2-B9DB-4ED056C77296} 100' => 'FullName',
548 '{3C8CEE58-D4F0-4CF9-B756-4E5D24447BCD} 100' => 'Gender',
549 '{176DC63C-2688-4E89-8143-A347800F25E9} 70' => 'GivenName',
550 '{5DC2253F-5E11-4ADF-9CFE-910DD01E3E70} 100' => 'Hobbies',
551 '{98F98354-617A-46B8-8560-5B1B64BF1F89} 100' => 'HomeAddress',
552 '{176DC63C-2688-4E89-8143-A347800F25E9} 65' => 'HomeCity',
553 '{08A65AA1-F4C9-43DD-9DDF-A33D8E7EAD85} 100' => 'HomeCountry-Region',
554 '{7B9F6399-0A3F-4B12-89BD-4ADC51C918AF} 100' => 'HomePOBox',
555 '{8AFCC170-8A46-4B53-9EEE-90BAE7151E62} 100' => 'HomePostalCode',
556 '{C89A23D0-7D6D-4EB8-87D4-776A82D493E5} 100' => 'HomeStateOrProvince',
557 '{0ADEF160-DB3F-4308-9A21-06237B16FA2A} 100' => 'HomeStreet',
558 '{660E04D6-81AB-4977-A09F-82313113AB26} 100' => 'HomeFax',
559 '{176DC63C-2688-4E89-8143-A347800F25E9} 20' => 'HomePhone',
560 '{D68DBD8A-3374-4B81-9972-3EC30682DB3D} 100' => 'IMAddresses',
561 '{F3D8F40D-50CB-44A2-9718-40CB9119495D} 100' => 'Initials',
562 '{176DC63C-2688-4E89-8143-A347800F25E9} 6' => 'JobTitle',
563 '{97B0AD89-DF49-49CC-834E-660974FD755B} 100' => 'Label',
564 '{8F367200-C270-457C-B1D4-E07C5BCD90C7} 100' => 'LastName',
565 '{C0AC206A-827E-4650-95AE-77E2BB74FCC9} 100' => 'MailingAddress',
566 '{176DC63C-2688-4E89-8143-A347800F25E9} 71' => 'MiddleName',
567 '{176DC63C-2688-4E89-8143-A347800F25E9} 35' => 'CellPhone',
568 '{176DC63C-2688-4E89-8143-A347800F25E9} 74' => 'Nickname',
569 '{176DC63C-2688-4E89-8143-A347800F25E9} 7' => 'OfficeLocation',
570 '{508161FA-313B-43D5-83A1-C1ACCF68622C} 100' => 'OtherAddress',
571 '{6E682923-7F7B-4F0C-A337-CFCA296687BF} 100' => 'OtherCity',
572 '{8F167568-0AAE-4322-8ED9-6055B7B0E398} 100' => 'OtherCountry-Region',
573 '{8B26EA41-058F-43F6-AECC-4035681CE977} 100' => 'OtherPOBox',
574 '{95C656C1-2ABF-4148-9ED3-9EC602E3B7CD} 100' => 'OtherPostalCode',
575 '{71B377D6-E570-425F-A170-809FAE73E54E} 100' => 'OtherStateOrProvince',
576 '{FF962609-B7D6-4999-862D-95180D529AEA} 100' => 'OtherStreet',
577 '{D6304E01-F8F5-4F45-8B15-D024A6296789} 100' => 'Pager',
578 '{176DC63C-2688-4E89-8143-A347800F25E9} 69' => 'PersonalTitle',
579 '{C8EA94F0-A9E3-4969-A94B-9C62A95324E0} 100' => 'City',
580 '{E53D799D-0F3F-466E-B2FF-74634A3CB7A4} 100' => 'Country-Region',
581 '{DE5EF3C7-46E1-484E-9999-62C5308394C1} 100' => 'POBox',
582 '{18BBD425-ECFD-46EF-B612-7B4A6034EDA0} 100' => 'PostalCode',
583 '{F1176DFE-7138-4640-8B4C-AE375DC70A6D} 100' => 'StateOrProvince',
584 '{63C25B20-96BE-488F-8788-C09C407AD812} 100' => 'Street',
585 '{176DC63C-2688-4E89-8143-A347800F25E9} 48' => 'PrimaryE-mail',
586 '{176DC63C-2688-4E89-8143-A347800F25E9} 25' => 'PrimaryPhone',
587 '{7268AF55-1CE4-4F6E-A41F-B6E4EF10E4A9} 100' => 'Profession',
588 '{9D2408B6-3167-422B-82B0-F583B7A7CFE3} 100' => 'Spouse',
589 '{176DC63C-2688-4E89-8143-A347800F25E9} 73' => 'Suffix',
590 '{AAF16BAC-2B55-45E6-9F6D-415EB94910DF} 100' => 'TTY-TTDPhone',
591 '{C554493C-C1F7-40C1-A76C-EF8C0614003E} 100' => 'Telex',
592 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 18' => 'Webpage',
593 '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 27' => 'Status',
594 '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 26' => 'ContentType',
595 '{43F8D7B7-A444-4F87-9383-52271C9B915C} 100' => {
596 Name => 'DateArchived',
597 Groups => { 2 => 'Time' },
598 PrintConv => '$self->ConvertDateTime($val)',
599 },
600 '{72FAB781-ACDA-43E5-B155-B2434F85E678} 100' => {
601 Name => 'DateCompleted',
602 Groups => { 2 => 'Time' },
603 PrintConv => '$self->ConvertDateTime($val)',
604 },
605 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 18258' => {
606 Name => 'DateImported',
607 Groups => { 2 => 'Time' },
608 PrintConv => '$self->ConvertDateTime($val)',
609 },
610 '{276D7BB0-5B34-4FB0-AA4B-158ED12A1809} 100' => 'ClientID',
611 '{F334115E-DA1B-4509-9B3D-119504DC7ABB} 100' => 'Contributors',
612 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 11' => 'LastPrinted',
613 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 13' => {
614 Name => 'DateLastSaved',
615 Groups => { 2 => 'Time' },
616 PrintConv => '$self->ConvertDateTime($val)',
617 },
618 '{1E005EE6-BF27-428B-B01C-79676ACD2870} 100' => 'Division',
619 '{E08805C8-E395-40DF-80D2-54F0D6C43154} 100' => 'DocumentID',
620 '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 7' => 'Slides',
621 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 10' => 'TotalEditingTime',
622 '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 15' => 'WordCount',
623 '{3F8472B5-E0AF-4DB2-8071-C53FE76AE7CE} 100' => 'DueDate',
624 '{C75FAA05-96FD-49E7-9CB4-9F601082D553} 100' => 'EndDate',
625 '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 12' => 'FileCount',
626 '{41CF5AE0-F75A-4806-BD87-59C7D9248EB9} 100' => 'WindowsFileName',
627 '{67DF94DE-0CA7-4D6F-B792-053A3E4F03CF} 100' => 'FlagColor',
628 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 12' => 'FlagStatus',
629 '{9B174B35-40FF-11D2-A27E-00C04FC30871} 2' => 'SpaceFree',
630 '{6444048F-4C8B-11D1-8B70-080036B11A03} 7' => 'BitDepth',
631 '{6444048F-4C8B-11D1-8B70-080036B11A03} 5' => 'HorizontalResolution',
632 '{6444048F-4C8B-11D1-8B70-080036B11A03} 6' => 'VerticalResolution',
633 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 11' => 'Importance',
634 '{F23F425C-71A1-4FA8-922F-678EA4A60408} 100' => 'IsAttachment',
635 '{5CDA5FC8-33EE-4FF3-9094-AE7BD8868C4D} 100' => 'IsDeleted',
636 '{5DA84765-E3FF-4278-86B0-A27967FBDD03} 100' => 'HasFlag',
637 '{A6F360D2-55F9-48DE-B909-620E090A647C} 100' => 'IsCompleted',
638 '{346C8BD1-2E6A-4C45-89A4-61B78E8E700F} 100' => 'Incomplete',
639 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 10' => 'ReadStatus',
640 '{EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902} 100' => 'Shared',
641 '{D0A04F0A-462A-48A4-BB2F-3706E88DBD7D} 100' => {
642 Name => 'Creator',
643 Groups => { 2 => 'Author' },
644 },
645 '{F7DB74B4-4287-4103-AFBA-F1B13DCD75CF} 100' => {
646 Name => 'Date',
647 Groups => { 2 => 'Time' },
648 PrintConv => '$self->ConvertDateTime($val)',
649 },
650 '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 2' => 'FolderName',
651 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 6' => 'FolderPath',
652 '{DABD30ED-0043-4789-A7F8-D013A4736622} 100' => 'Folder',
653 '{D4D0AA16-9948-41A4-AA85-D97FF9646993} 100' => 'Participants',
654 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 7' => 'Path',
655 '{DEA7C82C-1D89-4A66-9427-A4E3DEBABCB1} 100' => 'ContactNames',
656 '{95BEB1FC-326D-4644-B396-CD3ED90E6DDF} 100' => 'EntryType',
657 '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 28' => 'Language',
658 '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 23' => {
659 Name => 'DateVisited',
660 Groups => { 2 => 'Time' },
661 PrintConv => '$self->ConvertDateTime($val)',
662 },
663 '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 21' => 'Description',
664 '{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25} 3' => 'LinkStatus',
665 '{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25} 2' => 'LinkTarget',
666 '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 2' => 'URL',
667 '{2E4B640D-5019-46D8-8881-55414CC5CAA0} 100' => 'MediaCreated',
668 '{DE41CC29-6971-4290-B472-F59F2E2F31E2} 100' => {
669 Name => 'DateReleased',
670 Groups => { 2 => 'Time' },
671 PrintConv => '$self->ConvertDateTime($val)',
672 },
673 '{64440492-4C8B-11D1-8B70-080036B11A03} 36' => 'EncodedBy',
674 '{64440492-4C8B-11D1-8B70-080036B11A03} 22' => 'Producers',
675 '{64440492-4C8B-11D1-8B70-080036B11A03} 30' => 'Publisher',
676 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 38' => 'Subtitle',
677 '{64440492-4C8B-11D1-8B70-080036B11A03} 34' => 'UserWebURL',
678 '{64440492-4C8B-11D1-8B70-080036B11A03} 23' => 'Writers',
679 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 21' => 'Attachments',
680 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 2' => 'BccAddresses',
681 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 3' => 'BccNames',
682 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 4' => 'CcAddresses',
683 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 5' => 'CcNames',
684 '{DC8F80BD-AF1E-4289-85B6-3DFC1B493992} 100' => 'ConversationID',
685 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 20' => {
686 Name => 'DateReceived',
687 Groups => { 2 => 'Time' },
688 PrintConv => '$self->ConvertDateTime($val)',
689 },
690 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 19' => {
691 Name => 'DateSent',
692 Groups => { 2 => 'Time' },
693 PrintConv => '$self->ConvertDateTime($val)',
694 },
695 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 13' => 'FromAddresses',
696 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 14' => 'FromNames',
697 '{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4} 8' => 'HasAttachments',
698 '{0BE1C8E7-1981-4676-AE14-FDD78F05A6E7} 100' => 'SenderAddress',
699 '{0DA41CFA-D224-4A18-AE2F-596158DB4B3A} 100' => 'SenderName',
700 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 15' => 'Store',
701 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 16' => 'ToAddresses',
702 '{BCCC8A3C-8CEF-42E5-9B1C-C69079398BC7} 100' => 'ToDoTitle',
703 '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 17' => 'ToNames',
704 '{FDF84370-031A-4ADD-9E91-0D775F1C6605} 100' => 'Mileage',
705 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 13' => 'AlbumArtist',
706 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 35' => 'Beats-per-minute',
707 '{64440492-4C8B-11D1-8B70-080036B11A03} 19' => 'Composers',
708 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 34' => 'InitialKey',
709 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 39' => 'Mood',
710 '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 37' => 'PartOfSet',
711 '{64440492-4C8B-11D1-8B70-080036B11A03} 31' => 'Period',
712 '{4776CAFA-BCE4-4CB1-A23E-265E76D8EB11} 100' => 'Color',
713 '{64440492-4C8B-11D1-8B70-080036B11A03} 21' => 'ParentalRating',
714 '{10984E0A-F9F2-4321-B7EF-BAF195AF4319} 100' => 'ParentalRatingReason',
715 '{9B174B35-40FF-11D2-A27E-00C04FC30871} 5' => 'SpaceUsed',
716 '{D35F743A-EB2E-47F2-A286-844132CB1427} 100' => 'ExifVersion',
717 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 18248' => 'Event',
718 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37380' => 'ExposureBias',
719 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 34850' => 'ExposureProgram',
720 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 33434' => 'ExposureTime',
721 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 33437' => 'F-stop',
722 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37385' => 'FlashMode',
723 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37386' => 'FocalLength',
724 '{A0E74609-B84D-4F49-B860-462BD9971F98} 100' => 'FocalLength35mm',
725 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 34855' => 'ISOSpeed',
726 '{E6DDCAF7-29C5-4F0A-9A68-D19412EC7090} 100' => 'LensMaker',
727 '{E1277516-2B5F-4869-89B1-2E585BD38B7A} 100' => 'LensModel',
728 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37384' => 'LightSource',
729 '{08F6D7C2-E3F2-44FC-AF1E-5AA5C81A2D3E} 100' => 'MaxAperture',
730 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37383' => 'MeteringMode',
731 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 274' => 'Orientation',
732 '{6D217F6D-3F6A-4825-B470-5F03CA2FBE9B} 100' => 'ProgramMode',
733 '{49237325-A95A-4F67-B211-816B2D45D2E0} 100' => 'Saturation',
734 '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37382' => 'SubjectDistance',
735 '{EE3D3D8A-5381-4CFA-B13B-AAF66B5F4EC9} 100' => 'WhiteBalance',
736 '{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4} 5' => 'Priority',
737 '{39A7F922-477C-48DE-8BC8-B28441E342E3} 100' => 'Project',
738 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 7' => 'ChannelNumber',
739 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 12' => 'ClosedCaptioning',
740 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 13' => 'Rerun',
741 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 14' => 'SAP',
742 '{4684FE97-8765-4842-9C13-F006447B178C} 100' => 'BroadcastDate',
743 '{A5477F61-7A82-4ECA-9DDE-98B69B2479B3} 100' => 'RecordingTime',
744 '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 5' => 'StationCallSign',
745 '{1B5439E7-EBA1-4AF8-BDD7-7AF1D4549493} 100' => 'StationName',
746 '{560C36C0-503A-11CF-BAA1-00004C752A9A} 2' => 'AutoSummary',
747 '{560C36C0-503A-11CF-BAA1-00004C752A9A} 3' => 'Summary',
748 '{49691C90-7E17-101A-A91C-08002B2ECDA9} 3' => 'SearchRanking',
749 '{F8D3F6AC-4874-42CB-BE59-AB454B30716A} 100' => 'Sensitivity',
750 '{EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902} 200' => 'SharedWith',
751 '{668CDFA5-7A1B-4323-AE4B-E527393A1D81} 100' => 'Source',
752 '{48FD6EC8-8A12-4CDF-A03E-4EC5A511EDDE} 100' => 'StartDate',
753 '{D37D52C6-261C-4303-82B3-08B926AC6F12} 100' => 'BillingInformation',
754 '{084D8A0A-E6D5-40DE-BF1F-C8820E7C877C} 100' => 'Complete',
755 '{08C7CC5F-60F2-4494-AD75-55E3E0B5ADD0} 100' => 'TaskOwner',
756 '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 14' => 'TotalFileSize',
757 '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 9' => 'LegalTrademarks',
758 '{64440491-4C8B-11D1-8B70-080036B11A03} 10' => 'VideoCompression',
759 '{64440492-4C8B-11D1-8B70-080036B11A03} 20' => 'Directors',
760 '{64440491-4C8B-11D1-8B70-080036B11A03} 8' => 'DataRate',
761 '{64440491-4C8B-11D1-8B70-080036B11A03} 4' => 'FrameHeight',
762 '{64440491-4C8B-11D1-8B70-080036B11A03} 6' => 'FrameRate',
763 '{64440491-4C8B-11D1-8B70-080036B11A03} 3' => 'FrameWidth',
764 '{64440491-4C8B-11D1-8B70-080036B11A03} 43' => 'TotalBitrate',
765);
766
767#------------------------------------------------------------------------------
768# Extract information from Xtra MP4 atom
769# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
770# Returns: 1 on success
771# Reference: http://code.google.com/p/mp4v2/ [since removed from trunk]
772sub ProcessXtra($$$)
773{
774 my ($et, $dirInfo, $tagTablePtr) = @_;
775 my $dataPt = $$dirInfo{DataPt};
776 my $dataPos = $$dirInfo{Base} || 0;
777 my $dataLen = $$dirInfo{DataLen};
778 my $pos = 0;
779 $et->VerboseDir('Xtra', 0, $dataLen);
780 for (;;) {
781 last if $pos + 4 > $dataLen;
782 my $size = Get32u($dataPt, $pos); # (includes $size word)
783 last if $size < 8 or $pos + $size > $dataLen;
784 my $tagLen = Get32u($dataPt, $pos + 4);
785 last if $tagLen + 18 > $size;
786 my $tag = substr($$dataPt, $pos + 8, $tagLen);
787 # (version flags according to the reference, but looks more like a count - PH)
788 my $count = Get32u($dataPt, $pos + $tagLen + 8);
789 my ($i, $valPos, $valLen, $valType, $val, $format, @vals);
790 # point to start of first value (after 4-byte length and 2-byte type)
791 $valPos = $pos + $tagLen + 18;
792 for ($i=0; ;) {
793 # (stored value includes size of $valLen and $valType, so subtract 6)
794 $valLen = Get32u($dataPt, $valPos - 6) - 6;
795 my $more = $pos + $size - $valPos - $valLen;
796 last if $more < 0;
797 $valType = Get16u($dataPt, $valPos - 2);
798 $val = substr($$dataPt, $valPos, $valLen);
799 # Note: all dumb Microsoft values are little-endian inside a big-endian-format file
800 SetByteOrder('II');
801 if ($valType == 8) {
802 $format = 'Unicode';
803 $val = $et->Decode($val, 'UCS2');
804 } elsif ($valType == 19 and $valLen == 8) {
805 $format = 'int64u';
806 $val = Get64u(\$val, 0);
807 } elsif ($valType == 21 and $valLen == 8) {
808 $format = 'date';
809 $val = Get64u(\$val, 0);
810 # convert time from 100 ns intervals since Jan 1, 1601
811 $val = $val * 1e-7 - 11644473600 if $val;
812 # (the Nikon S100 uses UTC timezone, same as ASF - PH)
813 $val = Image::ExifTool::ConvertUnixTime($val) . 'Z';
814 } elsif ($valType == 72 and $valLen == 16) {
815 $format = 'GUID';
816 $val = uc unpack('H*',pack('NnnNN',unpack('VvvNN',$val)));
817 $val =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/;
818 } elsif ($valType == 65 && $valLen > 4) { #PH (empirical)
819 $format = 'variant';
820 require Image::ExifTool::FlashPix;
821 my $vPos = $valPos; # (necessary because ReadFPXValue updates this)
822 # read entry as a VT_VARIANT (use FlashPix module for this)
823 $val = Image::ExifTool::FlashPix::ReadFPXValue($et, $dataPt, $vPos,
824 Image::ExifTool::FlashPix::VT_VARIANT(), $valPos+$valLen, 1);
825 } else {
826 $format = "Unknown($valType)";
827 }
828 SetByteOrder('MM'); # back to native QuickTime byte ordering
829 last if ++$i >= $count or $more < 6;
830 push @vals, $val;
831 undef $val;
832 $valPos += $valLen + 6; # step to next value
833 }
834 if (@vals) {
835 push @vals, $val if defined $val;
836 $val = \@vals;
837 $valPos = $pos + $tagLen + 18;
838 $valLen = $size - 18 - $tagLen;
839 }
840 if ($tagLen > 0 and $valLen > 0) {
841 my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
842 unless ($tagInfo) {
843 # generate tag information for unrecognized tags
844 my $name = $tag;
845 $name =~ s{^WM/}{};
846 # $name =~ tr/-_A-Za-z0-9//dc;
847 if ($name =~ /^[-\w]+$/) {
848 $tagInfo = { Name => ucfirst($name) };
849 AddTagToTable($tagTablePtr, $tag, $tagInfo);
850 $et->VPrint(0, $$et{INDENT}, "[adding Microsoft:$tag]\n");
851 }
852 }
853 $et->HandleTag($tagTablePtr, $tag, $val,
854 TagInfo => $tagInfo,
855 DataPt => $dataPt,
856 DataPos => $dataPos,
857 Start => $valPos,
858 Size => $valLen,
859 Format => $format,
860 Extra => " count=$count type=$valType",
861 );
862 }
863 $pos += $size; # step to next entry
864 }
865 return 1;
866}
867
8681; # end
869
870__END__
871
872=head1 NAME
873
874Image::ExifTool::Microsoft - Definitions for custom Microsoft tags
875
876=head1 SYNOPSIS
877
878This module is used by Image::ExifTool
879
880=head1 DESCRIPTION
881
882This module contains definitions required by Image::ExifTool to interpret
883Microsoft-specific EXIF and XMP tags.
884
885=head1 AUTHOR
886
887Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
888
889This library is free software; you can redistribute it and/or modify it
890under the same terms as Perl itself.
891
892=head1 REFERENCES
893
894=over 4
895
896=item L<http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm>
897
898=back
899
900=head1 SEE ALSO
901
902L<Image::ExifTool::TagNames/Microsoft Tags>,
903L<Image::ExifTool(3pm)|Image::ExifTool>
904
905=cut
906
Note: See TracBrowser for help on using the repository browser.