exiftool-vendored.pl 12.84.0 → 12.85.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.
- package/bin/Changes +25 -3
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +46 -46
- package/bin/build_geolocation +91 -18
- package/bin/exiftool +49 -47
- package/bin/lib/Image/ExifTool/Apple.pm +2 -1
- package/bin/lib/Image/ExifTool/Canon.pm +11 -2
- package/bin/lib/Image/ExifTool/DPX.pm +3 -3
- package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/lib/Image/ExifTool/Geolocation.pm +12 -8
- package/bin/lib/Image/ExifTool/ID3.pm +28 -6
- package/bin/lib/Image/ExifTool/Nikon.pm +19 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +64 -13
- package/bin/lib/Image/ExifTool/QuickTime.pm +23 -9
- package/bin/lib/Image/ExifTool/TagLookup.pm +3547 -3539
- package/bin/lib/Image/ExifTool/TagNames.pod +38 -9
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +2 -1
- package/bin/lib/Image/ExifTool/Writer.pl +1 -2
- package/bin/lib/Image/ExifTool/XMP.pm +2 -0
- package/bin/lib/Image/ExifTool.pm +15 -5
- package/bin/lib/Image/ExifTool.pod +65 -57
- package/bin/perl-Image-ExifTool.spec +45 -45
- package/bin/pp_build_exe.args +4 -4
- package/package.json +1 -1
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
# 1. Time zone name, terminated by newline
|
|
56
56
|
# "\0\0\0\0\x05" (feature codes added in v1.03)
|
|
57
57
|
# Feature codes:
|
|
58
|
-
# 1. Feature code,
|
|
58
|
+
# 1. Feature code, optional space-followed-by-feature-name, then newline
|
|
59
59
|
# "\0\0\0\0\0"
|
|
60
60
|
#
|
|
61
61
|
# Feature Codes v1.02: (see http://www.geonames.org/export/codes.html#P for descriptions)
|
|
@@ -70,7 +70,7 @@ package Image::ExifTool::Geolocation;
|
|
|
70
70
|
use strict;
|
|
71
71
|
use vars qw($VERSION $geoDir $altDir $dbInfo);
|
|
72
72
|
|
|
73
|
-
$VERSION = '1.
|
|
73
|
+
$VERSION = '1.08'; # (this is the module version number, not the database version)
|
|
74
74
|
|
|
75
75
|
my $debug; # set to output processing time for testing
|
|
76
76
|
|
|
@@ -82,7 +82,7 @@ sub Geolocate($;$);
|
|
|
82
82
|
|
|
83
83
|
my (@cityList, @countryList, @regionList, @subregionList, @timezoneList);
|
|
84
84
|
my (%countryNum, %regionNum, %subregionNum, %timezoneNum); # reverse lookups
|
|
85
|
-
my (@sortOrder, @altNames, %langLookup, $nCity, %featureCodes);
|
|
85
|
+
my (@sortOrder, @altNames, %langLookup, $nCity, %featureCodes, %featureTypes);
|
|
86
86
|
my ($lastArgs, %lastFound, @lastByPop, @lastByLat); # cached city matches
|
|
87
87
|
my $dbVer = '1.03';
|
|
88
88
|
my $sortedBy = 'Latitude';
|
|
@@ -200,7 +200,7 @@ sub ReadDatabase($)
|
|
|
200
200
|
$line = <DATFILE>;
|
|
201
201
|
last if length($line) == 6 and $line =~ /\0\0\0\0/;
|
|
202
202
|
chomp $line;
|
|
203
|
-
$line =~ s/
|
|
203
|
+
$featureTypes{$line} = $1 if $line =~ s/ (.*)//;
|
|
204
204
|
push @featureCodes, $line;
|
|
205
205
|
}
|
|
206
206
|
}
|
|
@@ -288,7 +288,7 @@ sub AddEntry(@)
|
|
|
288
288
|
my ($city, $region, $subregion, $cc, $country, $timezone, $fc, $pop, $lat, $lon, $altNames) = @_;
|
|
289
289
|
@_ < 10 and warn("Too few arguments in $city definition (check for updated format)\n"), return 0;
|
|
290
290
|
length($cc) != 2 and warn("Country code '${cc}' is not 2 characters\n"), return 0;
|
|
291
|
-
$fc =~ s/
|
|
291
|
+
$featureTypes{$fc} = $1 if $fc =~ s/ (.*)//;
|
|
292
292
|
my $fn = $featureCodes{lc $fc};
|
|
293
293
|
unless (defined $fn) {
|
|
294
294
|
if ($dbVer eq '1.02' or @featureCodes > 0x3f or not length $fc) {
|
|
@@ -372,7 +372,7 @@ sub AddEntry(@)
|
|
|
372
372
|
# Inputs: 0) entry number or index into sorted database,
|
|
373
373
|
# 1) optional language code, 2) flag to use index into sorted database
|
|
374
374
|
# Returns: 0-10) city,region,subregion,country_code,country,timezone,
|
|
375
|
-
# feature_code,pop,lat,lon,
|
|
375
|
+
# feature_code,pop,lat,lon,feature_type
|
|
376
376
|
sub GetEntry($;$$)
|
|
377
377
|
{
|
|
378
378
|
my ($entryNum, $lang, $sort) = @_;
|
|
@@ -395,7 +395,8 @@ sub GetEntry($;$$)
|
|
|
395
395
|
my $fc = $featureCodes[$fn & 0x3f] || 'Other';
|
|
396
396
|
my $cc = substr($ctry, 0, 2);
|
|
397
397
|
my $country = substr($ctry, 2);
|
|
398
|
-
|
|
398
|
+
my $ft = $featureTypes{$fc};
|
|
399
|
+
if ($lang and $lang ne 'en') {
|
|
399
400
|
my $xlat = $langLookup{$lang};
|
|
400
401
|
# load language lookups if not done already
|
|
401
402
|
if (not defined $xlat) {
|
|
@@ -429,9 +430,10 @@ sub GetEntry($;$$)
|
|
|
429
430
|
$sub = $$xlat{"$cc$rgn,$sub,"} || $$xlat{$sub} || $sub;
|
|
430
431
|
$rgn = $$xlat{"$cc$rgn,"} || $$xlat{$rgn} || $rgn;
|
|
431
432
|
$country = $$xlat{"$cc,"} || $$xlat{$country} || $country;
|
|
433
|
+
$ft = $$xlat{$fc} if $$xlat{$fc};
|
|
432
434
|
}
|
|
433
435
|
}
|
|
434
|
-
return($city,$rgn,$sub,$cc,$country,$timezoneList[$tn],$fc,$pop,$lt,$ln);
|
|
436
|
+
return($city,$rgn,$sub,$cc,$country,$timezoneList[$tn],$fc,$pop,$lt,$ln,$ft);
|
|
435
437
|
}
|
|
436
438
|
|
|
437
439
|
#------------------------------------------------------------------------------
|
|
@@ -863,6 +865,8 @@ item Return Values:
|
|
|
863
865
|
|
|
864
866
|
9) GPS longitude
|
|
865
867
|
|
|
868
|
+
10) Feature type, or undef
|
|
869
|
+
|
|
866
870
|
=back
|
|
867
871
|
|
|
868
872
|
=head2 GetAltNames
|
|
@@ -103,6 +103,14 @@ my %dateTimeConv = (
|
|
|
103
103
|
},
|
|
104
104
|
);
|
|
105
105
|
|
|
106
|
+
%Image::ExifTool::ID3::UserDefined = (
|
|
107
|
+
GROUPS => { 1 => 'UserDefined', 2 => 'Other' },
|
|
108
|
+
NOTES => q{
|
|
109
|
+
ID3 user-defined text and URL tags will be dynamically added to this table
|
|
110
|
+
by name when found.
|
|
111
|
+
},
|
|
112
|
+
);
|
|
113
|
+
|
|
106
114
|
# Lyrics3 tags (ref 4)
|
|
107
115
|
%Image::ExifTool::ID3::Lyrics3 = (
|
|
108
116
|
GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' },
|
|
@@ -493,7 +501,7 @@ my %genre = (
|
|
|
493
501
|
TT2 => 'Title',
|
|
494
502
|
TT3 => 'Subtitle',
|
|
495
503
|
TXT => 'Lyricist',
|
|
496
|
-
TXX => '
|
|
504
|
+
TXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
|
|
497
505
|
TYE => { Name => 'Year', Groups => { 2 => 'Time' } },
|
|
498
506
|
ULT => 'Lyrics',
|
|
499
507
|
WAF => 'FileURL',
|
|
@@ -502,7 +510,7 @@ my %genre = (
|
|
|
502
510
|
WCM => 'CommercialURL',
|
|
503
511
|
WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } },
|
|
504
512
|
WPB => 'PublisherURL',
|
|
505
|
-
WXX => '
|
|
513
|
+
WXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
|
|
506
514
|
# the following written by iTunes 10.5 (ref PH)
|
|
507
515
|
RVA => 'RelativeVolumeAdjustment',
|
|
508
516
|
TST => 'TitleSortOrder',
|
|
@@ -605,7 +613,7 @@ my %id3v2_common = (
|
|
|
605
613
|
TRSO => 'InternetRadioStationOwner',
|
|
606
614
|
TSRC => 'ISRC', # (international standard recording code)
|
|
607
615
|
TSSE => 'EncoderSettings',
|
|
608
|
-
TXXX => '
|
|
616
|
+
TXXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
|
|
609
617
|
# UFID => 'UniqueFileID', (not extracted because it is long and nasty and not very useful)
|
|
610
618
|
USER => 'TermsOfUse',
|
|
611
619
|
USLT => 'Lyrics',
|
|
@@ -617,7 +625,7 @@ my %id3v2_common = (
|
|
|
617
625
|
WORS => 'InternetRadioStationURL',
|
|
618
626
|
WPAY => 'PaymentURL',
|
|
619
627
|
WPUB => 'PublisherURL',
|
|
620
|
-
WXXX => '
|
|
628
|
+
WXXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } },
|
|
621
629
|
#
|
|
622
630
|
# non-standard frames
|
|
623
631
|
#
|
|
@@ -1247,7 +1255,14 @@ sub ProcessID3v2($$$)
|
|
|
1247
1255
|
# two encoded strings separated by a null
|
|
1248
1256
|
my @vals = DecodeString($et, $val);
|
|
1249
1257
|
foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
|
|
1250
|
-
|
|
1258
|
+
$vals[0] .= ' ' if $Image::ExifTool::specialTags{$vals[0]};
|
|
1259
|
+
my $tbl = GetTagTable('Image::ExifTool::ID3::UserDefined');
|
|
1260
|
+
unless (defined $$tbl{$vals[0]}) {
|
|
1261
|
+
my $name = Image::ExifTool::MakeTagName($vals[0]);
|
|
1262
|
+
AddTagToTable($tbl, $vals[0], $name, 1);
|
|
1263
|
+
}
|
|
1264
|
+
$et->HandleTag($tbl, $vals[0], $vals[1]);
|
|
1265
|
+
next;
|
|
1251
1266
|
} elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS|GP1|MVI|MVN)$/) {
|
|
1252
1267
|
$val = DecodeString($et, $val);
|
|
1253
1268
|
} elsif ($id =~ /^(WXX|WXXX)$/) {
|
|
@@ -1265,7 +1280,14 @@ sub ProcessID3v2($$$)
|
|
|
1265
1280
|
}
|
|
1266
1281
|
$val = DecodeString($et, $val);
|
|
1267
1282
|
$url =~ s/\0.*//s;
|
|
1268
|
-
$val
|
|
1283
|
+
$val .= '_URL';
|
|
1284
|
+
my $tbl = GetTagTable('Image::ExifTool::ID3::UserDefined');
|
|
1285
|
+
unless (defined $$tbl{$val}) {
|
|
1286
|
+
my $name = Image::ExifTool::MakeTagName($val);
|
|
1287
|
+
AddTagToTable($tbl, $val, $name, 1);
|
|
1288
|
+
}
|
|
1289
|
+
$et->HandleTag($tbl, $val, $url);
|
|
1290
|
+
next;
|
|
1269
1291
|
} elsif ($id =~ /^W/) {
|
|
1270
1292
|
$val =~ s/\0.*//s; # truncate at null
|
|
1271
1293
|
} elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
|
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
|
65
65
|
use Image::ExifTool::GPS;
|
|
66
66
|
use Image::ExifTool::XMP;
|
|
67
67
|
|
|
68
|
-
$VERSION = '4.
|
|
68
|
+
$VERSION = '4.34';
|
|
69
69
|
|
|
70
70
|
sub LensIDConv($$$);
|
|
71
71
|
sub ProcessNikonAVI($$$);
|
|
@@ -13688,6 +13688,24 @@ sub ProcessNikonCaptureOffsets($$$)
|
|
|
13688
13688
|
return $success;
|
|
13689
13689
|
}
|
|
13690
13690
|
|
|
13691
|
+
#------------------------------------------------------------------------------
|
|
13692
|
+
# Read Nikon NKA file
|
|
13693
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref
|
|
13694
|
+
# Returns: 1 on success
|
|
13695
|
+
sub ProcessNKA($$)
|
|
13696
|
+
{
|
|
13697
|
+
my ($et, $dirInfo) = @_;
|
|
13698
|
+
my $raf = $$et{RAF};
|
|
13699
|
+
my $buff;
|
|
13700
|
+
$raf->Read($buff, 0x35) == 0x35 or return 0;
|
|
13701
|
+
my $len = unpack('x49V', $buff);
|
|
13702
|
+
$raf->Read($buff, $len) == $len or return 0;
|
|
13703
|
+
$et->SetFileType('NKA', 'application/x-nikon-nxstudio');
|
|
13704
|
+
my %dirInfo = ( DataPt => \$buff, DataPos => 0x35 );
|
|
13705
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::XML');
|
|
13706
|
+
return $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
13707
|
+
}
|
|
13708
|
+
|
|
13691
13709
|
#------------------------------------------------------------------------------
|
|
13692
13710
|
# Read/write Nikon MakerNotes directory
|
|
13693
13711
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
@@ -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.47';
|
|
62
62
|
|
|
63
63
|
sub CryptShutterCount($$);
|
|
64
64
|
sub PrintFilter($$$);
|
|
@@ -2741,8 +2741,8 @@ my %binaryDataAttrs = (
|
|
|
2741
2741
|
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo2' },
|
|
2742
2742
|
},{
|
|
2743
2743
|
Name => 'AEInfo3',
|
|
2744
|
-
# size: K-30=48
|
|
2745
|
-
Condition => '$count == 48',
|
|
2744
|
+
# size: K-30=48, K-1mkII,K-70,KP=64
|
|
2745
|
+
Condition => '$count == 48 or $count == 64',
|
|
2746
2746
|
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo3' },
|
|
2747
2747
|
},{
|
|
2748
2748
|
Name => 'AEInfoUnknown',
|
|
@@ -2972,10 +2972,14 @@ my %binaryDataAttrs = (
|
|
|
2972
2972
|
ByteOrder => 'BigEndian',
|
|
2973
2973
|
},
|
|
2974
2974
|
}],
|
|
2975
|
-
0x022b => {
|
|
2975
|
+
0x022b => [{
|
|
2976
|
+
Name => 'LevelInfoK3III',
|
|
2977
|
+
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"',
|
|
2978
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LevelInfoK3III' },
|
|
2979
|
+
},{ #PH (K-5)
|
|
2976
2980
|
Name => 'LevelInfo',
|
|
2977
2981
|
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LevelInfo' },
|
|
2978
|
-
},
|
|
2982
|
+
}],
|
|
2979
2983
|
# 0x022c - undef[46] (K-5)
|
|
2980
2984
|
0x022d => { #28
|
|
2981
2985
|
Name => 'WBLevels',
|
|
@@ -4034,7 +4038,10 @@ my %binaryDataAttrs = (
|
|
|
4034
4038
|
%Image::ExifTool::Pentax::AEInfo3 = (
|
|
4035
4039
|
%binaryDataAttrs,
|
|
4036
4040
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4037
|
-
NOTES =>
|
|
4041
|
+
NOTES => q{
|
|
4042
|
+
Auto-exposure information for the K-1mkII, K-3, K-30, K-50, K-70, K-500 and
|
|
4043
|
+
KP.
|
|
4044
|
+
},
|
|
4038
4045
|
# instead of /8, should these be PentaxEv(), as in CameraSettings? - PH
|
|
4039
4046
|
16 => {
|
|
4040
4047
|
Name => 'AEExposureTime',
|
|
@@ -4060,6 +4067,7 @@ my %binaryDataAttrs = (
|
|
|
4060
4067
|
PrintConv => 'int($val + 0.5)',
|
|
4061
4068
|
PrintConvInv => '$val',
|
|
4062
4069
|
},
|
|
4070
|
+
# 23 - bit 0 is related to LiveView, but it isn't reliable
|
|
4063
4071
|
28 => {
|
|
4064
4072
|
Name => 'AEMaxAperture',
|
|
4065
4073
|
Notes => 'val = 2**((raw-68)/16)',
|
|
@@ -4676,8 +4684,9 @@ my %binaryDataAttrs = (
|
|
|
4676
4684
|
# battery grips available for:
|
|
4677
4685
|
# BG1 (*istD), BG2 (K10D/K20D), BG3 (K200D), BG4 (K-7,K-5)
|
|
4678
4686
|
# no grip available: K-x
|
|
4679
|
-
0.1 => { #19
|
|
4687
|
+
0.1 => [{ #19
|
|
4680
4688
|
Name => 'PowerSource',
|
|
4689
|
+
Condition => '$$self{Model} !~ /K-3 Mark III/',
|
|
4681
4690
|
Mask => 0x0f,
|
|
4682
4691
|
# have seen the upper bit set (value of 0x82) for the
|
|
4683
4692
|
# *istDS and K100D, but I'm not sure what this means - PH
|
|
@@ -4688,7 +4697,20 @@ my %binaryDataAttrs = (
|
|
|
4688
4697
|
3 => 'Grip Battery',
|
|
4689
4698
|
4 => 'External Power Supply', #PH
|
|
4690
4699
|
},
|
|
4691
|
-
},
|
|
4700
|
+
},{ #PH
|
|
4701
|
+
Name => 'PowerSource',
|
|
4702
|
+
Mask => 0x0f,
|
|
4703
|
+
Notes => 'K-3III',
|
|
4704
|
+
# have seen the upper bit set (value of 0x82) for the
|
|
4705
|
+
# *istDS and K100D, but I'm not sure what this means - PH
|
|
4706
|
+
# I've also seen: 0x42 (K2000), 0xf2 (K-7,K-r,K-5), 0x12,0x22 (K-x) - PH
|
|
4707
|
+
PrintConv => {
|
|
4708
|
+
1 => 'Body Battery',
|
|
4709
|
+
2 => 'Grip Battery',
|
|
4710
|
+
4 => 'External Power Supply',
|
|
4711
|
+
},
|
|
4712
|
+
},{
|
|
4713
|
+
}],
|
|
4692
4714
|
1.1 => [
|
|
4693
4715
|
{
|
|
4694
4716
|
Name => 'BodyBatteryState',
|
|
@@ -4703,8 +4725,8 @@ my %binaryDataAttrs = (
|
|
|
4703
4725
|
},
|
|
4704
4726
|
},{
|
|
4705
4727
|
Name => 'BodyBatteryState',
|
|
4706
|
-
Condition => '$$self{Model} !~ /(K110D|K2000|K-m)\b/',
|
|
4707
|
-
Notes => 'other models except the K110D, K2000 and K-
|
|
4728
|
+
Condition => '$$self{Model} !~ /(K110D|K2000|K-m|K-3 Mark III)\b/',
|
|
4729
|
+
Notes => 'most other models except the K110D, K2000, K-m and K-3III',
|
|
4708
4730
|
Mask => 0xf0,
|
|
4709
4731
|
PrintConv => {
|
|
4710
4732
|
1 => 'Empty or Missing',
|
|
@@ -4715,7 +4737,8 @@ my %binaryDataAttrs = (
|
|
|
4715
4737
|
},
|
|
4716
4738
|
},{
|
|
4717
4739
|
Name => 'BodyBatteryState',
|
|
4718
|
-
Notes => 'decoding unknown for
|
|
4740
|
+
Notes => 'decoding unknown for some models',
|
|
4741
|
+
Unknown => 1, # (doesn't appear to be valid for the K-3 III)
|
|
4719
4742
|
Mask => 0xf0,
|
|
4720
4743
|
},
|
|
4721
4744
|
],
|
|
@@ -4758,7 +4781,7 @@ my %binaryDataAttrs = (
|
|
|
4758
4781
|
},
|
|
4759
4782
|
{
|
|
4760
4783
|
Name => 'BodyBatteryVoltage1', # (static?)
|
|
4761
|
-
Condition => '$$self{Model}
|
|
4784
|
+
Condition => '$$self{Model} =~ /(645D|645Z|K-(1|01|3|5|7|30|50|70|500|r|x|S[12])|KP)\b/ and $$self{Model} !~ /III/',
|
|
4762
4785
|
Format => 'int16u',
|
|
4763
4786
|
ValueConv => '$val / 100',
|
|
4764
4787
|
ValueConvInv => '$val * 100',
|
|
@@ -4797,7 +4820,7 @@ my %binaryDataAttrs = (
|
|
|
4797
4820
|
},
|
|
4798
4821
|
{
|
|
4799
4822
|
Name => 'BodyBatteryVoltage2', # (less than BodyBatteryVoltage1 -- under load?)
|
|
4800
|
-
Condition => '$$self{Model}
|
|
4823
|
+
Condition => '$$self{Model} =~ /(645D|645Z|K-(1|01|3|5|7|30|50|70|500|r|x|S[12])|KP)\b/ and $$self{Model} !~ /III/',
|
|
4801
4824
|
Format => 'int16u',
|
|
4802
4825
|
ValueConv => '$val / 100',
|
|
4803
4826
|
ValueConvInv => '$val * 100',
|
|
@@ -4940,6 +4963,12 @@ my %binaryDataAttrs = (
|
|
|
4940
4963
|
20 => 'Mid-right',
|
|
4941
4964
|
},
|
|
4942
4965
|
},
|
|
4966
|
+
0x1fa => {
|
|
4967
|
+
Name => 'LiveView',
|
|
4968
|
+
Notes => 'decoded only for the K-3 III',
|
|
4969
|
+
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # and other models?
|
|
4970
|
+
PrintConv => { 0 => 'Off', 1 => 'On' },
|
|
4971
|
+
},
|
|
4943
4972
|
0x1fd => {
|
|
4944
4973
|
Name => 'AFHold',
|
|
4945
4974
|
Notes => 'decoded only for the K-3 II',
|
|
@@ -5006,6 +5035,10 @@ my %binaryDataAttrs = (
|
|
|
5006
5035
|
1 => 'As EV Steps',
|
|
5007
5036
|
},
|
|
5008
5037
|
},
|
|
5038
|
+
3 => { #PH
|
|
5039
|
+
Name => 'LiveView',
|
|
5040
|
+
PrintConv => { 0 => 'Off', 1 => 'On' },
|
|
5041
|
+
},
|
|
5009
5042
|
);
|
|
5010
5043
|
|
|
5011
5044
|
# shot information? - ref PH (K-5)
|
|
@@ -5483,6 +5516,24 @@ my %binaryDataAttrs = (
|
|
|
5483
5516
|
},
|
|
5484
5517
|
);
|
|
5485
5518
|
|
|
5519
|
+
%Image::ExifTool::Pentax::LevelInfoK3III = (
|
|
5520
|
+
%binaryDataAttrs,
|
|
5521
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
5522
|
+
FORMAT => 'int8s',
|
|
5523
|
+
NOTES => 'Tags decoded from the electronic level information for the K-3 III.',
|
|
5524
|
+
3 => {
|
|
5525
|
+
Name => 'RollAngle',
|
|
5526
|
+
Format => 'int16s',
|
|
5527
|
+
ValueConv => '-$val / 2',
|
|
5528
|
+
ValueConvInv => '-$val * 2',
|
|
5529
|
+
},
|
|
5530
|
+
5 => {
|
|
5531
|
+
Name => 'PitchAngle',
|
|
5532
|
+
Format => 'int16s',
|
|
5533
|
+
ValueConv => '-$val / 2',
|
|
5534
|
+
ValueConvInv => '-$val * 2',
|
|
5535
|
+
},
|
|
5536
|
+
);
|
|
5486
5537
|
# white balance RGGB levels (ref 28)
|
|
5487
5538
|
%Image::ExifTool::Pentax::WBLevels = (
|
|
5488
5539
|
%binaryDataAttrs,
|
|
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
48
48
|
use Image::ExifTool::Exif;
|
|
49
49
|
use Image::ExifTool::GPS;
|
|
50
50
|
|
|
51
|
-
$VERSION = '2.
|
|
51
|
+
$VERSION = '2.97';
|
|
52
52
|
|
|
53
53
|
sub ProcessMOV($$;$);
|
|
54
54
|
sub ProcessKeys($$$);
|
|
@@ -2332,6 +2332,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
2332
2332
|
Binary => 1,
|
|
2333
2333
|
}],
|
|
2334
2334
|
# ---- Ricoh ----
|
|
2335
|
+
RICO => { #PH (G900SE)
|
|
2336
|
+
Name => 'RicohInfo',
|
|
2337
|
+
Condition => '$$valPt =~ /^\xff\xe1..Exif\0\0/s',
|
|
2338
|
+
SubDirectory => {
|
|
2339
|
+
TagTable => 'Image::ExifTool::Exif::Main',
|
|
2340
|
+
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
|
2341
|
+
Start => 10,
|
|
2342
|
+
Base => '$start',
|
|
2343
|
+
}
|
|
2344
|
+
},
|
|
2335
2345
|
RTHU => { #PH (GR)
|
|
2336
2346
|
Name => 'PreviewImage',
|
|
2337
2347
|
Groups => { 2 => 'Preview' },
|
|
@@ -2929,8 +2939,12 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
2929
2939
|
Format => 'int8u',
|
|
2930
2940
|
Writable => 'int8u',
|
|
2931
2941
|
Protected => 1,
|
|
2932
|
-
|
|
2933
|
-
|
|
2942
|
+
PrintConv => {
|
|
2943
|
+
0 => 'Horizontal (Normal)',
|
|
2944
|
+
1 => 'Rotate 270 CW',
|
|
2945
|
+
2 => 'Rotate 180',
|
|
2946
|
+
3 => 'Rotate 90 CW',
|
|
2947
|
+
},
|
|
2934
2948
|
},
|
|
2935
2949
|
ispe => {
|
|
2936
2950
|
Name => 'ImageSpatialExtent',
|
|
@@ -3425,7 +3439,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
3425
3439
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' },
|
|
3426
3440
|
},
|
|
3427
3441
|
aART => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } },
|
|
3428
|
-
covr => { Name => 'CoverArt', Groups => { 2 => 'Preview' } },
|
|
3442
|
+
covr => { Name => 'CoverArt', Groups => { 2 => 'Preview' }, Binary => 1 },
|
|
3429
3443
|
cpil => { #10
|
|
3430
3444
|
Name => 'Compilation',
|
|
3431
3445
|
Format => 'int8u', #27 (ref 23 contradicts what AtomicParsley actually writes, which is int8s)
|
|
@@ -6497,8 +6511,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
6497
6511
|
ownr => 'Owner', #PH (obscure) (ref ChrisAdan private communication)
|
|
6498
6512
|
'xid ' => 'ISRC', #PH
|
|
6499
6513
|
# found in DJI Osmo Action4 video
|
|
6500
|
-
tnal => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' } },
|
|
6501
|
-
snal => { Name => 'PreviewImage', Groups => { 2 => 'Preview' } },
|
|
6514
|
+
tnal => { Name => 'ThumbnailImage', Binary => 1, Groups => { 2 => 'Preview' } },
|
|
6515
|
+
snal => { Name => 'PreviewImage', Binary => 1, Groups => { 2 => 'Preview' } },
|
|
6502
6516
|
);
|
|
6503
6517
|
|
|
6504
6518
|
# tag decoded from timed face records
|
|
@@ -8255,8 +8269,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
8255
8269
|
GROUPS => { 2 => 'Video' },
|
|
8256
8270
|
Rotation => {
|
|
8257
8271
|
Notes => q{
|
|
8258
|
-
|
|
8259
|
-
non-zero image size
|
|
8272
|
+
degrees of clockwise camera rotation. Writing this tag updates QuickTime
|
|
8273
|
+
MatrixStructure for all tracks with a non-zero image size
|
|
8260
8274
|
},
|
|
8261
8275
|
Require => {
|
|
8262
8276
|
0 => 'QuickTime:MatrixStructure',
|
|
@@ -9758,7 +9772,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
9758
9772
|
}
|
|
9759
9773
|
# use value to get tag info if necessary
|
|
9760
9774
|
$tagInfo or $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
|
|
9761
|
-
my $hasData = ($$dirInfo{HasData} and $val =~
|
|
9775
|
+
my $hasData = ($$dirInfo{HasData} and $val =~ /^....data\0/s);
|
|
9762
9776
|
if ($verbose and not $hasData) {
|
|
9763
9777
|
my $tval;
|
|
9764
9778
|
if ($tagInfo and $$tagInfo{Format}) {
|