exiftool_vendored 12.73.0 → 12.75.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 +41 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +46 -45
- data/bin/exiftool +97 -83
- 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 +7 -7
- data/bin/lib/Image/ExifTool/Canon.pm +6 -5
- 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 +3 -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 +51 -12
- 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/PDF.pm +54 -4
- 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 +41 -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 -2
- 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 +8 -5
- data/bin/lib/Image/ExifTool/TagNames.pod +36 -5
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +26 -23
- 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 +68 -44
- data/bin/lib/Image/ExifTool/XMP.pm +2 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +9 -0
- data/bin/lib/Image/ExifTool/ZIP.pm +6 -6
- data/bin/lib/Image/ExifTool.pm +42 -26
- data/bin/lib/Image/ExifTool.pod +76 -71
- data/bin/perl-Image-ExifTool.spec +45 -44
- 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.93';
|
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',
|
@@ -645,6 +663,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
645
663
|
Deletable => 1,
|
646
664
|
SubDirectory => {
|
647
665
|
TagTable => 'Image::ExifTool::Jpeg2000::Main',
|
666
|
+
DirName => 'JUMBF',
|
648
667
|
# 16 bytes uuid
|
649
668
|
# +4 bytes 0
|
650
669
|
# +9 bytes "manifest\0"
|
@@ -1574,22 +1593,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
1574
1593
|
"\xa9day" => {
|
1575
1594
|
Name => 'ContentCreateDate',
|
1576
1595
|
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)
|
1596
|
+
%iso8601Date,
|
1593
1597
|
},
|
1594
1598
|
"\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
|
1595
1599
|
"\xa9alb" => 'Album', #PH (iTunes 8.0.2)
|
@@ -1873,21 +1877,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
1873
1877
|
Apple Photos has been reported to show a crazy date/time for some MP4 files
|
1874
1878
|
containing this tag, but perhaps only if it is missing a time zone
|
1875
1879
|
}, #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)
|
1880
|
+
%iso8601Date,
|
1891
1881
|
},
|
1892
1882
|
manu => { # (SX280)
|
1893
1883
|
Name => 'Make',
|
@@ -2310,23 +2300,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
2310
2300
|
symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models
|
2311
2301
|
},
|
2312
2302
|
Groups => { 2 => 'Time' },
|
2313
|
-
Shift => 'Time',
|
2314
2303
|
Avoid => 1,
|
2315
2304
|
# 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)
|
2305
|
+
%iso8601Date,
|
2330
2306
|
},
|
2331
2307
|
'@xyz' => { #PH (iPhone 3GS)
|
2332
2308
|
Name => 'GPSCoordinates',
|
@@ -3339,22 +3315,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
3339
3315
|
"\xa9day" => {
|
3340
3316
|
Name => 'ContentCreateDate',
|
3341
3317
|
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)
|
3318
|
+
%iso8601Date,
|
3358
3319
|
},
|
3359
3320
|
"\xa9des" => 'Description', #4
|
3360
3321
|
"\xa9enc" => 'EncodedBy', #10
|
@@ -6403,12 +6364,10 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6403
6364
|
ValueConvInv => '$val * 1000',
|
6404
6365
|
PrintConv => 'ConvertDuration($val)',
|
6405
6366
|
PrintConvInv => q{
|
6406
|
-
|
6407
|
-
|
6408
|
-
|
6409
|
-
|
6410
|
-
$a[0] += shift(@a) * 60 while @a > 1;
|
6411
|
-
return $a[0] * $sign;
|
6367
|
+
my $sign = ($val =~ s/^-//) ? -1 : 1;
|
6368
|
+
my @a = $val =~ /(\d+(?:\.\d+)?)/g;
|
6369
|
+
unshift @a, 0 while @a < 4;
|
6370
|
+
return $sign * (((($a[0] * 24) + $a[1]) * 60 + $a[2]) * 60 + $a[3]);
|
6412
6371
|
},
|
6413
6372
|
},
|
6414
6373
|
|
@@ -6522,21 +6481,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6522
6481
|
creationdate=> {
|
6523
6482
|
Name => 'CreationDate',
|
6524
6483
|
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)
|
6484
|
+
%iso8601Date,
|
6540
6485
|
},
|
6541
6486
|
description => { },
|
6542
6487
|
director => { },
|
@@ -6586,21 +6531,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6586
6531
|
'location.date' => {
|
6587
6532
|
Name => 'LocationDate',
|
6588
6533
|
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)
|
6534
|
+
%iso8601Date,
|
6604
6535
|
},
|
6605
6536
|
'location.accuracy.horizontal' => { Name => 'LocationAccuracyHorizontal' },
|
6606
6537
|
'live-photo.auto' => { Name => 'LivePhotoAuto', Writable => 'int8u' },
|
@@ -6693,6 +6624,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6693
6624
|
'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 },
|
6694
6625
|
# (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float)
|
6695
6626
|
'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 },
|
6627
|
+
# the following tags generated by ShutterEncoder when "preserve metadata" is selected (forum15610)
|
6628
|
+
major_brand => { Name => 'MajorBrand', Avoid => 1 },
|
6629
|
+
minor_version => { Name => 'MinorVersion', Avoid => 1 },
|
6630
|
+
compatible_brands => { Name => 'CompatibleBrands', Avoid => 1 },
|
6631
|
+
creation_time => {
|
6632
|
+
Name => 'CreationTime',
|
6633
|
+
Groups => { 2 => 'Time' },
|
6634
|
+
Avoid => 1,
|
6635
|
+
%iso8601Date,
|
6636
|
+
},
|
6696
6637
|
#
|
6697
6638
|
# seen in Apple ProRes RAW file
|
6698
6639
|
#
|
@@ -6708,13 +6649,6 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6708
6649
|
# (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos")
|
6709
6650
|
# (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno")
|
6710
6651
|
# (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
6652
|
);
|
6719
6653
|
|
6720
6654
|
# iTunes info ('----') atoms
|
@@ -9373,7 +9307,7 @@ sub ProcessMOV($$;$)
|
|
9373
9307
|
}
|
9374
9308
|
# more convenient to package data as a RandomAccess file
|
9375
9309
|
unless ($raf) {
|
9376
|
-
$raf =
|
9310
|
+
$raf = File::RandomAccess->new($dataPt);
|
9377
9311
|
$dirEnd = $dataPos + $$dirInfo{DirLen} + ($$dirInfo{DirStart} || 0) if $$dirInfo{DirLen};
|
9378
9312
|
}
|
9379
9313
|
# 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};
|
@@ -361,7 +361,7 @@ sub ShiftTime($;$$$)
|
|
361
361
|
};
|
362
362
|
# not a problem if we failed here since we'll just try again next time,
|
363
363
|
# so don't return error message
|
364
|
-
unless (
|
364
|
+
unless ($@) {
|
365
365
|
my $mode;
|
366
366
|
if (defined $time[0]) {
|
367
367
|
$mode = defined $time[3] ? 'DateTime' : 'Date';
|
@@ -403,7 +403,6 @@ 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 negative time';
|
407
406
|
# save fractional seconds in shifted time
|
408
407
|
$frac = $tm - int($tm);
|
409
408
|
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' },
|
@@ -7593,6 +7595,7 @@ my %tagExists = (
|
|
7593
7595
|
'aeliveviewhistograminfo' => 1,
|
7594
7596
|
'aeliveviewlocalhistogram' => 1,
|
7595
7597
|
'aelocalhistogram' => 1,
|
7598
|
+
'af' => 1,
|
7596
7599
|
'af-cprioritysel' => 1,
|
7597
7600
|
'af-sprioritysel' => 1,
|
7598
7601
|
'afarea' => 1,
|
@@ -8509,7 +8512,6 @@ my %tagExists = (
|
|
8509
8512
|
'companymainphone' => 1,
|
8510
8513
|
'companyname' => 1,
|
8511
8514
|
'compatibility' => 1,
|
8512
|
-
'compatiblebrands' => 1,
|
8513
8515
|
'compatiblefontname' => 1,
|
8514
8516
|
'complete' => 1,
|
8515
8517
|
'compobj' => 1,
|
@@ -9041,6 +9043,7 @@ my %tagExists = (
|
|
9041
9043
|
'editedby' => 1,
|
9042
9044
|
'editor' => 1,
|
9043
9045
|
'edittagarray' => 1,
|
9046
|
+
'ef' => 1,
|
9044
9047
|
'effect' => 1,
|
9045
9048
|
'effectivebw' => 1,
|
9046
9049
|
'effectstrength' => 1,
|
@@ -9194,6 +9197,7 @@ my %tagExists = (
|
|
9194
9197
|
'extrasamples' => 1,
|
9195
9198
|
'extraticklocations' => 1,
|
9196
9199
|
'f-stop' => 1,
|
9200
|
+
'f_' => 1,
|
9197
9201
|
'face1birthday' => 1,
|
9198
9202
|
'face1category' => 1,
|
9199
9203
|
'face1name' => 1,
|
@@ -10361,7 +10365,6 @@ my %tagExists = (
|
|
10361
10365
|
'mainboard' => 1,
|
10362
10366
|
'maininfo' => 1,
|
10363
10367
|
'maininfoifd' => 1,
|
10364
|
-
'majorbrand' => 1,
|
10365
10368
|
'makeandmodel' => 1,
|
10366
10369
|
'makemodel' => 1,
|
10367
10370
|
'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 27474 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
|
@@ -25405,10 +25405,13 @@ C2PA (Coalition for Content Provenance and Authenticity) CAI (Content
|
|
25405
25405
|
Authenticity Initiative) JUMBF (JPEG Universal Metadata Box Format) metdata
|
25406
25406
|
is currently extracted from JPEG, PNG, TIFF-based (eg. TIFF, DNG),
|
25407
25407
|
QuickTime-based (eg. MP4, MOV, HEIF, AVIF), RIFF-based (eg. WAV, AVI, WebP),
|
25408
|
-
GIF files and ID3v2 metadata. The suggested ExifTool
|
25409
|
-
for reading C2PA metadata are C<-jumbf:all -G3 -b -j
|
25410
|
-
metadata may be deleted from writable JPEG, PNG, WebP,
|
25411
|
-
QuickTime-based files by deleting the JUMBF group with
|
25408
|
+
PDF, SVG and GIF files, and ID3v2 metadata. The suggested ExifTool
|
25409
|
+
command-line arguments for reading C2PA metadata are C<-jumbf:all -G3 -b -j
|
25410
|
+
-u -struct>. This metadata may be deleted from writable JPEG, PNG, WebP,
|
25411
|
+
TIFF-based, and QuickTime-based files by deleting the JUMBF group with
|
25412
|
+
C<-jumbf:all=>. The C2PA JUMBF metadata may be extracted as a block via the
|
25413
|
+
JUMBF tag. See L<https://c2pa.org/specifications/> for the C2PA
|
25414
|
+
specification.
|
25412
25415
|
|
25413
25416
|
Tag ID Tag Name Writable
|
25414
25417
|
------ -------- --------
|
@@ -28532,6 +28535,7 @@ This is the PDF document catalog.
|
|
28532
28535
|
|
28533
28536
|
Tag ID Tag Name Writable
|
28534
28537
|
------ -------- --------
|
28538
|
+
'AF' AF PDF AF
|
28535
28539
|
'AcroForm' AcroForm PDF AcroForm
|
28536
28540
|
'Lang' Language no
|
28537
28541
|
'MarkInfo' MarkInfo PDF MarkInfo
|
@@ -28542,6 +28546,28 @@ This is the PDF document catalog.
|
|
28542
28546
|
'Perms' Perms PDF Perms
|
28543
28547
|
'Version' PDFVersion no
|
28544
28548
|
|
28549
|
+
=head3 PDF AF Tags
|
28550
|
+
|
28551
|
+
Processed only for C2PA information if AFRelationship is "/C2PA_Manifest".
|
28552
|
+
|
28553
|
+
Tag ID Tag Name Writable
|
28554
|
+
------ -------- --------
|
28555
|
+
'EF' EF PDF EF
|
28556
|
+
|
28557
|
+
=head3 PDF EF Tags
|
28558
|
+
|
28559
|
+
Tag ID Tag Name Writable
|
28560
|
+
------ -------- --------
|
28561
|
+
'F' F_ PDF F
|
28562
|
+
|
28563
|
+
=head3 PDF F Tags
|
28564
|
+
|
28565
|
+
C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
|
28566
|
+
|
28567
|
+
Tag ID Tag Name Writable
|
28568
|
+
------ -------- --------
|
28569
|
+
'_stream' JUMBF Jpeg2000
|
28570
|
+
|
28545
28571
|
=head3 PDF AcroForm Tags
|
28546
28572
|
|
28547
28573
|
Tag ID Tag Name Writable
|
@@ -29481,8 +29507,10 @@ changed via the config file.
|
|
29481
29507
|
'com.android.version' AndroidVersion yes
|
29482
29508
|
'com.apple.photos.captureMode' CaptureMode yes
|
29483
29509
|
'comment' Comment yes
|
29510
|
+
'compatible_brands' CompatibleBrands yes/
|
29484
29511
|
'content.identifier' ContentIdentifier yes
|
29485
29512
|
'copyright' Copyright yes
|
29513
|
+
'creation_time' CreationTime yes/
|
29486
29514
|
'creationdate' CreationDate yes
|
29487
29515
|
'description' Description yes
|
29488
29516
|
'detected-face' FaceInfo QuickTime FaceInfo
|
@@ -29514,7 +29542,9 @@ changed via the config file.
|
|
29514
29542
|
'location.name' LocationName yes
|
29515
29543
|
'location.note' LocationNote yes
|
29516
29544
|
'location.role' LocationRole yes
|
29545
|
+
'major_brand' MajorBrand yes/
|
29517
29546
|
'make' Make yes
|
29547
|
+
'minor_version' MinorVersion yes/
|
29518
29548
|
'model' Model yes
|
29519
29549
|
'player.movie.audio.balance' Balance yes
|
29520
29550
|
'player.movie.audio.bass' Bass yes
|
@@ -39544,6 +39574,7 @@ FileName.
|
|
39544
39574
|
JPEGDigest File no
|
39545
39575
|
JPEGImageLength File no
|
39546
39576
|
JPEGQualityEstimate File no
|
39577
|
+
JUMBF JUMBF no
|
39547
39578
|
MIMEType File no
|
39548
39579
|
MaxVal File no
|
39549
39580
|
NewGUID ExifTool no
|
@@ -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);
|