exiftool_vendored 12.73.0 → 12.74.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.
- checksums.yaml +4 -4
- data/bin/Changes +26 -1
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +49 -40
- data/bin/lib/File/RandomAccess.pm +31 -5
- data/bin/lib/File/RandomAccess.pod +4 -4
- data/bin/lib/Image/ExifTool/7Z.pm +3 -3
- data/bin/lib/Image/ExifTool/AFCP.pm +2 -2
- data/bin/lib/Image/ExifTool/BZZ.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +5 -5
- data/bin/lib/Image/ExifTool/Canon.pm +3 -3
- data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
- data/bin/lib/Image/ExifTool/DICOM.pm +2 -2
- data/bin/lib/Image/ExifTool/DNG.pm +4 -4
- data/bin/lib/Image/ExifTool/Exif.pm +2 -2
- data/bin/lib/Image/ExifTool/FLIR.pm +2 -2
- data/bin/lib/Image/ExifTool/Fixup.pm +3 -3
- data/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
- data/bin/lib/Image/ExifTool/Geotag.pm +3 -3
- data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +2 -2
- data/bin/lib/Image/ExifTool/Import.pm +5 -5
- data/bin/lib/Image/ExifTool/JSON.pm +2 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +3 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
- data/bin/lib/Image/ExifTool/Ogg.pm +2 -2
- data/bin/lib/Image/ExifTool/PLIST.pm +3 -3
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
- data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
- data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- data/bin/lib/Image/ExifTool/PostScript.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +40 -107
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +8 -6
- data/bin/lib/Image/ExifTool/RSRC.pm +2 -2
- data/bin/lib/Image/ExifTool/Samsung.pm +4 -4
- data/bin/lib/Image/ExifTool/Shift.pl +1 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
- data/bin/lib/Image/ExifTool/Sony.pm +3 -3
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5 -5
- data/bin/lib/Image/ExifTool/TagNames.pod +5 -1
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +15 -15
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
- data/bin/lib/Image/ExifTool/Writer.pl +66 -42
- data/bin/lib/Image/ExifTool/ZIP.pm +6 -6
- data/bin/lib/Image/ExifTool.pm +27 -23
- data/bin/lib/Image/ExifTool.pod +7 -6
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -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.92';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -268,6 +268,24 @@ my %timeInfo = (
|
|
268
268
|
PrintConvInv => '$self->InverseDateTime($val)',
|
269
269
|
# (can't put Groups here because they aren't constant!)
|
270
270
|
);
|
271
|
+
# properties for ISO 8601 format date/time tags
|
272
|
+
my %iso8601Date = (
|
273
|
+
Shift => 'Time',
|
274
|
+
ValueConv => q{
|
275
|
+
require Image::ExifTool::XMP;
|
276
|
+
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
277
|
+
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
278
|
+
return $val;
|
279
|
+
},
|
280
|
+
ValueConvInv => q{
|
281
|
+
require Image::ExifTool::XMP;
|
282
|
+
my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
|
283
|
+
($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
|
284
|
+
return $val;
|
285
|
+
},
|
286
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
287
|
+
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
288
|
+
);
|
271
289
|
# information for duration tags
|
272
290
|
my %durationInfo = (
|
273
291
|
ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
|
@@ -1574,22 +1592,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
1574
1592
|
"\xa9day" => {
|
1575
1593
|
Name => 'ContentCreateDate',
|
1576
1594
|
Groups => { 2 => 'Time' },
|
1577
|
-
|
1578
|
-
# handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone)
|
1579
|
-
ValueConv => q{
|
1580
|
-
require Image::ExifTool::XMP;
|
1581
|
-
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
1582
|
-
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
1583
|
-
return $val;
|
1584
|
-
},
|
1585
|
-
ValueConvInv => q{
|
1586
|
-
require Image::ExifTool::XMP;
|
1587
|
-
my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
|
1588
|
-
($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
|
1589
|
-
return $val;
|
1590
|
-
},
|
1591
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
1592
|
-
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
1595
|
+
%iso8601Date,
|
1593
1596
|
},
|
1594
1597
|
"\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
|
1595
1598
|
"\xa9alb" => 'Album', #PH (iTunes 8.0.2)
|
@@ -1873,21 +1876,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
1873
1876
|
Apple Photos has been reported to show a crazy date/time for some MP4 files
|
1874
1877
|
containing this tag, but perhaps only if it is missing a time zone
|
1875
1878
|
}, #forum10690/11125
|
1876
|
-
|
1877
|
-
ValueConv => q{
|
1878
|
-
require Image::ExifTool::XMP;
|
1879
|
-
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
1880
|
-
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
1881
|
-
return $val;
|
1882
|
-
},
|
1883
|
-
ValueConvInv => q{
|
1884
|
-
require Image::ExifTool::XMP;
|
1885
|
-
$val = Image::ExifTool::XMP::FormatXMPDate($val);
|
1886
|
-
$val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
|
1887
|
-
return $val;
|
1888
|
-
},
|
1889
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
1890
|
-
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
1879
|
+
%iso8601Date,
|
1891
1880
|
},
|
1892
1881
|
manu => { # (SX280)
|
1893
1882
|
Name => 'Make',
|
@@ -2310,23 +2299,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
2310
2299
|
symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models
|
2311
2300
|
},
|
2312
2301
|
Groups => { 2 => 'Time' },
|
2313
|
-
Shift => 'Time',
|
2314
2302
|
Avoid => 1,
|
2315
2303
|
# handle values in the form "2010-02-12T13:27:14-0800"
|
2316
|
-
|
2317
|
-
require Image::ExifTool::XMP;
|
2318
|
-
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
2319
|
-
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
2320
|
-
return $val;
|
2321
|
-
},
|
2322
|
-
ValueConvInv => q{
|
2323
|
-
require Image::ExifTool::XMP;
|
2324
|
-
my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
|
2325
|
-
($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
|
2326
|
-
return $val;
|
2327
|
-
},
|
2328
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
2329
|
-
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
2304
|
+
%iso8601Date,
|
2330
2305
|
},
|
2331
2306
|
'@xyz' => { #PH (iPhone 3GS)
|
2332
2307
|
Name => 'GPSCoordinates',
|
@@ -3339,22 +3314,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
3339
3314
|
"\xa9day" => {
|
3340
3315
|
Name => 'ContentCreateDate',
|
3341
3316
|
Groups => { 2 => 'Time' },
|
3342
|
-
|
3343
|
-
# handle values in the form "2010-02-12T13:27:14-0800"
|
3344
|
-
ValueConv => q{
|
3345
|
-
require Image::ExifTool::XMP;
|
3346
|
-
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
3347
|
-
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
3348
|
-
return $val;
|
3349
|
-
},
|
3350
|
-
ValueConvInv => q{
|
3351
|
-
require Image::ExifTool::XMP;
|
3352
|
-
$val = Image::ExifTool::XMP::FormatXMPDate($val);
|
3353
|
-
$val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
|
3354
|
-
return $val;
|
3355
|
-
},
|
3356
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
3357
|
-
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
3317
|
+
%iso8601Date,
|
3358
3318
|
},
|
3359
3319
|
"\xa9des" => 'Description', #4
|
3360
3320
|
"\xa9enc" => 'EncodedBy', #10
|
@@ -6403,12 +6363,10 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6403
6363
|
ValueConvInv => '$val * 1000',
|
6404
6364
|
PrintConv => 'ConvertDuration($val)',
|
6405
6365
|
PrintConvInv => q{
|
6406
|
-
|
6407
|
-
|
6408
|
-
|
6409
|
-
|
6410
|
-
$a[0] += shift(@a) * 60 while @a > 1;
|
6411
|
-
return $a[0] * $sign;
|
6366
|
+
my $sign = ($val =~ s/^-//) ? -1 : 1;
|
6367
|
+
my @a = $val =~ /(\d+(?:\.\d+)?)/g;
|
6368
|
+
unshift @a, 0 while @a < 4;
|
6369
|
+
return $sign * (((($a[0] * 24) + $a[1]) * 60 + $a[2]) * 60 + $a[3]);
|
6412
6370
|
},
|
6413
6371
|
},
|
6414
6372
|
|
@@ -6522,21 +6480,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6522
6480
|
creationdate=> {
|
6523
6481
|
Name => 'CreationDate',
|
6524
6482
|
Groups => { 2 => 'Time' },
|
6525
|
-
|
6526
|
-
ValueConv => q{
|
6527
|
-
require Image::ExifTool::XMP;
|
6528
|
-
$val = Image::ExifTool::XMP::ConvertXMPDate($val,1);
|
6529
|
-
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
6530
|
-
return $val;
|
6531
|
-
},
|
6532
|
-
ValueConvInv => q{
|
6533
|
-
require Image::ExifTool::XMP;
|
6534
|
-
$val = Image::ExifTool::XMP::FormatXMPDate($val);
|
6535
|
-
$val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
|
6536
|
-
return $val;
|
6537
|
-
},
|
6538
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
6539
|
-
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
6483
|
+
%iso8601Date,
|
6540
6484
|
},
|
6541
6485
|
description => { },
|
6542
6486
|
director => { },
|
@@ -6586,21 +6530,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6586
6530
|
'location.date' => {
|
6587
6531
|
Name => 'LocationDate',
|
6588
6532
|
Groups => { 2 => 'Time' },
|
6589
|
-
|
6590
|
-
ValueConv => q{
|
6591
|
-
require Image::ExifTool::XMP;
|
6592
|
-
$val = Image::ExifTool::XMP::ConvertXMPDate($val);
|
6593
|
-
$val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
|
6594
|
-
return $val;
|
6595
|
-
},
|
6596
|
-
ValueConvInv => q{
|
6597
|
-
require Image::ExifTool::XMP;
|
6598
|
-
$val = Image::ExifTool::XMP::FormatXMPDate($val);
|
6599
|
-
$val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
|
6600
|
-
return $val;
|
6601
|
-
},
|
6602
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
6603
|
-
PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
|
6533
|
+
%iso8601Date,
|
6604
6534
|
},
|
6605
6535
|
'location.accuracy.horizontal' => { Name => 'LocationAccuracyHorizontal' },
|
6606
6536
|
'live-photo.auto' => { Name => 'LivePhotoAuto', Writable => 'int8u' },
|
@@ -6693,6 +6623,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6693
6623
|
'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 },
|
6694
6624
|
# (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float)
|
6695
6625
|
'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 },
|
6626
|
+
# the following tags generated by ShutterEncoder when "preserve metadata" is selected (forum15610)
|
6627
|
+
major_brand => { Name => 'MajorBrand', Avoid => 1 },
|
6628
|
+
minor_version => { Name => 'MinorVersion', Avoid => 1 },
|
6629
|
+
compatible_brands => { Name => 'CompatibleBrands', Avoid => 1 },
|
6630
|
+
creation_time => {
|
6631
|
+
Name => 'CreationTime',
|
6632
|
+
Groups => { 2 => 'Time' },
|
6633
|
+
Avoid => 1,
|
6634
|
+
%iso8601Date,
|
6635
|
+
},
|
6696
6636
|
#
|
6697
6637
|
# seen in Apple ProRes RAW file
|
6698
6638
|
#
|
@@ -6708,13 +6648,6 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6708
6648
|
# (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos")
|
6709
6649
|
# (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno")
|
6710
6650
|
# (mdta)com.apple.proapps.image.{TIFF}.Software (eg. "9.0")
|
6711
|
-
#
|
6712
|
-
# also seen (but don't yet add support for these)
|
6713
|
-
#
|
6714
|
-
# (mdta)major_brand
|
6715
|
-
# (mdta)minor_version
|
6716
|
-
# (mdta)compatible_brands
|
6717
|
-
# (mdta)creation_time
|
6718
6651
|
);
|
6719
6652
|
|
6720
6653
|
# iTunes info ('----') atoms
|
@@ -9373,7 +9306,7 @@ sub ProcessMOV($$;$)
|
|
9373
9306
|
}
|
9374
9307
|
# more convenient to package data as a RandomAccess file
|
9375
9308
|
unless ($raf) {
|
9376
|
-
$raf =
|
9309
|
+
$raf = File::RandomAccess->new($dataPt);
|
9377
9310
|
$dirEnd = $dataPos + $$dirInfo{DirLen} + ($$dirInfo{DirStart} || 0) if $$dirInfo{DirLen};
|
9378
9311
|
}
|
9379
9312
|
# skip leading bytes if necessary
|
@@ -848,11 +848,11 @@ sub FoundSomething($$;$$)
|
|
848
848
|
#------------------------------------------------------------------------------
|
849
849
|
# Approximate GPSDateTime value from sample time and CreateDate
|
850
850
|
# Inputs: 0) ExifTool ref, 1) tag table ptr, 2) sample time (s)
|
851
|
-
# 3) true if CreateDate is at end of video
|
851
|
+
# 3) true if CreateDate is at end of video, 4) flag if CreateDate is UTC
|
852
852
|
# Notes: Uses ExifTool CreateDateAtEnd as flag to subtract video duration
|
853
|
-
sub SetGPSDateTime(
|
853
|
+
sub SetGPSDateTime($$$;$)
|
854
854
|
{
|
855
|
-
my ($et, $tagTbl, $sampleTime) = @_;
|
855
|
+
my ($et, $tagTbl, $sampleTime, $isUTC) = @_;
|
856
856
|
my $value = $$et{VALUE};
|
857
857
|
if (defined $sampleTime and $$value{CreateDate}) {
|
858
858
|
$sampleTime += $$value{CreateDate}; # adjust sample time to seconds since the epoch
|
@@ -863,7 +863,9 @@ sub SetGPSDateTime($$$)
|
|
863
863
|
} else {
|
864
864
|
$et->WarnOnce('Approximating GPSDateTime as CreateDate + SampleTime', 1);
|
865
865
|
}
|
866
|
-
|
866
|
+
my $utc = $et->Options('QuickTimeUTC');
|
867
|
+
$utc = $isUTC unless defined $utc; # (allow QuickTimeUTC=0 to override $isUTC default)
|
868
|
+
unless ($utc) {
|
867
869
|
my $tzOff = $$et{tzOff}; # use previously calculated offset
|
868
870
|
unless (defined $tzOff) {
|
869
871
|
# adjust to UTC, assuming time is local
|
@@ -1344,7 +1346,7 @@ Sample: for ($i=0; ; ) {
|
|
1344
1346
|
$et->HandleTag($tagTbl, GPSLatitude => Get32s(\$buff, 12+$n) * 180/0x80000000);
|
1345
1347
|
$et->HandleTag($tagTbl, GPSLongitude => Get32s(\$buff, 16+$n) * 180/0x80000000);
|
1346
1348
|
$et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n) * $mphToKph);
|
1347
|
-
SetGPSDateTime($et, $tagTbl, $time[$i]);
|
1349
|
+
SetGPSDateTime($et, $tagTbl, $time[$i], 1);
|
1348
1350
|
next; # all done (don't store/process as text)
|
1349
1351
|
}
|
1350
1352
|
unless (defined $val) {
|
@@ -2454,7 +2456,7 @@ sub ProcessLIGO_JSON($$$)
|
|
2454
2456
|
$et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
|
2455
2457
|
while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
|
2456
2458
|
my $json = $1;
|
2457
|
-
my $raf =
|
2459
|
+
my $raf = File::RandomAccess->new(\$json);
|
2458
2460
|
my %dbase;
|
2459
2461
|
Image::ExifTool::Import::ReadJSON($raf, \%dbase);
|
2460
2462
|
my $info = $dbase{'*'} or next;
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.10';
|
18
18
|
|
19
19
|
sub ProcessRSRC($$);
|
20
20
|
|
@@ -70,7 +70,7 @@ sub ProcessRSRC($$)
|
|
70
70
|
my ($hdr, $map, $buff, $i, $j);
|
71
71
|
|
72
72
|
# allow access with data reference
|
73
|
-
$raf or $raf =
|
73
|
+
$raf or $raf = File::RandomAccess->new($$dirInfo{DataPt});
|
74
74
|
|
75
75
|
# attempt to validate the format as thoroughly as practical
|
76
76
|
return 0 unless $raf->Read($hdr, 30) == 30;
|
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.56';
|
26
26
|
|
27
27
|
sub WriteSTMN($$$);
|
28
28
|
sub ProcessINFO($$$);
|
@@ -1546,7 +1546,7 @@ sub ProcessSamsung($$$)
|
|
1546
1546
|
my ($buff, $buf2, $index, $offsetPos, $audioNOff, $audioSize);
|
1547
1547
|
|
1548
1548
|
unless ($raf) {
|
1549
|
-
$raf =
|
1549
|
+
$raf = File::RandomAccess->new($$dirInfo{DataPt});
|
1550
1550
|
$et->VerboseDir('SamsungTrailer');
|
1551
1551
|
}
|
1552
1552
|
return 0 unless $raf->Seek(-6-$offset, 2) and $raf->Read($buff, 6) == 6 and
|
@@ -1675,7 +1675,7 @@ SamBlock:
|
|
1675
1675
|
# add a fixup so the calling routine can apply further shifts if necessary
|
1676
1676
|
require Image::ExifTool::Fixup;
|
1677
1677
|
my $fixup = $$dirInfo{Fixup};
|
1678
|
-
$fixup or $fixup = $$dirInfo{Fixup} =
|
1678
|
+
$fixup or $fixup = $$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
|
1679
1679
|
$fixup->AddFixup(length($buff) - $offsetPos);
|
1680
1680
|
$fixup->AddFixup(length($buff) - $offsetPos + 4);
|
1681
1681
|
}
|
@@ -1697,7 +1697,7 @@ sub WriteSTMN($$$)
|
|
1697
1697
|
{
|
1698
1698
|
my ($et, $dirInfo, $tagTablePtr) = @_;
|
1699
1699
|
# create a Fixup for the PreviewImage
|
1700
|
-
$$dirInfo{Fixup} =
|
1700
|
+
$$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
|
1701
1701
|
my $val = Image::ExifTool::WriteBinaryData($et, $dirInfo, $tagTablePtr);
|
1702
1702
|
# force PreviewImage into the trailer even if it fits in EXIF segment
|
1703
1703
|
$$et{PREVIEW_INFO}{IsTrailer} = 1 if $$et{PREVIEW_INFO};
|
@@ -403,7 +403,7 @@ sub ShiftTime($;$$$)
|
|
403
403
|
};
|
404
404
|
$@ and return CleanWarning($@);
|
405
405
|
$tm += $$shiftOffset{$mode}; # apply the shift
|
406
|
-
$tm < 0 and return 'Shift results in
|
406
|
+
$tm < 0 and return 'Shift results in date before 1970';
|
407
407
|
# save fractional seconds in shifted time
|
408
408
|
$frac = $tm - int($tm);
|
409
409
|
if ($frac) {
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::Sigma;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.32';
|
20
20
|
|
21
21
|
sub ProcessX3FHeader($$$);
|
22
22
|
sub ProcessX3FDirectory($$$);
|
@@ -460,7 +460,7 @@ sub WriteX3F($$)
|
|
460
460
|
my $newData;
|
461
461
|
my %jpegInfo = (
|
462
462
|
Parent => 'X3F',
|
463
|
-
RAF =>
|
463
|
+
RAF => File::RandomAccess->new(\$buff),
|
464
464
|
OutFile => \$newData,
|
465
465
|
);
|
466
466
|
$$et{FILE_TYPE} = 'JPEG';
|
@@ -575,7 +575,7 @@ sub ProcessX3FDirectory($$$)
|
|
575
575
|
if ($$tagInfo{Name} eq 'JpgFromRaw') {
|
576
576
|
my %dirInfo = (
|
577
577
|
Parent => 'X3F',
|
578
|
-
RAF =>
|
578
|
+
RAF => File::RandomAccess->new(\$buff),
|
579
579
|
);
|
580
580
|
$$et{BASE} += $offset;
|
581
581
|
$et->ProcessJPEG(\%dirInfo);
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
34
34
|
use Image::ExifTool::Exif;
|
35
35
|
use Image::ExifTool::Minolta;
|
36
36
|
|
37
|
-
$VERSION = '3.
|
37
|
+
$VERSION = '3.67';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -859,7 +859,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
859
859
|
# must construct 0x20-byte header which contains length, width and height
|
860
860
|
ValueConvInv => q{
|
861
861
|
return 'none' unless $val;
|
862
|
-
my $e =
|
862
|
+
my $e = Image::ExifTool->new;
|
863
863
|
my $info = $e->ImageInfo(\$val,'ImageWidth','ImageHeight');
|
864
864
|
return undef unless $$info{ImageWidth} and $$info{ImageHeight};
|
865
865
|
my $size = Set32u($$info{ImageWidth}) . Set32u($$info{ImageHeight});
|
@@ -11640,7 +11640,7 @@ sub ProcessSR2($$$)
|
|
11640
11640
|
);
|
11641
11641
|
my $subTable = GetTagTable('Image::ExifTool::Sony::SR2SubIFD');
|
11642
11642
|
if ($outfile) {
|
11643
|
-
my $fixup =
|
11643
|
+
my $fixup = Image::ExifTool::Fixup->new;
|
11644
11644
|
$dirInfo{Fixup} = $fixup;
|
11645
11645
|
$result = $et->WriteDirectory(\%dirInfo, $subTable);
|
11646
11646
|
return undef unless $result;
|
@@ -15,7 +15,7 @@ use vars qw($VERSION @ISA $makeMissing);
|
|
15
15
|
use Image::ExifTool qw(:Utils :Vars);
|
16
16
|
use Image::ExifTool::XMP;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.36';
|
19
19
|
@ISA = qw(Exporter);
|
20
20
|
|
21
21
|
# set this to a language code to generate Lang module with 'MISSING' entries
|
@@ -74,7 +74,7 @@ sub Write(;$$%)
|
|
74
74
|
{
|
75
75
|
local ($_, *PTIFILE);
|
76
76
|
my ($file, $group, %opts) = @_;
|
77
|
-
my $et =
|
77
|
+
my $et = Image::ExifTool->new;
|
78
78
|
my ($fp, $tableName, %langInfo, @langs, $defaultLang, @groups);
|
79
79
|
@groups = split ':', $group if $group;
|
80
80
|
|
@@ -17,7 +17,7 @@ require Exporter;
|
|
17
17
|
use vars qw($VERSION @ISA @EXPORT_OK);
|
18
18
|
use Image::ExifTool qw(:Utils);
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.20';
|
21
21
|
@ISA = qw(Exporter);
|
22
22
|
@EXPORT_OK = qw(FindTagInfo TagExists);
|
23
23
|
|
@@ -1870,6 +1870,7 @@ my %tagLookup = (
|
|
1870
1870
|
'commanderinternalttlcompgroupb' => { 312 => '22.1', 313 => '28.1' },
|
1871
1871
|
'comment' => { 0 => 0x2, 123 => 'Comment', 160 => 'Comment', 336 => 'Comment', 399 => "\xa9cmt", 401 => 'comment', 407 => "\xa9cmt" },
|
1872
1872
|
'compass' => { 417 => 0x4 },
|
1873
|
+
'compatiblebrands' => { 401 => 'compatible_brands' },
|
1873
1874
|
'compatibleversion' => { 509 => 'CompatibleVersion', 511 => 'CompatibleVersion' },
|
1874
1875
|
'compilation' => { 399 => 'cpil' },
|
1875
1876
|
'compimageimagespersequence' => { 516 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesNumberOfImagesInSequences'] },
|
@@ -2022,7 +2023,7 @@ my %tagLookup = (
|
|
2022
2023
|
'crc32' => { 513 => 'crc32' },
|
2023
2024
|
'createdate' => { 122 => 0x9004, 160 => 'CreateDate', 332 => 'CreationDate', 336 => 'create-date', 398 => 'CreationDate', 404 => 0x1, 536 => 'CreateDate' },
|
2024
2025
|
'creationdate' => { 401 => 'creationdate', 525 => 'CreationDate', 528 => 'creationDate' },
|
2025
|
-
'creationtime' => { 336 => 'Creation Time' },
|
2026
|
+
'creationtime' => { 336 => 'Creation Time', 401 => 'creation_time' },
|
2026
2027
|
'creativestyle' => { 434 => 0x1a, 435 => 0x18, 445 => 0x41, 448 => 0xb020, 480 => 0x4a },
|
2027
2028
|
'creativestylesetting' => { 436 => 0xf, 453 => 0x7 },
|
2028
2029
|
'creativestylewaschanged' => { 485 => 0x8001 },
|
@@ -4314,6 +4315,7 @@ my %tagLookup = (
|
|
4314
4315
|
'mainboardversion' => { 141 => 0x438 },
|
4315
4316
|
'maindialexposurecomp' => { 314 => '0.6' },
|
4316
4317
|
'mainingredient' => { 530 => 'mainIngredient' },
|
4318
|
+
'majorbrand' => { 401 => 'major_brand' },
|
4317
4319
|
'majorversion' => { 500 => 'MajorVersion' },
|
4318
4320
|
'make' => { 101 => 0x0, 118 => 0x1, 122 => 0x10f, 159 => 'Make', 336 => 'Make', 352 => 0x10f, 401 => 'make', 407 => ['@mak',"\xa9mak"], 527 => 'make', 534 => 'Make' },
|
4319
4321
|
'makernote' => { 515 => 'MakerNote' },
|
@@ -4781,7 +4783,7 @@ my %tagLookup = (
|
|
4781
4783
|
'minoltaquality' => { 184 => 0x5, 185 => 0xd, 186 => 0x3, 189 => [0x102,0x103] },
|
4782
4784
|
'minoltatime' => { 184 => 0x16 },
|
4783
4785
|
'minormodelagedisclosure' => { 333 => 'MinorModelAgeDisclosure' },
|
4784
|
-
'minorversion' => { 500 => 'MinorVersion' },
|
4786
|
+
'minorversion' => { 401 => 'minor_version', 500 => 'MinorVersion' },
|
4785
4787
|
'minsamplevalue' => { 122 => 0x118 },
|
4786
4788
|
'mirrorlockup' => { 85 => 0xc, 86 => 0xc, 87 => 0x60f, 88 => 0xb, 89 => 0xc, 90 => 0x6, 91 => 0x6, 92 => 0xc, 93 => 0x3 },
|
4787
4789
|
'mobilecountrycode' => { 508 => 'mcc' },
|
@@ -8509,7 +8511,6 @@ my %tagExists = (
|
|
8509
8511
|
'companymainphone' => 1,
|
8510
8512
|
'companyname' => 1,
|
8511
8513
|
'compatibility' => 1,
|
8512
|
-
'compatiblebrands' => 1,
|
8513
8514
|
'compatiblefontname' => 1,
|
8514
8515
|
'complete' => 1,
|
8515
8516
|
'compobj' => 1,
|
@@ -10361,7 +10362,6 @@ my %tagExists = (
|
|
10361
10362
|
'mainboard' => 1,
|
10362
10363
|
'maininfo' => 1,
|
10363
10364
|
'maininfoifd' => 1,
|
10364
|
-
'majorbrand' => 1,
|
10365
10365
|
'makeandmodel' => 1,
|
10366
10366
|
'makemodel' => 1,
|
10367
10367
|
'makernotepentax5a' => 1,
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 27473 tags, with 17233 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -29481,8 +29481,10 @@ changed via the config file.
|
|
29481
29481
|
'com.android.version' AndroidVersion yes
|
29482
29482
|
'com.apple.photos.captureMode' CaptureMode yes
|
29483
29483
|
'comment' Comment yes
|
29484
|
+
'compatible_brands' CompatibleBrands yes/
|
29484
29485
|
'content.identifier' ContentIdentifier yes
|
29485
29486
|
'copyright' Copyright yes
|
29487
|
+
'creation_time' CreationTime yes/
|
29486
29488
|
'creationdate' CreationDate yes
|
29487
29489
|
'description' Description yes
|
29488
29490
|
'detected-face' FaceInfo QuickTime FaceInfo
|
@@ -29514,7 +29516,9 @@ changed via the config file.
|
|
29514
29516
|
'location.name' LocationName yes
|
29515
29517
|
'location.note' LocationNote yes
|
29516
29518
|
'location.role' LocationRole yes
|
29519
|
+
'major_brand' MajorBrand yes/
|
29517
29520
|
'make' Make yes
|
29521
|
+
'minor_version' MinorVersion yes/
|
29518
29522
|
'model' Model yes
|
29519
29523
|
'player.movie.audio.balance' Balance yes
|
29520
29524
|
'player.movie.audio.bass' Bass yes
|
@@ -128,7 +128,7 @@ sub SaveMakerNotes($)
|
|
128
128
|
delete $$et{MAKER_NOTE_INFO};
|
129
129
|
my $dirEntries = $makerInfo->{Entries};
|
130
130
|
my $numEntries = scalar(keys %$dirEntries);
|
131
|
-
my $fixup =
|
131
|
+
my $fixup = Image::ExifTool::Fixup->new;
|
132
132
|
return unless $numEntries;
|
133
133
|
# build the MakerNotes directory
|
134
134
|
my $makerNotes = Set16u($numEntries);
|
@@ -171,9 +171,9 @@ sub RebuildMakerNotes($$$)
|
|
171
171
|
my $saveOrder = GetByteOrder();
|
172
172
|
my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
|
173
173
|
if (defined $loc) {
|
174
|
-
my $makerFixup = $subdirInfo{Fixup} =
|
174
|
+
my $makerFixup = $subdirInfo{Fixup} = Image::ExifTool::Fixup->new;
|
175
175
|
# create new exiftool object to rewrite the directory without changing it
|
176
|
-
my $newTool =
|
176
|
+
my $newTool = Image::ExifTool->new;
|
177
177
|
$newTool->Options(
|
178
178
|
IgnoreMinorErrors => $$et{OPTIONS}{IgnoreMinorErrors},
|
179
179
|
FixBase => $$et{OPTIONS}{FixBase},
|
@@ -565,7 +565,7 @@ sub WriteExif($$$)
|
|
565
565
|
my $firstBase = $base;
|
566
566
|
my $raf = $$dirInfo{RAF};
|
567
567
|
my $dirName = $$dirInfo{DirName} || 'unknown';
|
568
|
-
my $fixup = $$dirInfo{Fixup} ||
|
568
|
+
my $fixup = $$dirInfo{Fixup} || Image::ExifTool::Fixup->new;
|
569
569
|
my $imageDataFlag = $$dirInfo{ImageData} || '';
|
570
570
|
my $verbose = $et->Options('Verbose');
|
571
571
|
my $out = $et->Options('TextOut');
|
@@ -745,7 +745,7 @@ sub WriteExif($$$)
|
|
745
745
|
my $valBuff = ''; # buffer for value data
|
746
746
|
my @valFixups; # list of fixups for offsets in valBuff
|
747
747
|
# fixup for offsets in dirBuff
|
748
|
-
my $dirFixup =
|
748
|
+
my $dirFixup = Image::ExifTool::Fixup->new;
|
749
749
|
my $entryBasedFixup;
|
750
750
|
my $lastTagID = -1;
|
751
751
|
my ($oldInfo, $oldFormat, $oldFormName, $oldCount, $oldSize, $oldValue, $oldImageData);
|
@@ -896,7 +896,7 @@ Entry: for (;;) {
|
|
896
896
|
TagInfo => $oldInfo || $tmpInfo,
|
897
897
|
Offset => $base + $valuePtr + $dataPos,
|
898
898
|
Size => $oldSize,
|
899
|
-
Fixup =>
|
899
|
+
Fixup => Image::ExifTool::Fixup->new,
|
900
900
|
},
|
901
901
|
$invalidPreview = 2;
|
902
902
|
# remove SubDirectory to prevent processing (for now)
|
@@ -1348,7 +1348,7 @@ NoOverwrite: next if $isNew > 0;
|
|
1348
1348
|
# create empty source directory
|
1349
1349
|
my %sourceDir = (
|
1350
1350
|
Parent => $dirName,
|
1351
|
-
Fixup =>
|
1351
|
+
Fixup => Image::ExifTool::Fixup->new,
|
1352
1352
|
);
|
1353
1353
|
$sourceDir{DirName} = $$newInfo{Groups}{1} if $$newInfo{SubIFD};
|
1354
1354
|
$newValue = $et->WriteDirectory(\%sourceDir, $subTable);
|
@@ -1509,7 +1509,7 @@ NoOverwrite: next if $isNew > 0;
|
|
1509
1509
|
}
|
1510
1510
|
if (defined $loc) {
|
1511
1511
|
# we need fixup data for this subdirectory
|
1512
|
-
$subdirInfo{Fixup} =
|
1512
|
+
$subdirInfo{Fixup} = Image::ExifTool::Fixup->new;
|
1513
1513
|
# rewrite maker notes
|
1514
1514
|
my $changed = $$et{CHANGED};
|
1515
1515
|
$subdir = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
|
@@ -1673,7 +1673,7 @@ NoOverwrite: next if $isNew > 0;
|
|
1673
1673
|
Name => $$newInfo{Name},
|
1674
1674
|
TagInfo => $newInfo,
|
1675
1675
|
Parent => $dirName,
|
1676
|
-
Fixup =>
|
1676
|
+
Fixup => Image::ExifTool::Fixup->new,
|
1677
1677
|
RAF => $raf,
|
1678
1678
|
Subdir => $subdir,
|
1679
1679
|
# set ImageData only for 1st level SubIFD's
|
@@ -1782,7 +1782,7 @@ NoOverwrite: next if $isNew > 0;
|
|
1782
1782
|
#### eval Base ($start,$base)
|
1783
1783
|
$subdirBase += eval $$subdir{Base};
|
1784
1784
|
}
|
1785
|
-
my $subFixup =
|
1785
|
+
my $subFixup = Image::ExifTool::Fixup->new;
|
1786
1786
|
my %subdirInfo = (
|
1787
1787
|
Base => $subdirBase,
|
1788
1788
|
DataPt => $valueDataPt,
|
@@ -1995,7 +1995,7 @@ NoOverwrite: next if $isNew > 0;
|
|
1995
1995
|
# hold onto the PreviewImage until we can determine if it fits
|
1996
1996
|
$$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
|
1997
1997
|
Data => $$newValuePt,
|
1998
|
-
Fixup =>
|
1998
|
+
Fixup => Image::ExifTool::Fixup->new,
|
1999
1999
|
};
|
2000
2000
|
$$et{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase};
|
2001
2001
|
if ($$newInfo{IsOffset} and $$newInfo{IsOffset} eq '2') {
|
@@ -2017,7 +2017,7 @@ NoOverwrite: next if $isNew > 0;
|
|
2017
2017
|
$valBuff .= $$newValuePt; # add value data to buffer
|
2018
2018
|
# must save a fixup pointer for every pointer in the directory
|
2019
2019
|
if ($entryBased) {
|
2020
|
-
$entryBasedFixup or $entryBasedFixup =
|
2020
|
+
$entryBasedFixup or $entryBasedFixup = Image::ExifTool::Fixup->new;
|
2021
2021
|
$entryBasedFixup->AddFixup(length($dirBuff) + 8, $dataTag);
|
2022
2022
|
} else {
|
2023
2023
|
$dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
|
@@ -2451,7 +2451,7 @@ NoOverwrite: next if $isNew > 0;
|
|
2451
2451
|
$newOffset += $blockSize; # data comes after other deferred data
|
2452
2452
|
# create fixup for SubIFD ImageData
|
2453
2453
|
if ($imageDataFlag eq 'SubIFD' and not $subIfdDataFixup) {
|
2454
|
-
$subIfdDataFixup =
|
2454
|
+
$subIfdDataFixup = Image::ExifTool::Fixup->new;
|
2455
2455
|
$imageData[-1][4] = $subIfdDataFixup;
|
2456
2456
|
}
|
2457
2457
|
$size += $pad; # account for pad byte if necessary
|
@@ -2522,7 +2522,7 @@ NoOverwrite: next if $isNew > 0;
|
|
2522
2522
|
# hold onto the PreviewImage until we can determine if it fits
|
2523
2523
|
$$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
|
2524
2524
|
Data => $buff,
|
2525
|
-
Fixup =>
|
2525
|
+
Fixup => Image::ExifTool::Fixup->new,
|
2526
2526
|
};
|
2527
2527
|
if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '2') {
|
2528
2528
|
$$et{PREVIEW_INFO}{NoBaseShift} = 1;
|
@@ -2603,7 +2603,7 @@ NoOverwrite: next if $isNew > 0;
|
|
2603
2603
|
$fixup->AddFixup($entry + 8);
|
2604
2604
|
# create special fixup for SubIFD data
|
2605
2605
|
if ($imageDataFlag eq 'SubIFD') {
|
2606
|
-
my $subIfdDataFixup =
|
2606
|
+
my $subIfdDataFixup = Image::ExifTool::Fixup->new;
|
2607
2607
|
$subIfdDataFixup->AddFixup($entry + 8);
|
2608
2608
|
# save fixup in imageData list
|
2609
2609
|
$$blockInfo[4] = $subIfdDataFixup;
|
@@ -2668,7 +2668,7 @@ NoOverwrite: next if $isNew > 0;
|
|
2668
2668
|
} else {
|
2669
2669
|
# Doesn't fit, or we still don't know, so save fixup information
|
2670
2670
|
# and put the preview at the end of the file
|
2671
|
-
$$previewInfo{Fixup} or $$previewInfo{Fixup} =
|
2671
|
+
$$previewInfo{Fixup} or $$previewInfo{Fixup} = Image::ExifTool::Fixup->new;
|
2672
2672
|
$$previewInfo{Fixup}->AddFixup($fixup);
|
2673
2673
|
}
|
2674
2674
|
} elsif (defined $newData and $deleteAll) {
|
@@ -290,7 +290,7 @@ sub WritePDF($$)
|
|
290
290
|
$raf->Seek($pos, 0);
|
291
291
|
|
292
292
|
# create a new ExifTool object and use it to read PDF and XMP information
|
293
|
-
my $newTool =
|
293
|
+
my $newTool = Image::ExifTool->new;
|
294
294
|
$newTool->Options(List => 1);
|
295
295
|
$newTool->Options(Password => $et->Options('Password'));
|
296
296
|
$newTool->Options(NoPDFList => $et->Options('NoPDFList'));
|