exiftool_vendored 13.14.0 → 13.17.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 +45 -3
- data/bin/MANIFEST +4 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +4 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +16 -16
- data/bin/lib/Image/ExifTool/Canon.pm +7 -4
- data/bin/lib/Image/ExifTool/EXE.pm +16 -2
- data/bin/lib/Image/ExifTool/ID3.pm +4 -4
- data/bin/lib/Image/ExifTool/JPEG.pm +7 -1
- data/bin/lib/Image/ExifTool/MIE.pm +6 -3
- data/bin/lib/Image/ExifTool/Nikon.pm +399 -179
- data/bin/lib/Image/ExifTool/NikonCustom.pm +5 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +7 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +70 -24
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +10 -10
- data/bin/lib/Image/ExifTool/README +4 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +11 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +4 -0
- data/bin/lib/Image/ExifTool/Sony.pm +1 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4818 -4811
- data/bin/lib/Image/ExifTool/TagNames.pod +8080 -7908
- data/bin/lib/Image/ExifTool/Trailer.pm +318 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +49 -23
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +3 -1
- data/bin/lib/Image/ExifTool/Writer.pl +8 -7
- data/bin/lib/Image/ExifTool/XMP2.pl +3 -2
- data/bin/lib/Image/ExifTool.pm +138 -71
- data/bin/lib/Image/ExifTool.pod +53 -52
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -3
- data/bin/lib/Image/ExifTool/Vivo.pm +0 -124
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
30
30
|
%static_vars $advFmtSelf);
|
31
31
|
|
32
|
-
$VERSION = '13.
|
32
|
+
$VERSION = '13.17';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
@@ -4166,7 +4166,7 @@ sub GetFileType(;$$)
|
|
4166
4166
|
$desc = $$fileType[1];
|
4167
4167
|
}
|
4168
4168
|
} else {
|
4169
|
-
$desc = $fileDescription{$file};
|
4169
|
+
$desc = $fileDescription{$file} || $file;
|
4170
4170
|
}
|
4171
4171
|
$desc .= ", $subType" if $subType;
|
4172
4172
|
return $desc;
|
@@ -4494,7 +4494,7 @@ sub DoneExtract($)
|
|
4494
4494
|
# set family 8 group name for all tags
|
4495
4495
|
$$altExifTool{TAG_EXTRA}{$_}{G8} = $g8 foreach keys %{$$altExifTool{VALUE}};
|
4496
4496
|
# prepare our sorted list of found tags
|
4497
|
-
$$altExifTool{FoundTags} =
|
4497
|
+
$$altExifTool{FoundTags} = $altExifTool->SetFoundTags();
|
4498
4498
|
$$altExifTool{DID_EXTRACT} = 1;
|
4499
4499
|
}
|
4500
4500
|
# if necessary, build composite tags that rely on tags from alternate files
|
@@ -6898,6 +6898,8 @@ sub IdentifyTrailer($;$)
|
|
6898
6898
|
$type = 'NikonApp';
|
6899
6899
|
} elsif ($buff =~ /\xff{4}\x1b\*9HWfu\x84\x93\xa2\xb1$/) {
|
6900
6900
|
$type = 'Vivo';
|
6901
|
+
} elsif ($buff =~ /jxrs...\0$/s) {
|
6902
|
+
$type = 'OnePlus';
|
6901
6903
|
}
|
6902
6904
|
last;
|
6903
6905
|
}
|
@@ -6929,18 +6931,24 @@ sub ProcessTrailers($$)
|
|
6929
6931
|
my $success = 1;
|
6930
6932
|
my $path = $$self{PATH};
|
6931
6933
|
|
6934
|
+
# get position of end of file
|
6935
|
+
$raf->Seek(0,2);
|
6936
|
+
$$self{FileEnd} = $raf->Tell();
|
6937
|
+
|
6932
6938
|
for (;;) { # loop through all trailers
|
6939
|
+
$raf->Seek($pos);
|
6933
6940
|
my ($proc, $outBuff);
|
6934
|
-
|
6935
|
-
|
6936
|
-
|
6937
|
-
|
6938
|
-
|
6939
|
-
|
6940
|
-
|
6941
|
-
|
6942
|
-
|
6943
|
-
|
6941
|
+
# trailer-processing procs residing in modules of a different name
|
6942
|
+
my $module = {
|
6943
|
+
Insta360 => 'QuickTimeStream.pl',
|
6944
|
+
NikonApp => 'Nikon.pm',
|
6945
|
+
Vivo => 'Trailer.pm',
|
6946
|
+
OnePlus => 'Trailer.pm',
|
6947
|
+
Google => 'Trailer.pm',
|
6948
|
+
}->{$dirName} || "$dirName.pm";
|
6949
|
+
require "Image/ExifTool/$module";
|
6950
|
+
$module =~ s/(Stream)?\..*//; # remove extension and change QuickTimeStream to QuickTime
|
6951
|
+
$proc = "Image::ExifTool::${module}::Process$dirName";
|
6944
6952
|
if ($outfile) {
|
6945
6953
|
# write to local buffer so we can add trailer in proper order later
|
6946
6954
|
$$outfile and $$dirInfo{OutFile} = \$outBuff, $outBuff = '';
|
@@ -6953,11 +6961,38 @@ sub ProcessTrailers($$)
|
|
6953
6961
|
$$dirInfo{Trailer} = 1; # set Trailer flag in case proc cares
|
6954
6962
|
# add trailer and DirName to SubDirectory PATH
|
6955
6963
|
push @$path, 'Trailer', $dirName;
|
6956
|
-
|
6957
|
-
|
6958
|
-
|
6959
|
-
|
6960
|
-
|
6964
|
+
#
|
6965
|
+
# Call proc to read or write this trailer
|
6966
|
+
#
|
6967
|
+
# Proc inputs:
|
6968
|
+
# 0) ExifTool ref, with FileEnd set, and TrailerStart possibly set (start of all trailers)
|
6969
|
+
# 1) DirInfo with the following elements:
|
6970
|
+
# DirName - name of this trailer
|
6971
|
+
# RAF - RAF reference
|
6972
|
+
# Offset - positive offset from end of this trailer to the end of file
|
6973
|
+
# OutFile - (write mode) scalar reference for output buffer consisting of an empty string
|
6974
|
+
# Trailer - flag set so proc knows we are processing a trailer (if it cares)
|
6975
|
+
# Fixup - optional fixup for pointers in trailer
|
6976
|
+
# ScanForTrailer - set if we should now scan for the trailer start. For JPEG
|
6977
|
+
# images the ExifTool TrailerStart member will also be set, but for TIFF
|
6978
|
+
# images TrailerStart will only be set when writing, so the proc should
|
6979
|
+
# scan from the current file position when reading in a TIFF image.
|
6980
|
+
# Proc returns in read mode (OutFile not set):
|
6981
|
+
# 1 = success
|
6982
|
+
# 0 = error processing trailer (no warning will be issued and remaining trailers will be ignored)
|
6983
|
+
# -1 = must scan from TrailerStart since length can not be determined
|
6984
|
+
# (in which case this routine will be called again later when TrailerStart is known)
|
6985
|
+
# Proc returns in write mode:
|
6986
|
+
# 1 = success (and proc updates OutFile with the trailer to write, or empty string to delete)
|
6987
|
+
# 0 = error processing trailer (will issue minor error)
|
6988
|
+
# -1 = caller to copy or delete the trailer as-is (from TrailerStart if DataPos isn't set)
|
6989
|
+
# - TrailerStart will always be set in write mode
|
6990
|
+
# - the write routine will not be called if all trailers are being deleted
|
6991
|
+
# Proc sets the following elements of $dirInfo in both read and write mode:
|
6992
|
+
# DataPos - file position for start of this trailer
|
6993
|
+
# DirLen - length of this trailer (subsequent trailers are not processed if this is not set)
|
6994
|
+
# Fixup - for any pointers in the trailer that need adjusting
|
6995
|
+
#
|
6961
6996
|
no strict 'refs';
|
6962
6997
|
my $result = &$proc($self, $dirInfo);
|
6963
6998
|
use strict 'refs';
|
@@ -6965,8 +7000,27 @@ sub ProcessTrailers($$)
|
|
6965
7000
|
# restore PATH (pop last 2 items)
|
6966
7001
|
splice @$path, -2;
|
6967
7002
|
|
6968
|
-
|
7003
|
+
my ($dataPos, $dirLen) = @$dirInfo{'DataPos','DirLen'};
|
6969
7004
|
if ($outfile) {
|
7005
|
+
if ($result < 0) {
|
7006
|
+
# copy or delete the trailer ourself
|
7007
|
+
$result = 1;
|
7008
|
+
if ($$self{TrailerStart}) {
|
7009
|
+
$dataPos or $dataPos = $$self{TrailerStart};
|
7010
|
+
$dirLen or $dirLen = $$self{FileEnd} - $offset - $dataPos;
|
7011
|
+
}
|
7012
|
+
if ($$self{DEL_GROUP}{Trailer} or $$self{DEL_GROUP}{$dirName}) {
|
7013
|
+
my $bytes = $dirLen ? " ($dirLen bytes)" : '';
|
7014
|
+
$self->VPrint(0, "Deleting $dirName trailer$bytes\n");
|
7015
|
+
++$$self{CHANGED};
|
7016
|
+
} elsif ($dataPos and $dirLen) {
|
7017
|
+
$self->VPrint(0, "Copying $dirName trailer ($dirLen bytes)\n");
|
7018
|
+
$result = 0 unless $raf->Seek($dataPos) and
|
7019
|
+
$raf->Read(${$$dirInfo{OutFile}}, $dirLen) == $dirLen;
|
7020
|
+
} else {
|
7021
|
+
$result = 0;
|
7022
|
+
}
|
7023
|
+
}
|
6970
7024
|
if ($result > 0) {
|
6971
7025
|
if ($outBuff) {
|
6972
7026
|
# write trailers to OutFile in original order
|
@@ -6994,15 +7048,20 @@ sub ProcessTrailers($$)
|
|
6994
7048
|
$success = 0;
|
6995
7049
|
last;
|
6996
7050
|
}
|
6997
|
-
last unless $result > 0 and
|
7051
|
+
last unless $result > 0 and $dirLen;
|
7052
|
+
$offset += $dirLen;
|
7053
|
+
last if $dataPos and $$self{TrailerStart} and $dataPos <= $$self{TrailerStart};
|
6998
7054
|
# look for next trailer
|
6999
|
-
$
|
7000
|
-
|
7055
|
+
my $nextTrail = IdentifyTrailer($raf, $offset);
|
7056
|
+
# process Google trailer after all others if necessary and not done already
|
7057
|
+
unless ($nextTrail) {
|
7058
|
+
last unless $$self{ProcessGoogleTrailer};
|
7059
|
+
$nextTrail = { DirName => 'Google', RAF => $raf };
|
7060
|
+
}
|
7001
7061
|
$dirName = $$dirInfo{DirName} = $$nextTrail{DirName};
|
7002
|
-
$raf->Seek($pos, 0);
|
7003
7062
|
}
|
7004
7063
|
SetByteOrder($byteOrder); # restore original byte order
|
7005
|
-
$raf->Seek($pos
|
7064
|
+
$raf->Seek($pos); # restore original file position
|
7006
7065
|
$$dirInfo{OutFile} = $outfile; # restore original outfile
|
7007
7066
|
$$dirInfo{Offset} = $offset; # return offset from EOF to start of first trailer
|
7008
7067
|
$$dirInfo{Fixup} = $fixup; # return fixup information
|
@@ -7399,12 +7458,61 @@ sub ProcessJPEG($$;$)
|
|
7399
7458
|
$foundSOS = 1;
|
7400
7459
|
# all done with meta information unless we have a trailer
|
7401
7460
|
$verbose and print $out "${indent}JPEG SOS\n";
|
7461
|
+
# process extended XMP now if it existed
|
7462
|
+
# (must do this before trailers because XMP is required to process Google trailer)
|
7463
|
+
if (%extendedXMP) {
|
7464
|
+
my $guid;
|
7465
|
+
# GUID indicated by the last main XMP segment
|
7466
|
+
my $goodGuid = $$self{VALUE}{HasExtendedXMP} || '';
|
7467
|
+
# GUID of the extended XMP that we will process ('2' for all)
|
7468
|
+
my $readGuid = $$options{ExtendedXMP} || 0;
|
7469
|
+
$readGuid = $goodGuid if $readGuid eq '1';
|
7470
|
+
foreach $guid (sort keys %extendedXMP) {
|
7471
|
+
next unless length $guid == 32; # ignore other (internal) keys
|
7472
|
+
my $extXMP = $extendedXMP{$guid};
|
7473
|
+
my ($off, @offsets, $warn);
|
7474
|
+
# make sure we have all chunks, and create a list of sorted offsets
|
7475
|
+
for ($off=0; $off<$$extXMP{Size}; ) {
|
7476
|
+
last unless defined $$extXMP{$off};
|
7477
|
+
push @offsets, $off;
|
7478
|
+
$off += length $$extXMP{$off};
|
7479
|
+
}
|
7480
|
+
unless ($off == $$extXMP{Size}) {
|
7481
|
+
$self->Warn("Incomplete extended XMP (GUID $guid)");
|
7482
|
+
next;
|
7483
|
+
}
|
7484
|
+
if ($guid eq $readGuid or $readGuid eq '2') {
|
7485
|
+
$warn = 'Reading non-' if $guid ne $goodGuid;
|
7486
|
+
my $buff = '';
|
7487
|
+
# assemble XMP all together
|
7488
|
+
$buff .= $$extXMP{$_} foreach @offsets;
|
7489
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
|
7490
|
+
my %dirInfo = (
|
7491
|
+
DataPt => \$buff,
|
7492
|
+
Parent => 'APP1',
|
7493
|
+
IsExtended => 1,
|
7494
|
+
);
|
7495
|
+
$$path[$pn] = 'APP1';
|
7496
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
7497
|
+
pop @$path;
|
7498
|
+
} else {
|
7499
|
+
$warn = 'Ignored ';
|
7500
|
+
$warn .= 'non-' if $guid ne $goodGuid;
|
7501
|
+
}
|
7502
|
+
$self->Warn("${warn}standard extended XMP (GUID $guid)") if $warn;
|
7503
|
+
delete $extendedXMP{$guid};
|
7504
|
+
}
|
7505
|
+
}
|
7402
7506
|
unless ($fast) {
|
7403
7507
|
$trailInfo = IdentifyTrailer($raf);
|
7508
|
+
# check for Google trailer information if specific XMP tags exist
|
7509
|
+
if (not $trailInfo and $$self{ProcessGoogleTrailer}) {
|
7510
|
+
$trailInfo = { DirName => 'Google', RAF => $raf };
|
7511
|
+
}
|
7404
7512
|
# process trailer now unless we are doing verbose dump
|
7405
7513
|
if ($trailInfo and $verbose < 3 and not $htmlDump) {
|
7406
7514
|
# process trailers (keep trailInfo to finish processing later
|
7407
|
-
# only if we can't finish without scanning from
|
7515
|
+
# only if we can't finish without scanning from JPEG EOF)
|
7408
7516
|
$self->ProcessTrailers($trailInfo) and undef $trailInfo;
|
7409
7517
|
}
|
7410
7518
|
if ($wantTrailer and $$self{PreviewImageStart}) {
|
@@ -7577,7 +7685,7 @@ sub ProcessJPEG($$;$)
|
|
7577
7685
|
my $n = length($1) + 1;
|
7578
7686
|
$self->HDump($segPos+pos($$dataPt)-$n, $n, '[Vivo HiddenData]', undef, 0x08);
|
7579
7687
|
}
|
7580
|
-
my $tbl = GetTagTable('Image::ExifTool::Vivo
|
7688
|
+
my $tbl = GetTagTable('Image::ExifTool::Trailer::Vivo');
|
7581
7689
|
$self->HandleTag($tbl, HiddenData => $1);
|
7582
7690
|
}
|
7583
7691
|
# avoid looking for preview unless necessary because it really slows
|
@@ -8237,50 +8345,6 @@ sub ProcessJPEG($$;$)
|
|
8237
8345
|
}
|
8238
8346
|
undef $$segDataPt;
|
8239
8347
|
}
|
8240
|
-
# process extended XMP now if it existed
|
8241
|
-
if (%extendedXMP) {
|
8242
|
-
my $guid;
|
8243
|
-
# GUID indicated by the last main XMP segment
|
8244
|
-
my $goodGuid = $$self{VALUE}{HasExtendedXMP} || '';
|
8245
|
-
# GUID of the extended XMP that we will process ('2' for all)
|
8246
|
-
my $readGuid = $$options{ExtendedXMP} || 0;
|
8247
|
-
$readGuid = $goodGuid if $readGuid eq '1';
|
8248
|
-
foreach $guid (sort keys %extendedXMP) {
|
8249
|
-
next unless length $guid == 32; # ignore other (internal) keys
|
8250
|
-
my $extXMP = $extendedXMP{$guid};
|
8251
|
-
my ($off, @offsets, $warn);
|
8252
|
-
# make sure we have all chunks, and create a list of sorted offsets
|
8253
|
-
for ($off=0; $off<$$extXMP{Size}; ) {
|
8254
|
-
last unless defined $$extXMP{$off};
|
8255
|
-
push @offsets, $off;
|
8256
|
-
$off += length $$extXMP{$off};
|
8257
|
-
}
|
8258
|
-
unless ($off == $$extXMP{Size}) {
|
8259
|
-
$self->Warn("Incomplete extended XMP (GUID $guid)");
|
8260
|
-
next;
|
8261
|
-
}
|
8262
|
-
if ($guid eq $readGuid or $readGuid eq '2') {
|
8263
|
-
$warn = 'Reading non-' if $guid ne $goodGuid;
|
8264
|
-
my $buff = '';
|
8265
|
-
# assemble XMP all together
|
8266
|
-
$buff .= $$extXMP{$_} foreach @offsets;
|
8267
|
-
my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
|
8268
|
-
my %dirInfo = (
|
8269
|
-
DataPt => \$buff,
|
8270
|
-
Parent => 'APP1',
|
8271
|
-
IsExtended => 1,
|
8272
|
-
);
|
8273
|
-
$$path[$pn] = 'APP1';
|
8274
|
-
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
8275
|
-
pop @$path;
|
8276
|
-
} else {
|
8277
|
-
$warn = 'Ignored ';
|
8278
|
-
$warn .= 'non-' if $guid ne $goodGuid;
|
8279
|
-
}
|
8280
|
-
$self->Warn("${warn}standard extended XMP (GUID $guid)") if $warn;
|
8281
|
-
delete $extendedXMP{$guid};
|
8282
|
-
}
|
8283
|
-
}
|
8284
8348
|
# print verbose hash message if necessary
|
8285
8349
|
print $out "${indent}(ImageDataHash: $hashsize bytes of JPEG image data)\n" if $hashsize and $verbose;
|
8286
8350
|
# calculate JPEGDigest if requested
|
@@ -8557,7 +8621,9 @@ sub DoProcessTIFF($$;$)
|
|
8557
8621
|
if ($raf) {
|
8558
8622
|
my $trailInfo = IdentifyTrailer($raf);
|
8559
8623
|
if ($trailInfo) {
|
8560
|
-
|
8624
|
+
# scan to find AFCP if necessary (Note: we are scanning
|
8625
|
+
# from a random file position in the TIFF)
|
8626
|
+
$$trailInfo{ScanForTrailer} = 1;
|
8561
8627
|
$self->ProcessTrailers($trailInfo);
|
8562
8628
|
}
|
8563
8629
|
# dump any other known trailer (eg. A100 RAW Data)
|
@@ -8663,6 +8729,7 @@ sub DoProcessTIFF($$;$)
|
|
8663
8729
|
my $tbuf = '';
|
8664
8730
|
$$trailInfo{OutFile} = \$tbuf; # rewrite trailer(s)
|
8665
8731
|
$$trailInfo{ScanForTrailer} = 1; # scan for AFCP if necessary
|
8732
|
+
$$self{TrailerStart} = $tiffEnd;
|
8666
8733
|
# rewrite all trailers to buffer
|
8667
8734
|
unless ($self->ProcessTrailers($trailInfo)) {
|
8668
8735
|
undef $trailInfo;
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -2551,61 +2551,62 @@ Here is a complete list of groups for each of these families:
|
|
2551
2551
|
|
2552
2552
|
AAC, AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP2,
|
2553
2553
|
APP3, APP4, APP5, APP6, APP7, APP8, APP9, ASF, Audible, Canon, CanonVRD,
|
2554
|
-
Composite, DICOM,
|
2555
|
-
|
2556
|
-
GoPro, H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG,
|
2557
|
-
JUMBF,
|
2558
|
-
|
2559
|
-
|
2560
|
-
|
2561
|
-
|
2562
|
-
|
2554
|
+
Composite, DICOM, DjVu, DNG, Ducky, DV, EXE, EXIF, ExifTool, File, FITS,
|
2555
|
+
FLAC, Flash, FlashPix, FLIR, Font, FotoStation, GeoTiff, GIF, GIMP, GM,
|
2556
|
+
GoPro, H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG, Jpeg2000,
|
2557
|
+
JSON, JUMBF, Leaf, LNK, Lytro, M2TS, MakerNotes, Matroska, Meta, MIE, MIFF,
|
2558
|
+
MISB, MNG, MOI, MPC, MPEG, MPF, MXF, Ogg, OpenEXR, Opus, Palm, PanasonicRaw,
|
2559
|
+
Parrot, PDF, PhotoCD, PhotoMechanic, Photoshop, PICT, PLIST, PNG,
|
2560
|
+
PostScript, PrintIM, Protobuf, PSP, QuickTime, Radiance, RAF, Rawzor, Real,
|
2561
|
+
Red, RIFF, RSRC, RTF, SigmaRaw, Sony, Stim, SVG, Theora, Torrent, Trailer,
|
2562
|
+
VCard, Vorbis, WTV, XML, XMP, ZIP
|
2563
2563
|
|
2564
2564
|
=item Family 1 (Specific Location):
|
2565
2565
|
|
2566
|
-
AAC, AC3,
|
2567
|
-
|
2568
|
-
|
2569
|
-
|
2570
|
-
|
2571
|
-
FotoStation, FujiFilm, FujiIFD,
|
2572
|
-
|
2573
|
-
HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv,
|
2574
|
-
ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view,
|
2575
|
-
ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4,
|
2576
|
-
|
2577
|
-
JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC,
|
2578
|
-
|
2579
|
-
LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC,
|
2580
|
-
|
2581
|
-
|
2582
|
-
MIE-
|
2583
|
-
|
2584
|
-
|
2585
|
-
|
2586
|
-
|
2587
|
-
|
2588
|
-
Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo,
|
2589
|
-
PostScript, PreviewIFD, PrintIM, ProfileIFD,
|
2590
|
-
|
2591
|
-
Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red,
|
2592
|
-
|
2593
|
-
|
2594
|
-
Track#, Track#ItemList, Track#Keys,
|
2595
|
-
|
2596
|
-
|
2597
|
-
XMP-
|
2598
|
-
XMP-
|
2599
|
-
XMP-
|
2600
|
-
XMP-
|
2601
|
-
XMP-
|
2602
|
-
XMP-
|
2603
|
-
XMP-
|
2604
|
-
XMP-mediapro, XMP-microsoft, XMP-
|
2605
|
-
XMP-
|
2606
|
-
XMP-
|
2607
|
-
XMP-
|
2608
|
-
XMP-
|
2566
|
+
AAC, AC3, Adobe, AdobeCM, AdobeDNG, AFCP, AIFF, APE, APP10, APP2, Apple,
|
2567
|
+
ASF, Audible, AudioItemList, AudioKeys, AudioUserData, AVI1, CameraIFD,
|
2568
|
+
Canon, CanonCustom, CanonDR4, CanonRaw, CanonVRD, Casio, CBOR, Chapter#,
|
2569
|
+
CIFF, Composite, DICOM, DJI, DjVu, DjVu-Meta, DNG, Ducky, DV, EPPIM, EXE,
|
2570
|
+
EXIF, ExifIFD, ExifTool, File, FITS, FLAC, Flash, FlashPix, FLIR, Font,
|
2571
|
+
FotoStation, FujiFilm, FujiIFD, Garmin, GE, GeoTiff, GIF, GIMP,
|
2572
|
+
GlobParamIFD, GM, Google, GoPro, GPS, GraphConv, GSpherical, H264, HP, HTC,
|
2573
|
+
HTML, HTML-dc, HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv,
|
2574
|
+
ICC-chrm, ICC-cicp, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view,
|
2575
|
+
ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4,
|
2576
|
+
IFD0, IFD1, InfiRay, Insta360, InteropIFD, IPTC, IPTC#, ISO, ITC, ItemList,
|
2577
|
+
iTunes, JFIF, JFXX, JPEG, JPEG-HDR, Jpeg2000, JPS, JSON, JUMBF, JVC,
|
2578
|
+
KDC_IFD, Keys, Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD,
|
2579
|
+
KyoceraRaw, Leaf, LeafSubIFD, Leica, LNK, Lyrics3, Lytro, M-RAW, M2TS, MAC,
|
2580
|
+
MacOS, MakerNotes, MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD,
|
2581
|
+
Microsoft, MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender,
|
2582
|
+
MIE-Flash, MIE-Geo, MIE-GPS, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes,
|
2583
|
+
MIE-Meta, MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-Unknown, MIE-UTM,
|
2584
|
+
MIE-Video, MIFF, Minolta, MinoltaRaw, MISB, MNG, MOBI, MOI, Motorola, MPC,
|
2585
|
+
MPEG, MPF0, MPImage, MS-DOC, MXF, Nextbase, Nikon, NikonCapture,
|
2586
|
+
NikonCustom, NikonScan, NikonSettings, NineEdits, Nintendo, NITF, Ocad, Ogg,
|
2587
|
+
Olympus, OnePlus, OpenEXR, Opus, Palm, Panasonic, PanasonicRaw, Parrot, PDF,
|
2588
|
+
Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PICT, PictureInfo, PNG,
|
2589
|
+
PNG-cICP, PNG-pHYs, PostScript, PreviewIFD, PrintIM, ProfileIFD, PSP,
|
2590
|
+
Qualcomm, QuickTime, Radiance, RAF, RAF2, Rawzor, Real, Real-CONT,
|
2591
|
+
Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red,
|
2592
|
+
Ricoh, RIFF, RMETA, RSRC, RTF, Samsung, Sanyo, Scalado, SEAL, Sigma,
|
2593
|
+
SigmaRaw, Sony, SonyIDC, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, Stim,
|
2594
|
+
SubIFD, SVG, System, Theora, Torrent, Track#, Track#ItemList, Track#Keys,
|
2595
|
+
Track#UserData, UserData, VCalendar, VCard, Version0, VideoItemList,
|
2596
|
+
VideoKeys, VideoUserData, Vivo, VNote, Vorbis, WTV, XML, XMP, XMP-aas,
|
2597
|
+
XMP-acdsee, XMP-acdsee-rs, XMP-album, XMP-apdi, XMP-apple-fi, XMP-ast,
|
2598
|
+
XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs, XMP-dc,
|
2599
|
+
XMP-Device, XMP-dex, XMP-DICOM, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et,
|
2600
|
+
XMP-exif, XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv,
|
2601
|
+
XMP-GAudio, XMP-GCamera, XMP-GContainer, XMP-GCreations, XMP-GDepth,
|
2602
|
+
XMP-getty, XMP-GFocus, XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-hdr,
|
2603
|
+
XMP-HDRGainMap, XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-LImage,
|
2604
|
+
XMP-lr, XMP-mediapro, XMP-microsoft, XMP-MP, XMP-MP1, XMP-mwg-coll,
|
2605
|
+
XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama, XMP-pdf, XMP-pdfx,
|
2606
|
+
XMP-photomech, XMP-photoshop, XMP-PixelLive, XMP-plus, XMP-pmi, XMP-prism,
|
2607
|
+
XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-seal, XMP-swf, XMP-tiff,
|
2608
|
+
XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
|
2609
|
+
XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP
|
2609
2610
|
|
2610
2611
|
=item Family 2 (Category):
|
2611
2612
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 13.
|
4
|
+
version: 13.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-01-
|
12
|
+
date: 2025-01-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|
@@ -288,10 +288,10 @@ files:
|
|
288
288
|
- bin/lib/Image/ExifTool/Text.pm
|
289
289
|
- bin/lib/Image/ExifTool/Theora.pm
|
290
290
|
- bin/lib/Image/ExifTool/Torrent.pm
|
291
|
+
- bin/lib/Image/ExifTool/Trailer.pm
|
291
292
|
- bin/lib/Image/ExifTool/Unknown.pm
|
292
293
|
- bin/lib/Image/ExifTool/VCard.pm
|
293
294
|
- bin/lib/Image/ExifTool/Validate.pm
|
294
|
-
- bin/lib/Image/ExifTool/Vivo.pm
|
295
295
|
- bin/lib/Image/ExifTool/Vorbis.pm
|
296
296
|
- bin/lib/Image/ExifTool/WPG.pm
|
297
297
|
- bin/lib/Image/ExifTool/WTV.pm
|
@@ -1,124 +0,0 @@
|
|
1
|
-
#------------------------------------------------------------------------------
|
2
|
-
# File: Vivo.pm
|
3
|
-
#
|
4
|
-
# Description: Read trailer written by Vivo phones
|
5
|
-
#
|
6
|
-
# Revisions: 2025-01-13 - P. Harvey Created
|
7
|
-
#------------------------------------------------------------------------------
|
8
|
-
|
9
|
-
package Image::ExifTool::Vivo;
|
10
|
-
|
11
|
-
use strict;
|
12
|
-
use vars qw($VERSION);
|
13
|
-
use Image::ExifTool qw(:DataAccess :Utils);
|
14
|
-
use Image::ExifTool::XMP;
|
15
|
-
|
16
|
-
$VERSION = '1.00';
|
17
|
-
|
18
|
-
%Image::ExifTool::Vivo::Main = (
|
19
|
-
GROUPS => { 0 => 'Trailer', 1 => 'Vivo', 2 => 'Image' },
|
20
|
-
VARS => { NO_ID => 1 },
|
21
|
-
NOTES => 'Proprietary information written by some Vivo phones.',
|
22
|
-
# (don't know for sure what type of image this is, but it is in JPEG format)
|
23
|
-
HDRImage => {
|
24
|
-
Notes => 'highlights of HDR image',
|
25
|
-
Groups => { 2 => 'Preview' },
|
26
|
-
Binary => 1,
|
27
|
-
},
|
28
|
-
JSONInfo => { },
|
29
|
-
HiddenData => {
|
30
|
-
Notes => 'hidden in EXIF, not in trailer. This data is lost if the file is edited',
|
31
|
-
Groups => { 0 => 'EXIF' },
|
32
|
-
},
|
33
|
-
);
|
34
|
-
|
35
|
-
#------------------------------------------------------------------------------
|
36
|
-
# Process Vivo trailer
|
37
|
-
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
38
|
-
# Returns: 1 on success, -1 if we must scan for the start of the trailer
|
39
|
-
# - takes Offset as positive offset from end of trailer to end of file,
|
40
|
-
# and returns DataPos and DirLen, and updates OutFile when writing
|
41
|
-
sub ProcessVivo($$)
|
42
|
-
{
|
43
|
-
my ($et, $dirInfo) = @_;
|
44
|
-
my $raf = $$dirInfo{RAF};
|
45
|
-
my $buff;
|
46
|
-
|
47
|
-
# return now unless we are at a position to scan for the trailer
|
48
|
-
# (must scan because the trailer footer doesn't indicate the trailer length)
|
49
|
-
return -1 unless $$dirInfo{ScanForTrailer};
|
50
|
-
|
51
|
-
my $pos = $raf->Tell();
|
52
|
-
$raf->Seek(0, 2) or return 0;
|
53
|
-
my $len = $raf->Tell() - $pos - $$dirInfo{Offset};
|
54
|
-
$raf->Seek($pos, 0) or return 0;
|
55
|
-
return 0 unless $len > 0 and $len < 1e7 and $raf->Read($buff, $len) == $len and
|
56
|
-
$buff =~ /\xff{4}\x1b\*9HWfu\x84\x93\xa2\xb1$/ and # validate footer
|
57
|
-
$buff =~ /(streamdata|vivo\{")/g; # find start
|
58
|
-
my $start = pos($buff) - length($1);
|
59
|
-
if ($start) {
|
60
|
-
$pos += $start;
|
61
|
-
$len -= $start;
|
62
|
-
$buff = substr($buff, $start);
|
63
|
-
}
|
64
|
-
# set trailer position and length
|
65
|
-
@$dirInfo{'DataPos','DirLen'} = ($pos, $len);
|
66
|
-
|
67
|
-
if ($$dirInfo{OutFile}) {
|
68
|
-
if ($$et{DEL_GROUP}{Vivo}) {
|
69
|
-
$et->VPrint(0, " Deleting Vivo trailer ($len bytes)\n");
|
70
|
-
++$$et{CHANGED};
|
71
|
-
} else {
|
72
|
-
$et->VPrint(0, " Copying Vivo trailer ($len bytes)\n");
|
73
|
-
Write($$dirInfo{OutFile}, $buff);
|
74
|
-
}
|
75
|
-
} else {
|
76
|
-
$et->DumpTrailer($dirInfo) if $$et{OPTIONS}{Verbose} or $$et{HTML_DUMP};
|
77
|
-
my $tbl = GetTagTable('Image::ExifTool::Vivo::Main');
|
78
|
-
pos($buff) = 0; # rewind search to start of buffer
|
79
|
-
if ($buff =~ /^streamdata\xff\xd8\xff/ and $buff =~ /\xff\xd9stream(info|coun)/g) {
|
80
|
-
$et->HandleTag($tbl, HDRImage => substr($buff, 10, pos($buff)-20));
|
81
|
-
}
|
82
|
-
# continue looking for Vivo JSON data
|
83
|
-
if ($buff =~ /vivo\{"/g) {
|
84
|
-
my $jsonStart = pos($buff) - 2;
|
85
|
-
if ($buff =~ /\}\0/g) {
|
86
|
-
my $jsonLen = pos($buff) - 1 - $jsonStart;
|
87
|
-
$et->HandleTag($tbl, JSONInfo => substr($buff, $jsonStart, $jsonLen));
|
88
|
-
}
|
89
|
-
}
|
90
|
-
}
|
91
|
-
return 1;
|
92
|
-
}
|
93
|
-
|
94
|
-
1; # end
|
95
|
-
|
96
|
-
__END__
|
97
|
-
|
98
|
-
=head1 NAME
|
99
|
-
|
100
|
-
Image::ExifTool::Vivo - Read trailer written by Vivo phones
|
101
|
-
|
102
|
-
=head1 SYNOPSIS
|
103
|
-
|
104
|
-
This module is used by Image::ExifTool
|
105
|
-
|
106
|
-
=head1 DESCRIPTION
|
107
|
-
|
108
|
-
This module contains definitions required by Image::ExifTool to read
|
109
|
-
metadata the trailer written by some Vivo phones.
|
110
|
-
|
111
|
-
=head1 AUTHOR
|
112
|
-
|
113
|
-
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
114
|
-
|
115
|
-
This library is free software; you can redistribute it and/or modify it
|
116
|
-
under the same terms as Perl itself.
|
117
|
-
|
118
|
-
=head1 SEE ALSO
|
119
|
-
|
120
|
-
L<Image::ExifTool::TagNames/Vivo Tags>,
|
121
|
-
L<Image::ExifTool(3pm)|Image::ExifTool>
|
122
|
-
|
123
|
-
=cut
|
124
|
-
|