exiftool-vendored.pl 13.41.0 → 13.43.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.
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
49
49
  use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
 
52
- $VERSION = '3.23';
52
+ $VERSION = '3.24';
53
53
 
54
54
  sub ProcessMOV($$;$);
55
55
  sub ProcessKeys($$$);
@@ -494,6 +494,7 @@ my %qtFlags = ( #12
494
494
  ispe => 1, # primary item must have an ispe and pixi, so no need to inherit these
495
495
  pixi => 1,
496
496
  irot => 1, # (tmap may have a different irot)
497
+ imir => 1, # (ditto)
497
498
  pasp => 1, # (NC)
498
499
  hvcC => 2, # (hvcC is a property of hvc1 referred to by primary grid)
499
500
  colr => 2, # (colr is a property of primary grid or hvc1 referred to by primary)
@@ -2833,6 +2834,7 @@ my %userDefined = (
2833
2834
  'xml ' => {
2834
2835
  Name => 'XML',
2835
2836
  Flags => [ 'Binary', 'Protected' ],
2837
+ BlockExtract => 1,
2836
2838
  SubDirectory => {
2837
2839
  TagTable => 'Image::ExifTool::XMP::XML',
2838
2840
  IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm'
@@ -2883,6 +2885,7 @@ my %userDefined = (
2883
2885
  },
2884
2886
  idat => {
2885
2887
  Name => 'MetaImageSize', #PH (NC)
2888
+ Condition => '$$self{FileType} eq "HEIC"',
2886
2889
  Format => 'int16u',
2887
2890
  # (don't know what the first two numbers are for)
2888
2891
  PrintConv => '$val =~ s/^(\d+) (\d+) (\d+) (\d+)/${3}x$4/; $val',
@@ -2968,7 +2971,6 @@ my %userDefined = (
2968
2971
  Condition => '$$valPt =~ /^(prof|rICC)/',
2969
2972
  # (don't do this because Apple Preview won't display an HEIC with a 0-length profile)
2970
2973
  # Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
2971
- Permanent => 1,
2972
2974
  SubDirectory => {
2973
2975
  TagTable => 'Image::ExifTool::ICC_Profile::Main',
2974
2976
  Start => 4,
@@ -2989,6 +2991,22 @@ my %userDefined = (
2989
2991
  3 => 'Rotate 90 CW',
2990
2992
  },
2991
2993
  },
2994
+ imir => { # (applied before rotation)
2995
+ Name => 'Mirroring',
2996
+ Format => 'int8u',
2997
+ # yes, I realize this making this writable is useless without the ability to
2998
+ # create/delete this box because it is the existence of this box that is
2999
+ # significant. (The people who wrote the specification succeeded in making
3000
+ # this as complicated as possible because creating/deleting boxes from the
3001
+ # item property container is a real pain in the ass!)
3002
+ Writable => 'int8u',
3003
+ Protected => 1,
3004
+ PrintConv => {
3005
+ 0 => 'Vertical',
3006
+ 1 => 'Horizontal',
3007
+ # (it would have been great if the specification allowed for a "no mirroring" value)
3008
+ },
3009
+ },
2992
3010
  ispe => {
2993
3011
  Name => 'ImageSpatialExtent',
2994
3012
  Condition => '$$valPt =~ /^\0{4}/', # (version/flags == 0/0)
@@ -6620,7 +6638,7 @@ my %userDefined = (
6620
6638
  This directory contains a list of key names which are used to decode tags
6621
6639
  written by the "mdta" handler. Also in this table are a few tags found in
6622
6640
  timed metadata that are not yet writable by ExifTool. The prefix of
6623
- "com.apple.quicktime." has been removed from the TagID's below. These tags
6641
+ "com.apple.quicktime." has been removed from most TagID's below. These tags
6624
6642
  support alternate languages in the same way as the
6625
6643
  L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags. Note
6626
6644
  that by default,
@@ -6714,14 +6732,17 @@ my %userDefined = (
6714
6732
  'encoder' => { }, # forum15418 (written by ffmpeg)
6715
6733
  #
6716
6734
  # the following tags aren't in the com.apple.quicktime namespace:
6735
+ # (Note: must add any non-'com' prefix to %fullKeysID in WriteQuickTime.pl
6736
+ # to avoid adding the 'com.apple.quicktime' prefix when writing)
6717
6737
  #
6718
6738
  'com.android.version' => 'AndroidVersion',
6719
6739
  'com.android.capture.fps' => { Name => 'AndroidCaptureFPS', Writable => 'float' },
6720
6740
  'com.android.manufacturer' => 'AndroidMake',
6721
6741
  'com.android.model' => 'AndroidModel',
6722
6742
  'com.xiaomi.preview_video_cover' => { Name => 'XiaomiPreviewVideoCover', Writable => 'int32s' },
6723
- 'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
6724
6743
  'com.xiaomi.hdr10' => { Name => 'XiaomiHDR10', Writable => 'int32s' },
6744
+ 'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
6745
+ 'samsung.android.utc_offset' => { Name => 'AndroidTimeZone', Groups => { 2 => 'Time' } },
6725
6746
  #
6726
6747
  # also seen
6727
6748
  #
@@ -9774,6 +9795,7 @@ sub ProcessKeys($$$)
9774
9795
  $name = "Tag_$name" if length $name < 2;
9775
9796
  $newInfo = { Name => $name, Groups => { 1 => 'Keys' } };
9776
9797
  $msg = ' (Unknown)';
9798
+ $et->VPrint(0, $$et{INDENT}, "[adding Keys:$tag]\n");
9777
9799
  }
9778
9800
  # substitute this tag in the ItemList table with the given index
9779
9801
  my $id = $$et{KeysCount} . '.' . $index;
@@ -211,7 +211,7 @@ my %insvLimit = (
211
211
  },
212
212
  },{
213
213
  Name => 'gpmd_Wolfbox', # Wolfbox G900 Dashcam and Redtiger F9 4K
214
- Condition => '$$valPt =~ /^.{136}0{16}(HYTH|XXXX)/s',
214
+ Condition => '$$valPt =~ /^.{136}(0{16}[A-Z]{4}|https:\/\/www.redtiger\0)/s',
215
215
  SubDirectory => {
216
216
  TagTable => 'Image::ExifTool::QuickTime::Stream',
217
217
  ProcessProc => \&ProcessWolfbox,
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.72';
33
+ $VERSION = '1.73';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -851,6 +851,7 @@ my %code2charset = (
851
851
  Name => 'DateCreated',
852
852
  Groups => { 2 => 'Time' },
853
853
  ValueConv => '$_=$val; s/-/:/g; $_',
854
+ PrintConv => '$self->ConvertDateTime($val)',
854
855
  },
855
856
  ICRP => 'Cropped',
856
857
  IDIM => 'Dimensions',
@@ -21,8 +21,9 @@ use strict;
21
21
  use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
+ use Image::ExifTool::JSON;
24
25
 
25
- $VERSION = '1.58';
26
+ $VERSION = '1.60';
26
27
 
27
28
  sub WriteSTMN($$$);
28
29
  sub ProcessINFO($$$);
@@ -1277,7 +1278,15 @@ my %formatMinMax = (
1277
1278
  # 0x0b51-name - seen 'Intelligent_PhotoEditor_Data' #forum16086
1278
1279
  # 0x0b60-name - seen 'UltraWide_PhotoEditor_Data' #forum16086
1279
1280
  # 0x0b90-name - seen 'Document_Scan_Info' #forum16086
1280
- # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap'
1281
+ # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap','PhotoEditor_Re_Edit_Data'
1282
+ '0x0ba1' => [{
1283
+ Name => 'ReEditData',
1284
+ Condition => '$$self{SamsungTagName} eq "PhotoEditor_Re_Edit_Data"',
1285
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ReEditData' },
1286
+ },{
1287
+ Name => 'OriginalPathHashKey',
1288
+ Condition => '$$self{SamsungTagName} eq "Original_Path_Hash_Key"',
1289
+ }],
1281
1290
  # 0x0ba2-name - seen 'Copy_Available_Edit_Info' #forum16086
1282
1291
  # 0x0bc0-name - seen 'Single_Relighting_Bokeh_Info' #forum16086
1283
1292
  # 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
@@ -1300,12 +1309,22 @@ my %formatMinMax = (
1300
1309
  '0x0d91' => { #forum16086/16242
1301
1310
  Name => 'PEg_Info',
1302
1311
  Description => 'PEg Info',
1303
- SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' },
1312
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PEgInfo' },
1304
1313
  },
1305
1314
  # 0x0da1-name - seen 'Captured_App_Info' #forum16086
1306
1315
  # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
1307
1316
  # 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
1317
+ # 0x0c61-name - seen 'Camera_Capture_Mode_Info'
1318
+ # 0x0c61 - seen '1'
1308
1319
  # 0x0c81-name - seen 'Watermark_Info'
1320
+ # 0x0ce1-name - seen 'Gallery_DC_Data'
1321
+ # 0x0ce1 - seen '0,109,2,19010102,4000,3000,0,0,0,0;116.284004;1.0'
1322
+ # 0x0e41-name - seen 'Video_Edited_UTC_Offset'
1323
+ # 0x0e41 - seen '+0800'
1324
+ '0x0e41' => {
1325
+ Name => 'VideoEditedTimeZone',
1326
+ Groups => { 2 => 'Time' },
1327
+ },
1309
1328
  );
1310
1329
 
1311
1330
  # DualShot Extra Info (ref PH)
@@ -1380,6 +1399,113 @@ my %formatMinMax = (
1380
1399
  perfMode => { },
1381
1400
  );
1382
1401
 
1402
+ %Image::ExifTool::Samsung::ReEditData = (
1403
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1404
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1405
+ VARS => { LONG_TAGS => 2 },
1406
+ originalPath => { },
1407
+ representativeFrameLoc => { },
1408
+ startMotionVideo => { },
1409
+ endMotionVideo => { },
1410
+ isMotionVideoMute => { },
1411
+ isTrimMotionVideo => { },
1412
+ clipInfoValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ClipInfo' } },
1413
+ toneValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ToneInfo' } },
1414
+ effectValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::EffectInfo' } },
1415
+ portraitEffectValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PortraitEffect' } },
1416
+ isBlending => { },
1417
+ isNotReEdit => { },
1418
+ sepVersion => { Name => 'SEPVersion' },
1419
+ ndeVersion => { Name => 'NDEVersion' },
1420
+ reSize => { },
1421
+ isScaleAI => { },
1422
+ rotation => { },
1423
+ adjustmentValue => { },
1424
+ isApplyShapeCorrection => { },
1425
+ isNewReEditOnly => { },
1426
+ isDecoReEditOnly => { },
1427
+ isAIFilterReEditOnly=> { },
1428
+ );
1429
+
1430
+ %Image::ExifTool::Samsung::ClipInfo = (
1431
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1432
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1433
+ mCenterX => { Name => 'ClipCenterX' },
1434
+ mCenterY => { Name => 'ClipCenterY' },
1435
+ mWidth => { Name => 'ClipWidth' },
1436
+ mHeight => { Name => 'ClipHeight' },
1437
+ mRotation => { Name => 'ClipRotation' },
1438
+ mRotate => { Name => 'ClipRotate' },
1439
+ mHFlip => { Name => 'ClipHFlip' },
1440
+ mVFlip => { Name => 'ClipVFlip' },
1441
+ mRotationEffect => { Name => 'ClipRotationEffect' },
1442
+ mRotateEffect => { Name => 'ClipRotateEffect' },
1443
+ mHFlipEffect => { Name => 'ClipHFlipEffect' },
1444
+ mVFlipEffect => { Name => 'ClipVFlipEffect' },
1445
+ mHozPerspective => { Name => 'ClipHozPerspective' },
1446
+ mVerPerspective => { Name => 'ClipVerPerspective' },
1447
+ );
1448
+
1449
+ %Image::ExifTool::Samsung::ToneInfo = (
1450
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1451
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1452
+ brightness => { },
1453
+ exposure => { },
1454
+ contrast => { },
1455
+ saturation => { },
1456
+ hue => { },
1457
+ wbMode => { Name => 'WBMode' },
1458
+ wbTemperature => { Name => 'WBTemperature' },
1459
+ tint => { },
1460
+ shadow => { },
1461
+ highlight => { },
1462
+ lightbalance => { },
1463
+ sharpness => { },
1464
+ definition => { },
1465
+ isBrightnessIPE => { },
1466
+ isExposureIPE => { },
1467
+ isContrastIPE => { },
1468
+ isSaturationIPE => { },
1469
+ );
1470
+
1471
+ %Image::ExifTool::Samsung::EffectInfo = (
1472
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1473
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1474
+ filterIndication=> { },
1475
+ alphaValue => { },
1476
+ filterType => { },
1477
+ );
1478
+
1479
+ %Image::ExifTool::Samsung::PortraitEffect = (
1480
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1481
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1482
+ VARS => { LONG_TAGS => 1 },
1483
+ effectId => { Name => 'PortraitEffectID' },
1484
+ effectLevel => { Name => 'PortraitEffectLevel' },
1485
+ exifRotation => { Name => 'PortraitExifRotation' },
1486
+ lightLevel => { Name => 'PortraitLightLevel' },
1487
+ touchX => { Name => 'PortraitTouchX' },
1488
+ touchY => { Name => 'PortraitTouchY' },
1489
+ refocusX => { Name => 'PortraitRefocusX' },
1490
+ refocusY => { Name => 'PortraitRefocusY' },
1491
+ effectIdOriginal => { Name => 'PortraitEffectIDOriginal' },
1492
+ effectLevelOriginal => { Name => 'EffectLevelOriginal' },
1493
+ lightLevelOriginal => { Name => 'LightLevelOriginal' },
1494
+ touchXOriginal => { },
1495
+ touchYOriginal => { },
1496
+ refocusXOriginal=> { },
1497
+ refocusYOriginal=> { },
1498
+ waterMarkRemoved=> { Name => 'WaterMarkRemoved' },
1499
+ waterMarkRemovedOriginal => { Name => 'WaterMarkRemovedOriginal' },
1500
+ );
1501
+
1502
+ %Image::ExifTool::Samsung::PEgInfo = (
1503
+ GROUPS => { 0 => 'JSON', 2 => 'Image' },
1504
+ PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
1505
+ genImageVersion => { },
1506
+ connectorType => { },
1507
+ );
1508
+
1383
1509
  # Samsung composite tags
1384
1510
  %Image::ExifTool::Samsung::Composite = (
1385
1511
  GROUPS => { 2 => 'Image' },
@@ -1625,7 +1751,14 @@ SamBlock:
1625
1751
  }
1626
1752
  next;
1627
1753
  }
1628
- last unless $buff =~ /^SEFH/ and $len >= 12; # validate SEFH header
1754
+ # validate SEFH header
1755
+ unless ($buff =~ /^SEFH/ and $len >= 12) {
1756
+ # tolerate extra junk written by Samsung Gallery
1757
+ last unless $buff =~ /\0\0SEFT/g;
1758
+ $et->Warn('Trailer likely corrupted by Samsung Gallery');
1759
+ $blockEnd += pos($buff);
1760
+ next;
1761
+ }
1629
1762
  my $dirPos = $raf->Tell() - $len;
1630
1763
  # my $ver = Get32u(\$buff, 0x04); # version (=101)
1631
1764
  my $count = Get32u(\$buff, 0x08);
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.79';
37
+ $VERSION = '3.81';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -2215,6 +2215,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2215
2215
  403 => 'ILCE-6100A', #JR
2216
2216
  404 => 'DSC-RX100M7A', #github347
2217
2217
  406 => 'ILME-FX2', #JR
2218
+ 407 => 'ILCE-7M5', #PH
2218
2219
  408 => 'ZV-1A', #JR
2219
2220
  },
2220
2221
  },
@@ -10656,7 +10657,7 @@ my %isoSetting2010 = (
10656
10657
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1,2
10657
10658
  0x8104 => { Name => 'Sony_rtmd_0x8104', Format => 'int16u', %hidUnk }, # seen: 35616
10658
10659
  0x8105 => { Name => 'Sony_rtmd_0x8105', Format => 'int16u', %hidUnk }, # seen: 20092
10659
- 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1","24000 1001" frame rate?
10660
+ 0x8106 => { Name => 'FrameRate', Format => 'rational64u', PrintConv => 'sprintf("%.2f",$val)' },
10660
10661
  0x8109 => { #forum12218
10661
10662
  Name => 'ExposureTime',
10662
10663
  Format => 'rational64u',
@@ -10674,7 +10675,9 @@ my %isoSetting2010 = (
10674
10675
  Format => 'int16u',
10675
10676
  },
10676
10677
  0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 0,1
10678
+ 0x8114 => { Name => 'SerialNumber', Format => 'string' }, # (and model, eg. "ILCE-7SM3 5072108")
10677
10679
  0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100 - ISO
10680
+ # 0x8119 - seen "P" (same as 0x811e?)
10678
10681
  # 0x8300 - container for other tags in this format
10679
10682
  0x8500 => {
10680
10683
  Name => 'GPSVersionID',