exiftool-vendored.pl 13.0.1 → 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.
- package/bin/Changes +269 -20
- package/bin/MANIFEST +10 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +3 -3
- package/bin/arg_files/exif2xmp.args +4 -0
- package/bin/arg_files/xmp2exif.args +2 -1
- package/bin/build_geolocation +1 -1
- package/bin/exiftool +356 -213
- package/bin/lib/File/RandomAccess.pm +1 -1
- package/bin/lib/File/RandomAccess.pod +2 -2
- package/bin/lib/Image/ExifTool/AAC.pm +1 -1
- package/bin/lib/Image/ExifTool/AES.pm +1 -1
- package/bin/lib/Image/ExifTool/AFCP.pm +6 -6
- package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- package/bin/lib/Image/ExifTool/APE.pm +2 -2
- package/bin/lib/Image/ExifTool/APP12.pm +1 -1
- package/bin/lib/Image/ExifTool/ASF.pm +2 -2
- package/bin/lib/Image/ExifTool/Apple.pm +11 -9
- package/bin/lib/Image/ExifTool/Audible.pm +1 -1
- package/bin/lib/Image/ExifTool/BMP.pm +1 -1
- package/bin/lib/Image/ExifTool/BPG.pm +1 -1
- package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +46 -26
- package/bin/lib/Image/ExifTool/CBOR.pm +5 -2
- package/bin/lib/Image/ExifTool/Canon.pm +68 -28
- package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
- package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- package/bin/lib/Image/ExifTool/Casio.pm +1 -1
- package/bin/lib/Image/ExifTool/Charset.pm +1 -1
- package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- package/bin/lib/Image/ExifTool/DJI.pm +196 -30
- package/bin/lib/Image/ExifTool/DNG.pm +1 -1
- package/bin/lib/Image/ExifTool/DPX.pm +1 -1
- package/bin/lib/Image/ExifTool/DV.pm +1 -1
- package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
- package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- package/bin/lib/Image/ExifTool/EXE.pm +138 -33
- package/bin/lib/Image/ExifTool/Exif.pm +29 -16
- package/bin/lib/Image/ExifTool/FITS.pm +3 -3
- package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- package/bin/lib/Image/ExifTool/FLIF.pm +3 -3
- package/bin/lib/Image/ExifTool/FLIR.pm +1 -1
- package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- package/bin/lib/Image/ExifTool/Flash.pm +1 -1
- package/bin/lib/Image/ExifTool/FlashPix.pm +17 -21
- package/bin/lib/Image/ExifTool/Font.pm +2 -2
- package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- package/bin/lib/Image/ExifTool/GE.pm +1 -1
- package/bin/lib/Image/ExifTool/GIF.pm +144 -93
- package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- package/bin/lib/Image/ExifTool/GM.pm +1 -1
- package/bin/lib/Image/ExifTool/GPS.pm +34 -30
- package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/lib/Image/ExifTool/Geolocation.pm +19 -9
- package/bin/lib/Image/ExifTool/Geotag.pm +46 -12
- package/bin/lib/Image/ExifTool/GoPro.pm +120 -8
- package/bin/lib/Image/ExifTool/H264.pm +1 -1
- package/bin/lib/Image/ExifTool/HP.pm +2 -2
- package/bin/lib/Image/ExifTool/HTML.pm +1 -1
- package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +81 -2
- package/bin/lib/Image/ExifTool/ICO.pm +1 -1
- package/bin/lib/Image/ExifTool/ID3.pm +8 -8
- package/bin/lib/Image/ExifTool/IPTC.pm +10 -7
- package/bin/lib/Image/ExifTool/ISO.pm +1 -1
- package/bin/lib/Image/ExifTool/ITC.pm +1 -1
- package/bin/lib/Image/ExifTool/Import.pm +5 -4
- package/bin/lib/Image/ExifTool/InDesign.pm +2 -2
- package/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
- package/bin/lib/Image/ExifTool/JPEG.pm +38 -5
- package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- package/bin/lib/Image/ExifTool/JSON.pm +1 -1
- package/bin/lib/Image/ExifTool/JVC.pm +1 -1
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +10 -9
- package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/LIF.pm +1 -1
- package/bin/lib/Image/ExifTool/LNK.pm +2 -2
- package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- package/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
- package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- package/bin/lib/Image/ExifTool/M2TS.pm +57 -18
- package/bin/lib/Image/ExifTool/MIE.pm +15 -6
- package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/MISB.pm +1 -1
- package/bin/lib/Image/ExifTool/MNG.pm +1 -1
- package/bin/lib/Image/ExifTool/MOI.pm +1 -1
- package/bin/lib/Image/ExifTool/MPC.pm +1 -1
- package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- package/bin/lib/Image/ExifTool/MPF.pm +1 -1
- package/bin/lib/Image/ExifTool/MRC.pm +1 -1
- package/bin/lib/Image/ExifTool/MWG.pm +1 -1
- package/bin/lib/Image/ExifTool/MXF.pm +3 -3
- package/bin/lib/Image/ExifTool/MacOS.pm +3 -2
- package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- package/bin/lib/Image/ExifTool/Matroska.pm +22 -6
- package/bin/lib/Image/ExifTool/Microsoft.pm +2 -2
- package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +457 -103
- package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- package/bin/lib/Image/ExifTool/NikonCustom.pm +6 -6
- package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- package/bin/lib/Image/ExifTool/OOXML.pm +8 -8
- package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +1 -1
- package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
- package/bin/lib/Image/ExifTool/Opus.pm +1 -1
- package/bin/lib/Image/ExifTool/Other.pm +1 -1
- package/bin/lib/Image/ExifTool/PCX.pm +1 -1
- package/bin/lib/Image/ExifTool/PDF.pm +49 -18
- package/bin/lib/Image/ExifTool/PGF.pm +1 -1
- package/bin/lib/Image/ExifTool/PICT.pm +1 -1
- package/bin/lib/Image/ExifTool/PLIST.pm +4 -4
- package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- package/bin/lib/Image/ExifTool/PNG.pm +20 -8
- package/bin/lib/Image/ExifTool/PPM.pm +12 -3
- package/bin/lib/Image/ExifTool/PSP.pm +1 -1
- package/bin/lib/Image/ExifTool/Palm.pm +1 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +27 -3
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/lib/Image/ExifTool/PhaseOne.pm +4 -4
- package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- package/bin/lib/Image/ExifTool/Photoshop.pm +65 -4
- package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- package/bin/lib/Image/ExifTool/Protobuf.pm +270 -0
- package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- package/bin/lib/Image/ExifTool/QuickTime.pm +327 -88
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +199 -195
- package/bin/lib/Image/ExifTool/README +12 -2
- package/bin/lib/Image/ExifTool/RIFF.pm +21 -6
- package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- package/bin/lib/Image/ExifTool/RTF.pm +2 -2
- package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- package/bin/lib/Image/ExifTool/Real.pm +1 -1
- package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- package/bin/lib/Image/ExifTool/Red.pm +1 -1
- package/bin/lib/Image/ExifTool/Ricoh.pm +4 -4
- package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
- package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- package/bin/lib/Image/ExifTool/Shift.pl +1 -1
- package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Sony.pm +6 -5
- package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- package/bin/lib/Image/ExifTool/Stim.pm +1 -1
- package/bin/lib/Image/ExifTool/TagInfoXML.pm +6 -5
- package/bin/lib/Image/ExifTool/TagLookup.pm +7028 -6968
- package/bin/lib/Image/ExifTool/TagNames.pod +12079 -11630
- package/bin/lib/Image/ExifTool/Text.pm +4 -3
- package/bin/lib/Image/ExifTool/Theora.pm +1 -1
- package/bin/lib/Image/ExifTool/Torrent.pm +3 -3
- package/bin/lib/Image/ExifTool/Trailer.pm +318 -0
- package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- package/bin/lib/Image/ExifTool/VCard.pm +3 -3
- package/bin/lib/Image/ExifTool/Validate.pm +6 -6
- package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- package/bin/lib/Image/ExifTool/WPG.pm +1 -1
- package/bin/lib/Image/ExifTool/WTV.pm +1 -1
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteExif.pl +3 -3
- package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +170 -79
- package/bin/lib/Image/ExifTool/WriteRIFF.pl +17 -6
- package/bin/lib/Image/ExifTool/WriteXMP.pl +3 -3
- package/bin/lib/Image/ExifTool/Writer.pl +89 -96
- package/bin/lib/Image/ExifTool/XISF.pm +1 -1
- package/bin/lib/Image/ExifTool/XMP.pm +28 -13
- package/bin/lib/Image/ExifTool/XMP2.pl +106 -3
- package/bin/lib/Image/ExifTool/XMPStruct.pl +2 -3
- package/bin/lib/Image/ExifTool/ZIP.pm +2 -2
- package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- package/bin/lib/Image/ExifTool/iWork.pm +1 -1
- package/bin/lib/Image/ExifTool.pm +467 -228
- package/bin/lib/Image/ExifTool.pod +118 -72
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/windows_exiftool.txt +96 -51
- package/package.json +6 -6
|
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
|
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
38
38
|
use Image::ExifTool::Exif;
|
|
39
39
|
|
|
40
|
-
$VERSION = '2.
|
|
40
|
+
$VERSION = '2.24';
|
|
41
41
|
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
|
43
43
|
sub WhiteBalanceConv($;$$);
|
|
@@ -360,12 +360,16 @@ my %shootingMode = (
|
|
|
360
360
|
'16' => 'Normal?', # (only mode for DMC-LC20)
|
|
361
361
|
'16 0' => '1-area', # (FZ8)
|
|
362
362
|
'16 16' => '1-area (high speed)', # (FZ8)
|
|
363
|
+
'16 32' => '1-area +', #forum16903 (G9M2)
|
|
364
|
+
'17 0' => 'Full Area', #forum16903 (G9M2)
|
|
363
365
|
# '32 0' is Face Detect for FS7, and Face Detect or Focus Tracking
|
|
364
366
|
# for the DMC-FZ200 (ref 17), and Auto is DMC-L1 guess,
|
|
365
367
|
'32 0' => 'Tracking',
|
|
366
368
|
'32 1' => '3-area (left)?', # (DMC-L1 guess)
|
|
367
369
|
'32 2' => '3-area (center)?', # (DMC-L1 guess)
|
|
368
370
|
'32 3' => '3-area (right)?', # (DMC-L1 guess)
|
|
371
|
+
'32 16' => 'Zone', #forum16903 (G9M2)
|
|
372
|
+
'32 18' => 'Zone (horizontal/vertical)', #forum16903 (G9M2)
|
|
369
373
|
# '32 16' ? (DC-GH6)
|
|
370
374
|
'64 0' => 'Face Detect',
|
|
371
375
|
'64 1' => 'Face Detect (animal detect on)', #forum11194
|
|
@@ -1448,6 +1452,26 @@ my %shootingMode = (
|
|
|
1448
1452
|
Name => 'MinimumISO',
|
|
1449
1453
|
Writable => 'int32u',
|
|
1450
1454
|
},
|
|
1455
|
+
0xe9 => { #forum16903 (DC-G9M2)
|
|
1456
|
+
Name => 'AFSubjectDetection',
|
|
1457
|
+
Writable => 'int16u',
|
|
1458
|
+
PrintConv => {
|
|
1459
|
+
0 => 'n/a',
|
|
1460
|
+
1 => 'Human Eye/Face/Body',
|
|
1461
|
+
2 => 'Animal', #PH (NC) (DC-S5 and DC-S5M2)
|
|
1462
|
+
3 => 'Human Eye/Face',
|
|
1463
|
+
4 => 'Animal Body',
|
|
1464
|
+
5 => 'Animal Eye/Body',
|
|
1465
|
+
6 => 'Car',
|
|
1466
|
+
7 => 'Motorcycle',
|
|
1467
|
+
8 => 'Car (main part priority)',
|
|
1468
|
+
9 => 'Motorcycle (helmet priority)',
|
|
1469
|
+
10 => 'Train',
|
|
1470
|
+
11 => 'Train (main part priority)',
|
|
1471
|
+
12 => 'Airplane',
|
|
1472
|
+
13 => 'Airplane (nose priority)',
|
|
1473
|
+
}
|
|
1474
|
+
},
|
|
1451
1475
|
0xee => { #PH (DC-GH6)
|
|
1452
1476
|
Name => 'DynamicRangeBoost',
|
|
1453
1477
|
Writable => 'int16u',
|
|
@@ -2802,7 +2826,7 @@ sub ProcessLeicaTrailer($;$)
|
|
|
2802
2826
|
}
|
|
2803
2827
|
} else { # M (Type 240)
|
|
2804
2828
|
# scan for the lens type (M writes 114 bytes of garbage first)
|
|
2805
|
-
if ($buff =~ /\G.{114}([\x20-\
|
|
2829
|
+
if ($buff =~ /\G.{114}([\x20-\x7e]*\0*)/sg and length($1) >= 50) {
|
|
2806
2830
|
$expect = 114;
|
|
2807
2831
|
}
|
|
2808
2832
|
}
|
|
@@ -2902,7 +2926,7 @@ Panasonic and Leica maker notes in EXIF information.
|
|
|
2902
2926
|
|
|
2903
2927
|
=head1 AUTHOR
|
|
2904
2928
|
|
|
2905
|
-
Copyright 2003-
|
|
2929
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
2906
2930
|
|
|
2907
2931
|
This library is free software; you can redistribute it and/or modify it
|
|
2908
2932
|
under the same terms as Perl itself.
|
|
@@ -935,7 +935,7 @@ write meta information in Panasonic/Leica RAW, RW2 and RWL images.
|
|
|
935
935
|
|
|
936
936
|
=head1 AUTHOR
|
|
937
937
|
|
|
938
|
-
Copyright 2003-
|
|
938
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
939
939
|
|
|
940
940
|
This library is free software; you can redistribute it and/or modify it
|
|
941
941
|
under the same terms as Perl itself.
|
|
@@ -825,7 +825,7 @@ timed metadata from the 'mett' frame found in Parrot drone MP4 videos.
|
|
|
825
825
|
|
|
826
826
|
=head1 AUTHOR
|
|
827
827
|
|
|
828
|
-
Copyright 2003-
|
|
828
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
829
829
|
|
|
830
830
|
This library is free software; you can redistribute it and/or modify it
|
|
831
831
|
under the same terms as Perl itself.
|
|
@@ -6477,7 +6477,7 @@ tags, and everyone who helped contribute to the LensType values.
|
|
|
6477
6477
|
|
|
6478
6478
|
=head1 AUTHOR
|
|
6479
6479
|
|
|
6480
|
-
Copyright 2003-
|
|
6480
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
6481
6481
|
|
|
6482
6482
|
This library is free software; you can redistribute it and/or modify it
|
|
6483
6483
|
under the same terms as Perl itself.
|
|
@@ -450,7 +450,7 @@ sub WritePhaseOne($$$)
|
|
|
450
450
|
|
|
451
451
|
return undef if $dirLen < 12;
|
|
452
452
|
unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) {
|
|
453
|
-
$et->
|
|
453
|
+
$et->Warn("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
|
|
454
454
|
return undef;
|
|
455
455
|
}
|
|
456
456
|
my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE};
|
|
@@ -591,7 +591,7 @@ sub ProcessPhaseOne($$$)
|
|
|
591
591
|
|
|
592
592
|
return 0 if $dirLen < 12;
|
|
593
593
|
unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) {
|
|
594
|
-
$et->
|
|
594
|
+
$et->Warn("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
|
|
595
595
|
return undef;
|
|
596
596
|
}
|
|
597
597
|
my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE};
|
|
@@ -632,7 +632,7 @@ sub ProcessPhaseOne($$$)
|
|
|
632
632
|
$formatSize = Get32u($dataPt, $entry+4);
|
|
633
633
|
$formatStr = $formatName[$formatSize];
|
|
634
634
|
unless ($formatStr) {
|
|
635
|
-
$et->
|
|
635
|
+
$et->Warn("Unrecognized $ifdType format size $formatSize",1);
|
|
636
636
|
$formatSize = 1;
|
|
637
637
|
$formatStr = 'undef';
|
|
638
638
|
}
|
|
@@ -726,7 +726,7 @@ One maker notes.
|
|
|
726
726
|
|
|
727
727
|
=head1 AUTHOR
|
|
728
728
|
|
|
729
|
-
Copyright 2003-
|
|
729
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
730
730
|
|
|
731
731
|
This library is free software; you can redistribute it and/or modify it
|
|
732
732
|
under the same terms as Perl itself.
|
|
@@ -484,7 +484,7 @@ information from Kodak Photo CD Image Pac (PCD) files.
|
|
|
484
484
|
|
|
485
485
|
=head1 AUTHOR
|
|
486
486
|
|
|
487
|
-
Copyright 2003-
|
|
487
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
488
488
|
|
|
489
489
|
This library is free software; you can redistribute it and/or modify it
|
|
490
490
|
under the same terms as Perl itself.
|
|
@@ -237,7 +237,7 @@ write information written by the Camera Bits Photo Mechanic software.
|
|
|
237
237
|
|
|
238
238
|
=head1 AUTHOR
|
|
239
239
|
|
|
240
|
-
Copyright 2003-
|
|
240
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
241
241
|
|
|
242
242
|
This library is free software; you can redistribute it and/or modify it
|
|
243
243
|
under the same terms as Perl itself.
|
|
@@ -28,11 +28,12 @@ use strict;
|
|
|
28
28
|
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
|
|
29
29
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
30
30
|
|
|
31
|
-
$VERSION = '1.
|
|
31
|
+
$VERSION = '1.72';
|
|
32
32
|
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
|
34
34
|
sub WritePhotoshop($$$);
|
|
35
35
|
sub ProcessLayers($$$);
|
|
36
|
+
sub ProcessChannelOptions($$$);
|
|
36
37
|
|
|
37
38
|
# PrintFlags bit definitions (ref forum13785)
|
|
38
39
|
%printFlags = (
|
|
@@ -322,7 +323,13 @@ my %unicodeString = (
|
|
|
322
323
|
0x0432 => { Unknown => 1, Name => 'MeasurementScale' }, #7
|
|
323
324
|
0x0433 => { Unknown => 1, Name => 'TimelineInfo' }, #7
|
|
324
325
|
0x0434 => { Unknown => 1, Name => 'SheetDisclosure' }, #7
|
|
325
|
-
0x0435 => {
|
|
326
|
+
0x0435 => {
|
|
327
|
+
Name => 'ChannelOptions', #7/forum16762
|
|
328
|
+
SubDirectory => {
|
|
329
|
+
TagTable => 'Image::ExifTool::Photoshop::ChannelOptions',
|
|
330
|
+
Start => 4,
|
|
331
|
+
},
|
|
332
|
+
},
|
|
326
333
|
0x0436 => { Unknown => 1, Name => 'OnionSkins' }, #7
|
|
327
334
|
0x0438 => { Unknown => 1, Name => 'CountInfo' }, #7
|
|
328
335
|
0x043a => { Unknown => 1, Name => 'PrintInfo2' }, #7
|
|
@@ -350,6 +357,41 @@ my %unicodeString = (
|
|
|
350
357
|
0x2710 => { Unknown => 1, Name => 'PrintFlagsInfo' },
|
|
351
358
|
);
|
|
352
359
|
|
|
360
|
+
# Photoshop channel options (ref forum16762)
|
|
361
|
+
%Image::ExifTool::Photoshop::ChannelOptions = (
|
|
362
|
+
PROCESS_PROC => \&ProcessChannelOptions,
|
|
363
|
+
VARS => { IS_BINARY => 1 },
|
|
364
|
+
GROUPS => { 2 => 'Image' },
|
|
365
|
+
NOTES => 'These tags relate only to the appearance of a channel.',
|
|
366
|
+
0 => {
|
|
367
|
+
Name => 'ChannelColorSpace',
|
|
368
|
+
Format => 'int16u',
|
|
369
|
+
PrintConv => {
|
|
370
|
+
0 => 'RGB',
|
|
371
|
+
1 => 'HSB',
|
|
372
|
+
2 => 'CMYK',
|
|
373
|
+
7 => 'Lab',
|
|
374
|
+
8 => 'Grayscale',
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
2 => {
|
|
378
|
+
Name => 'ChannelColorData',
|
|
379
|
+
Format => 'int16u[4]',
|
|
380
|
+
},
|
|
381
|
+
11 => {
|
|
382
|
+
Name => 'ChannelOpacity',
|
|
383
|
+
PrintConv => '"$val%"',
|
|
384
|
+
},
|
|
385
|
+
12 => {
|
|
386
|
+
Name => 'ChannelColorIndicates',
|
|
387
|
+
PrintConv => {
|
|
388
|
+
0 => 'Selected Areas',
|
|
389
|
+
1 => 'Masked Areas',
|
|
390
|
+
2 => 'Spot Color',
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
);
|
|
394
|
+
|
|
353
395
|
# Photoshop JPEG quality record (ref 2)
|
|
354
396
|
%Image::ExifTool::Photoshop::JPEG_Quality = (
|
|
355
397
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -755,6 +797,25 @@ sub ProcessLayersAndMask($$$)
|
|
|
755
797
|
return $raf->Seek($end, 0) ? 1 : 0;
|
|
756
798
|
}
|
|
757
799
|
|
|
800
|
+
#------------------------------------------------------------------------------
|
|
801
|
+
# Process Photoshop channel options (ref forum16762)
|
|
802
|
+
# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref
|
|
803
|
+
# Returns: 1 on success
|
|
804
|
+
sub ProcessChannelOptions($$$)
|
|
805
|
+
{
|
|
806
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
807
|
+
my $end = $$dirInfo{DirStart} + $$dirInfo{DirLen};
|
|
808
|
+
$$dirInfo{DirLen} = 13;
|
|
809
|
+
my $i;
|
|
810
|
+
for ($i=0; $$dirInfo{DirStart} + 13 <= $end; ++$i) {
|
|
811
|
+
$$et{SET_GROUP1} = "Channel$i";
|
|
812
|
+
$et->ProcessBinaryData($dirInfo, $tagTablePtr);
|
|
813
|
+
$$dirInfo{DirStart} += 13;
|
|
814
|
+
}
|
|
815
|
+
delete $$et{SET_GROUP1};
|
|
816
|
+
return 1;
|
|
817
|
+
}
|
|
818
|
+
|
|
758
819
|
#------------------------------------------------------------------------------
|
|
759
820
|
# Process Photoshop layers (beginning with layer count)
|
|
760
821
|
# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref
|
|
@@ -1050,7 +1111,7 @@ sub ProcessPhotoshop($$$)
|
|
|
1050
1111
|
if ($$et{VALUE}{IPTCDigest} and $$et{VALUE}{CurrentIPTCDigest} and
|
|
1051
1112
|
$$et{VALUE}{IPTCDigest} ne $$et{VALUE}{CurrentIPTCDigest})
|
|
1052
1113
|
{
|
|
1053
|
-
$et->
|
|
1114
|
+
$et->Warn('IPTCDigest is not current. XMP may be out of sync');
|
|
1054
1115
|
}
|
|
1055
1116
|
delete $$et{LOW_PRIORITY_DIR}{'*'};
|
|
1056
1117
|
return $success;
|
|
@@ -1201,7 +1262,7 @@ be preserved when copying Photoshop information via user-defined tags.
|
|
|
1201
1262
|
|
|
1202
1263
|
=head1 AUTHOR
|
|
1203
1264
|
|
|
1204
|
-
Copyright 2003-
|
|
1265
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
1205
1266
|
|
|
1206
1267
|
This library is free software; you can redistribute it and/or modify it
|
|
1207
1268
|
under the same terms as Perl itself.
|
|
@@ -768,7 +768,7 @@ This code reads meta information from EPS (Encapsulated PostScript), PS
|
|
|
768
768
|
|
|
769
769
|
=head1 AUTHOR
|
|
770
770
|
|
|
771
|
-
Copyright 2003-
|
|
771
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
772
772
|
|
|
773
773
|
This library is free software; you can redistribute it and/or modify it
|
|
774
774
|
under the same terms as Perl itself.
|
|
@@ -112,7 +112,7 @@ Print Image Matching meta information.
|
|
|
112
112
|
|
|
113
113
|
=head1 AUTHOR
|
|
114
114
|
|
|
115
|
-
Copyright 2003-
|
|
115
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
116
116
|
|
|
117
117
|
This library is free software; you can redistribute it and/or modify it
|
|
118
118
|
under the same terms as Perl itself.
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
#------------------------------------------------------------------------------
|
|
2
|
+
# File: Protobuf.pm
|
|
3
|
+
#
|
|
4
|
+
# Description: Decode protocol buffer data
|
|
5
|
+
#
|
|
6
|
+
# Revisions: 2024-12-04 - P. Harvey Created
|
|
7
|
+
#
|
|
8
|
+
# Notes: Tag definitions for Protobuf tags support additional 'signed',
|
|
9
|
+
# 'unsigned' and 'int64s' formats for varInt (type 0) values,
|
|
10
|
+
# and 'rational' for byte (type 2) values
|
|
11
|
+
#
|
|
12
|
+
# References: 1) https://protobuf.dev/programming-guides/encoding/
|
|
13
|
+
#------------------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
package Image::ExifTool::Protobuf;
|
|
16
|
+
|
|
17
|
+
use strict;
|
|
18
|
+
use vars qw($VERSION);
|
|
19
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
|
20
|
+
|
|
21
|
+
$VERSION = '1.02';
|
|
22
|
+
|
|
23
|
+
sub ProcessProtobuf($$$;$);
|
|
24
|
+
|
|
25
|
+
#------------------------------------------------------------------------------
|
|
26
|
+
# Read bytes from dirInfo object
|
|
27
|
+
# Inputs: 0) dirInfo ref (with DataPt and Pos set), 1) number of bytes
|
|
28
|
+
# Returns: binary data or undef on error
|
|
29
|
+
sub GetBytes($$)
|
|
30
|
+
{
|
|
31
|
+
my ($dirInfo, $n) = @_;
|
|
32
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
33
|
+
my $pos = $$dirInfo{Pos};
|
|
34
|
+
return undef if $pos + $n > length $$dataPt;
|
|
35
|
+
$$dirInfo{Pos} += $n;
|
|
36
|
+
return substr($$dataPt, $pos, $n);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#------------------------------------------------------------------------------
|
|
40
|
+
# Read variable-length integer
|
|
41
|
+
# Inputs: 0) dirInfo ref
|
|
42
|
+
# Returns: integer value
|
|
43
|
+
sub VarInt($)
|
|
44
|
+
{
|
|
45
|
+
my $dirInfo = shift;
|
|
46
|
+
my $val = 0;
|
|
47
|
+
my $shift = 0;
|
|
48
|
+
for (;;) {
|
|
49
|
+
my $buff = GetBytes($dirInfo, 1);
|
|
50
|
+
defined $buff or return undef;
|
|
51
|
+
$val += (ord($buff) & 0x7f) << $shift;
|
|
52
|
+
last unless ord($buff) & 0x80;
|
|
53
|
+
$shift += 7;
|
|
54
|
+
}
|
|
55
|
+
return $val;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
#------------------------------------------------------------------------------
|
|
59
|
+
# Read protobuf record
|
|
60
|
+
# Inputs: 0) dirInfo ref
|
|
61
|
+
# Returns: 0) record payload (plus tag id and format type in list context)
|
|
62
|
+
# Notes: Updates dirInfo Pos to start of next record
|
|
63
|
+
sub ReadRecord($)
|
|
64
|
+
{
|
|
65
|
+
my $dirInfo = shift;
|
|
66
|
+
my $val = VarInt($dirInfo);
|
|
67
|
+
return undef unless defined $val;
|
|
68
|
+
my $id = $val >> 3;
|
|
69
|
+
my $type = $val & 0x07;
|
|
70
|
+
my $buff;
|
|
71
|
+
|
|
72
|
+
if ($type == 0) { # varInt
|
|
73
|
+
$buff = VarInt($dirInfo);
|
|
74
|
+
} elsif ($type == 1) { # 64-bit number
|
|
75
|
+
$buff = GetBytes($dirInfo, 8);
|
|
76
|
+
} elsif ($type == 2) { # string, bytes or protobuf
|
|
77
|
+
my $len = VarInt($dirInfo);
|
|
78
|
+
if ($len) {
|
|
79
|
+
$buff = GetBytes($dirInfo, $len);
|
|
80
|
+
} else {
|
|
81
|
+
$buff = '';
|
|
82
|
+
}
|
|
83
|
+
} elsif ($type == 3) { # (deprecated start group)
|
|
84
|
+
$buff = '';
|
|
85
|
+
} elsif ($type == 4) { # (deprecated end group)
|
|
86
|
+
$buff = '';
|
|
87
|
+
} elsif ($type == 5) { # 32-bit number
|
|
88
|
+
$buff = GetBytes($dirInfo, 4);
|
|
89
|
+
}
|
|
90
|
+
return wantarray ? ($buff, $id, $type) : $buff;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#------------------------------------------------------------------------------
|
|
94
|
+
# Check to see if this could be a protobuf object
|
|
95
|
+
# Inputs: 0) data reference
|
|
96
|
+
# Retursn: true if this looks like a protobuf
|
|
97
|
+
sub IsProtobuf($)
|
|
98
|
+
{
|
|
99
|
+
my $pt = shift;
|
|
100
|
+
my $dirInfo = { DataPt => $pt, Pos => 0 };
|
|
101
|
+
for (;;) {
|
|
102
|
+
return 0 unless defined ReadRecord($dirInfo);
|
|
103
|
+
return 1 if $$dirInfo{Pos} == length $$pt;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#------------------------------------------------------------------------------
|
|
108
|
+
# Process protobuf data (eg. DJI djmd timed data from Action4 videos) (ref 1)
|
|
109
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref with DataPt, DataPos, DirName and Base,
|
|
110
|
+
# 2) tag table ptr, 3) prefix of parent protobuf ID's
|
|
111
|
+
# Returns: true on success
|
|
112
|
+
sub ProcessProtobuf($$$;$)
|
|
113
|
+
{
|
|
114
|
+
my ($et, $dirInfo, $tagTbl, $prefix) = @_;
|
|
115
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
116
|
+
my $dirName = $$dirInfo{DirName};
|
|
117
|
+
my $dirStart = $$dirInfo{DirStart} || 0;
|
|
118
|
+
my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
|
|
119
|
+
my $dirEnd = $dirStart + $dirLen;
|
|
120
|
+
my $dataPos = ($$dirInfo{Base} || 0) + ($$dirInfo{DataPos} || 0);
|
|
121
|
+
my $unknown = $et->Options('Unknown') || $et->Options('Verbose');
|
|
122
|
+
|
|
123
|
+
$$dirInfo{Pos} = $$dirInfo{DirStart} || 0; # initialize buffer Pos
|
|
124
|
+
$et->VerboseDir('Protobuf', undef, $dirLen);
|
|
125
|
+
|
|
126
|
+
unless ($prefix) {
|
|
127
|
+
$prefix = '';
|
|
128
|
+
$$et{ProtoPrefix}{$dirName} = '' unless defined $$et{ProtoPrefix}{$dirName};
|
|
129
|
+
SetByteOrder('II');
|
|
130
|
+
}
|
|
131
|
+
# loop through protobuf records
|
|
132
|
+
for (;;) {
|
|
133
|
+
my $pos = $$dirInfo{Pos};
|
|
134
|
+
last if $pos >= $dirEnd;
|
|
135
|
+
my ($buff, $id, $type) = ReadRecord($dirInfo);
|
|
136
|
+
defined $buff or $et->Warn('Protobuf format error'), last;
|
|
137
|
+
if ($type == 2 and $buff =~ /\.proto$/) {
|
|
138
|
+
# save protocol name separately for directory type
|
|
139
|
+
$$et{ProtoPrefix}{$dirName} = substr($buff, 0, -6) . '_';
|
|
140
|
+
$et->HandleTag($tagTbl, Protocol => $buff);
|
|
141
|
+
}
|
|
142
|
+
my $tag = "$$et{ProtoPrefix}{$dirName}$prefix$id";
|
|
143
|
+
my $tagInfo = $$tagTbl{$tag};
|
|
144
|
+
if ($tagInfo) {
|
|
145
|
+
next if $type != 2 and $$tagInfo{Unknown} and not $unknown;
|
|
146
|
+
} else {
|
|
147
|
+
next unless $type == 2 or $unknown;
|
|
148
|
+
$tagInfo = AddTagToTable($tagTbl, $tag, { Unknown => 1 });
|
|
149
|
+
}
|
|
150
|
+
# set IsProtobuf flag (only for Unknown tags) if necessary
|
|
151
|
+
if ($type == 2 and $$tagInfo{Unknown}) {
|
|
152
|
+
if ($$tagInfo{IsProtobuf}) {
|
|
153
|
+
$$tagInfo{IsProtobuf} = 0 unless IsProtobuf(\$buff);
|
|
154
|
+
} elsif (not defined $$tagInfo{IsProtobuf} and $buff =~ /[^\x20-\x7e]/ and
|
|
155
|
+
IsProtobuf(\$buff))
|
|
156
|
+
{
|
|
157
|
+
$$tagInfo{IsProtobuf} = 1;
|
|
158
|
+
}
|
|
159
|
+
next unless $$tagInfo{IsProtobuf} or $unknown;
|
|
160
|
+
}
|
|
161
|
+
# format binary payload into a useful value
|
|
162
|
+
my $val;
|
|
163
|
+
if ($$tagInfo{Format}) {
|
|
164
|
+
if ($type == 0) {
|
|
165
|
+
$val = $buff;
|
|
166
|
+
if ($$tagInfo{Format} eq 'signed') {
|
|
167
|
+
$val = ($val & 1) ? -($val >> 1)-1 : ($val >> 1);
|
|
168
|
+
} elsif ($$tagInfo{Format} eq 'int64s' and $val > 0xffffffff) {
|
|
169
|
+
# hack for DJI drones which store 64-bit signed integers improperly
|
|
170
|
+
# (just toss upper 32 bits which should be all 1's anyway)
|
|
171
|
+
$val = ($val & 0xffffffff) - 4294967296;
|
|
172
|
+
}
|
|
173
|
+
} elsif ($type == 2 and $$tagInfo{Format} eq 'rational') {
|
|
174
|
+
my $dir = { DataPt => \$buff, Pos => 0 };
|
|
175
|
+
my $num = VarInt($dir);
|
|
176
|
+
my $den = VarInt($dir);
|
|
177
|
+
$val = (defined $num and $den) ? "$num/$den" : 'err';
|
|
178
|
+
} else {
|
|
179
|
+
$val = ReadValue(\$buff, 0, $$tagInfo{Format}, undef, length($buff));
|
|
180
|
+
}
|
|
181
|
+
} elsif ($type == 0) {
|
|
182
|
+
$val = $buff;
|
|
183
|
+
my $hex = sprintf('%x', $val);
|
|
184
|
+
if (length($hex) == 16 and $hex =~ /^ffffffff/) {
|
|
185
|
+
my $s64 = hex(substr($hex, 8)) - 4294967296;
|
|
186
|
+
$val .= " (0x$hex, int64s $s64)";
|
|
187
|
+
} else {
|
|
188
|
+
my $signed = ($val & 1) ? -($val >> 1)-1 : ($val >> 1);
|
|
189
|
+
$val .= " (0x$hex, signed $signed)";
|
|
190
|
+
}
|
|
191
|
+
} elsif ($type == 1) {
|
|
192
|
+
$val = '0x' . unpack('H*', $buff) . ' (double ' . GetDouble(\$buff,0) . ')';
|
|
193
|
+
} elsif ($type == 2) {
|
|
194
|
+
if ($$tagInfo{SubDirectory}) {
|
|
195
|
+
# (fall through to process known SubDirectory)
|
|
196
|
+
} elsif ($$tagInfo{IsProtobuf}) {
|
|
197
|
+
# process Unknown protobuf directories
|
|
198
|
+
$et->VPrint(1, "$$et{INDENT}Protobuf $tag (" . length($buff) . " bytes) -->\n");
|
|
199
|
+
my $addr = $dataPos + $$dirInfo{Pos} - length($buff);
|
|
200
|
+
$et->VerboseDump(\$buff, Addr => $addr, Prefix => $$et{INDENT});
|
|
201
|
+
my %subdir = ( DataPt => \$buff, DataPos => $addr, DirName => $dirName );
|
|
202
|
+
$$et{INDENT} .= '| ';
|
|
203
|
+
ProcessProtobuf($et, \%subdir, $tagTbl, "$prefix$id-");
|
|
204
|
+
$$et{INDENT} = substr($$et{INDENT}, 0, -2);
|
|
205
|
+
next;
|
|
206
|
+
} elsif ($buff !~ /[^\x20-\x7e]/) {
|
|
207
|
+
$val = $buff; # assume this is an ASCII string
|
|
208
|
+
} elsif (length($buff) % 4) {
|
|
209
|
+
$val = '0x' . unpack('H*', $buff);
|
|
210
|
+
} else {
|
|
211
|
+
$val = '0x' . join(' ', unpack('(H8)*', $buff)); # (group in 4-byte blocks)
|
|
212
|
+
}
|
|
213
|
+
} elsif ($type == 5) {
|
|
214
|
+
$val = '0x' . unpack('H*', $buff) . ' (int32u ' . Get32u(\$buff, 0);
|
|
215
|
+
$val .= ', int32s ' . Get32s(\$buff, 0) if ord(substr($buff,3,1)) & 0x80;
|
|
216
|
+
$val .= ', float ' . GetFloat(\$buff, 0) . ')';
|
|
217
|
+
} else {
|
|
218
|
+
$val = $buff;
|
|
219
|
+
}
|
|
220
|
+
# get length of data in the record
|
|
221
|
+
my $start = $type == 0 ? $pos + 1 : $$dirInfo{Pos} - length $buff;
|
|
222
|
+
$et->HandleTag($tagTbl, $tag, $val,
|
|
223
|
+
DataPt => $dataPt,
|
|
224
|
+
DataPos=> $dataPos,
|
|
225
|
+
Start => $start,
|
|
226
|
+
Size => $$dirInfo{Pos} - $start,
|
|
227
|
+
Extra => ", type=$type",
|
|
228
|
+
Format => $$tagInfo{Format},
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
# warn if we didn't finish exactly at the end of the buffer
|
|
232
|
+
$et->Warn('Truncated protobuf data') unless $prefix or $$dirInfo{Pos} == $dirEnd;
|
|
233
|
+
return 1;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
__END__
|
|
237
|
+
|
|
238
|
+
=head1 NAME
|
|
239
|
+
|
|
240
|
+
Image::ExifTool::Protobuf - Decode protocol buffer information
|
|
241
|
+
|
|
242
|
+
=head1 SYNOPSIS
|
|
243
|
+
|
|
244
|
+
This module is loaded automatically by Image::ExifTool when required.
|
|
245
|
+
|
|
246
|
+
=head1 DESCRIPTION
|
|
247
|
+
|
|
248
|
+
This module contains definitions required by Image::ExifTool to decode
|
|
249
|
+
information in protocol buffer (protobuf) format.
|
|
250
|
+
|
|
251
|
+
=head1 AUTHOR
|
|
252
|
+
|
|
253
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
254
|
+
|
|
255
|
+
This library is free software; you can redistribute it and/or modify it
|
|
256
|
+
under the same terms as Perl itself.
|
|
257
|
+
|
|
258
|
+
=head1 REFERENCES
|
|
259
|
+
|
|
260
|
+
=over 4
|
|
261
|
+
|
|
262
|
+
=item L<https://protobuf.dev/programming-guides/encoding/>
|
|
263
|
+
|
|
264
|
+
=back
|
|
265
|
+
|
|
266
|
+
=head1 SEE ALSO
|
|
267
|
+
|
|
268
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
|
269
|
+
|
|
270
|
+
=cut
|
|
@@ -1331,7 +1331,7 @@ information from the APP7 Qualcomm segment in JPEG images.
|
|
|
1331
1331
|
|
|
1332
1332
|
=head1 AUTHOR
|
|
1333
1333
|
|
|
1334
|
-
Copyright 2003-
|
|
1334
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
|
1335
1335
|
|
|
1336
1336
|
This library is free software; you can redistribute it and/or modify it
|
|
1337
1337
|
under the same terms as Perl itself.
|