exiftool_vendored 11.86.0 → 11.88.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +38 -16
- data/bin/MANIFEST +3 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +34 -33
- data/bin/config_files/acdsee.config +1 -3
- data/bin/config_files/depthmap.config +56 -0
- data/bin/config_files/example.config +2 -0
- data/bin/config_files/gps2utm.config +1 -1
- data/bin/config_files/tiff_version.config +1 -1
- data/bin/exiftool +56 -39
- data/bin/fmt_files/gpx_wpt.fmt +1 -1
- data/bin/lib/Image/ExifTool.pm +32 -7
- data/bin/lib/Image/ExifTool.pod +53 -52
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +3 -3
- data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- data/bin/lib/Image/ExifTool/DNG.pm +1 -1
- data/bin/lib/Image/ExifTool/Exif.pm +3 -3
- data/bin/lib/Image/ExifTool/FITS.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +5 -5
- data/bin/lib/Image/ExifTool/Flash.pm +1 -1
- data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
- data/bin/lib/Image/ExifTool/Font.pm +2 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +23 -7
- data/bin/lib/Image/ExifTool/GIF.pm +1 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- data/bin/lib/Image/ExifTool/MIE.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
- data/bin/lib/Image/ExifTool/Olympus.pm +4 -2
- data/bin/lib/Image/ExifTool/PDF.pm +2 -2
- data/bin/lib/Image/ExifTool/PNG.pm +10 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +3 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +9 -4
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/README +51 -51
- data/bin/lib/Image/ExifTool/RIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
- data/bin/lib/Image/ExifTool/Sony.pm +1 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +1725 -1617
- data/bin/lib/Image/ExifTool/TagNames.pod +307 -9
- data/bin/lib/Image/ExifTool/Text.pm +59 -10
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +27 -12
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +25 -7
- data/bin/lib/Image/ExifTool/XMP.pm +6 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +213 -1
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/perl-Image-ExifTool.spec +30 -30
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -454,7 +454,7 @@ sub WriteCanonRaw($$$)
|
|
454
454
|
# pad with original garbage in case it contained something useful
|
455
455
|
$value .= substr($buff, $pt+2+8-$len, 8-$len);
|
456
456
|
} elsif ($len > 8) { # this shouldn't happen
|
457
|
-
warn "Value too long! --
|
457
|
+
warn "Value too long! -- truncated\n";
|
458
458
|
$value = substr($value, 0, 8);
|
459
459
|
}
|
460
460
|
# create new directory entry
|
@@ -13,7 +13,7 @@ use strict;
|
|
13
13
|
|
14
14
|
#------------------------------------------------------------------------------
|
15
15
|
# Calculate CRC or update running CRC (ref 1)
|
16
|
-
# Inputs: 0) data reference, 1) running crc to update (undef
|
16
|
+
# Inputs: 0) data reference, 1) running crc to update (undef initially)
|
17
17
|
# 2) data position (undef for 0), 3) data length (undef for all data),
|
18
18
|
# Returns: updated CRC
|
19
19
|
my @crcTable;
|
@@ -532,7 +532,7 @@ sub WriteItemInfo($$$)
|
|
532
532
|
} elsif ($n <= 0xffffffff) {
|
533
533
|
Set32u($n, $outfile, $$boxPos{iloc}[0] + 8 + $lenPt);
|
534
534
|
} else {
|
535
|
-
$et->Error("Can't yet promote iloc
|
535
|
+
$et->Error("Can't yet promote iloc length to 64 bits");
|
536
536
|
return ();
|
537
537
|
}
|
538
538
|
$n = 0;
|
@@ -621,18 +621,21 @@ sub WriteItemInfo($$$)
|
|
621
621
|
my $nlen = ($siz >> 8) & 0x0f;
|
622
622
|
my $nbas = ($siz >> 4) & 0x0f;
|
623
623
|
my $nind = $siz & 0x0f;
|
624
|
-
my $
|
624
|
+
my ($pbas, $poff);
|
625
625
|
if ($ilocVer == 0) {
|
626
626
|
# set offset to 0 as flag that this is a new idat chunk being added
|
627
|
-
$
|
627
|
+
$pbas = length($add{iloc}) + 4;
|
628
|
+
$poff = $pbas + $nbas + 2;
|
628
629
|
$add{iloc} .= pack('nn',$id,0) . SetVarInt(0,$nbas) . Set16u(1) .
|
629
630
|
SetVarInt(0,$noff) . SetVarInt(length($newVal),$nlen);
|
630
631
|
} elsif ($ilocVer == 1) {
|
631
|
-
$
|
632
|
+
$pbas = length($add{iloc}) + 6;
|
633
|
+
$poff = $pbas + $nbas + 2 + $nind;
|
632
634
|
$add{iloc} .= pack('nnn',$id,0,0) . SetVarInt(0,$nbas) . Set16u(1) . SetVarInt(0,$nind) .
|
633
635
|
SetVarInt(0,$noff) . SetVarInt(length($newVal),$nlen);
|
634
636
|
} elsif ($ilocVer == 2) {
|
635
|
-
$
|
637
|
+
$pbas = length($add{iloc}) + 8;
|
638
|
+
$poff = $pbas + $nbas + 2 + $nind;
|
636
639
|
$add{iloc} .= pack('Nnn',$id,0,0) . SetVarInt(0,$nbas) . Set16u(1) . SetVarInt(0,$nind) .
|
637
640
|
SetVarInt(0,$noff) . SetVarInt(length($newVal),$nlen);
|
638
641
|
} else {
|
@@ -643,9 +646,19 @@ sub WriteItemInfo($$$)
|
|
643
646
|
my $off = $$dirInfo{ChunkOffset} or $et->Warn('Internal error. Missing ChunkOffset'), last;
|
644
647
|
my $newOff;
|
645
648
|
if ($noff == 4) {
|
646
|
-
$newOff = [ 'stco_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $
|
649
|
+
$newOff = [ 'stco_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $poff, $noff, 0, $id ];
|
647
650
|
} elsif ($noff == 8) {
|
648
|
-
$newOff = [ 'co64_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $
|
651
|
+
$newOff = [ 'co64_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $poff, $noff, 0, $id ];
|
652
|
+
} elsif ($noff == 0) {
|
653
|
+
# offset_size is zero, so store the offset in base_offset instead
|
654
|
+
if ($nbas == 4) {
|
655
|
+
$newOff = [ 'stco_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $pbas, $nbas, 0, $id ];
|
656
|
+
} elsif ($nbas == 8) {
|
657
|
+
$newOff = [ 'co64_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $pbas, $nbas, 0, $id ];
|
658
|
+
} else {
|
659
|
+
$et->Warn("Can't create $name. Invalid iloc offset+base size");
|
660
|
+
last;
|
661
|
+
}
|
649
662
|
} else {
|
650
663
|
$et->Warn("Can't create $name. Invalid iloc offset size");
|
651
664
|
last;
|
@@ -1093,7 +1106,7 @@ sub WriteQuickTime($$$)
|
|
1093
1106
|
my $newVal = $et->GetNewValue($nvHash);
|
1094
1107
|
next unless defined $newVal;
|
1095
1108
|
my $prVal = $newVal;
|
1096
|
-
my $flags = FormatQTValue($et, \$newVal,
|
1109
|
+
my $flags = FormatQTValue($et, \$newVal, $format);
|
1097
1110
|
next unless defined $newVal;
|
1098
1111
|
my ($ctry, $lang) = (0, $undLang);
|
1099
1112
|
if ($$ti{LangCode}) {
|
@@ -1149,7 +1162,6 @@ sub WriteQuickTime($$$)
|
|
1149
1162
|
$val =~ s/\0$// unless $$tagInfo{Binary};
|
1150
1163
|
$flags = 0x01; # write all strings as UTF-8
|
1151
1164
|
} else {
|
1152
|
-
$format = $$tagInfo{Format};
|
1153
1165
|
if ($format) {
|
1154
1166
|
# update flags for the format we are writing
|
1155
1167
|
$flags = $qtFormat{$format} if $qtFormat{$format};
|
@@ -1171,7 +1183,7 @@ sub WriteQuickTime($$$)
|
|
1171
1183
|
}
|
1172
1184
|
my $prVal = $newVal;
|
1173
1185
|
# format new value for writing (and get new flags)
|
1174
|
-
$flags = FormatQTValue($et, \$newVal,
|
1186
|
+
$flags = FormatQTValue($et, \$newVal, $format);
|
1175
1187
|
my $grp = $et->GetGroup($langInfo, 1);
|
1176
1188
|
$et->VerboseValue("- $grp:$$langInfo{Name}", $val);
|
1177
1189
|
$et->VerboseValue("+ $grp:$$langInfo{Name}", $prVal);
|
@@ -1245,11 +1257,14 @@ sub WriteQuickTime($$$)
|
|
1245
1257
|
} else {
|
1246
1258
|
$newData = pack('nn', length($newData), $lang) . $newData;
|
1247
1259
|
}
|
1248
|
-
} elsif (not
|
1249
|
-
|
1260
|
+
} elsif (not $format or $format =~ /^string/ and
|
1261
|
+
not $$tagInfo{Binary} and not $$tagInfo{ValueConv})
|
1250
1262
|
{
|
1251
1263
|
# write all strings as UTF-8
|
1252
1264
|
$newData = $et->Encode($newData, 'UTF8');
|
1265
|
+
} elsif ($format and not $$tagInfo{Binary}) {
|
1266
|
+
# format new value for writing
|
1267
|
+
$newData = WriteValue($newData, $format);
|
1253
1268
|
}
|
1254
1269
|
}
|
1255
1270
|
$$didTag{$nvHash} = 1; # set flag so we don't add this tag again
|
@@ -745,7 +745,7 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
745
745
|
}
|
746
746
|
$writeGroup{$tagInfo} = $writeGroup;
|
747
747
|
}
|
748
|
-
# sort tag info list in reverse order of priority (
|
748
|
+
# sort tag info list in reverse order of priority (highest number last)
|
749
749
|
# so we get the highest priority error message in the end
|
750
750
|
@tagInfoList = sort { $tagPriority{$a} <=> $tagPriority{$b} } @tagInfoList;
|
751
751
|
# must write any tags which also write other tags first
|
@@ -857,7 +857,7 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
857
857
|
# check to make sure this is a List or Shift tag if adding
|
858
858
|
if ($addValue and not ($shift or $$tagInfo{List})) {
|
859
859
|
if ($addValue eq '2') {
|
860
|
-
undef $addValue; #
|
860
|
+
undef $addValue; # quietly reset this option
|
861
861
|
} else {
|
862
862
|
$err = "Can't add $wgrp1:$tag (not a List type)";
|
863
863
|
$verbose > 2 and print $out "$err\n";
|
@@ -1338,13 +1338,13 @@ sub SetNewValuesFromFile($$;@)
|
|
1338
1338
|
foreach $tag (@tags) {
|
1339
1339
|
# don't try to set errors or warnings
|
1340
1340
|
next if $tag =~ /^(Error|Warning)\b/;
|
1341
|
-
# get
|
1341
|
+
# get appropriate value type if necessary
|
1342
1342
|
if ($opts{SrcType} and $opts{SrcType} ne $srcType) {
|
1343
1343
|
$$info{$tag} = $srcExifTool->GetValue($tag, $opts{SrcType});
|
1344
1344
|
}
|
1345
1345
|
# set value for this tag
|
1346
1346
|
my ($n, $e) = $self->SetNewValue($tag, $$info{$tag}, %opts);
|
1347
|
-
# delete this tag if we
|
1347
|
+
# delete this tag if we couldn't set it
|
1348
1348
|
$n or delete $$info{$tag};
|
1349
1349
|
}
|
1350
1350
|
return $info;
|
@@ -2305,6 +2305,10 @@ sub WriteInfo($$;$$)
|
|
2305
2305
|
$fileType = $tiffType;
|
2306
2306
|
undef $rtnVal;
|
2307
2307
|
} else {
|
2308
|
+
if ($tiffType eq 'FFF') {
|
2309
|
+
# (see https://exiftool.org/forum/index.php?topic=10848.0)
|
2310
|
+
$self->Error('Phocus may not properly update previews of edited FFF images', 1);
|
2311
|
+
}
|
2308
2312
|
$dirInfo{Parent} = $tiffType;
|
2309
2313
|
$rtnVal = $self->ProcessTIFF(\%dirInfo);
|
2310
2314
|
}
|
@@ -5668,7 +5672,8 @@ sub WriteJPEG($$)
|
|
5668
5672
|
my ($buff, $endPos, $trailInfo);
|
5669
5673
|
my $delPreview = $$self{DEL_PREVIEW};
|
5670
5674
|
$trailInfo = IdentifyTrailer($raf) unless $$delGroup{Trailer};
|
5671
|
-
|
5675
|
+
my $nvTrail = $self->GetNewValueHash($Image::ExifTool::Extra{Trailer});
|
5676
|
+
unless ($oldOutfile or $delPreview or $trailInfo or $$delGroup{Trailer} or $nvTrail) {
|
5672
5677
|
# blindly copy the rest of the file
|
5673
5678
|
while ($raf->Read($buff, 65536)) {
|
5674
5679
|
Write($outfile, $buff) or $err = 1, last;
|
@@ -5699,7 +5704,20 @@ sub WriteJPEG($$)
|
|
5699
5704
|
}
|
5700
5705
|
# remember position of last data copied
|
5701
5706
|
$endPos = $raf->Tell() - length($buff);
|
5702
|
-
#
|
5707
|
+
# write new trailer if specified
|
5708
|
+
if ($nvTrail) {
|
5709
|
+
# access new value directly to avoid copying a potentially very large data block
|
5710
|
+
if ($$nvTrail{Value} and $$nvTrail{Value}[0]) { # (note: "0" will also delete the trailer)
|
5711
|
+
$self->VPrint(0, ' Writing new trailer');
|
5712
|
+
Write($outfile, $$nvTrail{Value}[0]) or $err = 1;
|
5713
|
+
++$$self{CHANGED};
|
5714
|
+
} elsif ($raf->Seek(0, 2) and $raf->Tell() != $endPos) {
|
5715
|
+
$self->VPrint(0, ' Deleting trailer (', $raf->Tell() - $endPos, ' bytes)');
|
5716
|
+
++$$self{CHANGED}; # changed if there was previously a trailer
|
5717
|
+
}
|
5718
|
+
last; # all done
|
5719
|
+
}
|
5720
|
+
# rewrite existing trailers
|
5703
5721
|
if ($trailInfo) {
|
5704
5722
|
my $tbuf = '';
|
5705
5723
|
$raf->Seek(-length($buff), 1); # seek back to just after EOI
|
@@ -5863,7 +5881,7 @@ sub WriteJPEG($$)
|
|
5863
5881
|
HexDump($segDataPt, undef, %dumpParms);
|
5864
5882
|
}
|
5865
5883
|
}
|
5866
|
-
# group delete of APP
|
5884
|
+
# group delete of APP segments
|
5867
5885
|
if ($$delGroup{$dirName}) {
|
5868
5886
|
$verbose and print $out " Deleting $dirName segment\n";
|
5869
5887
|
++$$self{CHANGED};
|
@@ -183,6 +183,7 @@ my %xmpNS = (
|
|
183
183
|
dwc => 'http://rs.tdwg.org/dwc/index.htm',
|
184
184
|
GettyImagesGIFT => 'http://xmp.gettyimages.com/gift/1.0/',
|
185
185
|
LImage => 'http://ns.leiainc.com/photos/1.0/image/',
|
186
|
+
Profile => 'http://ns.google.com/photos/dd/1.0/profile/',
|
186
187
|
);
|
187
188
|
|
188
189
|
# build reverse namespace lookup
|
@@ -778,6 +779,10 @@ my %sRetouchArea = (
|
|
778
779
|
Name => 'LImage',
|
779
780
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::LImage' },
|
780
781
|
},
|
782
|
+
Device => {
|
783
|
+
Name => 'Device',
|
784
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::Device' },
|
785
|
+
},
|
781
786
|
);
|
782
787
|
|
783
788
|
# hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
|
@@ -2244,7 +2249,7 @@ my %sPantryItem = (
|
|
2244
2249
|
|
2245
2250
|
# Composite XMP tags
|
2246
2251
|
%Image::ExifTool::XMP::Composite = (
|
2247
|
-
# get latitude/
|
2252
|
+
# get latitude/longitude reference from XMP lat/long tags
|
2248
2253
|
# (used to set EXIF GPS position from XMP tags)
|
2249
2254
|
GPSLatitudeRef => {
|
2250
2255
|
Require => 'XMP-exif:GPSLatitude',
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# 9) http://www.w3.org/TR/SVG11/
|
16
16
|
# 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
|
17
17
|
# 12) XMPSpecificationPart3_May2013, page 58
|
18
|
+
# 13) https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf
|
18
19
|
#------------------------------------------------------------------------------
|
19
20
|
|
20
21
|
package Image::ExifTool::XMP;
|
@@ -76,6 +77,65 @@ my %sTimecode = (
|
|
76
77
|
timeValue => { },
|
77
78
|
value => { Writable => 'integer', Notes => 'only in XMP 2008 spec; an error?' },
|
78
79
|
);
|
80
|
+
my %sPose = (
|
81
|
+
STRUCT_NAME => 'Pose',
|
82
|
+
NAMESPACE => { Pose => 'http://ns.google.com/photos/dd/1.0/pose/' },
|
83
|
+
PositionX => { Writable => 'real', Groups => { 2 => 'Location' } },
|
84
|
+
PositionY => { Writable => 'real', Groups => { 2 => 'Location' } },
|
85
|
+
PositionZ => { Writable => 'real', Groups => { 2 => 'Location' } },
|
86
|
+
RotationX => { Writable => 'real', Groups => { 2 => 'Location' } },
|
87
|
+
RotationY => { Writable => 'real', Groups => { 2 => 'Location' } },
|
88
|
+
RotationZ => { Writable => 'real', Groups => { 2 => 'Location' } },
|
89
|
+
RotationW => { Writable => 'real', Groups => { 2 => 'Location' } },
|
90
|
+
Timestamp => {
|
91
|
+
Writable => 'integer',
|
92
|
+
Shift => 'Time',
|
93
|
+
Groups => { 2 => 'Time' },
|
94
|
+
ValueConv => 'ConvertUnixTime($val / 1000, 1, 3)',
|
95
|
+
ValueConvInv => 'int(GetUnixTime($val, 1) * 1000)',
|
96
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
97
|
+
PrintConvInv => '$self->InverseDateTime($val,undef,1)',
|
98
|
+
},
|
99
|
+
);
|
100
|
+
my %sEarthPose = (
|
101
|
+
STRUCT_NAME => 'EarthPose',
|
102
|
+
NAMESPACE => { EarthPose => 'http://ns.google.com/photos/dd/1.0/earthpose/' },
|
103
|
+
Latitude => { Writable => 'real', Groups => { 2 => 'Location' }, %latConv },
|
104
|
+
Longitude => { Writable => 'real', Groups => { 2 => 'Location' }, %longConv },
|
105
|
+
Altitude => {
|
106
|
+
Writable => 'real',
|
107
|
+
Groups => { 2 => 'Location' },
|
108
|
+
PrintConv => '"$val m"',
|
109
|
+
PrintConvInv => '$val=~s/\s*m$//;$val',
|
110
|
+
},
|
111
|
+
RotationX => { Writable => 'real', Groups => { 2 => 'Location' } },
|
112
|
+
RotationY => { Writable => 'real', Groups => { 2 => 'Location' } },
|
113
|
+
RotationZ => { Writable => 'real', Groups => { 2 => 'Location' } },
|
114
|
+
RotationW => { Writable => 'real', Groups => { 2 => 'Location' } },
|
115
|
+
Timestamp => {
|
116
|
+
Writable => 'integer',
|
117
|
+
Shift => 'Time',
|
118
|
+
Groups => { 2 => 'Time' },
|
119
|
+
ValueConv => 'ConvertUnixTime($val / 1000, 1, 3)',
|
120
|
+
ValueConvInv => 'int(GetUnixTime($val, 1) * 1000)',
|
121
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
122
|
+
PrintConvInv => '$self->InverseDateTime($val,undef,1)',
|
123
|
+
},
|
124
|
+
);
|
125
|
+
my %sVendorInfo = (
|
126
|
+
STRUCT_NAME => 'VendorInfo',
|
127
|
+
NAMESPACE => { VendorInfo => 'http://ns.google.com/photos/dd/1.0/vendorinfo/' },
|
128
|
+
Model => { },
|
129
|
+
Manufacturer => { },
|
130
|
+
Notes => { },
|
131
|
+
);
|
132
|
+
my %sAppInfo = (
|
133
|
+
STRUCT_NAME => 'AppInfo',
|
134
|
+
NAMESPACE => { AppInfo => 'http://ns.google.com/photos/dd/1.0/appinfo/' },
|
135
|
+
Application => { },
|
136
|
+
Version => { },
|
137
|
+
ItemURI => { },
|
138
|
+
);
|
79
139
|
|
80
140
|
# camera-raw defaults
|
81
141
|
%Image::ExifTool::XMP::crd = (
|
@@ -1167,7 +1227,7 @@ my %prismPublicationDate = (
|
|
1167
1227
|
NAMESPACE => 'PixelLive',
|
1168
1228
|
AVOID => 1,
|
1169
1229
|
NOTES => q{
|
1170
|
-
PixelLive namespace tags. These tags are not writable
|
1230
|
+
PixelLive namespace tags. These tags are not writable because they are very
|
1171
1231
|
uncommon and I haven't been able to locate a reference which gives the
|
1172
1232
|
namespace URI.
|
1173
1233
|
},
|
@@ -1789,6 +1849,158 @@ my %sSubVersion = (
|
|
1789
1849
|
CameraBurstID => { },
|
1790
1850
|
);
|
1791
1851
|
|
1852
|
+
# Google depth-map Device namespace (ref 13)
|
1853
|
+
%Image::ExifTool::XMP::Device = (
|
1854
|
+
%xmpTableDefaults,
|
1855
|
+
GROUPS => { 1 => 'XMP-Device', 2 => 'Camera' },
|
1856
|
+
NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
|
1857
|
+
NOTES => q{
|
1858
|
+
Google depth-map Device tags. See
|
1859
|
+
L<https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf> for
|
1860
|
+
the specification.
|
1861
|
+
},
|
1862
|
+
Container => {
|
1863
|
+
Struct => {
|
1864
|
+
STRUCT_NAME => 'DeviceContainer',
|
1865
|
+
NAMESPACE => { Container => 'http://ns.google.com/photos/dd/1.0/container/' },
|
1866
|
+
Directory => {
|
1867
|
+
List => 'Seq',
|
1868
|
+
Struct => {
|
1869
|
+
STRUCT_NAME => 'DeviceDirectory',
|
1870
|
+
NAMESPACE => { Container => 'http://ns.google.com/photos/dd/1.0/container/' },
|
1871
|
+
Item => {
|
1872
|
+
Struct => {
|
1873
|
+
STRUCT_NAME => 'DeviceItem',
|
1874
|
+
NAMESPACE => { Item => 'http://ns.google.com/photos/dd/1.0/item/' },
|
1875
|
+
Mime => { },
|
1876
|
+
Length => { Writable => 'integer' },
|
1877
|
+
Padding => { Writable => 'integer' },
|
1878
|
+
DataURI => { },
|
1879
|
+
},
|
1880
|
+
},
|
1881
|
+
},
|
1882
|
+
}
|
1883
|
+
},
|
1884
|
+
},
|
1885
|
+
Profiles => {
|
1886
|
+
List => 'Seq',
|
1887
|
+
FlatName => '',
|
1888
|
+
Struct => {
|
1889
|
+
STRUCT_NAME => 'DeviceProfiles',
|
1890
|
+
NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
|
1891
|
+
Profile => {
|
1892
|
+
Struct => {
|
1893
|
+
STRUCT_NAME => 'DeviceProfile',
|
1894
|
+
NAMESPACE => { Profile => 'http://ns.google.com/photos/dd/1.0/profile/' },
|
1895
|
+
CameraIndices => { List => 'Seq', Writable => 'integer' },
|
1896
|
+
Type => { },
|
1897
|
+
},
|
1898
|
+
},
|
1899
|
+
},
|
1900
|
+
},
|
1901
|
+
Cameras => {
|
1902
|
+
List => 'Seq',
|
1903
|
+
FlatName => '',
|
1904
|
+
Struct => {
|
1905
|
+
STRUCT_NAME => 'DeviceCameras',
|
1906
|
+
NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
|
1907
|
+
Camera => {
|
1908
|
+
Struct => {
|
1909
|
+
STRUCT_NAME => 'DeviceCamera',
|
1910
|
+
NAMESPACE => { Camera => 'http://ns.google.com/photos/dd/1.0/camera/' },
|
1911
|
+
DepthMap => {
|
1912
|
+
Struct => {
|
1913
|
+
STRUCT_NAME => 'DeviceDepthMap',
|
1914
|
+
NAMESPACE => { DepthMap => 'http://ns.google.com/photos/dd/1.0/depthmap/' },
|
1915
|
+
ConfidenceURI => { },
|
1916
|
+
DepthURI => { },
|
1917
|
+
Far => { Writable => 'real' },
|
1918
|
+
Format => { },
|
1919
|
+
ItemSemantic=> { },
|
1920
|
+
MeasureType => { },
|
1921
|
+
Near => { Writable => 'real' },
|
1922
|
+
Units => { },
|
1923
|
+
Software => { },
|
1924
|
+
FocalTableEntryCount => { Writable => 'integer' },
|
1925
|
+
FocalTable => { }, # (base64)
|
1926
|
+
},
|
1927
|
+
},
|
1928
|
+
Image => {
|
1929
|
+
Struct => {
|
1930
|
+
STRUCT_NAME => 'DeviceImage',
|
1931
|
+
NAMESPACE => { Image => 'http://ns.google.com/photos/dd/1.0/image/' },
|
1932
|
+
ItemSemantic=> { },
|
1933
|
+
ItemURI => { },
|
1934
|
+
},
|
1935
|
+
},
|
1936
|
+
ImagingModel => {
|
1937
|
+
Struct => {
|
1938
|
+
STRUCT_NAME => 'DeviceImagingModel',
|
1939
|
+
NAMESPACE => { ImagingModel => 'http://ns.google.com/photos/dd/1.0/imagingmodel/' },
|
1940
|
+
Distortion => { }, # (base64)
|
1941
|
+
DistortionCount => { Writable => 'integer' },
|
1942
|
+
FocalLengthX => { Writable => 'real' },
|
1943
|
+
FocalLengthY => { Writable => 'real' },
|
1944
|
+
ImageHeight => { Writable => 'integer' },
|
1945
|
+
ImageWidth => { Writable => 'integer' },
|
1946
|
+
PixelAspectRatio=> { Writable => 'real' },
|
1947
|
+
PrincipalPointX => { Writable => 'real' },
|
1948
|
+
PrincipalPointY => { Writable => 'real' },
|
1949
|
+
Skew => { Writable => 'real' },
|
1950
|
+
},
|
1951
|
+
},
|
1952
|
+
PointCloud => {
|
1953
|
+
Struct => {
|
1954
|
+
STRUCT_NAME => 'DevicePointCloud',
|
1955
|
+
NAMESPACE => { PointCloud => 'http://ns.google.com/photos/dd/1.0/pointcloud/' },
|
1956
|
+
PointCloud => { Writable => 'integer' },
|
1957
|
+
Points => { },
|
1958
|
+
Metric => { Writable => 'boolean' },
|
1959
|
+
},
|
1960
|
+
},
|
1961
|
+
Pose => { Struct => \%sPose },
|
1962
|
+
LightEstimate => {
|
1963
|
+
Struct => {
|
1964
|
+
STRUCT_NAME => 'DeviceLightEstimate',
|
1965
|
+
NAMESPACE => { LightEstimate => 'http://ns.google.com/photos/dd/1.0/lightestimate/' },
|
1966
|
+
ColorCorrectionR => { Writable => 'real' },
|
1967
|
+
ColorCorrectionG => { Writable => 'real' },
|
1968
|
+
ColorCorrectionB => { Writable => 'real' },
|
1969
|
+
PixelIntensity => { Writable => 'real' },
|
1970
|
+
},
|
1971
|
+
},
|
1972
|
+
VendorInfo => { Struct => \%sVendorInfo },
|
1973
|
+
AppInfo => { Struct => \%sAppInfo },
|
1974
|
+
Trait => { },
|
1975
|
+
},
|
1976
|
+
},
|
1977
|
+
},
|
1978
|
+
},
|
1979
|
+
VendorInfo => { Struct => \%sVendorInfo },
|
1980
|
+
AppInfo => { Struct => \%sAppInfo },
|
1981
|
+
EarthPos => { Struct => \%sEarthPose },
|
1982
|
+
Pose => { Struct => \%sPose },
|
1983
|
+
Planes => {
|
1984
|
+
List => 'Seq',
|
1985
|
+
FlatName => '',
|
1986
|
+
Struct => {
|
1987
|
+
STRUCT_NAME => 'DevicePlanes',
|
1988
|
+
NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' },
|
1989
|
+
Plane => {
|
1990
|
+
Struct => {
|
1991
|
+
STRUCT_NAME => 'DevicePlane',
|
1992
|
+
NAMESPACE => { Plane => 'http://ns.google.com/photos/dd/1.0/plane/' },
|
1993
|
+
Pose => { Struct => \%sPose },
|
1994
|
+
ExtentX => { Writable => 'real' },
|
1995
|
+
ExtentZ => { Writable => 'real' },
|
1996
|
+
BoundaryVertexCount => { Writable => 'integer' },
|
1997
|
+
Boundary => { },
|
1998
|
+
},
|
1999
|
+
},
|
2000
|
+
},
|
2001
|
+
},
|
2002
|
+
);
|
2003
|
+
|
1792
2004
|
# Getty Images namespace (ref PH)
|
1793
2005
|
%Image::ExifTool::XMP::GettyImages = (
|
1794
2006
|
%xmpTableDefaults,
|