exiftool_vendored 11.94.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 +5 -5
- data/bin/Changes +163 -3
- 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 +152 -52
- data/bin/lib/Image/ExifTool.pm +166 -115
- data/bin/lib/Image/ExifTool.pod +108 -81
- 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 +13 -7
- data/bin/lib/Image/ExifTool/Canon.pm +6 -3
- 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/Geotag.pm +69 -21
- data/bin/lib/Image/ExifTool/GoPro.pm +10 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +91 -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 +44 -24
- data/bin/lib/Image/ExifTool/MWG.pm +9 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +3 -2
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
- data/bin/lib/Image/ExifTool/Nikon.pm +156 -18
- 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 +3 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +277 -33
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +460 -67
- data/bin/lib/Image/ExifTool/README +21 -20
- data/bin/lib/Image/ExifTool/RIFF.pm +123 -3
- data/bin/lib/Image/ExifTool/RTF.pm +12 -7
- 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 +379 -12
- data/bin/lib/Image/ExifTool/TagLookup.pm +1959 -1874
- data/bin/lib/Image/ExifTool/TagNames.pod +346 -55
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +26 -15
- data/bin/lib/Image/ExifTool/Writer.pl +52 -23
- 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 -4
@@ -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
|
@@ -546,6 +547,7 @@ my %pentaxModelID = (
|
|
546
547
|
0x13222 => 'K-70', #29 (Ricoh)
|
547
548
|
0x1322c => 'KP', #29 (Ricoh)
|
548
549
|
0x13240 => 'K-1 Mark II', # (Ricoh)
|
550
|
+
0x13290 => 'WG-70', # (Ricoh)
|
549
551
|
);
|
550
552
|
|
551
553
|
# Pentax city codes - (PH, Optio WP)
|
@@ -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)',
|
@@ -1628,10 +1652,14 @@ my %eeBox = (
|
|
1628
1652
|
Avoid => 1,
|
1629
1653
|
Format => 'string', # (necessary to remove the trailing NULL)
|
1630
1654
|
},
|
1631
|
-
date => {
|
1655
|
+
date => {
|
1632
1656
|
Name => 'DateTimeOriginal',
|
1633
1657
|
Description => 'Date/Time Original',
|
1634
1658
|
Groups => { 2 => 'Time' },
|
1659
|
+
Notes => q{
|
1660
|
+
Apple Photos has been reported to show a crazy date/time for some MP4 files
|
1661
|
+
containing this tag, but perhaps only if it is missing a time zone
|
1662
|
+
}, #forum10690/11125
|
1635
1663
|
Shift => 'Time',
|
1636
1664
|
ValueConv => q{
|
1637
1665
|
require Image::ExifTool::XMP;
|
@@ -1853,6 +1881,25 @@ my %eeBox = (
|
|
1853
1881
|
ByteOrder => 'LittleEndian',
|
1854
1882
|
},
|
1855
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
|
1856
1903
|
# ---- GoPro ---- (ref PH)
|
1857
1904
|
GoPr => 'GoProType', # (Hero3+)
|
1858
1905
|
FIRM => { Name => 'FirmwareVersion', Avoid => 1 }, # (Hero4)
|
@@ -2036,6 +2083,63 @@ my %eeBox = (
|
|
2036
2083
|
ProcessProc => \&Image::ExifTool::ProcessTIFF, # (because ProcessMOV is default)
|
2037
2084
|
},
|
2038
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"
|
2039
2143
|
# ---- Samsung ----
|
2040
2144
|
vndr => 'Vendor', #PH (Samsung PL70)
|
2041
2145
|
SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
|
@@ -2512,6 +2616,7 @@ my %eeBox = (
|
|
2512
2616
|
Name => 'Rotation',
|
2513
2617
|
Format => 'int8u',
|
2514
2618
|
Writable => 'int8u',
|
2619
|
+
Protected => 1,
|
2515
2620
|
ValueConv => '$val * 90',
|
2516
2621
|
ValueConvInv => 'int($val / 90 + 0.5)',
|
2517
2622
|
},
|
@@ -2543,6 +2648,7 @@ my %eeBox = (
|
|
2543
2648
|
Name => 'PixelAspectRatio',
|
2544
2649
|
Format => 'int32u',
|
2545
2650
|
Writable => 'int32u',
|
2651
|
+
Protected => 1,
|
2546
2652
|
},
|
2547
2653
|
rloc => {
|
2548
2654
|
Name => 'RelativeLocation',
|
@@ -2551,7 +2657,7 @@ my %eeBox = (
|
|
2551
2657
|
},
|
2552
2658
|
clap => {
|
2553
2659
|
Name => 'CleanAperture',
|
2554
|
-
Format => '
|
2660
|
+
Format => 'rational64s',
|
2555
2661
|
Notes => '4 numbers: width, height, left and top',
|
2556
2662
|
},
|
2557
2663
|
hvcC => {
|
@@ -2889,10 +2995,25 @@ my %eeBox = (
|
|
2889
2995
|
"\xa9grp" => 'Grouping',
|
2890
2996
|
"\xa9lyr" => 'Lyrics',
|
2891
2997
|
"\xa9nam" => 'Title',
|
2892
|
-
# "\xa9st3" ? #10
|
2893
2998
|
"\xa9too" => 'Encoder',
|
2894
2999
|
"\xa9trk" => 'Track',
|
2895
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
|
+
#
|
2896
3017
|
'----' => {
|
2897
3018
|
Name => 'iTunesInfo',
|
2898
3019
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' },
|
@@ -2901,18 +3022,29 @@ my %eeBox = (
|
|
2901
3022
|
covr => { Name => 'CoverArt', Groups => { 2 => 'Preview' } },
|
2902
3023
|
cpil => { #10
|
2903
3024
|
Name => 'Compilation',
|
2904
|
-
Format => 'int8u', #23
|
3025
|
+
Format => 'int8u', #27 (ref 23 contradicts what AtomicParsley actually writes, which is int8s)
|
3026
|
+
Writable => 'int8s',
|
2905
3027
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
2906
3028
|
},
|
2907
3029
|
disk => {
|
2908
3030
|
Name => 'DiskNumber',
|
2909
3031
|
Format => 'undef', # (necessary to prevent decoding as string!)
|
2910
|
-
ValueConv =>
|
2911
|
-
|
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
|
+
},
|
2912
3043
|
},
|
2913
3044
|
pgap => { #10
|
2914
3045
|
Name => 'PlayGap',
|
2915
3046
|
Format => 'int8u', #23
|
3047
|
+
Writable => 'int8s', #27
|
2916
3048
|
PrintConv => {
|
2917
3049
|
0 => 'Insert Gap',
|
2918
3050
|
1 => 'No Gap',
|
@@ -2920,13 +3052,26 @@ my %eeBox = (
|
|
2920
3052
|
},
|
2921
3053
|
tmpo => {
|
2922
3054
|
Name => 'BeatsPerMinute',
|
2923
|
-
|
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',
|
2924
3059
|
},
|
2925
3060
|
trkn => {
|
2926
3061
|
Name => 'TrackNumber',
|
2927
3062
|
Format => 'undef', # (necessary to prevent decoding as string!)
|
2928
|
-
ValueConv =>
|
2929
|
-
|
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
|
+
},
|
2930
3075
|
},
|
2931
3076
|
#
|
2932
3077
|
# Note: it is possible that the tags below are not being decoded properly
|
@@ -2935,6 +3080,7 @@ my %eeBox = (
|
|
2935
3080
|
akID => { #10
|
2936
3081
|
Name => 'AppleStoreAccountType',
|
2937
3082
|
Format => 'int8u', #24
|
3083
|
+
Writable => 'int8s', #27
|
2938
3084
|
PrintConv => {
|
2939
3085
|
0 => 'iTunes',
|
2940
3086
|
1 => 'AOL',
|
@@ -2945,12 +3091,14 @@ my %eeBox = (
|
|
2945
3091
|
atID => { #10 (or TV series)
|
2946
3092
|
Name => 'AlbumTitleID',
|
2947
3093
|
Format => 'int32u',
|
3094
|
+
Writable => 'int32s', #27
|
2948
3095
|
},
|
2949
3096
|
auth => { Name => 'Author', Groups => { 2 => 'Author' } },
|
2950
3097
|
catg => 'Category', #7
|
2951
3098
|
cnID => { #10
|
2952
3099
|
Name => 'AppleStoreCatalogID',
|
2953
3100
|
Format => 'int32u',
|
3101
|
+
Writable => 'int32s', #27
|
2954
3102
|
},
|
2955
3103
|
cprt => { Name => 'Copyright', Groups => { 2 => 'Author' } },
|
2956
3104
|
dscp => { Name => 'Description', Avoid => 1 },
|
@@ -2958,22 +3106,28 @@ my %eeBox = (
|
|
2958
3106
|
gnre => { #10
|
2959
3107
|
Name => 'Genre',
|
2960
3108
|
Avoid => 1,
|
2961
|
-
# (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',
|
2962
3113
|
PrintConv => q{
|
2963
3114
|
return $val unless $val =~ /^\d+$/;
|
2964
3115
|
require Image::ExifTool::ID3;
|
2965
3116
|
Image::ExifTool::ID3::PrintGenre($val - 1); # note the "- 1"
|
2966
3117
|
},
|
2967
3118
|
PrintConvInv => q{
|
3119
|
+
return $val if $val =~ /^[0-9]+$/;
|
2968
3120
|
require Image::ExifTool::ID3;
|
2969
3121
|
my $id = Image::ExifTool::ID3::GetGenreID($val);
|
2970
|
-
return defined $id
|
2971
|
-
|
3122
|
+
return unless defined $id and $id =~ /^\d+$/;
|
3123
|
+
return $id + 1;
|
3124
|
+
},
|
2972
3125
|
},
|
2973
3126
|
egid => 'EpisodeGlobalUniqueID', #7
|
2974
3127
|
geID => { #10
|
2975
3128
|
Name => 'GenreID',
|
2976
3129
|
Format => 'int32u',
|
3130
|
+
Writable => 'int32s', #27
|
2977
3131
|
SeparateTable => 1,
|
2978
3132
|
# the following lookup is based on http://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/genres
|
2979
3133
|
# (see scripts/parse_genre to parse genre JSON file from above)
|
@@ -5626,6 +5780,7 @@ my %eeBox = (
|
|
5626
5780
|
hdvd => { #10
|
5627
5781
|
Name => 'HDVideo',
|
5628
5782
|
Format => 'int8u', #24
|
5783
|
+
Writable => 'int8s', #27
|
5629
5784
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5630
5785
|
},
|
5631
5786
|
keyw => 'Keyword', #7
|
@@ -5633,18 +5788,21 @@ my %eeBox = (
|
|
5633
5788
|
pcst => { #7
|
5634
5789
|
Name => 'Podcast',
|
5635
5790
|
Format => 'int8u', #23
|
5791
|
+
Writable => 'int8s', #27
|
5636
5792
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5637
5793
|
},
|
5638
5794
|
perf => 'Performer',
|
5639
5795
|
plID => { #10 (or TV season)
|
5640
5796
|
Name => 'PlayListID',
|
5641
5797
|
Format => 'int8u', # actually int64u, but split it up
|
5798
|
+
Writable => 'int32s', #27
|
5642
5799
|
},
|
5643
5800
|
purd => 'PurchaseDate', #7
|
5644
5801
|
purl => 'PodcastURL', #7
|
5645
5802
|
rtng => { #10
|
5646
5803
|
Name => 'Rating',
|
5647
5804
|
Format => 'int8u', #23
|
5805
|
+
Writable => 'int8s', #27
|
5648
5806
|
PrintConv => {
|
5649
5807
|
0 => 'none',
|
5650
5808
|
1 => 'Explicit',
|
@@ -5655,6 +5813,7 @@ my %eeBox = (
|
|
5655
5813
|
sfID => { #10
|
5656
5814
|
Name => 'AppleStoreCountry',
|
5657
5815
|
Format => 'int32u',
|
5816
|
+
Writable => 'int32s', #27
|
5658
5817
|
SeparateTable => 1,
|
5659
5818
|
PrintConv => { #21
|
5660
5819
|
143441 => 'United States', # US
|
@@ -5823,6 +5982,7 @@ my %eeBox = (
|
|
5823
5982
|
stik => { #10
|
5824
5983
|
Name => 'MediaType',
|
5825
5984
|
Format => 'int8u', #23
|
5985
|
+
Writable => 'int8s', #27
|
5826
5986
|
PrintConvColumns => 2,
|
5827
5987
|
PrintConv => { #(http://weblog.xanga.com/gryphondwb/615474010/iphone-ringtones---what-did-itunes-741-really-do.html)
|
5828
5988
|
0 => 'Movie (old)', #forum9059 (was Movie)
|
@@ -5844,6 +6004,7 @@ my %eeBox = (
|
|
5844
6004
|
tves => { #7/10
|
5845
6005
|
Name => 'TVEpisode',
|
5846
6006
|
Format => 'int32u',
|
6007
|
+
Writable => 'int32s', #27
|
5847
6008
|
},
|
5848
6009
|
tvnn => 'TVNetworkName', #7
|
5849
6010
|
tvsh => 'TVShow', #10
|
@@ -5854,7 +6015,8 @@ my %eeBox = (
|
|
5854
6015
|
yrrc => 'Year', #(ffmpeg source)
|
5855
6016
|
itnu => { #PH (iTunes 10.5)
|
5856
6017
|
Name => 'iTunesU',
|
5857
|
-
Format => '
|
6018
|
+
Format => 'int8u', #27
|
6019
|
+
Writable => 'int8s', #27
|
5858
6020
|
Description => 'iTunes U',
|
5859
6021
|
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
5860
6022
|
},
|
@@ -5904,6 +6066,27 @@ my %eeBox = (
|
|
5904
6066
|
PrintConv => \&PrintGPSCoordinates,
|
5905
6067
|
PrintConvInv => \&PrintInvGPSCoordinates,
|
5906
6068
|
},
|
6069
|
+
# the following tags written by iTunes 12.5.1.21
|
6070
|
+
# (ref https://www.ventismedia.com/mantis/view.php?id=14963
|
6071
|
+
# https://community.mp3tag.de/t/x-mp4-new-tag-problems/19488)
|
6072
|
+
"\xa9wrk" => 'Work', #PH
|
6073
|
+
"\xa9mvn" => 'MovementName', #PH
|
6074
|
+
"\xa9mvi" => { #PH
|
6075
|
+
Name => 'MovementNumber',
|
6076
|
+
Format => 'int16u', #27
|
6077
|
+
Writable => 'int16s', #27
|
6078
|
+
},
|
6079
|
+
"\xa9mvc" => { #PH
|
6080
|
+
Name => 'MovementCount',
|
6081
|
+
Format => 'int16u', #27
|
6082
|
+
Writable => 'int16s', #27
|
6083
|
+
},
|
6084
|
+
shwm => { #PH
|
6085
|
+
Name => 'ShowMovement',
|
6086
|
+
Format => 'int8u', #27
|
6087
|
+
Writable => 'int8s', #27
|
6088
|
+
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
6089
|
+
},
|
5907
6090
|
);
|
5908
6091
|
|
5909
6092
|
# tag decoded from timed face records
|
@@ -6123,6 +6306,21 @@ my %eeBox = (
|
|
6123
6306
|
'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 },
|
6124
6307
|
# (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float)
|
6125
6308
|
'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 },
|
6309
|
+
#
|
6310
|
+
# seen in Apple ProRes RAW file
|
6311
|
+
#
|
6312
|
+
# (mdta)com.apple.proapps.manufacturer (eg. "Sony")
|
6313
|
+
# (mdta)com.apple.proapps.exif.{Exif}.FNumber (float, eg. 1.0)
|
6314
|
+
# (mdta)org.smpte.rdd18.lens.irisfnumber (eg. "F1.0")
|
6315
|
+
# (mdta)com.apple.proapps.exif.{Exif}.ShutterSpeedValue (float, eg. 1.006)
|
6316
|
+
# (mdta)org.smpte.rdd18.camera.shutterspeed_angle (eg. "179.2deg")
|
6317
|
+
# (mdta)org.smpte.rdd18.camera.neutraldensityfilterwheelsetting (eg. "ND1")
|
6318
|
+
# (mdta)org.smpte.rdd18.camera.whitebalance (eg. "4300K")
|
6319
|
+
# (mdta)com.apple.proapps.exif.{Exif}.ExposureIndex (float, eg. 4000)
|
6320
|
+
# (mdta)org.smpte.rdd18.camera.isosensitivity (eg. "4000")
|
6321
|
+
# (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos")
|
6322
|
+
# (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno")
|
6323
|
+
# (mdta)com.apple.proapps.image.{TIFF}.Software (eg. "9.0")
|
6126
6324
|
);
|
6127
6325
|
|
6128
6326
|
# iTunes info ('----') atoms
|
@@ -6700,6 +6898,7 @@ my %eeBox = (
|
|
6700
6898
|
# alac - 28 bytes
|
6701
6899
|
# adrm - AAX DRM atom? 148 bytes
|
6702
6900
|
# aabd - AAX unknown 17kB (contains 'aavd' strings)
|
6901
|
+
# SA3D - written by Garmin VIRB360
|
6703
6902
|
);
|
6704
6903
|
|
6705
6904
|
# AMR decode config box (ref 3)
|
@@ -6730,13 +6929,28 @@ my %eeBox = (
|
|
6730
6929
|
Name => 'SchemeInfo',
|
6731
6930
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeInfo' },
|
6732
6931
|
},
|
6932
|
+
enda => {
|
6933
|
+
Name => 'Endianness',
|
6934
|
+
Format => 'int16u',
|
6935
|
+
PrintConv => {
|
6936
|
+
0 => 'Big-endian (Motorola, MM)',
|
6937
|
+
1 => 'Little-endian (Intel, II)',
|
6938
|
+
},
|
6939
|
+
},
|
6733
6940
|
# skcr
|
6734
|
-
# enda
|
6735
6941
|
);
|
6736
6942
|
|
6737
6943
|
%Image::ExifTool::QuickTime::Wave = (
|
6738
6944
|
PROCESS_PROC => \&ProcessMOV,
|
6739
6945
|
frma => 'PurchaseFileFormat',
|
6946
|
+
enda => {
|
6947
|
+
Name => 'Endianness',
|
6948
|
+
Format => 'int16u',
|
6949
|
+
PrintConv => {
|
6950
|
+
0 => 'Big-endian (Motorola, MM)',
|
6951
|
+
1 => 'Little-endian (Intel, II)',
|
6952
|
+
},
|
6953
|
+
},
|
6740
6954
|
# "ms\0\x11" - 20 bytes
|
6741
6955
|
);
|
6742
6956
|
|
@@ -7171,6 +7385,20 @@ my %eeBox = (
|
|
7171
7385
|
#
|
7172
7386
|
ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
|
7173
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
|
7174
7402
|
);
|
7175
7403
|
|
7176
7404
|
# MP4 data information box (ref 5)
|
@@ -7467,6 +7695,7 @@ my %eeBox = (
|
|
7467
7695
|
1 => 'QuickTime:HandlerType',
|
7468
7696
|
},
|
7469
7697
|
Writable => 1,
|
7698
|
+
Protected => 1,
|
7470
7699
|
WriteAlso => {
|
7471
7700
|
MatrixStructure => 'Image::ExifTool::QuickTime::GetRotationMatrix($val)',
|
7472
7701
|
},
|
@@ -8229,13 +8458,27 @@ sub HandleItemInfo($)
|
|
8229
8458
|
my ($start, $subTable, $proc);
|
8230
8459
|
my $pos = $$item{Extents}[0][1] + $base;
|
8231
8460
|
if ($name eq 'EXIF' and length $buff >= 4) {
|
8232
|
-
|
8233
|
-
|
8234
|
-
|
8235
|
-
|
8236
|
-
|
8237
|
-
|
8461
|
+
if ($buff =~ /^(MM\0\x2a|II\x2a\0)/) {
|
8462
|
+
$et->Warn('Missing Exif header');
|
8463
|
+
$start = 0;
|
8464
|
+
} elsif ($buff =~ /^Exif\0\0/) {
|
8465
|
+
# (haven't seen this yet, but it is just a matter of time
|
8466
|
+
# until someone screws it up like this)
|
8467
|
+
$et->Warn('Missing Exif header size');
|
8468
|
+
$start = 6;
|
8469
|
+
} else {
|
8470
|
+
my $n = unpack('N', $buff);
|
8471
|
+
$start = 4 + $n; # skip "Exif\0\0" header if it exists
|
8472
|
+
if ($start > length($buff)) {
|
8473
|
+
$et->Warn('Invalid EXIF header');
|
8474
|
+
next;
|
8475
|
+
}
|
8476
|
+
if ($$et{HTML_DUMP}) {
|
8477
|
+
$et->HDump($pos, 4, 'Exif header length', "Value: $n");
|
8478
|
+
$et->HDump($pos+4, $start-4, 'Exif header') if $n;
|
8479
|
+
}
|
8238
8480
|
}
|
8481
|
+
$subTable = GetTagTable('Image::ExifTool::Exif::Main');
|
8239
8482
|
$proc = \&Image::ExifTool::ProcessTIFF;
|
8240
8483
|
} else {
|
8241
8484
|
$start = 0;
|
@@ -8287,7 +8530,7 @@ sub EEWarn($)
|
|
8287
8530
|
#------------------------------------------------------------------------------
|
8288
8531
|
# Get quicktime format from flags word
|
8289
8532
|
# Inputs: 0) quicktime atom flags, 1) data length
|
8290
|
-
# Returns:
|
8533
|
+
# Returns: ExifTool format string
|
8291
8534
|
sub QuickTimeFormat($$)
|
8292
8535
|
{
|
8293
8536
|
my ($flags, $len) = @_;
|
@@ -8514,7 +8757,7 @@ sub ProcessKeys($$$)
|
|
8514
8757
|
my $ns = substr($$dataPt, $pos + 4, 4);
|
8515
8758
|
my $tag = substr($$dataPt, $pos + 8, $len - 8);
|
8516
8759
|
$tag =~ s/\0.*//s; # truncate at null
|
8517
|
-
$tag =~ s/^com\.apple\.quicktime
|
8760
|
+
$tag =~ s/^com\.(apple\.quicktime\.)?// if $ns eq 'mdta'; # remove apple quicktime domain
|
8518
8761
|
$tag = "Tag_$ns" unless $tag;
|
8519
8762
|
# (I have some samples where the tag is a reversed ItemList or UserData tag ID)
|
8520
8763
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
|
@@ -8546,9 +8789,10 @@ sub ProcessKeys($$$)
|
|
8546
8789
|
$$newInfo{Groups} = $groups ? { %$groups } : { };
|
8547
8790
|
$$newInfo{Groups}{$_} or $$newInfo{Groups}{$_} = $$tagTablePtr{GROUPS}{$_} foreach 0..2;
|
8548
8791
|
$$newInfo{Groups}{1} = 'Keys';
|
8549
|
-
} elsif ($tag =~ /^[-\w. ]+$/) {
|
8792
|
+
} elsif ($tag =~ /^[-\w. ]+$/ or $tag =~ /\w{4}/) {
|
8550
8793
|
# create info for tags with reasonable id's
|
8551
8794
|
my $name = ucfirst $tag;
|
8795
|
+
$name =~ tr/-0-9a-zA-Z_. //dc;
|
8552
8796
|
$name =~ s/[. ]+(.?)/\U$1/g;
|
8553
8797
|
$name =~ s/_([a-z])/_\U$1/g;
|
8554
8798
|
$name =~ s/([a-z])_([A-Z])/$1$2/g;
|
@@ -8569,7 +8813,7 @@ sub ProcessKeys($$$)
|
|
8569
8813
|
if ($newInfo) {
|
8570
8814
|
AddTagToTable($itemList, $id, $newInfo);
|
8571
8815
|
$msg or $msg = '';
|
8572
|
-
$out and print $out "$$et{INDENT}Added ItemList Tag $id = $tag$msg\n";
|
8816
|
+
$out and print $out "$$et{INDENT}Added ItemList Tag $id = ($ns) $tag$msg\n";
|
8573
8817
|
}
|
8574
8818
|
$pos += $len;
|
8575
8819
|
++$index;
|
@@ -9024,10 +9268,10 @@ ItemID: foreach $id (keys %$items) {
|
|
9024
9268
|
}
|
9025
9269
|
}
|
9026
9270
|
if ($ctry or $lang) {
|
9027
|
-
$
|
9028
|
-
if ($
|
9271
|
+
my $langCode = GetLangCode($lang, $ctry);
|
9272
|
+
if ($langCode) {
|
9029
9273
|
# get tagInfo for other language
|
9030
|
-
$langInfo = GetLangInfoQT($et, $tagInfo, $
|
9274
|
+
$langInfo = GetLangInfoQT($et, $tagInfo, $langCode);
|
9031
9275
|
# save other language tag ID's so we can delete later if necessary
|
9032
9276
|
if ($langInfo) {
|
9033
9277
|
$$tagInfo{OtherLang} or $$tagInfo{OtherLang} = [ ];
|
@@ -9044,7 +9288,7 @@ ItemID: foreach $id (keys %$items) {
|
|
9044
9288
|
Size => $len,
|
9045
9289
|
Format => $format,
|
9046
9290
|
Index => $index,
|
9047
|
-
Extra => sprintf(", Type='${type}', Flags=0x%x
|
9291
|
+
Extra => sprintf(", Type='${type}', Flags=0x%x, Lang=0x%.4x",$flags,$lang),
|
9048
9292
|
) if $verbose;
|
9049
9293
|
# use "Keys" in path instead of ItemList if this was defined by a Keys tag
|
9050
9294
|
my $isKey = $$tagInfo{Groups} && $$tagInfo{Groups}{1} && $$tagInfo{Groups}{1} eq 'Keys';
|