- Timestamp:
- 2021-02-26T19:39:51+13:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/perllib/cpan/Image/ExifTool/Microsoft.pm
r24107 r34921 5 5 # 6 6 # Revisions: 2010/10/01 - P. Harvey Created 7 # 2011/10/05 - PH Added ProcessXtra() 7 8 # 8 9 # References: 1) http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm … … 13 14 use strict; 14 15 use vars qw($VERSION); 16 use Image::ExifTool qw(:DataAccess :Utils); 15 17 use Image::ExifTool::XMP; 16 18 17 $VERSION = '1.03'; 19 $VERSION = '1.20'; 20 21 sub ProcessXtra($$$); 18 22 19 23 # tags written by Microsoft HDView (ref 1) … … 71 75 Microsoft Photo 1.0 schema XMP tags. This is likely not a complete list, 72 76 but represents tags which have been observed in sample images. The actual 73 namespace prefix is "MicrosoftPhoto", but ExifTool shortens this to74 "XMP-microsoft" in thefamily 1 group name.77 namespace prefix is "MicrosoftPhoto", but ExifTool shortens this in the 78 family 1 group name. 75 79 }, 76 80 CameraSerialNumber => { }, … … 81 85 LastKeywordXMP => { List => 'Bag' }, 82 86 LensManufacturer => { }, 83 LensModel => { },87 LensModel => { Avoid => 1 }, 84 88 Rating => { 85 89 Name => 'RatingPercent', 86 90 Notes => q{ 87 normalRating values of 1,2,3,4 and 5 stars correspond to RatingPercent91 XMP-xmp:Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent 88 92 values of 1,25,50,75 and 99 respectively 89 93 }, 90 94 }, 95 CreatorAppId => { Name => 'CreatorAppID' }, 96 CreatorOpenWithUIOptions => { }, 97 ItemSubType => { }, 91 98 ); 92 99 … … 122 129 PanoramicStitchTheta0 => { Writable => 'real' }, 123 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 => { }, 124 140 ); 125 141 126 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) 127 144 my %sRegions = ( 128 STRUCT_NAME => ' Regions',145 STRUCT_NAME => 'Microsoft Regions', 129 146 NAMESPACE => 'MPReg', 130 Rectangle => { }, 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 => { }, 131 153 PersonDisplayName => { }, 154 PersonEmailDigest => { }, 155 PersonLiveIdCID => { }, # (see https://exiftool.org/forum/index.php?topic=4274.msg20368#msg20368) 156 PersonSourceID => { }, 132 157 ); 133 158 %Image::ExifTool::Microsoft::MP = ( … … 143 168 Name => 'RegionInfoMP', 144 169 Struct => { 145 STRUCT_NAME => ' RegionInfoMP',170 STRUCT_NAME => 'Microsoft RegionInfo', 146 171 NAMESPACE => 'MPRI', 147 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 }, 148 180 }, 149 181 }, 150 RegionInfoRegionsRectangle => { 151 Name => 'RegionRectangle', 152 Flat => 1, 153 }, 154 RegionInfoRegionsPersonDisplayName => { 155 Name => 'RegionPersonDisplayName', 156 Flat => 1, 157 }, 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' }, 158 191 ); 159 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] 772 sub 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 } 160 867 161 868 1; # end … … 178 885 =head1 AUTHOR 179 886 180 Copyright 2003-20 11, Phil Harvey (phil at owl.phy.queensu.ca)887 Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com) 181 888 182 889 This library is free software; you can redistribute it and/or modify it
Note:
See TracChangeset
for help on using the changeset viewer.