exiftool_vendored 13.16.0 → 13.18.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.
@@ -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.16';
32
+ $VERSION = '13.18';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -6868,10 +6868,10 @@ sub HDump($$$$;$$$)
6868
6868
  # Returns: Trailer info hash (with RAF and DirName set),
6869
6869
  # or undef if no recognized trailer was found
6870
6870
  # Notes: leaves file position unchanged
6871
- sub IdentifyTrailer($;$)
6871
+ sub IdentifyTrailer($$;$)
6872
6872
  {
6873
- my $raf = shift;
6874
- my $offset = shift || 0;
6873
+ my ($self, $raf, $offset) = @_;
6874
+ $offset or $offset = 0;
6875
6875
  my $pos = $raf->Tell();
6876
6876
  my ($buff, $type, $len);
6877
6877
  while ($raf->Seek(-$offset, 2) and ($len = $raf->Tell()) > 0) {
@@ -6898,6 +6898,11 @@ 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';
6903
+ } elsif ($$self{ProcessGoogleTrailer}) {
6904
+ # check for Google trailer information if specific XMP tags exist
6905
+ $type = 'Google';
6901
6906
  }
6902
6907
  last;
6903
6908
  }
@@ -6929,18 +6934,24 @@ sub ProcessTrailers($$)
6929
6934
  my $success = 1;
6930
6935
  my $path = $$self{PATH};
6931
6936
 
6937
+ # get position of end of file
6938
+ $raf->Seek(0,2);
6939
+ $$self{FileEnd} = $raf->Tell();
6940
+
6932
6941
  for (;;) { # loop through all trailers
6942
+ $raf->Seek($pos);
6933
6943
  my ($proc, $outBuff);
6934
- if ($dirName eq 'Insta360') {
6935
- require 'Image/ExifTool/QuickTimeStream.pl';
6936
- $proc = 'Image::ExifTool::QuickTime::ProcessInsta360';
6937
- } elsif ($dirName eq 'NikonApp') {
6938
- require Image::ExifTool::Nikon;
6939
- $proc = 'Image::ExifTool::Nikon::ProcessNikonApp';
6940
- } else {
6941
- require "Image/ExifTool/$dirName.pm";
6942
- $proc = "Image::ExifTool::${dirName}::Process$dirName";
6943
- }
6944
+ # trailer-processing procs residing in modules of a different name
6945
+ my $module = {
6946
+ Insta360 => 'QuickTimeStream.pl',
6947
+ NikonApp => 'Nikon.pm',
6948
+ Vivo => 'Trailer.pm',
6949
+ OnePlus => 'Trailer.pm',
6950
+ Google => 'Trailer.pm',
6951
+ }->{$dirName} || "$dirName.pm";
6952
+ require "Image/ExifTool/$module";
6953
+ $module =~ s/(Stream)?\..*//; # remove extension and change QuickTimeStream to QuickTime
6954
+ $proc = "Image::ExifTool::${module}::Process$dirName";
6944
6955
  if ($outfile) {
6945
6956
  # write to local buffer so we can add trailer in proper order later
6946
6957
  $$outfile and $$dirInfo{OutFile} = \$outBuff, $outBuff = '';
@@ -6953,11 +6964,38 @@ sub ProcessTrailers($$)
6953
6964
  $$dirInfo{Trailer} = 1; # set Trailer flag in case proc cares
6954
6965
  # add trailer and DirName to SubDirectory PATH
6955
6966
  push @$path, 'Trailer', $dirName;
6956
-
6957
- # read or write this trailer
6958
- # (proc takes Offset as positive offset from end of trailer to end of file,
6959
- # and returns DataPos and DirLen, and Fixup if applicable, and updates
6960
- # OutFile when writing. Returns < 0 if we must scan for this trailer)
6967
+ #
6968
+ # Call proc to read or write this trailer
6969
+ #
6970
+ # Proc inputs:
6971
+ # 0) ExifTool ref, with FileEnd set, and TrailerStart possibly set (start of all trailers)
6972
+ # 1) DirInfo with the following elements:
6973
+ # DirName - name of this trailer
6974
+ # RAF - RAF reference
6975
+ # Offset - positive offset from end of this trailer to the end of file
6976
+ # OutFile - (write mode) scalar reference for output buffer consisting of an empty string
6977
+ # Trailer - flag set so proc knows we are processing a trailer (if it cares)
6978
+ # Fixup - optional fixup for pointers in trailer
6979
+ # ScanForTrailer - set if we should now scan for the trailer start. For JPEG
6980
+ # images the ExifTool TrailerStart member will also be set, but for TIFF
6981
+ # images TrailerStart will only be set when writing, so the proc should
6982
+ # scan from the current file position when reading in a TIFF image.
6983
+ # Proc returns in read mode (OutFile not set):
6984
+ # 1 = success
6985
+ # 0 = error processing trailer (no warning will be issued and remaining trailers will be ignored)
6986
+ # -1 = must scan from TrailerStart since length can not be determined
6987
+ # (in which case this routine will be called again later when TrailerStart is known)
6988
+ # Proc returns in write mode:
6989
+ # 1 = success (and proc updates OutFile with the trailer to write, or empty string to delete)
6990
+ # 0 = error processing trailer (will issue minor error)
6991
+ # -1 = caller to copy or delete the trailer as-is (from TrailerStart if DataPos isn't set)
6992
+ # - TrailerStart will always be set in write mode
6993
+ # - the write routine will not be called if all trailers are being deleted
6994
+ # Proc sets the following elements of $dirInfo in both read and write mode:
6995
+ # DataPos - file position for start of this trailer
6996
+ # DirLen - length of this trailer (subsequent trailers are not processed if this is not set)
6997
+ # Fixup - for any pointers in the trailer that need adjusting
6998
+ #
6961
6999
  no strict 'refs';
6962
7000
  my $result = &$proc($self, $dirInfo);
6963
7001
  use strict 'refs';
@@ -6965,8 +7003,27 @@ sub ProcessTrailers($$)
6965
7003
  # restore PATH (pop last 2 items)
6966
7004
  splice @$path, -2;
6967
7005
 
6968
- # check result
7006
+ my ($dataPos, $dirLen) = @$dirInfo{'DataPos','DirLen'};
6969
7007
  if ($outfile) {
7008
+ if ($result < 0) {
7009
+ # copy or delete the trailer ourself
7010
+ $result = 1;
7011
+ if ($$self{TrailerStart}) {
7012
+ $dataPos or $dataPos = $$self{TrailerStart};
7013
+ $dirLen or $dirLen = $$self{FileEnd} - $offset - $dataPos;
7014
+ }
7015
+ if ($$self{DEL_GROUP}{Trailer} or $$self{DEL_GROUP}{$dirName}) {
7016
+ my $bytes = $dirLen ? " ($dirLen bytes)" : '';
7017
+ $self->VPrint(0, "Deleting $dirName trailer$bytes\n");
7018
+ ++$$self{CHANGED};
7019
+ } elsif ($dataPos and $dirLen) {
7020
+ $self->VPrint(0, "Copying $dirName trailer ($dirLen bytes)\n");
7021
+ $result = 0 unless $raf->Seek($dataPos) and
7022
+ $raf->Read(${$$dirInfo{OutFile}}, $dirLen) == $dirLen;
7023
+ } else {
7024
+ $result = 0;
7025
+ }
7026
+ }
6970
7027
  if ($result > 0) {
6971
7028
  if ($outBuff) {
6972
7029
  # write trailers to OutFile in original order
@@ -6994,15 +7051,20 @@ sub ProcessTrailers($$)
6994
7051
  $success = 0;
6995
7052
  last;
6996
7053
  }
6997
- last unless $result > 0 and $$dirInfo{DirLen};
7054
+ last unless $result > 0 and $dirLen;
7055
+ $offset += $dirLen;
7056
+ last if $dataPos and $$self{TrailerStart} and $dataPos <= $$self{TrailerStart};
6998
7057
  # look for next trailer
6999
- $offset += $$dirInfo{DirLen};
7000
- my $nextTrail = IdentifyTrailer($raf, $offset) or last;
7058
+ my $nextTrail = $self->IdentifyTrailer($raf, $offset);
7059
+ # process Google trailer after all others if necessary and not done already
7060
+ unless ($nextTrail) {
7061
+ last unless $$self{ProcessGoogleTrailer};
7062
+ $nextTrail = { DirName => 'Google', RAF => $raf };
7063
+ }
7001
7064
  $dirName = $$dirInfo{DirName} = $$nextTrail{DirName};
7002
- $raf->Seek($pos, 0);
7003
7065
  }
7004
7066
  SetByteOrder($byteOrder); # restore original byte order
7005
- $raf->Seek($pos, 0); # restore original file position
7067
+ $raf->Seek($pos); # restore original file position
7006
7068
  $$dirInfo{OutFile} = $outfile; # restore original outfile
7007
7069
  $$dirInfo{Offset} = $offset; # return offset from EOF to start of first trailer
7008
7070
  $$dirInfo{Fixup} = $fixup; # return fixup information
@@ -7399,12 +7461,57 @@ sub ProcessJPEG($$;$)
7399
7461
  $foundSOS = 1;
7400
7462
  # all done with meta information unless we have a trailer
7401
7463
  $verbose and print $out "${indent}JPEG SOS\n";
7464
+ # process extended XMP now if it existed
7465
+ # (must do this before trailers because XMP is required to process Google trailer)
7466
+ if (%extendedXMP) {
7467
+ my $guid;
7468
+ # GUID indicated by the last main XMP segment
7469
+ my $goodGuid = $$self{VALUE}{HasExtendedXMP} || '';
7470
+ # GUID of the extended XMP that we will process ('2' for all)
7471
+ my $readGuid = $$options{ExtendedXMP} || 0;
7472
+ $readGuid = $goodGuid if $readGuid eq '1';
7473
+ foreach $guid (sort keys %extendedXMP) {
7474
+ next unless length $guid == 32; # ignore other (internal) keys
7475
+ my $extXMP = $extendedXMP{$guid};
7476
+ my ($off, @offsets, $warn);
7477
+ # make sure we have all chunks, and create a list of sorted offsets
7478
+ for ($off=0; $off<$$extXMP{Size}; ) {
7479
+ last unless defined $$extXMP{$off};
7480
+ push @offsets, $off;
7481
+ $off += length $$extXMP{$off};
7482
+ }
7483
+ unless ($off == $$extXMP{Size}) {
7484
+ $self->Warn("Incomplete extended XMP (GUID $guid)");
7485
+ next;
7486
+ }
7487
+ if ($guid eq $readGuid or $readGuid eq '2') {
7488
+ $warn = 'Reading non-' if $guid ne $goodGuid;
7489
+ my $buff = '';
7490
+ # assemble XMP all together
7491
+ $buff .= $$extXMP{$_} foreach @offsets;
7492
+ my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
7493
+ my %dirInfo = (
7494
+ DataPt => \$buff,
7495
+ Parent => 'APP1',
7496
+ IsExtended => 1,
7497
+ );
7498
+ $$path[$pn] = 'APP1';
7499
+ $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7500
+ pop @$path;
7501
+ } else {
7502
+ $warn = 'Ignored ';
7503
+ $warn .= 'non-' if $guid ne $goodGuid;
7504
+ }
7505
+ $self->Warn("${warn}standard extended XMP (GUID $guid)") if $warn;
7506
+ delete $extendedXMP{$guid};
7507
+ }
7508
+ }
7402
7509
  unless ($fast) {
7403
- $trailInfo = IdentifyTrailer($raf);
7510
+ $trailInfo = $self->IdentifyTrailer($raf);
7404
7511
  # process trailer now unless we are doing verbose dump
7405
7512
  if ($trailInfo and $verbose < 3 and not $htmlDump) {
7406
7513
  # process trailers (keep trailInfo to finish processing later
7407
- # only if we can't finish without scanning from end of file)
7514
+ # only if we can't finish without scanning from JPEG EOF)
7408
7515
  $self->ProcessTrailers($trailInfo) and undef $trailInfo;
7409
7516
  }
7410
7517
  if ($wantTrailer and $$self{PreviewImageStart}) {
@@ -7577,7 +7684,7 @@ sub ProcessJPEG($$;$)
7577
7684
  my $n = length($1) + 1;
7578
7685
  $self->HDump($segPos+pos($$dataPt)-$n, $n, '[Vivo HiddenData]', undef, 0x08);
7579
7686
  }
7580
- my $tbl = GetTagTable('Image::ExifTool::Vivo::Main');
7687
+ my $tbl = GetTagTable('Image::ExifTool::Trailer::Vivo');
7581
7688
  $self->HandleTag($tbl, HiddenData => $1);
7582
7689
  }
7583
7690
  # avoid looking for preview unless necessary because it really slows
@@ -8237,50 +8344,6 @@ sub ProcessJPEG($$;$)
8237
8344
  }
8238
8345
  undef $$segDataPt;
8239
8346
  }
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
8347
  # print verbose hash message if necessary
8285
8348
  print $out "${indent}(ImageDataHash: $hashsize bytes of JPEG image data)\n" if $hashsize and $verbose;
8286
8349
  # calculate JPEGDigest if requested
@@ -8555,9 +8618,11 @@ sub DoProcessTIFF($$;$)
8555
8618
  }
8556
8619
  # process information in recognized trailers
8557
8620
  if ($raf) {
8558
- my $trailInfo = IdentifyTrailer($raf);
8621
+ my $trailInfo = $self->IdentifyTrailer($raf);
8559
8622
  if ($trailInfo) {
8560
- $$trailInfo{ScanForTrailer} = 1; # scan to find AFCP if necessary
8623
+ # scan to find AFCP if necessary (Note: we are scanning
8624
+ # from a random file position in the TIFF)
8625
+ $$trailInfo{ScanForTrailer} = 1;
8561
8626
  $self->ProcessTrailers($trailInfo);
8562
8627
  }
8563
8628
  # dump any other known trailer (eg. A100 RAW Data)
@@ -8658,11 +8723,12 @@ sub DoProcessTIFF($$;$)
8658
8723
  for (;;) {
8659
8724
  last unless $extra > 12;
8660
8725
  $raf->Seek($tiffEnd); # seek back to end of image
8661
- $trailInfo = IdentifyTrailer($raf);
8726
+ $trailInfo = $self->IdentifyTrailer($raf);
8662
8727
  last unless $trailInfo;
8663
8728
  my $tbuf = '';
8664
8729
  $$trailInfo{OutFile} = \$tbuf; # rewrite trailer(s)
8665
8730
  $$trailInfo{ScanForTrailer} = 1; # scan for AFCP if necessary
8731
+ $$self{TrailerStart} = $tiffEnd;
8666
8732
  # rewrite all trailers to buffer
8667
8733
  unless ($self->ProcessTrailers($trailInfo)) {
8668
8734
  undef $trailInfo;
@@ -2569,44 +2569,44 @@ Canon, CanonCustom, CanonDR4, CanonRaw, CanonVRD, Casio, CBOR, Chapter#,
2569
2569
  CIFF, Composite, DICOM, DJI, DjVu, DjVu-Meta, DNG, Ducky, DV, EPPIM, EXE,
2570
2570
  EXIF, ExifIFD, ExifTool, File, FITS, FLAC, Flash, FlashPix, FLIR, Font,
2571
2571
  FotoStation, FujiFilm, FujiIFD, Garmin, GE, GeoTiff, GIF, GIMP,
2572
- GlobParamIFD, GM, GoPro, GPS, GraphConv, GSpherical, H264, HP, HTC, HTML,
2573
- HTML-dc, HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm,
2574
- ICC-cicp, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile,
2575
- ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1,
2576
- InfiRay, Insta360, InteropIFD, IPTC, IPTC#, ISO, ITC, ItemList, iTunes,
2577
- JFIF, JFXX, JPEG, JPEG-HDR, Jpeg2000, JPS, JSON, JUMBF, JVC, KDC_IFD, Keys,
2578
- Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, Leaf,
2579
- LeafSubIFD, Leica, LNK, Lyrics3, Lytro, M-RAW, M2TS, MAC, MacOS, MakerNotes,
2580
- MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, MIE-Audio,
2581
- MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-Geo, MIE-GPS,
2582
- MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient,
2583
- MIE-Preview, MIE-Thumbnail, MIE-Unknown, MIE-UTM, MIE-Video, MIFF, Minolta,
2584
- MinoltaRaw, MISB, MNG, MOBI, MOI, Motorola, MPC, MPEG, MPF0, MPImage,
2585
- MS-DOC, MXF, Nextbase, Nikon, NikonCapture, NikonCustom, NikonScan,
2586
- NikonSettings, NineEdits, Nintendo, NITF, Ocad, Ogg, Olympus, OpenEXR, Opus,
2587
- Palm, Panasonic, PanasonicRaw, Parrot, PDF, Pentax, PhaseOne, PhotoCD,
2588
- PhotoMechanic, Photoshop, PICT, PictureInfo, PNG, PNG-cICP, PNG-pHYs,
2589
- PostScript, PreviewIFD, PrintIM, ProfileIFD, PSP, Qualcomm, QuickTime,
2590
- Radiance, RAF, RAF2, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP,
2591
- Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, RIFF, RMETA,
2592
- RSRC, RTF, Samsung, Sanyo, Scalado, SEAL, Sigma, SigmaRaw, Sony, SonyIDC,
2593
- SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, Stim, SubIFD, SVG, System, Theora,
2594
- Torrent, Track#, Track#ItemList, Track#Keys, Track#UserData, UserData,
2595
- VCalendar, VCard, Version0, VideoItemList, VideoKeys, VideoUserData, Vivo,
2596
- VNote, Vorbis, WTV, XML, XMP, XMP-aas, XMP-acdsee, XMP-acdsee-rs, XMP-album,
2597
- XMP-apdi, XMP-apple-fi, XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd,
2598
- XMP-creatorAtom, XMP-crs, XMP-dc, XMP-Device, XMP-dex, XMP-DICOM,
2599
- XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif, XMP-exifEX,
2600
- XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-GAudio, XMP-GCamera,
2601
- XMP-GContainer, XMP-GCreations, XMP-GDepth, XMP-getty, XMP-GFocus,
2602
- XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-hdr, XMP-HDRGainMap, XMP-hdrgm,
2603
- XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-LImage, XMP-lr, XMP-mediapro,
2604
- XMP-microsoft, XMP-MP, XMP-MP1, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs,
2605
- XMP-nine, XMP-panorama, XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop,
2606
- XMP-PixelLive, XMP-plus, XMP-pmi, XMP-prism, XMP-prl, XMP-prm, XMP-pur,
2607
- XMP-rdf, XMP-sdc, XMP-seal, XMP-swf, XMP-tiff, XMP-x, XMP-xmp, XMP-xmpBJ,
2608
- XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote, XMP-xmpPLUS, XMP-xmpRights,
2609
- XMP-xmpTPg, ZIP
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
2610
2610
 
2611
2611
  =item Family 2 (Category):
2612
2612
 
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 13.16
3
+ Version: 13.18
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('13.16.0')
4
+ VERSION = Gem::Version.new('13.18.0')
5
5
  end
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.16.0
4
+ version: 13.18.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-25 00:00:00.000000000 Z
12
+ date: 2025-02-04 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
-