exiftool_vendored 12.73.0 → 12.75.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 +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);
|