exiftool_vendored 12.81.0 → 12.83.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +39 -1
- data/bin/MANIFEST +4 -18
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -2
- data/bin/build_geolocation +867 -0
- data/bin/exiftool +37 -9
- data/bin/fmt_files/gpx.fmt +2 -1
- data/bin/fmt_files/gpx_wpt.fmt +2 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +47 -31
- data/bin/lib/Image/ExifTool/CanonVRD.pm +6 -5
- data/bin/lib/Image/ExifTool/DJI.pm +29 -0
- data/bin/lib/Image/ExifTool/Exif.pm +19 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +9 -2
- data/bin/lib/Image/ExifTool/GM.pm +552 -0
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/Geolocation.pm +90 -54
- data/bin/lib/Image/ExifTool/Nikon.pm +9 -7
- data/bin/lib/Image/ExifTool/QuickTime.pm +31 -23
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +66 -30
- data/bin/lib/Image/ExifTool/README +2 -0
- data/bin/lib/Image/ExifTool/Sony.pm +15 -6
- data/bin/lib/Image/ExifTool/TagLookup.pm +37 -6
- data/bin/lib/Image/ExifTool/TagNames.pod +407 -239
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -2
- data/bin/lib/Image/ExifTool/Writer.pl +165 -133
- data/bin/lib/Image/ExifTool/XMP.pm +3 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +3 -0
- data/bin/lib/Image/ExifTool.pm +38 -9
- data/bin/lib/Image/ExifTool.pod +31 -18
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -20
- data/bin/lib/Image/ExifTool/GeoLang/cs.pm +0 -978
- data/bin/lib/Image/ExifTool/GeoLang/de.pm +0 -1975
- data/bin/lib/Image/ExifTool/GeoLang/en_ca.pm +0 -44
- data/bin/lib/Image/ExifTool/GeoLang/en_gb.pm +0 -124
- data/bin/lib/Image/ExifTool/GeoLang/es.pm +0 -2921
- data/bin/lib/Image/ExifTool/GeoLang/fi.pm +0 -1116
- data/bin/lib/Image/ExifTool/GeoLang/fr.pm +0 -3171
- data/bin/lib/Image/ExifTool/GeoLang/it.pm +0 -2750
- data/bin/lib/Image/ExifTool/GeoLang/ja.pm +0 -10256
- data/bin/lib/Image/ExifTool/GeoLang/ko.pm +0 -4499
- data/bin/lib/Image/ExifTool/GeoLang/nl.pm +0 -1270
- data/bin/lib/Image/ExifTool/GeoLang/pl.pm +0 -3019
- data/bin/lib/Image/ExifTool/GeoLang/ru.pm +0 -18220
- data/bin/lib/Image/ExifTool/GeoLang/sk.pm +0 -441
- data/bin/lib/Image/ExifTool/GeoLang/sv.pm +0 -714
- data/bin/lib/Image/ExifTool/GeoLang/tr.pm +0 -452
- data/bin/lib/Image/ExifTool/GeoLang/zh_cn.pm +0 -2225
- data/bin/lib/Image/ExifTool/GeoLang/zh_tw.pm +0 -72
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '12.
|
14
|
+
my $version = '12.83';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -217,7 +217,7 @@ my $tmpFile; # temporary file to delete on exit
|
|
217
217
|
my $tmpText; # temporary text file
|
218
218
|
my $validFile; # flag indicating we processed a valid file
|
219
219
|
my $verbose; # verbose setting
|
220
|
-
my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
|
220
|
+
my $vout; # verbose output file reference (\*STDOUT or \*STDERR by default)
|
221
221
|
my $windowTitle; # title for console window
|
222
222
|
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
223
223
|
my $xml; # flag for XML-formatted output
|
@@ -735,10 +735,11 @@ for (;;) {
|
|
735
735
|
push @isUTF8, 10 if $isAlt;
|
736
736
|
for ($i=0; ; ++$i) {
|
737
737
|
my @entry = Image::ExifTool::Geolocation::GetEntry($i,$langOpt,1) or last;
|
738
|
-
push @entry, Image::ExifTool::Geolocation::GetAltNames($i,1) if $isAlt;
|
739
738
|
next if $minPop and $entry[7] < $minPop;
|
740
739
|
next if %fcodes and $neg ? $fcodes{lc $entry[6]} : not $fcodes{lc $entry[6]};
|
740
|
+
push @entry, Image::ExifTool::Geolocation::GetAltNames($i,1) if $isAlt;
|
741
741
|
$_ = defined $_ ? $mt->Decode($_, 'UTF8') : '' foreach @entry[@isUTF8];
|
742
|
+
pop @entry if $isAlt and not $entry[10];
|
742
743
|
print join(',', @entry), "\n";
|
743
744
|
}
|
744
745
|
} else { # 'g(\d*)'
|
@@ -1165,7 +1166,7 @@ for (;;) {
|
|
1165
1166
|
if (/^p(-?)$/ or /^printformat(-?)$/i) {
|
1166
1167
|
my $fmt = shift;
|
1167
1168
|
if ($pass) {
|
1168
|
-
LoadPrintFormat($fmt, $1);
|
1169
|
+
LoadPrintFormat($fmt, $1 || $binaryOutput);
|
1169
1170
|
# load MWG module now if necessary
|
1170
1171
|
if (not $useMWG and grep /^mwg:/i, @requestTags) {
|
1171
1172
|
$useMWG = 1;
|
@@ -2180,7 +2181,7 @@ sub GetImageInfo($$)
|
|
2180
2181
|
|
2181
2182
|
my $lineCount = 0;
|
2182
2183
|
my ($fp, $outfile, $append);
|
2183
|
-
if ($textOut and $verbose and not $tagOut) {
|
2184
|
+
if ($textOut and ($verbose or $et->Options('PrintCSV')) and not $tagOut) {
|
2184
2185
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2185
2186
|
$fp or EFile($file), ++$countBad, return;
|
2186
2187
|
# delete file if we exit prematurely (unless appending)
|
@@ -2243,6 +2244,14 @@ sub GetImageInfo($$)
|
|
2243
2244
|
if (%printFmt) {
|
2244
2245
|
$et->Options(Duplicates => 1);
|
2245
2246
|
$et->Options(RequestTags => \@requestTags);
|
2247
|
+
if ($printFmt{SetTags}) {
|
2248
|
+
# initialize options so we can set any tags we want
|
2249
|
+
$$et{TAGS_FROM_FILE} = 1;
|
2250
|
+
$et->Options(MakerNotes => 1);
|
2251
|
+
$et->Options(Struct => 2);
|
2252
|
+
$et->Options(List => 1);
|
2253
|
+
$et->Options(CoordFormat => '%d %d %.8f') unless $et->Options('CoordFormat');
|
2254
|
+
}
|
2246
2255
|
} else {
|
2247
2256
|
@foundTags = @tags;
|
2248
2257
|
}
|
@@ -2303,7 +2312,7 @@ sub GetImageInfo($$)
|
|
2303
2312
|
$lastDoc = 0;
|
2304
2313
|
}
|
2305
2314
|
for ($doc=0; $doc<=$lastDoc; ++$doc) {
|
2306
|
-
my $skipBody;
|
2315
|
+
my ($skipBody, $opt);
|
2307
2316
|
foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
|
2308
2317
|
my $prf = $printFmt{$type} or next;
|
2309
2318
|
if ($type eq 'HEAD' and defined $outfile) {
|
@@ -2311,6 +2320,12 @@ sub GetImageInfo($$)
|
|
2311
2320
|
$wroteHEAD{$outfile} = 1;
|
2312
2321
|
}
|
2313
2322
|
next if $type eq 'BODY' and $skipBody;
|
2323
|
+
# silence "IF" warnings and warnings for subdocuments > 1
|
2324
|
+
if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})) {
|
2325
|
+
$opt = 'Silent';
|
2326
|
+
} else {
|
2327
|
+
$opt = 'Warn';
|
2328
|
+
}
|
2314
2329
|
if ($lastDoc) {
|
2315
2330
|
if ($doc) {
|
2316
2331
|
next if $type eq 'HEAD' or $type eq 'TAIL'; # only repeat SECT/IF/BODY/ENDS
|
@@ -2320,7 +2335,6 @@ sub GetImageInfo($$)
|
|
2320
2335
|
}
|
2321
2336
|
}
|
2322
2337
|
my @lines;
|
2323
|
-
my $opt = $type eq 'IF' ? 'Silent' : 'Warn'; # silence "IF" warnings
|
2324
2338
|
foreach (@$prf) {
|
2325
2339
|
my $line = $et->InsertTagValues($_, \@foundTags, $opt, $grp, $cache);
|
2326
2340
|
if ($type eq 'IF') {
|
@@ -4115,6 +4129,7 @@ sub AddPrintFormat($)
|
|
4115
4129
|
push @{$printFmt{$type}}, $expr;
|
4116
4130
|
# add to list of requested tags
|
4117
4131
|
push @requestTags, $expr =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g;
|
4132
|
+
$printFmt{SetTags} = 1 if $expr =~ /\bSetTags\b/;
|
4118
4133
|
}
|
4119
4134
|
|
4120
4135
|
#------------------------------------------------------------------------------
|
@@ -5636,7 +5651,7 @@ it from subsequent text (and must be used if subsequent text begins with an
|
|
5636
5651
|
alphanumeric character, hyphen, underline, colon or number sign). Use C<$$>
|
5637
5652
|
to represent a C<$> symbol, and C<$/> for a newline. When the string
|
5638
5653
|
argument is used (ie. I<STR>), a newline is added to the end of the string
|
5639
|
-
unless B<-p-> is specified.
|
5654
|
+
unless B<-p-> is specified or the B<-b> option is used.
|
5640
5655
|
|
5641
5656
|
Multiple B<-p> options may be used. Lines beginning with C<#[HEAD]> and
|
5642
5657
|
C<#[TAIL]> are output before the first processed file and after the last
|
@@ -5662,7 +5677,7 @@ with this command:
|
|
5662
5677
|
|
5663
5678
|
produces output like this:
|
5664
5679
|
|
5665
|
-
-- Generated by ExifTool 12.
|
5680
|
+
-- Generated by ExifTool 12.83 --
|
5666
5681
|
File: a.jpg - 2003:10:31 15:44:19
|
5667
5682
|
(f/5.6, 1/60s, ISO 100)
|
5668
5683
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6896,6 +6911,19 @@ sources. An equivalent to the above commands using this feature would be:
|
|
6896
6911
|
|
6897
6912
|
exiftool -tagsfromfile @ -keywords -api nodups a.jpg
|
6898
6913
|
|
6914
|
+
C<SetTags>
|
6915
|
+
|
6916
|
+
Used to set tags in extracted images. With no arguments, copies all tags
|
6917
|
+
from the source file to the embedded image:
|
6918
|
+
|
6919
|
+
exiftool -p '${previewimage;SetTags}' -b a.arw > preview.jpg
|
6920
|
+
|
6921
|
+
Arguments may be added to copy or set specific tags. Arguments take exactly
|
6922
|
+
the same form as those on the command line when copying or writing tags,
|
6923
|
+
but without the leading dash. For example:
|
6924
|
+
|
6925
|
+
exiftool -p '${previewimage;SetTags("comment=test","title<filename"}' ...
|
6926
|
+
|
6899
6927
|
=head1 WINDOWS UNICODE FILE NAMES
|
6900
6928
|
|
6901
6929
|
In Windows, command-line arguments are specified using the current code page
|
data/bin/fmt_files/gpx.fmt
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
# 2018/01/04 - PH Added IF to be sure position exists
|
12
12
|
# 2018/01/06 - PH Use DateFmt function instead of -d option
|
13
13
|
# 2019/10/24 - PH Preserve sub-seconds in GPSDateTime value
|
14
|
+
# 2024/04/11 - PH Use %f feature in GPSDateTime formatting
|
14
15
|
#
|
15
16
|
# Notes: 1) Input file(s) must contain GPSLatitude and GPSLongitude.
|
16
17
|
# 2) The -ee3 option is to extract the full track from video files.
|
@@ -32,7 +33,7 @@
|
|
32
33
|
#[IF] $gpslatitude $gpslongitude
|
33
34
|
#[BODY]<trkpt lat="$gpslatitude#" lon="$gpslongitude#">
|
34
35
|
#[BODY] <ele>$gpsaltitude#</ele>
|
35
|
-
#[BODY] <time>${gpsdatetime#;
|
36
|
+
#[BODY] <time>${gpsdatetime#;DateFmt("%Y-%m-%dT%H:%M:%S%fZ")}</time>
|
36
37
|
#[BODY]</trkpt>
|
37
38
|
#[TAIL]</trkseg>
|
38
39
|
#[TAIL]</trk>
|
data/bin/fmt_files/gpx_wpt.fmt
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
# 2018/01/04 - PH Added IF to be sure position exists
|
13
13
|
# 2018/01/06 - PH Use DateFmt function instead of -d option
|
14
14
|
# 2019/10/24 - PH Preserve sub-seconds in GPSDateTime value
|
15
|
+
# 2024/04/11 - PH Use %f feature in GPSDateTime formatting
|
15
16
|
#
|
16
17
|
# Notes: 1) Input file(s) must contain GPSLatitude and GPSLongitude.
|
17
18
|
# 2) The -ee3 option is to extract the full track from video files.
|
@@ -30,7 +31,7 @@
|
|
30
31
|
#[IF] $gpslatitude $gpslongitude
|
31
32
|
#[BODY]<wpt lat="$gpslatitude#" lon="$gpslongitude#">
|
32
33
|
#[BODY] <ele>$gpsaltitude#</ele>
|
33
|
-
#[BODY] <time>${gpsdatetime#;
|
34
|
+
#[BODY] <time>${gpsdatetime#;DateFmt("%Y-%m-%dT%H:%M:%S%fZ")}</time>
|
34
35
|
#[BODY] <name>$filename</name>
|
35
36
|
#[BODY] <link href="$directory/$filename"/>
|
36
37
|
#[BODY] <sym>Scenic Area</sym>
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
35
35
|
use Image::ExifTool::Validate;
|
36
36
|
use Image::ExifTool::MacOS;
|
37
37
|
|
38
|
-
$VERSION = '3.
|
38
|
+
$VERSION = '3.56';
|
39
39
|
@ISA = qw(Exporter);
|
40
40
|
|
41
41
|
sub NumbersFirst($$);
|
@@ -95,16 +95,9 @@ my %tweakOrder = (
|
|
95
95
|
Lytro => 'SigmaRaw',
|
96
96
|
PhotoMechanic => 'FotoStation',
|
97
97
|
Microsoft => 'PhotoMechanic',
|
98
|
-
'Microsoft::MP'=> 'Microsoft::MP1',
|
99
98
|
GIMP => 'Microsoft',
|
100
|
-
'Nikon::CameraSettingsD300' => 'Nikon::ShotInfoD300b',
|
101
|
-
'Pentax::LensData' => 'Pentax::LensInfo2',
|
102
|
-
'Sony::SRF2' => 'Sony::SRF',
|
103
99
|
DarwinCore => 'AFCP',
|
104
|
-
|
105
|
-
'MWG::Keywords' => 'MWG::Regions',
|
106
|
-
'MWG::Collections' => 'MWG::Keywords',
|
107
|
-
'GoPro::fdsc' => 'GoPro::KBAT',
|
100
|
+
MWG => 'Shortcuts',
|
108
101
|
);
|
109
102
|
|
110
103
|
# list of all recognized Format strings
|
@@ -671,6 +664,18 @@ will extract all available information even for tags not listed.
|
|
671
664
|
Tags in these tables are referred to as "pseudo" tags because their
|
672
665
|
information is not stored in the file itself. As such, B<Writable> tags in
|
673
666
|
these tables may be changed without having to rewrite the file.
|
667
|
+
},
|
668
|
+
GM => q{
|
669
|
+
These tags are extracted from GM/Cosworth PDR (Performance Data Recorder)
|
670
|
+
information found in videos from General Motors cars such as Corvette and
|
671
|
+
Camero.
|
672
|
+
|
673
|
+
Use the API L<PrintCSV|../ExifTool.html#PrintCSV> option to output all timed
|
674
|
+
PDR data in CSV format at greatly increased speed and with much lower memory
|
675
|
+
usage. This option prints the numerical values for each channel in CSV
|
676
|
+
format, suitable for import into RaceRender. In this output, the gear
|
677
|
+
numbers for Neutral and Reverse are changed to -1 and -100 respectively for
|
678
|
+
compatibility with RaceRender.
|
674
679
|
},
|
675
680
|
PodTrailer => q{
|
676
681
|
~head1 NOTES
|
@@ -708,7 +713,7 @@ my %shortcutNotes = (
|
|
708
713
|
color space when deleting all other metadata
|
709
714
|
},
|
710
715
|
CommonIFD0 => q{
|
711
|
-
common metadata tags found in IFD0 of TIFF-format images. Used to
|
716
|
+
common metadata tags found in IFD0 of TIFF-format images. Used to simplify
|
712
717
|
deletion of all metadata from these images. See
|
713
718
|
L<FAQ number 7|../faq.html#Q7> for details
|
714
719
|
},
|
@@ -852,7 +857,7 @@ sub new
|
|
852
857
|
my ($tagID, $binaryTable, $noID, $hexID, $isIPTC, $isXMP);
|
853
858
|
$isIPTC = 1 if $writeProc and $writeProc eq \&Image::ExifTool::IPTC::WriteIPTC;
|
854
859
|
# generate flattened tag names for structure fields if this is an XMP table
|
855
|
-
if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') {
|
860
|
+
if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP' or $$vars{ADD_FLATTENED}) {
|
856
861
|
Image::ExifTool::XMP::AddFlattenedTags($table);
|
857
862
|
$isXMP = 1;
|
858
863
|
}
|
@@ -1526,7 +1531,8 @@ TagID: foreach $tagID (@keys) {
|
|
1526
1531
|
my $fullName = ($strName =~ / / ? '' : 'XMP ') . "$strName Struct";
|
1527
1532
|
my $info = $tagNameInfo{$fullName} = [ ];
|
1528
1533
|
my $tag;
|
1529
|
-
|
1534
|
+
my $order = $$struct{SORT_ORDER} || [ sort keys %$struct ];
|
1535
|
+
foreach $tag (@$order) {
|
1530
1536
|
my $tagInfo = $$struct{$tag};
|
1531
1537
|
next unless ref $tagInfo eq 'HASH' and $tag ne 'NAMESPACE' and $tag ne 'GROUPS';
|
1532
1538
|
warn "WARNING: $strName Struct containes $tag\n" if $Image::ExifTool::specialTags{$tag};
|
@@ -1539,6 +1545,8 @@ TagID: foreach $tagID (@keys) {
|
|
1539
1545
|
push @vals, $writable;
|
1540
1546
|
$structs{$writable} = 1;
|
1541
1547
|
$writable = "=$writable";
|
1548
|
+
} elsif (defined $$tagInfo{Writable}) {
|
1549
|
+
$writable = 'no';
|
1542
1550
|
} else {
|
1543
1551
|
$writable = 'string';
|
1544
1552
|
}
|
@@ -1548,7 +1556,7 @@ TagID: foreach $tagID (@keys) {
|
|
1548
1556
|
# handle PrintConv lookups in Structure elements
|
1549
1557
|
my $printConv = $$tagInfo{PrintConv};
|
1550
1558
|
if (ref $printConv eq 'HASH') {
|
1551
|
-
foreach (sort keys %$printConv) {
|
1559
|
+
foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
|
1552
1560
|
next if /^(OTHER|BITMASK)$/;
|
1553
1561
|
push @vals, "$_ = $$printConv{$_}";
|
1554
1562
|
}
|
@@ -1822,24 +1830,7 @@ sub TweakOrder($$)
|
|
1822
1830
|
local $_;
|
1823
1831
|
my ($sortedTables, $tweakOrder) = @_;
|
1824
1832
|
my @tweak = sort keys %$tweakOrder;
|
1825
|
-
my (%
|
1826
|
-
# flag files which have a "Main" table
|
1827
|
-
foreach (@$sortedTables) {
|
1828
|
-
$addedMain{$1} = 0 if /^Image::ExifTool::(\w+)::(\w+)/ and $2 eq 'Main';
|
1829
|
-
}
|
1830
|
-
# make sure that the main table always comes first in each file
|
1831
|
-
foreach (@$sortedTables) {
|
1832
|
-
if (/^Image::ExifTool::(\w+)::(\w+)/) {
|
1833
|
-
if ($addedMain{$1}) {
|
1834
|
-
next if $2 eq 'Main'; # don't add again
|
1835
|
-
} elsif (defined $addedMain{$1}) {
|
1836
|
-
push @sorted, "Image::ExifTool::${1}::Main" if $2 ne 'Main';
|
1837
|
-
$addedMain{$1} = 1;
|
1838
|
-
}
|
1839
|
-
}
|
1840
|
-
push @sorted, $_;
|
1841
|
-
}
|
1842
|
-
@$sortedTables = @sorted;
|
1833
|
+
my (@sorted, %hasMain, %module, $entry);
|
1843
1834
|
# apply manual tweaks
|
1844
1835
|
while (@tweak) {
|
1845
1836
|
my $table = shift @tweak;
|
@@ -1858,6 +1849,31 @@ sub TweakOrder($$)
|
|
1858
1849
|
}
|
1859
1850
|
@$sortedTables = (@notMoving, @moving, @after);
|
1860
1851
|
}
|
1852
|
+
# flag modules which have a "Main" table, and organize tables by module name
|
1853
|
+
foreach (@$sortedTables) {
|
1854
|
+
if (not /^Image::ExifTool::(\w+)::(\w+)/) {
|
1855
|
+
push @sorted, $_;
|
1856
|
+
} else {
|
1857
|
+
$hasMain{$1} = 1 if $2 eq 'Main';
|
1858
|
+
push @sorted, $module{$1} = [ ] unless $module{$1};
|
1859
|
+
push @{$module{$1}}, $_;
|
1860
|
+
}
|
1861
|
+
}
|
1862
|
+
# force MWG::Composite table first
|
1863
|
+
my @mwg = ( 'Image::ExifTool::MWG::Composite' );
|
1864
|
+
/Composite/ or push @mwg, $_ foreach @{$module{MWG}};
|
1865
|
+
@{$module{MWG}} = @mwg;
|
1866
|
+
# make sure that the main table always comes first in each file
|
1867
|
+
# and that all other tables from this group follow
|
1868
|
+
@$sortedTables = ( );
|
1869
|
+
foreach $entry (@sorted) {
|
1870
|
+
ref $entry or push(@$sortedTables, $entry), next;
|
1871
|
+
$$entry[0] =~ /^Image::ExifTool::(\w+)::(\w+)/ or die 'Internal error';
|
1872
|
+
my $main = "Image::ExifTool::$1::Main";
|
1873
|
+
# main table must come first (even if it doesn't exist)
|
1874
|
+
push @$sortedTables, $main if $hasMain{$1};
|
1875
|
+
$_ eq $main or push(@$sortedTables, $_) foreach @$entry;
|
1876
|
+
}
|
1861
1877
|
}
|
1862
1878
|
|
1863
1879
|
#------------------------------------------------------------------------------
|
@@ -23,7 +23,7 @@ use vars qw($VERSION);
|
|
23
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
24
24
|
use Image::ExifTool::Canon;
|
25
25
|
|
26
|
-
$VERSION = '1.
|
26
|
+
$VERSION = '1.40';
|
27
27
|
|
28
28
|
sub ProcessCanonVRD($$;$);
|
29
29
|
sub WriteCanonVRD($$;$);
|
@@ -1427,15 +1427,16 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
|
|
1427
1427
|
4 => 'CropY',
|
1428
1428
|
5 => 'CropWidth',
|
1429
1429
|
6 => 'CropHeight',
|
1430
|
+
7 => 'CropRotation',
|
1430
1431
|
8 => {
|
1431
|
-
Name => '
|
1432
|
+
Name => 'CropAngle',
|
1432
1433
|
Format => 'double',
|
1433
1434
|
PrintConv => 'sprintf("%.7g",$val)',
|
1434
1435
|
PrintConvInv => '$val',
|
1435
1436
|
},
|
1436
|
-
|
1437
|
-
|
1438
|
-
#
|
1437
|
+
10 => 'CropOriginalWidth',
|
1438
|
+
11 => 'CropOriginalHeight',
|
1439
|
+
# 12 double - value: 100
|
1439
1440
|
);
|
1440
1441
|
|
1441
1442
|
# DR4 Stamp Tool tags (ref PH)
|
@@ -19,6 +19,7 @@ use Image::ExifTool::GPS;
|
|
19
19
|
$VERSION = '1.09';
|
20
20
|
|
21
21
|
sub ProcessDJIInfo($$$);
|
22
|
+
sub Process_djmd($$$);
|
22
23
|
|
23
24
|
my %convFloat2 = (
|
24
25
|
PrintConv => 'sprintf("%+.2f", $val)',
|
@@ -186,6 +187,34 @@ my %convFloat2 = (
|
|
186
187
|
},
|
187
188
|
);
|
188
189
|
|
190
|
+
# TODO - eventually add ability to decode this?
|
191
|
+
%Image::ExifTool::DJI::djmd = (
|
192
|
+
PROCESS_PROC => \&Process_djmd,
|
193
|
+
);
|
194
|
+
|
195
|
+
#------------------------------------------------------------------------------
|
196
|
+
# Process DJI djmd timed data from Action4 videos (ref PH)
|
197
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
198
|
+
# Returns: 1 on success
|
199
|
+
# TODO: work in progress
|
200
|
+
sub Process_djmd($$$)
|
201
|
+
{
|
202
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
203
|
+
my $dataPt = $$dirInfo{DataPt};
|
204
|
+
my ($pos, $bit, $val) = (6, 0, 0);
|
205
|
+
for (;;) {
|
206
|
+
my $v = Get8u($dataPt, $pos);
|
207
|
+
$val += ($v & 0x7f) << $bit;
|
208
|
+
last unless $v & 0x80;
|
209
|
+
++$pos;
|
210
|
+
$bit += 7;
|
211
|
+
}
|
212
|
+
$pos += 49;
|
213
|
+
my @a = unpack("x${pos}fxfxfxfx3fxfxf", $$dataPt);
|
214
|
+
print "$val @a\n";
|
215
|
+
return 1;
|
216
|
+
}
|
217
|
+
|
189
218
|
#------------------------------------------------------------------------------
|
190
219
|
# Process DJI info (ref PH)
|
191
220
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
58
58
|
use Image::ExifTool::MakerNotes;
|
59
59
|
|
60
|
-
$VERSION = '4.
|
60
|
+
$VERSION = '4.52';
|
61
61
|
|
62
62
|
sub ProcessExif($$$);
|
63
63
|
sub WriteExif($$$);
|
@@ -4342,7 +4342,7 @@ my %opcodeInfo = (
|
|
4342
4342
|
Count => -1,
|
4343
4343
|
Protected => 1,
|
4344
4344
|
},
|
4345
|
-
|
4345
|
+
0xcd3f => { # DNG 1.6
|
4346
4346
|
Name => 'RGBTables',
|
4347
4347
|
Writable => 'undef',
|
4348
4348
|
WriteGroup => 'IFD0',
|
@@ -4404,6 +4404,23 @@ my %opcodeInfo = (
|
|
4404
4404
|
WriteGroup => 'IFD0',
|
4405
4405
|
Protected => 1,
|
4406
4406
|
},
|
4407
|
+
0xcd49 => { # DNG 1.7.1
|
4408
|
+
Name => 'JXLDistance',
|
4409
|
+
Writable => 'float',
|
4410
|
+
WriteGroup => 'IFD0',
|
4411
|
+
},
|
4412
|
+
0xcd4a => { # DNG 1.7.1
|
4413
|
+
Name => 'JXLEffort',
|
4414
|
+
Notes => 'values range from 1=low to 9=high',
|
4415
|
+
Writable => 'int32u',
|
4416
|
+
WriteGroup => 'IFD0',
|
4417
|
+
},
|
4418
|
+
0xcd4b => { # DNG 1.7.1
|
4419
|
+
Name => 'JXLDecodeSpeed',
|
4420
|
+
Notes => 'values range from 1=slow to 4=fast',
|
4421
|
+
Writable => 'int32u',
|
4422
|
+
WriteGroup => 'IFD0',
|
4423
|
+
},
|
4407
4424
|
0xea1c => { #13
|
4408
4425
|
Name => 'Padding',
|
4409
4426
|
Binary => 1,
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
use Image::ExifTool::Exif;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.94';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -550,7 +550,14 @@ my %faceCategories = (
|
|
550
550
|
3 => 'Electronic Front Curtain', #10
|
551
551
|
},
|
552
552
|
},
|
553
|
-
0x1051 => {
|
553
|
+
0x1051 => { #forum15784
|
554
|
+
Name => 'CropFlag',
|
555
|
+
Writable => 'int8u',
|
556
|
+
Notes => q(
|
557
|
+
this tag exists only if the image was cropped, and is 0 for cropped JPG
|
558
|
+
image or 1 for a cropped RAF
|
559
|
+
),
|
560
|
+
},
|
554
561
|
0x1052 => { Name => 'CropTopLeft', Writable => 'int32u' }, #forum15784
|
555
562
|
0x1053 => { Name => 'CropSize', Writable => 'int32u' }, #forum15784
|
556
563
|
# 0x1100 - This may not work well for newer cameras (ref forum12682)
|