exiftool_vendored 11.99.0 → 12.06.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.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +119 -2
- data/bin/MANIFEST +5 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +32 -32
- data/bin/exiftool +55 -50
- data/bin/lib/Image/ExifTool.pm +155 -109
- data/bin/lib/Image/ExifTool.pod +103 -77
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -6
- data/bin/lib/Image/ExifTool/Canon.pm +2 -1
- data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
- data/bin/lib/Image/ExifTool/DPX.pm +56 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +16 -3
- data/bin/lib/Image/ExifTool/Exif.pm +15 -6
- data/bin/lib/Image/ExifTool/Font.pm +9 -2
- data/bin/lib/Image/ExifTool/GIF.pm +5 -0
- data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
- data/bin/lib/Image/ExifTool/GoPro.pm +10 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +86 -12
- data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +3 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +134 -15
- data/bin/lib/Image/ExifTool/Olympus.pm +34 -17
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +5 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +147 -13
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +33 -0
- data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +2 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +204 -27
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +355 -19
- data/bin/lib/Image/ExifTool/README +20 -19
- data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -0
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
- data/bin/lib/Image/ExifTool/Sony.pm +376 -11
- data/bin/lib/Image/ExifTool/TagLookup.pm +1949 -1872
- data/bin/lib/Image/ExifTool/TagNames.pod +329 -53
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +23 -15
- data/bin/lib/Image/ExifTool/Writer.pl +44 -21
- data/bin/lib/Image/ExifTool/XMP.pm +41 -4
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
- data/bin/perl-Image-ExifTool.spec +31 -31
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -3
@@ -531,14 +531,45 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
531
531
|
PrintConv => '"$val mm"',
|
532
532
|
PrintConvInv => '$val=~s/\s*mm$//;$val',
|
533
533
|
},
|
534
|
+
# 0x1300 - incident light value? (ref forum11395)
|
535
|
+
0x1301 => { #forum11395
|
536
|
+
Name => 'ApertureValue',
|
537
|
+
Writable => 'int16s',
|
538
|
+
Priority => 0,
|
539
|
+
ValueConv => '2 ** ($val / 512)',
|
540
|
+
ValueConvInv => '$val>0 ? 512*log($val)/log(2) : 0',
|
541
|
+
PrintConv => 'sprintf("%.1f",$val)',
|
542
|
+
PrintConvInv => '$val',
|
543
|
+
},
|
544
|
+
0x1302 => { #forum11395
|
545
|
+
Name => 'ShutterSpeedValue',
|
546
|
+
Writable => 'int16s',
|
547
|
+
Priority => 0,
|
548
|
+
ValueConv => 'abs($val/256)<100 ? 2**(-$val/256) : 0',
|
549
|
+
ValueConvInv => '$val>0 ? -256*log($val)/log(2) : -25600',
|
550
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
551
|
+
PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
|
552
|
+
},
|
553
|
+
0x1303 => { #forum11395
|
554
|
+
Name => 'SensitivityValue',
|
555
|
+
Writable => 'int16s',
|
556
|
+
ValueConv => '$val / 256',
|
557
|
+
ValueConvInv => 'int($val * 256)',
|
558
|
+
},
|
534
559
|
0x1305 => { #forum9384
|
535
560
|
Name => 'HighISOMode',
|
536
561
|
Writable => 'int16u',
|
537
562
|
RawConv => '$val || undef',
|
538
563
|
PrintConv => { 1 => 'On', 2 => 'Off' },
|
539
564
|
},
|
565
|
+
# 0x1306 EV for some models like the GX8 (forum11395)
|
540
566
|
# 0x140b - scaled overall black level? (ref forum9281)
|
541
567
|
# 0x1411 - scaled black level per channel difference (ref forum9281)
|
568
|
+
0x1412 => { #forum11397
|
569
|
+
Name => 'FacesDetected',
|
570
|
+
Writable => 'int8u',
|
571
|
+
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
572
|
+
},
|
542
573
|
# 0x2000 - WB tungsten=3, daylight=4 (ref forum9467)
|
543
574
|
# 0x2009 - scaled black level per channel (ref forum9281)
|
544
575
|
# 0x3000-0x310b - red/blue balances * 1024 (ref forum9467)
|
@@ -600,6 +631,8 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
600
631
|
Writable => 'int8u',
|
601
632
|
PrintConv => \%Image::ExifTool::Exif::orientation,
|
602
633
|
},
|
634
|
+
# 0x3504 = Tag 0x1301+0x1302-0x1303 (Bv = Av+Tv-Sv) (forum11395)
|
635
|
+
# 0x3505 - same as 0x1300 (forum11395)
|
603
636
|
0x3600 => { #forum9396
|
604
637
|
Name => 'WhiteBalanceDetected',
|
605
638
|
Writable => 'int8u',
|
@@ -13,7 +13,7 @@ package Image::ExifTool::Parrot;
|
|
13
13
|
use strict;
|
14
14
|
use vars qw($VERSION);
|
15
15
|
|
16
|
-
$VERSION = '1.
|
16
|
+
$VERSION = '1.01';
|
17
17
|
|
18
18
|
sub Process_mett($$$);
|
19
19
|
|
@@ -703,6 +703,7 @@ sub Process_mett($$$)
|
|
703
703
|
$et->HandleTag($tagTbl, $id, undef,
|
704
704
|
DataPt => $dataPt,
|
705
705
|
DataPos => $dataPos,
|
706
|
+
Base => $$dirInfo{Base},
|
706
707
|
Start => $pos,
|
707
708
|
Size => $size,
|
708
709
|
);
|
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
|
|
58
58
|
use Image::ExifTool::GPS;
|
59
59
|
use Image::ExifTool::HP;
|
60
60
|
|
61
|
-
$VERSION = '3.
|
61
|
+
$VERSION = '3.34';
|
62
62
|
|
63
63
|
sub CryptShutterCount($$);
|
64
64
|
sub PrintFilter($$$);
|
@@ -338,6 +338,7 @@ sub DecodeAFPoints($$$$;$);
|
|
338
338
|
'8 63' => 'HD PENTAX-D FA 15-30mm F2.8 ED SDM WR', #PH
|
339
339
|
'8 64' => 'HD PENTAX-D FA* 50mm F1.4 SDM AW', #27
|
340
340
|
'8 65' => 'HD PENTAX-D FA 70-210mm F4 ED SDM WR', #PH
|
341
|
+
'8 66' => 'HD PENTAX-D FA 85mm F1.4 ED SDM AW', #James O'Neill
|
341
342
|
'8 196' => 'HD PENTAX-DA* 11-18mm F2.8 ED DC AW', #29
|
342
343
|
'8 197' => 'HD PENTAX-DA 55-300mm F4.5-6.3 ED PLM WR RE', #29
|
343
344
|
'8 198' => 'smc PENTAX-DA L 18-50mm F4-5.6 DC WR RE', #29
|
@@ -28,7 +28,7 @@ use strict;
|
|
28
28
|
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo);
|
29
29
|
use Image::ExifTool qw(:DataAccess :Utils);
|
30
30
|
|
31
|
-
$VERSION = '1.
|
31
|
+
$VERSION = '1.65';
|
32
32
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
34
34
|
sub WritePhotoshop($$$);
|
@@ -982,6 +982,7 @@ sub ProcessPhotoshop($$$)
|
|
982
982
|
DataPos => $$dirInfo{DataPos},
|
983
983
|
Size => $size,
|
984
984
|
Start => $pos,
|
985
|
+
Base => $$dirInfo{Base},
|
985
986
|
Parent => $$dirInfo{DirName},
|
986
987
|
);
|
987
988
|
$size += 1 if $size & 0x01; # size is padded to an even # bytes
|
@@ -36,6 +36,7 @@
|
|
36
36
|
# 24) https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata
|
37
37
|
# 25) https://cconcolato.github.io/mp4ra/atoms.html
|
38
38
|
# 26) https://github.com/SamsungVR/android_upload_sdk/blob/master/SDKLib/src/main/java/com/samsung/msca/samsungvr/sdk/UserVideo.java
|
39
|
+
# 27) https://exiftool.org/forum/index.php?topic=11517.0
|
39
40
|
#------------------------------------------------------------------------------
|
40
41
|
|
41
42
|
package Image::ExifTool::QuickTime;
|
@@ -46,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
46
47
|
use Image::ExifTool::Exif;
|
47
48
|
use Image::ExifTool::GPS;
|
48
49
|
|
49
|
-
$VERSION = '2.
|
50
|
+
$VERSION = '2.52';
|
50
51
|
|
51
52
|
sub ProcessMOV($$;$);
|
52
53
|
sub ProcessKeys($$$);
|
@@ -105,7 +106,9 @@ my %mimeLookup = (
|
|
105
106
|
MQV => 'video/quicktime',
|
106
107
|
HEIC => 'image/heic',
|
107
108
|
HEVC => 'image/heic-sequence',
|
109
|
+
HEICS=> 'image/heic-sequence',
|
108
110
|
HEIF => 'image/heif',
|
111
|
+
HEIFS=> 'image/heif-sequence',
|
109
112
|
AVIF => 'image/avif', #PH (NC)
|
110
113
|
CRX => 'video/x-canon-crx', # (will get overridden)
|
111
114
|
);
|
@@ -418,7 +421,8 @@ my %eeBox = (
|
|
418
421
|
sbtl => { %eeStd },
|
419
422
|
data => { %eeStd },
|
420
423
|
camm => { %eeStd }, # (Insta360)
|
421
|
-
|
424
|
+
ctbx => { %eeStd }, # (GM cars)
|
425
|
+
'' => { 'gps ' => 'moov', 'GPS ' => 'main' }, # (no handler -- in top level 'moov' box, and main)
|
422
426
|
);
|
423
427
|
|
424
428
|
# QuickTime atoms
|
@@ -555,6 +559,20 @@ my %eeBox = (
|
|
555
559
|
Start => 16,
|
556
560
|
},
|
557
561
|
},
|
562
|
+
{ # (ref https://github.com/JamesHeinrich/getID3/blob/master/getid3/module.audio-video.quicktime.php)
|
563
|
+
Name => 'SensorData', # sensor data for the 360Fly
|
564
|
+
Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}',
|
565
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' },
|
566
|
+
},
|
567
|
+
{
|
568
|
+
Name => 'SensorData',
|
569
|
+
Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
|
570
|
+
Notes => 'raw 360Fly sensor data without ExtractEmbedded option',
|
571
|
+
RawConv => q{
|
572
|
+
$self->WarnOnce('Use the ExtractEmbedded option to decode timed SensorData',3);
|
573
|
+
return \$val;
|
574
|
+
},
|
575
|
+
},
|
558
576
|
{ #PH (Canon CR3)
|
559
577
|
Name => 'PreviewImage',
|
560
578
|
Condition => '$$valPt=~/^\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16/',
|
@@ -667,6 +685,11 @@ my %eeBox = (
|
|
667
685
|
},
|
668
686
|
# gpsa - seen hex "01 20 00 00" (DuDuBell M1, VSYS M6L)
|
669
687
|
# gsea - 20 bytes hex "05 00's..." (DuDuBell M1) "05 08 02 01 ..." (VSYS M6L)
|
688
|
+
'GPS ' => { # GPS data written by 70mai dashcam (parsed in QuickTimeStream.pl)
|
689
|
+
Name => 'GPSDataList2',
|
690
|
+
Unknown => 1,
|
691
|
+
Binary => 1,
|
692
|
+
},
|
670
693
|
);
|
671
694
|
|
672
695
|
# MPEG-4 'ftyp' atom
|
@@ -962,7 +985,7 @@ my %eeBox = (
|
|
962
985
|
%Image::ExifTool::QuickTime::CleanAperture = (
|
963
986
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
964
987
|
GROUPS => { 2 => 'Video' },
|
965
|
-
FORMAT => '
|
988
|
+
FORMAT => 'rational64s',
|
966
989
|
0 => 'CleanApertureWidth',
|
967
990
|
1 => 'CleanApertureHeight',
|
968
991
|
2 => 'CleanApertureOffsetX',
|
@@ -1307,6 +1330,7 @@ my %eeBox = (
|
|
1307
1330
|
Format => 'fixed32s[9]',
|
1308
1331
|
Notes => 'writable for the video track via the Composite Rotation tag',
|
1309
1332
|
Writable => 1,
|
1333
|
+
Protected => 1,
|
1310
1334
|
Permanent => 1,
|
1311
1335
|
# only set rotation if image size is non-zero
|
1312
1336
|
RawConvInv => \&GetMatrixStructure,
|
@@ -1371,8 +1395,8 @@ my %eeBox = (
|
|
1371
1395
|
},
|
1372
1396
|
ValueConvInv => q{
|
1373
1397
|
require Image::ExifTool::XMP;
|
1374
|
-
$
|
1375
|
-
$val =~ s/([-+]\d{2}):(\d{2})$/$1$2
|
1398
|
+
my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
|
1399
|
+
($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
|
1376
1400
|
return $val;
|
1377
1401
|
},
|
1378
1402
|
PrintConv => '$self->ConvertDateTime($val)',
|
@@ -1634,7 +1658,7 @@ my %eeBox = (
|
|
1634
1658
|
Groups => { 2 => 'Time' },
|
1635
1659
|
Notes => q{
|
1636
1660
|
Apple Photos has been reported to show a crazy date/time for some MP4 files
|
1637
|
-
containing this tag
|
1661
|
+
containing this tag, but perhaps only if it is missing a time zone
|
1638
1662
|
}, #forum10690/11125
|
1639
1663
|
Shift => 'Time',
|
1640
1664
|
ValueConv => q{
|
@@ -1857,6 +1881,25 @@ my %eeBox = (
|
|
1857
1881
|
ByteOrder => 'LittleEndian',
|
1858
1882
|
},
|
1859
1883
|
},
|
1884
|
+
# ---- Garmin ---- (ref PH)
|
1885
|
+
uuid => [{
|
1886
|
+
Name => 'GarminSoftware', # (NC)
|
1887
|
+
Condition => '$$valPt =~ /^VIRBactioncamera/',
|
1888
|
+
RawConv => 'substr($val, 16)',
|
1889
|
+
RawConvInv => '"VIRBactioncamera$val"',
|
1890
|
+
},{
|
1891
|
+
# have seen "28 f3 11 e2 b7 91 4f 6f 94 e2 4f 5d ea cb 3c 01" for RicohThetaZ1 accelerometer RADT data (not yet decoded)
|
1892
|
+
Name => 'UUID-Unknown',
|
1893
|
+
Writable => 0,
|
1894
|
+
%unknownInfo,
|
1895
|
+
}],
|
1896
|
+
pmcc => {
|
1897
|
+
Name => 'GarminSettings',
|
1898
|
+
ValueConv => 'substr($val, 4)',
|
1899
|
+
ValueConvInv => '"\0\0\0\x01$val"',
|
1900
|
+
},
|
1901
|
+
# hmtp - "\0\0\0\x01" followed by 408 bytes of zero
|
1902
|
+
# vrin - "\0\0\0\x01" followed by 8 bytes of zero
|
1860
1903
|
# ---- GoPro ---- (ref PH)
|
1861
1904
|
GoPr => 'GoProType', # (Hero3+)
|
1862
1905
|
FIRM => { Name => 'FirmwareVersion', Avoid => 1 }, # (Hero4)
|
@@ -2040,6 +2083,63 @@ my %eeBox = (
|
|
2040
2083
|
ProcessProc => \&Image::ExifTool::ProcessTIFF, # (because ProcessMOV is default)
|
2041
2084
|
},
|
2042
2085
|
},
|
2086
|
+
'@mak' => { Name => 'Make', Avoid => 1 },
|
2087
|
+
'@mod' => { Name => 'Model', Avoid => 1 },
|
2088
|
+
'@swr' => { Name => 'SoftwareVersion', Avoid => 1 },
|
2089
|
+
'@day' => {
|
2090
|
+
Name => 'ContentCreateDate',
|
2091
|
+
Notes => q{
|
2092
|
+
some stupid Ricoh programmer used the '@' symbol instead of the copyright
|
2093
|
+
symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models
|
2094
|
+
},
|
2095
|
+
Groups => { 2 => 'Time' },
|
2096
|
+
Shift => 'Time',
|
2097
|
+
Avoid => 1,
|
2098
|
+
# handle values in the form "2010-02-12T13:27:14-0800"
|
2099
|
+
ValueConv => q{
|
2100
|
+
require Image::ExifTool::XMP;
|
2101
|
+
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
2102
|
+
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
2103
|
+
return $val;
|
2104
|
+
},
|
2105
|
+
ValueConvInv => q{
|
2106
|
+
require Image::ExifTool::XMP;
|
2107
|
+
my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
|
2108
|
+
($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
|
2109
|
+
return $val;
|
2110
|
+
},
|
2111
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
2112
|
+
PrintConvInv => '$self->InverseDateTime($val)',
|
2113
|
+
},
|
2114
|
+
'@xyz' => { #PH (iPhone 3GS)
|
2115
|
+
Name => 'GPSCoordinates',
|
2116
|
+
Groups => { 2 => 'Location' },
|
2117
|
+
Avoid => 1,
|
2118
|
+
ValueConv => \&ConvertISO6709,
|
2119
|
+
ValueConvInv => \&ConvInvISO6709,
|
2120
|
+
PrintConv => \&PrintGPSCoordinates,
|
2121
|
+
PrintConvInv => \&PrintInvGPSCoordinates,
|
2122
|
+
},
|
2123
|
+
# RDT1 - pairs of int32u_BE, starting at byte 8: "458275 471846"
|
2124
|
+
# RDT2 - pairs of int32u_BE, starting at byte 8: "472276 468526"
|
2125
|
+
# RDT3 - pairs of int32u_BE, starting at byte 8: "876603 482191"
|
2126
|
+
# RDT4 - pairs of int32u_BE, starting at byte 8: "1955 484612"
|
2127
|
+
# RDT6 - empty
|
2128
|
+
# RDT7 - empty
|
2129
|
+
# RDT8 - empty
|
2130
|
+
# RDT9 - only 16-byte header?
|
2131
|
+
# the boxes below all have a similar header (little-endian):
|
2132
|
+
# 0 int32u - number of records
|
2133
|
+
# 4 ? - "1e 00"
|
2134
|
+
# 6 int16u - record length in bytes
|
2135
|
+
# 8 ? - "23 01 00 00 00 00 00 00"
|
2136
|
+
# 16 - start of records (each record ends in an int64u timestamp in ns)
|
2137
|
+
# RDTA - float[4],ts: "-0.31289672 -0.2245330 11.303817 0 775.780"
|
2138
|
+
# RDTB - float[4],ts: "-0.04841613 -0.2166595 0.0724792 0 775.780"
|
2139
|
+
# RDTC - float[4],ts: "27.60925 -27.10037 -13.27285 0 775.829"
|
2140
|
+
# RDTD - int16s[3],ts: "353 -914 16354 0 775.829"
|
2141
|
+
# RDTG - ts: "775.825"
|
2142
|
+
# RDTI - float[4],ts: "0.00165951 0.005770059 0.06838259 0.1744695 775.862"
|
2043
2143
|
# ---- Samsung ----
|
2044
2144
|
vndr => 'Vendor', #PH (Samsung PL70)
|
2045
2145
|
SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
|
@@ -2516,6 +2616,7 @@ my %eeBox = (
|
|
2516
2616
|
Name => 'Rotation',
|
2517
2617
|
Format => 'int8u',
|
2518
2618
|
Writable => 'int8u',
|
2619
|
+
Protected => 1,
|
2519
2620
|
ValueConv => '$val * 90',
|
2520
2621
|
ValueConvInv => 'int($val / 90 + 0.5)',
|
2521
2622
|
},
|
@@ -2547,6 +2648,7 @@ my %eeBox = (
|
|
2547
2648
|
Name => 'PixelAspectRatio',
|
2548
2649
|
Format => 'int32u',
|
2549
2650
|
Writable => 'int32u',
|
2651
|
+
Protected => 1,
|
2550
2652
|
},
|
2551
2653
|
rloc => {
|
2552
2654
|
Name => 'RelativeLocation',
|
@@ -2555,7 +2657,7 @@ my %eeBox = (
|
|
2555
2657
|
},
|
2556
2658
|
clap => {
|
2557
2659
|
Name => 'CleanAperture',
|
2558
|
-
Format => '
|
2660
|
+
Format => 'rational64s',
|
2559
2661
|
Notes => '4 numbers: width, height, left and top',
|
2560
2662
|
},
|
2561
2663
|
hvcC => {
|
@@ -2893,10 +2995,25 @@ my %eeBox = (
|
|
2893
2995
|
"\xa9grp" => 'Grouping',
|
2894
2996
|
"\xa9lyr" => 'Lyrics',
|
2895
2997
|
"\xa9nam" => 'Title',
|
2896
|
-
# "\xa9st3" ? #10
|
2897
2998
|
"\xa9too" => 'Encoder',
|
2898
2999
|
"\xa9trk" => 'Track',
|
2899
3000
|
"\xa9wrt" => 'Composer',
|
3001
|
+
#
|
3002
|
+
# the following tags written by AtomicParsley 0.9.6
|
3003
|
+
# (ref https://exiftool.org/forum/index.php?topic=11455.0)
|
3004
|
+
#
|
3005
|
+
"\xa9st3" => 'Subtitle',
|
3006
|
+
"\xa9con" => 'Conductor',
|
3007
|
+
"\xa9sol" => 'Soloist',
|
3008
|
+
"\xa9arg" => 'Arranger',
|
3009
|
+
"\xa9ope" => 'OriginalArtist',
|
3010
|
+
"\xa9dir" => 'Director',
|
3011
|
+
"\xa9ard" => 'ArtDirector',
|
3012
|
+
"\xa9sne" => 'SoundEngineer',
|
3013
|
+
"\xa9prd" => 'Producer',
|
3014
|
+
"\xa9xpd" => 'ExecutiveProducer',
|
3015
|
+
sdes => 'StoreDescription',
|
3016
|
+
#
|
2900
3017
|
'----' => {
|
2901
3018
|
Name => 'iTunesInfo',
|
2902
3019
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' },
|
@@ -2905,18 +3022,29 @@ my %eeBox = (
|
|
2905
3022
|
covr => { Name => 'CoverArt', Groups => { 2 => 'Preview' } },
|
2906
3023
|
cpil => { #10
|
2907
3024
|
Name => 'Compilation',
|
2908
|
-
Format => 'int8u', #23
|
3025
|
+
Format => 'int8u', #27 (ref 23 contradicts what AtomicParsley actually writes, which is int8s)
|
3026
|
+
Writable => 'int8s',
|
2909
3027
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
2910
3028
|
},
|
2911
3029
|
disk => {
|
2912
3030
|
Name => 'DiskNumber',
|
2913
3031
|
Format => 'undef', # (necessary to prevent decoding as string!)
|
2914
|
-
ValueConv =>
|
2915
|
-
|
3032
|
+
ValueConv => q{
|
3033
|
+
return \$val unless length($val) >= 6;
|
3034
|
+
my @a = unpack 'x2nn', $val;
|
3035
|
+
return $a[1] ? join(' of ', @a) : $a[0];
|
3036
|
+
},
|
3037
|
+
ValueConvInv => q{
|
3038
|
+
my @a = $val =~ /\d+/g;
|
3039
|
+
return undef if @a == 0 or @a > 2;
|
3040
|
+
push @a, 0 if @a == 1;
|
3041
|
+
return pack('n3', 0, @a);
|
3042
|
+
},
|
2916
3043
|
},
|
2917
3044
|
pgap => { #10
|
2918
3045
|
Name => 'PlayGap',
|
2919
3046
|
Format => 'int8u', #23
|
3047
|
+
Writable => 'int8s', #27
|
2920
3048
|
PrintConv => {
|
2921
3049
|
0 => 'Insert Gap',
|
2922
3050
|
1 => 'No Gap',
|
@@ -2924,13 +3052,26 @@ my %eeBox = (
|
|
2924
3052
|
},
|
2925
3053
|
tmpo => {
|
2926
3054
|
Name => 'BeatsPerMinute',
|
2927
|
-
|
3055
|
+
# marked as boolean but really int16u in my sample
|
3056
|
+
# (but written as int16s by iTunes and AtomicParsley, ref forum11506)
|
3057
|
+
Format => 'int16u',
|
3058
|
+
Writable => 'int16s',
|
2928
3059
|
},
|
2929
3060
|
trkn => {
|
2930
3061
|
Name => 'TrackNumber',
|
2931
3062
|
Format => 'undef', # (necessary to prevent decoding as string!)
|
2932
|
-
ValueConv =>
|
2933
|
-
|
3063
|
+
ValueConv => q{
|
3064
|
+
return \$val unless length($val) >= 6;
|
3065
|
+
my @a = unpack 'x2nn', $val;
|
3066
|
+
return $a[1] ? join(' of ', @a) : $a[0];
|
3067
|
+
},
|
3068
|
+
# (see forum11501 for discussion about the format used)
|
3069
|
+
ValueConvInv => q{
|
3070
|
+
my @a = $val =~ /\d+/g;
|
3071
|
+
return undef if @a == 0 or @a > 2;
|
3072
|
+
push @a, 0 if @a == 1;
|
3073
|
+
return pack('n4', 0, @a, 0);
|
3074
|
+
},
|
2934
3075
|
},
|
2935
3076
|
#
|
2936
3077
|
# Note: it is possible that the tags below are not being decoded properly
|
@@ -2939,6 +3080,7 @@ my %eeBox = (
|
|
2939
3080
|
akID => { #10
|
2940
3081
|
Name => 'AppleStoreAccountType',
|
2941
3082
|
Format => 'int8u', #24
|
3083
|
+
Writable => 'int8s', #27
|
2942
3084
|
PrintConv => {
|
2943
3085
|
0 => 'iTunes',
|
2944
3086
|
1 => 'AOL',
|
@@ -2949,12 +3091,14 @@ my %eeBox = (
|
|
2949
3091
|
atID => { #10 (or TV series)
|
2950
3092
|
Name => 'AlbumTitleID',
|
2951
3093
|
Format => 'int32u',
|
3094
|
+
Writable => 'int32s', #27
|
2952
3095
|
},
|
2953
3096
|
auth => { Name => 'Author', Groups => { 2 => 'Author' } },
|
2954
3097
|
catg => 'Category', #7
|
2955
3098
|
cnID => { #10
|
2956
3099
|
Name => 'AppleStoreCatalogID',
|
2957
3100
|
Format => 'int32u',
|
3101
|
+
Writable => 'int32s', #27
|
2958
3102
|
},
|
2959
3103
|
cprt => { Name => 'Copyright', Groups => { 2 => 'Author' } },
|
2960
3104
|
dscp => { Name => 'Description', Avoid => 1 },
|
@@ -2962,22 +3106,28 @@ my %eeBox = (
|
|
2962
3106
|
gnre => { #10
|
2963
3107
|
Name => 'Genre',
|
2964
3108
|
Avoid => 1,
|
2965
|
-
# (Note:
|
3109
|
+
# (Note: see https://exiftool.org/forum/index.php?topic=11537.0)
|
3110
|
+
Format => 'undef',
|
3111
|
+
ValueConv => 'unpack("n",$val)',
|
3112
|
+
ValueConvInv => '$val =~ /^\d+$/ ? pack("n",$val) : undef',
|
2966
3113
|
PrintConv => q{
|
2967
3114
|
return $val unless $val =~ /^\d+$/;
|
2968
3115
|
require Image::ExifTool::ID3;
|
2969
3116
|
Image::ExifTool::ID3::PrintGenre($val - 1); # note the "- 1"
|
2970
3117
|
},
|
2971
3118
|
PrintConvInv => q{
|
3119
|
+
return $val if $val =~ /^[0-9]+$/;
|
2972
3120
|
require Image::ExifTool::ID3;
|
2973
3121
|
my $id = Image::ExifTool::ID3::GetGenreID($val);
|
2974
|
-
return defined $id
|
2975
|
-
|
3122
|
+
return unless defined $id and $id =~ /^\d+$/;
|
3123
|
+
return $id + 1;
|
3124
|
+
},
|
2976
3125
|
},
|
2977
3126
|
egid => 'EpisodeGlobalUniqueID', #7
|
2978
3127
|
geID => { #10
|
2979
3128
|
Name => 'GenreID',
|
2980
3129
|
Format => 'int32u',
|
3130
|
+
Writable => 'int32s', #27
|
2981
3131
|
SeparateTable => 1,
|
2982
3132
|
# the following lookup is based on http://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/genres
|
2983
3133
|
# (see scripts/parse_genre to parse genre JSON file from above)
|
@@ -5630,6 +5780,7 @@ my %eeBox = (
|
|
5630
5780
|
hdvd => { #10
|
5631
5781
|
Name => 'HDVideo',
|
5632
5782
|
Format => 'int8u', #24
|
5783
|
+
Writable => 'int8s', #27
|
5633
5784
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5634
5785
|
},
|
5635
5786
|
keyw => 'Keyword', #7
|
@@ -5637,18 +5788,21 @@ my %eeBox = (
|
|
5637
5788
|
pcst => { #7
|
5638
5789
|
Name => 'Podcast',
|
5639
5790
|
Format => 'int8u', #23
|
5791
|
+
Writable => 'int8s', #27
|
5640
5792
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5641
5793
|
},
|
5642
5794
|
perf => 'Performer',
|
5643
5795
|
plID => { #10 (or TV season)
|
5644
5796
|
Name => 'PlayListID',
|
5645
5797
|
Format => 'int8u', # actually int64u, but split it up
|
5798
|
+
Writable => 'int32s', #27
|
5646
5799
|
},
|
5647
5800
|
purd => 'PurchaseDate', #7
|
5648
5801
|
purl => 'PodcastURL', #7
|
5649
5802
|
rtng => { #10
|
5650
5803
|
Name => 'Rating',
|
5651
5804
|
Format => 'int8u', #23
|
5805
|
+
Writable => 'int8s', #27
|
5652
5806
|
PrintConv => {
|
5653
5807
|
0 => 'none',
|
5654
5808
|
1 => 'Explicit',
|
@@ -5659,6 +5813,7 @@ my %eeBox = (
|
|
5659
5813
|
sfID => { #10
|
5660
5814
|
Name => 'AppleStoreCountry',
|
5661
5815
|
Format => 'int32u',
|
5816
|
+
Writable => 'int32s', #27
|
5662
5817
|
SeparateTable => 1,
|
5663
5818
|
PrintConv => { #21
|
5664
5819
|
143441 => 'United States', # US
|
@@ -5827,6 +5982,7 @@ my %eeBox = (
|
|
5827
5982
|
stik => { #10
|
5828
5983
|
Name => 'MediaType',
|
5829
5984
|
Format => 'int8u', #23
|
5985
|
+
Writable => 'int8s', #27
|
5830
5986
|
PrintConvColumns => 2,
|
5831
5987
|
PrintConv => { #(http://weblog.xanga.com/gryphondwb/615474010/iphone-ringtones---what-did-itunes-741-really-do.html)
|
5832
5988
|
0 => 'Movie (old)', #forum9059 (was Movie)
|
@@ -5848,6 +6004,7 @@ my %eeBox = (
|
|
5848
6004
|
tves => { #7/10
|
5849
6005
|
Name => 'TVEpisode',
|
5850
6006
|
Format => 'int32u',
|
6007
|
+
Writable => 'int32s', #27
|
5851
6008
|
},
|
5852
6009
|
tvnn => 'TVNetworkName', #7
|
5853
6010
|
tvsh => 'TVShow', #10
|
@@ -5858,7 +6015,8 @@ my %eeBox = (
|
|
5858
6015
|
yrrc => 'Year', #(ffmpeg source)
|
5859
6016
|
itnu => { #PH (iTunes 10.5)
|
5860
6017
|
Name => 'iTunesU',
|
5861
|
-
Format => '
|
6018
|
+
Format => 'int8u', #27
|
6019
|
+
Writable => 'int8s', #27
|
5862
6020
|
Description => 'iTunes U',
|
5863
6021
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5864
6022
|
},
|
@@ -5915,15 +6073,18 @@ my %eeBox = (
|
|
5915
6073
|
"\xa9mvn" => 'MovementName', #PH
|
5916
6074
|
"\xa9mvi" => { #PH
|
5917
6075
|
Name => 'MovementNumber',
|
5918
|
-
Format => '
|
6076
|
+
Format => 'int16u', #27
|
6077
|
+
Writable => 'int16s', #27
|
5919
6078
|
},
|
5920
6079
|
"\xa9mvc" => { #PH
|
5921
6080
|
Name => 'MovementCount',
|
5922
|
-
Format => '
|
6081
|
+
Format => 'int16u', #27
|
6082
|
+
Writable => 'int16s', #27
|
5923
6083
|
},
|
5924
6084
|
shwm => { #PH
|
5925
6085
|
Name => 'ShowMovement',
|
5926
|
-
Format => '
|
6086
|
+
Format => 'int8u', #27
|
6087
|
+
Writable => 'int8s', #27
|
5927
6088
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5928
6089
|
},
|
5929
6090
|
);
|
@@ -6737,6 +6898,7 @@ my %eeBox = (
|
|
6737
6898
|
# alac - 28 bytes
|
6738
6899
|
# adrm - AAX DRM atom? 148 bytes
|
6739
6900
|
# aabd - AAX unknown 17kB (contains 'aavd' strings)
|
6901
|
+
# SA3D - written by Garmin VIRB360
|
6740
6902
|
);
|
6741
6903
|
|
6742
6904
|
# AMR decode config box (ref 3)
|
@@ -7223,6 +7385,20 @@ my %eeBox = (
|
|
7223
7385
|
#
|
7224
7386
|
ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
|
7225
7387
|
name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' },
|
7388
|
+
# mrlh = GM header?
|
7389
|
+
# mrlv = GM data
|
7390
|
+
# mrld = GM data (448-byte records):
|
7391
|
+
# 0 - int32u count
|
7392
|
+
# 4 - int32u ? (related to units) 0=none,1=m/km,2=L,3=kph,4=C,7=deg,8=rpm,9=kPa,10=G,11=V,15=Nm,16=%
|
7393
|
+
# 8 - int32u ? (0,1,3,4,5)
|
7394
|
+
# 12 - string[64] units
|
7395
|
+
# 76 - int32u ? (1,3,7,15)
|
7396
|
+
# 80 - int32u 0
|
7397
|
+
# 84 - undef[4] ?
|
7398
|
+
# 88 - int16u[6] ?
|
7399
|
+
# 100 - undef[32] ?
|
7400
|
+
# 132 - string[64] measurement name
|
7401
|
+
# 196 - string[64] measurement name
|
7226
7402
|
);
|
7227
7403
|
|
7228
7404
|
# MP4 data information box (ref 5)
|
@@ -7519,6 +7695,7 @@ my %eeBox = (
|
|
7519
7695
|
1 => 'QuickTime:HandlerType',
|
7520
7696
|
},
|
7521
7697
|
Writable => 1,
|
7698
|
+
Protected => 1,
|
7522
7699
|
WriteAlso => {
|
7523
7700
|
MatrixStructure => 'Image::ExifTool::QuickTime::GetRotationMatrix($val)',
|
7524
7701
|
},
|
@@ -8353,7 +8530,7 @@ sub EEWarn($)
|
|
8353
8530
|
#------------------------------------------------------------------------------
|
8354
8531
|
# Get quicktime format from flags word
|
8355
8532
|
# Inputs: 0) quicktime atom flags, 1) data length
|
8356
|
-
# Returns:
|
8533
|
+
# Returns: ExifTool format string
|
8357
8534
|
sub QuickTimeFormat($$)
|
8358
8535
|
{
|
8359
8536
|
my ($flags, $len) = @_;
|
@@ -8580,7 +8757,7 @@ sub ProcessKeys($$$)
|
|
8580
8757
|
my $ns = substr($$dataPt, $pos + 4, 4);
|
8581
8758
|
my $tag = substr($$dataPt, $pos + 8, $len - 8);
|
8582
8759
|
$tag =~ s/\0.*//s; # truncate at null
|
8583
|
-
$tag =~ s/^com\.apple\.quicktime
|
8760
|
+
$tag =~ s/^com\.(apple\.quicktime\.)?// if $ns eq 'mdta'; # remove apple quicktime domain
|
8584
8761
|
$tag = "Tag_$ns" unless $tag;
|
8585
8762
|
# (I have some samples where the tag is a reversed ItemList or UserData tag ID)
|
8586
8763
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
|
@@ -9091,10 +9268,10 @@ ItemID: foreach $id (keys %$items) {
|
|
9091
9268
|
}
|
9092
9269
|
}
|
9093
9270
|
if ($ctry or $lang) {
|
9094
|
-
$
|
9095
|
-
if ($
|
9271
|
+
my $langCode = GetLangCode($lang, $ctry);
|
9272
|
+
if ($langCode) {
|
9096
9273
|
# get tagInfo for other language
|
9097
|
-
$langInfo = GetLangInfoQT($et, $tagInfo, $
|
9274
|
+
$langInfo = GetLangInfoQT($et, $tagInfo, $langCode);
|
9098
9275
|
# save other language tag ID's so we can delete later if necessary
|
9099
9276
|
if ($langInfo) {
|
9100
9277
|
$$tagInfo{OtherLang} or $$tagInfo{OtherLang} = [ ];
|
@@ -9111,7 +9288,7 @@ ItemID: foreach $id (keys %$items) {
|
|
9111
9288
|
Size => $len,
|
9112
9289
|
Format => $format,
|
9113
9290
|
Index => $index,
|
9114
|
-
Extra => sprintf(", Type='${type}', Flags=0x%x
|
9291
|
+
Extra => sprintf(", Type='${type}', Flags=0x%x, Lang=0x%.4x",$flags,$lang),
|
9115
9292
|
) if $verbose;
|
9116
9293
|
# use "Keys" in path instead of ItemList if this was defined by a Keys tag
|
9117
9294
|
my $isKey = $$tagInfo{Groups} && $$tagInfo{Groups}{1} && $$tagInfo{Groups}{1} eq 'Keys';
|